Get rid of the OpenType-specific internal buffer representation
Add variant integers to buffer item types. More cleanup coming.
This commit is contained in:
parent
6cb8c34930
commit
88474c6fda
2
TODO
2
TODO
|
@ -3,8 +3,6 @@ General fixes:
|
||||||
|
|
||||||
- Fix tt kern on/off
|
- Fix tt kern on/off
|
||||||
|
|
||||||
- Remove hb_internal_glyph_info_t, etc
|
|
||||||
|
|
||||||
- Remove synthesized GDEF
|
- Remove synthesized GDEF
|
||||||
|
|
||||||
- Remove fixed-size feature/lookup arrays in hb-ot-map
|
- Remove fixed-size feature/lookup arrays in hb-ot-map
|
||||||
|
|
|
@ -36,30 +36,13 @@ HB_BEGIN_DECLS
|
||||||
|
|
||||||
|
|
||||||
#define HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
|
#define HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
|
||||||
|
#define component() var1.u16[0]
|
||||||
|
#define lig_id() var1.u16[1]
|
||||||
|
#define gproperty() var2.u32
|
||||||
|
#define back() var.u16[0] /* number of glyphs to go back for drawing current glyph */
|
||||||
|
#define cursive_chain() var.i16[1] /* character to which this connects, may be positive or negative */
|
||||||
|
|
||||||
|
ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
|
||||||
typedef struct _hb_internal_glyph_info_t {
|
|
||||||
hb_codepoint_t codepoint;
|
|
||||||
hb_mask_t mask;
|
|
||||||
uint32_t cluster;
|
|
||||||
uint16_t component;
|
|
||||||
uint16_t lig_id;
|
|
||||||
uint32_t gproperty;
|
|
||||||
} hb_internal_glyph_info_t;
|
|
||||||
|
|
||||||
typedef struct _hb_internal_glyph_position_t {
|
|
||||||
hb_position_t x_advance;
|
|
||||||
hb_position_t y_advance;
|
|
||||||
hb_position_t x_offset;
|
|
||||||
hb_position_t y_offset;
|
|
||||||
uint32_t back : 16; /* number of glyphs to go back
|
|
||||||
for drawing current glyph */
|
|
||||||
int32_t cursive_chain : 16; /* character to which this connects,
|
|
||||||
may be positive or negative */
|
|
||||||
} hb_internal_glyph_position_t;
|
|
||||||
|
|
||||||
ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_internal_glyph_info_t));
|
|
||||||
ASSERT_STATIC (sizeof (hb_glyph_position_t) == sizeof (hb_internal_glyph_position_t));
|
|
||||||
ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
|
ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
|
||||||
|
|
||||||
typedef struct _hb_segment_properties_t {
|
typedef struct _hb_segment_properties_t {
|
||||||
|
@ -137,9 +120,9 @@ struct _hb_buffer_t {
|
||||||
unsigned int len; /* Length of ->info and ->pos arrays */
|
unsigned int len; /* Length of ->info and ->pos arrays */
|
||||||
unsigned int out_len; /* Length of ->out array */
|
unsigned int out_len; /* Length of ->out array */
|
||||||
|
|
||||||
hb_internal_glyph_info_t *info;
|
hb_glyph_info_t *info;
|
||||||
hb_internal_glyph_info_t *out_info;
|
hb_glyph_info_t *out_info;
|
||||||
hb_internal_glyph_position_t *pos;
|
hb_glyph_position_t *pos;
|
||||||
|
|
||||||
/* Other stuff */
|
/* Other stuff */
|
||||||
|
|
||||||
|
|
|
@ -64,8 +64,8 @@ _hb_buffer_enlarge (hb_buffer_t *buffer, unsigned int size)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
unsigned int new_allocated = buffer->allocated;
|
unsigned int new_allocated = buffer->allocated;
|
||||||
hb_internal_glyph_position_t *new_pos;
|
hb_glyph_position_t *new_pos;
|
||||||
hb_internal_glyph_info_t *new_info;
|
hb_glyph_info_t *new_info;
|
||||||
bool separate_out;
|
bool separate_out;
|
||||||
|
|
||||||
separate_out = buffer->out_info != buffer->info;
|
separate_out = buffer->out_info != buffer->info;
|
||||||
|
@ -73,8 +73,8 @@ _hb_buffer_enlarge (hb_buffer_t *buffer, unsigned int size)
|
||||||
while (size > new_allocated)
|
while (size > new_allocated)
|
||||||
new_allocated += (new_allocated >> 1) + 8;
|
new_allocated += (new_allocated >> 1) + 8;
|
||||||
|
|
||||||
new_pos = (hb_internal_glyph_position_t *) realloc (buffer->pos, new_allocated * sizeof (buffer->pos[0]));
|
new_pos = (hb_glyph_position_t *) realloc (buffer->pos, new_allocated * sizeof (buffer->pos[0]));
|
||||||
new_info = (hb_internal_glyph_info_t *) realloc (buffer->info, new_allocated * sizeof (buffer->info[0]));
|
new_info = (hb_glyph_info_t *) realloc (buffer->info, new_allocated * sizeof (buffer->info[0]));
|
||||||
|
|
||||||
if (unlikely (!new_pos || !new_info))
|
if (unlikely (!new_pos || !new_info))
|
||||||
buffer->in_error = TRUE;
|
buffer->in_error = TRUE;
|
||||||
|
@ -85,7 +85,7 @@ _hb_buffer_enlarge (hb_buffer_t *buffer, unsigned int size)
|
||||||
if (likely (new_info))
|
if (likely (new_info))
|
||||||
buffer->info = new_info;
|
buffer->info = new_info;
|
||||||
|
|
||||||
buffer->out_info = separate_out ? (hb_internal_glyph_info_t *) buffer->pos : buffer->info;
|
buffer->out_info = separate_out ? (hb_glyph_info_t *) buffer->pos : buffer->info;
|
||||||
if (likely (!buffer->in_error))
|
if (likely (!buffer->in_error))
|
||||||
buffer->allocated = new_allocated;
|
buffer->allocated = new_allocated;
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ _hb_buffer_ensure_separate (hb_buffer_t *buffer, unsigned int size)
|
||||||
{
|
{
|
||||||
assert (buffer->have_output);
|
assert (buffer->have_output);
|
||||||
|
|
||||||
buffer->out_info = (hb_internal_glyph_info_t *) buffer->pos;
|
buffer->out_info = (hb_glyph_info_t *) buffer->pos;
|
||||||
memcpy (buffer->out_info, buffer->info, buffer->out_len * sizeof (buffer->out_info[0]));
|
memcpy (buffer->out_info, buffer->info, buffer->out_len * sizeof (buffer->out_info[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ hb_buffer_add_glyph (hb_buffer_t *buffer,
|
||||||
hb_mask_t mask,
|
hb_mask_t mask,
|
||||||
unsigned int cluster)
|
unsigned int cluster)
|
||||||
{
|
{
|
||||||
hb_internal_glyph_info_t *glyph;
|
hb_glyph_info_t *glyph;
|
||||||
|
|
||||||
if (unlikely (!_hb_buffer_ensure (buffer, buffer->len + 1))) return;
|
if (unlikely (!_hb_buffer_ensure (buffer, buffer->len + 1))) return;
|
||||||
|
|
||||||
|
@ -251,9 +251,9 @@ hb_buffer_add_glyph (hb_buffer_t *buffer,
|
||||||
glyph->codepoint = codepoint;
|
glyph->codepoint = codepoint;
|
||||||
glyph->mask = mask;
|
glyph->mask = mask;
|
||||||
glyph->cluster = cluster;
|
glyph->cluster = cluster;
|
||||||
glyph->component = 0;
|
glyph->component() = 0;
|
||||||
glyph->lig_id = 0;
|
glyph->lig_id() = 0;
|
||||||
glyph->gproperty = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
glyph->gproperty() = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
||||||
|
|
||||||
buffer->len++;
|
buffer->len++;
|
||||||
}
|
}
|
||||||
|
@ -267,7 +267,7 @@ hb_buffer_clear_positions (hb_buffer_t *buffer)
|
||||||
|
|
||||||
if (unlikely (!buffer->pos))
|
if (unlikely (!buffer->pos))
|
||||||
{
|
{
|
||||||
buffer->pos = (hb_internal_glyph_position_t *) calloc (buffer->allocated, sizeof (buffer->pos[0]));
|
buffer->pos = (hb_glyph_position_t *) calloc (buffer->allocated, sizeof (buffer->pos[0]));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,11 +296,11 @@ _hb_buffer_swap (hb_buffer_t *buffer)
|
||||||
|
|
||||||
if (buffer->out_info != buffer->info)
|
if (buffer->out_info != buffer->info)
|
||||||
{
|
{
|
||||||
hb_internal_glyph_info_t *tmp_string;
|
hb_glyph_info_t *tmp_string;
|
||||||
tmp_string = buffer->info;
|
tmp_string = buffer->info;
|
||||||
buffer->info = buffer->out_info;
|
buffer->info = buffer->out_info;
|
||||||
buffer->out_info = tmp_string;
|
buffer->out_info = tmp_string;
|
||||||
buffer->pos = (hb_internal_glyph_position_t *) buffer->out_info;
|
buffer->pos = (hb_glyph_position_t *) buffer->out_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = buffer->len;
|
tmp = buffer->len;
|
||||||
|
@ -352,19 +352,19 @@ _hb_buffer_add_output_glyphs (hb_buffer_t *buffer,
|
||||||
mask = buffer->info[buffer->i].mask;
|
mask = buffer->info[buffer->i].mask;
|
||||||
cluster = buffer->info[buffer->i].cluster;
|
cluster = buffer->info[buffer->i].cluster;
|
||||||
if (component == 0xFFFF)
|
if (component == 0xFFFF)
|
||||||
component = buffer->info[buffer->i].component;
|
component = buffer->info[buffer->i].component();
|
||||||
if (lig_id == 0xFFFF)
|
if (lig_id == 0xFFFF)
|
||||||
lig_id = buffer->info[buffer->i].lig_id;
|
lig_id = buffer->info[buffer->i].lig_id();
|
||||||
|
|
||||||
for (i = 0; i < num_out; i++)
|
for (i = 0; i < num_out; i++)
|
||||||
{
|
{
|
||||||
hb_internal_glyph_info_t *info = &buffer->out_info[buffer->out_len + i];
|
hb_glyph_info_t *info = &buffer->out_info[buffer->out_len + i];
|
||||||
info->codepoint = glyph_data[i];
|
info->codepoint = glyph_data[i];
|
||||||
info->mask = mask;
|
info->mask = mask;
|
||||||
info->cluster = cluster;
|
info->cluster = cluster;
|
||||||
info->component = component;
|
info->component() = component;
|
||||||
info->lig_id = lig_id;
|
info->lig_id() = lig_id;
|
||||||
info->gproperty = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
info->gproperty() = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->i += num_in;
|
buffer->i += num_in;
|
||||||
|
@ -393,19 +393,19 @@ _hb_buffer_add_output_glyphs_be16 (hb_buffer_t *buffer,
|
||||||
mask = buffer->info[buffer->i].mask;
|
mask = buffer->info[buffer->i].mask;
|
||||||
cluster = buffer->info[buffer->i].cluster;
|
cluster = buffer->info[buffer->i].cluster;
|
||||||
if (component == 0xFFFF)
|
if (component == 0xFFFF)
|
||||||
component = buffer->info[buffer->i].component;
|
component = buffer->info[buffer->i].component();
|
||||||
if (lig_id == 0xFFFF)
|
if (lig_id == 0xFFFF)
|
||||||
lig_id = buffer->info[buffer->i].lig_id;
|
lig_id = buffer->info[buffer->i].lig_id();
|
||||||
|
|
||||||
for (i = 0; i < num_out; i++)
|
for (i = 0; i < num_out; i++)
|
||||||
{
|
{
|
||||||
hb_internal_glyph_info_t *info = &buffer->out_info[buffer->out_len + i];
|
hb_glyph_info_t *info = &buffer->out_info[buffer->out_len + i];
|
||||||
info->codepoint = hb_be_uint16 (glyph_data_be[i]);
|
info->codepoint = hb_be_uint16 (glyph_data_be[i]);
|
||||||
info->mask = mask;
|
info->mask = mask;
|
||||||
info->cluster = cluster;
|
info->cluster = cluster;
|
||||||
info->component = component;
|
info->component() = component;
|
||||||
info->lig_id = lig_id;
|
info->lig_id() = lig_id;
|
||||||
info->gproperty = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
info->gproperty() = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->i += num_in;
|
buffer->i += num_in;
|
||||||
|
@ -418,7 +418,7 @@ _hb_buffer_add_output_glyph (hb_buffer_t *buffer,
|
||||||
unsigned short component,
|
unsigned short component,
|
||||||
unsigned short lig_id)
|
unsigned short lig_id)
|
||||||
{
|
{
|
||||||
hb_internal_glyph_info_t *info;
|
hb_glyph_info_t *info;
|
||||||
|
|
||||||
if (buffer->out_info != buffer->info)
|
if (buffer->out_info != buffer->info)
|
||||||
{
|
{
|
||||||
|
@ -431,10 +431,10 @@ _hb_buffer_add_output_glyph (hb_buffer_t *buffer,
|
||||||
info = &buffer->out_info[buffer->out_len];
|
info = &buffer->out_info[buffer->out_len];
|
||||||
info->codepoint = glyph_index;
|
info->codepoint = glyph_index;
|
||||||
if (component != 0xFFFF)
|
if (component != 0xFFFF)
|
||||||
info->component = component;
|
info->component() = component;
|
||||||
if (lig_id != 0xFFFF)
|
if (lig_id != 0xFFFF)
|
||||||
info->lig_id = lig_id;
|
info->lig_id() = lig_id;
|
||||||
info->gproperty = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
info->gproperty() = HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN;
|
||||||
|
|
||||||
buffer->i++;
|
buffer->i++;
|
||||||
buffer->out_len++;
|
buffer->out_len++;
|
||||||
|
@ -548,7 +548,7 @@ reverse_range (hb_buffer_t *buffer,
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
for (i = start, j = end - 1; i < j; i++, j--) {
|
for (i = start, j = end - 1; i < j; i++, j--) {
|
||||||
hb_internal_glyph_info_t t;
|
hb_glyph_info_t t;
|
||||||
|
|
||||||
t = buffer->info[i];
|
t = buffer->info[i];
|
||||||
buffer->info[i] = buffer->info[j];
|
buffer->info[i] = buffer->info[j];
|
||||||
|
@ -557,7 +557,7 @@ reverse_range (hb_buffer_t *buffer,
|
||||||
|
|
||||||
if (buffer->pos) {
|
if (buffer->pos) {
|
||||||
for (i = 0, j = end - 1; i < j; i++, j--) {
|
for (i = 0, j = end - 1; i < j; i++, j--) {
|
||||||
hb_internal_glyph_position_t t;
|
hb_glyph_position_t t;
|
||||||
|
|
||||||
t = buffer->pos[i];
|
t = buffer->pos[i];
|
||||||
buffer->pos[i] = buffer->pos[j];
|
buffer->pos[i] = buffer->pos[j];
|
||||||
|
|
|
@ -50,7 +50,7 @@ typedef struct _hb_glyph_position_t {
|
||||||
hb_position_t y_advance;
|
hb_position_t y_advance;
|
||||||
hb_position_t x_offset;
|
hb_position_t x_offset;
|
||||||
hb_position_t y_offset;
|
hb_position_t y_offset;
|
||||||
hb_var_int_t var1;
|
hb_var_int_t var;
|
||||||
} hb_glyph_position_t;
|
} hb_glyph_position_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ struct ValueFormat : USHORT
|
||||||
void apply_value (hb_ot_layout_context_t *layout,
|
void apply_value (hb_ot_layout_context_t *layout,
|
||||||
const void *base,
|
const void *base,
|
||||||
const Value *values,
|
const Value *values,
|
||||||
hb_internal_glyph_position_t &glyph_pos) const
|
hb_glyph_position_t &glyph_pos) const
|
||||||
{
|
{
|
||||||
unsigned int x_ppem, y_ppem;
|
unsigned int x_ppem, y_ppem;
|
||||||
unsigned int format = *this;
|
unsigned int format = *this;
|
||||||
|
@ -399,10 +399,10 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
|
||||||
mark_anchor.get_anchor (c->layout, c->buffer->info[c->buffer->i].codepoint, &mark_x, &mark_y);
|
mark_anchor.get_anchor (c->layout, c->buffer->info[c->buffer->i].codepoint, &mark_x, &mark_y);
|
||||||
glyph_anchor.get_anchor (c->layout, c->buffer->info[glyph_pos].codepoint, &base_x, &base_y);
|
glyph_anchor.get_anchor (c->layout, c->buffer->info[glyph_pos].codepoint, &base_x, &base_y);
|
||||||
|
|
||||||
hb_internal_glyph_position_t &o = c->buffer->pos[c->buffer->i];
|
hb_glyph_position_t &o = c->buffer->pos[c->buffer->i];
|
||||||
o.x_offset = base_x - mark_x;
|
o.x_offset = base_x - mark_x;
|
||||||
o.y_offset = base_y - mark_y;
|
o.y_offset = base_y - mark_y;
|
||||||
o.back = c->buffer->i - glyph_pos;
|
o.back() = c->buffer->i - glyph_pos;
|
||||||
|
|
||||||
c->buffer->i++;
|
c->buffer->i++;
|
||||||
return true;
|
return true;
|
||||||
|
@ -876,7 +876,7 @@ struct CursivePosFormat1
|
||||||
|
|
||||||
if (c->lookup_flag & LookupFlag::RightToLeft)
|
if (c->lookup_flag & LookupFlag::RightToLeft)
|
||||||
{
|
{
|
||||||
c->buffer->pos[i].cursive_chain = j - i;
|
c->buffer->pos[i].cursive_chain() = j - i;
|
||||||
if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
|
if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
|
||||||
c->buffer->pos[i].y_offset = entry_y - exit_y;
|
c->buffer->pos[i].y_offset = entry_y - exit_y;
|
||||||
else
|
else
|
||||||
|
@ -884,7 +884,7 @@ struct CursivePosFormat1
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c->buffer->pos[j].cursive_chain = i - j;
|
c->buffer->pos[j].cursive_chain() = i - j;
|
||||||
if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
|
if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
|
||||||
c->buffer->pos[j].y_offset = exit_y - entry_y;
|
c->buffer->pos[j].y_offset = exit_y - entry_y;
|
||||||
else
|
else
|
||||||
|
@ -1093,9 +1093,9 @@ struct MarkLigPosFormat1
|
||||||
* is identical to the ligature ID of the found ligature. If yes, we
|
* is identical to the ligature ID of the found ligature. If yes, we
|
||||||
* can directly use the component index. If not, we attach the mark
|
* can directly use the component index. If not, we attach the mark
|
||||||
* glyph to the last component of the ligature. */
|
* glyph to the last component of the ligature. */
|
||||||
if (c->buffer->info[j].lig_id && c->buffer->info[j].lig_id == c->buffer->info[c->buffer->i].lig_id && c->buffer->info[c->buffer->i].component)
|
if (c->buffer->info[j].lig_id() && c->buffer->info[j].lig_id() == c->buffer->info[c->buffer->i].lig_id() && c->buffer->info[c->buffer->i].component())
|
||||||
{
|
{
|
||||||
comp_index = c->buffer->info[c->buffer->i].component - 1;
|
comp_index = c->buffer->info[c->buffer->i].component() - 1;
|
||||||
if (comp_index >= comp_count)
|
if (comp_index >= comp_count)
|
||||||
comp_index = comp_count - 1;
|
comp_index = comp_count - 1;
|
||||||
}
|
}
|
||||||
|
@ -1198,8 +1198,8 @@ struct MarkMarkPosFormat1
|
||||||
/* Two marks match only if they belong to the same base, or same component
|
/* Two marks match only if they belong to the same base, or same component
|
||||||
* of the same ligature. That is, the component numbers must match, and
|
* of the same ligature. That is, the component numbers must match, and
|
||||||
* if those are non-zero, the ligid number should also match. */
|
* if those are non-zero, the ligid number should also match. */
|
||||||
if ((c->buffer->info[j].component != c->buffer->info[c->buffer->i].component) ||
|
if ((c->buffer->info[j].component() != c->buffer->info[c->buffer->i].component()) ||
|
||||||
(c->buffer->info[j].component && c->buffer->info[j].lig_id != c->buffer->info[c->buffer->i].lig_id))
|
(c->buffer->info[j].component() && c->buffer->info[j].lig_id() != c->buffer->info[c->buffer->i].lig_id()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint);
|
unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint);
|
||||||
|
|
|
@ -398,7 +398,7 @@ struct Ligature
|
||||||
c->buffer->add_output_glyphs_be16 (i,
|
c->buffer->add_output_glyphs_be16 (i,
|
||||||
1, (const uint16_t *) &ligGlyph,
|
1, (const uint16_t *) &ligGlyph,
|
||||||
0,
|
0,
|
||||||
c->buffer->info[c->buffer->i].lig_id && !c->buffer->info[c->buffer->i].component ?
|
c->buffer->info[c->buffer->i].lig_id() && !c->buffer->info[c->buffer->i].component() ?
|
||||||
0xFFFF : c->buffer->allocate_lig_id ());
|
0xFFFF : c->buffer->allocate_lig_id ());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -101,13 +101,13 @@ _hb_ot_layout_set_glyph_class (hb_face_t *face,
|
||||||
|
|
||||||
HB_INTERNAL hb_bool_t
|
HB_INTERNAL hb_bool_t
|
||||||
_hb_ot_layout_check_glyph_property (hb_face_t *face,
|
_hb_ot_layout_check_glyph_property (hb_face_t *face,
|
||||||
hb_internal_glyph_info_t *ginfo,
|
hb_glyph_info_t *ginfo,
|
||||||
unsigned int lookup_flags,
|
unsigned int lookup_flags,
|
||||||
unsigned int *property);
|
unsigned int *property);
|
||||||
|
|
||||||
HB_INTERNAL hb_bool_t
|
HB_INTERNAL hb_bool_t
|
||||||
_hb_ot_layout_skip_mark (hb_face_t *face,
|
_hb_ot_layout_skip_mark (hb_face_t *face,
|
||||||
hb_internal_glyph_info_t *ginfo,
|
hb_glyph_info_t *ginfo,
|
||||||
unsigned int lookup_flags,
|
unsigned int lookup_flags,
|
||||||
unsigned int *property);
|
unsigned int *property);
|
||||||
|
|
||||||
|
|
|
@ -138,15 +138,15 @@ _hb_ot_layout_get_glyph_property (hb_face_t *face,
|
||||||
|
|
||||||
hb_bool_t
|
hb_bool_t
|
||||||
_hb_ot_layout_check_glyph_property (hb_face_t *face,
|
_hb_ot_layout_check_glyph_property (hb_face_t *face,
|
||||||
hb_internal_glyph_info_t *ginfo,
|
hb_glyph_info_t *ginfo,
|
||||||
unsigned int lookup_flags,
|
unsigned int lookup_flags,
|
||||||
unsigned int *property_out)
|
unsigned int *property_out)
|
||||||
{
|
{
|
||||||
unsigned int property;
|
unsigned int property;
|
||||||
|
|
||||||
if (ginfo->gproperty == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
|
if (ginfo->gproperty() == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
|
||||||
ginfo->gproperty = _hb_ot_layout_get_glyph_property (face, ginfo->codepoint);
|
ginfo->gproperty() = _hb_ot_layout_get_glyph_property (face, ginfo->codepoint);
|
||||||
property = ginfo->gproperty;
|
property = ginfo->gproperty();
|
||||||
if (property_out)
|
if (property_out)
|
||||||
*property_out = property;
|
*property_out = property;
|
||||||
|
|
||||||
|
@ -177,15 +177,15 @@ _hb_ot_layout_check_glyph_property (hb_face_t *face,
|
||||||
|
|
||||||
hb_bool_t
|
hb_bool_t
|
||||||
_hb_ot_layout_skip_mark (hb_face_t *face,
|
_hb_ot_layout_skip_mark (hb_face_t *face,
|
||||||
hb_internal_glyph_info_t *ginfo,
|
hb_glyph_info_t *ginfo,
|
||||||
unsigned int lookup_flags,
|
unsigned int lookup_flags,
|
||||||
unsigned int *property_out)
|
unsigned int *property_out)
|
||||||
{
|
{
|
||||||
unsigned int property;
|
unsigned int property;
|
||||||
|
|
||||||
if (ginfo->gproperty == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
|
if (ginfo->gproperty() == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
|
||||||
ginfo->gproperty = _hb_ot_layout_get_glyph_property (face, ginfo->codepoint);
|
ginfo->gproperty() = _hb_ot_layout_get_glyph_property (face, ginfo->codepoint);
|
||||||
property = ginfo->gproperty;
|
property = ginfo->gproperty();
|
||||||
if (property_out)
|
if (property_out)
|
||||||
*property_out = property;
|
*property_out = property;
|
||||||
|
|
||||||
|
@ -606,7 +606,7 @@ hb_ot_layout_position_finish (hb_font_t *font HB_UNUSED,
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
unsigned int len = hb_buffer_get_length (buffer);
|
unsigned int len = hb_buffer_get_length (buffer);
|
||||||
hb_internal_glyph_position_t *pos = (hb_internal_glyph_position_t *) hb_buffer_get_glyph_positions (buffer);
|
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer);
|
||||||
hb_direction_t direction = buffer->props.direction;
|
hb_direction_t direction = buffer->props.direction;
|
||||||
|
|
||||||
/* TODO: Vertical */
|
/* TODO: Vertical */
|
||||||
|
@ -616,35 +616,34 @@ hb_ot_layout_position_finish (hb_font_t *font HB_UNUSED,
|
||||||
if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
|
if (likely (HB_DIRECTION_IS_HORIZONTAL (direction)))
|
||||||
{
|
{
|
||||||
for (j = 0; j < len; j++) {
|
for (j = 0; j < len; j++) {
|
||||||
if (pos[j].cursive_chain < 0)
|
if (pos[j].cursive_chain() < 0)
|
||||||
pos[j].y_offset += pos[j + pos[j].cursive_chain].y_offset;
|
pos[j].y_offset += pos[j + pos[j].cursive_chain()].y_offset;
|
||||||
}
|
}
|
||||||
for (i = len; i > 0; i--) {
|
for (i = len; i > 0; i--) {
|
||||||
j = i - 1;
|
j = i - 1;
|
||||||
if (pos[j].cursive_chain > 0)
|
if (pos[j].cursive_chain() > 0)
|
||||||
pos[j].y_offset += pos[j + pos[j].cursive_chain].y_offset;
|
pos[j].y_offset += pos[j + pos[j].cursive_chain()].y_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (j = 0; j < len; j++) {
|
for (j = 0; j < len; j++) {
|
||||||
if (pos[j].cursive_chain < 0)
|
if (pos[j].cursive_chain() < 0)
|
||||||
pos[j].x_offset += pos[j + pos[j].cursive_chain].x_offset;
|
pos[j].x_offset += pos[j + pos[j].cursive_chain()].x_offset;
|
||||||
}
|
}
|
||||||
for (i = len; i > 0; i--) {
|
for (i = len; i > 0; i--) {
|
||||||
j = i - 1;
|
j = i - 1;
|
||||||
if (pos[j].cursive_chain > 0)
|
if (pos[j].cursive_chain() > 0)
|
||||||
pos[j].x_offset += pos[j + pos[j].cursive_chain].x_offset;
|
pos[j].x_offset += pos[j + pos[j].cursive_chain()].x_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Handle attachments */
|
/* Handle attachments */
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
if (pos[i].back)
|
if (pos[i].back())
|
||||||
{
|
{
|
||||||
unsigned int back = i - pos[i].back;
|
unsigned int back = i - pos[i].back();
|
||||||
pos[i].back = 0;
|
|
||||||
pos[i].x_offset += pos[back].x_offset;
|
pos[i].x_offset += pos[back].x_offset;
|
||||||
pos[i].y_offset += pos[back].y_offset;
|
pos[i].y_offset += pos[back].y_offset;
|
||||||
|
|
||||||
|
|
|
@ -690,16 +690,16 @@ _hb_ot_shape_complex_setup_masks_arabic (hb_ot_shape_context_t *c)
|
||||||
unsigned int this_type = get_joining_type (c->buffer->info[i].codepoint, c->buffer->unicode->v.get_general_category (c->buffer->info[i].codepoint));
|
unsigned int this_type = get_joining_type (c->buffer->info[i].codepoint, c->buffer->unicode->v.get_general_category (c->buffer->info[i].codepoint));
|
||||||
|
|
||||||
if (unlikely (this_type == JOINING_TYPE_T)) {
|
if (unlikely (this_type == JOINING_TYPE_T)) {
|
||||||
c->buffer->info[i].gproperty = NONE;
|
c->buffer->info[i].var2.u32 = NONE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
|
const arabic_state_table_entry *entry = &arabic_state_table[state][this_type];
|
||||||
|
|
||||||
if (entry->prev_action != NONE)
|
if (entry->prev_action != NONE)
|
||||||
c->buffer->info[prev].gproperty = entry->prev_action;
|
c->buffer->info[prev].var2.u32 = entry->prev_action;
|
||||||
|
|
||||||
c->buffer->info[i].gproperty = entry->curr_action;
|
c->buffer->info[i].var2.u32 = entry->curr_action;
|
||||||
|
|
||||||
prev = i;
|
prev = i;
|
||||||
state = entry->next_state;
|
state = entry->next_state;
|
||||||
|
@ -711,7 +711,7 @@ _hb_ot_shape_complex_setup_masks_arabic (hb_ot_shape_context_t *c)
|
||||||
mask_array[i] = c->plan->map.get_1_mask (arabic_syriac_features[i]);
|
mask_array[i] = c->plan->map.get_1_mask (arabic_syriac_features[i]);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
c->buffer->info[i].mask |= mask_array[c->buffer->info[i].gproperty];
|
c->buffer->info[i].mask |= mask_array[c->buffer->info[i].var2.u32];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue