?? st7529.c
字號:
}
else //正常模式
{
uint16 colour;
uint8 c = LCD_COLORINDEX, i;
if(c == 0)colour = 0; //索引值轉換
else if((c > 0) && (c <= 5))colour = 0x4208;
else if((c > 5) && (c <= 10))colour = 0x8410;
else if((c > 10) && (c < 15))colour = 0xc618;
else colour = 0xffff;
if((remainder_x0 == 0) && (remainder_x1 == 2)) //開始和結束的像素都是3的倍數
{
for(i = x0; i < x1; i+=3)
ScanBuff[y][i/3] = colour;
LCDCOM = ExtIn;
LcdSetWrite( x0, y, x1, y+1);
for(i = x0; i < x1; i+=3)
LCD_WRITE_A0(colour);
}
else if((remainder_x0 != 0) && (remainder_x1 == 2)) //開始的像素不是3的倍數
{
switch(remainder_x0)
{
case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
default:break;
}
for(i = x0 + 3; i <= x1; i+=3)
ScanBuff[y][i/3] = colour;
LCDCOM = ExtIn;
LcdSetWrite( x0, y, x1, y+1);
LCD_WRITE_A0(ScanBuff[y][x0/3]);
for(i = x0 + 3; i <= x1; i+=3)
LCD_WRITE_A0(colour);
}
else if((remainder_x0 == 0) && (remainder_x1 != 2)) //結束的像素不是3的倍數
{
switch(remainder_x1)
{
case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
default:break;
}
for(i = x0; i <= (x1 - 3); i+=3)
ScanBuff[y][i/3] = colour;
LCDCOM = ExtIn;
LcdSetWrite( x0, y, x1, y+1);
for(i = x0; i <= (x1 - 3); i+=3)
LCD_WRITE_A0(colour);
LCD_WRITE_A0(ScanBuff[y][x1/3]);
}
else //開始和結束的像素不都是3的倍數
{
switch(remainder_x0)
{
case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
default:break;
}
switch(remainder_x1)
{
case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
default:break;
}
for(i = x0 + 3; i < x1; i+=3)
ScanBuff[y][i/3] = colour;
LCDCOM = ExtIn;
LcdSetWrite( x0, y, x1, y+1);
LCD_WRITE_A0(ScanBuff[y][x0/3]);
for(i = x0 + 3; i < x1; i+=3)
LCD_WRITE_A0(colour);
LCD_WRITE_A0(ScanBuff[y][x1/3]);
}
}
}
/***************************************************************************************/
void LCD_L0_DrawVLine (int x, int y0, int y1) //上層調用的畫豎線函數
{
uint8 remainder_x = x%3;
uint8 temp, i;
uint16 y = y0;
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR)
{
switch(remainder_x)
{
case 0:while (y <= y1)
{
temp = 0x1f - ((ScanBuff[y][x/3] & 0xf800) >> 11);
ScanBuff[x/3][y] = (ScanBuff[y][x/3] & 0x07ff) | (uint16)(temp << 11);
y++;
}break;
case 1:while (y <= y1)
{
temp = 0x1f - ((ScanBuff[y][x/3] & 0x07c0) >> 6);
ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xf83f) | (uint16)(temp << 6);
y++;
}break;
case 2:while (y <= y1)
{
temp = 0x1f - (ScanBuff[y][x/3] & 0x001f);
ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xffe0) | temp;
y++;
}break;
default:break;
}
LCDCOM = ExtIn;
LcdSetWrite( x, y0, x+3, y1);
for(i = y0 ; i < y1; i++)
{
LCD_WRITE_A0(ScanBuff[i][x/3]);
LCD_WRITE_A0(ScanBuff[i][x/3 + 1]);
}
}
else
{
uint8 c = LCD_COLORINDEX, colour;
if(c == 0)colour = 0; //索引值轉換
else if((c > 0) && (c <= 5))colour = 0x08;
else if((c > 5) && (c <= 10))colour = 0x10;
else if((c > 10) && (c < 15))colour = 0x18;
else colour = 0x1f;
switch(remainder_x)
{
case 0:while (y <= y1)
{
ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0x07ff) | (uint16)(colour << 11);
y++;
}break;
case 1:while (y <= y1)
{
ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xf83f) | (uint16)(colour << 6);
y++;
}break;
case 2:while (y <= y1)
{
ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xffe0) | colour;
y++;
}break;
default:break;
}
LCDCOM = ExtIn;
LcdSetWrite( x, y0, x+3, y1);
for(i = y0 ; i < y1; i++)
{
LCD_WRITE_A0(ScanBuff[i][x/3]);
LCD_WRITE_A0(ScanBuff[i][x/3 + 1]);
}
}
}
/***************************************************************************************/
void LCD_L0_FillRect(int x0, int y0, int x1, int y1) //上層調用的畫矩型函數
{
int y;
uint8 remainder_x0 = x0%3;
uint8 remainder_x1 = x1%3;
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) //反轉模式
{
uint16 temp;
uint8 i, P1, P2;
if((remainder_x0 == 0) && (remainder_x1 == 2)) //開始和結束的像素都是3的倍數
{
for(y=y0; y<= y1;y++)
while (x0 <= x1)
{
ScanBuff[y][x0/3] = Xor_Pixel(ScanBuff[y][x0/3]);
x0+=3;
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(; y0<= y1; y0++)
for(i = x0; i < x1; i+=3)
LCD_WRITE_A0(ScanBuff[y0][i/3]);
}
else if((remainder_x0 != 0) && (remainder_x1 == 2)) //開始的像素不是3的倍數
{
for(y=y0; y<= y1;y++)
{
temp = ScanBuff[y][x0/3];
switch(remainder_x0)
{
case 1:P1 = 0x1f - ((temp & 0x07c0) >> 6);
P2 = 0x1f - (temp & 0x001f);
ScanBuff[y][x0/3] = (temp & 0xf800) | (P1 << 6) | P2;
break;
case 2:P2 = 0x1f - (temp & 0x001f);
ScanBuff[y][x0/3] = (temp & 0xffc0) | P2;
break;
default:break;
}
while ((x0 + 3) <= x1)
{
ScanBuff[y][x0/3 + 1] = Xor_Pixel(ScanBuff[y][x0/3]);
x0+=3;
}
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(; y0<= y1;y0++)
for(i = x0; i < x1; i+=3)
LCD_WRITE_A0(ScanBuff[y0][i/3]);
}
else if((remainder_x0 == 0) && (remainder_x1 != 2)) //結束的像素不是3的倍數
{
for(y = y0; y <= y1;y++)
{
temp = ScanBuff[y][x1/3];
switch(remainder_x1)
{
case 0:P1 = 0x1f - ((temp & 0xf800) >> 11);
ScanBuff[y][x1/3] = (temp &0x07ff) | (P1 << 11);
break;
case 1:P1 = 0x1f - ((temp & 0xf800) >> 11);
P2 = 0x1f - (temp & 0x07c0 >> 6);
ScanBuff[y][x1/3] = (temp & 0x001f) | (P1 << 11) | (P2 << 6);
break;
default:break;
}
while (x0 <= (x1 - 3))
{
ScanBuff[y][x0/3] = Xor_Pixel(ScanBuff[y][x0/3 - 1]);
x0+=3;
}
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(; y0<= y1;y0++)
for(i = x0; i < x1; i+=3)
LCD_WRITE_A0(ScanBuff[y0][i/3]);
}
else //開始和結束的像素不都是3的倍數
{
for(y = y0; y <= y1;y++)
{
temp = ScanBuff[y][x0/3];
switch(remainder_x0)
{
case 1:P1 = 0x1f - ((temp & 0x07c0) >> 6);
P2 = 0x1f - (temp & 0x001f);
ScanBuff[y][x0/3] = (temp & 0xf800) | (P1 << 6) | P2;
break;
case 2:P2 = 0x1f - (temp & 0x001f);
ScanBuff[y][x0/3] = (temp & 0xffc0) | P2;
break;
default:break;
}
temp = ScanBuff[y][x1/3];
switch(remainder_x1)
{
case 0:P1 = 0x1f - ((temp & 0xf800) >> 11);
ScanBuff[y][x1/3] = (temp &0x07ff) | (P1 << 11);
break;
case 1:P1 = 0x1f - ((temp & 0xf800) >> 11);
P2 = 0x1f - (temp & 0x07c0 >> 6);
ScanBuff[y][x1/3] = (temp & 0x001f) | (P1 << 11) | (P2 << 6);
break;
default:break;
}
while ((x0 + 3) <= (x1 - 3))
{
ScanBuff[y][x0/3 + 1] = Xor_Pixel(ScanBuff[y][x0/3 - 1]);
x0+=3;
}
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(; y0<= y1;y0++)
for(i = x0; i < x1; i+=3)
LCD_WRITE_A0(ScanBuff[y0][i/3]);
}
}
else //正常模式
{
uint16 colour;
uint8 c = LCD_COLORINDEX, i;
if(c == 0)colour = 0x0000; //索引值轉換
else if((c > 0) && (c <= 5))colour = 0x4208;
else if((c > 5) && (c <= 10))colour = 0x8410;
else if((c > 10) && (c < 15))colour = 0xc618;
else colour = 0xffff;
if((remainder_x0 == 0) && (remainder_x1 == 2)) //開始和結束的像素都是3的倍數
{
for(y = y0; y <= y1;y++)
for(i = x0; i < x1; i+=3)
ScanBuff[y][i/3] = colour;
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(; y0 <= y1; y0++)
{
for(i = x0; i < x1; i+=3)
LCD_WRITE_A0(colour);
}
}
else if((remainder_x0 != 0) && (remainder_x1 == 2)) //開始的像素不是3的倍數
{
for(y = y0; y <= y1;y++)
{
switch(remainder_x0)
{
case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
default:break;
}
for(i = x0 + 3; i <= x1; i+=3)
ScanBuff[y][i/3] = colour;
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(;y0 <= y1; y0++)
{
LCD_WRITE_A0(ScanBuff[y0][x0/3]);
for(i = x0 + 3; i <= x1; i+=3)
LCD_WRITE_A0(colour);
}
}
else if((remainder_x0 == 0) && (remainder_x1 != 2)) //結束的像素不是3的倍數
{
for(y = y0; y <= y1;y++)
{
switch(remainder_x1)
{
case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
default:break;
}
for(i = x0; i <= (x1 - 3); i+=3)
ScanBuff[y][i/3] = colour;
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(;y0 <= y1; y0++)
{
for(i = x0; i <= (x1 - 3); i+=3)
LCD_WRITE_A0(colour);
LCD_WRITE_A0(ScanBuff[y0][x1/3]);
}
}
else //開始和結束的像素不都是3的倍數
{
for(y = y0; y <= y1;y++)
{
switch(remainder_x0)
{
case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
default:break;
}
switch(remainder_x1)
{
case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
default:break;
}
for(i = x0 + 3; i < x1; i+=3)
ScanBuff[y][i/3] = colour;
}
LCDCOM = ExtIn;
LcdSetWrite( x0, y0, x1, y1);
for(;y0 <= y1; y0++)
{
LCD_WRITE_A0(ScanBuff[y0][x0/3]);
for(i = x0 + 3; i < x1; i+=3)
LCD_WRITE_A0(colour);
LCD_WRITE_A0(ScanBuff[y0][x1/3]);
}
}
}
}
/**********************************************************************************************/
static void DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans)
{
PixelIndex pixels;
PixelIndex Index0 = *(pTrans+0);
PixelIndex Index1 = *(pTrans+1);
pixels = *p;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR))
{
case 0:
switch (Diff&7)
{
case 0:goto WriteBit0;
case 1:goto WriteBit1;
case 2:goto WriteBit2;
case 3:goto WriteBit3;
case 4:goto WriteBit4;
case 5:goto WriteBit5;
case 6:goto WriteBit6;
case 7:goto WriteBit7;
}
break;
case LCD_DRAWMODE_TRANS:
switch (Diff&7)
{
case 0:goto WriteTBit0;
case 1:goto WriteTBit1;
case 2:goto WriteTBit2;
case 3:goto WriteTBit3;
case 4:goto WriteTBit4;
case 5:goto WriteTBit5;
case 6:goto WriteTBit6;
case 7:goto WriteTBit7;
}
break;
case LCD_DRAWMODE_XOR:
switch (Diff&7)
{
case 0:goto WriteXBit0;
case 1:goto WriteXBit1;
case 2:goto WriteXBit2;
case 3:goto WriteXBit3;
case 4:goto WriteXBit4;
case 5:goto WriteXBit5;
case 6:goto WriteXBit6;
case 7:goto WriteXBit7;
}
break;
}
/*
Write with transparency
*/
WriteTBit0:
if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
if (!--xsize)
return;
WriteTBit1:
if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
if (!--xsize)
return;
WriteTBit2:
if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
if (!--xsize)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -