14.3 绘制无需加载到存储器的PNG图片
绘制无需加载到存储器的PNG图片方式可以有效的解决内部动态内存不够的情况,不过缺点也很明显,图片的显示速度很慢。这种方式一般是每次读取一行像素的数据,然后进行显示。这个工程的实现主要分为如下三个部分:
Ø 使用芯片内部的SRAM作为动态内存
Ø 图片的加载以及显示函数
Ø 主函数
下面把这三部分详细的讲解下:
l 使用芯片外部的SRAM作为动态内存,这部分函数与上面第11章的11.2小节一样,由于PNG比较的消耗内存,这里和BMP不同也需要使用动态内存。
l 图片的加以及显示函数。
复制代码
/*
********************************************************************************
*
* _GetData
*
* Purpose:
* This routine is called by GUI_GIF_DrawEx(). The routine is responsible
* for setting the data pointer to a valid data location with at least
* one valid byte.
*
* Parameters:
* p - Pointer to application defined data.
* NumBytesReq - Number of bytes requested.
* ppData - Pointer to data pointer. This pointer should be set to
* a valid location.
* StartOfFile - If this flag is 1, the data pointer should be set to the
* beginning of the data stream.
*
* Return value:
* Number of data bytes available.
*********************************************************************************
*/
static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) {
static int FileAddress = 0;
FIL *file;
DWORD NumBytesRead;
U8 * pData;
pData = (U8 *)*ppData;
file = (FIL *)p;
//
// Set file pointer to the required position
//
if(Off == 1) FileAddress = 0;
else FileAddress = Off;
result =f_lseek(file, FileAddress);
//
// Read data into buffer
//
result = f_read(file, pData, NumBytesReq, &NumBytesRead);
//
// Return number of available bytes
//
return NumBytesRead;
}
/*
*********************************************************************************************************
* 函 数 名: _ShowPNG
* 功能说明: 显示PNG图片
* 形 参:sFilename 要显示的图片名字
* usPOSX 显示位置X
* usPOSY 显示位置Y
* 返 回 值: 无
*********************************************************************************************************
*/
static void _ShowPNGEx(const char * sFilename, uint16_t usPOSX, uint16_t usPOSY)
{
/* 打开文件 */
result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
if (result != FR_OK)
{
return;
}