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

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        : LCDRLE4.c
  18. Purpose     : Drawing routines for run length encoded bitmaps
  19.               with 4bpp
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. #include <stddef.h>           /* needed for definition of NULL */
  23. #include "LCD.H"
  24. #include "GUI_Private.h"
  25. #ifndef __C51__ /* Avoid Keil C51 limitation */
  26. void LCD_DrawBitmap_RLE4(int x0,int y0,int xsize, int ysize, const U8*pPixel, const LCD_LOGPALETTE* pLogPal, int xMag, int yMag) {
  27.   const LCD_PIXELINDEX* pTrans =NULL;
  28.   char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS);
  29.   LCD_PIXELINDEX aColorIndex[2];
  30.   LCD_PIXELINDEX PixelIndex;
  31.   int xi,y;
  32.   int xL, yL;
  33.   char IsMagnified = ((yMag | xMag) != 1);
  34.   aColorIndex[0] = LCD_ACOLORINDEX[0];
  35.   aColorIndex[1] = LCD_ACOLORINDEX[1];
  36.   /* Handle color translation */
  37.   if ((pLogPal) && (pLogPal->pPalEntries)) {
  38.     if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) {
  39.       return;
  40.     }
  41.   }
  42.  /* Check if we can limit the number of lines due to clipping) */
  43.   if (yMag == 1) {
  44.     if (ysize > GUI_Context.ClipRect.y1 - y0 + 1)
  45.       ysize = GUI_Context.ClipRect.y1 - y0 + 1;
  46.   }
  47.   /* Repeat until we have reached bottom */
  48.   for (xi=0, y = 0; y < ysize; ) {
  49.     U8 Cmd,Data;
  50.     Cmd= *pPixel++;
  51.     Data = *pPixel++;
  52.     if (Cmd) {
  53.       LCD_SetColorIndex(pTrans ? *(pTrans+Data) : Data);
  54.       while (Cmd) {
  55.         int xi1 = xi+Cmd;
  56.         if (xi1>=xsize)
  57.           xi1 = xsize;
  58.         Cmd -= (xi1-xi);
  59.         if (Data || NoTrans) {  /* Skip transparent pixels */
  60.           if (IsMagnified) {
  61.             xL = xMag * xi + x0;
  62.             yL = yMag * y + y0;
  63.             LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1);
  64.           } else {
  65.             LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1);
  66.           }
  67.         }
  68.         xi =xi1;
  69.         if (xi1==xsize) {
  70.           y++;
  71.           xi=0;
  72.         }
  73.       }
  74.     } else {
  75.       while (Data--) {
  76.         U8 Index = *pPixel++;
  77.         if ((Index>>4) || NoTrans) {  /* Skip transparent pixels */
  78.           PixelIndex = pTrans ? *(pTrans+(Index>>4)) : (Index>>4);
  79.           if (IsMagnified) {
  80.             LCD_SetColorIndex(PixelIndex);
  81.             xL = xMag * xi + x0;
  82.             yL = yMag * y + y0;
  83.             LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
  84.           } else {
  85.             LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex);
  86.           }
  87.         }
  88.         if (++xi >= xsize) {
  89.           xi=0; y++;
  90.         }
  91.         if (Data-- == 0)
  92.           break;
  93.         if ((Index&15) || NoTrans) {  /* Skip transparent pixels */
  94.           PixelIndex = pTrans ? *(pTrans+(Index&15)) : (Index&15);
  95.           if (IsMagnified) {
  96.             LCD_SetColorIndex(PixelIndex);
  97.             xL = xMag * xi + x0;
  98.             yL = yMag * y + y0;
  99.             LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
  100.           } else {
  101.             LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex);
  102.           }
  103.         }
  104.         if (++xi >= xsize) {
  105.           xi=0; y++;
  106.         }
  107.       }
  108.     }
  109.   }
  110.   LCD_ACOLORINDEX[0] = aColorIndex[0];
  111.   LCD_ACOLORINDEX[1] = aColorIndex[1];
  112. }
  113. #endif