2025-06-27 00:32:57 +08:00
|
|
|
|
#include "mywin_inc.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u32 WIN_SetLcdColor (u32 color)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
u32 co=ewin->lcd->getLcdColor();
|
|
|
|
|
u32 ret=COLOR565TO888(co);
|
|
|
|
|
ewin->lcd->setLcdColor(COLOR888TO565(color));
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 WIN_SetLcdBkColor (u32 color)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
u32 co=ewin->lcd->getLcdBkColor();
|
|
|
|
|
u32 ret=COLOR565TO888(co);
|
|
|
|
|
ewin->lcd->setLcdBkColor(COLOR888TO565(color));
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u16 WIN_GetLcdColor16 (void)
|
|
|
|
|
{
|
|
|
|
|
return WIN_GetWinStruct()->lcd->getLcdColor();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WIN_DrawPointSafe (int x,int y,int mode)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
if (POS_InRect (ewin->Invalid_x,ewin->Invalid_y,ewin->Invalid_x_size,ewin->Invalid_y_size,x,y))
|
|
|
|
|
{
|
|
|
|
|
// if (mode)
|
|
|
|
|
// LCD_DrawPointSafe (x,y,1);
|
|
|
|
|
// else
|
|
|
|
|
// LCD_DrawPointSafe (x,y,0);
|
|
|
|
|
ewin->lcd->drawPoint(x,y,mode);
|
|
|
|
|
}
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WIN_DrawPointNormal (int x,int y,int mode)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
ewin->lcd->drawPoint(x,y,mode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WIN_DrawPointColorSafe (int x,int y,u32 color)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
if (POS_InRect (ewin->Invalid_x,ewin->Invalid_y,ewin->Invalid_x_size,ewin->Invalid_y_size,x,y))
|
|
|
|
|
{
|
|
|
|
|
ewin->lcd->drawPointColor(x,y,color);
|
|
|
|
|
}
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WIN_DrawPointColorNormal (int x,int y,u32 color)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
ewin->lcd->drawPointColor(x,y,color);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WIN_DrawPointSafeColorAlpha (int x,int y,u16 color,u8 alpha)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
if (POS_InRect (ewin->Invalid_x,ewin->Invalid_y,ewin->Invalid_x_size,ewin->Invalid_y_size,x,y))
|
|
|
|
|
{
|
|
|
|
|
ewin->lcd->drawPointColorAlpha(x,y,color,alpha);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ӣ<EFBFBD><D3A2><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Ŀ<EFBFBD><C4BF><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static u32 WIN_DrawCharAt (char c,int x,int y)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
if (ewin->font.drawChar) return ewin->font.drawChar(c,x,y);
|
|
|
|
|
else return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ʾһ<CABE><D2BB><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>غ<EFBFBD><D8BA>ֵĿ<D6B5><C4BF><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static u32 WIN_DrawWordAt (char *c,int x,int y)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
if (ewin->font.drawWord) return ewin->font.drawWord(c,x,y);
|
|
|
|
|
else return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawTxtAt (char *txt,int x,int y)
|
|
|
|
|
{
|
|
|
|
|
if (txt==0) return;
|
|
|
|
|
while (*txt)
|
|
|
|
|
{
|
|
|
|
|
if ((*txt&0x80)==0)
|
|
|
|
|
{
|
|
|
|
|
x+=WIN_DrawCharAt(*txt,x,y);
|
|
|
|
|
txt++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
x+=WIN_DrawWordAt(txt,x,y);
|
2025-06-29 11:53:35 +08:00
|
|
|
|
txt+=3;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,֧<>ֻ<EFBFBD><D6BB>з<EFBFBD>\n
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawTxtAtRect (char *txt,int x,int y,int x_size,int y_size)
|
|
|
|
|
{
|
|
|
|
|
int x_s=x;
|
|
|
|
|
int y_s=y;
|
|
|
|
|
if (txt==0) return;
|
|
|
|
|
while (*txt)
|
|
|
|
|
{
|
|
|
|
|
if ((*txt&0x80)==0)
|
|
|
|
|
{
|
|
|
|
|
if ((x_s-x>x_size-1-WIN_GetFontWidth()/2)||(*txt=='\n'))
|
|
|
|
|
{
|
|
|
|
|
x_s=x;y_s+=WIN_GetFontHight();
|
|
|
|
|
if (*txt=='\n') {txt++;continue;}
|
|
|
|
|
}
|
|
|
|
|
x_s+=WIN_DrawCharAt(*txt,x_s,y_s);
|
|
|
|
|
txt++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (x_s-x>x_size-1-WIN_GetFontWidth())
|
|
|
|
|
{
|
|
|
|
|
x_s=x;y_s+=WIN_GetFontHight();
|
|
|
|
|
}
|
|
|
|
|
x_s+=WIN_DrawWordAt(txt,x_s,y_s);
|
2025-06-29 11:53:35 +08:00
|
|
|
|
txt+=3;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
if (y_s-y>y_size-1-WIN_GetFontHight()) return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,֧<>ֻ<EFBFBD><D6BB>з<EFBFBD>\n
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawTxtCenterAtRect (char *txt,int x,int y,int x_size,int y_size)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
int line_max=y_size/WIN_GetFontHight();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int char_max=x_size/(WIN_GetFontWidth()/2);//<2F><><EFBFBD><EFBFBD>ÿ<EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ٸ<EFBFBD><D9B8>ַ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int x_s=x;
|
|
|
|
|
int line_i=0;
|
|
|
|
|
char *txtbuff=mymalloc (line_max*(char_max+1));
|
|
|
|
|
char *txt_ptr=txtbuff;
|
|
|
|
|
while (*txt)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
if (line_i>=line_max)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{line_i--;break;}
|
|
|
|
|
if ((*txt&0x80)==0)
|
|
|
|
|
{
|
|
|
|
|
if ((x_s-x>x_size-WIN_GetFontWidth()/2)||(*txt=='\n'))
|
|
|
|
|
{
|
|
|
|
|
*txt_ptr=0;
|
|
|
|
|
line_i++;
|
|
|
|
|
txt_ptr=txtbuff+(char_max+1)*line_i;
|
|
|
|
|
x_s=x;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
if (*txt=='\n')
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{ txt++; }
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
x_s+=WIN_GetFontWidth()/2;
|
|
|
|
|
*txt_ptr=*txt;
|
|
|
|
|
txt_ptr++;
|
|
|
|
|
txt++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (x_s-x>x_size-WIN_GetFontWidth())
|
|
|
|
|
{
|
|
|
|
|
*txt_ptr=0;
|
|
|
|
|
line_i++;
|
|
|
|
|
txt_ptr=txtbuff+(char_max+1)*line_i;
|
|
|
|
|
x_s=x;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
x_s+=WIN_GetFontWidth();
|
|
|
|
|
*txt_ptr=*txt;
|
|
|
|
|
txt_ptr++;
|
|
|
|
|
txt++;
|
|
|
|
|
*txt_ptr=*txt;
|
|
|
|
|
txt_ptr++;
|
|
|
|
|
txt++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
*txt_ptr=0;//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>β
|
|
|
|
|
int y_s=y+(y_size-(line_i+1)*WIN_GetFontHight())/2;//y<><79><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD><CFBE><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
txt_ptr=txtbuff;
|
|
|
|
|
for (int i=0;i<line_i+1;i++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawTxtHCenterAt (txt_ptr,x+x_size/2,y_s);
|
|
|
|
|
y_s+=WIN_GetFontHight();
|
|
|
|
|
txt_ptr+=char_max+1;
|
|
|
|
|
}
|
|
|
|
|
myfree(txtbuff);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ָ<EFBFBD><D6B8>λ<EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawTxtHCenterAt (char *txt,int x,int y)
|
|
|
|
|
{
|
|
|
|
|
int str_len=strlen(txt);
|
|
|
|
|
int str_x_size=WIN_GetWinStruct()->font.TxtW/2*str_len;
|
|
|
|
|
WIN_DrawTxtAt (txt,x-str_x_size/2,y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WIN_DrawHLine (int x_s,int y,int x_e)
|
|
|
|
|
{
|
|
|
|
|
for (int i=x_s;i<=x_e;i++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawPointSafe (i,y,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><CDB8><EFBFBD>ȵĻ<C8B5><C4BB>ߣ<EFBFBD>dis=0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dis=1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawHLineAlpha (int x_s,int y,int x_e,u16 color,u8 dis)
|
|
|
|
|
{
|
|
|
|
|
u8 step=(x_e-x_s+1);
|
|
|
|
|
if (dis)
|
|
|
|
|
{
|
|
|
|
|
for (int i=x_s;i<=x_e;i++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawPointSafeColorAlpha (i,y,color,(i-x_s)*32/step);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (int i=x_s;i<=x_e;i++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawPointSafeColorAlpha (i,y,color,(x_e-i)*32/step);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WIN_DrawVLine (int x,int y_s,int y_e)
|
|
|
|
|
{
|
|
|
|
|
for (int i=y_s;i<=y_e;i++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawPointSafe (x,i,1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD> x1,y1:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x2,y2:<3A>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawLine(int x1, int y1, int x2, int y2)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
int t;
|
|
|
|
|
int xerr=0,yerr=0,delta_x,delta_y,distance;
|
|
|
|
|
int incx,incy,uRow,uCol;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
delta_x=x2-x1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
delta_y=y2-y1;
|
|
|
|
|
uRow=x1;
|
|
|
|
|
uCol=y1;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(delta_x>0)incx=1; //<2F><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
else if(delta_x==0)incx=0;//<2F><>ֱ<EFBFBD><D6B1>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
else {incx=-1;delta_x=-delta_x;}
|
|
|
|
|
if(delta_y>0)incy=1;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
else if(delta_y==0)incy=0;//ˮƽ<CBAE><C6BD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
else{incy=-1;delta_y=-delta_y;}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if( delta_x>delta_y)distance=delta_x; //ѡȡ<D1A1><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
else distance=delta_y;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(t=0;t<=distance+1;t++ )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
{
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//WIN_GetWinStruct()->drawPoint (uRow,uCol,1);
|
|
|
|
|
WIN_DrawPointSafe (uRow,uCol,1);
|
2025-07-05 19:05:35 +08:00
|
|
|
|
xerr+=delta_x ;
|
|
|
|
|
yerr+=delta_y ;
|
|
|
|
|
if(xerr>distance)
|
|
|
|
|
{
|
|
|
|
|
xerr-=distance;
|
|
|
|
|
uRow+=incx;
|
|
|
|
|
}
|
|
|
|
|
if(yerr>distance)
|
|
|
|
|
{
|
|
|
|
|
yerr-=distance;
|
|
|
|
|
uCol+=incy;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ָ<EFBFBD><D6B8>λ<EFBFBD>û<EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Բ (x,y):<3A><><EFBFBD>ĵ<EFBFBD> r :<3A>뾶
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawCircle(int x0,int y0,int r)
|
|
|
|
|
{
|
|
|
|
|
int a,b;
|
|
|
|
|
int di;
|
|
|
|
|
int c_x=0;
|
|
|
|
|
int c_y=0;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
a=0;b=r;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
di=3-(r<<1); //<2F>ж<EFBFBD><D0B6>¸<EFBFBD><C2B8><EFBFBD>λ<EFBFBD>õı<C3B5>־
|
2025-06-27 00:32:57 +08:00
|
|
|
|
while(a<=b)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ļ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
c_x=x0+a;c_y=y0-b;
|
|
|
|
|
//WIN_GetWinStruct()->drawPoint (c_x,c_y,1);
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0+b;c_y=y0-a;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0+b;c_y=y0+a;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0+a;c_y=y0+b;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0-a;c_y=y0+b;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0-b;c_y=y0+a;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0-a;c_y=y0-b;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
c_x=x0-b;c_y=y0-a;
|
|
|
|
|
WIN_DrawPointSafe (c_x,c_y,1);
|
|
|
|
|
a++;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ʹ<><CAB9>Bresenham<61>㷨<EFBFBD><E3B7A8>Բ
|
2025-07-05 19:05:35 +08:00
|
|
|
|
if(di<0)di +=4*a+6;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
else
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
di+=10+4*(a-b);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
b--;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:05:35 +08:00
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawLines (POINT_Struct *Points, int PointCount)
|
|
|
|
|
{
|
|
|
|
|
for (int i=0;i<PointCount-1;i++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawLine (Points[i].x,Points[i].y,Points[i+1].x,Points[i+1].y);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawPolygon(POINT_Struct *Points, int PointCount)
|
|
|
|
|
{
|
|
|
|
|
int16_t X = 0, Y = 0;
|
|
|
|
|
|
|
|
|
|
if(PointCount < 2)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WIN_DrawLine (Points->x,Points->y,(Points+PointCount-1)->x,(Points+PointCount-1)->y);
|
|
|
|
|
while(--PointCount)
|
|
|
|
|
{
|
|
|
|
|
X = Points->x;
|
|
|
|
|
Y = Points->y;
|
|
|
|
|
Points++;
|
|
|
|
|
WIN_DrawLine (X,Y,Points->x,Points->y);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ƿ<EFBFBD><C6BF>ľ<EFBFBD><C4BE><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawRect (int x,int y,int x_size,int y_size)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawHLine (x,y,x+x_size-1);
|
|
|
|
|
WIN_DrawHLine (x,y+y_size-1,x+x_size-1);
|
|
|
|
|
WIN_DrawVLine (x,y,y+y_size-1);
|
|
|
|
|
WIN_DrawVLine (x+x_size-1,y,y+y_size-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>ͼƽ<CDBC><C6BD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
WIN_PlaneAAStruct *WIN_CreatPlaneAA(int x,int y,int x_size,int y_size,int accuracy)
|
|
|
|
|
{
|
|
|
|
|
WIN_PlaneAAStruct *ret=mymalloc(sizeof(WIN_PlaneAAStruct)+x_size*y_size);
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if(ret)
|
|
|
|
|
{
|
|
|
|
|
ret->x=x;
|
|
|
|
|
ret->y=y;
|
|
|
|
|
ret->x_size=x_size;
|
|
|
|
|
ret->y_size=y_size;
|
|
|
|
|
ret->accuracy=accuracy;
|
|
|
|
|
ret->avr=ret->accuracy*ret->accuracy;
|
|
|
|
|
mymemset(ret->alpha,0,x_size*y_size);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ɾ<><C9BE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DeletePlaneAA(WIN_PlaneAAStruct *p)
|
|
|
|
|
{
|
|
|
|
|
if(p==0) return;
|
|
|
|
|
myfree(p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD>ͼƽ<CDBC><C6BD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawPlaneAA (WIN_PlaneAAStruct *p)
|
|
|
|
|
{
|
|
|
|
|
if(p==0) return;
|
|
|
|
|
u16 color=WIN_GetLcdColor16();
|
|
|
|
|
u8 *alpha=0;
|
|
|
|
|
for(int y=0;y<p->y_size;y++)
|
|
|
|
|
{
|
|
|
|
|
alpha=&p->alpha[y*p->x_size];
|
|
|
|
|
for(int x=0;x<p->x_size;x++)
|
|
|
|
|
{
|
|
|
|
|
if(*alpha>0x7)
|
|
|
|
|
WIN_DrawPointSafeColorAlpha(x+p->x,y+p->y,color,*alpha>>3);
|
|
|
|
|
alpha++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ƽ<EFBFBD><C6BD><EFBFBD>ڻ<EFBFBD><DABB>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD>ݵ<EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><78>y<EFBFBD><79>ʵ<EFBFBD><CAB5>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>p->accuracy<63><79>ֵ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawPointAA(WIN_PlaneAAStruct *p,int x,int y)
|
|
|
|
|
{
|
|
|
|
|
if(p==0) return;
|
|
|
|
|
if(p->alpha==0) return;
|
|
|
|
|
int x_s=x/p->accuracy;int y_s=y/p->accuracy;
|
|
|
|
|
int x_e=x_s+1;int y_e=y_s+1;
|
|
|
|
|
if(x_s<p->x||x_s>p->x+p->x_size-1) return;
|
|
|
|
|
if(y_s<p->y||y_s>p->y+p->y_size-1) return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ϸ<EFBFBD>̶ֳ<D6B3>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>p->accuracy<63><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
|
|
|
|
|
//<2F>ٳ<EFBFBD><D9B3><EFBFBD>һ<EFBFBD><D2BB>p->accuracy<63><79><EFBFBD><EFBFBD>Ϊ<EFBFBD>ϲ㲽<CFB2><E3B2BD>ֵ
|
2025-07-05 19:05:35 +08:00
|
|
|
|
int accuracy=p->accuracy;//*p->accuracy;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int alpha_x=16-(x%p->accuracy)*16/p->accuracy;
|
|
|
|
|
int alpha_y=16-(y%p->accuracy)*16/p->accuracy;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u8 *point=0;
|
|
|
|
|
int point_=0;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
point=&p->alpha[p->x_size*(y_s-p->y)+(x_s-p->x)];
|
|
|
|
|
point_=*point+alpha_x*alpha_y/accuracy;
|
|
|
|
|
if(point_>0xff) point_=0xff;
|
|
|
|
|
*point=point_;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if(x_e<p->x+p->x_size)
|
|
|
|
|
{
|
|
|
|
|
point=&p->alpha[p->x_size*(y_s-p->y)+(x_e-p->x)];
|
|
|
|
|
point_=*point+(16-alpha_x)*alpha_y/accuracy;
|
|
|
|
|
if(point_>0xff) point_=0xff;
|
|
|
|
|
*point=point_;
|
|
|
|
|
}
|
|
|
|
|
if((y_e<p->y+p->y_size)&&(x_e<p->x+p->x_size))
|
|
|
|
|
{
|
|
|
|
|
point=&p->alpha[p->x_size*(y_e-p->y)+(x_e-p->x)];
|
|
|
|
|
point_=*point+(16-alpha_x)*(16-alpha_y)/accuracy;
|
|
|
|
|
if(point_>0xff) point_=0xff;
|
|
|
|
|
*point=point_;
|
|
|
|
|
}
|
|
|
|
|
if(y_e<p->y+p->y_size)
|
|
|
|
|
{
|
|
|
|
|
point=&p->alpha[p->x_size*(y_e-p->y)+(x_s-p->x)];
|
|
|
|
|
point_=*point+alpha_x*(16-alpha_y)/accuracy;
|
|
|
|
|
if(point_>0xff) point_=0xff;
|
|
|
|
|
*point=point_;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ƽ<EFBFBD><C6BD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD> x1,y1:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x2,y2:<3A>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static void WIN_PlaneDrawLine(WIN_PlaneAAStruct *p,int x1, int y1, int x2, int y2)
|
|
|
|
|
{
|
|
|
|
|
if(p==0) return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int t;
|
|
|
|
|
int xerr=0,yerr=0,delta_x,delta_y,distance;
|
|
|
|
|
int incx,incy,uRow,uCol;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
delta_x=x2-x1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
delta_y=y2-y1;
|
|
|
|
|
uRow=x1;
|
|
|
|
|
uCol=y1;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(delta_x>0)incx=1; //<2F><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
else if(delta_x==0)incx=0;//<2F><>ֱ<EFBFBD><D6B1>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
else {incx=-1;delta_x=-delta_x;}
|
|
|
|
|
if(delta_y>0)incy=1;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
else if(delta_y==0)incy=0;//ˮƽ<CBAE><C6BD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
else{incy=-1;delta_y=-delta_y;}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if( delta_x>delta_y)distance=delta_x; //ѡȡ<D1A1><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
else distance=delta_y;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(t=0;t<=distance+1;t++ )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-05 19:05:35 +08:00
|
|
|
|
{
|
2025-06-27 00:32:57 +08:00
|
|
|
|
WIN_DrawPointAA(p,uRow,uCol);
|
2025-07-05 19:05:35 +08:00
|
|
|
|
xerr+=delta_x ;
|
|
|
|
|
yerr+=delta_y ;
|
|
|
|
|
if(xerr>distance)
|
|
|
|
|
{
|
|
|
|
|
xerr-=distance;
|
|
|
|
|
uRow+=incx;
|
|
|
|
|
}
|
|
|
|
|
if(yerr>distance)
|
|
|
|
|
{
|
|
|
|
|
yerr-=distance;
|
|
|
|
|
uCol+=incy;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:05:35 +08:00
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawLineAA(int x1, int y1, int x2, int y2,int accuracy)
|
|
|
|
|
{
|
|
|
|
|
int x=x1;if(x>x2) x=x2;
|
|
|
|
|
int y=y1;if(y>y2) y=y2;
|
|
|
|
|
int x_size=x1-x2;if(x_size<0) x_size=-x_size;
|
|
|
|
|
int y_size=y1-y2;if(y_size<0) y_size=-y_size;
|
|
|
|
|
x_size++;y_size++;
|
|
|
|
|
WIN_PlaneAAStruct *p=WIN_CreatPlaneAA(x,y,x_size,y_size,4);
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if(p)
|
|
|
|
|
{
|
|
|
|
|
x1*=p->accuracy;
|
|
|
|
|
y1*=p->accuracy;
|
|
|
|
|
x2*=p->accuracy;
|
|
|
|
|
y2*=p->accuracy;
|
|
|
|
|
WIN_PlaneDrawLine(p,x1,y1,x2,y2);
|
|
|
|
|
WIN_DrawPlaneAA(p);
|
|
|
|
|
WIN_DeletePlaneAA(p);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ô<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_FillRectByColor (int x,int y,int x_size,int y_size)
|
|
|
|
|
{
|
|
|
|
|
RECT_Struct r1;
|
|
|
|
|
RECT_Struct r2;
|
|
|
|
|
RECT_Struct ret;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
r1.x=x;r1.x_size=x_size;r1.y=y;r1.y_size=y_size;
|
|
|
|
|
r2.x=WIN_GetWinStruct()->Invalid_x;
|
|
|
|
|
r2.x_size=WIN_GetWinStruct()->Invalid_x_size;
|
|
|
|
|
r2.y=WIN_GetWinStruct()->Invalid_y;
|
|
|
|
|
r2.y_size=WIN_GetWinStruct()->Invalid_y_size;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><C2BE><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (POS_RectIntersection(&ret,&r1,&r2))
|
|
|
|
|
{
|
|
|
|
|
//LCD_FillRectByColor (ret.x,ret.y,ret.x_size,ret.y_size);
|
|
|
|
|
WIN_GetWinStruct()->lcd->fillRectByColor (ret.x,ret.y,ret.x_size,ret.y_size);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ô<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_FillRectByColorAlpha (int x,int y,int x_size,int y_size,u8 alpha)
|
|
|
|
|
{
|
|
|
|
|
RECT_Struct r1;
|
|
|
|
|
RECT_Struct r2;
|
|
|
|
|
RECT_Struct ret;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
r1.x=x;r1.x_size=x_size;r1.y=y;r1.y_size=y_size;
|
|
|
|
|
r2.x=WIN_GetWinStruct()->Invalid_x;
|
|
|
|
|
r2.x_size=WIN_GetWinStruct()->Invalid_x_size;
|
|
|
|
|
r2.y=WIN_GetWinStruct()->Invalid_y;
|
|
|
|
|
r2.y_size=WIN_GetWinStruct()->Invalid_y_size;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><C2BE><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (POS_RectIntersection(&ret,&r1,&r2))
|
|
|
|
|
{
|
|
|
|
|
//LCD_FillRectByColorAlpha (ret.x,ret.y,ret.x_size,ret.y_size,alpha);
|
|
|
|
|
WIN_GetWinStruct()->lcd->fillRectByColorAlpha (ret.x,ret.y,ret.x_size,ret.y_size,alpha);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ñ<EFBFBD><C3B1><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_FillRect (int x,int y,int x_size,int y_size,u16 *buff,u16 pic_x,u16 pic_y,u16 pic_xsize,u16 pic_ysize)
|
|
|
|
|
{
|
|
|
|
|
RECT_Struct r1;
|
|
|
|
|
RECT_Struct r2;
|
|
|
|
|
RECT_Struct ret;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
r1.x=x;r1.x_size=x_size;r1.y=y;r1.y_size=y_size;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
r2.x=WIN_GetWinStruct()->Invalid_x;
|
|
|
|
|
r2.x_size=WIN_GetWinStruct()->Invalid_x_size;
|
|
|
|
|
r2.y=WIN_GetWinStruct()->Invalid_y;
|
|
|
|
|
r2.y_size=WIN_GetWinStruct()->Invalid_y_size;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><C2BE><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (POS_RectIntersection(&ret,&r1,&r2))
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ͼƬƫ<C6AC>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
pic_x+=ret.x-x;
|
|
|
|
|
pic_y+=ret.y-y;
|
|
|
|
|
WIN_GetWinStruct()->lcd->fillRectOffAt (ret.x,ret.y,ret.x_size,ret.y_size,buff,pic_x,pic_y,pic_xsize,pic_ysize);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ô<EFBFBD><EFBFBD><CDB8><EFBFBD>ȵ<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_FillRectAlpha (int x,int y,int x_size,int y_size,void *buff,u16 pic_x,u16 pic_y,u16 pic_xsize,u16 pic_ysize)
|
|
|
|
|
{
|
|
|
|
|
RECT_Struct r1;
|
|
|
|
|
RECT_Struct r2;
|
|
|
|
|
RECT_Struct ret;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
r1.x=x;r1.x_size=x_size;r1.y=y;r1.y_size=y_size;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
r2.x=WIN_GetWinStruct()->Invalid_x;
|
|
|
|
|
r2.x_size=WIN_GetWinStruct()->Invalid_x_size;
|
|
|
|
|
r2.y=WIN_GetWinStruct()->Invalid_y;
|
|
|
|
|
r2.y_size=WIN_GetWinStruct()->Invalid_y_size;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><C2BE><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (POS_RectIntersection(&ret,&r1,&r2))
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ͼƬƫ<C6AC>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
pic_x+=ret.x-x;
|
|
|
|
|
pic_y+=ret.y-y;
|
|
|
|
|
WIN_GetWinStruct()->lcd->fillRectOffAtAlpha (ret.x,ret.y,ret.x_size,ret.y_size,buff,pic_x,pic_y,pic_xsize,pic_ysize);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#define ABS(X) ((X) > 0 ? (X) : -(X))
|
|
|
|
|
void WIN_FillTriangle(int x1, int x2, int x3, int y1, int y2, int y3)
|
|
|
|
|
{
|
|
|
|
|
int deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
|
|
|
|
|
yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,
|
|
|
|
|
curpixel = 0;
|
|
|
|
|
|
|
|
|
|
deltax = ABS(x2 - x1); /* The difference between the x's */
|
|
|
|
|
deltay = ABS(y2 - y1); /* The difference between the y's */
|
|
|
|
|
x = x1; /* Start x off at the first pixel */
|
|
|
|
|
y = y1; /* Start y off at the first pixel */
|
|
|
|
|
|
|
|
|
|
if (x2 >= x1) /* The x-values are increasing */
|
|
|
|
|
{
|
|
|
|
|
xinc1 = 1;
|
|
|
|
|
xinc2 = 1;
|
|
|
|
|
}
|
|
|
|
|
else /* The x-values are decreasing */
|
|
|
|
|
{
|
|
|
|
|
xinc1 = -1;
|
|
|
|
|
xinc2 = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (y2 >= y1) /* The y-values are increasing */
|
|
|
|
|
{
|
|
|
|
|
yinc1 = 1;
|
|
|
|
|
yinc2 = 1;
|
|
|
|
|
}
|
|
|
|
|
else /* The y-values are decreasing */
|
|
|
|
|
{
|
|
|
|
|
yinc1 = -1;
|
|
|
|
|
yinc2 = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (deltax >= deltay) /* There is at least one x-value for every y-value */
|
|
|
|
|
{
|
|
|
|
|
xinc1 = 0; /* Don't change the x when numerator >= denominator */
|
|
|
|
|
yinc2 = 0; /* Don't change the y for every iteration */
|
|
|
|
|
den = deltax;
|
|
|
|
|
num = deltax / 2;
|
|
|
|
|
numadd = deltay;
|
|
|
|
|
numpixels = deltax; /* There are more x-values than y-values */
|
|
|
|
|
}
|
|
|
|
|
else /* There is at least one y-value for every x-value */
|
|
|
|
|
{
|
|
|
|
|
xinc2 = 0; /* Don't change the x for every iteration */
|
|
|
|
|
yinc1 = 0; /* Don't change the y when numerator >= denominator */
|
|
|
|
|
den = deltay;
|
|
|
|
|
num = deltay / 2;
|
|
|
|
|
numadd = deltax;
|
|
|
|
|
numpixels = deltay; /* There are more y-values than x-values */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (curpixel = 0; curpixel <= numpixels; curpixel++)
|
|
|
|
|
{
|
|
|
|
|
WIN_DrawLine(x, y, x3, y3);
|
|
|
|
|
|
|
|
|
|
num += numadd; /* Increase the numerator by the top of the fraction */
|
|
|
|
|
if (num >= den) /* Check if numerator >= denominator */
|
|
|
|
|
{
|
|
|
|
|
num -= den; /* Calculate the new numerator value */
|
|
|
|
|
x += xinc1; /* Change the x as appropriate */
|
|
|
|
|
y += yinc1; /* Change the y as appropriate */
|
|
|
|
|
}
|
|
|
|
|
x += xinc2; /* Change the x as appropriate */
|
|
|
|
|
y += yinc2; /* Change the y as appropriate */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#define POLY_X(Z) ((int32_t)((Points + (Z))->x))
|
|
|
|
|
#define POLY_Y(Z) ((int32_t)((Points + (Z))->y))
|
|
|
|
|
void WIN_FillPolygon(POINT_Struct *Points, int PointCount)
|
|
|
|
|
{
|
|
|
|
|
int X = 0, Y = 0, X2 = 0, Y2 = 0, X_center = 0, Y_center = 0, X_first = 0, Y_first = 0, pixelX = 0, pixelY = 0, counter = 0;
|
|
|
|
|
int IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0;
|
|
|
|
|
|
|
|
|
|
IMAGE_LEFT = IMAGE_RIGHT = Points->x;
|
|
|
|
|
IMAGE_TOP= IMAGE_BOTTOM = Points->y;
|
|
|
|
|
|
|
|
|
|
for(counter = 1; counter < PointCount; counter++)
|
|
|
|
|
{
|
|
|
|
|
pixelX = POLY_X(counter);
|
|
|
|
|
if(pixelX < IMAGE_LEFT)
|
|
|
|
|
{
|
|
|
|
|
IMAGE_LEFT = pixelX;
|
|
|
|
|
}
|
|
|
|
|
if(pixelX > IMAGE_RIGHT)
|
|
|
|
|
{
|
|
|
|
|
IMAGE_RIGHT = pixelX;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pixelY = POLY_Y(counter);
|
|
|
|
|
if(pixelY < IMAGE_TOP)
|
|
|
|
|
{
|
|
|
|
|
IMAGE_TOP = pixelY;
|
|
|
|
|
}
|
|
|
|
|
if(pixelY > IMAGE_BOTTOM)
|
|
|
|
|
{
|
|
|
|
|
IMAGE_BOTTOM = pixelY;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(PointCount < 2)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
X_center = (IMAGE_LEFT + IMAGE_RIGHT)/2;
|
|
|
|
|
Y_center = (IMAGE_BOTTOM + IMAGE_TOP)/2;
|
|
|
|
|
|
|
|
|
|
X_first = Points->x;
|
|
|
|
|
Y_first = Points->y;
|
|
|
|
|
|
|
|
|
|
while(--PointCount)
|
|
|
|
|
{
|
|
|
|
|
X = Points->x;
|
|
|
|
|
Y = Points->y;
|
|
|
|
|
Points++;
|
|
|
|
|
X2 = Points->x;
|
|
|
|
|
Y2 = Points->y;
|
|
|
|
|
|
|
|
|
|
WIN_FillTriangle(X, X2, X_center, Y, Y2, Y_center);
|
|
|
|
|
WIN_FillTriangle(X, X_center, X2, Y, Y_center, Y2);
|
|
|
|
|
WIN_FillTriangle(X_center, X2, X, Y_center, Y2, Y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WIN_FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);
|
|
|
|
|
WIN_FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);
|
|
|
|
|
WIN_FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><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>
|
|
|
|
|
//<2F>˺<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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawImag (int x,int y,int xsize,int ysize,const u8 *buff)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (buff==0) return ;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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];
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((scan!=0x00)||(gray!=0x10)||(w>WIN_IMAGE_MAXSIZE)||(h>WIN_IMAGE_MAXSIZE)||(is565!=0x01)||(rgb!=0x1b))
|
|
|
|
|
return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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_GetWinStruct()->drawPointColor(i+x,j,imag[i]);
|
|
|
|
|
WIN_DrawPointColorSafe (i+x,j,imag[i]);
|
|
|
|
|
}
|
|
|
|
|
imag+=w;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawImagButColor (int x,int y,int xsize,int ysize,const u8 *buff,u16 color)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (buff==0) return ;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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];
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((scan!=0x00)||(gray!=0x10)||(w>WIN_IMAGE_MAXSIZE)||(h>WIN_IMAGE_MAXSIZE)||(is565!=0x01)||(rgb!=0x1b))
|
|
|
|
|
return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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_GetWinStruct()->drawPointColor (i+x,j,imag[i]);
|
|
|
|
|
WIN_DrawPointColorSafe (i+x,j,imag[i]);
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
imag+=w;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>,<2C><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>Ϊָ<CEAA><D6B8><EFBFBD><EFBFBD>ɫ
|
|
|
|
|
//<2F>˺<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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawImagByColor (int x,int y,int xsize,int ysize,const u8 *buff,u16 color)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (buff==0) return ;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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];
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((scan!=0x00)||(gray!=0x10)||(w>WIN_IMAGE_MAXSIZE)||(h>WIN_IMAGE_MAXSIZE)||(is565!=0x01)||(rgb!=0x1b))
|
|
|
|
|
return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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_GetWinStruct()->drawPointColor (i+x,j,color);
|
|
|
|
|
WIN_DrawPointColorSafe (i+x,j,color);
|
|
|
|
|
}
|
|
|
|
|
imag+=w;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><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>
|
|
|
|
|
//<2F>˺<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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawImagByAlpha (int x,int y,int xsize,int ysize,const u8 *buff,u16 color)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (buff==0) return ;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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];
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((scan!=0x00)||(gray!=0x10)||(w>WIN_IMAGE_MAXSIZE)||(h>WIN_IMAGE_MAXSIZE)||(is565!=0x01)||(rgb!=0x1b))
|
|
|
|
|
return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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++)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ļ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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))
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ɫȫ<C8AB><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3>ӿ<EFBFBD><D3BF>ٶ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((imag[i]!=0x0000)&&(imag[i]!=0xffff))
|
|
|
|
|
{
|
|
|
|
|
//WIN_GetWinStruct()->drawPointColorAlpha (i+x,j,color,31-(imag[i]>>11));
|
|
|
|
|
WIN_DrawPointSafeColorAlpha(i+x,j,color,31-(imag[i]>>11));
|
|
|
|
|
}
|
|
|
|
|
else if (imag[i]==0x0000)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><CDB8>ֱ<EFBFBD>ӻ<EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//WIN_GetWinStruct()->drawPointColor (i+x,j,color);
|
|
|
|
|
WIN_DrawPointColorSafe(i+x,j,color);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
imag+=w;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><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>
|
|
|
|
|
//<2F>˺<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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_DrawImagByAlphaAnti (int x,int y,int xsize,int ysize,const u8 *buff,u16 color)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (buff==0) return ;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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];
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((scan!=0x00)||(gray!=0x10)||(w>WIN_IMAGE_MAXSIZE)||(h>WIN_IMAGE_MAXSIZE)||(is565!=0x01)||(rgb!=0x1b))
|
|
|
|
|
return;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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++)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ļ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
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))
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ɫȫ<C8AB><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3>ӿ<EFBFBD><D3BF>ٶ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((imag[i]!=0x0000)&&(imag[i]!=0xffff))
|
|
|
|
|
{
|
|
|
|
|
//WIN_GetWinStruct()->drawPointColorAlpha (i+x,j,color,31-(imag[i]>>11));
|
|
|
|
|
WIN_DrawPointSafeColorAlpha(i+x,j,color,(imag[i]>>11));
|
|
|
|
|
}
|
|
|
|
|
else if (imag[i]==0xffff)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><CDB8>ֱ<EFBFBD>ӻ<EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//WIN_GetWinStruct()->drawPointColor (i+x,j,color);
|
|
|
|
|
WIN_DrawPointColorSafe(i+x,j,color);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
imag+=w;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_Clear (void)
|
|
|
|
|
{
|
|
|
|
|
WIN_Struct *ewin=WIN_GetWinStruct();
|
|
|
|
|
//LCD_ClearRect (ewin->Invalid_x,ewin->Invalid_y,ewin->Invalid_x_size,ewin->Invalid_y_size);
|
|
|
|
|
ewin->lcd->clearRect (ewin->Invalid_x,ewin->Invalid_y,ewin->Invalid_x_size,ewin->Invalid_y_size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵľ<D6B5><C4BE>δ<EFBFBD>С
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void WIN_GetTxtRectSize (char *txt,int *x_size,int *y_size)
|
|
|
|
|
{
|
|
|
|
|
int font_h=WIN_GetFontHight();
|
|
|
|
|
int font_w=WIN_GetFontWidth()/2;
|
|
|
|
|
int max_num=0;
|
|
|
|
|
int now_num=0;
|
|
|
|
|
int line=1;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>û<EFBFBD>ж<EFBFBD><D0B6><EFBFBD>i=0;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> 2020.2.26
|
2025-06-27 00:32:57 +08:00
|
|
|
|
for (int i=0;txt[i];i++)
|
|
|
|
|
{
|
|
|
|
|
if (txt[i]!='\n')
|
|
|
|
|
{
|
|
|
|
|
now_num++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (now_num>max_num)
|
|
|
|
|
{
|
|
|
|
|
max_num=now_num;
|
|
|
|
|
now_num=0;
|
|
|
|
|
}
|
|
|
|
|
line++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if (max_num<now_num+1) max_num=now_num+1;//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
*x_size=max_num*font_w;
|
|
|
|
|
*y_size=line*font_h;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ݵijߴ<C4B3>,<2C><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int WIN_GetImageSize (u8 *buff,int *xsize,int *ysize)
|
|
|
|
|
{
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if (buff==0) return -1;
|
|
|
|
|
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];
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
if ((scan!=0x00)||(gray!=0x10)||(is565!=0x01)||(rgb!=0x1b))
|
|
|
|
|
return -1;
|
2025-07-05 19:05:35 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
*xsize=w;
|
|
|
|
|
*ysize=h;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|