Aric Stewart : usp10: Move scripts to an array initialized once to minimize get_char_script calls .

Alexandre Julliard julliard at winehq.org
Tue Nov 15 13:17:31 CST 2011


Module: wine
Branch: master
Commit: 3767cebc8846529d1dbf8b16d6959f128dd2450a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3767cebc8846529d1dbf8b16d6959f128dd2450a

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Nov 14 13:17:11 2011 -0700

usp10: Move scripts to an array initialized once to minimize get_char_script calls.

---

 dlls/usp10/usp10.c |   29 +++++++++++++++++++++--------
 1 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 0496a56..f297125 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -802,8 +802,10 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
 
     int   cnt = 0, index = 0, str = 0;
     int   New_Script = -1;
+    int   i;
     WORD  *levels = NULL;
     WORD  *strength = NULL;
+    WORD  *scripts = NULL;
     WORD  baselevel = 0;
     BOOL  new_run;
 
@@ -813,12 +815,21 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
     if (!pwcInChars || !cInChars || !pItems || cMaxItems < 2)
         return E_INVALIDARG;
 
+    scripts = heap_alloc(cInChars * sizeof(WORD));
+    if (!scripts)
+        return E_OUTOFMEMORY;
+
+    for (i = 0; i < cInChars; i++)
+        scripts[i] = get_char_script(pwcInChars[i]);
+
     if (psState && psControl)
     {
-        int i;
         levels = heap_alloc_zero(cInChars * sizeof(WORD));
         if (!levels)
+        {
+            heap_free(scripts);
             return E_OUTOFMEMORY;
+        }
 
         BIDI_DetermineLevels(pwcInChars, cInChars, psState, psControl, levels);
         baselevel = levels[0];
@@ -838,6 +849,7 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
             strength = heap_alloc_zero(cInChars * sizeof(WORD));
             if (!strength)
             {
+                heap_free(scripts);
                 heap_free(levels);
                 return E_OUTOFMEMORY;
             }
@@ -848,7 +860,7 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
             {
                 if ((levels[i] == 0 || (odd(psState->uBidiLevel) && levels[i] == psState->uBidiLevel+1)) && inNumber && strchrW(math_punc,pwcInChars[i]))
                     levels[i] = 2;
-                else if ((levels[i] == 0 || (odd(psState->uBidiLevel) && levels[i] == psState->uBidiLevel+1)) && get_char_script(pwcInChars[i]) == Script_Numeric)
+                else if ((levels[i] == 0 || (odd(psState->uBidiLevel) && levels[i] == psState->uBidiLevel+1)) && scripts[i] == Script_Numeric)
                 {
                     levels[i] = 2;
                     inNumber = TRUE;
@@ -870,12 +882,12 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
     if (cnt == cInChars) /* All Spaces */
     {
         cnt = 0;
-        New_Script = get_char_script(pwcInChars[cnt]);
+        New_Script = scripts[cnt];
     }
 
     pItems[index].iCharPos = 0;
-    pItems[index].a = scriptInformation[get_char_script(pwcInChars[cnt])].a;
-    pScriptTags[index] = scriptInformation[get_char_script(pwcInChars[cnt])].scriptTag;
+    pItems[index].a = scriptInformation[scripts[cnt]].a;
+    pScriptTags[index] = scriptInformation[scripts[cnt]].scriptTag;
 
     if (strength && strength[cnt] == BIDI_STRONG)
         str = strength[cnt];
@@ -904,16 +916,16 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
     for (cnt=1; cnt < cInChars; cnt++)
     {
         if(pwcInChars[cnt] != Numeric_space && pwcInChars[cnt] != ZWJ && pwcInChars[cnt] != ZWNJ)
-            New_Script = get_char_script(pwcInChars[cnt]);
+            New_Script = scripts[cnt];
         else if (levels)
         {
             int j = 1;
             while (cnt + j < cInChars - 1 && (pwcInChars[cnt+j] == Numeric_space || pwcInChars[cnt+j] == ZWJ || pwcInChars[cnt+j] == ZWNJ) && levels[cnt] == levels[cnt+j])
                 j++;
             if (cnt + j < cInChars && levels[cnt] == levels[cnt+j])
-                New_Script = get_char_script(pwcInChars[cnt+j]);
+                New_Script = scripts[cnt+j];
             else
-                New_Script = get_char_script(pwcInChars[cnt]);
+                New_Script = scripts[cnt];
         }
 
         new_run = FALSE;
@@ -992,6 +1004,7 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int
     pItems[index].iCharPos = cnt;         /* the last item contains the ptr to the lastchar */
     heap_free(levels);
     heap_free(strength);
+    heap_free(scripts);
     return S_OK;
 }
 




More information about the wine-cvs mailing list