1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Jonathan Gordon 2010-02-14 06:26:16 +00:00
parent ed21ab1c8c
commit 1c2aa35371
20 changed files with 643 additions and 205 deletions

View file

@ -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;
}
}
}

View file

@ -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

View file

@ -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)

View file

@ -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);
}

View file

@ -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;