diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c index 0a951ca..23f0deb 100755 --- a/apps/plugins/viewer.c +++ b/apps/plugins/viewer.c @@ -56,6 +56,7 @@ PLUGIN_HEADER * title_mode 1 * scroll_mode 1 * autoscroll_speed 1 + * font file path MAX_PATH * bookmark count 1 * [1st bookmark] * file_position 4 @@ -74,7 +75,7 @@ PLUGIN_HEADER /* temporary file */ #define SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp" -#define SETTINGS_HEADER "\x54\x56\x53\x31" /* header="TVS" version=1 */ +#define SETTINGS_HEADER "\x54\x56\x53\x32" /* header="TVS" version=2 */ #define SETTINGS_H_SIZE 4 #define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */ @@ -115,7 +116,7 @@ PLUGIN_HEADER #endif #endif -#define PREFERENCES_SIZE 11 +#define PREFERENCES_SIZE (11 + MAX_PATH) /* Out-Of-Bounds test for any pointer to data in the buffer */ #define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end) @@ -507,7 +508,8 @@ struct preferences { } scroll_mode; int autoscroll_speed; - + + unsigned char font[MAX_PATH]; }; struct preferences prefs; @@ -539,6 +541,7 @@ static unsigned char *next_line_ptr; static unsigned char *last_screen_top_ptr = NULL; #ifdef HAVE_LCD_BITMAP static struct font *pf; +static unsigned char sys_font[MAX_PATH]; #endif struct viewport vp; struct bookmark_info bookmarks[MAX_BOOKMARKS]; @@ -1407,15 +1410,28 @@ static void init_header_and_footer(void) last_screen_top_ptr = NULL; } +static void set_font(unsigned char *font) +{ + unsigned char buf[MAX_PATH]; + + if (font == NULL || *font == '\0') + rb->snprintf(buf, MAX_PATH, "%s/%s.fnt", FONT_DIR, sys_font); + else + rb->snprintf(buf, MAX_PATH, "%s/%s.fnt", FONT_DIR, font); + + pf = rb->font_load(buf); +} + #else #define init_need_scrollbar() #define init_header_and_footer() +#define set_font() #endif static bool viewer_init(void) { #ifdef HAVE_LCD_BITMAP - + rb->snprintf(sys_font, MAX_PATH, "%s", rb->global_settings->font_file); pf = rb->font_get(FONT_UI); draw_columns = display_columns = LCD_WIDTH; @@ -1567,9 +1583,11 @@ static void viewer_default_preferences(void) prefs.scroll_mode = PAGE; prefs.page_mode = NO_OVERLAP; prefs.scrollbar_mode = SB_OFF; + rb->memset(prefs.font, 0, MAX_PATH); #ifdef HAVE_LCD_BITMAP prefs.header_mode = HD_BOTH; prefs.footer_mode = FT_ON; + rb->snprintf(prefs.font, MAX_PATH, "%s", sys_font); #else prefs.header_mode = HD_OFF; prefs.footer_mode = FT_OFF; @@ -1598,7 +1616,8 @@ static bool viewer_read_preferences(int pfd) prefs.header_mode = *p++; prefs.footer_mode = *p++; prefs.scroll_mode = *p++; - prefs.autoscroll_speed = *p; + prefs.autoscroll_speed = *p++; + rb->memcpy(prefs.font, p, MAX_PATH); return true; } @@ -1618,7 +1637,8 @@ static bool viewer_write_preferences(int pfd) *p++ = prefs.header_mode; *p++ = prefs.footer_mode; *p++ = prefs.scroll_mode; - *p = prefs.autoscroll_speed; + *p++ = prefs.autoscroll_speed; + rb->memcpy(p, prefs.font, MAX_PATH); return (rb->write(pfd, buf, sizeof(buf)) == sizeof(buf)); } @@ -1792,6 +1812,7 @@ read_end: /* remember the current position */ start_position = file_pos + screen_top_ptr - buffer; + set_font(prefs.font); init_need_scrollbar(); init_header_and_footer(); } @@ -1962,6 +1983,7 @@ static void viewer_exit(void *parameter) rb->splash(HZ, "Can't save preference and bookmarks."); rb->close(fd); + set_font(sys_font); } static void calc_page(void) @@ -2177,6 +2199,94 @@ static bool footer_setting(void) return rb->set_option("Show Footer", &prefs.footer_mode, INT, names, 2, NULL); } + +static int font_comp(const void *a, const void *b) +{ + struct opt_items *pa; + struct opt_items *pb; + + pa = (struct opt_items *)a; + pb = (struct opt_items *)b; + + return rb->strcmp(pa->string, pb->string); +} + +static bool font_setting(void) +{ + int count = 0; + DIR *dir; + struct dirent *entry; + int i = 0; + int len; + int new_font = 0; + bool res; + int size = 0; + + dir = rb->opendir(FONT_DIR); + if (!dir) + { + rb->splash(HZ/2, "font dir does not access."); + return false; + } + + while (1) + { + entry = rb->readdir(dir); + + if (entry == NULL) + break; + + len = rb->strlen(entry->d_name); + if (len < 4 || rb->strcmp(entry->d_name + len-4, ".fnt")) + continue; + size += len-3; + count++; + } + rb->closedir(dir); + + struct opt_items names[count]; + unsigned char font_names[size]; + unsigned char *p = font_names; + + dir = rb->opendir(FONT_DIR); + if (!dir) + { + rb->splash(HZ/2, "font dir does not access."); + return false; + } + + while (1) + { + entry = rb->readdir(dir); + + if (entry == NULL) + break; + + len = rb->strlen(entry->d_name); + if (len < 4 || rb->strcmp(entry->d_name + len-4, ".fnt")) + continue; + + rb->snprintf(p, len-3, "%s", entry->d_name); + names[i].string = p; + names[i].voice_id = -1; + if (!rb->strcmp(p, prefs.font)) + new_font = i; + + p += len-3; + i++; + } + rb->closedir(dir); + + rb->qsort(names, count, sizeof(struct opt_items), font_comp); + + res = rb->set_option("Select Font", &new_font, INT, + names, count, NULL); + + rb->memset(prefs.font, 0, MAX_PATH); + rb->snprintf(prefs.font, MAX_PATH, "%s", names[new_font].string); + + return res; +} #endif static bool autoscroll_speed_setting(void) @@ -2201,6 +2311,7 @@ static bool viewer_options_menu(void) {"Overlap Pages", page_mode_setting }, {"Show Header", header_setting }, {"Show Footer", footer_setting }, + {"Font", font_setting }, #endif {"Scroll Mode", scroll_mode_setting}, {"Auto-Scroll Speed", autoscroll_speed_setting }, @@ -2216,12 +2327,14 @@ static bool viewer_options_menu(void) if (rb->memcmp(&tmp_prefs, &prefs, sizeof(struct preferences))) { + set_font(prefs.font); + /* Show-scrollbar mode for current view-width mode */ init_need_scrollbar(); - init_header_and_footer(); - calc_page(); + + set_font(sys_font); } return result; @@ -2238,6 +2351,7 @@ static void viewer_menu(void) {"Return", NULL }, }; + set_font(sys_font); m = menu_init(items, sizeof(items) / sizeof(*items), NULL, NULL, NULL, NULL); result=menu_show(m); switch (result) @@ -2257,6 +2371,8 @@ static void viewer_menu(void) break; } menu_exit(m); + if (!done) + set_font(prefs.font); viewer_draw(col); }