2025-06-27 00:32:57 +08:00
|
|
|
|
#include "mywin_inc.h"
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
WIN_LcdStruct *WIN_CreatVirtualLcd(int x_size, int y_size) {
|
|
|
|
|
WIN_LcdStruct *ret = mymalloc(sizeof(WIN_LcdStruct));
|
|
|
|
|
mymemset(ret, 0, sizeof(WIN_LcdStruct));
|
|
|
|
|
ret->x_size = x_size;
|
|
|
|
|
ret->y_size = y_size;
|
|
|
|
|
ret->WindowSrcX = 0;
|
|
|
|
|
ret->WindowSrcY = 0;
|
|
|
|
|
ret->WindowDstX = ret->x_size - 1;
|
|
|
|
|
ret->WindowDstY = ret->y_size - 1;
|
|
|
|
|
|
|
|
|
|
ret->ScreenDis = 1;
|
|
|
|
|
ret->BackColor = 0;
|
|
|
|
|
ret->Color = 0xffff;
|
|
|
|
|
ret->DrawMode = 1;
|
|
|
|
|
|
|
|
|
|
ret->DrawAddr = mymalloc(ret->x_size * ret->y_size * 2);
|
|
|
|
|
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
void WIN_DeleteVirtualLcd(WIN_LcdStruct *lcd) {
|
|
|
|
|
if (lcd->DrawAddr)
|
|
|
|
|
myfree(lcd->DrawAddr);
|
|
|
|
|
myfree(lcd);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_LcdSetScreenDis(WIN_LcdStruct *lcd, int d) {
|
|
|
|
|
if (d)
|
|
|
|
|
lcd->ScreenDis = 1;
|
|
|
|
|
else
|
|
|
|
|
lcd->ScreenDis = 0;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>û<C3BB><EEB6AF><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_LcdSetWindow(WIN_LcdStruct *lcd, int x_s, int y_s, int x_size,
|
|
|
|
|
int y_size) {
|
|
|
|
|
int dstx = 0;
|
|
|
|
|
int dsty = 0;
|
|
|
|
|
if (x_size < 1)
|
|
|
|
|
x_size = 1;
|
|
|
|
|
if (y_size < 1)
|
|
|
|
|
y_size = 1;
|
|
|
|
|
if (x_s > lcd->x_size - 1)
|
|
|
|
|
x_s = lcd->x_size - 1;
|
|
|
|
|
else if (x_s < 0)
|
|
|
|
|
x_s = 0;
|
|
|
|
|
if (y_s > lcd->y_size - 1)
|
|
|
|
|
y_s = lcd->y_size - 1;
|
|
|
|
|
else if (y_s < 0)
|
|
|
|
|
y_s = 0;
|
|
|
|
|
dstx = x_s + x_size - 1;
|
|
|
|
|
dsty = y_s + y_size - 1;
|
|
|
|
|
if (dstx > lcd->x_size - 1)
|
|
|
|
|
dstx = lcd->x_size - 1;
|
|
|
|
|
else if (dstx < 0)
|
|
|
|
|
dstx = 0;
|
|
|
|
|
if (dsty > lcd->y_size - 1)
|
|
|
|
|
dsty = lcd->y_size - 1;
|
|
|
|
|
else if (dsty < 0)
|
|
|
|
|
dsty = 0;
|
|
|
|
|
lcd->WindowSrcX = x_s;
|
|
|
|
|
lcd->WindowSrcY = y_s;
|
|
|
|
|
lcd->WindowDstX = dstx;
|
|
|
|
|
lcd->WindowDstY = dsty;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
int WIN_LcdGetWindowSizeX(WIN_LcdStruct *lcd) {
|
|
|
|
|
return lcd->WindowDstX - lcd->WindowSrcX + 1;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
int WIN_LcdGetWindowSizeY(WIN_LcdStruct *lcd) {
|
|
|
|
|
return lcd->WindowDstY - lcd->WindowSrcY + 1;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
int WIN_LcdGetLcdSizeX(WIN_LcdStruct *lcd) { return lcd->x_size; }
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
int WIN_LcdGetLcdSizeY(WIN_LcdStruct *lcd) { return lcd->y_size; }
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdSetLcdColor(WIN_LcdStruct *lcd, u32 color) {
|
|
|
|
|
u32 ret = lcd->Color;
|
|
|
|
|
// g_lcd_struct.Color=color;
|
|
|
|
|
lcd->Color = COLOR888TO565(color);
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdSetLcdBkColor(WIN_LcdStruct *lcd, u32 color) {
|
|
|
|
|
u32 ret = lcd->BackColor;
|
|
|
|
|
// g_lcd_struct.BackColor=color;
|
|
|
|
|
lcd->BackColor = COLOR888TO565(color);
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdSetLcdColor16(WIN_LcdStruct *lcd, u32 color) {
|
|
|
|
|
u32 ret = lcd->Color;
|
|
|
|
|
lcd->Color = (color);
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdSetLcdBkColor16(WIN_LcdStruct *lcd, u32 color) {
|
|
|
|
|
u32 ret = lcd->BackColor;
|
|
|
|
|
lcd->BackColor = (color);
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdGetLcdColor(WIN_LcdStruct *lcd) {
|
|
|
|
|
u32 ret = lcd->Color;
|
|
|
|
|
return COLOR565TO888(ret);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdGetLcdBkColor(WIN_LcdStruct *lcd) {
|
|
|
|
|
u32 ret = lcd->BackColor;
|
|
|
|
|
return COLOR565TO888(ret);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdGetLcdColor16(WIN_LcdStruct *lcd) {
|
|
|
|
|
u32 ret = lcd->Color;
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
u32 WIN_LcdGetLcdBkColor16(WIN_LcdStruct *lcd) {
|
|
|
|
|
u32 ret = lcd->BackColor;
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ģʽ<C4A3><CABD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
|
|
|
|
void WIN_LcdSetLcdDrawMode(WIN_LcdStruct *lcd, int mode) {
|
|
|
|
|
if (mode) {
|
|
|
|
|
lcd->DrawMode = 1; // <20><>ʱ<EFBFBD><CAB1><EFBFBD>û<EFBFBD><C3BB>㺯<EFBFBD><E3BAAF>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>ɫ
|
|
|
|
|
} else {
|
|
|
|
|
lcd->DrawMode = 0;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>,<2C>Դ<EFBFBD><D4B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䵽<EFBFBD><E4B5BD><EFBFBD>ڵ<EFBFBD><DAB5>յ<EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
static void WIN_LcdFillLine16(WIN_LcdStruct *lcd, u16 *buff, int y, int xsize) {
|
|
|
|
|
u16 *addr = lcd->DrawAddr;
|
|
|
|
|
int xsizeMax = lcd->WindowDstX + 1 - lcd->WindowSrcX;
|
|
|
|
|
if (xsize > xsizeMax)
|
|
|
|
|
xsize = xsizeMax;
|
|
|
|
|
if (lcd->ScreenDis) {
|
|
|
|
|
addr = &addr[y * lcd->x_size + lcd->WindowSrcX];
|
|
|
|
|
for (int x = 0; x < xsize; x++) {
|
|
|
|
|
addr[x] = *buff;
|
|
|
|
|
buff++;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
addr = &addr[lcd->x_size * lcd->y_size - 1 -
|
|
|
|
|
(y * lcd->x_size + lcd->WindowSrcX)];
|
|
|
|
|
for (int x = 0; x < xsize; x++) {
|
|
|
|
|
*addr-- = *buff;
|
|
|
|
|
buff++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>䵽<EFBFBD><E4B5BD>Ļ<EFBFBD>Ļ<C4BB><EEB6AF><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>xsize,ͼ<><CDBC><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ysize,ͼ<><CDBC><EFBFBD>ĸ߶<C4B8>
|
|
|
|
|
static void WIN_LcdFillRect16(WIN_LcdStruct *lcd, u16 *buff, int xsize,
|
|
|
|
|
int ysize) {
|
|
|
|
|
int ysizeMax = lcd->WindowDstY + 1 - lcd->WindowSrcY;
|
|
|
|
|
if (ysize > ysizeMax)
|
|
|
|
|
ysize = ysizeMax;
|
|
|
|
|
for (int y = 0; y < ysize; y++) {
|
|
|
|
|
WIN_LcdFillLine16(lcd, buff, y + lcd->WindowSrcY, xsize);
|
|
|
|
|
buff += xsize;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ͼ<EFBFBD><CDBC>ƫ<EFBFBD><C6AB>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>䵽<EFBFBD><E4B5BD>Ļ<EFBFBD>Ļ<C4BB><EEB6AF><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>x_s,ͼ<><CDBC>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>y_s<5F><73>ͼ<EFBFBD><CDBC>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>xsize,ͼ<><CDBC><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ysize,ͼ<><CDBC><EFBFBD>ĸ߶<C4B8>
|
|
|
|
|
static void WIN_LcdFillRectOff16(WIN_LcdStruct *lcd, u16 *buff, int x_s,
|
|
|
|
|
int y_s, int xsize, int ysize) {
|
|
|
|
|
int offset = y_s * xsize + x_s;
|
|
|
|
|
WIN_LcdFillRect16(lcd, buff + offset, xsize, ysize - y_s);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>ڻ<DABB><EEB6AF><EFBFBD>ڵ<EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʾͼƬ
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>s_x,ͼ<><CDBC><EFBFBD>ڻ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>s_y,ͼ<><CDBC><EFBFBD>ڻ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>s_xsize,Ҫ<><D2AA><EFBFBD>ƵIJ<C6B5><C4B2><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>С
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>s_ysize,Ҫ<><D2AA><EFBFBD>ƵIJ<C6B5><C4B2><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>С
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>x_s,ͼ<><CDBC>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>y_s<5F><73>ͼ<EFBFBD><CDBC>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>xsize,ͼ<><CDBC><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ysize,ͼ<><CDBC><EFBFBD>ĸ߶<C4B8>
|
|
|
|
|
void WIN_LcdFillRectOff16At(WIN_LcdStruct *lcd, int s_x, int s_y, int s_xsize,
|
|
|
|
|
int s_ysize, u16 *buff, int x_s, int y_s, int xsize,
|
|
|
|
|
int ysize) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ĵ<EFBFBD><C4B4>ڴ<EFBFBD>С
|
|
|
|
|
int w_x = lcd->WindowSrcX;
|
|
|
|
|
int w_y = lcd->WindowSrcY;
|
|
|
|
|
int w_x_e = lcd->WindowDstX;
|
|
|
|
|
int w_y_e = lcd->WindowDstY;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>µĴ<C2B5><C4B4>ڴ<EFBFBD>С
|
|
|
|
|
lcd->WindowSrcX = w_x + s_x;
|
|
|
|
|
lcd->WindowSrcY = w_y + s_y;
|
|
|
|
|
lcd->WindowDstX = lcd->WindowSrcX + s_xsize - 1;
|
|
|
|
|
lcd->WindowDstY = lcd->WindowSrcY + s_ysize - 1;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>µĻ<C2B5>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>֮<EFBFBD><D6AE>
|
|
|
|
|
if (lcd->WindowDstX > w_x_e)
|
|
|
|
|
lcd->WindowDstX = w_x_e;
|
|
|
|
|
if (lcd->WindowDstY > w_y_e)
|
|
|
|
|
lcd->WindowDstY = w_y_e;
|
|
|
|
|
|
|
|
|
|
// <20><>ͼ
|
|
|
|
|
WIN_LcdFillRectOff16(lcd, buff, x_s + s_x, y_s + s_y, xsize, ysize);
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8><EFBFBD>ǰ<EFBFBD>Ļ<EFBFBD>ͼ<EFBFBD><CDBC>
|
|
|
|
|
lcd->WindowSrcX = w_x;
|
|
|
|
|
lcd->WindowSrcY = w_y;
|
|
|
|
|
lcd->WindowDstX = w_x_e;
|
|
|
|
|
lcd->WindowDstY = w_y_e;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ȫ<EFBFBD><C8AB><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA>㣬<EFBFBD><E3A3AC><EFBFBD>һ<EFBFBD><D2BB>㲻<EFBFBD>ᳬ<EFBFBD><E1B3AC><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>Χ
|
|
|
|
|
void WIN_LcdDrawPointSafe(WIN_LcdStruct *lcd, int x, int y, int mode) {
|
|
|
|
|
x += lcd->WindowSrcX;
|
|
|
|
|
y += lcd->WindowSrcY;
|
|
|
|
|
// <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
|
|
|
|
if (x < lcd->WindowSrcX || x > lcd->WindowDstX)
|
|
|
|
|
return;
|
|
|
|
|
if (y < lcd->WindowSrcY || y > lcd->WindowDstY)
|
|
|
|
|
return;
|
|
|
|
|
u16 *DrawAddr = lcd->DrawAddr;
|
|
|
|
|
if (mode) {
|
|
|
|
|
if (lcd->ScreenDis)
|
|
|
|
|
DrawAddr[(y * lcd->x_size + x)] = lcd->Color;
|
|
|
|
|
else
|
|
|
|
|
DrawAddr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)] =
|
|
|
|
|
lcd->Color;
|
|
|
|
|
} else if (lcd->DrawMode == 0) {
|
|
|
|
|
if (lcd->ScreenDis)
|
|
|
|
|
DrawAddr[(y * lcd->x_size + x)] = lcd->BackColor;
|
|
|
|
|
else
|
|
|
|
|
DrawAddr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)] =
|
|
|
|
|
lcd->BackColor;
|
|
|
|
|
} else // <20><>g_lcd_struct.DrawMode==1ʱ<31><CAB1><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>ɫ
|
|
|
|
|
{
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ȫ<EFBFBD><C8AB><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA>㣬<EFBFBD><E3A3AC><EFBFBD>һ<EFBFBD><D2BB>㲻<EFBFBD>ᳬ<EFBFBD><E1B3AC><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>Χ
|
|
|
|
|
// <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ɫ
|
|
|
|
|
void WIN_LcdDrawPointSafeColor(WIN_LcdStruct *lcd, int x, int y, u16 color) {
|
|
|
|
|
x += lcd->WindowSrcX;
|
|
|
|
|
y += lcd->WindowSrcY;
|
|
|
|
|
// <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
|
|
|
|
if (x < lcd->WindowSrcX || x > lcd->WindowDstX)
|
|
|
|
|
return;
|
|
|
|
|
if (y < lcd->WindowSrcY || y > lcd->WindowDstY)
|
|
|
|
|
return;
|
|
|
|
|
u16 *DrawAddr = lcd->DrawAddr;
|
|
|
|
|
if (1) {
|
|
|
|
|
if (lcd->ScreenDis)
|
|
|
|
|
DrawAddr[(y * lcd->x_size + x)] = color;
|
|
|
|
|
else
|
|
|
|
|
DrawAddr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)] = color;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ALPHA BLENDING<4E>㷨.
|
|
|
|
|
// src:Դ<><D4B4>ɫ
|
|
|
|
|
// dst:Ŀ<><C4BF><EFBFBD><EFBFBD>ɫ
|
|
|
|
|
// alpha:<><CDB8><EFBFBD>̶<EFBFBD>(0~32)
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD>Ϻ<EFBFBD><CFBA><EFBFBD><EFBFBD><EFBFBD>ɫ.
|
|
|
|
|
static u16 alpha_blend565(u16 src, u16 dst, u8 alpha) {
|
|
|
|
|
u32 src2;
|
|
|
|
|
u32 dst2;
|
|
|
|
|
// Convert to 32bit |-----GGGGGG-----RRRRR------BBBBB|
|
|
|
|
|
src2 = ((src << 16) | src) & 0x07E0F81F;
|
|
|
|
|
dst2 = ((dst << 16) | dst) & 0x07E0F81F;
|
|
|
|
|
// Perform blending R:G:B with alpha in range 0..32
|
|
|
|
|
// Note that the reason that alpha may not exceed 32 is that there are only
|
|
|
|
|
// 5bits of space between each R:G:B value, any higher value will overflow
|
|
|
|
|
// into the next component and deliver ugly result.
|
|
|
|
|
dst2 = ((((dst2 - src2) * alpha) >> 5) + src2) & 0x07E0F81F;
|
|
|
|
|
return (dst2 >> 16) | dst2;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ָ<EFBFBD><D6B8>ɫ<C9AB><CDB8><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD>0~32,0,ȫ<C8AB><CDB8><EFBFBD><EFBFBD>31<33><31><EFBFBD><EFBFBD><EFBFBD><CDB8>
|
|
|
|
|
void WIN_LcdDrawPointSafeColorAlpha(WIN_LcdStruct *lcd, int x, int y, u16 color,
|
|
|
|
|
u8 alpha) {
|
|
|
|
|
x += lcd->WindowSrcX;
|
|
|
|
|
y += lcd->WindowSrcY;
|
|
|
|
|
// <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
|
|
|
|
if (x < lcd->WindowSrcX || x > lcd->WindowDstX)
|
|
|
|
|
return;
|
|
|
|
|
if (y < lcd->WindowSrcY || y > lcd->WindowDstY)
|
|
|
|
|
return;
|
|
|
|
|
if (alpha > 31)
|
|
|
|
|
alpha = 31;
|
|
|
|
|
if (alpha == 0)
|
|
|
|
|
return;
|
|
|
|
|
u16 *DrawAddr = lcd->DrawAddr;
|
|
|
|
|
u16 color_old = 0;
|
|
|
|
|
if (1) {
|
|
|
|
|
if (lcd->ScreenDis) {
|
|
|
|
|
color_old = DrawAddr[(y * lcd->x_size + x)];
|
|
|
|
|
color = alpha_blend565(color_old, color, alpha);
|
|
|
|
|
DrawAddr[(y * lcd->x_size + x)] = color;
|
|
|
|
|
} else {
|
|
|
|
|
color_old =
|
|
|
|
|
DrawAddr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)];
|
|
|
|
|
color = alpha_blend565(color_old, color, alpha);
|
|
|
|
|
DrawAddr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)] = color;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD>
|
|
|
|
|
void WIN_LcdFillRectByColor(WIN_LcdStruct *lcd, int x, int y, int x_size,
|
|
|
|
|
int y_size) {
|
|
|
|
|
for (int i = y; i < y + y_size; i++) {
|
|
|
|
|
for (int j = x; j < x + x_size; j++) {
|
|
|
|
|
WIN_LcdDrawPointSafe(lcd, j, i, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD>
|
|
|
|
|
void WIN_LcdFillRectByColorAlpha(WIN_LcdStruct *lcd, int x, int y, int x_size,
|
|
|
|
|
int y_size, u8 alpha) {
|
|
|
|
|
for (int i = y; i < y + y_size; i++) {
|
|
|
|
|
for (int j = x; j < x + x_size; j++) {
|
|
|
|
|
WIN_LcdDrawPointSafeColorAlpha(lcd, j, i, lcd->Color, alpha);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>,ͼ<><CDBC>ʹ<EFBFBD><CAB9>const<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>䱾<EFBFBD><E4B1BE><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD>С<EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>
|
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD>Ч<EFBFBD>ʱȽϵͣ<CFB5>ֻ<EFBFBD><D6BB><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>Сͼ<D0A1>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>ͼƬʹ<C6AC>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>亯<EFBFBD><E4BAAF>
|
|
|
|
|
void WIN_LcdDrawImag(WIN_LcdStruct *lcd, int x, int y, int xsize, int ysize,
|
|
|
|
|
const u8 *buff) {
|
|
|
|
|
|
|
|
|
|
if (buff == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u8 scan = buff[0];
|
|
|
|
|
u8 gray = buff[1];
|
|
|
|
|
u16 w = *((u16 *)&buff[2]);
|
|
|
|
|
u16 h = *((u16 *)&buff[4]);
|
|
|
|
|
u8 is565 = buff[6];
|
|
|
|
|
u8 rgb = buff[7];
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
|
|
|
|
if ((scan != 0x00) || (gray != 0x10) || (w > WIN_IMAGE_MAXSIZE) ||
|
|
|
|
|
(h > WIN_IMAGE_MAXSIZE) || (is565 != 0x01) || (rgb != 0x1b))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u16 *imag = (u16 *)(buff + 8);
|
|
|
|
|
|
|
|
|
|
if (xsize > w)
|
|
|
|
|
xsize = w;
|
|
|
|
|
if (ysize > h)
|
|
|
|
|
ysize = h;
|
|
|
|
|
for (int j = y; j < y + ysize; j++) {
|
|
|
|
|
for (int i = 0; i < xsize; i++) {
|
|
|
|
|
WIN_LcdDrawPointSafe(lcd, i + x, j, imag[i]);
|
|
|
|
|
}
|
|
|
|
|
imag += w;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ
|
|
|
|
|
void WIN_LcdDrawImagButColor(WIN_LcdStruct *lcd, int x, int y, int xsize,
|
|
|
|
|
int ysize, const u8 *buff, u16 color) {
|
|
|
|
|
|
|
|
|
|
if (buff == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u8 scan = buff[0];
|
|
|
|
|
u8 gray = buff[1];
|
|
|
|
|
u16 w = *((u16 *)&buff[2]);
|
|
|
|
|
u16 h = *((u16 *)&buff[4]);
|
|
|
|
|
u8 is565 = buff[6];
|
|
|
|
|
u8 rgb = buff[7];
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
|
|
|
|
if ((scan != 0x00) || (gray != 0x10) || (w > WIN_IMAGE_MAXSIZE) ||
|
|
|
|
|
(h > WIN_IMAGE_MAXSIZE) || (is565 != 0x01) || (rgb != 0x1b))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u16 *imag = (u16 *)(buff + 8);
|
|
|
|
|
|
|
|
|
|
if (xsize > w)
|
|
|
|
|
xsize = w;
|
|
|
|
|
if (ysize > h)
|
|
|
|
|
ysize = h;
|
|
|
|
|
for (int j = y; j < y + ysize; j++) {
|
|
|
|
|
for (int i = 0; i < xsize; i++) {
|
|
|
|
|
if (imag[i] != color)
|
|
|
|
|
WIN_LcdDrawPointSafe(lcd, i + x, j, imag[i]);
|
|
|
|
|
}
|
|
|
|
|
imag += w;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>,<2C><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>Ϊָ<CEAA><D6B8><EFBFBD><EFBFBD>ɫ
|
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD>Ч<EFBFBD>ʱȽϵͣ<CFB5>ֻ<EFBFBD><D6BB><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>Сͼ<D0A1>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>ͼƬʹ<C6AC>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>亯<EFBFBD><E4BAAF>
|
|
|
|
|
void WIN_LcdDrawImagByColor(WIN_LcdStruct *lcd, int x, int y, int xsize,
|
|
|
|
|
int ysize, const u8 *buff, u16 color) {
|
|
|
|
|
|
|
|
|
|
if (buff == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u8 scan = buff[0];
|
|
|
|
|
u8 gray = buff[1];
|
|
|
|
|
u16 w = *((u16 *)&buff[2]);
|
|
|
|
|
u16 h = *((u16 *)&buff[4]);
|
|
|
|
|
u8 is565 = buff[6];
|
|
|
|
|
u8 rgb = buff[7];
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
|
|
|
|
if ((scan != 0x00) || (gray != 0x10) || (w > WIN_IMAGE_MAXSIZE) ||
|
|
|
|
|
(h > WIN_IMAGE_MAXSIZE) || (is565 != 0x01) || (rgb != 0x1b))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u16 *imag = (u16 *)(buff + 8);
|
|
|
|
|
|
|
|
|
|
if (xsize > w)
|
|
|
|
|
xsize = w;
|
|
|
|
|
if (ysize > h)
|
|
|
|
|
ysize = h;
|
|
|
|
|
for (int j = y; j < y + ysize; j++) {
|
|
|
|
|
for (int i = 0; i < xsize; i++) {
|
|
|
|
|
if ((imag[i] != 0x0000) && (imag[i] != 0xffff))
|
|
|
|
|
WIN_LcdDrawPointSafeColor(lcd, i + x, j, color);
|
|
|
|
|
}
|
|
|
|
|
imag += w;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>,<2C><>ԭͼ<D4AD><CDBC>ת<EFBFBD><D7AA>Ϊ<CEAA><CDB8><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20>˺<EFBFBD><CBBA><EFBFBD>Ч<EFBFBD>ʱȽϵͣ<CFB5>ֻ<EFBFBD><D6BB><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>Сͼ<D0A1>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>ͼƬʹ<C6AC>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>亯<EFBFBD><E4BAAF>
|
|
|
|
|
void WIN_LcdDrawImagByAlpha(WIN_LcdStruct *lcd, int x, int y, int xsize,
|
|
|
|
|
int ysize, const u8 *buff, u16 color) {
|
|
|
|
|
|
|
|
|
|
if (buff == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u8 scan = buff[0];
|
|
|
|
|
u8 gray = buff[1];
|
|
|
|
|
u16 w = *((u16 *)&buff[2]);
|
|
|
|
|
u16 h = *((u16 *)&buff[4]);
|
|
|
|
|
u8 is565 = buff[6];
|
|
|
|
|
u8 rgb = buff[7];
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
|
|
|
|
if ((scan != 0x00) || (gray != 0x10) || (w > WIN_IMAGE_MAXSIZE) ||
|
|
|
|
|
(h > WIN_IMAGE_MAXSIZE) || (is565 != 0x01) || (rgb != 0x1b))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
u16 *imag = (u16 *)(buff + 8);
|
|
|
|
|
u8 r, g, b;
|
|
|
|
|
u8 alpha = 0;
|
|
|
|
|
if (xsize > w)
|
|
|
|
|
xsize = w;
|
|
|
|
|
if (ysize > h)
|
|
|
|
|
ysize = h;
|
|
|
|
|
for (int j = y; j < y + ysize; j++) {
|
|
|
|
|
for (int i = 0; i < xsize; i++) {
|
|
|
|
|
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ļ
|
|
|
|
|
// WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
// if (POS_InRect
|
|
|
|
|
//(ewin->Invalid_x,ewin->Invalid_y,ewin->Invalid_x_size,ewin->Invalid_y_size,i+x,j))
|
|
|
|
|
{
|
|
|
|
|
// <20><>ɫȫ<C8AB><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3>ӿ<EFBFBD><D3BF>ٶ<EFBFBD>
|
|
|
|
|
if ((imag[i] != 0x0000) && (imag[i] != 0xffff)) {
|
|
|
|
|
WIN_LcdDrawPointSafeColorAlpha(lcd, i + x, j, color,
|
|
|
|
|
31 - (imag[i] >> 11));
|
|
|
|
|
} else if (imag[i] == 0x0000) {
|
|
|
|
|
// <20><><EFBFBD><CDB8>ֱ<EFBFBD>ӻ<EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
|
|
|
|
WIN_LcdDrawPointSafeColor(lcd, i + x, j, color);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
imag += w;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʾ
|
|
|
|
|
void WIN_LcdClear(WIN_LcdStruct *lcd) {
|
|
|
|
|
u16 *addr = lcd->DrawAddr;
|
|
|
|
|
for (int y = lcd->WindowSrcY; y <= lcd->WindowDstY; y++) {
|
|
|
|
|
if (lcd->ScreenDis) {
|
|
|
|
|
for (int x = lcd->WindowSrcX; x <= lcd->WindowDstX; x++) {
|
|
|
|
|
addr[(y * lcd->x_size + x)] = lcd->BackColor;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (int x = lcd->WindowSrcX; x <= lcd->WindowDstX; x++) {
|
|
|
|
|
addr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)] =
|
|
|
|
|
lcd->BackColor;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʾ
|
|
|
|
|
void WIN_LcdClearRect(WIN_LcdStruct *lcd, int x, int y, int x_size,
|
|
|
|
|
int y_size) {
|
|
|
|
|
u16 *addr = lcd->DrawAddr;
|
|
|
|
|
x = x + lcd->WindowSrcX;
|
|
|
|
|
y = y + lcd->WindowSrcY;
|
|
|
|
|
int x_e = x + x_size - 1;
|
|
|
|
|
if (x_e > lcd->WindowDstX)
|
|
|
|
|
x_e = lcd->WindowDstX;
|
|
|
|
|
int y_e = y + y_size - 1;
|
|
|
|
|
if (y_e > lcd->WindowDstY)
|
|
|
|
|
y_e = lcd->WindowDstY;
|
|
|
|
|
int temp = x;
|
|
|
|
|
for (; y <= y_e; y++) {
|
|
|
|
|
if (lcd->ScreenDis) {
|
|
|
|
|
for (x = temp; x <= x_e; x++) {
|
|
|
|
|
addr[(y * lcd->x_size + x)] = lcd->BackColor;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (x = temp; x <= x_e; x++) {
|
|
|
|
|
addr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)] =
|
|
|
|
|
lcd->BackColor;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>οռ<CEBF><D5BC><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>Ļ<EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_LcdGetColors(WIN_LcdStruct *lcd, u16 *buff, int x_s, int y_s,
|
|
|
|
|
int x_size, int y_size) {
|
|
|
|
|
u16 *addr = lcd->DrawAddr;
|
|
|
|
|
if (x_s < 0)
|
|
|
|
|
x_s = 0;
|
|
|
|
|
else if (x_s > lcd->x_size - 1)
|
|
|
|
|
x_s = lcd->x_size - 1;
|
|
|
|
|
if (y_s < 0)
|
|
|
|
|
y_s = 0;
|
|
|
|
|
else if (y_s > lcd->y_size - 1)
|
|
|
|
|
y_s = lcd->y_size - 1;
|
|
|
|
|
if (x_size > lcd->x_size - x_s)
|
|
|
|
|
x_size = lcd->x_size - x_s;
|
|
|
|
|
else if (x_size < 0)
|
|
|
|
|
x_size = 0;
|
|
|
|
|
if (y_size > lcd->y_size - y_s)
|
|
|
|
|
y_size = lcd->y_size - y_s;
|
|
|
|
|
else if (y_size < 0)
|
|
|
|
|
y_size = 0;
|
|
|
|
|
for (int y = y_s; y < y_size + y_s; y++) {
|
|
|
|
|
if (lcd->ScreenDis) {
|
|
|
|
|
for (int x = x_s; x < x_size + x_s; x++) {
|
|
|
|
|
u32 temp = addr[(y * lcd->x_size + x)];
|
|
|
|
|
*buff = temp;
|
|
|
|
|
buff++;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (int x = x_s; x < x_size + x_s; x++) {
|
|
|
|
|
u32 temp = addr[lcd->x_size * lcd->y_size - 1 - (y * lcd->x_size + x)];
|
|
|
|
|
*buff = temp;
|
|
|
|
|
buff++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|