在初始化過程裡,會顯示一個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 }