=转载开始==================================================
PNG的增强格式:MNG[转载]
Multiple-image Network Graphics (MNG)
PNG的增强格式:MNG[转载]
这种格式是从PNG格式发展来的一种新格式。由于PNG还不支持动画,所以作为一种解决方案,MNG格式的制定就成为理所当然的事。
MNG图形库站点:
http://www.libmng.com
http://www.libmng.org
MNG规范分几种等级:
FULL 全功能型 (支持PNG和JPG--称作JNG--作为图片,及一些特殊功能)
LC 低复杂度型 (支持PNG作为图片,及部份特殊功能)
VLC 最低复杂度(支持PNG作为图片)
目前处理MNG的图形软件所支持的规范可能不一样。但VLC全都支持。
MNG规范1.0: http://www.libmng.com/pub/mng/spec/
目前最新的是1.1。
MNG可以包含静态图片,动画等多种格式,甚至是3维的votex。
对于静态图片,支持基于PNG、基于JPG(称为JNG)格式,支持Delta-PNG以压结缩文件大小,可以定义图片播放时间间隔、同步、以及循环(可以多重循环)。
包含的图片大小可以不一致,每个图片都可以有自已的剪切范围;可以由多个图片组成一帧画面等等...
目前GDI+不支持此格式,需要用libmng来读写MNG格式。
=转载完毕==================================================
在broncho平台上, 开关机动画的实现就是采用liibmng和DirectFB来实现mng动画的绘制。
使用libmng来解码mng比较简单, 只要实现定义的回调函数,在回调函数里面做一些相应的处理,如:打开流、关闭流、处理文件头等等。回调的形式非常灵活,不管你在回调里做什么事情, 只要功能配合解码就行。libmng规定的回调有:
- openstream & closestream
打开、关闭流,一开始觉的为什么不叫openfile和closefile, 后来才发觉自己卡壳了,这个流可以是文件流也可以是网络流又或者是其它一些更特殊的处理, 也就是说mng的解码是可以一边读一边解码的。
- readdata
把mng的数据放到buffer里, 数据哪里来,看你的读取方式。
- processheader
这个回调只会在第一个mng文件块读进来的时候会调用,做一些绘制前的初始化。回调会传进来图像的大小,根据图像的大小来创建画布(容器),画布可以是任意格式的。
注意这里要调用mng_set_canvasstyle告诉libmng画布的格式,不然会影响画布的绘制。
- dsc.flags = DSDESC_CAPS |
- DSDESC_WIDTH |
- DSDESC_HEIGHT |
- DSDESC_PIXELFORMAT;
- dsc.width = width;
- dsc.height = height;
- dsc.pixelformat = DSPF_ARGB;
- dsc.caps = DSCAPS_NONE;
- DFBCHECK (mymng -> dfb -> CreateSurface (mymng -> dfb, &dsc, &surface ));
- DFBCHECK (surface -> Lock (surface, DSLF_WRITE, (void *)&pixels, &pitch));
- DFBCHECK (surface -> Unlock (surface));
- mymng -> surface = surface;
mymng -> pixels = pixels;
mymng -> pitch = pitch;
- getcanvasline
当libmng需要将mng绘制到画布的时候, 会调用这个回调。在这个回调里, 你需要给libmng返回正确的指针,指向画布里,绘制应该开始的地方,libmng会直接把数据拷贝过去,就完成了绘制。对于libmng来说, 不管什么格式的画布, 都只是个buffer。在开机画面的回调里,只有一条语句:
return mymng -> pixels + mymng -> pitch * line;
- refresh
在这个回调里,把图像绘制到你需要的地方。 可以是屏幕上,或者是其它画布。
开机画面里只是简单返回TRUE,不做任何处理,绘制会在上一层封装里面做。这样做的原因是可以节省cpu、容易控制刷新,对背景和进度条位置方便控制。
- gettickcount
获取逝去的时间
- settimer
创建一个计时器
- memalloc
内存分配,你可以简单的调用malloc,或者有自己的一套内存管理机制。
- memfree
释放内存,处理视你的分配而定。
- getbkgdline
获取背景的指针,类似- getcanvasline
- errorproc
错误处理
开关机画面的mng界面的处理,代码都基于mngplay,主要修改了上面提到的- processheader和- getcanvasline,很简单吧。 不过,这也是摸索出来的。 :-)
libmng就这么几个回调函数,但功能强大和使用很灵活。文章有什么不对或者想法,欢迎讨论。