1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
| #include "GUI.h"
#include "WM.h"
#include "DIALOG.h"
#include <stdio.h>
#include "ff.h"
#include "FreeRTOS.h"
#include "task.h"
/*********************************************************************
*
* Defines
*
**********************************************************************
*/
/*********************************************************************
*
* Types
*
**********************************************************************
*/
/*******************************************************************
*
* Static variables
*
********************************************************************/
int t0, t1;
static char _acBuffer[1024 * 2];
extern FRESULT result;
FIL file; /* file objects */
static const char gifName[]="1:/image/dolphin.gif";
/*******************************************************************************
* static code
******************************************************************************/
/**
* @brief 从存储器中读取数据
* @note 无
* @param
* @retval NumBytesRead:读到的字节数
*/
int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
static int FileAddress = 0;
UINT NumBytesRead;
FIL *Picfile;
Picfile = (FIL *)p;
/* 检查缓冲区大小 */
if(NumBytesReq > sizeof(_acBuffer))
{
NumBytesReq = sizeof(_acBuffer);
}
/* 读取偏移量 */
if(Off == 1) FileAddress = 0;
else FileAddress = Off;
result = f_lseek(Picfile, FileAddress);
/* 进入临界段 */
taskENTER_CRITICAL();
/* 读取图片数据 */
result = f_read(Picfile, _acBuffer, NumBytesReq, &NumBytesRead);
/* 退出临界段 */
taskEXIT_CRITICAL();
*ppData = (const U8 *)_acBuffer;
/* 返回以读到的字节数 */
return NumBytesRead;
}
/**
* @brief 直接从存储器中绘制GIF图片数据
* @note 无
* @param sFilename:需要加载的图片名
* @retval 无
*/
static void ShowGIFEx(const char *sFilename)
{
GUI_GIF_INFO Gifinfo = {0};
GUI_GIF_IMAGE_INFO Imageinfo = {0};
int i = 0;
/* 进入临界段 */
taskENTER_CRITICAL();
/* 打开图片 */
result = f_open(&file, sFilename, FA_READ);
if ((result != FR_OK))
{
printf("文件打开失败!\r\n");
_acBuffer[0]='\0';
}
/* 退出临界段 */
taskEXIT_CRITICAL();
/* 获取GIF文件信息 */
GUI_GIF_GetInfoEx(_GetData, &file, &Gifinfo);
/* 循环显示所有的GIF帧 */
for(i = 0; i < Gifinfo.NumImages; i++)
{
/* 获取GIF子图象信息 */
GUI_GIF_GetImageInfoEx(_GetData, &file, &Imageinfo, i);
/* 绘制GIF子图象 */
GUI_GIF_DrawSubEx(_GetData, &file,
(LCD_GetXSize() - Gifinfo.xSize) / 2,
(LCD_GetYSize() - Gifinfo.ySize) / 2, i);
/* 帧延时 */
GUI_Delay(Imageinfo.Delay);
}
/* 读取完毕关闭文件 */
f_close(&file);
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/**
* @brief GUI主任务
* @note 无
* @param 无
* @retval 无
*/
void MainTask(void)
{
/* 设置背景色 */
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
/* 设置字体 */
GUI_SetFont(GUI_FONT_16B_ASCII);
GUI_SetTextMode(GUI_TM_XOR);
char buffer[50];
t0 = GUI_GetTime();
/* 直接从外部存储器绘制GIF图片 */
ShowGIFEx(gifName);
t1 = GUI_GetTime();
sprintf(buffer,"ShowGIFEx:%dms",t1-t0);
GUI_DispStringAt(buffer, 0, 0);
printf("%dms\r\n",t1-t0);
while(1)
{
GUI_Delay(1000);
}
}
|