From 13209604c1512658e729d0bd9f1c54cf3e53568d Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Tue, 8 Nov 2011 21:34:46 +0000 Subject: Add new lcd_bmp and lcd_bmp_part APIs. This new APIs wrap around lcd_[mono|transparent]_bitmap/_part calls and handle all kinds bitmaps. The intended use is to draw bitmaps that come from read_bmp_fd/_file. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30936 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/icon.c | 14 +-------- apps/gui/scrollbar.c | 13 +------- apps/gui/skin_engine/skin_display.c | 58 +++++------------------------------- apps/plugin.h | 4 +-- apps/screen_access.c | 4 +++ apps/screen_access.h | 3 ++ firmware/drivers/lcd-16bit-common.c | 18 +++++++++++ firmware/drivers/lcd-bitmap-common.c | 26 ++++++++++++++++ firmware/export/lcd-remote.h | 4 ++- firmware/export/lcd.h | 3 ++ 10 files changed, 68 insertions(+), 79 deletions(-) diff --git a/apps/gui/icon.c b/apps/gui/icon.c index c171da5b44..4c006f947a 100644 --- a/apps/gui/icon.c +++ b/apps/gui/icon.c @@ -109,14 +109,11 @@ void screen_put_icon_with_offset(struct screen * display, void screen_put_iconxy(struct screen * display, int xpos, int ypos, enum themable_icons icon) { - const void *data; const int screen = display->screen_type; const int width = ICON_WIDTH(screen); const int height = ICON_HEIGHT(screen); const int is_rtl = lang_is_rtl(); - int stride; const struct bitmap *iconset; - screen_bitmap_part_func *draw_func = NULL; if (icon == Icon_NOICON) { @@ -145,9 +142,6 @@ void screen_put_iconxy(struct screen * display, { iconset = &inbuilt_iconset[screen]; } - data = iconset->data; - stride = STRIDE(display->screen_type, iconset->width, iconset->height); - /* add some left padding to the icons if they are on the edge */ if (xpos == 0) xpos++; @@ -155,14 +149,8 @@ void screen_put_iconxy(struct screen * display, if (is_rtl) xpos = display->getwidth() - xpos - width; -#if (LCD_DEPTH == 16) || defined(LCD_REMOTE_DEPTH) && (LCD_REMOTE_DEPTH == 16) - if (display->depth == 16) - draw_func = display->transparent_bitmap_part; - else -#endif - draw_func = display->bitmap_part; - draw_func(data, 0, height * icon, stride, xpos, ypos, width, height); + display->bmp_part(iconset, 0, height * icon, xpos, ypos, width, height); } void screen_put_cursorxy(struct screen * display, int x, int y, bool on) diff --git a/apps/gui/scrollbar.c b/apps/gui/scrollbar.c index 70d34176e1..aafd4b093a 100644 --- a/apps/gui/scrollbar.c +++ b/apps/gui/scrollbar.c @@ -234,18 +234,7 @@ void gui_bitmap_scrollbar_draw(struct screen * screen, struct bitmap *bm, int x, else if (bm->height < starty + height) height = bm->height - starty; -#if LCD_DEPTH > 1 - if (bm->format == FORMAT_MONO) -#endif - screen->mono_bitmap_part(bm->data, startx, starty, - bm->width, x, y, width, height); -#if LCD_DEPTH > 1 - else - screen->transparent_bitmap_part((fb_data *)bm->data, startx, starty, - STRIDE(screen->screen_type, - bm->width, bm->height), - x, y, width, height); -#endif + screen->bmp_part(bm, startx, starty, x, y, width, height); } void show_busy_slider(struct screen *s, int x, int y, int width, int height) diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 95e4310de9..d2dbb56f64 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -248,22 +248,8 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) if (pb->backdrop) { struct gui_img *img = pb->backdrop; - char *img_data = core_get_data(img->buflib_handle); -#if LCD_DEPTH > 1 - if(img->bm.format == FORMAT_MONO) { -#endif - display->mono_bitmap_part(img_data, - 0, 0, img->bm.width, - x, y, width, height); -#if LCD_DEPTH > 1 - } else { - display->transparent_bitmap_part((fb_data *)img_data, - 0, 0, - STRIDE(display->screen_type, - img->bm.width, img->bm.height), - x, y, width, height); - } -#endif + img->bm.data = core_get_data(img->buflib_handle); + display->bmp_part(&img->bm, 0, 0, x, y, width, height); flags |= DONT_CLEAR_EXCESS; } @@ -287,7 +273,7 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) int xoff = 0, yoff = 0; int w = width, h = height; struct gui_img *img = pb->slider; - char *img_data = core_get_data(img->buflib_handle); + img->bm.data = core_get_data(img->buflib_handle); if (flags&HORIZONTAL) { @@ -305,21 +291,7 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) yoff = height - yoff; yoff -= h / 2; } -#if LCD_DEPTH > 1 - if(img->bm.format == FORMAT_MONO) { -#endif - display->mono_bitmap_part(img_data, - 0, 0, img->bm.width, - x + xoff, y + yoff, w, h); -#if LCD_DEPTH > 1 - } else { - display->transparent_bitmap_part((fb_data *)img_data, - 0, 0, - STRIDE(display->screen_type, - img->bm.width, img->bm.height), - x + xoff, y + yoff, w, h); - } -#endif + display->bmp_part(&img->bm, 0, 0, x + xoff, y + yoff, w, h); } if (pb->type == SKIN_TOKEN_PROGRESSBAR) @@ -357,30 +329,14 @@ void clear_image_pos(struct gui_wps *gwps, struct gui_img *img) void wps_draw_image(struct gui_wps *gwps, struct gui_img *img, int subimage) { struct screen *display = gwps->display; - char *img_data = core_get_data(img->buflib_handle); + img->bm.data = core_get_data(img->buflib_handle); if(img->always_display) display->set_drawmode(DRMODE_FG); else display->set_drawmode(DRMODE_SOLID); -#if LCD_DEPTH > 1 - if(img->bm.format == FORMAT_MONO) { -#endif - display->mono_bitmap_part(img_data, - 0, img->subimage_height * subimage, - img->bm.width, img->x, - img->y, img->bm.width, - img->subimage_height); -#if LCD_DEPTH > 1 - } else { - display->transparent_bitmap_part((fb_data *)img_data, - 0, img->subimage_height * subimage, - STRIDE(display->screen_type, - img->bm.width, img->bm.height), - img->x, img->y, img->bm.width, - img->subimage_height); - } -#endif + display->bmp_part(&img->bm, 0, img->subimage_height * subimage, + img->x, img->y, img->bm.width, img->subimage_height); } diff --git a/apps/plugin.h b/apps/plugin.h index fa1259cfe3..0ee37bb4fe 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -147,12 +147,12 @@ void* plugin_get_buffer(size_t *buffer_size); #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 213 +#define PLUGIN_API_VERSION 214 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any new function which are "waiting" at the end of the function table) */ -#define PLUGIN_MIN_API_VERSION 213 +#define PLUGIN_MIN_API_VERSION 214 /* plugin return codes */ /* internal returns start at 0x100 to make exit(1..255) work */ diff --git a/apps/screen_access.c b/apps/screen_access.c index 19df13dbc3..b7dc90b5bd 100644 --- a/apps/screen_access.c +++ b/apps/screen_access.c @@ -197,6 +197,8 @@ struct screen screens[NB_SCREENS] = .transparent_bitmap=(screen_bitmap_func*)&lcd_bitmap_transparent, .transparent_bitmap_part=(screen_bitmap_part_func*)&lcd_bitmap_transparent_part, #endif + .bmp = &lcd_bmp, + .bmp_part = &lcd_bmp_part, #if LCD_DEPTH > 1 #if defined(HAVE_LCD_COLOR) && defined(LCD_REMOTE_DEPTH) && LCD_REMOTE_DEPTH > 1 .color_to_native=&lcd_color_to_native, @@ -296,6 +298,8 @@ struct screen screens[NB_SCREENS] = .transparent_bitmap_part=(screen_bitmap_part_func*)&lcd_remote_bitmap_part, /* No colour remotes yet */ #endif + .bmp = &lcd_remote_bmp, + .bmp_part = &lcd_remote_bmp_part, #if LCD_REMOTE_DEPTH > 1 #if defined(HAVE_LCD_COLOR) .color_to_native=&lcd_remote_color_to_native, diff --git a/apps/screen_access.h b/apps/screen_access.h index 04cc6f4f90..a9d1408898 100644 --- a/apps/screen_access.h +++ b/apps/screen_access.h @@ -97,6 +97,9 @@ struct screen int x, int y, int width, int height); void (*transparent_bitmap_part)(const void *src, int src_x, int src_y, int stride, int x, int y, int width, int height); + void (*bmp)(const struct bitmap *bm, int x, int y); + void (*bmp_part)(const struct bitmap* bm, int src_x, int src_y, + int x, int y, int width, int height); void (*set_drawmode)(int mode); #if defined(HAVE_LCD_COLOR) && defined(LCD_REMOTE_DEPTH) && LCD_REMOTE_DEPTH > 1 unsigned (*color_to_native)(unsigned color); diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index 1e1548e997..bbac2b295a 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c @@ -515,3 +515,21 @@ void ICODE_ATTR lcd_alpha_bitmap_part(const unsigned char *src, int src_x, #endif } while (--row); } + +/* Draw a partial bitmap (mono or native) including alpha channel */ +void ICODE_ATTR lcd_bmp_part(const struct bitmap* bm, int src_x, int src_y, + int x, int y, int width, int height) +{ + int bitmap_stride = STRIDE_MAIN(bm->width, bm->height); + if (bm->format == FORMAT_MONO) + lcd_mono_bitmap_part(bm->data, src_x, src_y, bitmap_stride, x, y, width, height); + else + lcd_bitmap_transparent_part((fb_data*)bm->data, + src_x, src_y, bitmap_stride, x, y, width, height); +} + +/* Draw a native bitmap with alpha channel */ +void ICODE_ATTR lcd_bmp(const struct bitmap *bmp, int x, int y) +{ + lcd_bmp_part(bmp, 0, 0, x, y, bmp->width, bmp->height); +} diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c index 878c08863b..3aa833d6a1 100644 --- a/firmware/drivers/lcd-bitmap-common.c +++ b/firmware/drivers/lcd-bitmap-common.c @@ -501,3 +501,29 @@ void LCDFN(puts_scroll_style_offset)(int x, int y, const unsigned char *string, { LCDFN(puts_scroll_style_xyoffset)(x, y, string, style, x_offset, 0); } + +#if !defined(HAVE_LCD_COLOR) || !defined(MAIN_LCD) +/* see lcd-16bit-common.c for others */ +#ifdef MAIN_LCD +#define THIS_STRIDE STRIDE_MAIN +#else +#define THIS_STRIDE STRIDE_REMOTE +#endif + +void LCDFN(bmp_part)(const struct bitmap* bm, int src_x, int src_y, + int x, int y, int width, int height) +{ + if (bm->format == FORMAT_MONO) + LCDFN(mono_bitmap_part)((FBFN(data)*)(bm->data), + src_x, src_y, THIS_STRIDE(bm->width, bm->height), x, y, width, height); + else + LCDFN(bitmap_part)((FBFN(data)*)(bm->data), + src_x, src_y, THIS_STRIDE(bm->width, bm->height), x, y, width, height); +} + +void LCDFN(bmp)(const struct bitmap* bm, int x, int y) +{ + LCDFN(bmp_part)(bm, 0, 0, x, y, bm->width, bm->height); +} + +#endif diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h index e2f2ab16ec..46ec2a949a 100644 --- a/firmware/export/lcd-remote.h +++ b/firmware/export/lcd-remote.h @@ -216,6 +216,8 @@ extern void lcd_bitmap_remote_transparent(const fb_remote_data *src, int x, #define lcd_remote_mono_bitmap lcd_remote_bitmap #define lcd_remote_mono_bitmap_part lcd_remote_bitmap_part #endif /* LCD_REMOTE_DEPTH */ - +extern void lcd_remote_bmp_part(const struct bitmap* bm, int src_x, int src_y, + int x, int y, int width, int height); +extern void lcd_remote_bmp(const struct bitmap* bm, int x, int y); #endif #endif /* __LCD_REMOTE_H__ */ diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index f4336233ab..47ea94bca9 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h @@ -543,6 +543,9 @@ extern void lcd_bitmap_transparent_part(const fb_data *src, int height); extern void lcd_bitmap_transparent(const fb_data *src, int x, int y, int width, int height); +extern void lcd_bmp_part(const struct bitmap* bm, int src_x, int src_y, + int x, int y, int width, int height); +extern void lcd_bmp(const struct bitmap* bm, int x, int y); #else /* LCD_DEPTH == 1 */ #define lcd_mono_bitmap lcd_bitmap #define lcd_mono_bitmap_part lcd_bitmap_part -- cgit v1.2.3