/********************************************************************** * 函数名称: ShowIntervalPage * 功能描述: 显示"interval页面" * 输入参数: ptPageLayout - 内含多个图标的文件名和显示区域 * 输出参数: 无 * 返 回 值: 无 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2013/02/08 V1.0 韦东山 创建 ***********************************************************************/ static void ShowIntervalPage(PT_PageLayout ptPageLayout) { PT_VideoMem ptVideoMem; int iError; PT_Layout atLayout = ptPageLayout->atLayout; /* 1. 获得显存 */ ptVideoMem = GetVideoMem(ID("interval"), 1); if (ptVideoMem == NULL) { DBG_PRINTF("can't get video mem for interval page!\n"); return; } /* 2. 描画数据 */ /* 如果还没有计算过各图标的坐标 */ if (atLayout[0].iTopLeftX == 0) { CalcIntervalPageLayout(ptPageLayout); } iError = GeneratePage(ptPageLayout, ptVideoMem); iError = GenerateIntervalPageSpecialIcon(g_iIntervalSecond, ptVideoMem); if (iError) { DBG_PRINTF("GenerateIntervalPageSpecialIcon error!\n"); } /* 3. 刷到设备上去 */ FlushVideoMemToDev(ptVideoMem); /* 4. 解放显存 */ PutVideoMem(ptVideoMem); }
/********************************************************************** * 函数名称: ShowSavePage * 功能描述: 显示"Save页面" * 输入参数: ptPageLayout - 内含多个图标的文件名和显示区域 * 输出参数: 无 * 返 回 值: 无 ***********************************************************************/ static void ShowSavePage(PT_PageLayout ptPageLayout) { PT_VideoMem ptVideoMem; int iError; PT_Layout atLayout = ptPageLayout->atLayout; /* 1. 获得显存 */ ptVideoMem = GetVideoMem(ID("save"), 1); if (ptVideoMem == NULL) { DBG_PRINTF("can't get video mem for Save page!\n"); return; } /* 2. 描画数据 */ /* 如果还没有计算过各图标的坐标 */ if (atLayout[0].iTopLeftX == 0) { CalcSavePageLayout(ptPageLayout); } iError = GeneratePage(ptPageLayout, ptVideoMem); /* 3. 刷到设备上去 */ FlushVideoMemToDev(ptVideoMem); /* 4. 解放显存 */ PutVideoMem(ptVideoMem); }
static void ShowMainPage(struct PageLayout *ptPageLayout) { int iError = 0; struct VideoMem *ptMainPageVM; struct DisLayout *atDisLayout; atDisLayout = ptPageLayout->atDisLayout; /* 获得一块内存以显示 main 页面 */ ptMainPageVM = GetVideoMem(GetID("main"), 1); if(NULL == ptMainPageVM){ DebugPrint(DEBUG_ERR"Get main-page video memory error\n"); return; } /* 把三个图标画上去 */ if(atDisLayout[0].iTopLeftX == 0){ CalcMainPageLayout(ptPageLayout); } iError = GeneratePage(ptPageLayout, ptMainPageVM); FlushVideoMemToDev(ptMainPageVM); /* 释放用完的内存,以供别的程序使用 */ ReleaseVideoMem(ptMainPageVM); }
/********************************************************************** * 函数名称: PrepareNextPicture * 功能描述: 准备显示下一图片: 取出下图片的数据,存入VideoMem中 * 输入参数: bCur : 0 - 表示这是做准备用的, 有可能无法获得videomem * 1 - 表示必须获得videomem, 因为这是马上就要在LCD上显示出来的 * 输出参数: 无 * 返 回 值: NULL - 无法获得VideoMem,所以下一个图片没有预先备好 * 非NULL - 存有下一个图片数据的VideoMem的指针 * 修改日期 版本号 修改人 修改内容 * ----------------------------------------------- * 2013/02/08 V1.0 韦东山 创建 ***********************************************************************/ static PT_VideoMem PrepareNextPicture(int bCur) { T_PixelDatas tOriginIconPixelDatas; T_PixelDatas tPicPixelDatas; PT_VideoMem ptVideoMem; int iError; int iXres, iYres, iBpp; int iTopLeftX, iTopLeftY; float k; char strFileName[256]; GetDispResolution(&iXres, &iYres, &iBpp); /* 获得显存 */ ptVideoMem = GetVideoMem(-1, bCur); if (ptVideoMem == NULL) { DBG_PRINTF("can't get video mem for browse page!\n"); return NULL; } /* 把VidoeMem清为背景色 */ ClearVideoMem(ptVideoMem, COLOR_BACKGROUND); while (1) { /* 获得下一个要播放的图片的名字 */ iError = GetNextAutoPlayFile(strFileName); if (iError) { DBG_PRINTF("GetNextAutoPlayFile error\n"); PutVideoMem(ptVideoMem); return NULL; } /* 从图片文件中取出象素数据 */ iError = GetPixelDatasFrmFile(strFileName, &tOriginIconPixelDatas); if (0 == iError) { break; } } /* 把图片按比例缩放到VideoMem上, 居中显示 * 1. 先算出缩放后的大小 */ k = (float)tOriginIconPixelDatas.iHeight / tOriginIconPixelDatas.iWidth; tPicPixelDatas.iWidth = iXres; tPicPixelDatas.iHeight = iXres * k; if (tPicPixelDatas.iHeight > iYres) { tPicPixelDatas.iWidth = iYres / k; tPicPixelDatas.iHeight = iYres; } tPicPixelDatas.iBpp = iBpp; tPicPixelDatas.iLineBytes = tPicPixelDatas.iWidth * tPicPixelDatas.iBpp / 8; tPicPixelDatas.iTotalBytes = tPicPixelDatas.iLineBytes * tPicPixelDatas.iHeight; tPicPixelDatas.aucPixelDatas = malloc(tPicPixelDatas.iTotalBytes); if (tPicPixelDatas.aucPixelDatas == NULL) { PutVideoMem(ptVideoMem); return NULL; } /* 2. 再进行缩放 */ PicZoom(&tOriginIconPixelDatas, &tPicPixelDatas); /* 3. 接着算出居中显示时左上角坐标 */ iTopLeftX = (iXres - tPicPixelDatas.iWidth) / 2; iTopLeftY = (iYres - tPicPixelDatas.iHeight) / 2; /* 4. 最后把得到的图片合并入VideoMem */ PicMerge(iTopLeftX, iTopLeftY, &tPicPixelDatas, &ptVideoMem->tPixelDatas); /* 5. 释放图片原始数据 */ FreePixelDatasFrmFile(&tOriginIconPixelDatas); /* 6. 释放缩放后的数据 */ free(tPicPixelDatas.aucPixelDatas); return ptVideoMem; }