From 15a69e4a12739e7392f2a38d6f7bfdd96c0dc3ba Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 26 Jul 2003 03:14:23 +0000 Subject: [PATCH] Update of GPOS and GSUB support to OpenType 1.3 (From FreeType, Werner 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. --- src/ftxgpos.c | 25 ++++++++++++++++++++++++- src/ftxopen.h | 8 ++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) 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 @@ 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 -- 2.7.4