| 
									
										
										
										
											2025-06-27 00:32:57 +08:00
										 |  |  |  | #include "mywin_pic.h"
 | 
					
						
							|  |  |  |  | #include "string.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							|  |  |  |  |   u32 buff_size; // <20>ܴ<EFBFBD>С
 | 
					
						
							|  |  |  |  |   u32 buff_used; // ʹ<><CAB9><EFBFBD>˶<EFBFBD><CBB6><EFBFBD>
 | 
					
						
							|  |  |  |  |   //	u32 buff_tail;			//β<><CEB2>
 | 
					
						
							|  |  |  |  |   _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>
 | 
					
						
							|  |  |  |  | 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-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) { | 
					
						
							|  |  |  |  |         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-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
										 |  |  |  | } |