[pango] [basic-win32] Increase performance of Uniscribe code
- From: Tor Lillqvist <tml src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pango] [basic-win32] Increase performance of Uniscribe code
- Date: Thu, 13 Aug 2009 13:03:27 +0000 (UTC)
commit ea608c0bd7721d3019bed7ef2472289b1ea6fa53
Author: David E. Hollingsworth <deh curl com>
Date: Thu Aug 13 15:55:50 2009 +0300
[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.
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 ecb139e..60a8653 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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]