LCDRLE8.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:5k
- /*********************************************************************
- * SEGGER MICROCONTROLLER SYSTEME GmbH *
- * Solutions for real time microcontroller applications *
- **********************************************************************
- * *
- * (c) 2002 SEGGER Microcontroller Systeme GmbH *
- * *
- * Internet: www.segger.com Support: support@segger.com *
- * *
- **********************************************************************
- **** emWin/GSC Grafical user interface for embedded applications ****
- emWin is protected by international copyright laws. Knowledge of the
- source code may not be used to write a similar product. This file may
- only be used in accordance with a license and should not be re-
- distributed in any way. We appreciate your understanding and fairness.
- ----------------------------------------------------------------------
- File : LCDRLE8.c
- Purpose : Drawing routines for run length encoded bitmaps
- with 8 bpp
- ---------------------------END-OF-HEADER------------------------------
- */
- #include <stddef.h> /* needed for definition of NULL */
- #include "GUI_Private.H"
- #include "LCD_Private.H"
- static struct {
- int x,y;
- const U8* pPixel;
- const U8* pPixelStart;
- } Cache;
- void LCD_DrawBitmap_RLE8 (int x0,int y0,int xsize, int ysize, const U8*pPixel, const LCD_LOGPALETTE* pLogPal, int xMag, int yMag) {
- LCD_PIXELINDEX aColorIndex[2];
- LCD_PIXELINDEX PixelIndex;
- int xi,y;
- int xL, yL;
- const U8* 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];
- }