Files
player/Project/Src/MyWin/MyWinCore/mywin_lcd.c

569 lines
15 KiB
C
Raw Normal View History

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++;
}
}
}
}