[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