?? lcdrle8.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 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];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -