/********************************************************************* * * GUI_DrawBitmapExp */ void GUI_DrawBitmapExp(int x0, int y0, int XSize, int YSize, int XMul, int YMul, int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR * pData, const GUI_LOGPALETTE GUI_UNI_PTR * pPal) { GUI_DRAWMODE PrevDraw; const LCD_PIXELINDEX* pTrans; GUI_LOCK(); pTrans = LCD_GetpPalConvTable(pPal); PrevDraw = GUI_SetDrawMode((pPal && pPal->HasTrans) ? GUI_DRAWMODE_TRANS : 0); #if (GUI_WINSUPPORT) WM_ADDORG(x0,y0); { GUI_RECT r; r.x0 = x0; r.x1 = x0 + XSize * XMul -1; r.y0 = y0; r.y1 = y0 + YSize * YMul -1; WM_ITERATE_START(&r); { #endif LCD_DrawBitmap( x0, y0 ,XSize ,YSize, XMul, YMul ,BitsPerPixel, BytesPerLine, pData, pTrans); #if (GUI_WINSUPPORT) } WM_ITERATE_END(); } #endif GUI_SetDrawMode(PrevDraw); GUI_UNLOCK(); }
/********************************************************************* * * _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]; }