#include <Fl/Fl.H>
#include <FL/fl_draw.H>
#include "DrawObject.h"

#include <iostream>
using namespace std;

//=========================================================================

DrawObject::DrawObject(uchar _red, uchar _green, uchar _blue, bool _filled) {
  red = _red; green = _green; blue = _blue;
  filled=_filled;
}

//=========================================================================

DrawObjectCircle::DrawObjectCircle(float _x, float _y, float _w, float _h, 
				   uchar _red, uchar _green, uchar _blue,
				   bool _filled) : 
  DrawObject(_red,_green,_blue,_filled) {
  x=(_x-(_w/2)); y=(_y-(_h/2)); w=_w; h=_h; 
}

DrawObjectCircle::DrawObjectCircle(float _x, float _y, float _r,
				   uchar _red, uchar _green, uchar _blue,
				   bool _filled) :
  DrawObject(_red,_green,_blue,_filled) {
  x=_x-_r; y=_y-_r; w=2*_r; h=2*_r;
}

void DrawObjectCircle::draw(DrawWidget * dw) {
  fl_color(red,green,blue);

  if (filled) {
    fl_pie(dw->xToU(x),dw->yToV(y+h),
	   dw->widthToU(w),dw->heightToV(h),0,360);
  } else {
    fl_arc(dw->xToU(x),dw->yToV(y+h),
	   dw->widthToU(w),dw->heightToV(h),0,360);
  }
}

//=========================================================================

DrawObjectRectangle::DrawObjectRectangle(float _x, float _y, 
					 float _w, float _h,
					 uchar _red, uchar _green, uchar _blue,
					 bool _filled) : 
  DrawObject(_red,_green,_blue,_filled) {
  x=(_x-(_w/2));y=(_y-(_h/2));w=_w;h=_h;
}


void DrawObjectRectangle::draw(DrawWidget * dw){
  fl_color(red,green,blue);

  if (filled) {
    fl_rectf(dw->xToU(x),dw->yToV(y+h),
	     dw->widthToU(w),dw->heightToV(h));
  } else {
    fl_rect(dw->xToU(x),dw->yToV(y+h),
	    dw->widthToU(w),dw->heightToV(h));
  }
}

//=========================================================================

DrawObjectImage::DrawObjectImage(float _x, float _y, float _w, float _h,
				 uchar * _rgb_image, uint _columns, 
				 uint _rows) :
  DrawObjectRectangle(_x,_y,_w,_h) {
  columns = _columns;
  rows = _rows;
  rgb_image = new uchar[columns*rows*3];
  memcpy(rgb_image,_rgb_image,sizeof(uchar)*columns*rows*3);
}

void DrawObjectImage::draw(DrawWidget * dw) {
  fl_draw_image(rgb_image,
		dw->xToU(x),
		dw->yToV(y+h),
		columns,rows);
}

DrawObjectImage::~DrawObjectImage() {
  delete [] rgb_image;
}

//=========================================================================

DrawObjectLine::DrawObjectLine(float _x1, float _y1, float _x2, float _y2, 
			       uchar _red, uchar _green, uchar _blue,
			       int _style,int _width):
  DrawObject(_red,_green,_blue,false) {
  x1=_x1; y1=_y1; x2=_x2; y2=_y2;
  style=_style;
  width=_width;
}

void DrawObjectLine::draw(DrawWidget * dw) {
  fl_color(red,green,blue);
  fl_line_style(style,width);
  fl_line(dw->xToU(x1), dw->yToV(y1), dw->xToU(x2), dw->yToV(y2));
  fl_line_style(0);
}

//=========================================================================

DrawObjectText::DrawObjectText(const char * _text, float _x, float _y,
			       uchar _red, uchar _green, uchar _blue,
			       int _font_id, int _font_size) :
  DrawObject(_red,_green,_blue,false) {
  text = new char[strlen(_text)];
  strcpy(text,_text);
  x=_x; y=_y; font_id = _font_id; font_size=_font_size;
}

void DrawObjectText::draw(DrawWidget *dw) {
  fl_color(red,green,blue);
  fl_font(font_id,font_size);
  fl_draw(text,dw->xToU(x),dw->yToV(y));
}
