661 lines
14 KiB
C
661 lines
14 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++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|