Aric Stewart : usp10: Break out a function to apply a GSUB feature to an entire string of glyphs .

Alexandre Julliard julliard at winehq.org
Fri May 28 09:43:10 CDT 2010


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Thu May 27 15:03:21 2010 -0500

usp10: Break out a function to apply a GSUB feature to an entire string of glyphs.

---

 dlls/usp10/shape.c |   68 +++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/dlls/usp10/shape.c b/dlls/usp10/shape.c
index d7e9811..fe2ea53 100644
--- a/dlls/usp10/shape.c
+++ b/dlls/usp10/shape.c
@@ -549,6 +549,57 @@ static VOID *load_gsub_table(HDC hdc)
     return GSUB_Table;
 }
 
+static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, void* GSUB_Table, WORD *pwOutGlyphs, int write_dir, INT* pcGlyphs, const char* feat)
+{
+    int i;
+
+    if (GSUB_Table)
+    {
+        const GSUB_Header *header;
+        const GSUB_Script *script;
+        const GSUB_LangSys *language;
+        const GSUB_Feature *feature;
+
+        if (!GSUB_Table)
+            return GSUB_E_NOFEATURE;
+
+        header = GSUB_Table;
+
+        script = GSUB_get_script_table(header, get_opentype_script(hdc,psa));
+        if (!script)
+        {
+            TRACE("Script not found\n");
+            return GSUB_E_NOFEATURE;
+        }
+        language = GSUB_get_lang_table(script, "xxxx");
+        if (!language)
+        {
+            TRACE("Language not found\n");
+            return GSUB_E_NOFEATURE;
+        }
+        feature  =  GSUB_get_feature(header, language, feat);
+        if (!feature)
+        {
+            TRACE("%s feature not found\n",feat);
+            return GSUB_E_NOFEATURE;
+        }
+
+        i = 0;
+        TRACE("applying feature %s\n",feat);
+        while(i < *pcGlyphs)
+        {
+                INT nextIndex;
+                nextIndex = GSUB_apply_feature(header, feature, pwOutGlyphs, i, write_dir, pcGlyphs);
+                if (nextIndex > GSUB_E_NOGLYPH)
+                    i = nextIndex;
+                else
+                    i++;
+        }
+        return *pcGlyphs;
+    }
+    return GSUB_E_NOFEATURE;
+}
+
 static CHAR neighbour_joining_type(int i, int delta, const CHAR* context_type, INT cchLen, SCRIPT_ANALYSIS *psa)
 {
     if (i + delta < 0)
@@ -668,22 +719,7 @@ void SHAPE_ShapeArabicGlyphs(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WC
         }
     }
 
-    /* Required ligature substitution */
-    if (psc->GSUB_Table)
-    {
-        i = 0;
-        while(i < *pcGlyphs)
-        {
-                INT nextIndex;
-                nextIndex = apply_GSUB_feature_to_glyph(hdc, psa, psc->GSUB_Table, pwOutGlyphs, i, dirL, pcGlyphs, "rlig");
-                if (nextIndex > GSUB_E_NOGLYPH)
-                    i = nextIndex;
-                else if (nextIndex == GSUB_E_NOFEATURE)
-                    break;
-                else
-                    i++;
-        }
-    }
+    apply_GSUB_feature(hdc, psa, psc->GSUB_Table, pwOutGlyphs, dirL, pcGlyphs, "rlig");
 
     HeapFree(GetProcessHeap(),0,context_shape);
     HeapFree(GetProcessHeap(),0,context_type);




More information about the wine-cvs mailing list