[PATCH 1/5] dwrite: Fix lookup collection when no suitable script was found.
Nikolay Sivov
nsivov at codeweavers.com
Mon Jun 1 04:23:33 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/opentype.c | 46 +++++++++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 19 deletions(-)
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index f4e9d3305a4..c724327c507 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -4403,9 +4403,10 @@ static void opentype_layout_collect_lookups(struct scriptshaping_context *contex
unsigned int language_index, const struct shaping_features *features, const struct ot_gsubgpos_table *table,
struct lookups *lookups)
{
- UINT16 table_offset, langsys_offset, script_feature_count, total_feature_count, total_lookup_count;
+ unsigned int last_num_lookups = 0, stage, script_feature_count = 0;
+ UINT16 total_feature_count, total_lookup_count;
const struct ot_feature_list *feature_list;
- unsigned int last_num_lookups = 0, stage;
+ const struct ot_langsys *langsys = NULL;
struct shaping_feature *feature;
unsigned int i, j, next_bit;
unsigned int global_bit_shift = 1;
@@ -4415,23 +4416,31 @@ static void opentype_layout_collect_lookups(struct scriptshaping_context *contex
if (!table->table.data)
return;
- /* ScriptTable offset. */
- table_offset = table_read_be_word(&table->table, table->script_list + FIELD_OFFSET(struct ot_script_list, scripts) +
- script_index * sizeof(struct ot_script_record) + FIELD_OFFSET(struct ot_script_record, script));
- if (!table_offset)
- return;
+ if (script_index != ~0u)
+ {
+ unsigned int table_offset, langsys_offset;
- if (language_index == ~0u)
- langsys_offset = table_read_be_word(&table->table, table->script_list + table_offset);
- else
- langsys_offset = table_read_be_word(&table->table, table->script_list + table_offset +
- FIELD_OFFSET(struct ot_script, langsys) + language_index * sizeof(struct ot_langsys_record) +
- FIELD_OFFSET(struct ot_langsys_record, langsys));
+ /* ScriptTable offset. */
+ table_offset = table_read_be_word(&table->table, table->script_list + FIELD_OFFSET(struct ot_script_list, scripts) +
+ script_index * sizeof(struct ot_script_record) + FIELD_OFFSET(struct ot_script_record, script));
+ if (!table_offset)
+ return;
- script_feature_count = table_read_be_word(&table->table, table->script_list + table_offset + langsys_offset +
- FIELD_OFFSET(struct ot_langsys, feature_count));
- if (!script_feature_count)
- return;
+ if (language_index == ~0u)
+ langsys_offset = table_read_be_word(&table->table, table->script_list + table_offset);
+ else
+ langsys_offset = table_read_be_word(&table->table, table->script_list + table_offset +
+ FIELD_OFFSET(struct ot_script, langsys) + language_index * sizeof(struct ot_langsys_record) +
+ FIELD_OFFSET(struct ot_langsys_record, langsys));
+ langsys_offset += table->script_list + table_offset;
+
+ script_feature_count = table_read_be_word(&table->table, langsys_offset + FIELD_OFFSET(struct ot_langsys, feature_count));
+ if (script_feature_count)
+ langsys = table_read_ensure(&table->table, langsys_offset,
+ FIELD_OFFSET(struct ot_langsys, feature_index[script_feature_count]));
+ if (!langsys)
+ script_feature_count = 0;
+ }
total_feature_count = table_read_be_word(&table->table, table->feature_list);
if (!total_feature_count)
@@ -4467,8 +4476,7 @@ static void opentype_layout_collect_lookups(struct scriptshaping_context *contex
for (j = 0; j < script_feature_count; ++j)
{
- feature_index = table_read_be_word(&table->table, table->script_list + table_offset +
- langsys_offset + FIELD_OFFSET(struct ot_langsys, feature_index[j]));
+ feature_index = GET_BE_WORD(langsys->feature_index[j]);
if (feature_index >= total_feature_count)
continue;
if ((found = feature_list->features[feature_index].tag == feature->tag))
--
2.26.2
More information about the wine-devel
mailing list