From 04a015dde0f7edfe5ee913dc8cc6c1395dc9a419 Mon Sep 17 00:00:00 2001 From: Fred Bauer Date: Fri, 21 Oct 2011 18:05:52 +0000 Subject: Provide font_lock(). Font_get_bits() or ..width() may have to read glyph cache misses from disk so provide a means to lock the buflib memory during the wait. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30814 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-bitmap-common.c | 2 ++ firmware/export/font.h | 1 + firmware/font.c | 10 ++++++++++ 3 files changed, 13 insertions(+) diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c index 8d95825858..fb49deb76b 100644 --- a/firmware/drivers/lcd-bitmap-common.c +++ b/firmware/drivers/lcd-bitmap-common.c @@ -101,6 +101,7 @@ void LCDFN(fill_viewport)(void) static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) { unsigned short *ucs; + font_lock(current_vp->font, true); struct font* pf = font_get(current_vp->font); int vp_flags = current_vp->flags; int rtl_next_non_diac_width, last_non_diacritic_width; @@ -233,6 +234,7 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) } } } + font_lock(current_vp->font, false); } /* put a string at a given pixel position */ diff --git a/firmware/export/font.h b/firmware/export/font.h index 02476c17ff..914d3aa2ff 100644 --- a/firmware/export/font.h +++ b/firmware/export/font.h @@ -123,6 +123,7 @@ int font_load_ex(const char *path, size_t buffer_size); int font_glyphs_to_bufsize(const char *path, int glyphs); void font_unload(int font_id); void font_unload_all(void); +void font_lock(int font_id, bool lock); struct font* font_get(int font); diff --git a/firmware/font.c b/firmware/font.c index 943f2e2d06..6a9a68357f 100644 --- a/firmware/font.c +++ b/firmware/font.c @@ -124,6 +124,14 @@ static void lock_font_handle(int handle, bool lock) alloc->handle_locks--; } +void font_lock(int font_id, bool lock) +{ + if( font_id == FONT_SYSFIXED ) + return; + if( buflib_allocations[font_id] >= 0 ) + lock_font_handle(buflib_allocations[font_id], lock); +} + static struct buflib_callbacks buflibops = {buflibmove_callback, NULL }; static inline struct font *pf_from_handle(int handle) @@ -1007,6 +1015,7 @@ int font_getstringsize(const unsigned char *str, int *w, int *h, int fontnumber) unsigned short ch; int width = 0; + font_lock( fontnumber, true ); for (str = utf8decode(str, &ch); ch != 0 ; str = utf8decode(str, &ch)) { if (is_diacritic(ch, NULL)) @@ -1019,6 +1028,7 @@ int font_getstringsize(const unsigned char *str, int *w, int *h, int fontnumber) *w = width; if ( h ) *h = pf->height; + font_lock( fontnumber, false ); return width; } -- cgit v1.2.3