KJAVA虚拟机Hack笔记-实现immutableimage

本文介绍ImmutableImage的概念及如何使用GTK+中的GdkPixbuf加载不同格式的图片数据,包括jpg、png和gif等常见格式。同时,探讨了RAW数据的处理方式,并提供了资源限制检查的方法。
摘要由CSDN通过智能技术生成

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot 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加载数据。


欢迎到Linux mobile development上交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值