#include "HEADERS.h"
#include "srgplocal.h"

#ifdef THINK_C
#include "ChooseWhichQuickdraw.h"
#endif

#define DFIXED(yy)\
(srgp__curActiveCanvasSpec.max_ycoord - (yy))
#define SFIXED(yy)\
(srgp__canvasTable[source_canvas_id].max_ycoord - (yy))


void
SRGP_copyPixel (canvasID source_canvas_id, 
		rectangle source_rect, 
		point dest_corner)
{
   int height;

   DEBUG_AIDS{
      SRGP_trace (SRGP_logStream, "SRGP_copyPixel: %d (%d,%d)->(%d,%d) -----> (%d,%d)\n",
		  source_canvas_id, ExplodeRect(source_rect), ExplodePt(dest_corner));
      srgp_check_system_state();
      srgp_check_extant_canvas (source_canvas_id);
      srgp_check_rectangle
	 (source_rect.bottom_left.x, source_rect.bottom_left.y,
	  source_rect.top_right.x, source_rect.top_right.y);
      LeaveIfNonFatalErr();
   }


#ifdef X11
   height = (source_rect.top_right.y - source_rect.bottom_left.y + 1);
   XCopyArea (srgpx__display,
	      srgp__canvasTable[source_canvas_id].drawable.bitmap,
	      srgp__curActiveCanvasSpec.drawable.bitmap,
	      srgp__curActiveCanvasSpec.gc_fill,
	      source_rect.bottom_left.x, SFIXED(source_rect.top_right.y),
	      (source_rect.top_right.x - source_rect.bottom_left.x + 1),
	      height,
	      dest_corner.x, DFIXED(dest_corner.y + height - 1));
#endif

#ifdef THINK_C
{
   Rect sRect, dRect;
   int modeTable[] = {srcCopy, srcXor, srcOr, notSrcBic};
#ifdef COLOR_QUICKDRAW
   CGrafPtr curcgport = (CGrafPtr)thePort;
   long savefgcolor, savebgcolor;
#endif
   
   
   SetRect (&sRect, source_rect.bottom_left.x, SFIXED(source_rect.top_right.y), 
	   source_rect.top_right.x+1, SFIXED(source_rect.bottom_left.y) + 1);
   SetRect(&dRect, 
	   dest_corner.x, 
	   DFIXED(dest_corner.y + source_rect.top_right.y - source_rect.bottom_left.y),
	   dest_corner.x + source_rect.top_right.x - source_rect.bottom_left.x + 1, 
	   DFIXED(dest_corner.y) + 1);

#ifdef COLOR_QUICKDRAW	   
   savefgcolor = thePort->fgColor; savebgcolor = thePort->bkColor;
   thePort->fgColor = 255;  thePort->bkColor = 0;  /*THIS IS DANGEROUSLY STUPID*/
   
#  define canvasGrafport(i) (*((CGrafPtr)(srgp__canvasTable[i].drawable.xid)))
   CopyBits (*(canvasGrafport(source_canvas_id).portPixMap), 
	     *(canvasGrafport(srgp__curActiveCanvasId).portPixMap), 
		     &sRect, &dRect, 
		     modeTable[srgp__curActiveCanvasSpec.attributes.write_mode], NULL);

   thePort->fgColor = savefgcolor;  thePort->bkColor = savebgcolor;
#else
#  define canvasGrafport(i) (*((GrafPtr)(srgp__canvasTable[i].drawable.xid)))
   CopyBits (&(canvasGrafport(source_canvas_id).portBits), 
	     &(canvasGrafport(srgp__curActiveCanvasId).portBits), 
		     &sRect, &dRect, 
		     modeTable[srgp__curActiveCanvasSpec.attributes.write_mode], NULL);

#endif
}
#endif

#ifdef BLACKFIN
	gp.x1 = source_rect.bottomLeft.x;
	gp.y1 = source_rect.bottomLeft.y;
	gp.x2 = source_rect.topRight.x;
	gp.y2 = source_rect.topRight.y;
	
	/* Need a second graphic primitive to specific data about the destination */
	ADI_sGraphPrim dest_gp;
	
	dest_gp.x1 = dest_corner.x;
	dest_gp.y1 = dest_corner.y;
	dest_gp.clip_x1 = gp.clip_x1;
	dest_gp.clip_x1 = gp.clip_x1;
	dest_gp.clip_x2 = gp.clip_x2;
	dest_gp.clip_y1 = gp.clip_y1;
	dest_gp.clip_y2 = gp.clip_y2;

	dest_gp.canvas = gp.canvas;
	gp.canvas = srgp__canvasTable[ source_canvas_id ].drawable.win;
	
	ADI_CanvasCopyArea ( &gp, &dest_gp  );
	
	gp.canvas = dest_gp.canvas;
#endif

}
