From 7208bc40dcbea8638c4679b451f88ce06f8ab981 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 4 May 2020 11:29:31 +0300 Subject: [PATCH] dwrite: Initialize GSUB offsets in shaping cache. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/opentype.c | 10 ++++++++++ dlls/dwrite/shape.c | 1 + 3 files changed, 12 insertions(+) diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index d89dacb3a47..45161894455 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -448,6 +448,7 @@ struct scriptshaping_cache void *context; UINT16 upem; + struct ot_gsubgpos_table gsub; struct ot_gsubgpos_table gpos; struct diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c index 66c3398316a..a2af5ce954f 100644 --- a/dlls/dwrite/opentype.c +++ b/dlls/dwrite/opentype.c @@ -2942,6 +2942,16 @@ DWRITE_CONTAINER_TYPE opentype_analyze_container_type(void const *data, UINT32 d void opentype_layout_scriptshaping_cache_init(struct scriptshaping_cache *cache) { + cache->font->grab_font_table(cache->context, MS_GSUB_TAG, &cache->gsub.table.data, &cache->gsub.table.size, + &cache->gsub.table.context); + + if (cache->gsub.table.data) + { + cache->gsub.script_list = table_read_be_word(&cache->gsub.table, FIELD_OFFSET(struct gpos_gsub_header, script_list)); + cache->gsub.feature_list = table_read_be_word(&cache->gsub.table, FIELD_OFFSET(struct gpos_gsub_header, feature_list)); + cache->gsub.lookup_list = table_read_be_word(&cache->gsub.table, FIELD_OFFSET(struct gpos_gsub_header, lookup_list)); + } + cache->font->grab_font_table(cache->context, MS_GPOS_TAG, &cache->gpos.table.data, &cache->gpos.table.size, &cache->gpos.table.context); diff --git a/dlls/dwrite/shape.c b/dlls/dwrite/shape.c index d7d1261f356..bd53f035138 100644 --- a/dlls/dwrite/shape.c +++ b/dlls/dwrite/shape.c @@ -52,6 +52,7 @@ void release_scriptshaping_cache(struct scriptshaping_cache *cache) return; cache->font->release_font_table(cache->context, cache->gdef.table.context); + cache->font->release_font_table(cache->context, cache->gsub.table.context); cache->font->release_font_table(cache->context, cache->gpos.table.context); heap_free(cache); }