[PATCH 2/5] dwrite: Use single table pointer in GPOS handlers.

Nikolay Sivov nsivov at codeweavers.com
Tue Jun 16 06:56:39 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/opentype.c | 70 ++++++++++++++++++------------------------
 1 file changed, 30 insertions(+), 40 deletions(-)

diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 419326fb2be..d7099b8adf9 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -3497,7 +3497,7 @@ static float opentype_scale_gpos_be_value(WORD value, float emsize, UINT16 upem)
 
 static int opentype_layout_gpos_get_dev_value(const struct scriptshaping_context *context, unsigned int offset)
 {
-    const struct scriptshaping_cache *cache = context->cache;
+    const struct dwrite_fonttable *table = &context->table->table;
     unsigned int start_size, end_size, format, value_word;
     unsigned int index, ppem, mask;
     int value;
@@ -3505,22 +3505,21 @@ static int opentype_layout_gpos_get_dev_value(const struct scriptshaping_context
     if (!offset)
         return 0;
 
-    start_size = table_read_be_word(&cache->gpos.table, offset);
-    end_size = table_read_be_word(&cache->gpos.table, offset + FIELD_OFFSET(struct ot_gpos_device_table, end_size));
+    start_size = table_read_be_word(table, offset);
+    end_size = table_read_be_word(table, offset + FIELD_OFFSET(struct ot_gpos_device_table, end_size));
 
     ppem = context->emsize;
     if (ppem < start_size || ppem > end_size)
         return 0;
 
-    format = table_read_be_word(&cache->gpos.table, offset + FIELD_OFFSET(struct ot_gpos_device_table, format));
+    format = table_read_be_word(table, offset + FIELD_OFFSET(struct ot_gpos_device_table, format));
 
     if (format < 1 || format > 3)
         return 0;
 
     index = ppem - start_size;
 
-    value_word = table_read_be_word(&cache->gpos.table, offset +
-            FIELD_OFFSET(struct ot_gpos_device_table, values[index >> (4 - format)]));
+    value_word = table_read_be_word(table, offset + FIELD_OFFSET(struct ot_gpos_device_table, values[index >> (4 - format)]));
     mask = 0xffff >> (16 - (1 << format));
 
     value = (value_word >> ((index % (4 - format)) * (1 << format))) & mask;
@@ -3812,24 +3811,21 @@ static BOOL opentype_layout_apply_gpos_single_adjustment(struct scriptshaping_co
         const struct lookup *lookup, unsigned int subtable_offset)
 {
     const struct dwrite_fonttable *table = &context->table->table;
-    struct scriptshaping_cache *cache = context->cache;
     UINT16 format, value_format, value_len, coverage, glyph;
 
     unsigned int coverage_index;
 
-    format = table_read_be_word(&cache->gpos.table, subtable_offset);
+    format = table_read_be_word(table, subtable_offset);
 
-    coverage = table_read_be_word(&cache->gpos.table, subtable_offset +
-            FIELD_OFFSET(struct ot_gpos_singlepos_format1, coverage));
-    value_format = table_read_be_word(&cache->gpos.table, subtable_offset +
-            FIELD_OFFSET(struct ot_gpos_singlepos_format1, value_format));
+    coverage = table_read_be_word(table, subtable_offset + FIELD_OFFSET(struct ot_gpos_singlepos_format1, coverage));
+    value_format = table_read_be_word(table, subtable_offset + FIELD_OFFSET(struct ot_gpos_singlepos_format1, value_format));
     value_len = dwrite_popcount(value_format);
 
     glyph = context->u.pos.glyphs[context->cur];
 
     if (format == 1)
     {
-        const struct ot_gpos_singlepos_format1 *format1 = table_read_ensure(&cache->gpos.table, subtable_offset,
+        const struct ot_gpos_singlepos_format1 *format1 = table_read_ensure(table, subtable_offset,
                 FIELD_OFFSET(struct ot_gpos_singlepos_format1, value[value_len]));
 
         coverage_index = opentype_layout_is_glyph_covered(table, subtable_offset + coverage, glyph);
@@ -3840,9 +3836,9 @@ static BOOL opentype_layout_apply_gpos_single_adjustment(struct scriptshaping_co
     }
     else if (format == 2)
     {
-        WORD value_count = table_read_be_word(&cache->gpos.table, subtable_offset +
+        WORD value_count = table_read_be_word(table, subtable_offset +
                 FIELD_OFFSET(struct ot_gpos_singlepos_format2, value_count));
-        const struct ot_gpos_singlepos_format2 *format2 = table_read_ensure(&cache->gpos.table, subtable_offset,
+        const struct ot_gpos_singlepos_format2 *format2 = table_read_ensure(table, subtable_offset,
                 FIELD_OFFSET(struct ot_gpos_singlepos_format2, values) + value_count * value_len * sizeof(WORD));
 
         coverage_index = opentype_layout_is_glyph_covered(table, subtable_offset + coverage, glyph);
@@ -3873,8 +3869,7 @@ static int gpos_pair_adjustment_compare_format1(const void *g, const void *r)
 static BOOL opentype_layout_apply_gpos_pair_adjustment(struct scriptshaping_context *context,
         const struct lookup *lookup, unsigned int subtable_offset)
 {
-    struct scriptshaping_cache *cache = context->cache;
-    const struct dwrite_fonttable *table = &cache->gpos.table;
+    const struct dwrite_fonttable *table = &context->table->table;
     unsigned int first_glyph, second_glyph;
     struct glyph_iterator iter_pair;
     WORD format, coverage;
@@ -3910,8 +3905,8 @@ static BOOL opentype_layout_apply_gpos_pair_adjustment(struct scriptshaping_cont
     if (format == 1)
     {
         const struct ot_gpos_pairpos_format1 *format1;
-        WORD pairset_count = table_read_be_word(&cache->gpos.table, subtable_offset +
-                FIELD_OFFSET(struct ot_gpos_pairpos_format1, pairset_count));
+        WORD pairset_count = table_read_be_word(table, subtable_offset + FIELD_OFFSET(struct ot_gpos_pairpos_format1,
+                pairset_count));
         unsigned int pairvalue_len, pairset_offset;
         const struct ot_gpos_pairset *pairset;
         const WORD *pairvalue;
@@ -3939,8 +3934,7 @@ static BOOL opentype_layout_apply_gpos_pair_adjustment(struct scriptshaping_cont
                 value_len2 * sizeof(WORD);
 
         pairset_offset = subtable_offset + GET_BE_WORD(format1->pairsets[coverage_index]);
-        pairset = table_read_ensure(&cache->gpos.table, subtable_offset + pairset_offset,
-                pairvalue_len * pairvalue_count);
+        pairset = table_read_ensure(table, subtable_offset + pairset_offset, pairvalue_len * pairvalue_count);
         if (!pairset)
             return FALSE;
 
@@ -4011,15 +4005,15 @@ static void opentype_layout_gpos_get_anchor(const struct scriptshaping_context *
         unsigned int glyph_index, float *x, float *y)
 {
     const struct scriptshaping_cache *cache = context->cache;
+    const struct dwrite_fonttable *table = &context->table->table;
 
-    WORD format = table_read_be_word(&cache->gpos.table, anchor_offset);
+    WORD format = table_read_be_word(table, anchor_offset);
 
     *x = *y = 0.0f;
 
     if (format == 1)
     {
-        const struct ot_gpos_anchor_format1 *format1 = table_read_ensure(&cache->gpos.table, anchor_offset,
-                sizeof(*format1));
+        const struct ot_gpos_anchor_format1 *format1 = table_read_ensure(table, anchor_offset, sizeof(*format1));
 
         if (format1)
         {
@@ -4029,8 +4023,7 @@ static void opentype_layout_gpos_get_anchor(const struct scriptshaping_context *
     }
     else if (format == 2)
     {
-        const struct ot_gpos_anchor_format2 *format2 = table_read_ensure(&cache->gpos.table, anchor_offset,
-                sizeof(*format2));
+        const struct ot_gpos_anchor_format2 *format2 = table_read_ensure(table, anchor_offset, sizeof(*format2));
 
         if (format2)
         {
@@ -4043,8 +4036,7 @@ static void opentype_layout_gpos_get_anchor(const struct scriptshaping_context *
     }
     else if (format == 3)
     {
-        const struct ot_gpos_anchor_format3 *format3 = table_read_ensure(&cache->gpos.table, anchor_offset,
-                sizeof(*format3));
+        const struct ot_gpos_anchor_format3 *format3 = table_read_ensure(table, anchor_offset, sizeof(*format3));
 
         if (format3)
         {
@@ -4067,10 +4059,11 @@ static void opentype_layout_gpos_get_anchor(const struct scriptshaping_context *
 static BOOL opentype_layout_apply_gpos_cursive_attachment(struct scriptshaping_context *context,
         const struct lookup *lookup, unsigned int subtable_offset)
 {
-    struct scriptshaping_cache *cache = context->cache;
-    const struct dwrite_fonttable *table = &cache->gpos.table;
-    WORD format = table_read_be_word(&cache->gpos.table, subtable_offset);
-    UINT16 glyph = context->u.pos.glyphs[context->cur];
+    const struct dwrite_fonttable *table = &context->table->table;
+    UINT16 format, glyph;
+
+    format = table_read_be_word(table, subtable_offset);
+    glyph = context->u.pos.glyphs[context->cur];
 
     if (format == 1)
     {
@@ -4145,8 +4138,7 @@ static BOOL opentype_layout_apply_gpos_cursive_attachment(struct scriptshaping_c
 static BOOL opentype_layout_apply_gpos_mark_to_base_attachment(struct scriptshaping_context *context,
         const struct lookup *lookup, unsigned int subtable_offset)
 {
-    struct scriptshaping_cache *cache = context->cache;
-    const struct dwrite_fonttable *table = &cache->gpos.table;
+    const struct dwrite_fonttable *table = &context->table->table;
     WORD format;
 
     format = table_read_be_word(table, subtable_offset);
@@ -4224,11 +4216,10 @@ static BOOL opentype_layout_apply_gpos_mark_to_base_attachment(struct scriptshap
 static BOOL opentype_layout_apply_gpos_mark_to_lig_attachment(struct scriptshaping_context *context,
         const struct lookup *lookup, unsigned int subtable_offset)
 {
-    struct scriptshaping_cache *cache = context->cache;
-    const struct dwrite_fonttable *table = &cache->gpos.table;
+    const struct dwrite_fonttable *table = &context->table->table;
     WORD format;
 
-    format = table_read_be_word(&cache->gpos.table, subtable_offset);
+    format = table_read_be_word(table, subtable_offset);
 
     if (format == 1)
     {
@@ -4264,8 +4255,7 @@ static BOOL opentype_layout_apply_gpos_mark_to_lig_attachment(struct scriptshapi
 static BOOL opentype_layout_apply_gpos_mark_to_mark_attachment(struct scriptshaping_context *context,
         const struct lookup *lookup, unsigned int subtable_offset)
 {
-    struct scriptshaping_cache *cache = context->cache;
-    const struct dwrite_fonttable *table = &cache->gpos.table;
+    const struct dwrite_fonttable *table = &context->table->table;
     WORD format;
 
     format = table_read_be_word(table, subtable_offset);
@@ -4305,7 +4295,7 @@ static BOOL opentype_layout_apply_gpos_mark_to_mark_attachment(struct scriptshap
             return FALSE;
 
         mark2_array_offset = subtable_offset + GET_BE_WORD(format1->mark2_array);
-        if (!(count = table_read_be_word(&cache->gpos.table, mark2_array_offset)))
+        if (!(count = table_read_be_word(table, mark2_array_offset)))
             return FALSE;
 
         mark_class_count = GET_BE_WORD(format1->mark_class_count);
-- 
2.27.0




More information about the wine-devel mailing list