Index: utils/wpseditor/libwps/src/lcd.c =================================================================== --- utils/wpseditor/libwps/src/lcd.c (revision 18437) +++ utils/wpseditor/libwps/src/lcd.c (working copy) @@ -51,6 +51,11 @@ } } +struct viewport* lcd_get_viewport(void) +{ + return current_vp; +} + void lcd_update_viewport(void) { //lcd_update_rect(current_vp->x, current_vp->y,current_vp->width, current_vp->height); Index: apps/screen_access.c =================================================================== --- apps/screen_access.c (revision 18437) +++ apps/screen_access.c (working copy) @@ -32,6 +32,55 @@ #include "screen_access.h" +/* some helper functions to calculate metrics on the fly */ +static int screen_helper_getcharwidth() +{ +#ifdef HAVE_LCD_BITMAP + return font_get(lcd_get_viewport()->font)->maxwidth; +#else + return 1; +#endif +} + +static int screen_helper_getcharheight() +{ +#ifdef HAVE_LCD_BITMAP + return font_get(lcd_get_viewport()->font)->height; +#else + return 1; +#endif +} + +static int screen_helper_getnblines(void) +{ + int height=screens[0].lcdheight; +#ifdef HAVE_LCD_BITMAP + if(global_settings.statusbar) + height -= STATUSBAR_HEIGHT; +#ifdef HAVE_BUTTONBAR + if(global_settings.buttonbar && display->has_buttonbar) + height -= BUTTONBAR_HEIGHT; +#endif +#endif + return height / screens[0].getcharheight(); +} + +#if NB_SCREENS == 2 +static int screen_helper_remote_getnblines(void) +{ + int height=screens[1].lcdheight; +#ifdef HAVE_LCD_BITMAP + if(global_settings.statusbar) + height -= STATUSBAR_HEIGHT; +#ifdef HAVE_BUTTONBAR + if(global_settings.buttonbar && screens[0].has_buttonbar) + height -= BUTTONBAR_HEIGHT; +#endif +#endif + return height / screens[1].getcharheight(); +} +#endif + struct screen screens[NB_SCREENS] = { { @@ -39,6 +88,7 @@ .lcdwidth=LCD_WIDTH, .lcdheight=LCD_HEIGHT, .depth=LCD_DEPTH, + .getnblines=&screen_helper_getnblines, #if defined(HAVE_LCD_COLOR) .is_color=true, #else @@ -47,11 +97,14 @@ #ifdef HAVE_LCD_BITMAP .pixel_format=LCD_PIXELFORMAT, #endif + .getcharwidth=screen_helper_getcharwidth, + .getcharheight=screen_helper_getcharheight, #if (CONFIG_LED == LED_VIRTUAL) .has_disk_led=false, #elif defined(HAVE_REMOTE_LCD) .has_disk_led=true, #endif + .get_viewport=&lcd_get_viewport, .set_viewport=&lcd_set_viewport, .getwidth=&lcd_getwidth, .getheight=&lcd_getheight, @@ -137,9 +190,11 @@ .lcdwidth=LCD_REMOTE_WIDTH, .lcdheight=LCD_REMOTE_HEIGHT, .depth=LCD_REMOTE_DEPTH, + .getnblines=&screen_helper_remote_getnblines, .is_color=false,/* No color remotes yet */ .pixel_format=LCD_REMOTE_PIXELFORMAT, .has_disk_led=false, + .get_viewport=&lcd_remote_get_viewport, .set_viewport=&lcd_remote_set_viewport, .getwidth=&lcd_remote_getwidth, .getheight=&lcd_remote_getheight, @@ -222,29 +277,5 @@ void screen_access_init(void) { - int i; - struct screen *display; - FOR_NB_SCREENS(i) - { - display = &screens[i]; -#ifdef HAVE_LCD_BITMAP - ((struct screen*)&screens[i])->setfont(FONT_UI); -#endif - - int height=display->lcdheight; -#ifdef HAVE_LCD_BITMAP - if(global_settings.statusbar) - height -= STATUSBAR_HEIGHT; -#ifdef HAVE_BUTTONBAR - if(global_settings.buttonbar && display->has_buttonbar) - height -= BUTTONBAR_HEIGHT; -#endif - display->getstringsize((unsigned char *)"A", &display->char_width, - &display->char_height); -#else - display->char_width = 1; - display->char_height = 1; -#endif - display->nb_lines = height / display->char_height; - } + /* to be removed? */ } Index: apps/screen_access.h =================================================================== --- apps/screen_access.h (revision 18437) +++ apps/screen_access.h (working copy) @@ -60,12 +60,12 @@ enum screen_type screen_type; int lcdwidth, lcdheight; int depth; - int nb_lines; + int (*getnblines)(void); #ifdef HAVE_LCD_BITMAP int pixel_format; #endif - int char_width; - int char_height; + int (*getcharwidth)(void); + int (*getcharheight)(void); bool is_color; #if (CONFIG_LED == LED_VIRTUAL) || defined(HAVE_REMOTE_LCD) bool has_disk_led; @@ -73,6 +73,7 @@ #ifdef HAVE_BUTTONBAR bool has_buttonbar; #endif + struct viewport* (*get_viewport)(void); void (*set_viewport)(struct viewport* vp); int (*getwidth)(void); int (*getheight)(void); Index: apps/onplay.c =================================================================== --- apps/onplay.c (revision 18437) +++ apps/onplay.c (working copy) @@ -674,8 +674,9 @@ int i; FOR_NB_SCREENS(i) { - show_busy_slider(&screens[i], 1, LCD_HEIGHT-2*screens[i].char_height, - LCD_WIDTH-2, 2*screens[i].char_height-1); + show_busy_slider(&screens[i], 1, + LCD_HEIGHT-2*screens[i].getcharheight(), + LCD_WIDTH-2, 2*screens[i].getcharheight()-1); screens[i].update(); } } Index: apps/gui/charcell/list.c =================================================================== --- apps/gui/charcell/list.c (revision 18437) +++ apps/gui/charcell/list.c (working copy) @@ -51,13 +51,13 @@ int i; int lines; int start, end; - + display->set_viewport(NULL); - lines = display->nb_lines; - + lines = display->getnblines(); + display->clear_display(); start = 0; - end = display->nb_lines; + end = display->getnblines(); gui_list->last_displayed_start_item[display->screen_type] = gui_list->start_item[display->screen_type]; Index: apps/gui/pitchscreen.c =================================================================== --- apps/gui/pitchscreen.c (revision 18437) +++ apps/gui/pitchscreen.c (working copy) @@ -60,12 +60,12 @@ display->clear_display(); - if (display->nb_lines < 4) /* very small screen, just show the pitch value */ + if (display->getnblines() < 4) /* very small screen, just show the pitch value */ { w = snprintf((char *)buf, sizeof(buf), "%s: %d.%d%%",str(LANG_PITCH), pitch / 10, pitch % 10 ); - display->putsxy((display->lcdwidth-(w*display->char_width))/2, - display->nb_lines/2,buf); + display->putsxy((display->lcdwidth-(w*display->getcharwidth()))/2, + display->getnblines()/2,buf); } else /* bigger screen, show everything... */ { Index: apps/gui/color_picker.c =================================================================== --- apps/gui/color_picker.c (revision 18437) +++ apps/gui/color_picker.c (working copy) @@ -158,11 +158,12 @@ enough to display the selected slider - calculate total height of display with three sliders present */ display_three_rows = - display->getheight() >= MARGIN_TOP + - display->char_height*4 + /* Title + 3 sliders */ - TITLE_MARGIN_BOTTOM + - SELECTOR_TB_MARGIN*6 + /* 2 margins/slider */ - MARGIN_BOTTOM; + display->getheight() >= + MARGIN_TOP + + display->getcharheight()*4 + /* Title + 3 sliders */ + TITLE_MARGIN_BOTTOM + + SELECTOR_TB_MARGIN*6 + /* 2 margins/slider */ + MARGIN_BOTTOM; /* Figure out widest label character in case they vary - this function assumes labels are one character */ @@ -185,8 +186,8 @@ slider_left = MARGIN_LEFT + SELECTOR_WIDTH + SELECTOR_LR_MARGIN + max_label_width + SLIDER_MARGIN_LEFT; slider_width = display->getwidth() - slider_left - SLIDER_MARGIN_RIGHT - - display->char_width*2 - SELECTOR_LR_MARGIN - SELECTOR_WIDTH - - MARGIN_RIGHT; + display->getcharwidth()*2 - SELECTOR_LR_MARGIN - + SELECTOR_WIDTH - MARGIN_RIGHT; for (i = 0; i < 3; i++) { @@ -209,7 +210,7 @@ display->fillrect(0, text_top - SELECTOR_TB_MARGIN, display->getwidth(), - display->char_height + + display->getcharheight() + SELECTOR_TB_MARGIN*2); if (display->depth < 16) @@ -221,7 +222,7 @@ else if (display_three_rows) { /* Draw "> <" around sliders */ - int top = text_top + (display->char_height - + int top = text_top + (display->getcharheight() - SELECTOR_HEIGHT) / 2; screen_put_iconxy(display, MARGIN_LEFT, top, Icon_Cursor); screen_put_iconxy(display, @@ -244,7 +245,7 @@ /* Draw label */ buf[0] = str(LANG_COLOR_RGB_LABELS)[i]; buf[1] = '\0'; - display->putsxy(slider_left - display->char_width - + display->putsxy(slider_left - display->getcharwidth() - SLIDER_MARGIN_LEFT, text_top, buf); /* Draw color value */ @@ -255,23 +256,23 @@ /* Draw scrollbar */ gui_scrollbar_draw(display, slider_left, - text_top + display->char_height / 4, + text_top + display->getcharheight() / 4, slider_width, - display->char_height / 2, + display->getcharheight() / 2, rgb_max[i], 0, rgb->rgb_val[i], sb_flags); /* Advance to next line */ - text_top += display->char_height + 2*SELECTOR_TB_MARGIN; + text_top += display->getcharheight() + 2*SELECTOR_TB_MARGIN; if (!display_three_rows) break; } /* end for */ - /* Draw color value in system font */ - display->setfont(FONT_SYSFIXED); + /* Draw color value in system font + display->setfont(FONT_SYSFIXED); */ /* Format RGB: #rrggbb */ snprintf(buf, sizeof(buf), str(LANG_COLOR_RGB_VALUE), @@ -287,7 +288,7 @@ int height = display->getheight() - top - MARGIN_BOTTOM; /* Only draw if room */ - if (height >= display->char_height + 2) + if (height >= display->getcharheight() + 2) { display->set_foreground(rgb->color); display->fillrect(left, top, width, height); @@ -357,19 +358,21 @@ max_label_width = x1; } /* Get slider positions and top starting position */ - text_top = MARGIN_TOP + display->char_height + TITLE_MARGIN_BOTTOM + SELECTOR_TB_MARGIN; + text_top = MARGIN_TOP + display->getcharheight() + TITLE_MARGIN_BOTTOM + + SELECTOR_TB_MARGIN; slider_left = MARGIN_LEFT + SELECTOR_WIDTH + SELECTOR_LR_MARGIN + max_label_width + SLIDER_MARGIN_LEFT; slider_width = display->getwidth() - slider_left - SLIDER_MARGIN_RIGHT - - display->char_width*2 - SELECTOR_LR_MARGIN - SELECTOR_WIDTH - - MARGIN_RIGHT; + display->getcharwidth()*2 - SELECTOR_LR_MARGIN - + SELECTOR_WIDTH - MARGIN_RIGHT; display_three_rows = - display->getheight() >= MARGIN_TOP + - display->char_height*4 + /* Title + 3 sliders */ - TITLE_MARGIN_BOTTOM + - SELECTOR_TB_MARGIN*6 + /* 2 margins/slider */ - MARGIN_BOTTOM; - if (y < MARGIN_TOP+display->char_height) + display->getheight() >= + MARGIN_TOP + + display->getcharheight()*4 + /* Title + 3 sliders */ + TITLE_MARGIN_BOTTOM + + SELECTOR_TB_MARGIN*6 + /* 2 margins/slider */ + MARGIN_BOTTOM; + if (y < MARGIN_TOP+display->getcharheight()) { if (button == BUTTON_REL) return ACTION_STD_CANCEL; Index: apps/gui/quickscreen.c =================================================================== --- apps/gui/quickscreen.c (revision 18437) +++ apps/gui/quickscreen.c (working copy) @@ -207,7 +207,7 @@ value = option_get_valuestring((struct settings_list*)qs->items[i], buf, MAX_PATH, temp); - if (vps[screen][i].height < display->char_height*2) + if (vps[screen][i].height < display->getcharheight()*2) { char text[MAX_PATH]; snprintf(text, MAX_PATH, "%s: %s", title, value); Index: apps/playlist_viewer.c =================================================================== --- apps/playlist_viewer.c (revision 18437) +++ apps/playlist_viewer.c (working copy) @@ -58,7 +58,7 @@ /* The number of items between the selected one and the end/start of * the buffer under which the buffer must reload */ -#define MIN_BUFFER_MARGIN (screens[0].nb_lines+1) +#define MIN_BUFFER_MARGIN (screens[0].getnblines()+1) /* Information about a specific track */ struct playlist_entry { @@ -182,7 +182,7 @@ { if(direction==FORWARD) { - int min_start=viewer.selected_track-2*screens[0].nb_lines; + int min_start=viewer.selected_track-2*screens[0].getnblines(); while(min_start<0) min_start+=viewer.num_tracks; min_start %= viewer.num_tracks; @@ -190,7 +190,7 @@ } else { - int max_start=viewer.selected_track+2*screens[0].nb_lines; + int max_start=viewer.selected_track+2*screens[0].getnblines(); max_start%=viewer.num_tracks; playlist_buffer_load_entries(pb, max_start, BACKWARD); } Index: firmware/export/lcd.h =================================================================== --- firmware/export/lcd.h (revision 18437) +++ firmware/export/lcd.h (working copy) @@ -110,6 +110,7 @@ extern int lcd_getstringsize(const unsigned char *str, int *w, int *h); extern void lcd_set_viewport(struct viewport* vp); +extern struct viewport* lcd_get_viewport(void); extern void lcd_update(void); extern void lcd_update_viewport(void); extern void lcd_clear_viewport(void); Index: firmware/export/lcd-remote.h =================================================================== --- firmware/export/lcd-remote.h (revision 18437) +++ firmware/export/lcd-remote.h (working copy) @@ -114,6 +114,7 @@ extern void lcd_remote_set_contrast(int val); extern void lcd_remote_set_viewport(struct viewport* vp); +extern struct viewport* lcd_remote_get_viewport(void); extern void lcd_remote_clear_display(void); extern void lcd_remote_clear_viewport(void); extern void lcd_remote_puts(int x, int y, const unsigned char *str); Index: firmware/drivers/lcd-charcell.c =================================================================== --- firmware/drivers/lcd-charcell.c (revision 18437) +++ firmware/drivers/lcd-charcell.c (working copy) @@ -67,6 +67,9 @@ /* LCD init */ void lcd_init (void) { + /* Initialise the viewport */ + lcd_set_viewport(NULL); + lcd_init_device(); lcd_charset_init(); memset(lcd_patterns, 0, sizeof(lcd_patterns)); @@ -85,6 +88,11 @@ current_vp = vp; } +struct viewport* lcd_get_viewport(void) +{ + return current_vp; +} + void lcd_update_viewport(void) { lcd_update(); @@ -103,14 +111,14 @@ } int lcd_getstringsize(const unsigned char *str, int *w, int *h) -{ +{ int width = utf8length(str); - + if (w) *w = width; if (h) *h = 1; - + return width; } Index: firmware/drivers/lcd-1bit-vert.c =================================================================== --- firmware/drivers/lcd-1bit-vert.c (revision 18437) +++ firmware/drivers/lcd-1bit-vert.c (working copy) @@ -72,6 +72,11 @@ current_vp = vp; } +struct viewport* LCDFN(get_viewport)(void) +{ + return current_vp; +} + void LCDFN(update_viewport)(void) { LCDFN(update_rect)(current_vp->x, current_vp->y, Index: firmware/drivers/lcd-2bit-vert.c =================================================================== --- firmware/drivers/lcd-2bit-vert.c (revision 18437) +++ firmware/drivers/lcd-2bit-vert.c (working copy) @@ -91,6 +91,11 @@ bg_pattern = 0x55 * (~current_vp->bg_pattern & 3); } +struct viewport* lcd_get_viewport(void) +{ + return current_vp; +} + void lcd_update_viewport(void) { lcd_update_rect(current_vp->x, current_vp->y, Index: firmware/drivers/lcd-2bit-vi.c =================================================================== --- firmware/drivers/lcd-2bit-vi.c (revision 18437) +++ firmware/drivers/lcd-2bit-vi.c (working copy) @@ -84,6 +84,11 @@ bg_pattern = patterns[current_vp->bg_pattern & 3]; } +struct viewport* LCDFN(get_viewport)(void) +{ + return current_vp; +} + void LCDFN(update_viewport)(void) { LCDFN(update_rect)(current_vp->x, current_vp->y, Index: firmware/drivers/lcd-16bit.c =================================================================== --- firmware/drivers/lcd-16bit.c (revision 18437) +++ firmware/drivers/lcd-16bit.c (working copy) @@ -115,6 +115,11 @@ current_vp = vp; } +struct viewport* lcd_get_viewport(void) +{ + return current_vp; +} + void lcd_update_viewport(void) { lcd_update_rect(current_vp->x, current_vp->y,