Match backtrack context against the output glyphs not the input glyphs
authorOwen Taylor <otaylor@redhat.com>
Mon, 26 Jul 2004 19:20:27 +0000 (19:20 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Mon, 26 Jul 2004 19:20:27 +0000 (19:20 +0000)
Mon Jul 26 15:16:07 2004  Owen Taylor  <otaylor@redhat.com>

        * pango/opentype/ftxgsub.c (Lookup_ChainContextSubst[123]):
        Match backtrack context against the output glyphs not
        the input glyphs (#145174, Aamir Wali)

src/ftxgsub.c

index 8da8ff4..52b498c 100644 (file)
 
       /* check whether context is too long; it is a first guess only */
 
-      if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
+      if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
        goto next_chainsubrule;
 
       if ( bgc )
         /* since we don't know in advance the number of glyphs to inspect,
            we search backwards for matches in the backtrack glyph array    */
 
-        for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
+        for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
         {
-          while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
+          while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
           {
             if ( error && error != TTO_Err_Not_Covered )
               return error;
                Backtrack offsets -  3  2  1  0
                Lookahead offsets -                    0  1  2  3           */
 
-          if ( IN_GLYPH( j ) != curr_csr.Backtrack[i] )
+          if ( OUT_GLYPH( j ) != curr_csr.Backtrack[i] )
            goto next_chainsubrule;
         }
       }
 
       /* check whether context is too long; it is a first guess only */
 
-      if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
+      if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
        goto next_chainsubclassrule;
 
       if ( bgc )
 
         bc       = ccsr.Backtrack;
 
-        for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
+        for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
         {
-          while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
+          while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
           {
             if ( error && error != TTO_Err_Not_Covered )
               goto End1;
           {
             /* Keeps us from having to do this for each rule */
 
-            error = Get_Class( &ccsf2->BacktrackClassDef, IN_GLYPH( j ),
+            error = Get_Class( &ccsf2->BacktrackClassDef, OUT_GLYPH( j ),
                                &backtrack_classes[i], NULL );
             if ( error && error != TTO_Err_Not_Covered )
               goto End1;
 
     /* check whether context is too long; it is a first guess only */
 
-    if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
+    if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
       return TTO_Err_Not_Covered;
 
     if ( bgc )
 
       bc       = ccsf3->BacktrackCoverage;
 
-      for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
+      for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
       {
-        while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
+        while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
         {
           if ( error && error != TTO_Err_Not_Covered )
             return error;
          j--;
         }
 
-        error = Coverage_Index( &bc[i], IN_GLYPH( j ), &index );
+        error = Coverage_Index( &bc[i], OUT_GLYPH( j ), &index );
         if ( error )
           return error;
       }