// VC_PLOTD.CPP

#include "vc_plotd.h"
#include "string.h"

static float XO = 40.0F; // X offset to allow negative arguments
static float YO = 25.0F; // Y offset to allow negative arguments
static float F  = 10.0F; // scale factor (80*F is width in virtual pixels)
static CDC *pDC; // local copy
static int PenSize;
static CPen pen;
static CBrush brush;
const COLORREF red   = RGB(255,   0,   0);
const COLORREF green = RGB(0,   255,   0);
const COLORREF blue  = RGB(0,     0, 255);
const COLORREF white = RGB(255, 255, 255);
const COLORREF black = RGB(0,      0,  0);

static void set_fill()
{
  pen.DeleteObject();
  pen.CreatePen(PS_SOLID, PenSize, black);
  pDC->SelectObject(&pen);
  brush.DeleteObject();
  brush.CreateSolidBrush(red);
  pDC->SelectObject(&brush);
  pDC->SetTextColor(blue);
}

static void set_clear()
{
  pen.DeleteObject();
  pen.CreatePen(PS_SOLID, PenSize, white);
  pDC->SelectObject(&pen);
  brush.DeleteObject();
  brush.CreateSolidBrush(white);
  pDC->SelectObject(&brush);
}



void   INITIALIZE(CDC *pDC_arg)
{
  pDC = pDC_arg; // save drawing context global to these routines, local in file

  PenSize = 4;
  pen.CreatePen(PS_SOLID, PenSize, RGB(0, 0, 0));
  brush.CreateSolidBrush(green);

}

void   DRAW_CIRCLE ( float X, float Y, float R, show KIND)
{
  if(KIND==OUTLINE)
  {
    set_fill();
    pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F),
             (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F),
	         (int)((X+R+XO)*F), (int)(((-Y)+YO)*F),
             (int)((X-R+XO)*F), (int)(((-Y)+YO)*F)  ); // top
    pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F),
             (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F),
	         (int)((X-R+XO)*F), (int)(((-Y)+YO)*F),
             (int)((X+R+XO)*F), (int)(((-Y)+YO)*F)  ); // bottom
  }
  else if(KIND==FILL)
  {
    set_fill();
    pDC->Ellipse((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F),
	             (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F));
  }
  else if(KIND==CLEAR_OUTLINE)
  {
    set_clear();
    pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F),
		     (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F),
		     (int)((X+R+XO)*F), (int)(((-Y)+YO)*F),
			 (int)((X-R+XO)*F), (int)(((-Y)+YO)*F)); // top
    pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F),
		     (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F),
		     (int)((X-R+XO)*F), (int)(((-Y)+YO)*F),
			 (int)((X+R+XO)*F), (int)(((-Y)+YO)*F)); // bottom
  }
  else if(KIND==CLEAR_FILL)
  {
    set_clear();
    pDC->Ellipse((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F),
		         (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F));
  }
}

void   DRAW_ELLIPSE ( float X, float Y, float XR, float YR, show KIND )
{
  if(KIND==OUTLINE)
  {
    set_fill();
    pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F),
		     (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F),
		     (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F),
			 (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F)); // top
    pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F),
		     (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F),
		     (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F),
			 (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F)); // bottom
  }
  else if(KIND==FILL)
  {
    set_fill();
    pDC->Ellipse((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F),
		         (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F));
  }
  else if(KIND==CLEAR_OUTLINE)
  {
    set_clear();
    pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F),
		     (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F),
		     (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F),
			 (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F)); // top
    pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F),
		     (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F),
		     (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F),
			 (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F)); // bottom
  }
  else if(KIND==CLEAR_FILL)
  {
    set_clear();
    pDC->Ellipse((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F),
		         (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F));
  }
}

void   DRAW_RECTANGLE ( float X, float Y, float W, float H, show KIND )
{
  if(KIND==OUTLINE)
  {
    set_fill();
    pDC->MoveTo((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F)); // lower left
    pDC->LineTo((int)((X-W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); // upper left
    pDC->LineTo((int)((X+W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); // upper right
    pDC->LineTo((int)((X+W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F)); // lower right
    pDC->LineTo((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F)); // lower left ( start )
  }
  else if(KIND==FILL)
  {
    set_fill();
    pDC->Rectangle((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F),  // upper left
		           (int)((X+W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); // lower right
  }
  else if(KIND==CLEAR_OUTLINE)
  {
    set_clear();
    pDC->MoveTo((int)((X-W/2.0+XO)*F),(int)(((-Y)-H/2.0+YO)*F)); //lower left
    pDC->LineTo((int)((X-W/2.0+XO)*F),(int)(((-Y)+H/2.0+YO)*F)); //upper left
    pDC->LineTo((int)((X+W/2.0+XO)*F),(int)(((-Y)+H/2.0+YO)*F)); //upper right
    pDC->LineTo((int)((X+W/2.0+XO)*F),(int)(((-Y)-H/2.0+YO)*F)); //lower right
    pDC->LineTo((int)((X-W/2.0+XO)*F),(int)(((-Y)-H/2.0+YO)*F)); //lower left ( start )
  }
  else if(KIND==CLEAR_FILL)
  {
    set_clear();
    pDC->Rectangle((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F), //upper left
		   (int)((X+W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); //lower right
  }
}

void   DRAW_LINE ( float X1, float Y1, float X2, float Y2, show KIND )
{
  if(KIND==BOLD || KIND==OUTLINE || KIND==FILL)
  {
    pen.DeleteObject();
    pen.CreatePen(PS_SOLID, PenSize, black);
    pDC->MoveTo( (int)((X1+XO)*F), (int)(((-Y1)+YO)*F));  // start
    pDC->LineTo( (int)((X2+XO)*F), (int)(((-Y2)+YO)*F));  // end
  }
  else
  {
    pen.DeleteObject();
    pen.CreatePen(PS_SOLID, PenSize, white);
    pDC->MoveTo( (int)((X1+XO)*F), (int)(((-Y1)+YO)*F));  // start
    pDC->LineTo( (int)((X2+XO)*F), (int)(((-Y2)+YO)*F));  // end
  }
}

void   WRITE_TEXT ( float X, float Y, char *TEXT, show KIND, COLORREF color )
{
  if(KIND==BOLD || KIND==OUTLINE || KIND==FILL)
  {
    pDC->SetTextColor(color);
    pDC->TextOut((int)((X+XO)*F), (int)(((-Y)+YO)*F), TEXT, strlen(TEXT));
  }
  else
  {
    pDC->SetTextColor(white);
    pDC->TextOut((int)((X+XO)*F), (int)(((-Y)+YO)*F), TEXT, strlen(TEXT));
  }
}

void   PRINT(void) {} // not needed, but included for compatibility

void   CLOSE(void){}  // not needed, but included for compatibility

// end VC_PLOTD.CPP


