Faster cached font loading. FS#12333
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30769 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
afc42ff793
commit
8c9017211e
3 changed files with 39 additions and 5 deletions
|
@ -100,6 +100,8 @@ struct font {
|
||||||
|
|
||||||
/* file, buffer and cache management */
|
/* file, buffer and cache management */
|
||||||
int fd; /* fd for the font file. >= 0 if cached */
|
int fd; /* fd for the font file. >= 0 if cached */
|
||||||
|
int fd_width; /* fd for the font file. >= 0 if cached */
|
||||||
|
int fd_offset; /* fd for the font file. >= 0 if cached */
|
||||||
unsigned char *buffer_start; /* buffer to store the font in */
|
unsigned char *buffer_start; /* buffer to store the font in */
|
||||||
unsigned char *buffer_position; /* position in the buffer */
|
unsigned char *buffer_position; /* position in the buffer */
|
||||||
unsigned char *buffer_end; /* end of the buffer */
|
unsigned char *buffer_end; /* end of the buffer */
|
||||||
|
|
|
@ -394,7 +394,22 @@ static bool internal_load_font(int font_id, const char *path, char *buf,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Cheat to get sector cache for different parts of font *
|
||||||
|
* file while preloading glyphs. Without this the disk head *
|
||||||
|
* thrashes between the width, offset, and bitmap data *
|
||||||
|
* in glyph_cache_load(). */
|
||||||
|
pf->fd_width = open(path, O_RDONLY|O_BINARY);
|
||||||
|
pf->fd_offset = open(path, O_RDONLY|O_BINARY);
|
||||||
|
|
||||||
glyph_cache_load(font_id);
|
glyph_cache_load(font_id);
|
||||||
|
|
||||||
|
if(pf->fd_width >= 0)
|
||||||
|
close(pf->fd_width);
|
||||||
|
pf->fd_width = -1;
|
||||||
|
|
||||||
|
if(pf->fd_offset >= 0)
|
||||||
|
close(pf->fd_offset);
|
||||||
|
pf->fd_offset = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -402,6 +417,8 @@ static bool internal_load_font(int font_id, const char *path, char *buf,
|
||||||
pf->buffer_end = pf->buffer_position + size;
|
pf->buffer_end = pf->buffer_position + size;
|
||||||
close(pf->fd);
|
close(pf->fd);
|
||||||
pf->fd = -1;
|
pf->fd = -1;
|
||||||
|
pf->fd_width = -1;
|
||||||
|
pf->fd_offset = -1;
|
||||||
|
|
||||||
if (!font_load_header(pf))
|
if (!font_load_header(pf))
|
||||||
{
|
{
|
||||||
|
@ -451,6 +468,8 @@ static int alloc_and_init(int font_idx, const char* name, size_t size)
|
||||||
pdata->refcount = 1;
|
pdata->refcount = 1;
|
||||||
pf->buffer_position = pf->buffer_start = buffer_from_handle(handle);
|
pf->buffer_position = pf->buffer_start = buffer_from_handle(handle);
|
||||||
pf->buffer_size = size;
|
pf->buffer_size = size;
|
||||||
|
pf->fd_width = -1;
|
||||||
|
pf->fd_offset = -1;
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,14 +658,20 @@ load_cache_entry(struct font_cache_entry* p, void* callback_data)
|
||||||
int handle = pf_to_handle(pf);
|
int handle = pf_to_handle(pf);
|
||||||
unsigned short char_code = p->_char_code;
|
unsigned short char_code = p->_char_code;
|
||||||
unsigned char tmp[2];
|
unsigned char tmp[2];
|
||||||
|
int fd;
|
||||||
|
|
||||||
if (handle > 0)
|
if (handle > 0)
|
||||||
lock_font_handle(handle, true);
|
lock_font_handle(handle, true);
|
||||||
if (pf->file_width_offset)
|
if (pf->file_width_offset)
|
||||||
{
|
{
|
||||||
int width_offset = pf->file_width_offset + char_code;
|
int width_offset = pf->file_width_offset + char_code;
|
||||||
lseek(pf->fd, width_offset, SEEK_SET);
|
/* load via different fd to get this file section cached */
|
||||||
read(pf->fd, &(p->width), 1);
|
if(pf->fd_width >=0 )
|
||||||
|
fd = pf->fd_width;
|
||||||
|
else
|
||||||
|
fd = pf->fd;
|
||||||
|
lseek(fd, width_offset, SEEK_SET);
|
||||||
|
read(fd, &(p->width), 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -658,11 +683,16 @@ load_cache_entry(struct font_cache_entry* p, void* callback_data)
|
||||||
if (pf->file_offset_offset)
|
if (pf->file_offset_offset)
|
||||||
{
|
{
|
||||||
int32_t offset = pf->file_offset_offset + char_code * (pf->long_offset ? sizeof(int32_t) : sizeof(int16_t));
|
int32_t offset = pf->file_offset_offset + char_code * (pf->long_offset ? sizeof(int32_t) : sizeof(int16_t));
|
||||||
lseek(pf->fd, offset, SEEK_SET);
|
/* load via different fd to get this file section cached */
|
||||||
read (pf->fd, tmp, 2);
|
if(pf->fd_offset >=0 )
|
||||||
|
fd = pf->fd_offset;
|
||||||
|
else
|
||||||
|
fd = pf->fd;
|
||||||
|
lseek(fd, offset, SEEK_SET);
|
||||||
|
read (fd, tmp, 2);
|
||||||
bitmap_offset = tmp[0] | (tmp[1] << 8);
|
bitmap_offset = tmp[0] | (tmp[1] << 8);
|
||||||
if (pf->long_offset) {
|
if (pf->long_offset) {
|
||||||
read (pf->fd, tmp, 2);
|
read (fd, tmp, 2);
|
||||||
bitmap_offset |= (tmp[0] << 16) | (tmp[1] << 24);
|
bitmap_offset |= (tmp[0] << 16) | (tmp[1] << 24);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1401,6 +1401,8 @@ int gen_c_source(struct font* pf, char *path)
|
||||||
" %d, /* defaultchar */\n"
|
" %d, /* defaultchar */\n"
|
||||||
" %d, /* bits_size */\n"
|
" %d, /* bits_size */\n"
|
||||||
" -1, /* font fd */\n"
|
" -1, /* font fd */\n"
|
||||||
|
" -1, /* font fd width */\n"
|
||||||
|
" -1, /* font fd offset */\n"
|
||||||
" 0, /* buffer start */\n"
|
" 0, /* buffer start */\n"
|
||||||
" 0, /* ^ position */\n"
|
" 0, /* ^ position */\n"
|
||||||
" 0, /* ^ end */\n"
|
" 0, /* ^ end */\n"
|
||||||
|
|
Loading…
Reference in a new issue