reader_mmi.c
上传用户:holyzs
上传日期:2022-06-29
资源大小:2335k
文件大小:6k
源码类别:

编辑器/阅读器

开发平台:

C/C++

  1. #include <reader_core.h>
  2. void reader_mmi_trigger_screen_update(screen_t screen) {
  3. #ifdef USE_DOUBLE_FRAME_BUFFER
  4.   trigger_screen_update(screen);
  5. #endif
  6. }
  7. void reader_mmi_fill_screen(screen_t screen, color_t color) {
  8.   fill_screen(screen, color);
  9. }
  10. void reader_mmi_fill_screen_trigger(screen_t screen, color_t color) {
  11.   fill_screen(screen, color);
  12.   trigger_screen_update(screen);
  13. }
  14. static int info_visible;
  15. int reader_info_visible(void) {
  16.   return info_visible;
  17. }
  18. void reader_set_info_visible(int v) {
  19.   info_visible = (v != 0);
  20. }
  21. int get_header_blank(int fs) {
  22.   switch (fs) {
  23.   case DEFAULT_FONT_SIZE:
  24.     return 3;
  25.   case 14:
  26.     return 2;
  27.   default:
  28.     assert(0);
  29.   }
  30.   //never reach here
  31.   return -1;
  32. }
  33. int reader_get_start_x(int fs) {
  34.   switch (fs) {
  35.   case DEFAULT_FONT_SIZE:
  36.     return 0;
  37.   case 14:
  38.     return 4;
  39.   default:
  40.     assert(0);
  41.   }
  42.   //never reach here
  43.   return -1;
  44. }
  45. unsigned short *reader_load_bmp(unsigned short *bmpfile) {
  46.   static unsigned short bmp_buf[READER_SCREEN_WIDTH*READER_SCREEN_HEIGHT];
  47.   static unsigned short last_access_file[READER_FILENAME_MAX];
  48.   fsal_file_handle_t fd = 0;
  49.   int len, nr;
  50.   void *p = NULL;
  51.   //try the last access cache
  52.   if (reader_wcscmp(bmpfile, last_access_file) == 0) {
  53.     return bmp_buf;
  54.   }
  55.   reader_wcscpy(last_access_file, bmpfile);
  56.   fd = fsal_open(bmpfile, "rb");
  57.   if (fd == 0) {
  58.     goto err;
  59.   }
  60.   fsal_seek(fd, 0, SEEK_END);
  61.   len = fsal_tell(fd);
  62.   fsal_rewind(fd);
  63.   p = malloc(len);
  64.   if (p == NULL) {
  65.     goto err;
  66.   }
  67.   nr = fsal_read(p, len, 1, fd);
  68.   if (nr != 1) {
  69.     goto err;
  70.   }
  71.   fsal_close(fd);
  72.   PA_LoadBmpToBuffer(bmp_buf, 0, 0, p, READER_SCREEN_HEIGHT);
  73.   free(p);
  74.   return bmp_buf;
  75. err:
  76.   if (fd != 0) {
  77.     fsal_close(fd);
  78.   }
  79.   if (p != NULL) {
  80.     free(p);
  81.   }
  82.   return NULL;
  83. }
  84. void reader_mmi_update_screen(screen_t screen, unsigned short *content, int page_number) {
  85.   page_t *page = reader_pages + page_number;
  86.   int i, j;
  87.   int lines;
  88.   int last_line_chars;
  89.   unsigned short page_number_str[16];
  90.   int fs = reader_get_font_size();
  91.   int header = get_header_blank(fs);
  92.   int max_line = reader_get_max_line(fs);
  93.   int start_x = reader_get_start_x(fs);
  94.   unsigned short *bmpbuf;
  95.   unsigned short pic_name[READER_FILENAME_MAX];
  96.   if (reader_option_bg_pic_enabled()) {
  97.     reader_full_pic_name(pic_name, reader_option_bg_pic());
  98.     if ((bmpbuf = reader_load_bmp(pic_name)) != NULL) {
  99.       fill_screen_bitmap(screen, bmpbuf);
  100.     } else {
  101.       //can not load bg pic
  102.       reader_option_disable_bg_pic();
  103.       fill_screen(screen, reader_bg_color);
  104.     }
  105.   } else {
  106.     fill_screen(screen, reader_bg_color);
  107.   }
  108.   if (page_number >= reader_total_pages) {
  109.     //erase screen anyway
  110. #ifdef USE_DOUBLE_FRAME_BUFFER
  111.     trigger_screen_update(screen);
  112. #endif
  113.     return;
  114.   }
  115.   content += page->page_offset;
  116.   if (page_number == reader_total_pages - 1) { //last page
  117.     lines = reader_last_page_lines;
  118.   } else {
  119.     lines = max_line;
  120.   }
  121.   if (! info_visible) {
  122.     header += 6;
  123.   }
  124.   for (i = 0; i < lines - 1; i++) {
  125.     reader_textout(screen, start_x, i * (fs + LINE_INTERVAL) + header, content + page->line_offest[i], page->line_offest[i + 1] - page->line_offest[i], fs);
  126.   }
  127.   if (page_number == reader_total_pages - 1) {
  128.     last_line_chars = reader_last_line_chars;
  129.   } else {
  130.     last_line_chars = reader_pages[page_number + 1].page_offset - (reader_pages[page_number].page_offset + page->line_offest[i]);
  131.   }
  132.   reader_textout(screen, start_x, i * (fs + LINE_INTERVAL) + header, content + page->line_offest[i], last_line_chars, fs);
  133.   if (info_visible) {
  134.     //show page number at the bottom line
  135.     page_number ++; //start from index 0, show from 1
  136.     if (page_number & 1) {
  137.       //show page number in left screen
  138.       if (page_number > reader_total_pages) {
  139.         page_number = reader_total_pages;
  140.       }
  141.       i = reader_itoa(page_number, page_number_str);
  142.       page_number_str[i ++] = '/';
  143.       j = reader_itoa(reader_total_pages, page_number_str + i);
  144.       assert(i + j < 12);
  145.       if (reader_get_layout()) {
  146.         //append compact layout flag
  147.         reader_wcsncpy(&page_number_str[i+j], READER_STR(compact_layout_flag), 3);
  148.         page_number_str[i + j + 3] = 0;
  149.       } else {
  150.         page_number_str[i + j] = 0;
  151.       }
  152.       reader_textout_ex(screen, 0, max_line * (fs + LINE_INTERVAL) + header, page_number_str, 16, fs, READER_COLOR_BLUE, 0);
  153.       i = reader_itoa(page_number * 100 / reader_total_pages, page_number_str);
  154.       page_number_str[i ++] = '%';
  155.       reader_textout_ex(screen, READER_SCREEN_WIDTH - 1, max_line * (fs + LINE_INTERVAL) + header, page_number_str, i, fs, READER_COLOR_BLUE, TEXT_OUT_ALIGN_RIGHT);
  156.     } else {
  157.       //show progress bar in right screen
  158.       int y1 = max_line * (fs + LINE_INTERVAL) + header + 6;
  159.       int x_cur = page_number * (READER_SCREEN_WIDTH - 5) / reader_total_pages;
  160.       reader_rectangle(screen, 0, y1, READER_SCREEN_WIDTH - 1, y1 + 3, READER_COLOR_BLUE, 1);
  161.       reader_rectangle(screen, x_cur, y1, x_cur + 3, y1 + 3, READER_COLOR_YELLOW, 1);
  162.     }
  163.   }
  164. #ifdef USE_DOUBLE_FRAME_BUFFER
  165.   trigger_screen_update(screen);
  166. #endif
  167. }
  168. int reader_current_page;
  169. int reader_turn_next_page() {
  170.   if (reader_current_page + 2 < reader_total_pages) {
  171.     reader_current_page += 2;
  172.     return 0;
  173.   }
  174.   return 1;
  175. }
  176. int reader_turn_prev_page() {
  177.   if (reader_current_page >= 2) {
  178.     reader_current_page -= 2;
  179.     return 0;
  180.   }
  181.   return 1;
  182. }
  183. int reader_turn_next_page10() {
  184.   int pg = reader_current_page;
  185.   pg += 10;
  186.   if (pg > reader_total_pages - 1) {
  187.     pg = (reader_total_pages - 1) / 2 * 2;
  188.   }
  189.   if (pg != reader_current_page) {
  190.     reader_current_page = pg;
  191.     return 0;
  192.   }
  193.   return 1;
  194. }
  195. int reader_turn_prev_page10() {
  196.   int pg = reader_current_page;
  197.   pg -= 10;
  198.   if (pg < 0) {
  199.     pg = 0;
  200.   }
  201.   if (pg != reader_current_page) {
  202.     reader_current_page = pg;
  203.     return 0;
  204.   }
  205.   return 1;
  206. }
  207. int reader_get_current_page() {
  208.   return reader_current_page;
  209. }
  210. int reader_set_current_page(int pg) {
  211.   unsigned int old = reader_current_page;
  212.   //page number must be even for dual screen
  213.   if (pg & 1) {
  214.     pg --;
  215.   }
  216.   reader_current_page = pg;
  217.   return old;
  218. }