⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdrle8.c

📁 uc-gui.rar
💻 C
字号:
/**********************************************************************                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 thesource code may not be used to write a similar product. This file mayonly be used in accordance with a license and should not be re-distributed in any way. We appreciate your understanding and fairness.----------------------------------------------------------------------File        : LCDRLE8.cPurpose     : 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];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -