https://git.reactos.org/?p=reactos.git;a=commitdiff;h=aa15c73fc5c100d75457c5caa95f13bce4db8cd3

commit aa15c73fc5c100d75457c5caa95f13bce4db8cd3
Author:     Amine Khaldi <amine.kha...@reactos.org>
AuthorDate: Mon Jun 4 03:51:34 2018 +0100
Commit:     Amine Khaldi <amine.kha...@reactos.org>
CommitDate: Mon Jun 4 03:51:34 2018 +0100

    [USP10] Sync with Wine Staging 3.9. CORE-14656
---
 dll/win32/usp10/bidi.c           |   2 +-
 dll/win32/usp10/opentype.c       | 286 +++++++++++++++------------------------
 dll/win32/usp10/shape.c          |   8 +-
 dll/win32/usp10/usp10.c          |  72 +++++-----
 dll/win32/usp10/usp10_internal.h |  23 +++-
 media/doc/README.WINE            |   2 +-
 6 files changed, 170 insertions(+), 223 deletions(-)

diff --git a/dll/win32/usp10/bidi.c b/dll/win32/usp10/bidi.c
index b0df781c82..0fb03ef061 100644
--- a/dll/win32/usp10/bidi.c
+++ b/dll/win32/usp10/bidi.c
@@ -998,7 +998,7 @@ static void computeIsolatingRunsSet(unsigned baselevel, 
WORD *pcls, const WORD *
     Run *runs;
     IsolatedRun *current_isolated;
 
-    if (!(runs = heap_alloc(uCount * sizeof(*runs))))
+    if (!(runs = heap_calloc(uCount, sizeof(*runs))))
         return;
 
     list_init(set);
diff --git a/dll/win32/usp10/opentype.c b/dll/win32/usp10/opentype.c
index 2d708a8c40..53632714a4 100644
--- a/dll/win32/usp10/opentype.c
+++ b/dll/win32/usp10/opentype.c
@@ -2565,6 +2565,23 @@ unsigned int OpenType_apply_GPOS_lookup(const 
ScriptCache *script_cache, const O
             lookup_index, glyphs, glyph_index, glyph_count, goffset);
 }
 
