Update of GPOS and GSUB support to OpenType 1.3 (From FreeType, Werner

Fri Jul 25 23:07:06 2003  Owen Taylor  <otaylor@redhat.com>

        Update of GPOS and GSUB support to OpenType 1.3
        (From FreeType, Werner Lemberg, 2001-08-08)

        * pango/opentype/ftxopen.h: Add RIGHT_TO_LEFT LookupFlag

        * pango/opentype/ftxgpos.c (GPOS_Instance): Add 'first'
        member to mark the beginning of a chain of cursive connections.

        * pango/opentype/ftxgpos.c (Do_String_Lookup): If the
        RIGHT_TO_FLAG flag is set, shift cursive chain up so
        last glyph is on the baseline.
diff --git a/src/ftxgpos.c b/src/ftxgpos.c
index 8a730ec..a183a05 100644
--- a/src/ftxgpos.c
+++ b/src/ftxgpos.c
@@ -43,6 +43,8 @@
     FT_UShort        load_flags;  /* how the glyph should be loaded */
     FT_Bool          r2l;
 
+    FT_UShort        first;       /* the first glyph in a chain of
+                                     cursive connections           */
     FT_UShort        last;        /* the last valid glyph -- used
                                      with cursive positioning     */
     FT_Pos           anchor_x;    /* the coordinates of the anchor point */
@@ -2089,6 +2091,8 @@
       gpi->last = 0xFFFF;
     else
     {
+      if ( gpi->first == 0xFFFF )
+        gpi->first  = in->pos;
       gpi->last     = in->pos;
       gpi->anchor_x = exit_x;
       gpi->anchor_y = exit_y;
@@ -6120,9 +6124,12 @@
     FT_UShort*  p_in       = in->properties;
 
     int      nesting_level = 0;
+    UShort   i;
+    TT_Pos   offset;
 
 
-    gpi->last = 0xFFFF;      /* no last valid glyph for cursive pos. */
+    gpi->first = 0xFFFF;
+    gpi->last  = 0xFFFF;     /* no last valid glyph for cursive pos. */
 
     in->pos = 0;
 
@@ -6153,6 +6160,22 @@
         error = TTO_Err_Not_Covered;
       }
 
+      /* test whether we have to adjust the offsets for cursive connections */
+
+      if ( gpi->first != 0xFFFF && gpi->last == 0xFFFF &&
+           gpos->LookupList.Lookup[lookup_index].LookupFlag & RIGHT_TO_LEFT )
+      {
+        offset = out[in->pos].y_pos;
+
+        /* no horizontal offsets (for vertical writing direction)
+           supported yet                                          */
+
+        for ( i = gpi->first; i <= in->pos; i++ )
+          out[i].y_pos -= offset;
+
+        gpi->first = 0xFFFF;
+      }
+
       if ( error == TTO_Err_Not_Covered )
         (in->pos)++;
       else
diff --git a/src/ftxopen.h b/src/ftxopen.h
index 052f25c..84c85e7 100644
--- a/src/ftxopen.h
+++ b/src/ftxopen.h
@@ -155,9 +155,13 @@
   typedef struct TTO_LookupList_  TTO_LookupList;
 
 
-/* Possible LookupFlag bit masks.  `IGNORE_SPECIAL_MARKS' comes from the
-   OpenType 1.2 specification.                                           */
+  /* Possible LookupFlag bit masks.  `IGNORE_SPECIAL_MARKS' comes from the
+     OpenType 1.2 specification; RIGHT_TO_LEFT has been (re)introduced in
+     OpenType 1.3 -- if set, the last glyph in a cursive attachment
+     sequence has to be positioned on the baseline -- regardless of the
+     writing direction.                                                    */
 
+#define RIGHT_TO_LEFT         0x0001
 #define IGNORE_BASE_GLYPHS    0x0002
 #define IGNORE_LIGATURES      0x0004
 #define IGNORE_MARKS          0x0008