📄 lcdrle4.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 : LCDRLE4.cPurpose : Drawing routines for run length encoded bitmaps with 4bpp---------------------------END-OF-HEADER------------------------------*/#include <stddef.h> /* needed for definition of NULL */#include "LCD.H"#include "GUI_Private.h"#ifndef __C51__ /* Avoid Keil C51 limitation */void LCD_DrawBitmap_RLE4(int x0,int y0,int xsize, int ysize, const U8*pPixel, const LCD_LOGPALETTE* pLogPal, int xMag, int yMag) { const LCD_PIXELINDEX* pTrans =NULL; char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS); LCD_PIXELINDEX aColorIndex[2]; LCD_PIXELINDEX PixelIndex; int xi,y; int xL, yL; 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; } /* Repeat until we have reached bottom */ for (xi=0, y = 0; y < ysize; ) { U8 Cmd,Data; Cmd= *pPixel++; Data = *pPixel++; if (Cmd) { LCD_SetColorIndex(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 { while (Data--) { U8 Index = *pPixel++; if ((Index>>4) || NoTrans) { /* Skip transparent pixels */ PixelIndex = pTrans ? *(pTrans+(Index>>4)) : (Index>>4); if (IsMagnified) { LCD_SetColorIndex(PixelIndex); xL = xMag * xi + x0; yL = yMag * y + y0; LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1); } else { LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex); } } if (++xi >= xsize) { xi=0; y++; } if (Data-- == 0) break; if ((Index&15) || NoTrans) { /* Skip transparent pixels */ PixelIndex = pTrans ? *(pTrans+(Index&15)) : (Index&15); if (IsMagnified) { LCD_SetColorIndex(PixelIndex); xL = xMag * xi + x0; yL = yMag * y + y0; LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1); } else { LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex); } } if (++xi >= xsize) { xi=0; y++; } } } } LCD_ACOLORINDEX[0] = aColorIndex[0]; LCD_ACOLORINDEX[1] = aColorIndex[1];}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -