Android培訓班(22) – Android移動開發技術文章_手機開發 Android移動開發教學課程

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *