diff --git a/dll/win32/usp10/bidi.c b/dll/win32/usp10/bidi.c index b0df781c82a..0fb03ef061a 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 2d708a8c401..53632714a4e 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; + SIZE_T initial_count, count, i; + LoadedScript *script; + OPENTYPE_TAG tag; - if (psc->GSUB_Table) + TRACE("script_cache %p, table %#x, list %p.\n", script_cache, table, list); + + if (!(count = GET_BE_WORD(list->ScriptCount))) + return; + + TRACE("Adding %lu scripts.\n", count); + + initial_count = script_cache->script_count; + for (i = 0; i < count; ++i) { - 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); - } - } + 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 (!(initial_count && (script = usp10_script_cache_get_script(script_cache, tag))) + && !(script = usp10_script_cache_add_script(script_cache, tag))) + return; + + script->table[table] = (const BYTE *)list + GET_BE_WORD(list->ScriptRecord[i].Script); } } -static void GPOS_expand_script_cache(ScriptCache *psc) +static void _initialize_script_cache(ScriptCache *script_cache) { - int i, count; - const OT_ScriptList *script; - const GPOS_Header* header = (const GPOS_Header*)psc->GPOS_Table; - LoadedScript *loaded_script; + const GPOS_Header *gpos_header; + const GSUB_Header *gsub_header; - if (!header) + if (script_cache->scripts_initialized) return; - script = (const OT_ScriptList*)((const BYTE*)header + GET_BE_WORD(header->ScriptList)); - count = GET_BE_WORD(script->ScriptCount); + 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 (!count) - return; + 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))); - 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 - { - 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]); - - 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; - } - - loaded_script = &psc->scripts[psc->script_count]; - ++psc->script_count; - loaded_script->tag = tag; - } - loaded_script->gpos_table = (const BYTE *)script + offset; - } - } -} - -static void _initialize_script_cache(ScriptCache *psc) -{ - if (!psc->scripts_initialized) - { - GSUB_initialize_script_cache(psc); - GPOS_expand_script_cache(psc); - psc->scripts_initialized = TRUE; - } + script_cache->scripts_initialized = TRUE; } HRESULT OpenType_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags) @@ -2699,6 +2675,23 @@ HRESULT OpenType_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, return rc; } +static LoadedLanguage *usp10_script_add_language(LoadedScript *script, OPENTYPE_TAG tag) +{ + LoadedLanguage *language; + + if (!usp10_array_reserve((void **)&script->languages, &script->languages_size, + script->language_count + 1, sizeof(*script->languages))) + { + ERR("Failed to grow languages array.\n"); + return NULL; + } + + language = &script->languages[script->language_count++]; + language->tag = tag; + + return language; +} + static LoadedLanguage *usp10_script_get_language(LoadedScript *script, OPENTYPE_TAG tag) { size_t i; @@ -2712,107 +2705,57 @@ static LoadedLanguage *usp10_script_get_language(LoadedScript *script, OPENTYPE_ return NULL; } -static void GSUB_initialize_language_cache(LoadedScript *script) +static void usp10_script_add_language_list(LoadedScript *script, + enum usp10_language_table table, const OT_Script *list) { - int i; - - if (script->gsub_table) - { - 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); - } - } - } -} - -static void GPOS_expand_language_cache(LoadedScript *script) -{ - 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; + TRACE("script %p, table %#x, list %p.\n", script, table, list); - offset = GET_BE_WORD(table->DefaultLangSys); - if (offset) - script->default_language.gpos_table = (const BYTE*)table + offset; - - count = GET_BE_WORD(table->LangSysCount); - - TRACE("Deflang %p, LangCount %i\n",script->default_language.gpos_table, count); - - if (!count) - return; - - if (!script->language_count) + if ((offset = GET_BE_WORD(list->DefaultLangSys))) { - int i; - script->language_count = 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].gpos_table = ((const BYTE*)table + offset); - } + 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]); } - else if (count) + + if (!(count = GET_BE_WORD(list->LangSysCount))) + return; + + TRACE("Adding %lu languages.\n", 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 ca084e7285f..3827000122a 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 fe83722053b..ab3af43ba85 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 22295132bb2..fea68918c9c 100644 --- a/dll/win32/usp10/usp10_internal.h +++ b/dll/win32/usp10/usp10_internal.h @@ -154,19 +154,32 @@ typedef struct { WORD *lookups; } LoadedFeature; -typedef struct { - OPENTYPE_TAG tag; - const void *gsub_table; - const void *gpos_table; - BOOL features_initialized; - INT feature_count; - LoadedFeature *features; -} LoadedLanguage; +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; + 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 *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 6ebb064c602..20f1cfb5a2f 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