Switch Pango to new, defunt, GPOS
authorBehdad Esfahbod <behdad@behdad.org>
Mon, 18 May 2009 21:43:49 +0000 (17:43 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 2 Nov 2009 19:40:13 +0000 (14:40 -0500)
src/hb-ot-layout-gpos-private.h
src/hb-ot-layout.cc
src/hb-ot-layout.h

index b0b9513..056131b 100644 (file)
@@ -843,16 +843,24 @@ struct PosLookup : Lookup {
     if (HB_UNLIKELY (!buffer->in_length))
       return false;
 
-    _hb_buffer_clear_positions (buffer);
+    layout->gpos_info.last = 0xFFFF; /* no last valid glyph for cursive pos. */
+
     buffer->in_pos = 0;
     while (buffer->in_pos < buffer->in_length) {
 
-      if ((~IN_PROPERTIES (buffer->in_pos) & mask) &&
-         position_once (layout, buffer))
-       ret = true;
-      else
-       _hb_buffer_next_glyph (buffer);
-
+      bool done;
+      if (~IN_PROPERTIES (buffer->in_pos) & mask) {
+         done = position_once (layout, buffer);
+         ret |= done;
+      } else {
+          done = false;
+         /* Contrary to properties defined in GDEF, user-defined properties
+            will always stop a possible cursive positioning.                */
+         layout->gpos_info.last = 0xFFFF;
+      }
+
+      if (!done)
+       buffer->in_pos++;
     }
 
     return ret;
index 46f4555..4bb2eb5 100644 (file)
@@ -531,6 +531,19 @@ hb_ot_layout_substitute_lookup (hb_ot_layout_t              *layout,
   return layout->gsub->substitute_lookup (layout, buffer, lookup_index, mask);
 }
 
+/*
+ * GPOS
+ */
+
+hb_bool_t
+hb_ot_layout_position_lookup   (hb_ot_layout_t              *layout,
+                               hb_buffer_t                 *buffer,
+                               unsigned int                 lookup_index,
+                               hb_ot_layout_feature_mask_t  mask)
+{
+  return layout->gpos->position_lookup (layout, buffer, lookup_index, mask);
+}
+
 
 
 /* TODO dupped, until he old code can be removed */
index f6c0c44..f907b65 100644 (file)
@@ -207,6 +207,11 @@ hb_ot_layout_substitute_lookup (hb_ot_layout_t              *layout,
                                unsigned int                 lookup_index,
                                hb_ot_layout_feature_mask_t  mask);
 
+hb_bool_t
+hb_ot_layout_position_lookup   (hb_ot_layout_t              *layout,
+                               hb_buffer_t                 *buffer,
+                               unsigned int                 lookup_index,
+                               hb_ot_layout_feature_mask_t  mask);