void LCD_DrawPixel(int x, int y) { RETURN_IF_Y_OUT(); RETURN_IF_X_OUT(); if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) { LCDDEV_L0_XorPixel(x, y); } else { LCDDEV_L0_SetPixelIndex(x, y, LCD_COLORINDEX); } }
/********************************************************************* * * LCD_SetPixelIndex * * Purpose: * Writes 1 pixel into the display. */ void LCD_SetPixelIndex(int x, int y, int ColorIndex) { RETURN_IF_X_OUT(); RETURN_IF_Y_OUT(); LCDDEV_L0_SetPixelIndex(x, y, ColorIndex); }
/********************************************************************* * * _DrawBitmap */ static void _DrawBitmap(int x0, int y0, int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag, tLCDDEV_Index2Color * pfIndex2Color) { const U32 * pData; int y, OldIndex, Mag, BytesPerLine, UseDrawBitmap = 0; U32 PrevColor; GUI_USE_PARA(pLogPal); OldIndex = LCD_GetColorIndex(); PrevColor = GUI_INVALID_COLOR; pData = (const U32 *)pPixel; Mag = (xMag | yMag); BytesPerLine = xsize * 4; /* Check if bitmaps color format fits to the current color conversion */ if (Mag == 1) { #if GUI_SUPPORT_MEMDEV if (!GUI_Context.hDevData) { #else { #endif if (LCD_GetpfIndex2ColorEx(GUI_Context.SelLayer) == pfIndex2Color) { UseDrawBitmap = 1; } } } if (UseDrawBitmap) { LCD_DrawBitmap(x0, y0, xsize, ysize, 1, 1, 24, BytesPerLine, pPixel, 0); } else { if (Mag == 1) { /* Perform clipping */ int x1, y1, Diff; y1 = y0 + ysize - 1; x1 = x0 + xsize - 1; /* Clip Y */ if (y0 < GUI_Context.ClipRect.y0) { Diff = GUI_Context.ClipRect.y0 - y0; y0 = GUI_Context.ClipRect.y0; #if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */ pData += (U32)Diff * (U32)BytesPerLine / 4; #else pData += (unsigned)Diff * (unsigned)BytesPerLine / 4; #endif ysize -= Diff; } Diff = y1 - GUI_Context.ClipRect.y1; if (Diff > 0) { ysize -= Diff; } if (ysize <=0) { return; } /* Clip right side */ Diff = x1 - GUI_Context.ClipRect.x1; if (Diff > 0) { xsize -= Diff; } /* Clip left side */ if (x0 < GUI_Context.ClipRect.x0) { Diff = GUI_Context.ClipRect.x0 - x0; xsize -= Diff; pData += Diff; x0 += Diff; } if (xsize <=0) { return; } /* Simple, unmagnified output using LCD_L0_SetPixel() */ for (y = 0; y < ysize; y++) { int x; const U32 * p = pData; for (x = 0; x < xsize; x++) { U32 Color; Color = *p++; if (Color != PrevColor) { LCD_SetColor(pfIndex2Color(Color)); PrevColor = Color; } LCDDEV_L0_SetPixelIndex(x + x0, y + y0, LCD_COLORINDEX); } pData += BytesPerLine / 4; } } else { /* Magnified output using LCD_FillRect() */ int x,y; int yi; for (y = y0, yi = 0; yi < ysize; yi++, y += yMag, pPixel += BytesPerLine) { int yMax; yMax = y + yMag - 1; /* Draw if within clip area */ if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) { int xi; const U32 GUI_UNI_PTR * p = pData; for (x = x0, xi = 0; xi < xsize; xi++, x += xMag) { U32 Color; Color = *p++; if (Color != PrevColor) { LCD_SetColor(pfIndex2Color(Color)); PrevColor = Color; } LCD_FillRect(x, y, x + xMag - 1, yMax); } } pData += BytesPerLine / 4; } } GUI_SetColorIndex(OldIndex); } } /********************************************************************* * * _DrawBitmap_565 */ static void _DrawBitmap_888(int x0, int y0, int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) { _DrawBitmap(x0, y0, xsize, ysize, pPixel, pLogPal, xMag, yMag, GUI_BitmapMethods888.pfIndex2Color); }
/********************************************************************* * * _DrawBitmap_RLE8 */ static void _DrawBitmap_RLE8(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) { LCD_PIXELINDEX aColorIndex[2]; LCD_PIXELINDEX PixelIndex; int xi,y; int xL, yL; const U8 GUI_UNI_PTR * pPixelOrg = pPixel; char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS); const LCD_PIXELINDEX* pTrans =NULL; char IsMagnified = ((yMag | xMag) != 1); aColorIndex[0] = LCD_ACOLORINDEX[0]; aColorIndex[1] = LCD_ACOLORINDEX[1]; /* Handle color translation */ if ((pLogPal) && (pLogPal->pPalEntries)) { if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) { return; } } /* Check if we can limit the number of lines due to clipping) */ if (yMag == 1) { if (ysize > GUI_Context.ClipRect.y1 - y0 + 1) ysize = GUI_Context.ClipRect.y1 - y0 + 1; } /* Init variables for looping */ xi=0; y =0; /* Check if we can use the cache to save some unnecessary iterations */ if (!IsMagnified) { int yDiff = GUI_Context.ClipRect.y0 - y0; if ((Cache.pPixelStart == pPixel) && (yDiff > Cache.y)) { /* Accept cache values */ y = Cache.y; xi = Cache.x; pPixel = Cache.pPixel; } } /* Init values for caching */ Cache.pPixel = Cache.pPixelStart = pPixelOrg; Cache.x = Cache.y = 0; /* Repeat until we have reached bottom */ for (; y < ysize; ) { U8 Cmd = *pPixel++; U8 Data = *pPixel++; if (Cmd) { /* Save cache info */ Cache.pPixel = pPixel-2; Cache.x = xi; Cache.y = y; LCD_ACOLORINDEX[1] = pTrans ? *(pTrans+Data) : Data; while (Cmd) { int xi1 = xi+Cmd; if (xi1>=xsize) xi1 = xsize; Cmd -= (xi1-xi); if (Data || NoTrans) { /* Skip transparent pixels */ if (IsMagnified) { xL = xMag * xi + x0; yL = yMag * y + y0; LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1); } else { LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1); } } xi =xi1; if (xi1==xsize) { y++; xi=0; } } } else { do { U8 Index = *pPixel++; if (Index || NoTrans) { /* Skip transparent pixels */ int x = x0+xi; PixelIndex = pTrans ? *(pTrans+Index) : Index; if (IsMagnified) { LCD_SetColorIndex(PixelIndex); xL = xMag * xi + x0; yL = yMag * y + y0; LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1); } else { #if 1 /* High speed variant */ if (y + y0>= GUI_Context.ClipRect.y0) if (x >= GUI_Context.ClipRect.x0) if (x <= GUI_Context.ClipRect.x1) LCDDEV_L0_SetPixelIndex(x, y + y0, PixelIndex); #else LCD_SetPixelIndex(x, y + y0, PixelIndex); #endif } } if (++xi >= xsize) { xi=0; y++; if (y >= ysize) break; } } while (--Data); } } LCD_ACOLORINDEX[0] = aColorIndex[0]; LCD_ACOLORINDEX[1] = aColorIndex[1]; }