diff options
author | David E. Hollingsworth <deh@curl.com> | 2009-08-13 15:55:50 +0300 |
---|---|---|
committer | Tor Lillqvist <tml@iki.fi> | 2009-08-13 15:55:50 +0300 |
commit | ea608c0bd7721d3019bed7ef2472289b1ea6fa53 (patch) | |
tree | cfe86a154afca88cebdb117584c5afcfc70c1b8e /modules/basic | |
parent | b4f10583ea84d02ed0278fc2cb2846aaf075864d (diff) | |
download | pango-ea608c0bd7721d3019bed7ef2472289b1ea6fa53.tar.gz |
[basic-win32] Increase performance of Uniscribe code
A few weeks ago I reported a performance issue regarding the use of
Uniscribe in the win32 basic shaper.
It turns out that the issue was with the use of Uniscribe's
SCRIPT_CACHE. Despite the name, this value is for caching
per-font-plus-size values, not per-script values. See:
http://msdn.microsoft.com/en-us/library/dd317726(VS.85).aspx
Since shaping occurs on runs containing a single font, we only need
one SCRIPT_CACHE in uniscribe_shape. I'm including a patch below that
does this. With the patch applied, the time for one of my tests went
from 20s to .3s.
Diffstat (limited to 'modules/basic')
-rw-r--r-- | modules/basic/basic-win32.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/modules/basic/basic-win32.c b/modules/basic/basic-win32.c index ecb139e0..60a86532 100644 --- a/modules/basic/basic-win32.c +++ b/modules/basic/basic-win32.c @@ -581,7 +581,7 @@ itemize_shape_and_place (PangoFont *font, #endif items[item].a.fRTL = analysis->level % 2; - if ((*script_shape) (hdc, &script_cache[script], + if ((*script_shape) (hdc, script_cache, wtext + items[item].iCharPos, itemlen, G_N_ELEMENTS (iglyphs), &items[item].a, @@ -611,7 +611,7 @@ itemize_shape_and_place (PangoFont *font, nglyphs, glyphs->log_clusters + ng, char_offset); - if ((*script_place) (hdc, &script_cache[script], iglyphs, nglyphs, + if ((*script_place) (hdc, script_cache, iglyphs, nglyphs, visattrs, &items[item].a, advances, offsets, &abc)) { @@ -673,7 +673,7 @@ uniscribe_shape (PangoFont *font, long wlen; int i; gboolean retval = TRUE; - SCRIPT_CACHE script_cache[100]; + SCRIPT_CACHE script_cache; if (!pango_win32_font_select_font (font, hdc)) return FALSE; @@ -684,11 +684,10 @@ uniscribe_shape (PangoFont *font, if (retval) { - memset (script_cache, 0, sizeof (script_cache)); + memset (&script_cache, 0, sizeof (script_cache)); retval = itemize_shape_and_place (font, hdc, wtext, wlen, analysis, glyphs, script_cache); - for (i = 0; i < G_N_ELEMENTS (script_cache); i++) - if (script_cache[i]) - (*script_free_cache)(&script_cache[i]); + if (script_cache) + (*script_free_cache)(&script_cache); } if (retval) |