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

306 lines
5.7 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "mywin_pic.h"
#include "string.h"
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
2025-06-27 00:32:57 +08:00
#define WIN_PICBUFF_NAME_MAXLEN 100
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
2025-06-27 00:32:57 +08:00
#define PICBUFF_NUM 30
typedef struct
{
WIN_PicStruct pic;
char name[WIN_PICBUFF_NAME_MAXLEN];
} _pic_data;
typedef struct
{
2025-07-05 19:47:28 +08:00
u32 buff_size; //<2F>ܴ<EFBFBD>С
u32 buff_used; //ʹ<><CAB9><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>
// u32 buff_tail; //β<><CEB2>
2025-06-27 00:32:57 +08:00
_pic_data *pic_data;
}WIN_PicBuffStruct;
static WIN_PicBuffStruct *g_pic_buff;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
WIN_PicBuffStruct *WIN_CreatPicBuff (u32 size)
{
WIN_PicBuffStruct *ret=mycalloc( sizeof (WIN_PicBuffStruct));
if (ret==0) return ret;
ret->pic_data=mymalloc_exm (sizeof(_pic_data)*size);
if (ret->pic_data==0)
{
myfree(ret);
ret=0;
return ret;
}
mymemset(ret->pic_data,0,sizeof(_pic_data)*size);
ret->buff_size=size;
return ret;
}
2025-07-05 19:47:28 +08:00
//ɾ<><C9BE>һ<EFBFBD><D2BB>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void WIN_DeletePicBuff (WIN_PicBuffStruct *pb)
{
if (pb)
{
for (int i=0;i<pb->buff_used;i++)
{
_pic_data *pic_data=&pb->pic_data[i];
if (pic_data->pic.data) myfree(pic_data->pic.data);
}
myfree(pb->pic_data);
myfree(pb);
}
}
_pic_data *WIN_PicUsed(WIN_PicBuffStruct *pb,int index)
{
_pic_data *pic_data=0;
pic_data=&pb->pic_data[index];
if(index!=0)
{
_pic_data *pic_temp=mymalloc(sizeof(_pic_data));
_pic_data *pic_first=&pb->pic_data[index-1];
mymemcpy(pic_temp,pic_data,sizeof(_pic_data));
mymemcpy(pic_data,pic_first,sizeof(_pic_data));
mymemcpy(pic_first,pic_temp,sizeof(_pic_data));
myfree(pic_temp);
pic_data=pic_first;
}
return pic_data;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
WIN_PicStruct *WIN_SearchPicData (WIN_PicBuffStruct *pb,const char *name)
{
WIN_PicStruct *ret=0;
if (pb)
{
for (int i=0;i<pb->buff_used;i++)
{
int index=i;
_pic_data *pic_data=0;
pic_data=&pb->pic_data[index];
if (strcmp(pic_data->name,name)==0)
{
2025-07-05 19:47:28 +08:00
//ʹ<><CAB9><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ
2025-06-27 00:32:57 +08:00
pic_data=WIN_PicUsed(pb,index);
ret=&pic_data->pic;
break;
}
}
}
return ret;
}
2025-07-05 19:47:28 +08:00
// <20><>index<65><78>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Ŀռ<C4BF>
2025-06-27 00:32:57 +08:00
int WIN_InsertPic(WIN_PicBuffStruct *pb, _pic_data *data,int index)
{
if(pb==0) return 0;
if(index>pb->buff_used) return 0;
int num=pb->buff_used-index;
_pic_data *pic_data=&pb->pic_data[index];
2025-07-05 19:47:28 +08:00
// index֮<78><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(pb->buff_used>=pb->buff_size)
{
2025-07-05 19:47:28 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
2025-06-27 00:32:57 +08:00
_pic_data *end=&pb->pic_data[pb->buff_used-1];
myfree(end->pic.data);
printf("%s:del pic,%s\r\n",__func__,end->name);
mymemset(end->name,0,WIN_PICBUFF_NAME_MAXLEN);
}
else
{
pb->buff_used++;
}
2025-07-05 19:47:28 +08:00
// ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
for(int i=num;i>0;i--)
{
_pic_data *end=&pic_data[i];
_pic_data *first=&pic_data[i-1];
mymemcpy(end,first,sizeof(_pic_data));
}
2025-07-05 19:47:28 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ַ<EFBFBD>
2025-06-27 00:32:57 +08:00
mymemcpy(pic_data,data,sizeof(_pic_data));
printf("%s:add pic,%s\r\n",__func__,pic_data->name);
return 1;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
int WIN_AddPicData (WIN_PicBuffStruct *pb,WIN_PicStruct *pic,const char *name)
{
if (pb)
{
_pic_data *pic_data=mymalloc(sizeof(_pic_data));
int len=strlen(name);
if(len+1>WIN_PICBUFF_NAME_MAXLEN)
{
printf("%s:err,pic name to long\r\n",__func__);
}
mymemcpy(pic_data->name,(void *)name,len+1);
mymemcpy(&pic_data->pic,pic,sizeof(WIN_PicStruct));
if(WIN_InsertPic(pb,pic_data,pb->buff_used/2)==0)
printf("%s:insert pic err \r\n",__func__);
myfree(pic_data);
}
return 0;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>ȡͼƬ
2025-06-27 00:32:57 +08:00
WIN_PicStruct *WIN_GetPic(const char *name)
{
if(name==0) return 0;
WIN_PicStruct *ret=0;
if(g_pic_buff==0) g_pic_buff=WIN_CreatPicBuff(PICBUFF_NUM);
ret=WIN_SearchPicData(g_pic_buff,name);
if (ret==0)
{
WIN_PicStruct pic={0};
if(WIN_DecodeImg(&pic,name)==0)
{
WIN_AddPicData(g_pic_buff,&pic,name);
}
ret=WIN_SearchPicData(g_pic_buff,name);
}
return ret;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>ȡͼƬ,ȥ<><C8A5>ͼƬ<CDBC><C6AC>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2025-06-27 00:32:57 +08:00
WIN_PicStruct *WIN_GetPicNoAlpha(const char *name)
{
WIN_PicStruct *ret=0;
if(g_pic_buff==0) g_pic_buff=WIN_CreatPicBuff(PICBUFF_NUM);
ret=WIN_SearchPicData(g_pic_buff,name);
if (ret==0)
{
WIN_PicStruct pic={0};
if(WIN_DecodeImg(&pic,name)==0)
{
if(pic.format==PIC_FORMAT_ARGB8888)
{
u32 *data=(u32 *)pic.data;
pic.data=mymalloc_exm(pic.xsize*pic.ysize*2);
for(int i=0;i<pic.xsize*pic.ysize;i++)
pic.data[i]=COLOR888TO565(data[i]);
pic.format=PIC_FORMAT_RGB565;
myfree(data);
}
WIN_AddPicData(g_pic_buff,&pic,name);
}
ret=WIN_SearchPicData(g_pic_buff,name);
}
return ret;
}
2025-07-05 19:47:28 +08:00
//<2F>ж<EFBFBD>pic<69>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>pic<69><63>
2025-06-27 00:32:57 +08:00
int WIN_PicInsidePic(WIN_PicStruct *base,WIN_PicStruct *child)
{
int ret=0;
if(base&&child&&base->data&&child->data&&base->xsize&&base->ysize&&child->xsize&&child->ysize)
{
if(base->format==child->format)
{
int base_size=base->xsize*base->ysize;
int child_size=child->xsize*child->ysize;
if(base->format==PIC_FORMAT_ARGB8888)
{
base_size*=2;
child_size*=2;
}
if((child->data>=base->data)&&(child->data+child_size<=base->data+base_size))
{
ret=1;
}
}
}
return ret;
}
2025-07-05 19:47:28 +08:00
//ͼ<><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
int WIN_GetPicLive(WIN_PicStruct *pic)
{
int ret=0;
WIN_PicBuffStruct *pb=g_pic_buff;
if (pb&&pic&&pic->data)
{
for (int i=0;i<pb->buff_used;i++)
{
int index=i;
_pic_data *pic_data=0;
pic_data=&pb->pic_data[index];
if (WIN_PicInsidePic(&pic_data->pic,pic))
{
ret=1;
break;
}
}
}
return ret;
}
2025-07-05 19:47:28 +08:00
//<2F><>ȫ<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>pic,<2C><><EFBFBD><EFBFBD>0<EFBFBD><30>û<EFBFBD><C3BB>picͼ<63><CDBC>
2025-06-27 00:32:57 +08:00
int WIN_DrawPic(WIN_PicStruct *pic,int x,int y,int xsize,int ysize)
{
if(pic&&WIN_GetPicLive(pic))
{
if(pic->format==PIC_FORMAT_ARGB8888)
{
WIN_FillRectAlpha (x,y,xsize,ysize,pic->data,0,0,pic->xsize,pic->ysize);
}
else
{
WIN_FillRect (x,y,xsize,ysize,pic->data,0,0,pic->xsize,pic->ysize);
}
return 1;
}
return 0;
}