diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c index 3a4aecc..9560345 100755 --- a/apps/plugins/viewer.c +++ b/apps/plugins/viewer.c @@ -51,6 +51,7 @@ PLUGIN_HEADER * title_mode 1 * scroll_mode 1 * autoscroll_speed 1 + * font name MAX_PATH * bookmark count 1 * [1st bookmark] * file_position 4 @@ -69,7 +70,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) */ @@ -110,7 +111,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) @@ -502,7 +503,8 @@ struct preferences { } scroll_mode; int autoscroll_speed; - + + unsigned char font[MAX_PATH]; }; struct preferences prefs; @@ -534,6 +536,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]; @@ -1410,15 +1413,36 @@ 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); + + if (!pf) + { + /* system font load. */ + rb->snprintf(buf, MAX_PATH, "%s/%s.fnt", FONT_DIR, sys_font); + pf = rb->font_load(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; @@ -1558,9 +1582,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; @@ -1588,7 +1614,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; } @@ -1608,7 +1635,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)); } @@ -1784,6 +1812,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(); } @@ -1954,6 +1984,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) @@ -2165,6 +2197,107 @@ 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; + 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) @@ -2189,6 +2322,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 }, @@ -2204,12 +2338,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; @@ -2226,6 +2364,8 @@ static void viewer_menu(void) {"Return", NULL }, }; + if (rb->strcmp(prefs.font, sys_font)) + set_font(sys_font); m = menu_init(items, sizeof(items) / sizeof(*items), NULL, NULL, NULL, NULL); result=menu_show(m); switch (result) @@ -2245,6 +2385,8 @@ static void viewer_menu(void) break; } menu_exit(m); + if (!done && rb->strcmp(prefs.font, sys_font)) + set_font(prefs.font); viewer_draw(col); }