LCDRLE8.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:5k
源码类别:

uCOS

开发平台:

C/C++

  1. /*********************************************************************
  2. *                SEGGER MICROCONTROLLER SYSTEME GmbH                 *
  3. *        Solutions for real time microcontroller applications        *
  4. **********************************************************************
  5. *                                                                    *
  6. *        (c) 2002         SEGGER Microcontroller Systeme GmbH        *
  7. *                                                                    *
  8. *        Internet: www.segger.com    Support:  support@segger.com    *
  9. *                                                                    *
  10. **********************************************************************
  11. **** emWin/GSC Grafical user interface for embedded applications ****
  12. emWin is protected by international copyright laws. Knowledge of the
  13. source code may not be used to write a similar product. This file may
  14. only be used in accordance with a license and should not be re-
  15. distributed in any way. We appreciate your understanding and fairness.
  16. ----------------------------------------------------------------------
  17. File        : LCDRLE8.c
  18. Purpose     : Drawing routines for run length encoded bitmaps
  19.               with 8 bpp
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. #include <stddef.h>           /* needed for definition of NULL */
  23. #include "GUI_Private.H"
  24. #include "LCD_Private.H"
  25. static struct {
  26.   int x,y;
  27.   const U8* pPixel;
  28.   const U8* pPixelStart;
  29. } Cache;
  30. void LCD_DrawBitmap_RLE8 (int x0,int y0,int xsize, int ysize, const U8*pPixel, const LCD_LOGPALETTE* pLogPal, int xMag, int yMag) {
  31.   LCD_PIXELINDEX aColorIndex[2];
  32.   LCD_PIXELINDEX PixelIndex;
  33.   int xi,y;
  34.   int xL, yL;
  35.   const U8* pPixelOrg = pPixel;
  36.   char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS);
  37.   const LCD_PIXELINDEX* pTrans =NULL;
  38.   char IsMagnified = ((yMag | xMag) != 1);
  39.   aColorIndex[0] = LCD_ACOLORINDEX[0];
  40.   aColorIndex[1] = LCD_ACOLORINDEX[1];
  41.   /* Handle color translation */
  42.   if ((pLogPal) && (pLogPal->pPalEntries)) {
  43.     if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) {
  44.       return;
  45.     }
  46.   }
  47.  /* Check if we can limit the number of lines due to clipping) */
  48.   if (yMag == 1) {
  49.     if (ysize > GUI_Context.ClipRect.y1 - y0 + 1)
  50.       ysize = GUI_Context.ClipRect.y1 - y0 + 1;
  51.   }
  52.   /* Init variables for looping */
  53.   xi=0;
  54.   y =0;
  55.   /* Check if we can use the cache to save some unnecessary iterations */
  56.   if (!IsMagnified) {
  57.     int yDiff = GUI_Context.ClipRect.y0 - y0;
  58.     if ((Cache.pPixelStart == pPixel) && (yDiff > Cache.y)) {
  59.       /* Accept cache values */
  60.       y = Cache.y;
  61.       xi = Cache.x;
  62.       pPixel = Cache.pPixel;
  63.     }
  64.   }
  65.   /* Init values for caching */
  66.   Cache.pPixel = Cache.pPixelStart = pPixelOrg;
  67.   Cache.x = Cache.y = 0;
  68.   /* Repeat until we have reached bottom */
  69.   for (; y < ysize; ) {
  70.     U8 Cmd  = *pPixel++;
  71.     U8 Data = *pPixel++;
  72.     if (Cmd) {
  73.       /* Save cache info */
  74.       Cache.pPixel = pPixel-2;
  75.       Cache.x = xi;
  76.       Cache.y = y;
  77.       LCD_ACOLORINDEX[1] = pTrans ? *(pTrans+Data) : Data;
  78.       while (Cmd) {
  79.         int xi1 = xi+Cmd;
  80.         if (xi1>=xsize)
  81.           xi1 = xsize;
  82.         Cmd -= (xi1-xi);
  83.         if (Data || NoTrans) {  /* Skip transparent pixels */
  84.           if (IsMagnified) {
  85.             xL = xMag * xi + x0;
  86.             yL = yMag * y + y0;
  87.             LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1);
  88.           } else {
  89.             LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1);
  90.           }
  91.         }
  92.         xi =xi1;
  93.         if (xi1==xsize) {
  94.           y++;
  95.           xi=0;
  96.         }
  97.       }
  98.     } else {
  99.       do {
  100.         U8 Index = *pPixel++;
  101.         if (Index || NoTrans) {  /* Skip transparent pixels */
  102.           int x = x0+xi;
  103.           PixelIndex = pTrans ? *(pTrans+Index) : Index;
  104.           if (IsMagnified) {
  105.             LCD_SetColorIndex(PixelIndex);
  106.             xL = xMag * xi + x0;
  107.             yL = yMag * y + y0;
  108.             LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
  109.           } else {
  110.             #if 1 /* High speed variant */
  111.               if (y + y0>= GUI_Context.ClipRect.y0)
  112.                 if (x >= GUI_Context.ClipRect.x0)
  113.                   if (x <= GUI_Context.ClipRect.x1)
  114.                     LCDDEV_L0_SetPixelIndex(x, y + y0, PixelIndex);
  115.             #else
  116.               LCD_SetPixelIndex(x, y + y0, PixelIndex);
  117.             #endif
  118.           }
  119.         }
  120.         if (++xi >= xsize) {
  121.           xi=0; y++;
  122.           if (y >= ysize)
  123.             break;
  124.         }
  125.       } while (--Data);
  126.     }
  127.   }
  128.   LCD_ACOLORINDEX[0] = aColorIndex[0];
  129.   LCD_ACOLORINDEX[1] = aColorIndex[1];
  130. }