+static LoadedScript *usp10_script_cache_add_script(ScriptCache *script_cache, 
OPENTYPE_TAG tag)
+{
+    LoadedScript *script;
+
+    if (!usp10_array_reserve((void **)&script_cache->scripts, 
&script_cache->scripts_size,
+            script_cache->script_count + 1, sizeof(*script_cache->scripts)))
+    {
+        ERR("Failed to grow scripts array.\n");
+        return NULL;
+    }
+
+    script = &script_cache->scripts[script_cache->script_count++];
+    script->tag = tag;
+
+    return script;
+}
+
 static LoadedScript *usp10_script_cache_get_script(ScriptCache *script_cache, 
OPENTYPE_TAG tag)
 {
     size_t i;
@@ -2578,94 +2595,53 @@ static LoadedScript 
*usp10_script_cache_get_script(ScriptCache *script_cache, OP
     return NULL;
 }
 
-static void GSUB_initialize_script_cache(ScriptCache *psc)
+static void usp10_script_cache_add_script_list(ScriptCache *script_cache,
+        enum usp10_script_table table, const OT_ScriptList *list)
 {
-    int i;
-
-    if (psc->GSUB_Table)
-    {
-        const OT_ScriptList *script;
-        const GSUB_Header* header = (const GSUB_Header*)psc->GSUB_Table;
-        script = (const OT_ScriptList*)((const BYTE*)header + 
GET_BE_WORD(header->ScriptList));
-        psc->script_count = GET_BE_WORD(script->ScriptCount);
-        TRACE("initializing %li scripts in this font\n",psc->script_count);
-        if (psc->script_count)
-        {
-            psc->scripts = heap_alloc_zero(psc->script_count * 
sizeof(*psc->scripts));
-            for (i = 0; i < psc->script_count; i++)
-            {
-                int offset = GET_BE_WORD(script->ScriptRecord[i].Script);
-                psc->scripts[i].tag = 
MS_MAKE_TAG(script->ScriptRecord[i].ScriptTag[0], 
script->ScriptRecord[i].ScriptTag[1], script->ScriptRecord[i].ScriptTag[2], 
script->ScriptRecord[i].ScriptTag[3]);
-                psc->scripts[i].gsub_table = ((const BYTE*)script + offset);
-            }
-        }
-    }
-}
+    SIZE_T initial_count, count, i;
+    LoadedScript *script;
+    OPENTYPE_TAG tag;
 
-static void GPOS_expand_script_cache(ScriptCache *psc)
-{
-    int i, count;
-    const OT_ScriptList *script;
-    const GPOS_Header* header = (const GPOS_Header*)psc->GPOS_Table;
-    LoadedScript *loaded_script;
+    TRACE("script_cache %p, table %#x, list %p.\n", script_cache, table, list);
 
-    if (!header)
+    if (!(count = GET_BE_WORD(list->ScriptCount)))
         return;
 
-    script = (const OT_ScriptList*)((const BYTE*)header + 
GET_BE_WORD(header->ScriptList));
-    count = GET_BE_WORD(script->ScriptCount);
+    TRACE("Adding %lu scripts.\n", count);
 
-    if (!count)
-        return;
-
-    if (!psc->script_count)
-    {
-        psc->script_count = count;
-        TRACE("initializing %li scripts in this font\n",psc->script_count);
-        if (psc->script_count)
-        {
-            psc->scripts = heap_alloc_zero(psc->script_count * 
sizeof(*psc->scripts));
-            for (i = 0; i < psc->script_count; i++)
-            {
-                int offset = GET_BE_WORD(script->ScriptRecord[i].Script);
-                psc->scripts[i].tag = 
MS_MAKE_TAG(script->ScriptRecord[i].ScriptTag[0], 
script->ScriptRecord[i].ScriptTag[1], script->ScriptRecord[i].ScriptTag[2], 
script->ScriptRecord[i].ScriptTag[3]);
-                psc->scripts[i].gpos_table = ((const BYTE*)script + offset);
-            }
-        }
-    }
-    else
+    initial_count = script_cache->script_count;
+    for (i = 0; i < count; ++i)
     {
-        for (i = 0; i < count; i++)
-        {
-            int offset = GET_BE_WORD(script->ScriptRecord[i].Script);
-            OPENTYPE_TAG tag = 
MS_MAKE_TAG(script->ScriptRecord[i].ScriptTag[0], 
script->ScriptRecord[i].ScriptTag[1], script->ScriptRecord[i].ScriptTag[2], 
script->ScriptRecord[i].ScriptTag[3]);
+        tag = MS_MAKE_TAG(list->ScriptRecord[i].ScriptTag[0],
+                list->ScriptRecord[i].ScriptTag[1],
+                list->ScriptRecord[i].ScriptTag[2],
+                list->ScriptRecord[i].ScriptTag[3]);
 
-            if (!(loaded_script = usp10_script_cache_get_script(psc, tag)))
-            {
-                if (!usp10_array_reserve((void **)&psc->scripts, 
&psc->scripts_size,
-                        psc->script_count + 1, sizeof(*psc->scripts)))
-                {
-                    ERR("Failed grow scripts array.\n");
-                    return;
-                }
+        if (!(initial_count && (script = 
usp10_script_cache_get_script(script_cache, tag)))
+                && !(script = usp10_script_cache_add_script(script_cache, 
tag)))
+            return;
 
-                loaded_script = &psc->scripts[psc->script_count];
-                ++psc->script_count;
-                loaded_script->tag = tag;
-            }
-            loaded_script->gpos_table = (const BYTE *)script + offset;
-        }
+        script->table[table] = (const BYTE *)list + 
GET_BE_WORD(list->ScriptRecord[i].Script);
     }
 }
 
-static void _initialize_script_cache(ScriptCache *psc)
+static void _initialize_script_cache(ScriptCache *script_cache)
 {
-    if (!psc->scripts_initialized)
-    {
-        GSUB_initialize_script_cache(psc);
-        GPOS_expand_script_cache(psc);
-        psc->scripts_initialized = TRUE;
-    }
+    const GPOS_Header *gpos_header;
+    const GSUB_Header *gsub_header;
+
+    if (script_cache->scripts_initialized)
+        return;
+
+    if ((gsub_header = script_cache->GSUB_Table))
+        usp10_script_cache_add_script_list(script_cache, 
USP10_SCRIPT_TABLE_GSUB,
+                (const OT_ScriptList *)((const BYTE *)gsub_header + 
GET_BE_WORD(gsub_header->ScriptList)));
+
+    if ((gpos_header = script_cache->GPOS_Table))
+        usp10_script_cache_add_script_list(script_cache, 
USP10_SCRIPT_TABLE_GPOS,
+                (const OT_ScriptList *)((const BYTE *)gpos_header + 
GET_BE_WORD(gpos_header->ScriptList)));
+
+    script_cache->scripts_initialized = TRUE;
 }
 
 HRESULT OpenType_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG 
searchingFor, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags)
@@ -2699,120 +2675,87 @@ HRESULT OpenType_GetFontScriptTags(ScriptCache *psc, 
OPENTYPE_TAG searchingFor,
     return rc;
 }
 
-static LoadedLanguage *usp10_script_get_language(LoadedScript *script, 
OPENTYPE_TAG tag)
+static LoadedLanguage *usp10_script_add_language(LoadedScript *script, 
OPENTYPE_TAG tag)
 {
-    size_t i;
+    LoadedLanguage *language;
 
-    for (i = 0; i < script->language_count; ++i)
+    if (!usp10_array_reserve((void **)&script->languages, 
&script->languages_size,
+            script->language_count + 1, sizeof(*script->languages)))
     {
-        if (script->languages[i].tag == tag)
-            return &script->languages[i];
+        ERR("Failed to grow languages array.\n");
+        return NULL;
     }
 
-    return NULL;
+    language = &script->languages[script->language_count++];
+    language->tag = tag;
+
+    return language;
 }
 
-static void GSUB_initialize_language_cache(LoadedScript *script)
+static LoadedLanguage *usp10_script_get_language(LoadedScript *script, 
OPENTYPE_TAG tag)
 {
-    int i;
+    size_t i;
 
-    if (script->gsub_table)
+    for (i = 0; i < script->language_count; ++i)
     {
-        DWORD offset;
-        const OT_Script* table = script->gsub_table;
-        script->language_count = GET_BE_WORD(table->LangSysCount);
-        offset = GET_BE_WORD(table->DefaultLangSys);
-        if (offset)
-        {
-            script->default_language.tag = MS_MAKE_TAG('d','f','l','t');
-            script->default_language.gsub_table = (const BYTE*)table + offset;
-        }
-
-        if (script->language_count)
-        {
-            TRACE("Deflang %p, LangCount 
%li\n",script->default_language.gsub_table, script->language_count);
-
-            script->languages = heap_alloc_zero(script->language_count * 
sizeof(*script->languages));
-
-            for (i = 0; i < script->language_count; i++)
-            {
-                int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys);
-                script->languages[i].tag = 
MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], 
table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], 
table->LangSysRecord[i].LangSysTag[3]);
-                script->languages[i].gsub_table = ((const BYTE*)table + 
offset);
-            }
-        }
+        if (script->languages[i].tag == tag)
+            return &script->languages[i];
     }
+
+    return NULL;
 }
 
