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:
parent
ed21ab1c8c
commit
1c2aa35371
20 changed files with 643 additions and 205 deletions
139
apps/gui/skin_engine/skin_fonts.c
Normal file
139
apps/gui/skin_engine/skin_fonts.c
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
46
apps/gui/skin_engine/skin_fonts.h
Normal file
46
apps/gui/skin_engine/skin_fonts.h
Normal 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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue