Index: apps/gui/skin_engine/skin_fonts.c =================================================================== --- apps/gui/skin_engine/skin_fonts.c (revision 30557) +++ apps/gui/skin_engine/skin_fonts.c (working copy) @@ -20,14 +20,10 @@ ****************************************************************************/ #include "config.h" -#include -#include -#include - +#include "core_alloc.h" #include "file.h" #include "settings.h" #include "font.h" -#include "skin_buffer.h" #include "skin_fonts.h" static struct skin_font_info { @@ -35,23 +31,59 @@ int font_id; char name[MAX_PATH]; char *buffer; + int buflib_handle; 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; +/* flag to prevent move of font structures while loading */ +static bool fonts_movable = false; +int buflib_move_callback(int handle, void* current, void* new) +{ + (void)handle; + struct font *pfont = (struct font*)current; + size_t diff = new - current; + + if( fonts_movable == false ) + return BUFLIB_CB_CANNOT_MOVE; + + pfont->bits += diff; + pfont->offset += diff; + + pfont->buffer_start += diff; + pfont->buffer_end += diff; + pfont->buffer_position += diff; + return BUFLIB_CB_OK; +} +static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL}; + void skin_font_init(void) { int i; for(i=0;i 0 ) + font_table[i].buflib_handle = core_free(font_table[i].buflib_handle); + font_table[i].name[0] = '\0'; + font_table[i].ref_count = 0; + } + } } first_load = false; } @@ -59,8 +91,9 @@ /* load a font into the skin buffer. return the font id. */ int skin_font_load(char* font_name, int glyphs) { - int i; + int i,selected=-1; int skin_font_size = 0; + struct font *pf; struct skin_font_info *font = NULL; char filename[MAX_PATH]; @@ -82,39 +115,40 @@ } else if (!font && font_table[i].font_id == -1) { - font = &font_table[i]; - strcpy(font_table[i].name, filename); + selected = i; + font = &font_table[selected]; + strcpy(font_table[selected].name, filename); } } if (!font) return -1; /* too many fonts loaded */ pf = &font->font; - if (!font->buffer) - { - if (!glyphs) - glyphs = GLYPHS_TO_CACHE; + + if (!glyphs) + glyphs = GLYPHS_TO_CACHE; #ifndef __PCTOOL__ - skin_font_size = font_glyphs_to_bufsize(filename, glyphs); + skin_font_size = font_glyphs_to_bufsize(filename, glyphs); #else - skin_font_size = 1; + skin_font_size = 1; #endif - if ( !skin_font_size ) - return -1; - pf->buffer_start = (char*)skin_buffer_alloc(skin_font_size); - if (!pf->buffer_start) - return -1; - font->buffer = pf->buffer_start; - pf->buffer_size = skin_font_size; - } - else - { - pf->buffer_start = font->buffer; - } + if ( !skin_font_size ) + return -1; + + /* don't move during setup */ + fonts_movable = false; + font_table[selected].buflib_handle = core_alloc_ex(font_name, skin_font_size, &buflib_ops); + if (font_table[selected].buflib_handle <= 0) + return -1; + + pf->buffer_start = core_get_data(font_table[selected].buflib_handle); + font->buffer = pf->buffer_start; + pf->buffer_size = skin_font_size; pf->fd = -1; font->font_id = font_load(pf, filename); - + fonts_movable = true; + if (font->font_id < 0) return -1; font->ref_count = 1; @@ -133,7 +167,11 @@ if (--font_table[i].ref_count == 0) { font_unload(font_id); + font_table[i].buffer = 0; font_table[i].font_id = -1; + /* this shouldn't need a test */ + if(font_table[i].buflib_handle > 0) + font_table[i].buflib_handle = core_free(font_table[i].buflib_handle); font_table[i].name[0] = '\0'; } return;