-static void GPOS_expand_language_cache(LoadedScript *script)
+static void usp10_script_add_language_list(LoadedScript *script,
+        enum usp10_language_table table, const OT_Script *list)
 {
-    int count;
-    const OT_Script* table = script->gpos_table;
+    SIZE_T initial_count, count, i;
     LoadedLanguage *language;
+    OPENTYPE_TAG tag;
     DWORD offset;
 
-    if (!table)
-        return;
-
-    offset = GET_BE_WORD(table->DefaultLangSys);
-    if (offset)
-        script->default_language.gpos_table = (const BYTE*)table + offset;
-
-    count = GET_BE_WORD(table->LangSysCount);
+    TRACE("script %p, table %#x, list %p.\n", script, table, list);
 
-    TRACE("Deflang %p, LangCount %i\n",script->default_language.gpos_table, 
count);
+    if ((offset = GET_BE_WORD(list->DefaultLangSys)))
+    {
+        script->default_language.tag = MS_MAKE_TAG('d','f','l','t');
+        script->default_language.table[table] = (const BYTE *)list + offset;
+        TRACE("Default language %p.\n", script->default_language.table[table]);
+    }
 
-    if (!count)
+    if (!(count = GET_BE_WORD(list->LangSysCount)))
         return;
 
-    if (!script->language_count)
-    {
-        int i;
-        script->language_count = count;
-
-        script->languages = heap_alloc_zero(script->language_count * 
sizeof(*script->languages));
+    TRACE("Adding %lu languages.\n", count);
 
-        for (i = 0; i < script->language_count; i++)
-        {
-            int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys);
-            script->languages[i].tag = 
MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], 
table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], 
table->LangSysRecord[i].LangSysTag[3]);
-            script->languages[i].gpos_table = ((const BYTE*)table + offset);
-        }
-    }
-    else if (count)
+    initial_count = script->language_count;
+    for (i = 0; i < count; ++i)
     {
-        int i;
-        for (i = 0; i < count; i++)
-        {
-            int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys);
-            OPENTYPE_TAG tag = 
MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], 
table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], 
table->LangSysRecord[i].LangSysTag[3]);
+        tag = MS_MAKE_TAG(list->LangSysRecord[i].LangSysTag[0],
+                list->LangSysRecord[i].LangSysTag[1],
+                list->LangSysRecord[i].LangSysTag[2],
+                list->LangSysRecord[i].LangSysTag[3]);
 
-            if (!(language = usp10_script_get_language(script, tag)))
-            {
-                if (!usp10_array_reserve((void **)&script->languages, 
&script->languages_size,
-                        script->language_count + 1, 
sizeof(*script->languages)))
-                {
-                    ERR("Failed grow languages array.\n");
-                    return;
-                }
+        if (!(initial_count && (language = usp10_script_get_language(script, 
tag)))
+                && !(language = usp10_script_add_language(script, tag)))
+            return;
 
-                language = &script->languages[script->language_count];
-                ++script->language_count;
-                language->tag = tag;
-            }
-            language->gpos_table = (const BYTE *)table + offset;
-        }
+        language->table[table] = (const BYTE *)list + 
GET_BE_WORD(list->LangSysRecord[i].LangSys);
     }
 }
 
 static void _initialize_language_cache(LoadedScript *script)
 {
-    if (!script->languages_initialized)
-    {
-        GSUB_initialize_language_cache(script);
-        GPOS_expand_language_cache(script);
-        script->languages_initialized = TRUE;
-    }
+    const OT_Script *list;
+
+    if (script->languages_initialized)
+        return;
+
+    if ((list = script->table[USP10_SCRIPT_TABLE_GSUB]))
+        usp10_script_add_language_list(script, USP10_LANGUAGE_TABLE_GSUB, 
list);
+    if ((list = script->table[USP10_SCRIPT_TABLE_GPOS]))
+        usp10_script_add_language_list(script, USP10_LANGUAGE_TABLE_GPOS, 
list);
+
+    script->languages_initialized = TRUE;
 }
 
 HRESULT OpenType_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG 
script_tag, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG 
*pLanguageTags, int *pcTags)
@@ -2851,7 +2794,7 @@ HRESULT OpenType_GetFontLanguageTags(ScriptCache *psc, 
OPENTYPE_TAG script_tag,
         }
     }
 
