OpenType-1.4 update: backtrack information is stored with the item closest

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

        * pango/opentype/ftxgpos.c pango/opentype/ftxgsub.c:
        OpenType-1.4 update: backtrack information is stored with the
        item closest to the input first (From FreeType,
        Werner Lemberg, 2002-09-26)
This commit is contained in:
Owen Taylor 2003-07-26 03:45:44 +00:00 committed by Owen Taylor
parent 15a69e4a12
commit 06c12109de
2 changed files with 35 additions and 15 deletions

View File

@ -5264,7 +5264,7 @@
curr_pos = 0; curr_pos = 0;
s_in = &in->string[curr_pos]; s_in = &in->string[curr_pos];
for ( i = bgc, j = in->pos - 1; i > 0; i--, j-- ) for ( i = 0, j = in->pos - 1; i < bgc; i++, j-- )
{ {
while ( CHECK_Property( gdef, s_in[j], flags, &property ) ) while ( CHECK_Property( gdef, s_in[j], flags, &property ) )
{ {
@ -5277,11 +5277,21 @@
break; break;
} }
if ( s_in[j] != curr_cpr.Backtrack[i - 1] ) /* In OpenType 1.3, it is undefined whether the offsets of
backtrack glyphs is in logical order or not. Version 1.4
will clarify this:
Logical order - a b c d e f g h i j
i
Input offsets - 0 1
Backtrack offsets - 3 2 1 0
Lookahead offsets - 0 1 2 3 */
if ( s_in[j] != curr_cpr.Backtrack[i] )
break; break;
} }
if ( i != 0 ) if ( i != bgc )
continue; continue;
} }
@ -5465,7 +5475,7 @@
known_backtrack_classes = i; known_backtrack_classes = i;
} }
if ( bc[bgc - 1 - i] != backtrack_classes[i] ) if ( bc[i] != backtrack_classes[i] )
break; break;
} }
@ -5613,7 +5623,7 @@
s_in = &in->string[curr_pos]; s_in = &in->string[curr_pos];
bc = ccpf3->BacktrackCoverage; bc = ccpf3->BacktrackCoverage;
for ( i = bgc, j = in->pos - 1; i > 0; i--, j-- ) for ( i = 0, j = in->pos - 1; i < bgc; i++, j-- )
{ {
while ( CHECK_Property( gdef, s_in[j], flags, &property ) ) while ( CHECK_Property( gdef, s_in[j], flags, &property ) )
{ {
@ -5626,7 +5636,7 @@
return TTO_Err_Not_Covered; return TTO_Err_Not_Covered;
} }
error = Coverage_Index( &bc[i - 1], s_in[j], &index ); error = Coverage_Index( &bc[i], s_in[j], &index );
if ( error ) if ( error )
return error; return error;
} }
@ -5656,8 +5666,8 @@
return error; return error;
} }
/* we are starting for lookahead glyphs right after the last context /* we are starting to check for lookahead glyphs right after the
glyph */ last context glyph */
curr_pos = j; curr_pos = j;
s_in = &in->string[curr_pos]; s_in = &in->string[curr_pos];

View File

@ -3423,13 +3423,13 @@
if ( bgc ) if ( bgc )
{ {
/* Since we don't know in advance the number of glyphs to inspect, /* since we don't know in advance the number of glyphs to inspect,
we search backwards for matches in the backtrack glyph array */ we search backwards for matches in the backtrack glyph array */
curr_pos = 0; curr_pos = 0;
s_in = &in->string[curr_pos]; s_in = &in->string[curr_pos];
for ( i = bgc, j = in->pos - 1; i > 0; i--, j-- ) for ( i = 0, j = in->pos - 1; i < bgc; i++, j-- )
{ {
while ( CHECK_Property( gdef, s_in[j], flags, &property ) ) while ( CHECK_Property( gdef, s_in[j], flags, &property ) )
{ {
@ -3442,11 +3442,21 @@
break; break;
} }
if ( s_in[j] != curr_csr.Backtrack[i - 1] ) /* In OpenType 1.3, it is undefined whether the offsets of
backtrack glyphs is in logical order or not. Version 1.4
will clarify this:
Logical order - a b c d e f g h i j
i
Input offsets - 0 1
Backtrack offsets - 3 2 1 0
Lookahead offsets - 0 1 2 3 */
if ( s_in[j] != curr_csr.Backtrack[i] )
break; break;
} }
if ( i != 0 ) if ( i != bgc )
continue; continue;
} }
@ -3630,7 +3640,7 @@
known_backtrack_classes = i; known_backtrack_classes = i;
} }
if ( bc[bgc - 1 - i] != backtrack_classes[i] ) if ( bc[i] != backtrack_classes[i] )
break; break;
} }
@ -3777,7 +3787,7 @@
s_in = &in->string[curr_pos]; s_in = &in->string[curr_pos];
bc = ccsf3->BacktrackCoverage; bc = ccsf3->BacktrackCoverage;
for ( i = bgc, j = in->pos - 1; i > 0; i--, j-- ) for ( i = 0, j = in->pos - 1; i < bgc; i++, j-- )
{ {
while ( CHECK_Property( gdef, s_in[j], flags, &property ) ) while ( CHECK_Property( gdef, s_in[j], flags, &property ) )
{ {
@ -3790,7 +3800,7 @@
return TTO_Err_Not_Covered; return TTO_Err_Not_Covered;
} }
error = Coverage_Index( &bc[i - 1], s_in[j], &index ); error = Coverage_Index( &bc[i], s_in[j], &index );
if ( error ) if ( error )
return error; return error;
} }