Ignore:
Timestamp:
Apr 12, 2009, 10:25:05 AM (13 years ago)
Author:
Eugene Romanenko
Message:

PDF plugin: freetype library updated to version 2.3.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/poppler/freetype2/src/sfnt/ttcmap.c

    r262 r269  
    55/*    TrueType character mapping table (cmap) support (body).              */
    66/*                                                                         */
    7 /*  Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 by                  */
     7/*  Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by            */
    88/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
    99/*                                                                         */
     
    232232  /*   keys        6              USHORT[256]     sub-header keys          */
    233233  /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */
    234   /*   glyph_ids   518+NSUB*8     USHORT[]        glyph id array           */
     234  /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */
    235235  /*                                                                       */
    236236  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */
     
    283283    FT_Byte*  keys;                         /* keys table */
    284284    FT_Byte*  subs;                         /* sub-headers */
    285     FT_Byte*  glyph_ids;                    /* glyph id array */
     285    FT_Byte*  glyph_ids;                    /* glyph ID array */
    286286
    287287
     
    606606  /*                                                  zero                 */
    607607  /*                                                                       */
    608   /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph id    */
     608  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */
    609609  /*                                                  ranges               */
    610610  /*                                                                       */
     
    612612  /* intervals called segments.  Each segment has start and end codes,     */
    613613  /* provided by the `startCount' and `endCount' arrays.  Segments must    */
    614   /* not be overlapping and the last segment should always contain the     */
    615   /* `0xFFFF' endCount.                                                    */
     614  /* not overlap, and the last segment should always contain the value     */
     615  /* 0xFFFF for `endCount'.                                                */
    616616  /*                                                                       */
    617617  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
     
    630630  /*                                                                       */
    631631  /*                                                                       */
    632   /* Finally, note that certain fonts contain invalid charmaps that        */
    633   /* contain end=0xFFFF, start=0xFFFF, delta=0x0001, offset=0xFFFF at the  */
    634   /* of their charmaps (e.g. opens___.ttf which comes with OpenOffice.org) */
    635   /* we need special code to deal with them correctly...                   */
     632  /* Finally, note that a lot of fonts contain an invalid last segment,    */
     633  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */
     634  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with    */
     635  /* OpenOffice.org).  We need special code to deal with them correctly.   */
    636636  /*                                                                       */
    637637
     
    697697      p     += num_ranges * 2;
    698698      offset = FT_PEEK_USHORT( p );
     699
     700      /* some fonts have an incorrect last segment; */
     701      /* we have to catch it                        */
     702      if ( range_index     >= num_ranges - 1 &&
     703           cmap->cur_start == 0xFFFFU        &&
     704           cmap->cur_end   == 0xFFFFU        )
     705      {
     706        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;
     707        FT_Byte*  limit = face->cmap_table + face->cmap_size;
     708
     709
     710        if ( offset && p + offset + 2 > limit )
     711        {
     712          cmap->cur_delta = 1;
     713          offset          = 0;
     714        }
     715      }
    699716
    700717      if ( offset != 0xFFFFU )
     
    863880    glyph_ids = offsets + num_segs * 2;
    864881
    865     /* check last segment, its end count must be 0xFFFF */
     882    /* check last segment; its end count value must be 0xFFFF */
    866883    if ( valid->level >= FT_VALIDATE_PARANOID )
    867884    {
     
    892909          FT_INVALID_DATA;
    893910
    894         /* this test should be performed at default validation level;  */
    895         /* unfortunately, some popular Asian fonts present overlapping */
    896         /* ranges in their charmaps                                    */
    897         /*                                                             */
     911        /* this test should be performed at default validation level; */
     912        /* unfortunately, some popular Asian fonts have overlapping  */
     913        /* ranges in their charmaps                                   */
     914        /*                                                            */
    898915        if ( start <= last_end && n > 0 )
    899916        {
     
    903920          {
    904921            /* allow overlapping segments, provided their start points */
    905             /* and end points, respectively, are in ascending order.   */
     922            /* and end points, respectively, are in ascending order    */
    906923            /*                                                         */
    907924            if ( last_start > start || last_end > end )
     
    914931        if ( offset && offset != 0xFFFFU )
    915932        {
    916           p += offset;  /* start of glyph id array */
     933          p += offset;  /* start of glyph ID array */
    917934
    918935          /* check that we point within the glyph IDs table only */
     
    923940              FT_INVALID_DATA;
    924941          }
    925           /* some fonts handle the last segment incorrectly */
    926           else if ( n != num_segs - 1     ||
    927                     !( start == 0xFFFFU &&
    928                        end   == 0xFFFFU &&
    929                        delta == 0x1U    ) )
     942          /* Some fonts handle the last segment incorrectly.  In */
     943          /* theory, 0xFFFF might point to an ordinary glyph --  */
     944          /* a cmap 4 is versatile and could be used for any     */
     945          /* encoding, not only Unicode.  However, reality shows */
     946          /* that far too many fonts are sloppy and incorrectly  */
     947          /* set all fields but `start' and `end' for the last   */
     948          /* segment if it contains only a single character.     */
     949          /*                                                     */
     950          /* We thus omit the test here, delaying it to the      */
     951          /* routines which actually access the cmap.            */
     952          else if ( n != num_segs - 1                       ||
     953                    !( start == 0xFFFFU && end == 0xFFFFU ) )
    930954          {
    931955            if ( p < glyph_ids                              ||
     
    958982          /* to mean missing glyph in cmap table                    */
    959983          /*                                                        */
    960           if ( valid->level >= FT_VALIDATE_PARANOID                     ||
    961                n != num_segs - 1                                        ||
    962                !( start == 0xFFFFU && end == 0xFFFFU && delta == 0x1U ) )
     984          if ( valid->level >= FT_VALIDATE_PARANOID    ||
     985               n != num_segs - 1                       ||
     986               !( start == 0xFFFFU && end == 0xFFFFU ) )
    963987            FT_INVALID_DATA;
    964988        }
     
    10181042          offset  = TT_PEEK_USHORT( p );
    10191043
    1020           /* some fonts handle the last segment incorrectly; */
    1021           /* we have to catch it                             */
    1022           if ( i >= num_segs - 1                                   &&
    1023                start == 0xFFFFU && end == 0xFFFFU && delta == 0x1U )
    1024             offset = 0;
     1044          /* some fonts have an incorrect last segment; */
     1045          /* we have to catch it                        */
     1046          if ( i >= num_segs - 1                  &&
     1047               start == 0xFFFFU && end == 0xFFFFU )
     1048          {
     1049            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
     1050            FT_Byte*  limit = face->cmap_table + face->cmap_size;
     1051
     1052
     1053            if ( offset && p + offset + 2 > limit )
     1054            {
     1055              delta  = 1;
     1056              offset = 0;
     1057            }
     1058          }
    10251059
    10261060          if ( offset == 0xFFFFU )
     
    11031137        offset = TT_PEEK_USHORT( p );
    11041138
    1105         /* some fonts handle the last segment incorrectly; */
    1106         /* we have to catch it                             */
    1107         if ( mid >= num_segs - 1                                 &&
    1108              start == 0xFFFFU && end == 0xFFFFU && delta == 0x1U )
    1109           offset = 0;
     1139        /* some fonts have an incorrect last segment; */
     1140        /* we have to catch it                        */
     1141        if ( mid >= num_segs - 1                &&
     1142             start == 0xFFFFU && end == 0xFFFFU )
     1143        {
     1144          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
     1145          FT_Byte*  limit = face->cmap_table + face->cmap_size;
     1146
     1147
     1148          if ( offset && p + offset + 2 > limit )
     1149          {
     1150            delta  = 1;
     1151            offset = 0;
     1152          }
     1153        }
    11101154
    11111155        /* search the first segment containing `charcode' */
     
    15731617  /*   start       0              ULONG       first charcode               */
    15741618  /*   end         4              ULONG       last charcode                */
    1575   /*   startId     8              ULONG       start glyph id for the group */
     1619  /*   startId     8              ULONG       start glyph ID for the group */
    15761620  /*                                                                       */
    15771621
     
    19551999  /*   start       0          ULONG      first charcode                    */
    19562000  /*   end         4          ULONG      last charcode                     */
    1957   /*   startId     8          ULONG      start glyph id for the group      */
     2001  /*   startId     8          ULONG      start glyph ID for the group      */
    19582002  /*                                                                       */
    19592003
Note: See TracChangeset for help on using the changeset viewer.