diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c index 109b440..02d03dc 100755 --- a/apps/plugins/viewer.c +++ b/apps/plugins/viewer.c @@ -49,6 +49,7 @@ PLUGIN_HEADER * footer_mode 1 * scroll_mode 1 * autoscroll_speed 1 + * font name MAX_PATH * bookmark count 1 * [1st bookmark] * file_position 4 @@ -67,7 +68,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) */ @@ -109,7 +110,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) @@ -549,6 +550,8 @@ struct preferences { } scroll_mode; int autoscroll_speed; + + unsigned char font[MAX_PATH]; }; struct preferences prefs; @@ -580,6 +583,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 static int header_height = 0; static int footer_height = 0; @@ -1483,15 +1487,34 @@ 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); + + if (rb->font_load(pf, buf) < 0) + { + /* system font load. */ + rb->snprintf(buf, MAX_PATH, "%s/%s.fnt", FONT_DIR, sys_font); + rb->font_load(pf, buf); + rb->splash(HZ/2, "font load failed."); + } +} + #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; @@ -1631,9 +1654,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_BOTH; + rb->snprintf(prefs.font, MAX_PATH, "%s", sys_font); #else prefs.header_mode = HD_NONE; prefs.footer_mode = FT_NONE; @@ -1661,7 +1686,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; } @@ -1681,7 +1707,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)); } @@ -1857,6 +1884,8 @@ read_end: /* remember the current position */ start_position = file_pos + screen_top_ptr - buffer; + if (rb->strcmp(prefs.font, sys_font)) + set_font(prefs.font); init_need_scrollbar(); init_header_and_footer(); } @@ -2027,6 +2056,8 @@ static void viewer_exit(void *parameter) rb->splash(HZ, "Can't save preference and bookmarks."); rb->close(fd); + if (rb->strcmp(prefs.font, sys_font)) + set_font(sys_font); } static void calc_page(void) @@ -2240,6 +2271,107 @@ static bool footer_setting(void) return rb->set_option("Show Footer", &prefs.footer_mode, INT, names, 4, 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; + int old_font; + 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; + p += len-3; + i++; + if (i >= count) + break; + } + rb->closedir(dir); + + rb->qsort(names, count, sizeof(struct opt_items), font_comp); + + for (i = 0; i < count; i++) + { + if (!rb->strcmp(names[i].string, prefs.font)) + { + new_font = i; + break; + } + } + old_font = new_font; + + res = rb->set_option("Select Font", &new_font, INT, + names, count, NULL); + + if (new_font != old_font) + { + 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) @@ -2265,6 +2397,8 @@ MENUITEM_FUNCTION(header_item, 0, "Show Header", header_setting, NULL, NULL, Icon_NOICON); MENUITEM_FUNCTION(footer_item, 0, "Show Footer", footer_setting, NULL, NULL, Icon_NOICON); +MENUITEM_FUNCTION(font_item, 0, "Font", font_setting, + NULL, NULL, Icon_NOICON); #endif MENUITEM_FUNCTION(scroll_mode_item, 0, "Scroll Mode", scroll_mode_setting, NULL, NULL, Icon_NOICON); @@ -2273,7 +2407,7 @@ MENUITEM_FUNCTION(autoscroll_speed_item, 0, "Auto-Scroll Speed", MAKE_MENU(option_menu, "Viewer Options", NULL, Icon_NOICON, &encoding_item, &word_wrap_item, &line_mode_item, &view_mode_item, #ifdef HAVE_LCD_BITMAP - &scrollbar_item, &page_mode_item, &header_item, &footer_item, + &scrollbar_item, &page_mode_item, &header_item, &footer_item, &font_item, #endif &scroll_mode_item, &autoscroll_speed_item); @@ -2288,12 +2422,16 @@ static bool viewer_options_menu(void) if (rb->memcmp(&tmp_prefs, &prefs, sizeof(struct preferences))) { + if (rb->strcmp(prefs.font, sys_font)) + set_font(prefs.font); + /* Show-scrollbar mode for current view-width mode */ init_need_scrollbar(); - init_header_and_footer(); - calc_page(); + + if (rb->strcmp(prefs.font, sys_font)) + set_font(sys_font); } return result; } @@ -2301,6 +2439,10 @@ static bool viewer_options_menu(void) static void viewer_menu(void) { int result; + + if (rb->strcmp(prefs.font, sys_font)) + set_font(sys_font); + MENUITEM_STRINGLIST(menu, "Viewer Menu", NULL, "Return", "Viewer Options", "Show Playback Menu", "Quit"); @@ -2321,6 +2463,8 @@ static void viewer_menu(void) done = true; break; } + if (!done && rb->strcmp(prefs.font, sys_font)) + set_font(prefs.font); viewer_draw(col); }