From 9a70c42241c70e57bbe739f45d254c67bacc83e7 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sun, 13 Nov 2011 15:37:16 +0000 Subject: Add the ability to create a prefilled struct bitmap along with generated images. This allows to directly draw generated and builtin images using lcd_bmp(bm_xxx); Also fixes builtin list icons on non-mono targets, as they didn't have the format field set. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30971 a1c6a512-1295-4272-9138-f99709370657 --- apps/bitmaps/bitmaps.make | 8 +++---- apps/gui/icon.c | 20 +++++------------ apps/gui/usb_screen.c | 18 +++++++-------- apps/misc.c | 6 ++--- apps/plugins/bitmaps/pluginbitmaps.make | 8 +++---- bootloader/show_logo.c | 4 ++-- tools/bmp2rb.c | 39 +++++++++++++++++++++++++++++---- 7 files changed, 61 insertions(+), 42 deletions(-) diff --git a/apps/bitmaps/bitmaps.make b/apps/bitmaps/bitmaps.make index 945ca82ce0..159c31b64f 100644 --- a/apps/bitmaps/bitmaps.make +++ b/apps/bitmaps/bitmaps.make @@ -36,16 +36,16 @@ $(BMPHFILES): $(BMPOBJ) # pattern rules to create .c files from .bmp, one for each subdir: $(BUILDDIR)/apps/bitmaps/mono/%.c: $(ROOTDIR)/apps/bitmaps/mono/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(BMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ $(BUILDDIR)/apps/bitmaps/native/%.c: $(ROOTDIR)/apps/bitmaps/native/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(BMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ $(BUILDDIR)/apps/bitmaps/remote_mono/%.c: $(ROOTDIR)/apps/bitmaps/remote_mono/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(BMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ $(BUILDDIR)/apps/bitmaps/remote_native/%.c: $(ROOTDIR)/apps/bitmaps/remote_native/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(BMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ diff --git a/apps/gui/icon.c b/apps/gui/icon.c index 5684ff057c..a9075b1b0f 100644 --- a/apps/gui/icon.c +++ b/apps/gui/icon.c @@ -44,19 +44,11 @@ /* We dont actually do anything with these pointers, but they need to be grouped like this to save code so storing them as void* is ok. (stops compile warning) */ -static const struct bitmap inbuilt_iconset[NB_SCREENS] = +static const struct bitmap *inbuilt_iconset[NB_SCREENS] = { - { - .width = BMPWIDTH_default_icons, - .height = BMPHEIGHT_default_icons, - .data = (unsigned char*)default_icons, - }, + &bm_default_icons, #if defined(HAVE_REMOTE_LCD) && (NB_SCREENS > 1) - { - .width = BMPWIDTH_remote_default_icons, - .height = BMPHEIGHT_remote_default_icons, - .data = (unsigned char*)remote_default_icons, - }, + &bm_remote_default_icons, #endif }; @@ -74,11 +66,11 @@ struct iconset { } iconsets[Iconset_Count][NB_SCREENS]; #define ICON_HEIGHT(screen) (!iconsets[Iconset_user][screen].loaded ? \ - inbuilt_iconset[screen] : iconsets[Iconset_user][screen].bmp).height \ + (*(inbuilt_iconset[screen])) : iconsets[Iconset_user][screen].bmp).height \ / Icon_Last_Themeable #define ICON_WIDTH(screen) (!iconsets[Iconset_user][screen].loaded ? \ - inbuilt_iconset[screen] : iconsets[Iconset_user][screen].bmp).width + (*(inbuilt_iconset[screen])) : iconsets[Iconset_user][screen].bmp).width /* x,y in letters, not pixles */ void screen_put_icon(struct screen * display, @@ -140,7 +132,7 @@ void screen_put_iconxy(struct screen * display, } else { - iconset = &inbuilt_iconset[screen]; + iconset = inbuilt_iconset[screen]; } /* add some left padding to the icons if they are on the edge */ if (xpos == 0) diff --git a/apps/gui/usb_screen.c b/apps/gui/usb_screen.c index 2b7d47209b..002f4557bb 100644 --- a/apps/gui/usb_screen.c +++ b/apps/gui/usb_screen.c @@ -184,6 +184,12 @@ static void usb_screen_fix_viewports(struct screen *screen, static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar) { + static const struct bitmap* logos[NB_SCREENS] = { + &bm_usblogo, +#ifdef HAVE_RE + &bm_remote_usblogo, +#endif + }; FOR_NB_SCREENS(i) { struct screen *screen = &screens[i]; @@ -200,17 +206,9 @@ static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar) #ifdef HAVE_LCD_BITMAP screen->set_viewport(logo); -#ifdef HAVE_REMOTE_LCD - if (i == SCREEN_REMOTE) - { - screen->bitmap(remote_usblogo, 0, 0, logo->width, - logo->height); - } - else -#endif + screen->bmp(logos[i], 0, 0); + if (i == SCREEN_MAIN) { - screen->transparent_bitmap(usblogo, 0, 0, logo->width, - logo->height); #ifdef USB_ENABLE_HID if (usb_hid) { diff --git a/apps/misc.c b/apps/misc.c index 72457cdbe7..271e4e1fd1 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -691,11 +691,9 @@ int show_logo( void ) lcd_getstringsize((unsigned char *)"A", &font_w, &font_h); lcd_putsxy((LCD_WIDTH/2) - ((strlen(version)*font_w)/2), 0, (unsigned char *)version); - lcd_bitmap(rockboxlogo, (LCD_WIDTH - BMPWIDTH_rockboxlogo) / 2, 16, - BMPWIDTH_rockboxlogo, BMPHEIGHT_rockboxlogo); + lcd_bmp(&bm_rockboxlogo, (LCD_WIDTH - BMPWIDTH_rockboxlogo) / 2, 16); #else - lcd_bitmap(rockboxlogo, (LCD_WIDTH - BMPWIDTH_rockboxlogo) / 2, 10, - BMPWIDTH_rockboxlogo, BMPHEIGHT_rockboxlogo); + lcd_bmp(&bm_rockboxlogo, (LCD_WIDTH - BMPWIDTH_rockboxlogo) / 2, 10); lcd_setfont(FONT_SYSFIXED); lcd_getstringsize((unsigned char *)"A", &font_w, &font_h); lcd_putsxy((LCD_WIDTH/2) - ((strlen(version)*font_w)/2), diff --git a/apps/plugins/bitmaps/pluginbitmaps.make b/apps/plugins/bitmaps/pluginbitmaps.make index f9b4adb033..85536ed3bb 100644 --- a/apps/plugins/bitmaps/pluginbitmaps.make +++ b/apps/plugins/bitmaps/pluginbitmaps.make @@ -43,18 +43,18 @@ $(PLUGINBITMAPLIB): $(PLUGIN_BITMAPS) # pattern rules to create .c files from .bmp, one for each subdir: $(BUILDDIR)/apps/plugins/bitmaps/mono/%.c: $(ROOTDIR)/apps/plugins/bitmaps/mono/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(PBMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ $(BUILDDIR)/apps/plugins/bitmaps/native/%.c: $(ROOTDIR)/apps/plugins/bitmaps/native/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(PBMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ $(BUILDDIR)/apps/plugins/bitmaps/remote_mono/%.c: $(ROOTDIR)/apps/plugins/bitmaps/remote_mono/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(PBMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ $(BUILDDIR)/apps/plugins/bitmaps/remote_native/%.c: $(ROOTDIR)/apps/plugins/bitmaps/remote_native/%.bmp $(TOOLSDIR)/bmp2rb $(SILENT)mkdir -p $(dir $@) $(PBMPINCDIR) - $(call PRINTS,BMP2RB $( $@ + $(call PRINTS,BMP2RB $( $@ endif diff --git a/bootloader/show_logo.c b/bootloader/show_logo.c index 4b52e94084..60481367d5 100644 --- a/bootloader/show_logo.c +++ b/bootloader/show_logo.c @@ -46,9 +46,9 @@ void show_logo( void ) /* The top 16 lines of the Sansa Clip screen are yellow, and the bottom 48 are blue, so we reverse the usual positioning */ lcd_putsxy(TEXT_XPOS, 0, BOOT_VERSION); - lcd_bitmap(rockboxlogo, 0, 16, BMPWIDTH_rockboxlogo, BMPHEIGHT_rockboxlogo); + lcd_bmp(&bm_rockboxlogo, 0, 16); #else - lcd_bitmap(rockboxlogo, 0, 10, BMPWIDTH_rockboxlogo, BMPHEIGHT_rockboxlogo); + lcd_bmp(&bm_rockboxlogo, 0, 10); lcd_putsxy(TEXT_XPOS, LCD_HEIGHT-SYSFONT_HEIGHT, BOOT_VERSION); #endif diff --git a/tools/bmp2rb.c b/tools/bmp2rb.c index f9f554a304..7fee1e6177 100644 --- a/tools/bmp2rb.c +++ b/tools/bmp2rb.c @@ -453,19 +453,21 @@ int transform_bitmap(const struct RGBQUAD *src, int width, int height, void generate_c_source(char *id, char* header_dir, int width, int height, const unsigned short *t_bitmap, int t_width, - int t_height, int t_depth) + int t_height, int t_depth, bool t_mono, bool create_bm) { FILE *f; FILE *fh; int i, a; char header_name[1024]; + bool have_header = header_dir && header_dir[0]; + create_bm = have_header && create_bm; if (!id || !id[0]) id = "bitmap"; f = stdout; - if (header_dir && header_dir[0]) + if (have_header) { snprintf(header_name,sizeof(header_name),"%s/%s.h",header_dir,id); fh = fopen(header_name,"w+"); @@ -484,6 +486,11 @@ void generate_c_source(char *id, char* header_dir, int width, int height, else fprintf(fh, "extern const unsigned short %s[];\n", id); + if (create_bm) + { + fprintf(f, "#include \"lcd.h\"\n"); + fprintf(fh, "extern const struct bitmap bm_%s;\n", id); + } fclose(fh); } else { fprintf(f, @@ -492,6 +499,10 @@ void generate_c_source(char *id, char* header_dir, int width, int height, id, height, id, width); } + if (create_bm) { + fprintf(f, "#include \"%s\"\n", header_name); + } + if (t_depth <= 8) fprintf(f, "const unsigned char %s[] = {\n", id); else @@ -511,7 +522,20 @@ void generate_c_source(char *id, char* header_dir, int width, int height, fprintf(f, "\n"); } - fprintf(f, "\n};\n"); + fprintf(f, "\n};\n\n"); + + if (create_bm) { + char format_line[] = " .format = FORMAT_NATIVE, \n"; + fprintf(f, "const struct bitmap bm_%s = { \n" + " .width = BMPWIDTH_%s, \n" + " .height = BMPHEIGHT_%s, \n" + "%s" + " .data = (unsigned char*)%s,\n" + "};\n", + id, id, id, + t_mono ? "" : format_line, + id); + } } void generate_raw_file(const unsigned short *t_bitmap, @@ -573,6 +597,7 @@ void print_usage(void) "\t-i Bitmap name (default is filename without extension)\n" "\t-h Create header file in /.h\n" "\t-a Show ascii picture of bitmap\n" + "\t-b Create bitmap struct along with pixel array\n" "\t-r Generate RAW file (little-endian)\n" "\t-f Generate destination format n, default = 0\n" "\t 0 Archos recorder, Ondio, Iriver H1x0 mono\n" @@ -601,6 +626,7 @@ int main(int argc, char **argv) int width, height; int t_width, t_height, t_depth; bool raw = false; + bool create_bm = false; for (i = 1;i < argc;i++) @@ -647,6 +673,10 @@ int main(int argc, char **argv) ascii = true; break; + case 'b': + create_bm = true; + break; + case 'r': /* Raw File */ raw = true; break; @@ -724,7 +754,8 @@ int main(int argc, char **argv) generate_raw_file(t_bitmap, t_width, t_height, t_depth); else generate_c_source(id, header_dir, width, height, t_bitmap, - t_width, t_height, t_depth); + t_width, t_height, t_depth, + format <= 1, create_bm); } return 0; -- cgit v1.2.3