分类:
2008-10-31 15:31:25
第一节 系统概述:
Thumbnail状态只是V2版中的一个中间状态,所以在分析代码之前有必要分析以下整个系统的构架及整个系统的入口。
由于V2是基于FreeRTOS操作系统下开发的,所以当系统Run后,首先会对操作系统进行一些初始化的工作,程序总入口是 Main_Freertos.c中的int main(int argc, char** argv),该函数主要进行一些操作系统的初试化工作及创建根任务。我们应用程序的入口是Main.c 中的appmain(),appmain()函数结构很简单,就是依此调用Initialize(),MainLoop(),Terminate()这三个函数,Initialize()是对V2的应用程序进行初始化,如它其中调用了smtkStateMgrTerminate()对状态进行初始化等,MainLoop()函数是整个应用程序的核心,它就是一个死循环,在死循环中不停的查询按键按下,时间片到事件,如果是按键事件就调用smtkStateMgrProcessMsg(SMTK_MSG_ID_KEY_DOWN, keyNumber, msgId);来处理,要是是时间片事件就调用smtkStateMgrProcessMsg(SMTK_MSG_ID_TIMER, 0, 0)来处理。最后在需要结束整个程序时用goto语句来跳出循环,再调用Terminate()函数来释放所有的资源从而终止整个程序。
第二节 进入Thumbnail状态
在Initialize()函数中调用了smtkStateMgrInitialize()函数,仔细分析该函数可以清楚的发现如果你定义了SMTK_BURN_FLASH_ENABLE,这时程序就会进入到SMTK_STATE_BURN_FLASH状态,如果烧写不使能的话,就默认进入SMTK_STATE_SPLASH开机显示LOGO状态。再SMTK_STATE_SPLASH下如果不插卡的情况下,内部有图片的话,自动转动SMTK_STATE_SLIDE_SHOW状态,如果没有图片就转动日历状态。在SMTK_STATE_SLIDE_SHOW状态下如果接受到PAL_KEYPAD_MENU,就会转入SMTK_STATE_BROWSE状态,在button可见时,按back键就进入到Thumbnail状态。
在MainTop状态下,如果按下Photo,并且找到可显示的图片if(smtkFileMgrGetFileCount()) result=smtkStateMgrChangeState(SMTK_STATE_THUMBNAIL); // photo则进入到Thumbnail状态。
第三节 Thumbnail.h
#ifdef __cplusplus
extern "C" {
#endif
C/C++编译器对函数名和变量名的命名方法不一样,C++支持函数重载,所以它编译的函数名会带上参数类型等,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,extern “c”表示是安C的标准去处理函数,如果C++文件中用C++方式去编译C方式的函数的话就一定用extern “C”来说明,否则会DLL错误。
#define STATE_ACTION_COUNT 10 ??
#ifdef PANEL_160_234
…………………….......
#elif defined(PANEL_320_240)
…………………………
#elif defined(PANEL_480_234)
…………………………
如上宏定义,其实是用来根据Panal像素来配置程序的,只能是其中配置的一种,以
320*240位例说明:
#define THUMBNAIL_WIDTH 76 表示THUMBNAIL的宽度
#define THUMBNAIL_HEIGHT 65 表示THUMBNAIL的高度
#define THUMBNAIL_SPACE 3 表示THUMBNAIL的间隙
#define THUMBNAIL_X_POS 3 表示THUMBNAIL的X坐标
#define THUMBNAIL_Y_POS 4 表示THUMBNAIL的Y坐标
#define THUMBNAIL_X_NUM 4 表示X方向THUMBNAIL的数目
#define THUMBNAIL_Y_NUM 3 表示Y方向THUMBNAIL的数目define THUMBNAIL_SCALE 1.0 表示THUMBNAIL的伸缩比例
#define THUMBNAIL_BUTTON_DUATION 3000 按键菜单的可见时间
#define SMTK_THUMBNAIL_BAR_HEIGHT 32 表示THUMBNAIL下面的BAR高
typedef struct SMTK_THUMBNAIL_PARAM_TAG
{
………...................................................
MMP_INT listNum; /**< The number of thumbnail in the decoded list */
MMP_INT displayNum; /**< The number of thumbnail in the display list. Usually listNum >= displayNum */
} SMTK_ THUMBNAIL _PARAM; 这个结构体描述了THUMBNAIL显示位置的一些参数。
另外在这个头文件里声明了很多的变量。这些变量的具体功能在下一节了说明。
第四节 Thumbnail.c
#define THUMBNAIL_ACTION_COUNT 6 用来定义THUMBNAIL图上下移动动画效果要分几次显示frames.
#ifdef SMTK_RESOURCE_DYNAMIC_LOADING
static const PAL_TCHAR* pictureName = RESOURCE_TDEFAULT PAL_T("picture.jpg");
如果定义了动态资源装载,就定义一个指向两个字节的指针,指针指向L"/smedia/" L"NAND_PRIVATE/" L"smediadata/ L ##"picture.jpg"; 其实是一个目录字符串。所以picturename 是一个指向图片路径的指针。
typedef struct SMTK_THUMBNAIL_TAG
{
struct SMTK_THUMBNAIL_TAG* parent;
struct SMTK_THUMBNAIL_TAG* child;
MMP_BOOL visible;
MMP_BOOL valid;
MMP_BOOL focus;
SMTK_GUI_RECT Rect
SMTK_GUI_RECT jpgRect;
MMP_INT index;
MMP_SURFACE surf;
} SMTK_THUMBNAIL;
从这个结构体中可以看出,Thumbnail是连接成双向链表的,这种结构有利向上,向下显示图片,visible表示图片是否是被显示状态,valid表示图片是否能被正确显示,focus表示图片是否获的焦点,index表示图片在链表中的索引号。
typedef struct SMTK_GUI_RECT_TAG
{
MMP_INT startX; /**< The x-coordinate of the upper-left corner of the rectangle */
MMP_INT startY; /**< The y-coordinate of the upper-left corner of the rectangle */
MMP_UINT width; /**< Rectangle width */
MMP_UINT height; /**< Rectangle height */
} SMTK_GUI_RECT; 这个结构体是定义了一个矩阵范围。
typedef struct SMTK_THUMBNAIL_MGR_TAG
{
MMP_UINT flag;
SMTK_THUMBNAIL* currentG; Thunmbnail链表中的当前节点
SMTK_THUMBNAIL* headG; Thunmbnail链表中的头节点
MMP_SURFACE thumbSurf; 绘制Thunmbnail用
MMP_SURFACE textSurf; 绘制文本信息用
MMP_SURFACE defaultSurf; 那些不能支持的图片显示用的
SMTK_THUMBNAIL_PARAM* param;
MMP_UINT defaultWidth;
MMP_UINT defaultHeight;
MMP_WCHAR* filename; 文件名称
/**
* Index control
*/
MMP_INT currentIndex; 当前Thunmbnail索引
MMP_INT displayTopIndex; 显示的第一个Thunmbnail的索引
MMP_INT decodeTopIndex; 已经解码的第一个Thunmbnail的索引
MMP_INT actionCount; 畫面數
MMP_INT currentdecodeIndex; 当前解码的索引
MMP_BOOL backwardDecode; 标识向后解码
MMP_BOOL animationChange; 畫面更改與否
MMP_BOOL decodeSuccess; 标识是否解码成功
} SMTK_THUMBNAIL_MGR;
MMP_INT smtkThumbnailMgrInitialize( SMTK_THUMBNAIL_PARAM* param )
这是初始化ThumbnailManager函数,主要工作就是为必须的资源分配内存空间,在函数里对thumbnailMgr分配了空间,并且它进行一些赋值。
MMP_INT smtkThumbnailMgrTerminate( void ) z这个函数在终止Thumbnail manager时,用来释放初始化时分配的那些资源,注意一定要释放,并按照堆栈的分配原则来释放内存,否则可能会引起内存泄露,
MMP_INT smtkThumbnailMgrDecode(void) 该函数用来检查Thumbnail的解码状态,并解码Thumbnail,并把它加入Buffer.
static void drawInfoText(void) 该函数用来绘制描述Thumbnail数目的文本信息。
首先定义文本框的尺寸tmpRect,然后添充颜色,在绘制白色分界线分两次调用
mmpM2dGradientFill()函数,并设置成颜色渐变式,再设置背景模式,字体并根据不
同的Thumbnail->currentid,和textTotalIndex来显示图片显示的数字信息。
MMP_INT smtkThumbnailMgrDraw(MMP_SURFACE surf) 用来绘制Thumbnail图。
Void smtkThumbnailMgrIncIndex (void) 用来移动焦点到下一个Thumbnail图片。
Void smtkThumbnailMgrDecIndex (void) 移动焦点到上一个Thumbnail图片。
这个函数跟上个函数结构几乎一样,只是图片向上移动。
Void smtkThumbnailMgrPageUp( void ) 用来把整个Thumbnail窗口向上移动一行。
跟上面函数类似
Void smtkThumbnailMgrPageDown(void) 用来把整个Thumbnail窗口向下移动一行。
跟上面函数类似
MMP_BOOL smtkThumbnailMgrUpdated(void) 用来表示Thumbnail是否刷新。
MMP_BOOL smtkThumbnailMgrDecodeReady(void) 检查JPEG图片是否正在被解码
MMP_BOOL smtkThumbnailMgrSuccess(void) 检查JPEG图片是否解码成功。
Void smtkThumbnailMgrGetCurrentRect(SMTK_GUI_RECT* rect) 获得Thumbnail的Rect信息。
static void updateThumbnailFirstPosition(MMP_INT index) 更新Thumbnail图片的第一次显示的位置。
static void updateFocusPosition(void) 更新焦点的位置。
static void setThumbnailPosition(MMP_INT step) 设置Thumbnail 图片的位置。
这个函数用来设置图片的位置,图片显示有三种情况,当图片索引小于displayTopIndex时,图片是不可见的,当图片索引大于显示图片的最后一个索引时,图片也是不可见的,其它的都是可见的。
第五节 State_thumbnail.c
static MMP_INT Proc( MMP_UINT id, MMP_ULONG arg1, MMP_ULONG arg2)
这是Thumbnail状态下的私有函数,负责处理这个状态下接受的事件,这个函数的参数
Id表示接受的事件类型,时间事件or按键事件。若是按键事件arg1表示按键的索引。
根据不同的事件类型,调用不同的处理函数。
static MMP_INT Process_Thumbnail(void)
只在Proc函数中调用,只有在接受时间事件是调用,主要是根据不同的条件设置不同的显示surface,然后再不同的按键索引信息,来确定按键菜单要不要显示出来。
static MMP_INLINE MMP_INT Keydown_Thumbnail(MMP_ULONG index)
按键按下事件的处理函数,在有按键按下是调用该函数处理。函数参数是按键索引,标识不同的按键,这个函数的结构比较简单,主要就是switch分支结构,根据不同的条件有不同的处理。
static MMP_INT Initialize(void)
这个函数是Thumbnail状态下的私有初始化函数,如果检测到图片文件为空,则回到Maintop状态,如果有图片就初始化对应的资源,并调用smtkThumbnailMgrInitialize(¶m)函数来初始化Thumbnail管理器,再调用smtkButtonMgrGetCurrentIndex()来获取按键的索引,再调用smtkThumbnailMgrDraw(stateSurf)函数来绘制Thumbnail管理器。
static MMP_INT Terminate(void)
这个函数用来终结Thumbnail状态释放相应的资源用的,比如依此调用了smtkThumbnailMgrTerminate();smtkButtonMgrTerminate();smtkResMgrTerminate();mmpM2dDeleteSurface(stateSurf),注意释放资源的顺序,我觉的释放资源时要按照从外往里释放的原则,否则可能会发生一些无法预知的错误,导致程序崩溃。