Fri Jul 25 23:07:06 2003 Owen Taylor 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. Index: pango/opentype/ftxgpos.c =================================================================== RCS file: /cvs/gnome/pango/pango/opentype/ftxgpos.c,v retrieving revision 1.10 diff -u -p -r1.10 ftxgpos.c --- pango/opentype/ftxgpos.c 16 Apr 2003 03:58:17 -0000 1.10 +++ pango/opentype/ftxgpos.c 26 Jul 2003 03:13:18 -0000 @@ -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; @@ -6119,10 +6133,13 @@ FT_UShort* properties = gpos->LookupList.Properties; FT_UShort* p_in = in->properties; - int nesting_level = 0; + int nesting_level = 0; + FT_UShort i; + FT_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; @@ -6151,6 +6158,22 @@ gpi->last = 0xFFFF; 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 ) Index: pango/opentype/ftxopen.h =================================================================== RCS file: /cvs/gnome/pango/pango/opentype/ftxopen.h,v retrieving revision 1.2 diff -u -p -r1.2 ftxopen.h --- pango/opentype/ftxopen.h 6 Sep 2002 22:45:12 -0000 1.2 +++ pango/opentype/ftxopen.h 26 Jul 2003 03:13:18 -0000 @@ -155,9 +155,13 @@ extern "C" { 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