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 ", 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图片文件,由于android把LOGO图片加载到内存里,并且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 }
补充:移动开发 , Android ,