Eli Hughes
/
RobotPowerLogger-V2
For Terrance
Diff: Code/GFX.c
- Revision:
- 0:085749c8446f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Code/GFX.c Wed Jun 13 15:10:06 2012 +0000 @@ -0,0 +1,860 @@ +#include "DataTypes.h" +#include "GFX.h" +#include "SmartSwitch.h" +#include "FixedMath.h" + +//Linking Functions to Physical Screen +//*********************************************************************************** + +void GFX_InitPhysicalScreen() +{ + InitSmartSwitch(); +} + +void GFX_DumpRenderContextToPhysicalScreen(RenderContext *Image) +{ + int x,y; + + SmartSwitch_SS = 0; + SmartSwitchWriteByte(SMART_SWITCH_CMD_DISPLAY_DATA); + + for(y=0;y<PHYSICAL_DISPLAY_YRES;y++) + { + for(x=0;x<PHYSICAL_DISPLAY_X_WIDTH_IN_BYTES;x++) + { + SmartSwitchWriteByte(Image->RenderPlane.BitPlaneSpace[(y*PHYSICAL_DISPLAY_X_WIDTH_IN_BYTES) + (PHYSICAL_DISPLAY_X_WIDTH_IN_BYTES - x - 1)]); + } + } + SmartSwitch_SS = 1; +} + +void GFX_PowerUpScreen() +{ + PowerUpSmartSwitch(); +} + +void GFX_PowerDownScreen() +{ + PowerDownSmartSwitch(); +} + +//Device Independent Functions +//*********************************************************************************** + +//Reserve Space for the backbuffer + +RenderContext BackBuffer; +BYTE BackBufferRenderPlaneSpace[PHYSICAL_DISPLAY_PLANE_BUFFER_SIZE]; + + +//FontData + +#define FONT5x7_FONT_WIDTH 5 +#define FONT5x7_FONT_HEIGHT 8 +#define FONT5x7_FONT_ELEMENTS 128 +#define FONT5x7_FONT_COLUMN_SIZE_IN_BYTE 1 + +BYTE FontTable_Font5x7 [640] = { +0x00 ,0x08 ,0x0C ,0xFA ,0x81 ,0xFA ,0x0C ,0x08 ,0x00 ,0x00 ,0x00 ,0x10 ,0x30 ,0x5F ,0x81 ,0x5F , +0x30 ,0x10 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xBE ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x00 ,0x28 , +0xFE ,0x28 ,0xFE ,0x28 ,0x48 ,0xFE ,0x54 ,0xFE ,0x24 ,0x06 ,0xE6 ,0x10 ,0xCE ,0xC0 ,0x60 ,0x92 , +0x94 ,0x78 ,0x10 ,0x06 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7C ,0x82 ,0x00 ,0x00 ,0x00 ,0x82 ,0x7C ,0x00 , +0x00 ,0x00 ,0x54 ,0x38 ,0xFE ,0x38 ,0x54 ,0x10 ,0x10 ,0x7C ,0x10 ,0x10 ,0x80 ,0x60 ,0x00 ,0x00 , +0x00 ,0x10 ,0x10 ,0x10 ,0x10 ,0x10 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0xC0 ,0x30 ,0x0C ,0x02 ,0x00 , +0x7C ,0xA2 ,0x92 ,0x8A ,0x7C ,0x88 ,0x84 ,0xFE ,0x80 ,0x80 ,0x84 ,0xC2 ,0xA2 ,0x92 ,0x8C ,0x44 , +0x92 ,0x92 ,0x92 ,0x6C ,0x10 ,0x18 ,0x14 ,0xFE ,0x10 ,0x4E ,0x8A ,0x8A ,0x8A ,0x72 ,0x7C ,0x92 , +0x92 ,0x92 ,0x64 ,0x02 ,0xC2 ,0x22 ,0x12 ,0x0E ,0x6C ,0x92 ,0x92 ,0x92 ,0x6C ,0x0C ,0x92 ,0x92 , +0x92 ,0x7C ,0x48 ,0x00 ,0x00 ,0x00 ,0x00 ,0x80 ,0x68 ,0x00 ,0x00 ,0x00 ,0x10 ,0x28 ,0x44 ,0x82 , +0x00 ,0x28 ,0x28 ,0x28 ,0x28 ,0x00 ,0x82 ,0x44 ,0x28 ,0x10 ,0x00 ,0x04 ,0x02 ,0xA2 ,0x12 ,0x0C , +0x3C ,0x42 ,0x9A ,0xA2 ,0x1C ,0xF8 ,0x14 ,0x12 ,0x14 ,0xF8 ,0xFE ,0x92 ,0x92 ,0x92 ,0x6C ,0x7C , +0x82 ,0x82 ,0x82 ,0x44 ,0xFE ,0x82 ,0x82 ,0x44 ,0x38 ,0xFE ,0x92 ,0x92 ,0x82 ,0x82 ,0xFE ,0x12 , +0x12 ,0x02 ,0x02 ,0x7C ,0x92 ,0x92 ,0x92 ,0x74 ,0xFE ,0x10 ,0x10 ,0x10 ,0xFE ,0x82 ,0x82 ,0xFE , +0x82 ,0x82 ,0x40 ,0x80 ,0x80 ,0x80 ,0x7E ,0xFE ,0x10 ,0x28 ,0x44 ,0x82 ,0xFE ,0x80 ,0x80 ,0x80 , +0x00 ,0xFE ,0x04 ,0x08 ,0x04 ,0xFE ,0xFE ,0x04 ,0x18 ,0x20 ,0xFE ,0x7C ,0x82 ,0x82 ,0x82 ,0x7C , +0xFE ,0x12 ,0x12 ,0x12 ,0x0C ,0x7C ,0x82 ,0xA2 ,0xC2 ,0xFC ,0xFE ,0x12 ,0x32 ,0x52 ,0x8C ,0x4C , +0x92 ,0x92 ,0x92 ,0x64 ,0x02 ,0x02 ,0xFE ,0x02 ,0x02 ,0x7E ,0x80 ,0x80 ,0x80 ,0x7E ,0x3E ,0x40 , +0x80 ,0x40 ,0x3E ,0xFE ,0x40 ,0x20 ,0x40 ,0xFE ,0xC6 ,0x28 ,0x10 ,0x28 ,0xC6 ,0x02 ,0x04 ,0xF8 , +0x04 ,0x02 ,0xC2 ,0xA2 ,0x92 ,0x8A ,0x86 ,0xFE ,0x82 ,0x82 ,0x00 ,0x00 ,0x02 ,0x0C ,0x30 ,0xC0 , +0x00 ,0x82 ,0x82 ,0xFE ,0x00 ,0x00 ,0x04 ,0x02 ,0x04 ,0x00 ,0x00 ,0x80 ,0x80 ,0x80 ,0x80 ,0x80 , +0x06 ,0x08 ,0x00 ,0x00 ,0x00 ,0x70 ,0x88 ,0x88 ,0x70 ,0x80 ,0xFC ,0x90 ,0x90 ,0x60 ,0x00 ,0x70 , +0x88 ,0x88 ,0x88 ,0x00 ,0x60 ,0x90 ,0x90 ,0x7C ,0x80 ,0x70 ,0xA8 ,0xA8 ,0x90 ,0x00 ,0x10 ,0xF8 , +0x14 ,0x04 ,0x00 ,0x98 ,0xA4 ,0xA4 ,0x78 ,0x00 ,0xFC ,0x20 ,0x10 ,0xE0 ,0x00 ,0xE8 ,0x00 ,0x00 , +0x00 ,0x00 ,0x40 ,0x80 ,0x80 ,0x74 ,0x00 ,0xFC ,0x20 ,0x50 ,0x88 ,0x00 ,0xFC ,0x00 ,0x00 ,0x00 , +0x00 ,0xF0 ,0x08 ,0x30 ,0x08 ,0xF0 ,0xF8 ,0x08 ,0x08 ,0xF0 ,0x00 ,0x70 ,0x88 ,0x88 ,0x70 ,0x00 , +0xF8 ,0x24 ,0x24 ,0x18 ,0x00 ,0x18 ,0x24 ,0x24 ,0xF8 ,0x00 ,0xF0 ,0x08 ,0x08 ,0x10 ,0x00 ,0x90 , +0xA8 ,0xA8 ,0x48 ,0x00 ,0x08 ,0x7C ,0x88 ,0x00 ,0x00 ,0x78 ,0x80 ,0x80 ,0x78 ,0x00 ,0x38 ,0x40 , +0x80 ,0x40 ,0x38 ,0x78 ,0x80 ,0x40 ,0x80 ,0x78 ,0x88 ,0x50 ,0x20 ,0x50 ,0x88 ,0x08 ,0x10 ,0xE0 , +0x10 ,0x08 ,0xC8 ,0xA8 ,0x98 ,0x00 ,0x00 ,0x10 ,0x6C ,0x82 ,0x00 ,0x00 ,0xFE ,0x00 ,0x00 ,0x00 , +0x00 ,0x82 ,0x6C ,0x10 ,0x00 ,0x00 ,0x08 ,0x04 ,0x08 ,0x10 ,0x08 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 }; + +BYTE CharacterWidthTable_Font5x7 [128] = { +0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 , +0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 , +0x05 ,0x01 ,0x03 ,0x05 ,0x05 ,0x05 ,0x05 ,0x01 ,0x02 ,0x02 ,0x05 ,0x05 ,0x02 ,0x05 ,0x01 ,0x04 , +0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x01 ,0x01 ,0x04 ,0x04 ,0x04 ,0x05 , +0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x04 ,0x05 ,0x05 ,0x05 , +0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x05 ,0x03 ,0x04 ,0x05 ,0x03 ,0x05 , +0x02 ,0x05 ,0x04 ,0x04 ,0x05 ,0x04 ,0x04 ,0x04 ,0x04 ,0x01 ,0x04 ,0x04 ,0x01 ,0x05 ,0x04 ,0x05 , +0x05 ,0x05 ,0x04 ,0x04 ,0x03 ,0x04 ,0x05 ,0x05 ,0x05 ,0x05 ,0x03 ,0x03 ,0x01 ,0x05 ,0x05 ,0x05 }; + +#define FONT3x5_FONT_WIDTH 3 +#define FONT3x5_FONT_HEIGHT 5 +#define FONT3x5_ELEMENTS 128 +#define FONT3x5_FONT_COLUMN_SIZE_IN_BYTE 1 + + +BYTE FontTable_Font3x5 [384] = { +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x17 ,0x00 ,0x00 ,0x03 ,0x00 ,0x03 ,0x0E ,0x1F ,0x0E ,0x14 ,0x1F ,0x0A ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0x00 ,0x00 ,0x0E ,0x11 ,0x00 ,0x11 ,0x0E ,0x00 ,0x15 ,0x0E , +0x15 ,0x04 ,0x0E ,0x04 ,0x10 ,0x08 ,0x00 ,0x04 ,0x04 ,0x04 ,0x10 ,0x00 ,0x00 ,0x18 ,0x04 ,0x03 , +0x0E ,0x11 ,0x0E ,0x12 ,0x1F ,0x10 ,0x19 ,0x15 ,0x16 ,0x11 ,0x15 ,0x0A ,0x07 ,0x04 ,0x1F ,0x17 , +0x15 ,0x09 ,0x1E ,0x15 ,0x18 ,0x01 ,0x1D ,0x03 ,0x1B ,0x15 ,0x1B ,0x06 ,0x15 ,0x0E ,0x0A ,0x00 , +0x00 ,0x10 ,0x0A ,0x00 ,0x04 ,0x0A ,0x11 ,0x00 ,0x00 ,0x00 ,0x11 ,0x0A ,0x04 ,0x01 ,0x15 ,0x02 , +0x09 ,0x15 ,0x0E ,0x1E ,0x05 ,0x1E ,0x1F ,0x15 ,0x0A ,0x0E ,0x11 ,0x0A ,0x1F ,0x11 ,0x0E ,0x1F , +0x15 ,0x11 ,0x1F ,0x05 ,0x05 ,0x1E ,0x15 ,0x1D ,0x1F ,0x04 ,0x1F ,0x11 ,0x1F ,0x11 ,0x08 ,0x10 , +0x0F ,0x1F ,0x06 ,0x19 ,0x1F ,0x10 ,0x10 ,0x1F ,0x02 ,0x1F ,0x1F ,0x06 ,0x1F ,0x1F ,0x11 ,0x1F , +0x1F ,0x05 ,0x07 ,0x1F ,0x19 ,0x1F ,0x1F ,0x0D ,0x16 ,0x16 ,0x15 ,0x1D ,0x01 ,0x1F ,0x01 ,0x1F , +0x10 ,0x1F ,0x0F ,0x10 ,0x0F ,0x1F ,0x08 ,0x1F ,0x1B ,0x04 ,0x1B ,0x01 ,0x1E ,0x01 ,0x19 ,0x15 , +0x13 ,0x1F ,0x11 ,0x00 ,0x03 ,0x0C ,0x10 ,0x11 ,0x1F ,0x00 ,0x02 ,0x01 ,0x02 ,0x10 ,0x10 ,0x10 , +0x01 ,0x02 ,0x00 ,0x08 ,0x14 ,0x1C ,0x1F ,0x14 ,0x08 ,0x0C ,0x12 ,0x12 ,0x08 ,0x14 ,0x1F ,0x0C , +0x16 ,0x16 ,0x14 ,0x0E ,0x05 ,0x06 ,0x15 ,0x0F ,0x1F ,0x04 ,0x18 ,0x1D ,0x00 ,0x00 ,0x10 ,0x0D , +0x00 ,0x1F ,0x0C ,0x12 ,0x1F ,0x00 ,0x00 ,0x1C ,0x08 ,0x1C ,0x1C ,0x02 ,0x1C ,0x0C ,0x12 ,0x0C , +0x1E ,0x05 ,0x02 ,0x02 ,0x05 ,0x1E ,0x1C ,0x02 ,0x04 ,0x14 ,0x1A ,0x00 ,0x04 ,0x1E ,0x04 ,0x1E , +0x10 ,0x1E ,0x0E ,0x10 ,0x0E ,0x1C ,0x08 ,0x1C ,0x12 ,0x0C ,0x12 ,0x12 ,0x0C ,0x02 ,0x12 ,0x1A , +0x16 ,0x04 ,0x0E ,0x11 ,0x1F ,0x00 ,0x00 ,0x11 ,0x0E ,0x04 ,0x02 ,0x02 ,0x04 ,0x00 ,0x00 ,0x00 }; + + +BYTE CharacterWidthTable_Font3x5 [128] = { +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 , +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 , +0x03 ,0x01 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x01 ,0x02 ,0x03 ,0x03 ,0x03 ,0x02 ,0x03 ,0x01 ,0x03 , +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x01 ,0x02 ,0x03 ,0x03 ,0x03 ,0x03 , +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 , +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x02 ,0x03 ,0x02 ,0x03 ,0x03 , +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x01 ,0x03 ,0x03 ,0x01 ,0x03 ,0x03 ,0x03 , +0x03 ,0x03 ,0x03 ,0x02 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x01 ,0x03 ,0x03 ,0x03 }; + +GFXFont Font5x7; +GFXFont Font3x5; + +void GFX_Init() +{ + + //Staticially Allocate and setup the backbuffer space; + + BackBuffer.RenderPlane.BitPlaneSpace = &BackBufferRenderPlaneSpace[0]; + + BackBuffer.SizeX = BACK_BUFFER_SIZE_X; + BackBuffer.SizeY = BACK_BUFFER_SIZE_Y; + + BackBuffer.RenderPlane.SizeX = BACK_BUFFER_SIZE_X; + BackBuffer.RenderPlane.SizeY = BACK_BUFFER_SIZE_Y; + + + GFX_FullDisplayBufferClear(&BackBuffer); + + //Initialize the stock fonts + + Font5x7.CharacterWidthTable = (BYTE *)CharacterWidthTable_Font5x7; + Font5x7.FontBuffer = (BYTE *)FontTable_Font5x7; + Font5x7.FontHeight = FONT5x7_FONT_HEIGHT; + Font5x7.FontWidth = FONT5x7_FONT_WIDTH; + Font5x7.BytesPerColumn = FONT5x7_FONT_COLUMN_SIZE_IN_BYTE; + + Font3x5.CharacterWidthTable = (BYTE *)CharacterWidthTable_Font3x5; + Font3x5.FontBuffer = (BYTE *)FontTable_Font3x5; + Font3x5.FontHeight = FONT3x5_FONT_HEIGHT; + Font3x5.FontWidth = FONT3x5_FONT_WIDTH; + Font3x5.BytesPerColumn = FONT3x5_FONT_COLUMN_SIZE_IN_BYTE; + + GFX_InitPhysicalScreen(); + +} + + + +void GFX_FullDisplayBufferClear(RenderContext *Image) +{ + BitPlane_Clear(&Image->RenderPlane); +} + + +void GFX_PutPixel(RenderContext *Image, SIGNED_WORD x, SIGNED_WORD y) +{ + if((x<Image->SizeX) && (y<Image->SizeY) && (x>=0) && (y>=0)) + { + BitPlane_Put(&Image->RenderPlane,x,y,TRUE); + } +} + + + +#ifndef _INLINE_GFX_GET_PIXEL +BYTE GFX_GetPixel(RenderContext *Image, SIGNED_WORD x, SIGNED_WORD y) +{ + BYTE PixelColor = 0; + + if((x<Image->SizeX) && (y<Image->SizeY) && (x>=0) && (y>=0)) + { + + if(BitPlane_Get(&Image->RedBitPlane,x,y)) + PixelColor |= BICOLOR_RED; + + if(BitPlane_Get(&Image->GreenBitPlane,x,y)) + PixelColor |= BICOLOR_GREEN; + } + + return PixelColor; +} +#endif + + +void GFX_DrawHline(RenderContext *Image, SIGNED_WORD XStart, SIGNED_WORD XStop, SIGNED_WORD Y) +{ + SIGNED_WORD LineStart; + SIGNED_WORD LineStop; + WORD i; + + if((Y<Image->SizeY) && (Y>=0)) + { + if(XStart>XStop) + { + LineStart = XStop; + LineStop = XStart; + } + else + { + LineStart = XStart; + LineStop = XStop; + } + + if(LineStart<0) + { + LineStart = 0; + } + + if(LineStop>Image->SizeX) + { + LineStop = Image->SizeX-1; + } + + if(LineStart == LineStop) + { + GFX_PutPixel(Image,LineStart,Y); + } + else + { + for(i=LineStart; i<=LineStop ; i++) + { + GFX_PutPixel(Image,i,Y); + } + } + } + +} + + + + void GFX_DrawVline(RenderContext *Image, SIGNED_WORD YStart, SIGNED_WORD YStop, SIGNED_WORD X) +{ + SIGNED_WORD LineStart; + SIGNED_WORD LineStop; + SIGNED_WORD i; + + if((X<Image->SizeX) && (X>=0)) + { + + if(YStart>YStop) + { + LineStart = YStop; + LineStop = YStart; + } + else + { + LineStart = YStart; + LineStop = YStop; + } + + if(LineStart<0) + { + LineStart = 0; + } + + + if(LineStop>Image->SizeY) + { + LineStop = Image->SizeY-1; + } + + for(i=LineStart; i<=LineStop ; i++) + { + GFX_PutPixel(Image,X,i); + } + } +} + + +void GFX_DrawLine(RenderContext * Image, SIGNED_WORD X1,SIGNED_WORD Y1, SIGNED_WORD X2,SIGNED_WORD Y2) +{ + //A simple Implementation of Bresenham's line Algorithm + SIGNED_WORD StartX,StopX,StartY,StopY; + SIGNED_WORD dX,dY; + SIGNED_WORD Y_Numerator; + SIGNED_WORD X_Numerator; + SIGNED_WORD Y; + SIGNED_WORD X; + SIGNED_WORD i; + BOOL YDir = 0; + //First Make sure that it is left to right + //If not them flop them + if(X2>X1) + { + StartX = X1; + StopX = X2; + StartY = Y1; + StopY = Y2; + } + else + { + StartX = X2; + StopX = X1; + StartY = Y2; + StopY = Y1; + } + GFX_PutPixel(Image, StopX,StopY); + if(StopY>=StartY) + { + dY = StopY - StartY; + YDir = 0; + } + else + { + dY = StartY - StopY; + YDir = 1; + } + dX = StopX - StartX; + //Now, if the slope is less greater than one, we need to swap all X/Y operations + if(dY<=dX) + { + //Slope is less than one, proceed at normal and step along the x axis + Y=StartY; //start the whole part of the Y value at the starting pixeel. + X=StartX; + //We need to start the numerator of the fraction half way through the fraction so evertyhing rounds at + //fraction midpoint + Y_Numerator = dX>>1; //The fraction demonimator is assumeed to be dX + // out fixed point Y value is Y + (Y_Numerator / dX) + //Every time we step the X coordinate by one, we need to step + //out Y coordinate by dY/dX. We do this by just adding dY to our + //numerator. When the numerator gets bigger than the + //denomiator, the increment the whole part by one and decrement the numerator + //by the denominator + for(i=0;i<dX;i++) + { + GFX_PutPixel(Image,X,Y); + X++; + //Now do all the fractional stuff + Y_Numerator += dY; + if(Y_Numerator >= dX) + { + Y_Numerator-=dX; + if(StopY > StartY) + { + Y++; + } + else + { + Y--; + } + } + } + } + else + { + //Same as before by step along the y axis. + Y=StartY; + X=StartX; + X_Numerator = dY>>1; + for(i=0;i<dY;i++) + { + GFX_PutPixel(Image,X,Y); + //Now do all the fractional stuff + if(YDir) + { + Y--; + } + else + { + Y++; + } + X_Numerator += dX; + if(X_Numerator >= dY) + { + X_Numerator-=dY; + if(StopX > StartX) + { + X++; + } + else + { + X--; + } + } + } + } +} + + + + + +void GFX_DrawBox(RenderContext *Image, GFXDisplayBox *Box) +{ + GFX_DrawHline(Image,Box->P1.X,Box->P2.X,Box->P1.Y); + GFX_DrawHline(Image,Box->P1.X,Box->P2.X,Box->P2.Y); + GFX_DrawVline(Image,Box->P1.Y,Box->P2.Y,Box->P1.X); + GFX_DrawVline(Image,Box->P1.Y,Box->P2.Y,Box->P2.X); +} + + + +SIGNED_WORD GFX_DrawCharacter(RenderContext * Image,BYTE Character,SIGNED_WORD StartX, SIGNED_WORD StartY, GFXFont * MyFont) +{ + BYTE i,j,Mask; + WORD CharStartIndex,ColumnStartIndex,ByteOffset; + + CharStartIndex = (Character * (MyFont->BytesPerColumn) * (MyFont->FontWidth)); + + for(j=0;j<MyFont->CharacterWidthTable[Character];j++) + { + //Draw the current slice + ColumnStartIndex = j* (MyFont->BytesPerColumn); + + for(i=0;i<MyFont->FontHeight;i++) + { + ByteOffset = i>>3; + Mask = 0x01 << (i&0x07); + + if( (MyFont->FontBuffer[CharStartIndex + ColumnStartIndex + ByteOffset]) & Mask) + { + GFX_PutPixel(Image, StartX, StartY + i); + } + } + StartX++; + } + return StartX; +} + + +SIGNED_WORD GFX_GetStringWidth(CHAR * String,GFXFont * MyFont) +{ + BYTE Ptr = 0; + BYTE NextChar; + SIGNED_WORD StringSize = 0; + + NextChar = String[Ptr]; + Ptr++; + + while((NextChar!=0) && (Ptr <GFX_MAX_STRING_LEN)) + { + StringSize += MyFont->CharacterWidthTable[NextChar] + 1; + NextChar = String[Ptr]; + Ptr++; + } + + return StringSize; +} + +void GFX_DrawCenteredString(RenderContext * Image,CHAR * String,SIGNED_WORD StartX, SIGNED_WORD StartY, GFXFont * MyFont) +{ + StartX -= (GFX_GetStringWidth(String,MyFont)>>1); + GFX_DrawString(Image,String,StartX,StartY,MyFont); +} + +void GFX_DrawString(RenderContext * Image,CHAR * String,SIGNED_WORD StartX, SIGNED_WORD StartY, GFXFont * MyFont) +{ + +BYTE Ptr = 0; +BYTE NextChar; + +NextChar = String[Ptr]; + + while((NextChar!=0) && (Ptr <GFX_MAX_STRING_LEN)) + { + StartX = GFX_DrawCharacter(Image,NextChar,StartX,StartY,MyFont); + Ptr++; + NextChar = String[Ptr]; + StartX++; + } + +} + + +CHAR GFXStringBuf[64]; + +void GFX_printf(RenderContext * Image,SIGNED_WORD StartX, SIGNED_WORD StartY, GFXFont * MyFont, const char *FormatString,...) +{ + va_list argptr; + va_start(argptr,FormatString); + vsprintf((CHAR *)GFXStringBuf,FormatString,argptr); + va_end(argptr); + + GFX_DrawString(Image,GFXStringBuf,StartX,StartY,MyFont); +} + + + +void GFX_DrawListPrimitive(RenderContext * Image,GFXListPrimitive *LP) +{ + BYTE Points; + BYTE i; + + if(LP->NumPoints >1) + { + + switch(LP->DrawMode) + { + + default: + case GFX_LIST_PRIMITIVE_CLOSED: + for(i=1;i<LP->NumPoints;i++) + { + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[i-1].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[i-1].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[i].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[i].Y + LP->Center.Y)); + } + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[LP->NumPoints-1].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[LP->NumPoints-1].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[0].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[0].Y + LP->Center.Y)); + break; + + case GFX_LIST_PRIMITIVE_CONNECTED: + for(i=1;i<LP->NumPoints;i++) + { + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[i-1].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[i-1].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[i].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[i].Y + LP->Center.Y)); + } + break; + + case GFX_LIST_PRIMITIVE_DISCONNECTED: + Points = LP->NumPoints>>1; + for(i=0;i<Points;i++) + { + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[i*2].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[i*2].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[i*2+1].X + LP->Center.X),(SIGNED_WORD)(LP->PointList[i*2+1].Y + LP->Center.Y)); + } + break; + + case GFX_LIST_PRIMITIVE_CLOSED_YFLIPPED: + for(i=1;i<LP->NumPoints;i++) + { + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[i-1].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[i-1].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[i].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[i].Y + LP->Center.Y)); + } + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[LP->NumPoints-1].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[LP->NumPoints-1].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[0].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[0].Y + LP->Center.Y)); + break; + + case GFX_LIST_PRIMITIVE_CONNECTED_YFLIPPED: + for(i=1;i<LP->NumPoints;i++) + { + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[i-1].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[i-1].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[i].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[i].Y + LP->Center.Y)); + } + break; + + case GFX_LIST_PRIMITIVE_DISCONNECTED_YFLIPPED: + Points = LP->NumPoints>>1; + for(i=0;i<Points;i++) + { + GFX_DrawLine(Image,(SIGNED_WORD)(LP->PointList[i*2].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[i*2].Y + LP->Center.Y), + (SIGNED_WORD)(LP->PointList[i*2+1].X + LP->Center.X),(SIGNED_WORD)(-LP->PointList[i*2+1].Y + LP->Center.Y)); + } + break; + + } + } +} + + + + +void GFX_DrawScaledListPrimitive(RenderContext * Image,GFXListPrimitive *LP , FIXED_7_8 Scale) +{ + BYTE Points; + BYTE i; + GFXRelativePoint TransformedPoint[2] = {0}; + + if(LP->NumPoints >1) + { + switch(LP->DrawMode) + { + + default: + case GFX_LIST_PRIMITIVE_CLOSED: + for(i=1;i<LP->NumPoints;i++) + { + + TransformedPoint[0].X = FMul_15_0to7_8(LP->PointList[i-1].X,Scale) + LP->Center.X; + TransformedPoint[0].Y = FMul_15_0to7_8(LP->PointList[i-1].Y,Scale) + LP->Center.Y; + TransformedPoint[1].X = FMul_15_0to7_8(LP->PointList[i].X,Scale) + LP->Center.X; + TransformedPoint[1].Y = FMul_15_0to7_8(LP->PointList[i].Y,Scale) + LP->Center.Y; + + GFX_DrawLine(Image,TransformedPoint[0].X,TransformedPoint[0].Y, + TransformedPoint[1].X,TransformedPoint[1].Y); + + } + + TransformedPoint[0].X = FMul_15_0to7_8(LP->PointList[LP->NumPoints-1].X,Scale) + LP->Center.X; + TransformedPoint[0].Y = FMul_15_0to7_8(LP->PointList[LP->NumPoints-1].Y,Scale) + LP->Center.Y; + TransformedPoint[1].X = FMul_15_0to7_8(LP->PointList[0].X,Scale) + LP->Center.X; + TransformedPoint[1].Y = FMul_15_0to7_8(LP->PointList[0].Y,Scale) + LP->Center.Y; + + GFX_DrawLine(Image,TransformedPoint[0].X,TransformedPoint[0].Y, + TransformedPoint[1].X,TransformedPoint[1].Y); + + break; + + case GFX_LIST_PRIMITIVE_CONNECTED: + for(i=1;i<LP->NumPoints;i++) + { + TransformedPoint[0].X = FMul_15_0to7_8(LP->PointList[i-1].X,Scale) + LP->Center.X; + TransformedPoint[0].Y = FMul_15_0to7_8(LP->PointList[i-1].Y,Scale) + LP->Center.Y; + TransformedPoint[1].X = FMul_15_0to7_8(LP->PointList[i].X,Scale) + LP->Center.X; + TransformedPoint[1].Y = FMul_15_0to7_8(LP->PointList[i].Y,Scale) + LP->Center.Y; + + GFX_DrawLine(Image,TransformedPoint[0].X,TransformedPoint[0].Y, + TransformedPoint[1].X,TransformedPoint[1].Y); + } + break; + + case GFX_LIST_PRIMITIVE_DISCONNECTED: + Points = LP->NumPoints>>1; + + for(i=0;i<Points;i++) + { + TransformedPoint[0].X = FMul_15_0to7_8(LP->PointList[i*2].X,Scale) + LP->Center.X; + TransformedPoint[0].Y = FMul_15_0to7_8(LP->PointList[i*2].Y,Scale) + LP->Center.Y; + TransformedPoint[1].X = FMul_15_0to7_8(LP->PointList[(i*2)+1].X,Scale) + LP->Center.X; + TransformedPoint[1].Y = FMul_15_0to7_8(LP->PointList[(i*2)+1].Y,Scale) + LP->Center.Y; + + GFX_DrawLine(Image,TransformedPoint[0].X,TransformedPoint[0].Y, + TransformedPoint[1].X,TransformedPoint[1].Y); + } + break; + + } + + } + +} + +void GFX_DrawRotatedListPrimitive(RenderContext * Image,GFXListPrimitive *LP , BYTE Angle, BYTE Color) +{ + BYTE Points; + BYTE i; + + GFXRelativePoint TransformedPoint[2] = {0}; + + if(LP->NumPoints >1) + { + //If we are drawing non connected points, there must be an even number of them. + switch(LP->DrawMode) + { + case GFX_LIST_PRIMITIVE_DISCONNECTED: + + Points = LP->NumPoints>>1; + + for(i=0;i<Points;i++) + { + + TransformedPoint[0].X = FMul_15_0to1_14((LP->PointList[i*2].X), Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[i*2].Y, Fixed_1_14_SineTable[Angle]); + + TransformedPoint[0].Y = FMul_15_0to1_14(LP->PointList[i*2].X, Fixed_1_14_SineTable[Angle ]) + + FMul_15_0to1_14(LP->PointList[i*2].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff]); + + TransformedPoint[1].X = FMul_15_0to1_14(LP->PointList[(i*2)+1].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[(i*2)+1].Y, Fixed_1_14_SineTable[Angle]); + + TransformedPoint[1].Y = FMul_15_0to1_14(LP->PointList[(i*2)+1].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[(i*2)+1].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff]); + + + TransformedPoint[0].X += LP->Center.X; + TransformedPoint[0].Y += LP->Center.Y; + TransformedPoint[1].X += LP->Center.X; + TransformedPoint[1].Y += LP->Center.Y; + + + GFX_DrawLine(Image,(TransformedPoint[0].X + LP->Center.X),(TransformedPoint[0].Y + LP->Center.Y), + (TransformedPoint[1].X + LP->Center.X),(TransformedPoint[1].Y + LP->Center.Y)); + } + break; + + case GFX_LIST_PRIMITIVE_CONNECTED: + + for(i=1;i<LP->NumPoints;i++) + { + + TransformedPoint[0].X = (FMul_15_0to1_14(LP->PointList[i-1].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[i-1].Y, Fixed_1_14_SineTable[Angle]) ); + + TransformedPoint[0].Y = ( FMul_15_0to1_14(LP->PointList[i-1].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[i-1].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff] ) ); + + TransformedPoint[1].X = (FMul_15_0to1_14(LP->PointList[i].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[i].Y, Fixed_1_14_SineTable[Angle]) ); + + TransformedPoint[1].Y = (FMul_15_0to1_14(LP->PointList[i].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[i].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff])); + + TransformedPoint[0].X += LP->Center.X; + TransformedPoint[0].Y += LP->Center.Y; + TransformedPoint[1].X += LP->Center.X; + TransformedPoint[1].Y += LP->Center.Y; + + GFX_DrawLine(Image,(TransformedPoint[0].X),(TransformedPoint[0].Y), + (TransformedPoint[1].X),(TransformedPoint[1].Y)); + + } + break; + default: + case GFX_LIST_PRIMITIVE_CLOSED: + + for(i=1;i<LP->NumPoints;i++) + { + + TransformedPoint[0].X = (FMul_15_0to1_14(LP->PointList[i-1].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[i-1].Y, Fixed_1_14_SineTable[Angle]) ); + + TransformedPoint[0].Y = ( FMul_15_0to1_14(LP->PointList[i-1].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[i-1].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff] ) ); + + TransformedPoint[1].X = (FMul_15_0to1_14(LP->PointList[i].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[i].Y, Fixed_1_14_SineTable[Angle]) ); + + TransformedPoint[1].Y = (FMul_15_0to1_14(LP->PointList[i].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[i].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff])); + + TransformedPoint[0].X += LP->Center.X; + TransformedPoint[0].Y += LP->Center.Y; + TransformedPoint[1].X += LP->Center.X; + TransformedPoint[1].Y += LP->Center.Y; + + GFX_DrawLine(Image,(TransformedPoint[0].X),(TransformedPoint[0].Y), + (TransformedPoint[1].X),(TransformedPoint[1].Y)); + } + + TransformedPoint[0].X = (FMul_15_0to1_14(LP->PointList[LP->NumPoints-1].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[LP->NumPoints-1].Y, Fixed_1_14_SineTable[Angle]) ); + + TransformedPoint[0].Y = ( FMul_15_0to1_14(LP->PointList[LP->NumPoints-1].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[LP->NumPoints-1].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff] ) ); + + TransformedPoint[1].X = (FMul_15_0to1_14(LP->PointList[0].X, Fixed_1_14_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to1_14(LP->PointList[0].Y, Fixed_1_14_SineTable[Angle]) ); + + TransformedPoint[1].Y = (FMul_15_0to1_14(LP->PointList[0].X, Fixed_1_14_SineTable[Angle]) + + FMul_15_0to1_14(LP->PointList[0].Y, Fixed_1_14_SineTable[(Angle + 64)&0xff])); + + TransformedPoint[0].X += LP->Center.X; + TransformedPoint[0].Y += LP->Center.Y; + TransformedPoint[1].X += LP->Center.X; + TransformedPoint[1].Y += LP->Center.Y; + + GFX_DrawLine(Image,(TransformedPoint[0].X),(TransformedPoint[0].Y), + (TransformedPoint[1].X),(TransformedPoint[1].Y)); + break; + } + } +} +/* +void GFX_DrawScaledRotatedListPrimitive(BiColorRenderContext * Image,GFXListPrimitive *LP , BYTE Angle,GFXFixed_7_8 Scale, BYTE Color) +{ + BYTE Points; + BYTE i; + + GFXRelativePoint TransformedPoint[2]; + + if(LP->NumPoints >1) + { + //If we are drawing non connected points, there must be an even number of them. + if(LP->Connected == FALSE) + { + Points = LP->NumPoints>>1; + + for(i=0;i<Points;i++) + { + + TransformedPoint[0].X = FMul_15_0to0_15(LP->PointList[i*2].X, Fixed_0_15_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to0_15(LP->PointList[i*2].Y, Fixed_0_15_SineTable[Angle]); + + TransformedPoint[0].Y = FMul_15_0to0_15(LP->PointList[i*2].X, Fixed_0_15_SineTable[Angle ]) + + FMul_15_0to0_15(LP->PointList[i*2].Y, Fixed_0_15_SineTable[(Angle + 64)&0xff]); + + TransformedPoint[1].X = FMul_15_0to0_15(LP->PointList[(i*2)+1].X, Fixed_0_15_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to0_15(LP->PointList[(i*2)+1].Y, Fixed_0_15_SineTable[Angle]); + + TransformedPoint[1].Y = FMul_15_0to0_15(LP->PointList[(i*2)+1].X, Fixed_0_15_SineTable[Angle ]) + + FMul_15_0to0_15(LP->PointList[(i*2)+1].Y, Fixed_0_15_SineTable[(Angle + 64)&0xff]); + + + TransformedPoint[0].X = FMul_15_0to7_8(TransformedPoint[0].X,Scale) + LP->Center.X; + TransformedPoint[0].Y = FMul_15_0to7_8(TransformedPoint[0].Y,Scale) + LP->Center.Y; + TransformedPoint[1].X = FMul_15_0to7_8(TransformedPoint[1].X,Scale) + LP->Center.X; + TransformedPoint[1].Y = FMul_15_0to7_8(TransformedPoint[1].Y,Scale) + LP->Center.Y; + + GFX_DrawLine(Image,(TransformedPoint[0].X),(TransformedPoint[0].Y), + (TransformedPoint[1].X),(TransformedPoint[1].Y),Color); + + } + + } + else + { + for(i=1;i<LP->NumPoints;i++) + { + + TransformedPoint[0].X = ( FMul_15_0to0_15(LP->PointList[i-1].X, Fixed_0_15_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to0_15(LP->PointList[i-1].Y, Fixed_0_15_SineTable[Angle]) ) ; + + TransformedPoint[0].Y = ( FMul_15_0to0_15(LP->PointList[i-1].X, Fixed_0_15_SineTable[Angle ]) + + FMul_15_0to0_15(LP->PointList[i-1].Y, Fixed_0_15_SineTable[(Angle + 64)&0xff] ) ); + + TransformedPoint[1].X = (FMul_15_0to0_15(LP->PointList[i].X, Fixed_0_15_SineTable[(Angle + 64)&0xff]) - + FMul_15_0to0_15(LP->PointList[i].Y, Fixed_0_15_SineTable[Angle]) ) ; + + TransformedPoint[1].Y = (FMul_15_0to0_15(LP->PointList[i].X, Fixed_0_15_SineTable[Angle ]) + + FMul_15_0to0_15(LP->PointList[i].Y, Fixed_0_15_SineTable[(Angle + 64)&0xff]) ) ; + + + TransformedPoint[0].X = FMul_15_0to7_8(TransformedPoint[0].X,Scale) + LP->Center.X; + TransformedPoint[0].Y = FMul_15_0to7_8(TransformedPoint[0].Y,Scale)+ LP->Center.Y; + TransformedPoint[1].X = FMul_15_0to7_8(TransformedPoint[1].X,Scale) + LP->Center.X; + TransformedPoint[1].Y = FMul_15_0to7_8(TransformedPoint[1].Y,Scale)+ LP->Center.Y; + + GFX_DrawLine(Image,(TransformedPoint[0].X),(TransformedPoint[0].Y), + (TransformedPoint[1].X),(TransformedPoint[1].Y),Color); + + } + + } + } +} + +*/ + +