From 8a0152bd4ae638c1fe4917b855fcb9fc6a15202c Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sun, 10 Oct 2010 23:15:05 +0000 Subject: Two new lcd/multi screen api convinience functions: draw_viewport(), fill_viewport(). They work as the drawrect/fillrect pendants but work on a viewport basis; pass NULL to draw the current viewport (the one set with set_viewport()). In conjunction with action_get_touchscreen_press_in_vp() it should be less of a pain to draw buttons and get presses on them. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28239 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/buttonbar.c | 5 +++-- apps/gui/splash.c | 4 ++-- apps/gui/statusbar.c | 2 +- apps/plugins/lib/pluginlib_touchscreen.c | 16 +++++++++------- apps/screen_access.c | 4 ++++ apps/screen_access.h | 4 ++-- firmware/drivers/lcd-bitmap-common.c | 22 ++++++++++++++++++++++ firmware/export/lcd-remote.h | 2 ++ firmware/export/lcd.h | 2 ++ 9 files changed, 47 insertions(+), 14 deletions(-) diff --git a/apps/gui/buttonbar.c b/apps/gui/buttonbar.c index 84d49464c0..db94362352 100644 --- a/apps/gui/buttonbar.c +++ b/apps/gui/buttonbar.c @@ -66,16 +66,17 @@ static void gui_buttonbar_draw_button(struct gui_buttonbar * buttonbar, int num) struct viewport vp = bb_vp[display->screen_type]; button_width = display->lcdwidth/BUTTONBAR_MAX_BUTTONS; - vp.width = button_width; + vp.width = button_width-1; vp.x = button_width * num; display->set_viewport(&vp); - display->fillrect(0, 0, button_width - 1, vp.height); + display->fill_viewport(NULL); if(buttonbar->caption[num][0] != 0) { display->getstringsize(buttonbar->caption[num], &fw, &fh); display->putsxy((button_width - fw)/2, (vp.height-fh)/2, buttonbar->caption[num]); } + display->set_viewport(NULL); } void gui_buttonbar_set(struct gui_buttonbar * buttonbar, diff --git a/apps/gui/splash.c b/apps/gui/splash.c index 10dee12052..8c5f57fdd9 100644 --- a/apps/gui/splash.c +++ b/apps/gui/splash.c @@ -163,7 +163,7 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) #endif vp.drawmode = (DRMODE_SOLID|DRMODE_INVERSEVID); - screen->fillrect(0, 0, vp.width, vp.height); + screen->fill_viewport(NULL); #if LCD_DEPTH > 1 if (screen->depth > 1) @@ -174,7 +174,7 @@ static void splash_internal(struct screen * screen, const char *fmt, va_list ap) #endif vp.drawmode = DRMODE_SOLID; - screen->drawrect(0, 0, vp.width, vp.height); + screen->draw_viewport(NULL); /* prepare putting the text */ y = RECT_SPACING; diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c index 73ccfa7762..a05a11a502 100644 --- a/apps/gui/statusbar.c +++ b/apps/gui/statusbar.c @@ -280,7 +280,7 @@ void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw, struct vi { display->set_viewport(vp); display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - display->fillrect(0, 0, display->getwidth(), STATUSBAR_HEIGHT); + display->fill_viewport(NULL); display->set_drawmode(DRMODE_SOLID); if (bar->info.battery_state) diff --git a/apps/plugins/lib/pluginlib_touchscreen.c b/apps/plugins/lib/pluginlib_touchscreen.c index 1e1bf8d3c2..3920b8ec18 100644 --- a/apps/plugins/lib/pluginlib_touchscreen.c +++ b/apps/plugins/lib/pluginlib_touchscreen.c @@ -88,7 +88,8 @@ void touchbutton_draw(struct touchbutton *data, int num_buttons) { int i; /* These store the width and height of the title offset */ int title_width, title_height; - + struct screen *lcd = rb->screens[SCREEN_MAIN]; + /* Loop over all the elements in data */ for(i=0; iscreens[SCREEN_MAIN]->set_viewport(&data[i].vp); + lcd->set_viewport(&data[i].vp); /* Get the string size so that the title can be centered. */ - rb->lcd_getstringsize(data[i].title, &title_width, &title_height); + lcd->getstringsize(data[i].title, &title_width, &title_height); /* Center the title vertically */ title_height=(data[i].vp.height-title_height)/2; @@ -121,16 +122,17 @@ void touchbutton_draw(struct touchbutton *data, int num_buttons) { * print the title. */ if(title_width==0) { - rb->lcd_puts_scroll(0, 0, data[i].title); + lcd->puts_scroll_style_xyoffset(0, 0, data[i].title, + STYLE_DEFAULT, 0, title_height); } else { - rb->lcd_putsxy(title_width, title_height, data[i].title); + lcd->putsxy(title_width, title_height, data[i].title); } /* Draw bounding box around the button location. */ - rb->lcd_drawrect( 0, 0, data[i].vp.width, data[i].vp.height); + lcd->draw_viewport(NULL); } } - rb->screens[SCREEN_MAIN]->set_viewport(NULL); /* Go back to the default viewport */ + lcd->set_viewport(NULL); /* Go back to the default viewport */ } /******************************************************************************* diff --git a/apps/screen_access.c b/apps/screen_access.c index d059547402..e828feafc1 100644 --- a/apps/screen_access.c +++ b/apps/screen_access.c @@ -162,6 +162,8 @@ struct screen screens[NB_SCREENS] = .update_viewport_rect=&lcd_update_viewport_rect, .fillrect=&lcd_fillrect, .drawrect=&lcd_drawrect, + .draw_viewport=&lcd_draw_viewport, + .fill_viewport=&lcd_fill_viewport, .drawpixel=&lcd_drawpixel, .drawline=&lcd_drawline, .vline=&lcd_vline, @@ -253,6 +255,8 @@ struct screen screens[NB_SCREENS] = .update_viewport_rect=&lcd_remote_update_viewport_rect, .fillrect=&lcd_remote_fillrect, .drawrect=&lcd_remote_drawrect, + .draw_viewport=&lcd_remote_draw_viewport, + .fill_viewport=&lcd_remote_fill_viewport, .drawpixel=&lcd_remote_drawpixel, .drawline=&lcd_remote_drawline, .vline=&lcd_remote_vline, diff --git a/apps/screen_access.h b/apps/screen_access.h index a154d20195..fb7aa7bd26 100644 --- a/apps/screen_access.h +++ b/apps/screen_access.h @@ -117,6 +117,8 @@ struct screen void (*update_viewport_rect)(int x, int y, int width, int height); void (*fillrect)(int x, int y, int width, int height); void (*drawrect)(int x, int y, int width, int height); + void (*fill_viewport)(const struct viewport *vp); + void (*draw_viewport)(const struct viewport *vp); void (*drawpixel)(int x, int y); void (*drawline)(int x1, int y1, int x2, int y2); void (*vline)(int x, int y1, int y2); @@ -139,8 +141,6 @@ struct screen void (*puts_scroll)(int x, int y, const unsigned char *string); void (*puts_scroll_offset)(int x, int y, const unsigned char *string, int x_offset); - void (*puts_scroll_xyoffset)(int x, int y, const unsigned char *string, - int x_offset, int y_offset); void (*scroll_speed)(int speed); void (*scroll_delay)(int ms); void (*stop_scroll)(void); diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c index 2ce11e3398..d242096138 100644 --- a/firmware/drivers/lcd-bitmap-common.c +++ b/firmware/drivers/lcd-bitmap-common.c @@ -81,6 +81,28 @@ static void lcd_gradient_rect(int x1, int x2, int y, unsigned h, } #endif +/* + * draws the borders of the viewport, or of current_vp if vp == NULL + **/ +void LCDFN(draw_viewport)(const struct viewport *vp) +{ + if (vp == NULL) + LCDFN(drawrect)(0, 0, current_vp->width, current_vp->height); + else + LCDFN(drawrect)(vp->x, vp->y, vp->width, vp->height); +} + +/* + * fills the rectangle formed by vp or by current_vp if vp == NULL + **/ +void LCDFN(fill_viewport)(const struct viewport *vp) +{ + if (vp == NULL) + LCDFN(fillrect)(0, 0, current_vp->width, current_vp->height); + else + LCDFN(fillrect)(vp->x, vp->y, vp->width, vp->height); +} + /* put a string at a given pixel position, skipping first ofs pixel columns */ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) { diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h index 93b2968033..894d35ca11 100644 --- a/firmware/export/lcd-remote.h +++ b/firmware/export/lcd-remote.h @@ -178,6 +178,8 @@ extern void lcd_remote_hline(int x1, int x2, int y); extern void lcd_remote_vline(int x, int y1, int y2); extern void lcd_remote_drawrect(int x, int y, int width, int height); extern void lcd_remote_fillrect(int x, int y, int width, int height); +extern void lcd_remote_draw_viewport(const struct viewport *vp); +extern void lcd_remote_fill_viewport(const struct viewport *vp); extern void lcd_remote_bitmap_part(const fb_remote_data *src, int src_x, int src_y, int stride, int x, int y, int width, int height); diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index 54a2f3c511..6dab8f4cad 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h @@ -507,6 +507,8 @@ extern void lcd_hline(int x1, int x2, int y); extern void lcd_vline(int x, int y1, int y2); extern void lcd_drawrect(int x, int y, int width, int height); extern void lcd_fillrect(int x, int y, int width, int height); +extern void lcd_draw_viewport(const struct viewport *vp); +extern void lcd_fill_viewport(const struct viewport *vp); extern void lcd_bitmap_part(const fb_data *src, int src_x, int src_y, int stride, int x, int y, int width, int height); extern void lcd_bitmap(const fb_data *src, int x, int y, int width, -- cgit