2009-11-29 Vladimir Serbinenko <phcoder@gmail.com>
Optimise glyph lookup by Basic Multilingual Plane lookup array. * font/font.c (struct grub_font): New member 'bmp_idx'. (font_init): Initialise 'bmp_idx'. (load_font_index): Fill 'bmp_idx'. (find_glyph): Make inline. Use bmp_idx for BMP characters.
This commit is contained in:
commit
bed35bdac7
2 changed files with 33 additions and 2 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2009-11-29 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Optimise glyph lookup by Basic Multilingual Plane lookup array.
|
||||||
|
|
||||||
|
* font/font.c (struct grub_font): New member 'bmp_idx'.
|
||||||
|
(font_init): Initialise 'bmp_idx'.
|
||||||
|
(load_font_index): Fill 'bmp_idx'.
|
||||||
|
(find_glyph): Make inline. Use bmp_idx for BMP characters.
|
||||||
|
|
||||||
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* video/fb/video_fb.c (grub_video_fb_scroll): Optimise by avoiding
|
* video/fb/video_fb.c (grub_video_fb_scroll): Optimise by avoiding
|
||||||
|
|
26
font/font.c
26
font/font.c
|
@ -63,6 +63,7 @@ struct grub_font
|
||||||
short leading;
|
short leading;
|
||||||
grub_uint32_t num_chars;
|
grub_uint32_t num_chars;
|
||||||
struct char_index_entry *char_index;
|
struct char_index_entry *char_index;
|
||||||
|
grub_uint16_t *bmp_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Definition of font registry. */
|
/* Definition of font registry. */
|
||||||
|
@ -227,6 +228,7 @@ font_init (grub_font_t font)
|
||||||
font->descent = 0;
|
font->descent = 0;
|
||||||
font->num_chars = 0;
|
font->num_chars = 0;
|
||||||
font->char_index = 0;
|
font->char_index = 0;
|
||||||
|
font->bmp_idx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the next section in the file.
|
/* Open the next section in the file.
|
||||||
|
@ -320,6 +322,14 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
* sizeof (struct char_index_entry));
|
* sizeof (struct char_index_entry));
|
||||||
if (! font->char_index)
|
if (! font->char_index)
|
||||||
return 1;
|
return 1;
|
||||||
|
font->bmp_idx = grub_malloc (0x10000 * sizeof (grub_uint16_t));
|
||||||
|
if (! font->bmp_idx)
|
||||||
|
{
|
||||||
|
grub_free (font->char_index);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
grub_memset (font->bmp_idx, 0xff, 0x10000 * sizeof (grub_uint16_t));
|
||||||
|
|
||||||
|
|
||||||
#if FONT_DEBUG >= 2
|
#if FONT_DEBUG >= 2
|
||||||
grub_printf("num_chars=%d)\n", font->num_chars);
|
grub_printf("num_chars=%d)\n", font->num_chars);
|
||||||
|
@ -346,6 +356,9 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entry->code < 0x10000)
|
||||||
|
font->bmp_idx[entry->code] = i;
|
||||||
|
|
||||||
last_code = entry->code;
|
last_code = entry->code;
|
||||||
|
|
||||||
/* Read storage flags byte. */
|
/* Read storage flags byte. */
|
||||||
|
@ -641,7 +654,7 @@ read_be_int16 (grub_file_t file, grub_int16_t * value)
|
||||||
|
|
||||||
/* Return a pointer to the character index entry for the glyph corresponding to
|
/* Return a pointer to the character index entry for the glyph corresponding to
|
||||||
the codepoint CODE in the font FONT. If not found, return zero. */
|
the codepoint CODE in the font FONT. If not found, return zero. */
|
||||||
static struct char_index_entry *
|
static inline struct char_index_entry *
|
||||||
find_glyph (const grub_font_t font, grub_uint32_t code)
|
find_glyph (const grub_font_t font, grub_uint32_t code)
|
||||||
{
|
{
|
||||||
struct char_index_entry *table;
|
struct char_index_entry *table;
|
||||||
|
@ -649,8 +662,17 @@ find_glyph (const grub_font_t font, grub_uint32_t code)
|
||||||
grub_size_t hi;
|
grub_size_t hi;
|
||||||
grub_size_t mid;
|
grub_size_t mid;
|
||||||
|
|
||||||
/* Do a binary search in `char_index', which is ordered by code point. */
|
|
||||||
table = font->char_index;
|
table = font->char_index;
|
||||||
|
|
||||||
|
/* Use BMP index if possible. */
|
||||||
|
if (code < 0x10000)
|
||||||
|
{
|
||||||
|
if (font->bmp_idx[code] == 0xffff)
|
||||||
|
return 0;
|
||||||
|
return &table[font->bmp_idx[code]];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do a binary search in `char_index', which is ordered by code point. */
|
||||||
lo = 0;
|
lo = 0;
|
||||||
hi = font->num_chars - 1;
|
hi = font->num_chars - 1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue