2025-06-27 00:32:57 +08:00
|
|
|
|
#include "mywin_pic.h"
|
|
|
|
|
|
#include "string.h"
|
2025-10-18 13:58:40 +08:00
|
|
|
|
#include "mywin_inc.h"
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><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-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#define PICBUFF_NUM 30
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
typedef struct {
|
|
|
|
|
|
WIN_PicStruct pic;
|
|
|
|
|
|
char name[WIN_PICBUFF_NAME_MAXLEN];
|
2025-06-27 00:32:57 +08:00
|
|
|
|
} _pic_data;
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
typedef struct {
|
2025-10-18 01:02:27 +08:00
|
|
|
|
uint32_t buff_size; // <20>ܴ<EFBFBD>С
|
|
|
|
|
|
uint32_t buff_used; // ʹ<><CAB9><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>
|
|
|
|
|
|
// uint32_t buff_tail; //β<><CEB2>
|
2025-07-06 18:46:13 +08:00
|
|
|
|
_pic_data *pic_data;
|
|
|
|
|
|
} WIN_PicBuffStruct;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
static WIN_PicBuffStruct *g_pic_buff;
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>
|
2025-10-18 01:02:27 +08:00
|
|
|
|
WIN_PicBuffStruct *WIN_CreatPicBuff(uint32_t size) {
|
2025-07-06 18:46:13 +08:00
|
|
|
|
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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// ɾ<><C9BE>һ<EFBFBD><D2BB>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
_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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
|
|
|
|
|
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) {
|
|
|
|
|
|
// ʹ<><CAB9><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ
|
|
|
|
|
|
pic_data = WIN_PicUsed(pb, index);
|
|
|
|
|
|
|
|
|
|
|
|
ret = &pic_data->pic;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
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-07-06 18:46:13 +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];
|
|
|
|
|
|
|
|
|
|
|
|
// index֮<78><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (pb->buff_used >= pb->buff_size) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
|
_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++;
|
|
|
|
|
|
}
|
|
|
|
|
|
// ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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));
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ַ<EFBFBD>
|
|
|
|
|
|
mymemcpy(pic_data, data, sizeof(_pic_data));
|
|
|
|
|
|
printf("%s:add pic,%s\r\n", __func__, pic_data->name);
|
|
|
|
|
|
return 1;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
|
|
|
|
|
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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>ȡͼƬ
|
|
|
|
|
|
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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>ȡͼƬ,ȥ<><C8A5>ͼƬ<CDBC><C6AC><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
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) {
|
2025-10-18 01:02:27 +08:00
|
|
|
|
uint32_t *data = (uint32_t *)pic.data;
|
2025-07-06 18:46:13 +08:00
|
|
|
|
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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>ж<EFBFBD>pic<69>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>pic<69><63>
|
|
|
|
|
|
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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// ͼ<><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><>ȫ<EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>pic,<2C><><EFBFBD><EFBFBD>0<EFBFBD><30>û<EFBFBD><C3BB>picͼ<63><CDBC>
|
|
|
|
|
|
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;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|