[pango] Fix ChanContext backtrack matching with GPOS



commit c37ae57816ac22543fd9fbcf880518406cd1457d
Author: Khaled Hosny <khaledhosny eglug org>
Date:   Fri Aug 19 20:14:33 2011 +0200

    Fix ChanContext backtrack matching with GPOS
    
    Backported from HarfBuzz-ng:
    http://cgit.freedesktop.org/harfbuzz/commit/?id=cc1a8a938b4c13e76b58825a9e1951c4134e634a

 pango/opentype/hb-buffer-private.h              |    1 +
 pango/opentype/hb-ot-layout-gsubgpos-private.hh |    6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)
---
diff --git a/pango/opentype/hb-buffer-private.h b/pango/opentype/hb-buffer-private.h
index f194786..58185e7 100644
--- a/pango/opentype/hb-buffer-private.h
+++ b/pango/opentype/hb-buffer-private.h
@@ -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
 
diff --git a/pango/opentype/hb-ot-layout-gsubgpos-private.hh b/pango/opentype/hb-ot-layout-gsubgpos-private.hh
index 0bb96a4..f681f51 100644
--- a/pango/opentype/hb-ot-layout-gsubgpos-private.hh
+++ b/pango/opentype/hb-ot-layout-gsubgpos-private.hh
@@ -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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]