summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2011-11-08 21:34:46 +0000
committerThomas Martitz <kugel@rockbox.org>2011-11-08 21:34:46 +0000
commit13209604c1512658e729d0bd9f1c54cf3e53568d (patch)
tree2787f9036b5c40cf79cd324f3d215bb9d48dd34a
parent6223ad266e556f5b8d749d5f4fe08e27385be66f (diff)
downloadrockbox-13209604c1512658e729d0bd9f1c54cf3e53568d.tar.gz
rockbox-13209604c1512658e729d0bd9f1c54cf3e53568d.tar.bz2
rockbox-13209604c1512658e729d0bd9f1c54cf3e53568d.zip
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
-rw-r--r--apps/gui/icon.c14
-rw-r--r--apps/gui/scrollbar.c13
-rw-r--r--apps/gui/skin_engine/skin_display.c58
-rw-r--r--apps/plugin.h4
-rw-r--r--apps/screen_access.c4
-rw-r--r--apps/screen_access.h3
-rw-r--r--firmware/drivers/lcd-16bit-common.c18
-rw-r--r--firmware/drivers/lcd-bitmap-common.c26
-rw-r--r--firmware/export/lcd-remote.h4
-rw-r--r--firmware/export/lcd.h3
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