KJAVA虚拟机Hack笔记-实现immutableimage
1,046 views| 2008-12-01| 李先静| KVM hack notes| | 发表评论转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli@gmail.com>
immutable image在这里的意思是说不能在上面进行绘制操作的图片,比如画直线和填充矩形等等。immutable image实际上就是图片在内存里面的表示,有点像VC中的Bitmap,用GTK+中实现的话,当然首选GdkPixbuf了。
里面最重要的函数要数gxpport_decodeimmutable_from_selfidentifying了,这个函数用来加载图片数据到一个immutable image对象中,,由于图片数据已经读入到内存中了,为了简单起见,我们把它写回到临时文件里,临时文件系统是用内存来模拟的,所以对性能的影响也是不会太大。实现如下:
得到文件格式:
err = imgdcd_image_get_info(srcBuffer, (unsigned int)length, &format, &w, &h);
加载图片到GdkPixbuf中:
对于jpg、png和gif文件,我们用下列方法加载:
pixbuf = gdk_pixbuf_load_from_data("jpg", (const char*)srcBuffer, length); pixbuf = gdk_pixbuf_load_from_data("png", (const char*)srcBuffer, length); pixbuf = gdk_pixbuf_load_from_data("gif", (const char*)srcBuffer, length);
gdk_pixbuf_load_from_data的实现就是先把文件写入临时文件,再调用gdk_pixbuf_new_from_file加载文件到GdkPixbuf中。
对于RAW的数据,调用gdk_pixbuf_new_from_data加载。
另就是要检查资源限制:
w = gdk_pixbuf_get_width(pixbuf); h = gdk_pixbuf_get_height(pixbuf); res_size = w * h * 4; if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, res_size) == 0) { g_object_unref(G_OBJECT(pixbuf)); *creationErrorPtr = IMG_NATIVE_IMAGE_RESOURCE_LIMIT; return; } *creationErrorPtr = IMG_NATIVE_IMAGE_NO_ERROR; midpIncResourceCount(RSC_TYPE_IMAGE_IMMUT, res_size);
如果虚拟机所用的资源超过指定值时,释放GdkPixbuf并返回错误RESOURCE_LIMIT。
其它函数实现就更简单了:
gxpport_createimmutable_from_immutableregion 调用gdk_pixbuf_new_subpixbuf从pixbuf上拷贝一块数据,再根据transform做些转换。
gxpport_decodeimmutable_from_argb 调用gdk_pixbuf_new_from_data生成pixbuf对象。
gxpport_get_immutable_argb 把pixbuf中的数据转换成argb格式的buffer。
gxpport_destroy_immutable 调用g_object_unref就行了。
gxpport_decodeimmutable_to_platformbuffer 原样保存就好了。
gxpport_loadimmutable_from_platformbuffer 调用gxpport_decodeimmutable_from_selfidentifying加载数据。
Share
Tags
Recent Posts
Most Viewed
- 系统程序员成长计划写作提纲 - 19,605 views
- Android IPC机制详解 - 6,277 views
- 系统程序员成长计划-走近专业程序员(上) - 6,253 views
- 系统程序员成长计划-写得又快又好的秘诀(一) - 5,391 views
- 系统程序员成长计划-背景知识 - 5,070 views
- i++循环与i–循环的执行效率 - 4,712 views
- 系统程序员成长计划-Write once, run anywhere(WORA)(上) - 4,700 views
- 系统程序员成长计划-走近专业程序员(下) - 4,254 views
- Linux下的调试工具 - 4,017 views
- Advanced Linux Sound Architecture (ALSA) 研究笔记 - 4,017 views
- 系统程序员成长计划-序 - 3,985 views
- 系统程序员成长计划-写得又快又好的秘诀(三) - 3,930 views
- 中国人与自由软件文化研究(搞笑版) - 3,735 views
- Android中的MessageQueue,Handler,Looper和Thread - 3,686 views
- 答复:我不会OOO,仍然可以XXX - 3,658 views
Categories
- Android (28)
- Broncho-A1-Hack (6)
- DirectFB (7)
- FTK(嵌入式GUI) (24)
- GTK+ (29)
- KVM hack notes (8)
- Linux Mobile (65)
- Management (5)
- Mozilla (9)
- Open Source (5)
- Programming (34)
- Tools (9)
- Uncategorized (23)
- Win32 (3)
- X Windows (31)
- 沉思录 (29)
- 系统程序员成长计划 (67)
Blogroll
gallery
Linux guru
推荐网站
Recent Comments
- Dig on 嵌入式GUI FTK设计与实现-事件源(FtkSource)
- 用心生活每一天 » GNU gprof: linux profiling tools 使用 on gcc profiling的工作原理
- JavaScript for: i++ vs i–-传播、沟通、分享-一直“有你” on i++循环与i–循环的执行效率
- Frankly Law on 嵌入式GUI FTK介绍(11)-交叉编译
- tracing on Linux下的调试工具
- ndljsn on FTK移植指南(初稿)
- tracing on 爬塘朗山
- tracing on GTK+(基于DirectFB)的字体处理
- Kely on 系统程序员成长计划写作提纲
- tracing on 爬塘朗山



December 1st, 2008