Move buffer into apply_context
This commit is contained in:
parent
63493f956d
commit
94a23aaeca
|
@ -132,20 +132,24 @@ HB_INTERNAL unsigned short
|
|||
_hb_buffer_allocate_lig_id (hb_buffer_t *buffer);
|
||||
|
||||
|
||||
#ifndef BUFFER
|
||||
#define BUFFER buffer
|
||||
#endif
|
||||
|
||||
/* convenience macros */
|
||||
#define IN_GLYPH(pos) (buffer->in_string[(pos)].codepoint)
|
||||
#define IN_INFO(pos) (&buffer->in_string[(pos)])
|
||||
#define IN_CURGLYPH() (buffer->in_string[buffer->in_pos].codepoint)
|
||||
#define IN_NEXTGLYPH() (buffer->in_string[buffer->in_pos + 1].codepoint)
|
||||
#define IN_CURINFO() (&buffer->in_string[buffer->in_pos])
|
||||
#define IN_MASK(pos) (buffer->in_string[(pos)].mask)
|
||||
#define IN_CLUSTER(pos) (buffer->in_string[(pos)].cluster)
|
||||
#define IN_LIGID(pos) (buffer->in_string[(pos)].lig_id)
|
||||
#define IN_COMPONENT(pos) (buffer->in_string[(pos)].component)
|
||||
#define POSITION(pos) (&buffer->positions[(pos)])
|
||||
#define CURPOSITION() (&buffer->positions[buffer->in_pos])
|
||||
#define OUT_GLYPH(pos) (buffer->out_string[(pos)].codepoint)
|
||||
#define OUT_INFO(pos) (&buffer->out_string[(pos)])
|
||||
#define IN_GLYPH(pos) (BUFFER->in_string[(pos)].codepoint)
|
||||
#define IN_INFO(pos) (&BUFFER->in_string[(pos)])
|
||||
#define IN_CURGLYPH() (BUFFER->in_string[BUFFER->in_pos].codepoint)
|
||||
#define IN_NEXTGLYPH() (BUFFER->in_string[BUFFER->in_pos + 1].codepoint)
|
||||
#define IN_CURINFO() (&BUFFER->in_string[BUFFER->in_pos])
|
||||
#define IN_MASK(pos) (BUFFER->in_string[(pos)].mask)
|
||||
#define IN_CLUSTER(pos) (BUFFER->in_string[(pos)].cluster)
|
||||
#define IN_LIGID(pos) (BUFFER->in_string[(pos)].lig_id)
|
||||
#define IN_COMPONENT(pos) (BUFFER->in_string[(pos)].component)
|
||||
#define POSITION(pos) (&BUFFER->positions[(pos)])
|
||||
#define CURPOSITION() (&BUFFER->positions[BUFFER->in_pos])
|
||||
#define OUT_GLYPH(pos) (BUFFER->out_string[(pos)].codepoint)
|
||||
#define OUT_INFO(pos) (&BUFFER->out_string[(pos)])
|
||||
|
||||
HB_END_DECLS
|
||||
|
||||
|
|
|
@ -29,6 +29,11 @@
|
|||
|
||||
#include "hb-ot-layout-gsubgpos-private.hh"
|
||||
|
||||
|
||||
#undef BUFFER
|
||||
#define BUFFER context->buffer
|
||||
|
||||
|
||||
#define HB_OT_LAYOUT_GPOS_NO_LAST ((unsigned int) -1)
|
||||
|
||||
/* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
|
||||
|
@ -391,14 +396,14 @@ struct MarkArray
|
|||
mark_anchor.get_anchor (context->layout, IN_CURGLYPH (), &mark_x, &mark_y);
|
||||
glyph_anchor.get_anchor (context->layout, IN_GLYPH (glyph_pos), &base_x, &base_y);
|
||||
|
||||
hb_internal_glyph_position_t *o = POSITION (buffer->in_pos);
|
||||
hb_internal_glyph_position_t *o = POSITION (context->buffer->in_pos);
|
||||
o->x_advance = 0;
|
||||
o->y_advance = 0;
|
||||
o->x_offset = base_x - mark_x;
|
||||
o->y_offset = base_y - mark_y;
|
||||
o->back = buffer->in_pos - glyph_pos;
|
||||
o->back = context->buffer->in_pos - glyph_pos;
|
||||
|
||||
buffer->in_pos++;
|
||||
context->buffer->in_pos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -430,7 +435,7 @@ struct SinglePosFormat1
|
|||
|
||||
valueFormat.apply_value (context->layout, CharP(this), values, CURPOSITION ());
|
||||
|
||||
buffer->in_pos++;
|
||||
context->buffer->in_pos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -473,7 +478,7 @@ struct SinglePosFormat2
|
|||
&values[index * valueFormat.get_len ()],
|
||||
CURPOSITION ());
|
||||
|
||||
buffer->in_pos++;
|
||||
context->buffer->in_pos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -572,15 +577,15 @@ struct PairPosFormat1
|
|||
inline bool apply (APPLY_ARG_DEF) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
unsigned int end = MIN (buffer->in_length, buffer->in_pos + context_length);
|
||||
if (unlikely (buffer->in_pos + 2 > end))
|
||||
unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
|
||||
if (unlikely (context->buffer->in_pos + 2 > end))
|
||||
return false;
|
||||
|
||||
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
||||
if (likely (index == NOT_COVERED))
|
||||
return false;
|
||||
|
||||
unsigned int j = buffer->in_pos + 1;
|
||||
unsigned int j = context->buffer->in_pos + 1;
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, IN_INFO (j), context->lookup_flag, NULL))
|
||||
{
|
||||
if (unlikely (j == end))
|
||||
|
@ -603,7 +608,7 @@ struct PairPosFormat1
|
|||
valueFormat2.apply_value (context->layout, CharP(this), &record->values[len1], POSITION (j));
|
||||
if (len2)
|
||||
j++;
|
||||
buffer->in_pos = j;
|
||||
context->buffer->in_pos = j;
|
||||
return true;
|
||||
}
|
||||
record = &StructAtOffset<PairValueRecord> (*record, record_size);
|
||||
|
@ -665,15 +670,15 @@ struct PairPosFormat2
|
|||
inline bool apply (APPLY_ARG_DEF) const
|
||||
{
|
||||
TRACE_APPLY ();
|
||||
unsigned int end = MIN (buffer->in_length, buffer->in_pos + context_length);
|
||||
if (unlikely (buffer->in_pos + 2 > end))
|
||||
unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
|
||||
if (unlikely (context->buffer->in_pos + 2 > end))
|
||||
return false;
|
||||
|
||||
unsigned int index = (this+coverage) (IN_CURGLYPH ());
|
||||
if (likely (index == NOT_COVERED))
|
||||
return false;
|
||||
|
||||
unsigned int j = buffer->in_pos + 1;
|
||||
unsigned int j = context->buffer->in_pos + 1;
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, IN_INFO (j), context->lookup_flag, NULL))
|
||||
{
|
||||
if (unlikely (j == end))
|
||||
|
@ -696,7 +701,7 @@ struct PairPosFormat2
|
|||
|
||||
if (len2)
|
||||
j++;
|
||||
buffer->in_pos = j;
|
||||
context->buffer->in_pos = j;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -949,10 +954,10 @@ struct CursivePosFormat1
|
|||
|
||||
/* TODO vertical */
|
||||
|
||||
if (buffer->direction == HB_DIRECTION_RTL)
|
||||
if (context->buffer->direction == HB_DIRECTION_RTL)
|
||||
{
|
||||
/* advance is absolute, not relative */
|
||||
POSITION (buffer->in_pos)->x_advance = entry_x - gpi->anchor_x;
|
||||
POSITION (context->buffer->in_pos)->x_advance = entry_x - gpi->anchor_x;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -962,23 +967,23 @@ struct CursivePosFormat1
|
|||
|
||||
if (context->lookup_flag & LookupFlag::RightToLeft)
|
||||
{
|
||||
POSITION (last_pos)->cursive_chain = last_pos - buffer->in_pos;
|
||||
POSITION (last_pos)->cursive_chain = last_pos - context->buffer->in_pos;
|
||||
POSITION (last_pos)->y_offset = entry_y - gpi->anchor_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
POSITION (buffer->in_pos)->cursive_chain = buffer->in_pos - last_pos;
|
||||
POSITION (buffer->in_pos)->y_offset = gpi->anchor_y - entry_y;
|
||||
POSITION (context->buffer->in_pos)->cursive_chain = context->buffer->in_pos - last_pos;
|
||||
POSITION (context->buffer->in_pos)->y_offset = gpi->anchor_y - entry_y;
|
||||
}
|
||||
|
||||
end:
|
||||
if (record.exitAnchor)
|
||||
{
|
||||
gpi->last = buffer->in_pos;
|
||||
gpi->last = context->buffer->in_pos;
|
||||
(this+record.exitAnchor).get_anchor (context->layout, IN_CURGLYPH (), &gpi->anchor_x, &gpi->anchor_y);
|
||||
}
|
||||
|
||||
buffer->in_pos++;
|
||||
context->buffer->in_pos++;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1049,7 +1054,7 @@ struct MarkBasePosFormat1
|
|||
|
||||
/* now we search backwards for a non-mark glyph */
|
||||
unsigned int property;
|
||||
unsigned int j = buffer->in_pos;
|
||||
unsigned int j = context->buffer->in_pos;
|
||||
do
|
||||
{
|
||||
if (unlikely (!j))
|
||||
|
@ -1152,7 +1157,7 @@ struct MarkLigPosFormat1
|
|||
|
||||
/* now we search backwards for a non-mark glyph */
|
||||
unsigned int property;
|
||||
unsigned int j = buffer->in_pos;
|
||||
unsigned int j = context->buffer->in_pos;
|
||||
do
|
||||
{
|
||||
if (unlikely (!j))
|
||||
|
@ -1182,9 +1187,9 @@ struct MarkLigPosFormat1
|
|||
* 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
|
||||
* glyph to the last component of the ligature. */
|
||||
if (IN_LIGID (j) && IN_LIGID (j) == IN_LIGID (buffer->in_pos) && IN_COMPONENT (buffer->in_pos))
|
||||
if (IN_LIGID (j) && IN_LIGID (j) == IN_LIGID (context->buffer->in_pos) && IN_COMPONENT (context->buffer->in_pos))
|
||||
{
|
||||
comp_index = IN_COMPONENT (buffer->in_pos) - 1;
|
||||
comp_index = IN_COMPONENT (context->buffer->in_pos) - 1;
|
||||
if (comp_index >= comp_count)
|
||||
comp_index = comp_count - 1;
|
||||
}
|
||||
|
@ -1272,7 +1277,7 @@ struct MarkMarkPosFormat1
|
|||
|
||||
/* now we search backwards for a suitable mark glyph until a non-mark glyph */
|
||||
unsigned int property;
|
||||
unsigned int j = buffer->in_pos;
|
||||
unsigned int j = context->buffer->in_pos;
|
||||
do
|
||||
{
|
||||
if (unlikely (!j))
|
||||
|
@ -1286,8 +1291,8 @@ struct MarkMarkPosFormat1
|
|||
/* 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
|
||||
* if those are non-zero, the ligid number should also match. */
|
||||
if ((IN_COMPONENT (j) != IN_COMPONENT (buffer->in_pos)) ||
|
||||
(IN_COMPONENT (j) && IN_LIGID (j) != IN_LIGID (buffer->in_pos)))
|
||||
if ((IN_COMPONENT (j) != IN_COMPONENT (context->buffer->in_pos)) ||
|
||||
(IN_COMPONENT (j) && IN_LIGID (j) != IN_LIGID (context->buffer->in_pos)))
|
||||
return false;
|
||||
|
||||
unsigned int mark2_index = (this+mark2Coverage) (IN_GLYPH (j));
|
||||
|
@ -1489,6 +1494,7 @@ struct PosLookup : Lookup
|
|||
hb_apply_context_t context[1];
|
||||
|
||||
context->layout = layout;
|
||||
context->buffer = buffer;
|
||||
context->nesting_level_left = nesting_level_left;
|
||||
context->lookup_flag = get_flag ();
|
||||
|
||||
|
@ -1506,6 +1512,8 @@ struct PosLookup : Lookup
|
|||
hb_buffer_t *buffer,
|
||||
hb_mask_t mask) const
|
||||
{
|
||||
#undef BUFFER
|
||||
#define BUFFER buffer
|
||||
bool ret = false;
|
||||
|
||||
if (unlikely (!buffer->in_length))
|
||||
|
@ -1603,7 +1611,7 @@ static inline bool position_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
|
|||
if (unlikely (context_length < 1))
|
||||
return false;
|
||||
|
||||
return l.apply_once (context->layout, buffer, context_length, context->nesting_level_left - 1, apply_depth + 1);
|
||||
return l.apply_once (context->layout, context->buffer, context_length, context->nesting_level_left - 1, apply_depth + 1);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -30,6 +30,10 @@
|
|||
#include "hb-ot-layout-gsubgpos-private.hh"
|
||||
|
||||
|
||||
#undef BUFFER
|
||||
#define BUFFER context->buffer
|
||||
|
||||
|
||||
struct SingleSubstFormat1
|
||||
{
|
||||
friend struct SingleSubst;
|
||||
|
@ -45,7 +49,7 @@ struct SingleSubstFormat1
|
|||
return false;
|
||||
|
||||
glyph_id += deltaGlyphID;
|
||||
_hb_buffer_replace_glyph (buffer, glyph_id);
|
||||
_hb_buffer_replace_glyph (context->buffer, glyph_id);
|
||||
|
||||
/* We inherit the old glyph class to the substituted glyph */
|
||||
if (_hb_ot_layout_has_new_glyph_classes (context->layout->face))
|
||||
|
@ -88,7 +92,7 @@ struct SingleSubstFormat2
|
|||
return false;
|
||||
|
||||
glyph_id = substitute[index];
|
||||
_hb_buffer_replace_glyph (buffer, glyph_id);
|
||||
_hb_buffer_replace_glyph (context->buffer, glyph_id);
|
||||
|
||||
/* We inherit the old glyph class to the substituted glyph */
|
||||
if (_hb_ot_layout_has_new_glyph_classes (context->layout->face))
|
||||
|
@ -160,7 +164,7 @@ struct Sequence
|
|||
if (unlikely (!substitute.len))
|
||||
return false;
|
||||
|
||||
_hb_buffer_add_output_glyphs_be16 (buffer, 1,
|
||||
_hb_buffer_add_output_glyphs_be16 (context->buffer, 1,
|
||||
substitute.len, (const uint16_t *) substitute.array(),
|
||||
0xFFFF, 0xFFFF);
|
||||
|
||||
|
@ -285,8 +289,8 @@ struct AlternateSubstFormat1
|
|||
|
||||
/* XXX callback to user to choose alternate
|
||||
if (context->layout->face->altfunc)
|
||||
alt_index = (context->layout->face->altfunc)(context->layout->layout, buffer,
|
||||
buffer->out_pos, glyph_id,
|
||||
alt_index = (context->layout->face->altfunc)(context->layout->layout, context->buffer,
|
||||
context->buffer->out_pos, glyph_id,
|
||||
alt_set.len, alt_set.array);
|
||||
*/
|
||||
|
||||
|
@ -295,7 +299,7 @@ struct AlternateSubstFormat1
|
|||
|
||||
glyph_id = alt_set[alt_index];
|
||||
|
||||
_hb_buffer_replace_glyph (buffer, glyph_id);
|
||||
_hb_buffer_replace_glyph (context->buffer, glyph_id);
|
||||
|
||||
/* We inherit the old glyph class to the substituted glyph */
|
||||
if (_hb_ot_layout_has_new_glyph_classes (context->layout->face))
|
||||
|
@ -363,11 +367,11 @@ struct Ligature
|
|||
TRACE_APPLY ();
|
||||
unsigned int i, j;
|
||||
unsigned int count = component.len;
|
||||
unsigned int end = MIN (buffer->in_length, buffer->in_pos + context_length);
|
||||
if (unlikely (buffer->in_pos + count > end))
|
||||
unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
|
||||
if (unlikely (context->buffer->in_pos + count > end))
|
||||
return false;
|
||||
|
||||
for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++)
|
||||
for (i = 1, j = context->buffer->in_pos + 1; i < count; i++, j++)
|
||||
{
|
||||
unsigned int property;
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, IN_INFO (j), context->lookup_flag, &property))
|
||||
|
@ -389,18 +393,18 @@ struct Ligature
|
|||
is_mark ? HB_OT_LAYOUT_GLYPH_CLASS_MARK
|
||||
: HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE);
|
||||
|
||||
if (j == buffer->in_pos + i) /* No input glyphs skipped */
|
||||
if (j == context->buffer->in_pos + i) /* No input glyphs skipped */
|
||||
/* We don't use a new ligature ID if there are no skipped
|
||||
glyphs and the ligature already has an ID. */
|
||||
_hb_buffer_add_output_glyphs_be16 (buffer, i,
|
||||
_hb_buffer_add_output_glyphs_be16 (context->buffer, i,
|
||||
1, (const uint16_t *) &ligGlyph,
|
||||
0,
|
||||
IN_LIGID (buffer->in_pos) && !IN_COMPONENT (buffer->in_pos) ?
|
||||
0xFFFF : _hb_buffer_allocate_lig_id (buffer));
|
||||
IN_LIGID (context->buffer->in_pos) && !IN_COMPONENT (context->buffer->in_pos) ?
|
||||
0xFFFF : _hb_buffer_allocate_lig_id (context->buffer));
|
||||
else
|
||||
{
|
||||
unsigned int lig_id = _hb_buffer_allocate_lig_id (buffer);
|
||||
_hb_buffer_add_output_glyph (buffer, ligGlyph, 0xFFFF, lig_id);
|
||||
unsigned int lig_id = _hb_buffer_allocate_lig_id (context->buffer);
|
||||
_hb_buffer_add_output_glyph (context->buffer, ligGlyph, 0xFFFF, lig_id);
|
||||
|
||||
/* Now we must do a second loop to copy the skipped glyphs to
|
||||
`out' and assign component values to it. We start with the
|
||||
|
@ -412,9 +416,9 @@ struct Ligature
|
|||
for ( i = 1; i < count; i++ )
|
||||
{
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, IN_CURINFO (), context->lookup_flag, NULL))
|
||||
_hb_buffer_add_output_glyph (buffer, IN_CURGLYPH (), i, lig_id);
|
||||
_hb_buffer_add_output_glyph (context->buffer, IN_CURGLYPH (), i, lig_id);
|
||||
|
||||
(buffer->in_pos)++;
|
||||
(context->buffer->in_pos)++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -612,7 +616,7 @@ struct ReverseChainSingleSubstFormat1
|
|||
1))
|
||||
{
|
||||
IN_CURGLYPH () = substitute[index];
|
||||
buffer->in_pos--; /* Reverse! */
|
||||
context->buffer->in_pos--; /* Reverse! */
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -775,6 +779,7 @@ struct SubstLookup : Lookup
|
|||
hb_apply_context_t context[1];
|
||||
|
||||
context->layout = layout;
|
||||
context->buffer = buffer;
|
||||
context->nesting_level_left = nesting_level_left;
|
||||
context->lookup_flag = get_flag ();
|
||||
|
||||
|
@ -807,6 +812,8 @@ struct SubstLookup : Lookup
|
|||
hb_buffer_t *buffer,
|
||||
hb_mask_t mask) const
|
||||
{
|
||||
#undef BUFFER
|
||||
#define BUFFER buffer
|
||||
bool ret = false;
|
||||
|
||||
if (unlikely (!buffer->in_length))
|
||||
|
@ -923,7 +930,7 @@ static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
|
|||
if (unlikely (context_length < 1))
|
||||
return false;
|
||||
|
||||
return l.apply_once (context->layout, buffer, context_length, context->nesting_level_left - 1, apply_depth + 1);
|
||||
return l.apply_once (context->layout, context->buffer, context_length, context->nesting_level_left - 1, apply_depth + 1);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -44,24 +44,29 @@
|
|||
|
||||
#define APPLY_ARG_DEF \
|
||||
hb_apply_context_t *context, \
|
||||
hb_buffer_t *buffer, \
|
||||
unsigned int context_length HB_UNUSED, \
|
||||
unsigned int apply_depth HB_UNUSED
|
||||
#define APPLY_ARG \
|
||||
context, \
|
||||
buffer, \
|
||||
context_length, \
|
||||
(HB_DEBUG_APPLY ? apply_depth + 1 : 0)
|
||||
|
||||
struct hb_apply_context_t
|
||||
{
|
||||
hb_ot_layout_context_t *layout;
|
||||
hb_buffer_t *buffer;
|
||||
unsigned int nesting_level_left;
|
||||
unsigned int lookup_flag;
|
||||
unsigned int property; /* propety of first glyph (TODO remove) */
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#undef BUFFER
|
||||
#define BUFFER context->buffer
|
||||
|
||||
|
||||
typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const char *data);
|
||||
typedef bool (*apply_lookup_func_t) (APPLY_ARG_DEF, unsigned int lookup_index);
|
||||
|
||||
|
@ -98,11 +103,11 @@ static inline bool match_input (APPLY_ARG_DEF,
|
|||
unsigned int *context_length_out)
|
||||
{
|
||||
unsigned int i, j;
|
||||
unsigned int end = MIN (buffer->in_length, buffer->in_pos + context_length);
|
||||
if (unlikely (buffer->in_pos + count > end))
|
||||
unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
|
||||
if (unlikely (context->buffer->in_pos + count > end))
|
||||
return false;
|
||||
|
||||
for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++)
|
||||
for (i = 1, j = context->buffer->in_pos + 1; i < count; i++, j++)
|
||||
{
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, IN_INFO (j), context->lookup_flag, NULL))
|
||||
{
|
||||
|
@ -115,7 +120,7 @@ static inline bool match_input (APPLY_ARG_DEF,
|
|||
return false;
|
||||
}
|
||||
|
||||
*context_length_out = j - buffer->in_pos;
|
||||
*context_length_out = j - context->buffer->in_pos;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -126,10 +131,10 @@ static inline bool match_backtrack (APPLY_ARG_DEF,
|
|||
match_func_t match_func,
|
||||
const char *match_data)
|
||||
{
|
||||
if (unlikely (buffer->out_pos < count))
|
||||
if (unlikely (context->buffer->out_pos < count))
|
||||
return false;
|
||||
|
||||
for (unsigned int i = 0, j = buffer->out_pos - 1; i < count; i++, j--)
|
||||
for (unsigned int i = 0, j = context->buffer->out_pos - 1; i < count; i++, j--)
|
||||
{
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, OUT_INFO (j), context->lookup_flag, NULL))
|
||||
{
|
||||
|
@ -153,11 +158,11 @@ static inline bool match_lookahead (APPLY_ARG_DEF,
|
|||
unsigned int offset)
|
||||
{
|
||||
unsigned int i, j;
|
||||
unsigned int end = MIN (buffer->in_length, buffer->in_pos + context_length);
|
||||
if (unlikely (buffer->in_pos + offset + count > end))
|
||||
unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
|
||||
if (unlikely (context->buffer->in_pos + offset + count > end))
|
||||
return false;
|
||||
|
||||
for (i = 0, j = buffer->in_pos + offset; i < count; i++, j++)
|
||||
for (i = 0, j = context->buffer->in_pos + offset; i < count; i++, j++)
|
||||
{
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, OUT_INFO (j), context->lookup_flag, NULL))
|
||||
{
|
||||
|
@ -196,8 +201,8 @@ static inline bool apply_lookup (APPLY_ARG_DEF,
|
|||
const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
|
||||
apply_lookup_func_t apply_func)
|
||||
{
|
||||
unsigned int end = MIN (buffer->in_length, buffer->in_pos + context_length);
|
||||
if (unlikely (buffer->in_pos + count > end))
|
||||
unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
|
||||
if (unlikely (context->buffer->in_pos + count > end))
|
||||
return false;
|
||||
|
||||
/* TODO We don't support lookupRecord arrays that are not increasing:
|
||||
|
@ -211,15 +216,15 @@ static inline bool apply_lookup (APPLY_ARG_DEF,
|
|||
{
|
||||
while (_hb_ot_layout_skip_mark (context->layout->face, IN_CURINFO (), context->lookup_flag, NULL))
|
||||
{
|
||||
if (unlikely (buffer->in_pos == end))
|
||||
if (unlikely (context->buffer->in_pos == end))
|
||||
return true;
|
||||
/* No lookup applied for this index */
|
||||
_hb_buffer_next_glyph (buffer);
|
||||
_hb_buffer_next_glyph (context->buffer);
|
||||
}
|
||||
|
||||
if (lookupCount && i == lookupRecord->sequenceIndex)
|
||||
{
|
||||
unsigned int old_pos = buffer->in_pos;
|
||||
unsigned int old_pos = context->buffer->in_pos;
|
||||
|
||||
/* Apply a lookup */
|
||||
bool done = apply_func (APPLY_ARG, lookupRecord->lookupListIndex);
|
||||
|
@ -227,8 +232,8 @@ static inline bool apply_lookup (APPLY_ARG_DEF,
|
|||
lookupRecord++;
|
||||
lookupCount--;
|
||||
/* Err, this is wrong if the lookup jumped over some glyphs */
|
||||
i += buffer->in_pos - old_pos;
|
||||
if (unlikely (buffer->in_pos == end))
|
||||
i += context->buffer->in_pos - old_pos;
|
||||
if (unlikely (context->buffer->in_pos == end))
|
||||
return true;
|
||||
|
||||
if (!done)
|
||||
|
@ -238,7 +243,7 @@ static inline bool apply_lookup (APPLY_ARG_DEF,
|
|||
{
|
||||
not_applied:
|
||||
/* No lookup applied for this index */
|
||||
_hb_buffer_next_glyph (buffer);
|
||||
_hb_buffer_next_glyph (context->buffer);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
@ -522,9 +527,9 @@ static inline bool chain_context_lookup (APPLY_ARG_DEF,
|
|||
ChainContextLookupContext &lookup_context)
|
||||
{
|
||||
/* First guess */
|
||||
if (unlikely (buffer->out_pos < backtrackCount ||
|
||||
buffer->in_pos + inputCount + lookaheadCount > buffer->in_length ||
|
||||
inputCount + lookaheadCount > context_length))
|
||||
if (unlikely (context->buffer->out_pos < backtrackCount ||
|
||||
context->buffer->in_pos + inputCount + lookaheadCount > context->buffer->in_length ||
|
||||
inputCount + lookaheadCount > context_length))
|
||||
return false;
|
||||
|
||||
unsigned int offset;
|
||||
|
|
Loading…
Reference in New Issue