Single Photo displayed on LPC4088
Dependencies: DMBasicGUI DMSupport
Diff: easyGUIFixed/GuiGraph16.h
- Revision:
- 0:9140ec6aa604
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easyGUIFixed/GuiGraph16.h Fri Jul 28 14:19:12 2017 +0000 @@ -0,0 +1,972 @@ +/* ************************************************************************ */ +/* */ +/* (C)2004-2015 IBIS Solutions ApS */ +/* sales@easyGUI.com */ +/* www.easyGUI.com */ +/* */ +/* 12/15/16 bit (4096/32K/64K color) graphics primitives library */ +/* v6.0.9.005 */ +/* */ +/* GuiLib.c include file - do NOT reference it in your linker setup */ +/* */ +/* ************************************************************************ */ + +//------------------------------------------------------------------------------ +#define WANT_DOUBLE_BUFFERING // Also in GuiDisplay.c, GuiLib.c - *** all three must match *** +#ifdef WANT_DOUBLE_BUFFERING +//DisplayBufUnion GuiLib_DisplayBuf; +// Experiment - what if we put GuiLib_DisplayBuf at a specific location - but not the display? +//DisplayBufUnion GuiLib_DisplayBuf __attribute__((at(0xA00BB810))); // Result of second DMBoard->display->allocateFramebuffer() call +DisplayBufUnion GuiLib_DisplayBuf __attribute__((at(0xA00BCFE0))); // Result of second DMBoard->display->allocateFramebuffer() call (as of 26 Oct 2016) +#else // Want to write direct to the display +//DisplayBufUnion GuiLib_DisplayBuf __attribute__((at(0xA0000008))); // Result of first DMBoard->display->allocateFramebuffer() call +DisplayBufUnion GuiLib_DisplayBuf __attribute__((at(0xA00017D8))); // Result of first DMBoard->display->allocateFramebuffer() call (as of 26 Oct 2016) + // Must be same as FRAME_ADDRESS in GuiDisplay.h +#endif + +//============================================================================== + +#ifdef GuiConst_CLIPPING_SUPPORT_ON +//------------------------------------------------------------------------------ +static void SetClipping( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2) +{ + if (X1 < 0) + X1 = 0; + if (Y1 < 0) + Y1 = 0; + if (X2 > (GuiConst_INT16S)sgl.CurLayerWidth - 1) + X2 = (GuiConst_INT16S)sgl.CurLayerWidth - 1; + if (Y2 > (GuiConst_INT16S)sgl.CurLayerHeight - 1) + Y2 = (GuiConst_INT16S)sgl.CurLayerHeight - 1; + + sgl.ClippingX1 = X1; + sgl.ClippingY1 = Y1; + sgl.ClippingX2 = X2; + sgl.ClippingY2 = Y2; +} +#endif + +//------------------------------------------------------------------------------ +static void MarkDisplayBoxRepaint( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2) +{ + if (!sgl.BaseLayerDrawing) + return; + + while (Y1 <= Y2) + { + if ((GuiLib_DisplayRepaint[Y1].ByteEnd == -1) || + (X1 < GuiLib_DisplayRepaint[Y1].ByteBegin)) + GuiLib_DisplayRepaint[Y1].ByteBegin = X1; + if (X2 > GuiLib_DisplayRepaint[Y1].ByteEnd) + GuiLib_DisplayRepaint[Y1].ByteEnd = X2; + #ifdef GuiConst_VNC_REMOTE_SUPPORT_ON + if ((GuiLib_VncRepaint[Y1].ByteEnd == -1) || + (X1 < GuiLib_VncRepaint[Y1].ByteBegin)) + GuiLib_VncRepaint[Y1].ByteBegin = X1; + if (X2 > GuiLib_VncRepaint[Y1].ByteEnd) + GuiLib_VncRepaint[Y1].ByteEnd = X2; + #endif + + Y1++; + } +} + +//------------------------------------------------------------------------------ +static void ClearDisplay(void) +{ + int X,Y; + GuiConst_INT16U *PixelPtr; + + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr; + for (Y = 0; Y < (GuiConst_INT16S)sgl.CurLayerHeight; Y++) + for (X = 0; X < (GuiConst_INT16S)sgl.CurLayerWidth; X++) + { + *PixelPtr = GuiConst_PIXEL_OFF; + PixelPtr++; + } +} + +//------------------------------------------------------------------------------ +static void MakeDot( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INTCOLOR Color) +{ +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&X, &Y, &X, &Y)) +#endif + { +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + *((GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y * sgl.CurLayerWidth + (GuiConst_INT32U)X) = + (Color << 8 ) | (Color >> 8); +#else + *((GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y * sgl.CurLayerWidth + (GuiConst_INT32U)X) = Color; +#endif + MarkDisplayBoxRepaint(X, Y, X, Y); + } +} + +//------------------------------------------------------------------------------ +static GuiConst_INTCOLOR ReadDot( + GuiConst_INT16S X, + GuiConst_INT16S Y) +{ + GuiConst_INT16U *PixelPtr; + + if ((X < 0) || (X >= (GuiConst_INT16S)sgl.CurLayerWidth) || + (Y < 0) || (Y >= (GuiConst_INT16S)sgl.CurLayerHeight)) + return (0); + else + { + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y * sgl.CurLayerWidth + (GuiConst_INT32U)X; +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + return ((*PixelPtr << 8) | (*PixelPtr >> 8)); +#else + return (*PixelPtr); +#endif + } +} + +//------------------------------------------------------------------------------ +static void HorzLine( + GuiConst_INT16S X1, + GuiConst_INT16S X2, + GuiConst_INT16S Y, + GuiConst_INTCOLOR Color) +{ + GuiConst_INT16U *PixelPtr; + + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y * sgl.CurLayerWidth + (GuiConst_INT32U)X1; + while (X1 <= X2) + { +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + *PixelPtr = (Color << 8) | (Color >> 8); +#else + *PixelPtr = Color; +#endif + PixelPtr++; + X1++; + } +} + +//------------------------------------------------------------------------------ +static void VertLine( + GuiConst_INT16S X, + GuiConst_INT16S Y1, + GuiConst_INT16S Y2, + GuiConst_INTCOLOR Color) +{ + GuiConst_INT16U *PixelPtr; + + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y1 * sgl.CurLayerWidth + (GuiConst_INT32U)X; + while (Y1 <= Y2) + { +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + *PixelPtr = (Color << 8) | (Color >> 8); +#else + *PixelPtr = Color; +#endif + Y1++; + PixelPtr += sgl.CurLayerWidth; + } +} + +//------------------------------------------------------------------------------ +static void DrawChar( + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiLib_FontRecPtr Font, +#ifdef GuiConst_REMOTE_FONT_DATA + GuiConst_INT32S CharNdx, +#else + GuiConst_INT8U PrefixRom * CharPtr, +#endif + GuiConst_INTCOLOR Color, + GuiConst_INT8U FullPixelFill) +{ +#ifdef GuiConst_REMOTE_FONT_DATA + GuiConst_INT8U *PixelData; + GuiConst_INT8U * CharPtr; +#else + GuiConst_INT8U PrefixRom *PixelData; +#endif + GuiConst_INT8U PixelPattern; + GuiConst_INT16S N; + GuiConst_INT8U YHeight; + GuiConst_INT8U PixN; + GuiConst_INT16S Bx; + GuiConst_INT16S PY, Y2; + GuiConst_INT8U PixelLineSize; +#ifndef GuiConst_FONT_UNCOMPRESSED +#ifdef GuiConst_REMOTE_FONT_DATA + GuiConst_INT8U *LineCtrl; +#else + GuiConst_INT8U PrefixRom *LineCtrl; +#endif + GuiConst_INT8U LineCtrlByte; + GuiConst_INT16S LineRepeat; + GuiConst_INT16S M; + GuiConst_INT8U Finished; + GuiConst_INT16U *PixelPtr; +#endif +#ifdef GuiConst_ADV_FONTS_ON + GuiConst_INT8U PixelShade, PixelShadeInv; + GuiConst_INTCOLOR PixelColor; + GuiConst_INT8U PixelR, PixelG, PixelB; + GuiConst_INT8U ColorR, ColorG, ColorB; +#endif + +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (sgl.ClippingTotal) + return; +#endif + +#ifdef GuiConst_REMOTE_FONT_DATA + if (CharNdx != sgl.CurRemoteFont) + { + GuiLib_RemoteDataReadBlock( + (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[CharNdx], + (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[CharNdx + 1] - + (GuiConst_INT32U PrefixRom)GuiFont_ChPtrList[CharNdx], + sgl.GuiLib_RemoteFontBuffer); + sgl.CurRemoteFont = CharNdx; + } + CharPtr = &sgl.GuiLib_RemoteFontBuffer[0]; +#endif + + if ((*(CharPtr + GuiLib_CHR_XWIDTH_OFS) == 0) || + (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) == 0)) + return; + + GuiLib_COORD_ADJUST(X, Y); + GuiLib_COLOR_ADJUST(Color); + + gl.Dummy1_8U = Font->LineSize; // To avoid compiler warning +#ifdef GuiConst_FONT_UNCOMPRESSED + PixelLineSize = Font->LineSize; + #ifdef GuiConst_ROTATED_90DEGREE + YHeight = Font->XSize; + #else + YHeight = Font->YSize; + #endif + PixelData = CharPtr + GuiLib_CHR_LINECTRL_OFS + 1; +#else + #ifdef GuiConst_ROTATED_90DEGREE + PixelLineSize = *(CharPtr + GuiLib_CHR_YHEIGHT_OFS); + YHeight = *(CharPtr + GuiLib_CHR_XWIDTH_OFS); + #else + PixelLineSize = *(CharPtr + GuiLib_CHR_XWIDTH_OFS); + YHeight = *(CharPtr + GuiLib_CHR_YHEIGHT_OFS); + #endif + LineCtrl = CharPtr + GuiLib_CHR_LINECTRL_OFS; + N = (YHeight + 7) / 8; + if (N == 0) + N++; + PixelData = LineCtrl + N; +#ifdef GuiConst_ADV_FONTS_ON + if (Font->ColorDepth == 4) + PixelLineSize = (PixelLineSize + 1) / 2; + else +#endif + PixelLineSize = (PixelLineSize + 7) / 8; +#endif + +#ifdef GuiConst_FONT_UNCOMPRESSED + +#ifdef GuiConst_ROTATED_OFF + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= Font->XSize - 1; + Y -= Font->YSize - 1; + #else + X -= Font->XSize - 1; + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + Y -= Font->YSize - 1; + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_90DEGREE_RIGHT + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= Font->YSize - 1; + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= Font->YSize - 1; + Y -= Font->XSize - 1; + #else + Y -= Font->XSize - 1; + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_UPSIDEDOWN + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifndef GuiConst_MIRRORED_VERTICALLY + Y -= Font->YSize - 1; + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= Font->XSize - 1; + #else + X -= Font->XSize - 1; + Y -= Font->YSize - 1; + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_90DEGREE_LEFT + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + Y -= Font->XSize - 1; + #else + X -= Font->YSize - 1; + Y -= Font->XSize - 1; + #endif + #else + #ifndef GuiConst_MIRRORED_VERTICALLY + X -= Font->YSize - 1; + #endif + #endif +#endif + +#else + +#ifdef GuiConst_ROTATED_OFF + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + Y -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + #else + X -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + Y += *(CharPtr + GuiLib_CHR_YTOP_OFS); + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + Y -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + #else + X += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + Y += *(CharPtr + GuiLib_CHR_YTOP_OFS); + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_90DEGREE_RIGHT + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + Y += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + #else + X += *(CharPtr + GuiLib_CHR_YTOP_OFS); + Y += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + Y -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + #else + X += *(CharPtr + GuiLib_CHR_YTOP_OFS); + Y -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_UPSIDEDOWN + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + Y += *(CharPtr + GuiLib_CHR_YTOP_OFS); + #else + X += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + Y -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + Y += *(CharPtr + GuiLib_CHR_YTOP_OFS); + #else + X -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + Y -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_90DEGREE_LEFT + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X += *(CharPtr + GuiLib_CHR_YTOP_OFS); + Y -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + #else + X -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + Y -= (*(CharPtr + GuiLib_CHR_XWIDTH_OFS) + + *(CharPtr + GuiLib_CHR_XLEFT_OFS) - 1); + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X += *(CharPtr + GuiLib_CHR_YTOP_OFS); + Y += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + #else + X -= (*(CharPtr + GuiLib_CHR_YHEIGHT_OFS) + + *(CharPtr + GuiLib_CHR_YTOP_OFS) - 1); + Y += *(CharPtr + GuiLib_CHR_XLEFT_OFS); + #endif + #endif +#endif + +#endif + +#ifdef GuiConst_ADV_FONTS_ON + ColorR = (Color & GuiConst_COLORCODING_R_MASK) >> + GuiConst_COLORCODING_R_START; + ColorG = (Color & GuiConst_COLORCODING_G_MASK) >> + GuiConst_COLORCODING_G_START; + ColorB = (Color & GuiConst_COLORCODING_B_MASK) >> + GuiConst_COLORCODING_B_START; +#endif + + PY = 0; +#ifndef GuiConst_FONT_UNCOMPRESSED + LineCtrlByte = *LineCtrl; + LineCtrlByte >>= 1; + LineCtrl++; +#endif + while (PY < YHeight) + { +#ifndef GuiConst_FONT_UNCOMPRESSED + LineRepeat = 0; + do + { + LineRepeat++; + Finished = (((LineCtrlByte & 0x01) == 0) || (PY >= YHeight - 1)); + + PY++; + if (PY % 8 == 7) + { + LineCtrlByte = *LineCtrl; + LineCtrl++; + } + else + LineCtrlByte >>= 1; + } + while (!Finished); +#endif + +#ifdef GuiConst_ADV_FONTS_ON + if (Font->ColorDepth == 4) + Bx = X; + else +#endif + Bx = X; + + for (N = 0; N < PixelLineSize; N++) + { + PixelPattern = *PixelData; + + if (PixelPattern != 0) + { +#ifdef GuiConst_ADV_FONTS_ON + if (Font->ColorDepth == 4) + { + for (PixN = 0; PixN < 2; PixN++) + { + if (PixN == 0) + PixelShade = PixelPattern & 0x0F; + else + PixelShade = (PixelPattern & 0xF0) >> 4; + if (FullPixelFill && (PixelShade > 0)) + PixelShade = 0x0F; + if ( +#ifdef GuiConst_CLIPPING_SUPPORT_ON + (Bx + PixN >= sgl.ClippingX1) && (Bx + PixN <= sgl.ClippingX2) && +#endif + (PixelShade > 0)) + { + PixelShadeInv = 15 - PixelShade; + Y2 = Y; + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y2 * sgl.CurLayerWidth + + (GuiConst_INT32U)(Bx + PixN); +#ifndef GuiConst_FONT_UNCOMPRESSED + for (M = 0; M < LineRepeat; M++) +#endif + { +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if ((Y2 >= sgl.ClippingY1) && (Y2 <= sgl.ClippingY2)) +#endif + { + if (PixelShade == 0x0F) + { +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + *PixelPtr = (Color << 8) | (Color >> 8); +#else + *PixelPtr = Color; +#endif + } + else + { + PixelColor = *PixelPtr; + PixelR = (PixelColor & GuiConst_COLORCODING_R_MASK) >> + GuiConst_COLORCODING_R_START; + PixelG = (PixelColor & GuiConst_COLORCODING_G_MASK) >> + GuiConst_COLORCODING_G_START; + PixelB = (PixelColor & GuiConst_COLORCODING_B_MASK) >> + GuiConst_COLORCODING_B_START; + PixelR = (PixelShade * ColorR + PixelShadeInv * PixelR) / 15; + PixelG = (PixelShade * ColorG + PixelShadeInv * PixelG) / 15; + PixelB = (PixelShade * ColorB + PixelShadeInv * PixelB) / 15; + PixelColor = (PixelR << GuiConst_COLORCODING_R_START) | + (PixelG << GuiConst_COLORCODING_G_START) | + (PixelB << GuiConst_COLORCODING_B_START); +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + *PixelPtr = ((PixelColor>>8)&0xFF) | ((PixelColor<<8)&0xFF00); +#else + *PixelPtr = PixelColor; +#endif + } + } + Y2++; + PixelPtr += sgl.CurLayerWidth; + } + } + } + } + else + #endif + { + for (PixN = 0; PixN < 8; PixN++) + { + if ( +#ifdef GuiConst_CLIPPING_SUPPORT_ON + (Bx + PixN >= sgl.ClippingX1) && (Bx + PixN <= sgl.ClippingX2) && +#endif + ((PixelPattern >> (7-PixN)) & 0x01)) + { + Y2 = Y; + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y2 * sgl.CurLayerWidth + + (GuiConst_INT32U)(Bx + PixN); +#ifndef GuiConst_FONT_UNCOMPRESSED + for (M = 0; M < LineRepeat; M++) +#endif + { +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if ((Y2 >= sgl.ClippingY1) && (Y2 <= sgl.ClippingY2)) +#endif + { +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + *PixelPtr = (Color << 8) | (Color >> 8); +#else + *PixelPtr = Color; +#endif + } + Y2++; + PixelPtr += sgl.CurLayerWidth; + } + } + } + } + } + + PixelData++; +#ifdef GuiConst_ADV_FONTS_ON + if (Font->ColorDepth == 4) + Bx+=2; + else +#endif + Bx+=8; + } + +#ifdef GuiConst_FONT_UNCOMPRESSED + PY++; + Y++; +#else + Y += LineRepeat; +#endif + } +} + +#ifdef GuiConst_BITMAP_SUPPORT_ON + +#define RenderPix \ +{ \ + *PixelPtr2 = *PixelDataPtr2; \ + PixelPtr2++; \ + *PixelPtr2 = *(PixelDataPtr2 + 1); \ + PixelPtr2++; \ +} + +//------------------------------------------------------------------------------ +static void ShowBitmapArea( +#ifdef GuiConst_REMOTE_BITMAP_DATA + GuiConst_INT8U * PixelDataPtr, +#else + GuiConst_INT8U PrefixRom * PixelDataPtr, +#endif + GuiConst_INT16S X, + GuiConst_INT16S Y, + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2, + GuiConst_INT32S TranspColor, + GuiConst_INT8U BitmapType) +{ +#ifdef GuiConst_REMOTE_BITMAP_DATA + GuiConst_INT8U * PixelDataPtr2; +#else + GuiConst_INT8U PrefixRom * PixelDataPtr2; +#endif + GuiConst_INT16S SizeX; + GuiConst_INT16S SizeY; + GuiConst_INT8U *PixelPtr1, *PixelPtr2; + GuiConst_INT16S I; + GuiConst_INT16U Cnt, CntPix; + GuiConst_INT8U Diff; +#ifdef GuiConst_BITMAP_COMPRESSED + GuiConst_INT16U Offset; + GuiConst_INT16S DX; +#ifdef GuiConst_REMOTE_BITMAP_DATA + GuiConst_INT8U * RemPixelDataPtr; + GuiConst_INT8U * LinePixelDataPtr; +#else + GuiConst_INT8U PrefixRom * RemPixelDataPtr; + GuiConst_INT8U PrefixRom * LinePixelDataPtr; +#endif +#endif + +#ifdef GuiConst_DISPLAY_BIG_ENDIAN + TranspColor = ((TranspColor&0xFF)<<8)|((TranspColor&0xFF00)>>8); +#endif + + SizeX = (GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + SizeX += 256*(GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + SizeY = (GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + SizeY += 256*(GuiConst_INT16S)*PixelDataPtr; + PixelDataPtr++; + +#ifdef GuiConst_ROTATED_90DEGREE + sgl.BitmapWriteX2 = X + SizeY - 1; + sgl.BitmapWriteY2 = Y + SizeX - 1; +#else + sgl.BitmapWriteX2 = X + SizeX - 1; + sgl.BitmapWriteY2 = Y + SizeY - 1; +#endif + + GuiLib_COORD_ADJUST(X, Y); + GuiLib_COLOR_ADJUST_TRANSP(TranspColor); + + if (BitmapType == GuiLib_AREA_BITMAP) + { + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); + } + +#ifdef GuiConst_ROTATED_OFF + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= SizeX - 1; + Y -= SizeY - 1; + #else + X -= SizeX - 1; + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + Y -= SizeY - 1; + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_90DEGREE_RIGHT + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= SizeX - 1; + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= SizeX - 1; + Y -= SizeY - 1; + #else + Y -= SizeY - 1; + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_UPSIDEDOWN + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifndef GuiConst_MIRRORED_VERTICALLY + Y -= SizeY - 1; + #endif + #else + #ifdef GuiConst_MIRRORED_VERTICALLY + X -= SizeX - 1; + #else + X -= SizeX - 1; + Y -= SizeY - 1; + #endif + #endif +#endif +#ifdef GuiConst_ROTATED_90DEGREE_LEFT + #ifdef GuiConst_MIRRORED_HORIZONTALLY + #ifdef GuiConst_MIRRORED_VERTICALLY + Y -= SizeY - 1; + #else + X -= SizeX - 1; + Y -= SizeY - 1; + #endif + #else + #ifndef GuiConst_MIRRORED_VERTICALLY + X -= SizeX - 1; + #endif + #endif +#endif + + if (BitmapType == GuiLib_AREA_BITMAP) + { + if ((X1 > X + SizeX - 1) || (X2 < X) || (Y1 > Y + SizeY - 1) || (Y2 < Y)) + return; + if (X1 < X) + X1 = X; + if (X2 > X + SizeX - 1) + X2 = X + SizeX - 1; + if (Y1 < Y) + Y1 = Y; + if (Y2 > Y + SizeY - 1) + Y2 = Y + SizeY - 1; + } + else + { + X2 = X + SizeX - 1; + Y2 = Y + SizeY - 1; + + OrderCoord(&X, &X2); + OrderCoord(&Y, &Y2); + + X1 = X; + Y1 = Y; + } + +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (!CheckRect(&X1, &Y1, &X2, &Y2)) + return; +#endif + + MarkDisplayBoxRepaint(X1, Y1, X2, Y2); // Before changing Y1 + +#ifdef GuiConst_BITMAP_COMPRESSED + while (Y < Y1) + { + Offset = (GuiConst_INT16U)*PixelDataPtr; + PixelDataPtr++; + Offset += 256 * (GuiConst_INT16U)*PixelDataPtr; + PixelDataPtr++; + if (Offset != 0) + { + LinePixelDataPtr = PixelDataPtr; + PixelDataPtr += Offset - 2; + } + + Y++; + } + DX = X1 - X; +#else + PixelDataPtr += 2 * (SizeX * (Y1 - Y) + (X1 - X)); + Diff = 1; +#endif + PixelPtr1 = sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y1 * sgl.CurLayerLineSize + (GuiConst_INT32U)(2 * X1); + while (Y1 <= Y2) + { + PixelPtr2 = PixelPtr1; + +#ifdef GuiConst_BITMAP_COMPRESSED + Offset = (GuiConst_INT16U)*PixelDataPtr; + PixelDataPtr++; + Offset += 256 * (GuiConst_INT16U)*PixelDataPtr; + PixelDataPtr++; + if (Offset == 0) + { + RemPixelDataPtr = PixelDataPtr; + PixelDataPtr = LinePixelDataPtr; + } + else + LinePixelDataPtr = PixelDataPtr; + + Cnt = 0; + X = DX; + while (X > 0) + { + Diff = *PixelDataPtr; + Cnt = Diff & 0x7F; + Diff >>= 7; + PixelDataPtr++; + + if (X >= Cnt) + { + if (Diff) + PixelDataPtr += 2 * Cnt; + else + PixelDataPtr += 2; + X -= Cnt; + Cnt = 0; + } + else + { + if (Diff) + PixelDataPtr += 2 * X; + Cnt -= X; + X = 0; + } + } +#endif + + PixelDataPtr2 = PixelDataPtr; + for (X = X1; X <= X2; X++) + { +#ifdef GuiConst_BITMAP_COMPRESSED + if (Cnt == 0) + { + Diff = *PixelDataPtr2; + Cnt = Diff & 0x7F; + Diff >>= 7; + PixelDataPtr2++; + } + CntPix = GuiLib_GET_MIN(Cnt, X2 - X + 1); + Cnt -= CntPix; +#else + CntPix = X2 - X + 1; +#endif + X += CntPix - 1; + + if (Diff) + { + if (TranspColor == -1) + { + CopyBytes(PixelPtr2, PixelDataPtr2, 2 * CntPix); + PixelPtr2 += 2 * CntPix; + PixelDataPtr2 += 2 * CntPix; + } + else + { + while (CntPix > 0) + { + if (*(GuiConst_INT16U*)PixelDataPtr2 == + (GuiConst_INT16U)TranspColor) + PixelPtr2 += 2; + else + { + RenderPix; + } + + CntPix--; + PixelDataPtr2 += 2; + } + } + } +#ifdef GuiConst_BITMAP_COMPRESSED + else + { + if ((TranspColor == -1) || + (*(GuiConst_INT16U*)PixelDataPtr2 != (GuiConst_INT16U)TranspColor)) + { + while (CntPix > 0) + { + RenderPix; + CntPix--; + } + } + else + PixelPtr2 += 2 * CntPix; + + PixelDataPtr2 += 2; + } + + if ((X > X2) && Diff) + PixelDataPtr2 += 2 * (X - X2); + Cnt = 0; +#endif + } + +#ifdef GuiConst_BITMAP_COMPRESSED + if (Offset == 0) + PixelDataPtr = RemPixelDataPtr; + else + PixelDataPtr = LinePixelDataPtr + Offset - 2; +#else + PixelDataPtr += 2 * SizeX; +#endif + + Y1++; + PixelPtr1 += sgl.CurLayerLineSize; + } +} +#endif + +//============================================================================== + +//------------------------------------------------------------------------------ +void GuiLib_InvertBox( + GuiConst_INT16S X1, + GuiConst_INT16S Y1, + GuiConst_INT16S X2, + GuiConst_INT16S Y2) +{ + GuiConst_INT16S X; + GuiConst_INT16U *PixelPtr; + GuiConst_INT32U DeltaLineSize; + + GuiLib_COORD_ADJUST(X1, Y1); + GuiLib_COORD_ADJUST(X2, Y2); + + OrderCoord(&X1, &X2); + OrderCoord(&Y1, &Y2); + +#ifdef GuiConst_CLIPPING_SUPPORT_ON + if (CheckRect (&X1, &Y1, &X2, &Y2)) +#endif + { + MarkDisplayBoxRepaint(X1, Y1, X2, Y2); + + PixelPtr = (GuiConst_INT16U*)sgl.CurLayerBufPtr + + (GuiConst_INT32U)Y1 * sgl.CurLayerWidth + (GuiConst_INT32U)X1; + DeltaLineSize = sgl.CurLayerWidth - (GuiConst_INT32U)(X2 - X1 + 1); + while (Y1 <= Y2) + { + for (X = X1; X <= X2; X++) + { + *PixelPtr = ~*PixelPtr; + PixelPtr++; + } + Y1++; + PixelPtr += DeltaLineSize; + } + } +} +