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

1094 lines
23 KiB
C
Raw Normal View History

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