?? lcdlin32.c
字號:
AndMask = ~(0xFFFFFFFF << NumPixel_0);
if ((32 - NumPixel_0) > xsize) {
AndMask |= ~(0xFFFFFFFF >> (31 - NumPixel_1));
}
for (i = NumPixel_0; (i < 32) && xsize; i++, xsize--) {
U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
if (++Diff == 8) {
Diff = 0;
p++;
}
ColorMask |= Index << i;
}
Data = READ_MEM(Off);
Data &= AndMask;
Data |= ColorMask;
WRITE_MEM(Off, Data);
Off++;
}
/* Complete DWORDS */
while (xsize >= 32) {
ColorMask = 0;
for (i = 0; i < 32; i++) {
U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
if (++Diff == 8) {
Diff = 0;
p++;
}
ColorMask |= Index << i;
}
WRITE_MEM(Off, ColorMask);
Off++;
xsize -= 32;
}
/* Last DWORD */
if (xsize) {
ColorMask = i = 0;
AndMask = 0xFFFFFFFE << NumPixel_1;
while (xsize) {
U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
if (++Diff == 8) {
Diff = 0;
p++;
}
ColorMask |= Index << i++;
xsize--;
}
Data = READ_MEM(Off);
Data &= AndMask;
Data |= ColorMask;
WRITE_MEM(Off, Data);
}
}
} else {
switch (Mode) {
case LCD_DRAWMODE_TRANS:
do {
if (*p & (0x80 >> Diff)) {
LCD_L0_SetPixelIndex(x, y, Index1);
}
x++;
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
case LCD_DRAWMODE_XOR | LCD_DRAWMODE_TRANS:
case LCD_DRAWMODE_XOR:
do {
if (*p & (0x80 >> Diff)) {
int Pixel = LCD_L0_GetPixelIndex(x, y);
LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
}
x++;
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
}
}
}
/*********************************************************************
*
* Draw Bitmap 1 BPP, not optimized
*/
#else
#if LCD_ALLOW_NON_OPTIMIZED_MODE == 0
#error Non-optimized mode. Please select an other mode, define LCD_ALLOW_NON_OPTIMIZED_MODE in LCDCOnf.h or contact info@micrium.com.
#endif
static void _DrawBitLine1BPP(unsigned x, unsigned y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Index0, Index1;
#if (GUI_USE_MEMDEV_1BPP_FOR_SCREEN == 1)
const LCD_PIXELINDEX aTrans[2] = {0, 1};
if (!pTrans) {
pTrans = aTrans;
}
#endif
Index0 = *(pTrans + 0);
Index1 = *(pTrans + 1);
x += Diff;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
do {
LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0);
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
case LCD_DRAWMODE_TRANS:
do {
if (*p & (0x80 >> Diff))
LCD_L0_SetPixelIndex(x, y, Index1);
x++;
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
case LCD_DRAWMODE_XOR | LCD_DRAWMODE_TRANS:
case LCD_DRAWMODE_XOR:
do {
if (*p & (0x80 >> Diff)) {
int Pixel = LCD_L0_GetPixelIndex(x, y);
LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
}
x++;
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
}
}
#endif
/*********************************************************************
*
* Draw Bitmap 2 BPP
*/
#if (LCD_MAX_LOG_COLORS > 2)
static void _DrawBitLine2BPP(int x, int y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Pixels = *p;
int CurrentPixel = Diff;
x += Diff;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
if (pTrans) {
do {
int Shift = (3 - CurrentPixel) << 1;
int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x++, y, PixelIndex);
if (++CurrentPixel == 4) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
} else {
do {
int Shift = (3 - CurrentPixel) << 1;
int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
LCD_L0_SetPixelIndex(x++, y, Index);
if (++CurrentPixel == 4) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
}
break;
case LCD_DRAWMODE_TRANS:
if (pTrans) {
do {
int Shift = (3 - CurrentPixel) << 1;
int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
if (Index) {
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x, y, PixelIndex);
}
x++;
if (++CurrentPixel == 4) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
} else {
do {
int Shift = (3 - CurrentPixel) << 1;
int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
if (Index) {
LCD_L0_SetPixelIndex(x, y, Index);
}
x++;
if (++CurrentPixel == 4) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
}
break;
}
}
#endif
/*********************************************************************
*
* Draw Bitmap 4 BPP, optimized for LCD_ENDIAN_BIG == 0, LCD_BITSPERPIXEL == 4
*/
#if (LCD_MAX_LOG_COLORS > 4)
#if (LCD_ENDIAN_BIG == 0) && \
(LCD_BITSPERPIXEL == 4) && \
(!LCD_MIRROR_X) && \
(!LCD_MIRROR_Y) && \
(!LCD_SWAP_XY)
static void _DrawBitLine4BPP(int x, int y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Pixels = *p;
int CurrentPixel = Diff;
x += Diff;
if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) {
int Off, NumPixel_0, NumPixel_1, i;
U32 Data, ColorMask, AndMask;
Off = y * DWORDS_PER_LINE + x / PIXELS_PER_DWORD;
NumPixel_0 = x & (PIXELS_PER_DWORD - 1);
NumPixel_1 = (x + xsize - 1) & (PIXELS_PER_DWORD - 1);
if (pTrans) {
/* First DWORD */
if (NumPixel_0) {
ColorMask = 0;
AndMask = ~(0xFFFFFFFF << (4 * NumPixel_0));
if ((8 - NumPixel_0) > xsize) {
AndMask |= ~(0xFFFFFFFF >> (4 * (7 - NumPixel_1)));
}
for (i = NumPixel_0; (i < 8) && xsize; i++, xsize--) {
int Shift = 4 * (1 - CurrentPixel);
U8 Pixel = (*p & (0xF << Shift)) >> Shift;
U8 Index = *(pTrans + Pixel);
ColorMask |= Index << (4 * i);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
p++;
}
}
Data = READ_MEM(Off);
Data &= AndMask;
Data |= ColorMask;
WRITE_MEM(Off, Data);
Off++;
}
/* Complete DWORDS */
while (xsize >= 8) {
ColorMask = 0;
for (i = 0; i < 8; i++) {
int Shift = 4 * (1 - CurrentPixel);
U8 Pixel = (*p & (0xF << Shift)) >> Shift;
U8 Index = *(pTrans + Pixel);
ColorMask |= Index << (4 * i);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
p++;
}
}
WRITE_MEM(Off, ColorMask);
Off++;
xsize -= 8;
}
/* Last DWORD */
if (xsize) {
ColorMask = i = 0;
AndMask = 0xFFFFFFF0 << (4 * NumPixel_1);
while (xsize) {
int Shift = 4 * (1 - CurrentPixel);
U8 Pixel = (*p & (0xF << Shift)) >> Shift;
U8 Index = *(pTrans + Pixel);
ColorMask |= Index << (4 * i++);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
p++;
}
xsize--;
}
Data = READ_MEM(Off);
Data &= AndMask;
Data |= ColorMask;
WRITE_MEM(Off, Data);
}
} else {
/* First DWORD */
if (NumPixel_0) {
ColorMask = 0;
AndMask = ~(0xFFFFFFFF << (4 * NumPixel_0));
if ((8 - NumPixel_0) > xsize) {
AndMask |= ~(0xFFFFFFFF >> (4 * (7 - NumPixel_1)));
}
for (i = NumPixel_0; (i < 8) && xsize; i++, xsize--) {
int Shift = 4 * (1 - CurrentPixel);
U8 Index = (*p & (0xF << Shift)) >> Shift;
ColorMask |= Index << (4 * i);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
p++;
}
}
Data = READ_MEM(Off);
Data &= AndMask;
Data |= ColorMask;
WRITE_MEM(Off, Data);
Off++;
}
/* Complete DWORDS */
while (xsize >= 8) {
ColorMask = 0;
for (i = 0; i < 8; i++) {
int Shift = 4 * (1 - CurrentPixel);
U8 Index = (*p & (0xF << Shift)) >> Shift;
ColorMask |= Index << (4 * i);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
p++;
}
}
WRITE_MEM(Off, ColorMask);
Off++;
xsize -= 8;
}
/* Last DWORD */
if (xsize) {
ColorMask = i = 0;
AndMask = 0xFFFFFFF0 << (4 * NumPixel_1);
while (xsize) {
int Shift = 4 * (1 - CurrentPixel);
U8 Index = (*p & (0xF << Shift)) >> Shift;
ColorMask |= Index << (4 * i++);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
p++;
}
xsize--;
}
Data = READ_MEM(Off);
Data &= AndMask;
Data |= ColorMask;
WRITE_MEM(Off, Data);
}
}
} else {
if (pTrans) {
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
if (Index) {
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x, y, PixelIndex);
}
x++;
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
} else {
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
if (Index) {
LCD_L0_SetPixelIndex(x, y, Index);
}
x++;
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
}
}
}
/*********************************************************************
*
* Draw Bitmap 4 BPP, not optimized
*/
#else
static void _DrawBitLine4BPP(int x, int y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Pixels = *p;
int CurrentPixel = Diff;
x += Diff;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
if (pTrans) {
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x++, y, PixelIndex);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
} else {
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
LCD_L0_SetPixelIndex(x++, y, Index);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
}
break;
case LCD_DRAWMODE_TRANS:
if (pTrans) {
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
if (Index) {
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x, y, PixelIndex);
}
x++;
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -