summaryrefslogtreecommitdiffstats
path: root/firmware/font.c
diff options
context:
space:
mode:
authorFred Bauer <fred.w.bauer@gmail.com>2011-10-14 20:35:52 +0000
committerFred Bauer <fred.w.bauer@gmail.com>2011-10-14 20:35:52 +0000
commitde3e2e7efc982b316227c96dcab57293922b1e26 (patch)
treebdb1f17018daedc44b9b0eb6fd84de5cf264d739 /firmware/font.c
parent14ae2591d95c715f66f422105fb99247e944f5ac (diff)
downloadrockbox-de3e2e7efc982b316227c96dcab57293922b1e26.tar.gz
rockbox-de3e2e7efc982b316227c96dcab57293922b1e26.tar.bz2
rockbox-de3e2e7efc982b316227c96dcab57293922b1e26.zip
Remove font_reset() which tried to fetch font *pfs from uninitiaized buflib_allocations. Change handle locking to track number of locks applied. Remove some duplicated code from internal_load_font()
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30752 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/font.c')
-rw-r--r--firmware/font.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/firmware/font.c b/firmware/font.c
index dfc8abacb7..577fb8af81 100644
--- a/firmware/font.c
+++ b/firmware/font.c
@@ -77,7 +77,7 @@ extern struct font sysfont;
struct buflib_alloc_data {
struct font font;
- bool handle_locked; /* is the buflib handle currently locked? */
+ int handle_locks; /* is the buflib handle currently locked? */
int refcount; /* how many times has this font been loaded? */
unsigned char buffer[];
};
@@ -90,7 +90,7 @@ static int buflibmove_callback(int handle, void* current, void* new)
struct buflib_alloc_data *alloc = (struct buflib_alloc_data*)current;
ptrdiff_t diff = new - current;
- if (alloc->handle_locked)
+ if (alloc->handle_locks > 0)
return BUFLIB_CB_CANNOT_MOVE;
#define UPDATE(x) if (x) { x = PTR_ADD(x, diff); }
@@ -111,7 +111,10 @@ static int buflibmove_callback(int handle, void* current, void* new)
static void lock_font_handle(int handle, bool lock)
{
struct buflib_alloc_data *alloc = core_get_data(handle);
- alloc->handle_locked = lock;
+ if ( lock )
+ alloc->handle_locks++;
+ else
+ alloc->handle_locks--;
}
static struct buflib_callbacks buflibops = {buflibmove_callback, NULL };
@@ -342,15 +345,6 @@ static struct font* font_load_cached(struct font* pf)
return pf;
}
-static void font_reset(int font_id)
-{
- struct font *pf = pf_from_handle(buflib_allocations[font_id]);
- // fixme
- memset(pf, 0, sizeof(struct font));
- pf->fd = -1;
-}
-
-
static bool internal_load_font(int font_id, const char *path,
char *buf, size_t buf_size,
int handle
@@ -358,13 +352,6 @@ static bool internal_load_font(int font_id, const char *path,
{
size_t size;
struct font* pf = pf_from_handle(handle);
- /* save loaded glyphs */
- glyph_cache_save(pf);
- /* Close font file handle */
- if (pf->fd >= 0)
- close(pf->fd);
-
- font_reset(font_id);
/* open and read entire font file*/
pf->fd = open(path, O_RDONLY|O_BINARY);
@@ -455,8 +442,7 @@ static int alloc_and_init(int font_idx, const char* name, size_t size)
return handle;
pdata = core_get_data(handle);
pf = &pdata->font;
- font_reset(font_idx);
- pdata->handle_locked = false;
+ pdata->handle_locks = 0;
pdata->refcount = 1;
pf->buffer_position = pf->buffer_start = buffer_from_handle(handle);
pf->buffer_size = size;