569 lines
15 KiB
C
569 lines
15 KiB
C
#include "mywin_inc.h"
|
||
|
||
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;
|
||
}
|
||
|
||
void WIN_DeleteVirtualLcd(WIN_LcdStruct *lcd) {
|
||
if (lcd->DrawAddr)
|
||
myfree(lcd->DrawAddr);
|
||
myfree(lcd);
|
||
}
|
||
|
||
// 设置屏幕显示方向
|
||
void WIN_LcdSetScreenDis(WIN_LcdStruct *lcd, int d) {
|
||
if (d)
|
||
lcd->ScreenDis = 1;
|
||
else
|
||
lcd->ScreenDis = 0;
|
||
}
|
||
|
||
// 设置活动窗口
|
||
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;
|
||
}
|
||
|
||
int WIN_LcdGetWindowSizeX(WIN_LcdStruct *lcd) {
|
||
return lcd->WindowDstX - lcd->WindowSrcX + 1;
|
||
}
|
||
|
||
int WIN_LcdGetWindowSizeY(WIN_LcdStruct *lcd) {
|
||
return lcd->WindowDstY - lcd->WindowSrcY + 1;
|
||
}
|
||
|
||
int WIN_LcdGetLcdSizeX(WIN_LcdStruct *lcd) { return lcd->x_size; }
|
||
|
||
int WIN_LcdGetLcdSizeY(WIN_LcdStruct *lcd) { return lcd->y_size; }
|
||
|
||
u32 WIN_LcdSetLcdColor(WIN_LcdStruct *lcd, u32 color) {
|
||
u32 ret = lcd->Color;
|
||
// g_lcd_struct.Color=color;
|
||
lcd->Color = COLOR888TO565(color);
|
||
return ret;
|
||
}
|
||
|
||
u32 WIN_LcdSetLcdBkColor(WIN_LcdStruct *lcd, u32 color) {
|
||
u32 ret = lcd->BackColor;
|
||
// g_lcd_struct.BackColor=color;
|
||
lcd->BackColor = COLOR888TO565(color);
|
||
return ret;
|
||
}
|
||
|
||
u32 WIN_LcdSetLcdColor16(WIN_LcdStruct *lcd, u32 color) {
|
||
u32 ret = lcd->Color;
|
||
lcd->Color = (color);
|
||
return ret;
|
||
}
|
||
|
||
u32 WIN_LcdSetLcdBkColor16(WIN_LcdStruct *lcd, u32 color) {
|
||
u32 ret = lcd->BackColor;
|
||
lcd->BackColor = (color);
|
||
return ret;
|
||
}
|
||
|
||
u32 WIN_LcdGetLcdColor(WIN_LcdStruct *lcd) {
|
||
u32 ret = lcd->Color;
|
||
return COLOR565TO888(ret);
|
||
}
|
||
|
||
u32 WIN_LcdGetLcdBkColor(WIN_LcdStruct *lcd) {
|
||
u32 ret = lcd->BackColor;
|
||
return COLOR565TO888(ret);
|
||
}
|
||
|
||
u32 WIN_LcdGetLcdColor16(WIN_LcdStruct *lcd) {
|
||
u32 ret = lcd->Color;
|
||
return ret;
|
||
}
|
||
|
||
u32 WIN_LcdGetLcdBkColor16(WIN_LcdStruct *lcd) {
|
||
u32 ret = lcd->BackColor;
|
||
return ret;
|
||
}
|
||
|
||
// 设置绘制模式,1,不绘制背景,0,绘制背景
|
||
void WIN_LcdSetLcdDrawMode(WIN_LcdStruct *lcd, int mode) {
|
||
if (mode) {
|
||
lcd->DrawMode = 1; // 此时调用画点函数时不绘制背景色
|
||
} else {
|
||
lcd->DrawMode = 0;
|
||
}
|
||
}
|
||
|
||
// 填充一条线,以窗口的起点为起点,最大填充到窗口的终点位置
|
||
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++;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 把图像填充到屏幕的活动窗口中,
|
||
// 参数xsize,图像的宽度
|
||
// 参数ysize,图像的高度
|
||
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;
|
||
}
|
||
}
|
||
|
||
// 把图像偏移之后填充到屏幕的活动窗口中,
|
||
// 参数x_s,图像要显示的横向起始坐标
|
||
// 参数y_s,图像要显示的纵向起始坐标
|
||
// 参数xsize,图像的宽度
|
||
// 参数ysize,图像的高度
|
||
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);
|
||
}
|
||
|
||
// 在活动窗口的指定位置显示图片
|
||
// 参数s_x,图像在绘图窗口中的坐标
|
||
// 参数s_y,图像在绘图冲口中的坐标
|
||
// 参数s_xsize,要绘制的部分图像大小
|
||
// 参数s_ysize,要绘制的部分图像大小
|
||
// 参数x_s,图像要显示的横向起始坐标
|
||
// 参数y_s,图像要显示的纵向起始坐标
|
||
// 参数xsize,图像的宽度
|
||
// 参数ysize,图像的高度
|
||
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) {
|
||
// 保存以前的窗口大小
|
||
int w_x = lcd->WindowSrcX;
|
||
int w_y = lcd->WindowSrcY;
|
||
int w_x_e = lcd->WindowDstX;
|
||
int w_y_e = lcd->WindowDstY;
|
||
|
||
// 设置新的窗口大小
|
||
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;
|
||
// 限制新的绘图区不能在以前的窗口之外
|
||
if (lcd->WindowDstX > w_x_e)
|
||
lcd->WindowDstX = w_x_e;
|
||
if (lcd->WindowDstY > w_y_e)
|
||
lcd->WindowDstY = w_y_e;
|
||
|
||
// 绘图
|
||
WIN_LcdFillRectOff16(lcd, buff, x_s + s_x, y_s + s_y, xsize, ysize);
|
||
|
||
// 恢复以前的绘图区
|
||
lcd->WindowSrcX = w_x;
|
||
lcd->WindowSrcY = w_y;
|
||
lcd->WindowDstX = w_x_e;
|
||
lcd->WindowDstY = w_y_e;
|
||
}
|
||
|
||
// 安全画点,以屏幕窗口的坐标为原点,并且画点不会超出窗口范围
|
||
void WIN_LcdDrawPointSafe(WIN_LcdStruct *lcd, int x, int y, int mode) {
|
||
x += lcd->WindowSrcX;
|
||
y += lcd->WindowSrcY;
|
||
// 在窗口以外的不画
|
||
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 // 当g_lcd_struct.DrawMode==1时不绘制背景色
|
||
{
|
||
}
|
||
}
|
||
|
||
// 安全画点,以屏幕窗口的坐标为原点,并且画点不会超出窗口范围
|
||
// 以指定颜色画点,而不是前景色
|
||
void WIN_LcdDrawPointSafeColor(WIN_LcdStruct *lcd, int x, int y, u16 color) {
|
||
x += lcd->WindowSrcX;
|
||
y += lcd->WindowSrcY;
|
||
// 在窗口以外的不画
|
||
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;
|
||
}
|
||
}
|
||
|
||
// 快速ALPHA BLENDING算法.
|
||
// src:源颜色
|
||
// dst:目标颜色
|
||
// alpha:透明程度(0~32)
|
||
// 返回值:混合后的颜色.
|
||
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;
|
||
}
|
||
|
||
// 以指定色透明度画点0~32,0,全透明,31,不透明
|
||
void WIN_LcdDrawPointSafeColorAlpha(WIN_LcdStruct *lcd, int x, int y, u16 color,
|
||
u8 alpha) {
|
||
x += lcd->WindowSrcX;
|
||
y += lcd->WindowSrcY;
|
||
// 在窗口以外的不画
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 填充矩形,已窗口坐标为原点
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 以透明度填充矩形,已窗口坐标为原点
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 绘制图标,图标使用const数组编译在程序里,其本身已经附带了大小等参数
|
||
// 此函数效率比较低,只用于绘制小图标,绘制图片使用矩形填充函数
|
||
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];
|
||
|
||
// 必须所有参数都符合要求
|
||
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;
|
||
}
|
||
}
|
||
|
||
// 绘制图标,但是不绘制指定颜色
|
||
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];
|
||
|
||
// 必须所有参数都符合要求
|
||
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;
|
||
}
|
||
}
|
||
|
||
// 绘制图标,把图像的有效部分绘制为指定颜色
|
||
// 此函数效率比较低,只用于绘制小图标,绘制图片使用矩形填充函数
|
||
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];
|
||
|
||
// 必须所有参数都符合要求
|
||
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;
|
||
}
|
||
}
|
||
|
||
// 绘制图标,把原图像转化为透明度,用指定颜色来绘制
|
||
// 此函数效率比较低,只用于绘制小图标,绘制图片使用矩形填充函数
|
||
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];
|
||
|
||
// 必须所有参数都符合要求
|
||
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++) {
|
||
// 只绘制无效窗口内的屏幕
|
||
// 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))
|
||
{
|
||
// 白色全透明不绘制,加快速度
|
||
if ((imag[i] != 0x0000) && (imag[i] != 0xffff)) {
|
||
WIN_LcdDrawPointSafeColorAlpha(lcd, i + x, j, color,
|
||
31 - (imag[i] >> 11));
|
||
} else if (imag[i] == 0x0000) {
|
||
// 不透明直接画原来的颜色
|
||
WIN_LcdDrawPointSafeColor(lcd, i + x, j, color);
|
||
}
|
||
}
|
||
}
|
||
imag += w;
|
||
}
|
||
}
|
||
|
||
// 清除绘图窗口内的显示
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 清除矩形内的显示
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取指定矩形空间的屏幕颜色,屏幕的绝对坐标
|
||
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++;
|
||
}
|
||
}
|
||
}
|
||
}
|