📄 gdi.c
字号:
//
//
//
#include "type.h"
#include "common.h"
#include "lcd.h"
#include "gdi.h"
//function prototype
//
//graphic
//
void ClearScrn(void)
{
S_BYTE x, y;
for (x = 0; x < 16; x++)
for (y = 0; y < 32; y++)
LcdWriteDRAM(x, y, 0x0000);
}
void FillArea(S_BYTE left, S_BYTE up, S_BYTE right, S_BYTE bottom, S_BYTE c)
{
S_WORD color;
if (left >= LCDWIDTH || right >= LCDWIDTH || up >= LCDHEIGHT || bottom >= LCDHEIGHT)
return;
if (up > bottom)
{
color = (S_WORD)up; up = bottom; bottom = (S_BYTE)color;
}
if (left > right)
{
color = (S_WORD)left; left = right; right = (S_BYTE)color;
}
color = c? 0xFFFF:0x0000;
if (up == 0 && left == 0 && right == LCDWIDTH-1 && bottom == LCDHEIGHT-1)
{
for (up = 0; up < 16; up++)
for (left = 0; left < 32; left++)
LcdWriteDRAM(up, left, color);
}
else
{
while (up <= bottom)
DrawHLine(left, right, up++, c);
}
}
void ClearArea(S_BYTE left, S_BYTE up, S_BYTE right, S_BYTE bottom)
{
FillArea(left, up, right, bottom, 0);
}
void DrawPixel(S_BYTE x, S_BYTE y, S_BYTE c)
{
S_BYTE tx;
S_WORD Data, color = 0x0001;
if (x >= LCDWIDTH || y >= LCDHEIGHT)
return;
tx = x >> 4;//x/16;
if (y >= (LCDHEIGHT>>1))
{
tx += 8;
y -= (LCDHEIGHT>>1);
}
Data = LcdReadDRAM(tx, y);
color <<= 15-(x&0x0F);
if (c)
Data |= color;
else
Data &= ~color;
LcdWriteDRAM(tx, y, Data);
}
void DrawHLine(S_BYTE sx, S_BYTE ex, S_BYTE y, S_BYTE c)
{
S_BYTE x1, x2;
S_WORD RamData, mask = 0xFFFF;
if (y >= LCDHEIGHT || sx >= LCDWIDTH || ex >= LCDWIDTH)
return;
if (sx > ex)
x1 = sx, sx = ex, ex = x1;
if (sx == 0 && ex == LCDWIDTH-1)
{
mask = c? 0xFFFF:0x0000;
if (y >= LCDHEIGHT>>1)
{
y -= LCDHEIGHT>>1;
sx = 8, ex = 15;
}
else
sx = 0, ex = 7;
while (sx <= ex)
LcdWriteDRAM(sx++, y, mask);
}
else
{
x1 = sx&0xF, x2 = ex&0xF;
x2 = 15 - x2;
sx = sx>>4, ex = ex>>4;
if (y >= LCDHEIGHT>>1)
{
y -= LCDHEIGHT>>1;
sx += 8, ex += 8;
}
if (sx == ex)
{
mask <<= x1, mask >>= x1;
mask >>= x2, mask <<= x2;
RamData = LcdReadDRAM(sx, y);
if (c) RamData |= mask;
else RamData &= ~mask;
LcdWriteDRAM(sx, y, RamData);
}
else
{
mask <<= x1, mask >>= x1;
RamData = LcdReadDRAM(sx, y);
if (c) RamData |= mask;
else RamData &= ~mask;
LcdWriteDRAM(sx, y, RamData);
while (++sx < ex)
{
if (c) LcdWriteDRAM(sx, y, 0xFFFF);
else LcdWriteDRAM(sx, y, 0x0000);
}
mask = 0xFFFF;
mask >>= x2, mask <<= x2;
RamData = LcdReadDRAM(sx, y);
if (c) RamData |= mask;
else RamData &= ~mask;
LcdWriteDRAM(sx, y, RamData);
}
}
}
void DrawVLine(S_BYTE x, S_BYTE sy, S_BYTE ey, S_BYTE c)
{
S_BYTE m;
if (x >= LCDWIDTH || sy >= LCDHEIGHT || ey >= LCDHEIGHT)
return;
if (sy > ey)
{
m = sy; sy = ey; ey = m;
}
while (sy <= ey)
DrawPixel(x, sy++, c);
}
void DrawRect(S_BYTE up, S_BYTE left, S_BYTE right, S_BYTE bottom, S_BYTE c)
{
DrawHLine(left, right, up, c);
DrawHLine(left, right, bottom, c);
DrawVLine(left, up, bottom, c);
DrawVLine(right, up, bottom, c);
}
static void ReverseHLine(S_BYTE sx, S_BYTE ex, S_BYTE y)
{
S_BYTE x1, x2;
S_WORD RamData, color, mask = 0xFFFF;
if (sx == 0 && ex == LCDWIDTH-1)
{
if (y >= LCDHEIGHT>>1)
{
y -= LCDHEIGHT>>1;
sx = 8, ex = 15;
}
else
sx = 0, ex = 7;
while (sx <= ex)
{
RamData = LcdReadDRAM(sx, y);
RamData = ~RamData;
LcdWriteDRAM(sx++, y, RamData);
}
}
else
{
x1 = sx&0xF, x2 = ex&0xF;
x2 = 15 - x2;
sx = sx>>4, ex = ex>>4;
if (y >= LCDHEIGHT>>1)
{
y -= LCDHEIGHT>>1;
sx += 8, ex += 8;
}
if (sx == ex)
{
mask <<= x1, mask >>= x1;
mask >>= x2, mask <<= x2;
RamData = LcdReadDRAM(sx, y);
color = RamData;
RamData &= ~mask;
color &= mask;
color = ~color;
color &= mask;
RamData |= color;
LcdWriteDRAM(sx, y, RamData);
}
else
{
mask <<= x1, mask >>= x1;
RamData = LcdReadDRAM(sx, y);
color = RamData;
RamData &= ~mask;
color &= mask;
color = ~color;
color &= mask;
RamData |= color;
LcdWriteDRAM(sx, y, RamData);
while (++sx < ex)
{
RamData = LcdReadDRAM(sx, y);
RamData = ~RamData;
LcdWriteDRAM(sx, y, RamData);
}
mask = 0xFFFF;
mask >>= x2, mask <<= x2;
RamData = LcdReadDRAM(sx, y);
color = RamData;
RamData &= ~mask;
color &= mask;
color = ~color;
color &= mask;
RamData |= color;
LcdWriteDRAM(sx, y, RamData);
}
}
}
void ReverseArea(S_BYTE left, S_BYTE up, S_BYTE right, S_BYTE bottom)
{
S_BYTE m;
if (left >= LCDWIDTH || right >= LCDWIDTH || up >= LCDHEIGHT || bottom >= LCDHEIGHT)
return;
if (up > bottom)
{
m = up; up = bottom; bottom = m;
}
if (left > right)
{
m = left; left = right; right = m;
}
while (up <= bottom)
ReverseHLine(left, right, up++);
}
//text
//
S_BYTE code asc6x12[][9] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x20,0x82,0x08,0x00,0x80,0x00,
0x00,0xa5,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x8a,0xfc,0xa5,0x3f,0x51,0x40,0x00,
0x00,0x87,0xaa,0xa1,0x83,0x0a,0xab,0xc2,0x00,0x00,0x04,0xaa,0xb1,0x42,0x8d,0x55,0x20,0x00,
0x00,0x02,0x14,0x51,0xea,0xaa,0x91,0xb0,0x00,0x01,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x84,0x10,0x41,0x04,0x10,0x20,0x40,0x01,0x02,0x04,0x10,0x41,0x04,0x10,0x84,0x00,
0x00,0x00,0x08,0xa9,0xc7,0x2a,0x20,0x00,0x00,0x00,0x02,0x08,0x23,0xe2,0x08,0x20,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x20,0x00,0x00,0x00,0x03,0xe0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x21,0x04,0x10,0x82,0x10,0x41,0x08,0x00,
0x00,0x07,0x22,0x8a,0x28,0xa2,0x89,0xc0,0x00,0x00,0x02,0x18,0x20,0x82,0x08,0x21,0xc0,0x00,
0x00,0x07,0x22,0x88,0x42,0x10,0x83,0xe0,0x00,0x00,0x07,0x22,0x08,0xc0,0x82,0x89,0xc0,0x00,
0x00,0x01,0x0c,0x51,0x49,0x1e,0x10,0x60,0x00,0x00,0x0f,0xa0,0x83,0xc0,0x82,0x89,0xc0,0x00,
0x00,0x07,0x24,0x83,0xc8,0xa2,0x89,0xc0,0x00,0x00,0x0f,0xa4,0x10,0x82,0x08,0x20,0x80,0x00,
0x00,0x07,0x22,0x89,0xc8,0xa2,0x89,0xc0,0x00,0x00,0x07,0x22,0x8a,0x27,0x82,0x49,0xc0,0x00,
0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x82,0x00,
0x00,0x10,0x84,0x21,0x02,0x04,0x08,0x10,0x00,0x00,0x00,0x00,0xf8,0x00,0x3e,0x00,0x00,0x00,
0x01,0x02,0x04,0x08,0x10,0x84,0x21,0x00,0x00,0x00,0x07,0x22,0x88,0x42,0x08,0x00,0x80,0x00,
0x00,0x07,0x22,0x9a,0xaa,0xae,0x81,0xe0,0x00,0x00,0x02,0x08,0x31,0x45,0x1e,0x4b,0x30,0x00,
0x00,0x0f,0x12,0x49,0xc4,0x92,0x4b,0xc0,0x00,0x00,0x07,0xa2,0x82,0x08,0x20,0x89,0xc0,0x00,
0x00,0x0f,0x12,0x49,0x24,0x92,0x4b,0xc0,0x00,0x00,0x0f,0x92,0x51,0xc5,0x10,0x4b,0xe0,0x00,
0x00,0x0f,0x92,0x51,0xc5,0x10,0x43,0x80,0x00,0x00,0x03,0x92,0x82,0x09,0xe2,0x48,0xc0,0x00,
0x00,0x0c,0xd2,0x49,0xe4,0x92,0x4b,0x30,0x00,0x00,0x0f,0x88,0x20,0x82,0x08,0x23,0xe0,0x00,
0x00,0x07,0xc4,0x10,0x41,0x04,0x12,0x4e,0x00,0x00,0x0e,0xd2,0x51,0x85,0x14,0x4b,0xb0,0x00,
0x00,0x0e,0x10,0x41,0x04,0x10,0x47,0xf0,0x00,0x00,0x0d,0xb6,0xdb,0x6a,0xaa,0xaa,0xa0,0x00,
0x00,0x0d,0xd2,0x69,0xa5,0x96,0x4b,0xa0,0x00,0x00,0x07,0x22,0x8a,0x28,0xa2,0x89,0xc0,0x00,
0x00,0x0f,0x12,0x49,0xc4,0x10,0x43,0x80,0x00,0x00,0x07,0x22,0x8a,0x28,0xba,0x99,0xc1,0x80,
0x00,0x0f,0x12,0x49,0xc5,0x12,0x4b,0xb0,0x00,0x00,0x07,0xa2,0x81,0x81,0x02,0x8b,0xc0,0x00,
0x00,0x0f,0xaa,0x20,0x82,0x08,0x21,0xc0,0x00,0x00,0x0c,0xd2,0x49,0x24,0x92,0x48,0xc0,0x00,
0x00,0x0c,0xd2,0x49,0x45,0x0c,0x20,0x80,0x00,0x00,0x0a,0xaa,0xa9,0xc5,0x14,0x51,0x40,0x00,
0x00,0x0d,0x94,0x50,0x82,0x14,0x53,0x60,0x00,0x00,0x0d,0x94,0x50,0x82,0x08,0x21,0xc0,0x00,
0x00,0x0f,0xa4,0x10,0x82,0x10,0x4b,0xe0,0x00,0x00,0xe2,0x08,0x20,0x82,0x08,0x20,0x83,0x80,
0x01,0x04,0x10,0x20,0x81,0x04,0x10,0x20,0x00,0x01,0xc1,0x04,0x10,0x41,0x04,0x10,0x47,0x00,
0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,
0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x8e,0x48,0xf0,0x00,
0x00,0x0c,0x10,0x41,0xc4,0x92,0x49,0xc0,0x00,0x00,0x00,0x00,0x00,0xe4,0x90,0x40,0xe0,0x00,
0x00,0x01,0x82,0x08,0xe4,0x92,0x48,0xf0,0x00,0x00,0x00,0x00,0x00,0xc4,0x9e,0x40,0xe0,0x00,
0x00,0x01,0xc8,0x21,0xe2,0x08,0x21,0xe0,0x00,0x00,0x00,0x00,0x00,0xf4,0x8c,0x41,0xe4,0x4e,
0x00,0x0c,0x10,0x41,0xc4,0x92,0x4b,0xb0,0x00,0x00,0x02,0x00,0x01,0x82,0x08,0x21,0xc0,0x00,
0x00,0x01,0x00,0x00,0xc1,0x04,0x10,0x41,0x38,0x00,0x0c,0x10,0x41,0x75,0x1c,0x4b,0xb0,0x00,
0x00,0x0e,0x08,0x20,0x82,0x08,0x23,0xe0,0x00,0x00,0x00,0x00,0x03,0xca,0xaa,0xaa,0xa0,0x00,
0x00,0x00,0x00,0x03,0xc4,0x92,0x4b,0xb0,0x00,0x00,0x00,0x00,0x00,0xc4,0x92,0x48,0xc0,0x00,
0x00,0x00,0x00,0x03,0xc4,0x92,0x49,0xc4,0x38,0x00,0x00,0x00,0x00,0xe4,0x92,0x48,0xe0,0x87,
0x00,0x00,0x00,0x03,0x66,0x10,0x43,0x80,0x00,0x00,0x00,0x00,0x01,0xe4,0x0c,0x09,0xe0,0x00,
0x00,0x00,0x08,0x21,0xc2,0x08,0x20,0x60,0x00,0x00,0x00,0x00,0x03,0x64,0x92,0x48,0xf0,0x00,
0x00,0x00,0x00,0x03,0xb4,0x94,0x30,0x80,0x00,0x00,0x00,0x00,0x02,0xaa,0x9c,0x51,0x40,0x00,
0x00,0x00,0x00,0x03,0x65,0x08,0x53,0x60,0x00,0x00,0x00,0x00,0x03,0xb4,0x94,0x30,0x82,0x30,
0x00,0x00,0x00,0x01,0xe1,0x08,0x21,0xe0,0x00,0x00,0x61,0x04,0x10,0x81,0x04,0x10,0x41,0x80,
0x10,0x41,0x04,0x10,0x41,0x04,0x10,0x41,0x04,0x01,0x82,0x08,0x20,0x42,0x08,0x20,0x86,0x00,
0x42,0x91,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//DC
bit TextColor = COLOR_BLACK;
bit BKcolor = COLOR_WHITE;
bit TextMode = TM_TRANSPARENT;
bit GetTextMode(void)
{
return TextMode;
}
bit SetTextMode(bit textmode)
{
bit bk = TextMode;
TextMode = textmode;
return bk;
}
bit GetTextColor(void)
{
return TextColor;
}
bit SetTextColor(bit textcolor)
{
bit bk = TextColor;
TextColor = textcolor;
return bk;
}
bit GetBackgroundColor(void)
{
return BKcolor;
}
bit SetBackgroundColor(bit bkcolor)
{
bit bk = BKcolor;
BKcolor = bkcolor;
return bk;
}
S_BYTE code MatMask[] =
{
0x80, 0x40, 0x20, 0x10, 0x08, 0x04
};
void DrawChar(S_BYTE x, S_BYTE y, S_BYTE ch)
{
S_BYTE i, j;
S_BYTE code * pMat;
S_BYTE Mat;
if (ch < 32 || ch > 127)
ch = '?';
pMat = asc6x12[ch-32];
for (j = 0; j < FONT_HEIGHT; j++)
{
switch (j)
{
case 0:
case 4:
case 8:
Mat = *pMat++;
break;
case 1:
case 5:
case 9:
Mat <<= 6;
Mat |= (*pMat>>2);
break;
case 2:
case 6:
case 10:
Mat = *pMat++<<4;
Mat |= *pMat>>4;
break;
case 3:
case 7:
case 11:
Mat = *pMat++<<2;
break;
default:
break;
}
for (i = 0; i < (FONT_WIDTH>>1); i++)
{
if (Mat&MatMask[i])
DrawPixel(x+i, y+j, TextColor);
else if (TextMode == TM_OPAQUE)
DrawPixel(x+i, y+j, BKcolor);
}
}
}
void DrawFont(S_BYTE x, S_BYTE y, S_WORD font)
{//unsupport font now
font = font;
DrawChar(x, y, '?');
DrawChar(x+(FONT_WIDTH>>1), y, '?');
}
void DrawText(S_BYTE x, S_BYTE y, S_BYTE *text)
{
S_BYTE X;
S_BYTE c0, c1;
if(!text)
return;
for (X=x; *text; text++)
{
c0 = *text;
if (c0 == '\n')
{
y += FONT_HEIGHT;
X = x;
}
else if(c0 & 0x80)
{
c1 = text[1] ;
if(!c1) break;
DrawFont(X, y, (c0<<8)|c1 );
X += FONT_WIDTH;
text++;
}
else
{
DrawChar(X, y, c0);
X += FONT_WIDTH>>1;
}
}
}
void DrawNum(S_BYTE x, S_BYTE y, S_WORD num)
{
S_BYTE idata str[6];
Word2Str(str, num);
DrawText(x, y, str);
}
//bitmap
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -