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