-    if (script->default_language.gsub_table)
+    if (script->default_language.table[USP10_LANGUAGE_TABLE_GSUB])
     {
         if (i < cMaxTags)
             pLanguageTags[i] = script->default_language.tag;
@@ -2875,15 +2818,10 @@ static void 
usp10_language_add_feature_list(LoadedLanguage *language, char table
 
     TRACE("table_type %#x, %u features.\n", table_type, count);
 
-    if (!count)
+    if (!count || !usp10_array_reserve((void **)&language->features, 
&language->features_size,
+            language->feature_count + count, sizeof(*language->features)))
         return;
 
-    if (!language->feature_count)
-        language->features = heap_alloc(count * sizeof(*language->features));
-    else
-        language->features = HeapReAlloc(GetProcessHeap(), 0, 
language->features,
-                (language->feature_count + count) * 
sizeof(*language->features));
-
     for (i = 0; i < count; ++i)
     {
         const OT_FeatureRecord *record;
@@ -2899,7 +2837,7 @@ static void 
usp10_language_add_feature_list(LoadedLanguage *language, char table
         loaded_feature->tableType = table_type;
         loaded_feature->feature = feature;
         loaded_feature->lookup_count = GET_BE_WORD(feature->LookupCount);
-        loaded_feature->lookups = heap_alloc(loaded_feature->lookup_count * 
sizeof(*loaded_feature->lookups));
+        loaded_feature->lookups = heap_calloc(loaded_feature->lookup_count, 
sizeof(*loaded_feature->lookups));
         for (j = 0; j < loaded_feature->lookup_count; ++j)
             loaded_feature->lookups[j] = 
GET_BE_WORD(feature->LookupListIndex[j]);
     }
@@ -2916,13 +2854,13 @@ static void _initialize_feature_cache(ScriptCache *psc, 
LoadedLanguage *language
     if (language->features_initialized)
         return;
 
-    if ((lang = language->gsub_table))
+    if ((lang = language->table[USP10_LANGUAGE_TABLE_GSUB]))
     {
         feature_list = (const OT_FeatureList *)((const BYTE *)gsub_header + 
GET_BE_WORD(gsub_header->FeatureList));
         usp10_language_add_feature_list(language, FEATURE_GSUB_TABLE, lang, 
feature_list);
     }
 
-    if ((lang = language->gpos_table))
+    if ((lang = language->table[USP10_LANGUAGE_TABLE_GPOS]))
     {
         feature_list = (const OT_FeatureList *)((const BYTE *)gpos_header + 
GET_BE_WORD(gpos_header->FeatureList));
         usp10_language_add_feature_list(language, FEATURE_GPOS_TABLE, lang, 
feature_list);
@@ -2934,9 +2872,9 @@ static void _initialize_feature_cache(ScriptCache *psc, 
LoadedLanguage *language
 HRESULT OpenType_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, 
OPENTYPE_TAG language_tag, BOOL filtered, OPENTYPE_TAG searchingFor, char 
tableType, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags, 
LoadedFeature** feature)
 {
     int i;
+    LoadedLanguage *language;
     LoadedScript *script;
     HRESULT rc = S_OK;
-    LoadedLanguage *language = NULL;
 
     _initialize_script_cache(psc);
     if (!(script = usp10_script_cache_get_script(psc, script_tag)))
@@ -2950,9 +2888,9 @@ HRESULT OpenType_GetFontFeatureTags(ScriptCache *psc, 
OPENTYPE_TAG script_tag, O
 
     _initialize_language_cache(script);
 
-    if ((script->default_language.gsub_table || 
script->default_language.gpos_table) && script->default_language.tag == 
language_tag)
-        language = &script->default_language;
-    else
+    language = &script->default_language;
+    if (language->tag != language_tag || 
(!language->table[USP10_LANGUAGE_TABLE_GSUB]
+            && !language->table[USP10_LANGUAGE_TABLE_GPOS]))
         language = usp10_script_get_language(script, language_tag);
 
     if (!language)
diff --git a/dll/win32/usp10/shape.c b/dll/win32/usp10/shape.c
index ca084e7285..3827000122 100644
--- a/dll/win32/usp10/shape.c
+++ b/dll/win32/usp10/shape.c
@@ -712,13 +712,14 @@ static VOID load_ot_tables(HDC hdc, ScriptCache *psc)
         psc->GDEF_Table = load_gdef_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)
+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;
     INT glyph_count = count;
     INT rc;
 
-    glyphs = heap_alloc(2 * count * sizeof(*glyphs));
+    glyphs = heap_calloc(count, 2 * sizeof(*glyphs));
     GetGlyphIndicesW(hdc, chars, count, glyphs, 0);
     rc = apply_GSUB_feature_to_glyph(hdc, psa, psc, glyphs, 0, write_dir, 
&glyph_count, feature);
     if (rc > GSUB_E_NOGLYPH)
@@ -1695,7 +1696,7 @@ static void ComposeConsonants(HDC hdc, WCHAR *pwOutChars, 
INT *pcChars, const Co
     int offset = 0;
     int cWalk;
 
-    for (cWalk = 0; cWalk < *pcChars; cWalk++)
+    for (cWalk = 0; cWalk < *pcChars; cWalk += 2)
     {
         for (i = 0; consonants[i].output!= 0x0; i++)
         {
@@ -1720,7 +1721,6 @@ static void ComposeConsonants(HDC hdc, WCHAR *pwOutChars, 
INT *pcChars, const Co
                 break;
             }
         }
-        cWalk++;
     }
 }
 
diff --git a/dll/win32/usp10/usp10.c b/dll/win32/usp10/usp10.c
index fe83722053..ab3af43ba8 100644
--- a/dll/win32/usp10/usp10.c
+++ b/dll/win32/usp10/usp10.c
@@ -1373,7 +1373,7 @@ static HRESULT _ItemizeInternal(const WCHAR *pwcInChars, 
int cInChars,
     if (!pwcInChars || !cInChars || !pItems || cMaxItems < 2)
         return E_INVALIDARG;
 
-    if (!(scripts = heap_alloc(cInChars * sizeof(*scripts))))
+    if (!(scripts = heap_calloc(cInChars, sizeof(*scripts))))
         return E_OUTOFMEMORY;
 
     for (i = 0; i < cInChars; i++)
@@ -1464,16 +1464,13 @@ static HRESULT _ItemizeInternal(const WCHAR 
*pwcInChars, int cInChars,
 
     if (psState && psControl)
     {
-        levels = heap_alloc_zero(cInChars * sizeof(WORD));
-        if (!levels)
+        if (!(levels = heap_calloc(cInChars, sizeof(*levels))))
             goto nomemory;
 
-        overrides = heap_alloc_zero(cInChars * sizeof(WORD));
-        if (!overrides)
+        if (!(overrides = heap_calloc(cInChars, sizeof(*overrides))))
             goto nomemory;
 
-        layout_levels = heap_alloc_zero(cInChars * sizeof(WORD));
-        if (!layout_levels)
+        if (!(layout_levels = heap_calloc(cInChars, sizeof(*layout_levels))))
             goto nomemory;
 
         if (psState->fOverrideDirection)
@@ -1519,8 +1516,7 @@ static HRESULT _ItemizeInternal(const WCHAR *pwcInChars, 
int cInChars,
             static const WCHAR math_punc[] = 
{'#','$','%','+',',','-','.','/',':',0x2212, 0x2044, 0x00a0,0};
             static const WCHAR repeatable_math_punc[] = 
{'#','$','%','+','-','/',0x2212, 0x2044,0};
 
-            strength = heap_alloc_zero(cInChars * sizeof(WORD));
-            if (!strength)
+            if (!(strength = heap_calloc(cInChars, sizeof(*strength))))
                 goto nomemory;
             BIDI_GetStrengths(pwcInChars, cInChars, psControl, strength);
 
@@ -1948,8 +1944,7 @@ static BOOL requires_fallback(HDC hdc, SCRIPT_CACHE *psc, 
SCRIPT_ANALYSIS *psa,
     if (SHAPE_CheckFontForRequiredFeatures(hdc, (ScriptCache *)*psc, psa) != 
S_OK)
         return TRUE;
 
-    glyphs = heap_alloc(sizeof(WORD) * cChars);
-    if (!glyphs)
+    if (!(glyphs = heap_calloc(cChars, sizeof(*glyphs))))
         return FALSE;
     if (ScriptGetCMap(hdc, psc, pwcInChars, cChars, 0, glyphs) != S_OK)
     {
@@ -2012,8 +2007,10 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void 
*pString, int cString,
     if (cString < 1 || !pString) return E_INVALIDARG;
     if ((dwFlags & SSA_GLYPHS) && !hdc) return E_PENDING;
 
-    if (!(analysis = heap_alloc_zero(sizeof(StringAnalysis)))) return 
E_OUTOFMEMORY;
-    if (!(analysis->pItem = heap_alloc_zero(num_items * sizeof(SCRIPT_ITEM) + 
1))) goto error;
+    if (!(analysis = heap_alloc_zero(sizeof(*analysis))))
+        return E_OUTOFMEMORY;
+    if (!(analysis->pItem = heap_calloc(num_items + 1, 
sizeof(*analysis->pItem))))
+        goto error;
 
     /* FIXME: handle clipping */
     analysis->clip_len = cString;
@@ -2032,8 +2029,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void 
*pString, int cString,
 
     if (dwFlags & SSA_PASSWORD)
     {
-        iString = heap_alloc(sizeof(WCHAR)*cString);
-        if (!iString)
+        if (!(iString = heap_calloc(cString, sizeof(*iString))))
         {
             hr = E_OUTOFMEMORY;
             goto error;
@@ -2058,18 +2054,16 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void 
*pString, int cString,
 
     if (dwFlags & SSA_BREAK)
     {
-        if ((analysis->logattrs = heap_alloc(sizeof(SCRIPT_LOGATTR) * 
cString)))
-        {
-            for (i = 0; i < analysis->numItems; i++)
-                ScriptBreak(&((WCHAR *)pString)[analysis->pItem[i].iCharPos],
-                        analysis->pItem[i + 1].iCharPos - 
analysis->pItem[i].iCharPos,
-                        &analysis->pItem[i].a, 
&analysis->logattrs[analysis->pItem[i].iCharPos]);
-        }
-        else
+        if (!(analysis->logattrs = heap_calloc(cString, 
sizeof(*analysis->logattrs))))
             goto error;
+
+        for (i = 0; i < analysis->numItems; ++i)
+            ScriptBreak(&((const WCHAR *)pString)[analysis->pItem[i].iCharPos],
+                    analysis->pItem[i + 1].iCharPos - 
analysis->pItem[i].iCharPos,
+                    &analysis->pItem[i].a, 
&analysis->logattrs[analysis->pItem[i].iCharPos]);
     }
 
-    if (!(analysis->logical2visual = heap_alloc_zero(sizeof(int) * 
analysis->numItems)))
+    if (!(analysis->logical2visual = heap_calloc(analysis->numItems, 
sizeof(*analysis->logical2visual))))
         goto error;
     if (!(BidiLevel = heap_alloc_zero(analysis->numItems)))
         goto error;
@@ -2077,7 +2071,8 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void 
*pString, int cString,
     if (dwFlags & SSA_GLYPHS)
     {
         int tab_x = 0;
-        if (!(analysis->glyphs = heap_alloc_zero(sizeof(StringGlyphs) * 
analysis->numItems)))
+
+        if (!(analysis->glyphs = heap_calloc(analysis->numItems, 
sizeof(*analysis->glyphs))))
         {
             heap_free(BidiLevel);
             goto error;
@@ -2088,11 +2083,11 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void 
*pString, int cString,
             SCRIPT_CACHE *sc = (SCRIPT_CACHE*)&analysis->glyphs[i].sc;
             int cChar = analysis->pItem[i+1].iCharPos - 
analysis->pItem[i].iCharPos;
             int numGlyphs = 1.5 * cChar + 16;
-            WORD *glyphs = heap_alloc_zero(sizeof(WORD) * numGlyphs);
-            WORD *pwLogClust = heap_alloc_zero(sizeof(WORD) * cChar);
-            int *piAdvance = heap_alloc_zero(sizeof(int) * numGlyphs);
-            SCRIPT_VISATTR *psva = heap_alloc_zero(sizeof(SCRIPT_VISATTR) * 
numGlyphs);
-            GOFFSET *pGoffset = heap_alloc_zero(sizeof(GOFFSET) * numGlyphs);
+            WORD *glyphs = heap_calloc(numGlyphs, sizeof(*glyphs));
+            WORD *pwLogClust = heap_calloc(cChar, sizeof(*pwLogClust));
+            int *piAdvance = heap_calloc(numGlyphs, sizeof(*piAdvance));
+            SCRIPT_VISATTR *psva = heap_calloc(numGlyphs, sizeof(*psva));
+            GOFFSET *pGoffset = heap_calloc(numGlyphs, sizeof(*pGoffset));
             int numGlyphsReturned;
             HFONT originalFont = 0x0;
 
@@ -3188,8 +3183,9 @@ HRESULT WINAPI ScriptShapeOpenType( HDC hdc, SCRIPT_CACHE 
*psc,
         WCHAR *rChars;
         if ((hr = SHAPE_CheckFontForRequiredFeatures(hdc, (ScriptCache *)*psc, 
psa)) != S_OK) return hr;
 
-        rChars = heap_alloc(sizeof(WCHAR) * cChars);
-        if (!rChars) return E_OUTOFMEMORY;
+        if (!(rChars = heap_calloc(cChars, sizeof(*rChars))))
+            return E_OUTOFMEMORY;
+
         for (i = 0, g = 0, cluster = 0; i < cChars; i++)
         {
             int idx = i;
@@ -3333,10 +3329,10 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, 
const WCHAR *pwcChars,
     if (!psva || !pcGlyphs) return E_INVALIDARG;
     if (cChars > cMaxGlyphs) return E_OUTOFMEMORY;
 
-    charProps = heap_alloc_zero(sizeof(SCRIPT_CHARPROP)*cChars);
-    if (!charProps) return E_OUTOFMEMORY;
-    glyphProps = heap_alloc_zero(sizeof(SCRIPT_GLYPHPROP)*cMaxGlyphs);
-    if (!glyphProps)
+    if (!(charProps = heap_calloc(cChars, sizeof(*charProps))))
+        return E_OUTOFMEMORY;
+
+    if (!(glyphProps = heap_calloc(cMaxGlyphs, sizeof(*glyphProps))))
     {
         heap_free(charProps);
         return E_OUTOFMEMORY;
@@ -3501,8 +3497,8 @@ HRESULT WINAPI ScriptPlace(HDC hdc, SCRIPT_CACHE *psc, 
const WORD *pwGlyphs,
     if (!psva) return E_INVALIDARG;
     if (!pGoffset) return E_FAIL;
 
-    glyphProps = heap_alloc(sizeof(SCRIPT_GLYPHPROP)*cGlyphs);
-    if (!glyphProps) return E_OUTOFMEMORY;
+    if (!(glyphProps = heap_calloc(cGlyphs, sizeof(*glyphProps))))
+        return E_OUTOFMEMORY;
 
     for (i = 0; i < cGlyphs; i++)
         glyphProps[i].sva = psva[i];
diff --git a/dll/win32/usp10/usp10_internal.h b/dll/win32/usp10/usp10_internal.h
index 22295132bb..fea68918c9 100644
--- a/dll/win32/usp10/usp10_internal.h
+++ b/dll/win32/usp10/usp10_internal.h
@@ -154,19 +154,32 @@ typedef struct {
     WORD *lookups;
 } LoadedFeature;
 
+enum usp10_language_table
+{
+    USP10_LANGUAGE_TABLE_GSUB = 0,
+    USP10_LANGUAGE_TABLE_GPOS,
+    USP10_LANGUAGE_TABLE_COUNT
+};
+
 typedef struct {
     OPENTYPE_TAG tag;
-    const void *gsub_table;
-    const void *gpos_table;
+    const void *table[USP10_LANGUAGE_TABLE_COUNT];
     BOOL features_initialized;
-    INT feature_count;
     LoadedFeature *features;
+    SIZE_T features_size;
+    SIZE_T feature_count;
 } LoadedLanguage;
 
+enum usp10_script_table
+{
+    USP10_SCRIPT_TABLE_GSUB = 0,
+    USP10_SCRIPT_TABLE_GPOS,
+    USP10_SCRIPT_TABLE_COUNT
+};
+
 typedef struct {
     OPENTYPE_TAG tag;
-    const void *gsub_table;
-    const void *gpos_table;
+    const void *table[USP10_SCRIPT_TABLE_COUNT];
     LoadedLanguage default_language;
     BOOL languages_initialized;
     LoadedLanguage *languages;
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index 6ebb064c60..20f1cfb5a2 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -189,7 +189,7 @@ reactos/dll/win32/twain_32            # Synced to 
WineStaging-3.3
 reactos/dll/win32/updspapi            # Synced to WineStaging-3.3
 reactos/dll/win32/url                 # Synced to WineStaging-3.3
 reactos/dll/win32/urlmon              # Synced to WineStaging-3.9
-reactos/dll/win32/usp10               # Synced to WineStaging-3.3
+reactos/dll/win32/usp10               # Synced to WineStaging-3.9
 reactos/dll/win32/uxtheme             # Forked
 reactos/dll/win32/vbscript            # Synced to WineStaging-3.3
 reactos/dll/win32/version             # Synced to WineStaging-3.3

Reply via email to