Aric Stewart : usp10: Load the GPOS table.

Alexandre Julliard julliard at winehq.org
Mon Jul 16 14:14:29 CDT 2012


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Jul 16 07:23:35 2012 -0500

usp10: Load the GPOS table.

---

 dlls/usp10/shape.c          |   51 ++++++++++++++++++++++++++----------------
 dlls/usp10/usp10.c          |    1 +
 dlls/usp10/usp10_internal.h |    1 +
 3 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/dlls/usp10/shape.c b/dlls/usp10/shape.c
index b574a85..e288878 100644
--- a/dlls/usp10/shape.c
+++ b/dlls/usp10/shape.c
@@ -603,6 +603,27 @@ static VOID *load_gsub_table(HDC hdc)
     return GSUB_Table;
 }
 
+static VOID *load_gpos_table(HDC hdc)
+{
+    VOID* GPOS_Table = NULL;
+    int length = GetFontData(hdc, MS_MAKE_TAG('G', 'P', 'O', 'S'), 0, NULL, 0);
+    if (length != GDI_ERROR)
+    {
+        GPOS_Table = HeapAlloc(GetProcessHeap(),0,length);
+        GetFontData(hdc, MS_MAKE_TAG('G', 'P', 'O', 'S'), 0, GPOS_Table, length);
+        TRACE("Loaded GPOS table of %i bytes\n",length);
+    }
+    return GPOS_Table;
+}
+
+static VOID load_ot_tables(HDC hdc, ScriptCache *psc)
+{
+    if (!psc->GSUB_Table)
+        psc->GSUB_Table = load_gsub_table(hdc);
+    if (!psc->GPOS_Table)
+        psc->GPOS_Table = load_gpos_table(hdc);
+}
+
 INT SHAPE_does_GSUB_feature_apply_to_chars(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, const WCHAR *chars, INT write_dir, INT count, const char* feature)
 {
     WORD *glyphs;
@@ -957,8 +978,7 @@ static void ContextualShape_Arabic(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *p
         dirL = 1;
     }
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     context_type = HeapAlloc(GetProcessHeap(),0,cChars);
     context_shape = HeapAlloc(GetProcessHeap(),0,sizeof(INT) * cChars);
@@ -1179,8 +1199,7 @@ static void ContextualShape_Syriac(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *p
         dirL = 1;
     }
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (!psc->GSUB_Table)
         return;
@@ -1314,8 +1333,7 @@ static void ContextualShape_Phags_pa(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS
         dirL = 1;
     }
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (!psc->GSUB_Table)
         return;
@@ -2650,8 +2668,7 @@ static void ContextualShape_Mongolian(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS
     else
         dirL = 1;
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (!psc->GSUB_Table)
         return;
@@ -3153,8 +3170,7 @@ void SHAPE_CharGlyphProp(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const
 
 void SHAPE_ContextualShaping(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust)
 {
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (ShapingData[psa->eScript].contextProc)
         ShapingData[psa->eScript].contextProc(hdc, psc, psa, pwcChars, cChars, pwOutGlyphs, pcGlyphs, cMaxGlyphs, pwLogClust);
@@ -3168,8 +3184,7 @@ static void SHAPE_ApplyOpenTypeFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYS
     if (!rpRangeProperties)
         return;
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (!psc->GSUB_Table)
         return;
@@ -3202,8 +3217,7 @@ HRESULT SHAPE_CheckFontForRequiredFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANA
     if (!ShapingData[psa->eScript].requiredFeatures)
         return S_OK;
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     /* we need to have at least one of the required features */
     i = 0;
@@ -3225,8 +3239,7 @@ HRESULT SHAPE_GetFontScriptTags( HDC hdc, ScriptCache *psc,
     HRESULT hr;
     OPENTYPE_TAG searching = 0x00000000;
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (psa && scriptInformation[psa->eScript].scriptTag)
         searching = scriptInformation[psa->eScript].scriptTag;
@@ -3246,8 +3259,7 @@ HRESULT SHAPE_GetFontLanguageTags( HDC hdc, ScriptCache *psc,
     OPENTYPE_TAG searching = 0x00000000;
     BOOL fellback = FALSE;
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (psa && psc->userLang != 0)
         searching = psc->userLang;
@@ -3274,8 +3286,7 @@ HRESULT SHAPE_GetFontFeatureTags( HDC hdc, ScriptCache *psc,
     HRESULT hr;
     BOOL filter = FALSE;
 
-    if (!psc->GSUB_Table)
-        psc->GSUB_Table = load_gsub_table(hdc);
+    load_ot_tables(hdc, psc);
 
     if (psa && scriptInformation[psa->eScript].scriptTag)
     {
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 8942a42..0e97405 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -984,6 +984,7 @@ HRESULT WINAPI ScriptFreeCache(SCRIPT_CACHE *psc)
         heap_free(((ScriptCache *)*psc)->GSUB_Table);
         heap_free(((ScriptCache *)*psc)->GDEF_Table);
         heap_free(((ScriptCache *)*psc)->CMAP_Table);
+        heap_free(((ScriptCache *)*psc)->GPOS_Table);
         for (i = 0; i < ((ScriptCache *)*psc)->script_count; i++)
         {
             int j;
diff --git a/dlls/usp10/usp10_internal.h b/dlls/usp10/usp10_internal.h
index 013e383..9644159 100644
--- a/dlls/usp10/usp10_internal.h
+++ b/dlls/usp10/usp10_internal.h
@@ -164,6 +164,7 @@ typedef struct {
     LPVOID GDEF_Table;
     LPVOID CMAP_Table;
     LPVOID CMAP_format12_Table;
+    LPVOID GPOS_Table;
     INT script_count;
     LoadedScript *scripts;
 




More information about the wine-cvs mailing list