Android培训班(22)

在初始化过程里,会显示一个LOGO图片,那么它是怎么实现显示这个图片的呢?它的代码如下:

#001 /* 565RLE image format: [count(2 bytes), rle(2 bytes)] */

#002

#003 int load_565rle_image(char *fn)

#004 {

这段代码是加载565RLE格式的LOGO图片,函数的参数是图片路径。

#005 struct FB fb;

#006 struct stat s;

#007 unsigned short *data, *bits, *ptr;

#008 unsigned count, max;

#009 int fd;

#010

#011 if (vt_set_mode(1))

#012 return -1;

这段代码是设置显示输出为图片模式。

#013

#014 fd = open(fn, O_RDONLY);

#015 if (fd < 0) {

#016 ERROR("cannot open '%s'/n", fn);

#017 goto fail_restore_text;

#018 }

这段代码是打开要显示的图片。

#019

#020 if (fstat(fd, &s) < 0) {

#021 goto fail_close_file;

#022 }

这段代码是获取打开文件的信息,比如文件的大小。

#023

#024 data = mmap(0, s.st_size, PROT_READ, MAP_SHARED, fd, 0);

#025 if (data == MAP_FAILED)

#026 goto fail_close_file;

这段代码是映射图片文件到内存。

#027

#028 if (fb_open(&fb))

#029 goto fail_unmap_data;

这段代码是打开显示缓存内存,以便把图片数据放到显示缓存里。

#030

#031 max = fb_width(&fb) * fb_height(&fb);

#032 ptr = data;

#033 count = s.st_size;

#034 bits = fb.bits;

#035 while (count > 3) {

#036 unsigned n = ptr[0];

#037 if (n > max)

#038 break;

#039 android_memset16(bits, ptr[1], n << 1);

#040 bits += n;

#041 max -= n;

#042 ptr += 2;

#043 count -= 4;

#044 }

这段代码是把图片数据填入显示缓存。

#045

#046 munmap(data, s.st_size);

#047 fb_update(&fb);

这段代码是更新显示缓存,并把LOGO显示出来。

#048 fb_close(&fb);

#049 close(fd);

#050 unlink(fn);

这段代码关闭上面打开的资源,并删除LOGO图片文件,由于androidLOGO图片加载到内存里,并且LOGO显示完成后,再没有作用了,及时回收资源。如果想不删除这个图片,就需要把这行代码删除掉,或者每次显示前动态地拷贝到这里。

#051 return 0;

#052

#053 fail_unmap_data:

#054 munmap(data, s.st_size);

#055 fail_close_file:

#056 close(fd);

#057 fail_restore_text:

#058 vt_set_mode(0);

#059 return -1;

这段代码是处理失败情况。

#060 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值