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.
This commit is contained in:
Owen Taylor 2003-07-26 03:14:23 +00:00 committed by Owen Taylor
parent 6f74f18b77
commit 15a69e4a12
2 changed files with 30 additions and 3 deletions

View File

@ -43,6 +43,8 @@
FT_UShort load_flags; /* how the glyph should be loaded */ FT_UShort load_flags; /* how the glyph should be loaded */
FT_Bool r2l; FT_Bool r2l;
FT_UShort first; /* the first glyph in a chain of
cursive connections */
FT_UShort last; /* the last valid glyph -- used FT_UShort last; /* the last valid glyph -- used
with cursive positioning */ with cursive positioning */
FT_Pos anchor_x; /* the coordinates of the anchor point */ FT_Pos anchor_x; /* the coordinates of the anchor point */
@ -2089,6 +2091,8 @@
gpi->last = 0xFFFF; gpi->last = 0xFFFF;
else else
{ {
if ( gpi->first == 0xFFFF )
gpi->first = in->pos;
gpi->last = in->pos; gpi->last = in->pos;
gpi->anchor_x = exit_x; gpi->anchor_x = exit_x;
gpi->anchor_y = exit_y; gpi->anchor_y = exit_y;
@ -6120,9 +6124,12 @@
FT_UShort* p_in = in->properties; FT_UShort* p_in = in->properties;
int nesting_level = 0; 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; in->pos = 0;
@ -6153,6 +6160,22 @@
error = TTO_Err_Not_Covered; 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 ) if ( error == TTO_Err_Not_Covered )
(in->pos)++; (in->pos)++;
else else

View File

@ -155,9 +155,13 @@ extern "C" {
typedef struct TTO_LookupList_ TTO_LookupList; typedef struct TTO_LookupList_ TTO_LookupList;
/* Possible LookupFlag bit masks. `IGNORE_SPECIAL_MARKS' comes from the /* Possible LookupFlag bit masks. `IGNORE_SPECIAL_MARKS' comes from the
OpenType 1.2 specification. */ 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_BASE_GLYPHS 0x0002
#define IGNORE_LIGATURES 0x0004 #define IGNORE_LIGATURES 0x0004
#define IGNORE_MARKS 0x0008 #define IGNORE_MARKS 0x0008