Fix ChanContext backtrack matching with GPOS
authorKhaled Hosny <khaledhosny@eglug.org>
Fri, 19 Aug 2011 18:14:33 +0000 (20:14 +0200)
committerKhaled Hosny <khaledhosny@eglug.org>
Fri, 19 Aug 2011 18:14:33 +0000 (20:14 +0200)
Backported from HarfBuzz-ng:
http://cgit.freedesktop.org/harfbuzz/commit/?id=cc1a8a938b4c13e76b58825a9e1951c4134e634a

pango/opentype/hb-buffer-private.h
pango/opentype/hb-ot-layout-gsubgpos-private.hh

index f194786..58185e7 100644 (file)
@@ -130,6 +130,7 @@ _hb_buffer_allocate_lig_id (hb_buffer_t *buffer);
 #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 BACKTRACK_LEN()                ((buffer->have_output? buffer->out_length : buffer->in_pos))
 
 HB_END_DECLS
 
index 0bb96a4..f681f51 100644 (file)
@@ -144,10 +144,10 @@ static inline bool match_backtrack (APPLY_ARG_DEF,
                                    match_func_t match_func,
                                    char *match_data)
 {
-  if (HB_UNLIKELY (buffer->out_pos < count))
+  if (HB_UNLIKELY (BACKTRACK_LEN () < count))
     return false;
 
-  for (unsigned int i = 0, j = buffer->out_pos - 1; i < count; i++, j--)
+  for (unsigned int i = 0, j = BACKTRACK_LEN () - 1; i < count; i++, j--)
   {
     while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), lookup_flag, NULL))
     {
@@ -536,7 +536,7 @@ static inline bool chain_context_lookup (APPLY_ARG_DEF,
                                         ChainContextLookupContext &lookup_context)
 {
   /* First guess */
-  if (HB_UNLIKELY (buffer->out_pos < backtrackCount ||
+  if (HB_UNLIKELY (BACKTRACK_LEN () < backtrackCount ||
                   buffer->in_pos + inputCount + lookaheadCount > buffer->in_length ||
                   inputCount + lookaheadCount > context_length))
     return false;