diff options
| author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-02-14 06:26:16 +0000 |
|---|---|---|
| committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-02-14 06:26:16 +0000 |
| commit | 1c2aa35371aed8d895b3448dad865b913da57cfb (patch) | |
| tree | 8a790ad8efe5d0abd73eaf77adc854d336ce0ef4 /apps/gui | |
| parent | ed21ab1c8c9b16ec62933313c3d36a93d9255f62 (diff) | |
| download | rockbox-1c2aa35371aed8d895b3448dad865b913da57cfb.zip rockbox-1c2aa35371aed8d895b3448dad865b913da57cfb.tar.gz rockbox-1c2aa35371aed8d895b3448dad865b913da57cfb.tar.bz2 rockbox-1c2aa35371aed8d895b3448dad865b913da57cfb.tar.xz | |
FS#10984 - multifont! 2 major additions:
1) seperate UI font for the remote and main displays
2) allow individual skins to load additional fonts for use in the skin (Uo to 7 extra in this first version) see CustomWPS for info on how to load a font in the skins.
Code should always use FONT_UI+screen_number to get the correct user font
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24644 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui')
| -rw-r--r-- | apps/gui/skin_engine/skin_fonts.c | 139 | ||||
| -rw-r--r-- | apps/gui/skin_engine/skin_fonts.h | 46 | ||||
| -rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 40 | ||||
| -rw-r--r-- | apps/gui/statusbar-skinned.c | 4 | ||||
| -rw-r--r-- | apps/gui/viewport.c | 16 |
5 files changed, 237 insertions, 8 deletions
diff --git a/apps/gui/skin_engine/skin_fonts.c b/apps/gui/skin_engine/skin_fonts.c new file mode 100644 index 0000000..1d3ef84 --- /dev/null +++ b/apps/gui/skin_engine/skin_fonts.c @@ -0,0 +1,139 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: skin_tokens.c 24526 2010-02-05 23:58:53Z jdgordon $ + * + * Copyright (C) 2010 Jonathan Gordon + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "file.h" +#include "settings.h" +#include "font.h" +#include "skin_buffer.h" +#include "skin_fonts.h" +#define FONT_SIZE 10000 + + +static struct skin_font { + struct font font; + int font_id; + char name[MAX_PATH]; + char *buffer; + int ref_count; /* how many times has this font been loaded? */ +} font_table[MAXUSERFONTS]; + +/* need this to know if we should be closing font fd's on the next init */ +static bool first_load = true; + +void skin_font_init(void) +{ + int i; + for(i=0;i<MAXUSERFONTS;i++) + { + if (!first_load) + font_unload(font_table[i].font_id); + font_table[i].font_id = -1; + font_table[i].name[0] = '\0'; + font_table[i].buffer = NULL; + font_table[i].ref_count = 0; + } +} + +/* load a font into the skin buffer. return the font id. */ +int skin_font_load(char* font_name) +{ + int i; + struct font *pf; + struct skin_font *font = NULL; + char filename[MAX_PATH]; + + if (!strcmp(font_name, global_settings.font_file)) + return FONT_UI; +#ifdef HAVE_REMOTE_LCD + if (!strcmp(font_name, global_settings.remote_font_file)) + return FONT_UI_REMOTE; +#endif + for(i=0;i<MAXUSERFONTS;i++) + { + if (font_table[i].font_id >= 0 && !strcmp(font_table[i].name, font_name)) + { + font_table[i].ref_count++; + return font_table[i].font_id; + } + else if (!font && font_table[i].font_id == -1) + { + font = &font_table[i]; + } + } + if (!font) + return -1; /* too many fonts loaded */ + + pf = &font->font; + if (!font->buffer) + { + pf->buffer_start = skin_buffer_alloc(FONT_SIZE); + if (!pf->buffer_start) + return -1; + font->buffer = pf->buffer_start; + } + else + { + pf->buffer_start = font->buffer; + } + pf->buffer_size = FONT_SIZE; + + snprintf(filename, MAX_PATH, FONT_DIR "/%s.fnt", font_name); + strcpy(font->name, font_name); + + pf->fd = -1; + font->font_id = font_load(pf, filename); + + if (font->font_id < 0) + return -1; + font->ref_count = 1; + + return font->font_id; +} + +/* unload a skin font. If a font has been loaded more than once it wont actually + * be unloaded untill all references have been unloaded */ +void skin_font_unload(int font_id) +{ + int i; + for(i=0;i<MAXUSERFONTS;i++) + { + if (font_table[i].font_id == font_id) + { + if (--font_table[i].ref_count == 0) + { + font_unload(font_id); + font_table[i].font_id = -1; + font_table[i].name[0] = '\0'; + } + return; + } + } +} + + + + + diff --git a/apps/gui/skin_engine/skin_fonts.h b/apps/gui/skin_engine/skin_fonts.h new file mode 100644 index 0000000..3b43012 --- /dev/null +++ b/apps/gui/skin_engine/skin_fonts.h @@ -0,0 +1,46 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: skin_tokens.c 24526 2010-02-05 23:58:53Z jdgordon $ + * + * Copyright (C) 2010 Jonathan Gordon + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "file.h" +#include "settings.h" +#include "font.h" +#include "skin_buffer.h" + +#ifndef _SKINFONTS_H_ +#define _SKINFONTS_H_ + +#define MAXUSERFONTS (MAXFONTS - SYSTEMFONTCOUNT) + +void skin_font_init(void); + +/* load a font into the skin buffer. return the font id. */ +int skin_font_load(char* font_name); + +/* unload a skin font. If a font has been loaded more than once it wont actually + * be unloaded untill all references have been unloaded */ +void skin_font_unload(int font_id); + +#endif diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 4655bf0..034ff53 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -52,6 +52,7 @@ #include "skin_engine.h" #include "settings.h" #include "settings_list.h" +#include "skin_fonts.h" #ifdef HAVE_LCD_BITMAP #include "bmp.h" @@ -157,6 +158,8 @@ static int parse_image_display(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); static int parse_image_load(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); +static int parse_font_load(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data); #endif /*HAVE_LCD_BITMAP */ #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) static int parse_image_special(const char *wps_bufptr, @@ -353,6 +356,7 @@ static const struct wps_tag all_tags[] = { parse_image_display }, { WPS_TOKEN_IMAGE_DISPLAY, "x", 0, parse_image_load }, + { WPS_NO_TOKEN, "Fl", 0, parse_font_load }, #ifdef HAVE_ALBUMART { WPS_NO_TOKEN, "Cl", 0, parse_albumart_load }, { WPS_TOKEN_ALBUMART_DISPLAY, "C", WPS_REFRESH_STATIC, parse_albumart_display }, @@ -688,6 +692,39 @@ static int parse_image_load(const char *wps_bufptr, return skip_end_of_line(wps_bufptr); } +static int font_ids[MAXUSERFONTS]; +static int parse_font_load(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data) +{ + (void)wps_data; (void)token; + const char *ptr = wps_bufptr; + int id; + char *filename, buf[MAX_PATH]; + + if (*ptr != '|') + return WPS_ERROR_INVALID_PARAM; + + ptr++; + + if (!(ptr = parse_list("ds", NULL, '|', ptr, &id, &filename))) + return WPS_ERROR_INVALID_PARAM; + + /* Check there is a terminating | */ + if (*ptr != '|') + return WPS_ERROR_INVALID_PARAM; + + if (id <= FONT_UI || id >= MAXFONTS-1) + return WPS_ERROR_INVALID_PARAM; + id -= SYSTEMFONTCOUNT; + + memcpy(buf, filename, ptr-filename); + buf[ptr-filename] = '\0'; + font_ids[id] = skin_font_load(buf); + + return font_ids[id] >= 0 ? skip_end_of_line(wps_bufptr) : WPS_ERROR_INVALID_PARAM; +} + + static int parse_viewport_display(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data) @@ -890,7 +927,8 @@ static int parse_viewport(const char *wps_bufptr, else vp->flags &= ~VP_FLAG_ALIGN_RIGHT; /* ignore right-to-left languages */ - + if (vp->font >= SYSTEMFONTCOUNT) + vp->font = font_ids[vp->font - SYSTEMFONTCOUNT]; struct skin_token_list *list = new_skin_token_list_item(NULL, skin_vp); if (!list) diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c index 9d447f6..fac6756 100644 --- a/apps/gui/statusbar-skinned.c +++ b/apps/gui/statusbar-skinned.c @@ -32,6 +32,7 @@ #include "statusbar.h" #include "statusbar-skinned.h" #include "debug.h" +#include "font.h" /* currently only one wps_state is needed */ @@ -183,7 +184,8 @@ void sb_create_from_settings(enum screen_type screen) default: height = screens[screen].lcdheight; } - len = snprintf(ptr, remaining, "%%ax%%Vi|0|%d|-|%d|1|-|-|\n", y, height); + len = snprintf(ptr, remaining, "%%ax%%Vi|0|%d|-|%d|%d|-|-|\n", + y, height, FONT_UI + screen); } sb_skin_data_load(screen, buf, false); } diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c index eaee2cc..ee233b9 100644 --- a/apps/gui/viewport.c +++ b/apps/gui/viewport.c @@ -315,7 +315,7 @@ void viewport_set_fullscreen(struct viewport *vp, #ifndef __PCTOOL__ set_default_align_flags(vp); #endif - vp->font = FONT_UI; /* default to UI to discourage SYSFONT use */ + vp->font = FONT_UI + screen; /* default to UI to discourage SYSFONT use */ vp->drawmode = DRMODE_SOLID; #if LCD_DEPTH > 1 #ifdef HAVE_REMOTE_LCD @@ -453,11 +453,15 @@ const char* viewport_parse_viewport(struct viewport *vp, return NULL; } - /* Default to using the user font if the font was an invalid number or '-'*/ - if (((vp->font != FONT_SYSFIXED) && (vp->font != FONT_UI)) - || !LIST_VALUE_PARSED(set, PL_FONT) - ) - vp->font = FONT_UI; + /* Default to using the user font if the font was an invalid number or '-' + * font 1 is *always* the UI font for the current screen + * 2 is always the first extra font */ + if (!LIST_VALUE_PARSED(set, PL_FONT)) + vp->font = FONT_UI + screen; +#ifdef HAVE_REMOTE_LCD + else if (vp->font == FONT_UI && screen == SCREEN_REMOTE) + vp->font = FONT_UI_REMOTE; +#endif /* Set the defaults for fields not user-specified */ vp->drawmode = DRMODE_SOLID; |