Home | History | Annotate | Download | only in cff
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  cffcmap.c                                                              */
      4 /*                                                                         */
      5 /*    CFF character mapping table (cmap) support (body).                   */
      6 /*                                                                         */
      7 /*  Copyright 2002-2007, 2010, 2013 by                                     */
      8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
      9 /*                                                                         */
     10 /*  This file is part of the FreeType project, and may only be used,       */
     11 /*  modified, and distributed under the terms of the FreeType project      */
     12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     13 /*  this file you indicate that you have read the license and              */
     14 /*  understand and accept it fully.                                        */
     15 /*                                                                         */
     16 /***************************************************************************/
     17 
     18 
     19 #include <ft2build.h>
     20 #include FT_INTERNAL_DEBUG_H
     21 #include "cffcmap.h"
     22 #include "cffload.h"
     23 
     24 #include "cfferrs.h"
     25 
     26 
     27   /*************************************************************************/
     28   /*************************************************************************/
     29   /*****                                                               *****/
     30   /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/
     31   /*****                                                               *****/
     32   /*************************************************************************/
     33   /*************************************************************************/
     34 
     35   FT_CALLBACK_DEF( FT_Error )
     36   cff_cmap_encoding_init( CFF_CMapStd  cmap )
     37   {
     38     TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );
     39     CFF_Font      cff      = (CFF_Font)face->extra.data;
     40     CFF_Encoding  encoding = &cff->encoding;
     41 
     42 
     43     cmap->gids  = encoding->codes;
     44 
     45     return 0;
     46   }
     47 
     48 
     49   FT_CALLBACK_DEF( void )
     50   cff_cmap_encoding_done( CFF_CMapStd  cmap )
     51   {
     52     cmap->gids  = NULL;
     53   }
     54 
     55 
     56   FT_CALLBACK_DEF( FT_UInt )
     57   cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
     58                                 FT_UInt32    char_code )
     59   {
     60     FT_UInt  result = 0;
     61 
     62 
     63     if ( char_code < 256 )
     64       result = cmap->gids[char_code];
     65 
     66     return result;
     67   }
     68 
     69 
     70   FT_CALLBACK_DEF( FT_UInt32 )
     71   cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
     72                                FT_UInt32    *pchar_code )
     73   {
     74     FT_UInt    result    = 0;
     75     FT_UInt32  char_code = *pchar_code;
     76 
     77 
     78     *pchar_code = 0;
     79 
     80     if ( char_code < 255 )
     81     {
     82       FT_UInt  code = (FT_UInt)(char_code + 1);
     83 
     84 
     85       for (;;)
     86       {
     87         if ( code >= 256 )
     88           break;
     89 
     90         result = cmap->gids[code];
     91         if ( result != 0 )
     92         {
     93           *pchar_code = code;
     94           break;
     95         }
     96 
     97         code++;
     98       }
     99     }
    100     return result;
    101   }
    102 
    103 
    104   FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
    105     sizeof ( CFF_CMapStdRec ),
    106 
    107     (FT_CMap_InitFunc)     cff_cmap_encoding_init,
    108     (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
    109     (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
    110     (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
    111 
    112     NULL, NULL, NULL, NULL, NULL
    113   )
    114 
    115 
    116   /*************************************************************************/
    117   /*************************************************************************/
    118   /*****                                                               *****/
    119   /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
    120   /*****                                                               *****/
    121   /*************************************************************************/
    122   /*************************************************************************/
    123 
    124   FT_CALLBACK_DEF( const char* )
    125   cff_sid_to_glyph_name( TT_Face  face,
    126                          FT_UInt  idx )
    127   {
    128     CFF_Font     cff     = (CFF_Font)face->extra.data;
    129     CFF_Charset  charset = &cff->charset;
    130     FT_UInt      sid     = charset->sids[idx];
    131 
    132 
    133     return cff_index_get_sid_string( cff, sid );
    134   }
    135 
    136 
    137   FT_CALLBACK_DEF( FT_Error )
    138   cff_cmap_unicode_init( PS_Unicodes  unicodes )
    139   {
    140     TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
    141     FT_Memory           memory  = FT_FACE_MEMORY( face );
    142     CFF_Font            cff     = (CFF_Font)face->extra.data;
    143     CFF_Charset         charset = &cff->charset;
    144     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
    145 
    146 
    147     /* can't build Unicode map for CID-keyed font */
    148     /* because we don't know glyph names.         */
    149     if ( !charset->sids )
    150       return FT_THROW( No_Unicode_Glyph_Name );
    151 
    152     return psnames->unicodes_init( memory,
    153                                    unicodes,
    154                                    cff->num_glyphs,
    155                                    (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
    156                                    (PS_FreeGlyphNameFunc)NULL,
    157                                    (FT_Pointer)face );
    158   }
    159 
    160 
    161   FT_CALLBACK_DEF( void )
    162   cff_cmap_unicode_done( PS_Unicodes  unicodes )
    163   {
    164     FT_Face    face   = FT_CMAP_FACE( unicodes );
    165     FT_Memory  memory = FT_FACE_MEMORY( face );
    166 
    167 
    168     FT_FREE( unicodes->maps );
    169     unicodes->num_maps = 0;
    170   }
    171 
    172 
    173   FT_CALLBACK_DEF( FT_UInt )
    174   cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
    175                                FT_UInt32    char_code )
    176   {
    177     TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
    178     CFF_Font            cff     = (CFF_Font)face->extra.data;
    179     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
    180 
    181 
    182     return psnames->unicodes_char_index( unicodes, char_code );
    183   }
    184 
    185 
    186   FT_CALLBACK_DEF( FT_UInt32 )
    187   cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
    188                               FT_UInt32   *pchar_code )
    189   {
    190     TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
    191     CFF_Font            cff     = (CFF_Font)face->extra.data;
    192     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
    193 
    194 
    195     return psnames->unicodes_char_next( unicodes, pchar_code );
    196   }
    197 
    198 
    199   FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
    200     sizeof ( PS_UnicodesRec ),
    201 
    202     (FT_CMap_InitFunc)     cff_cmap_unicode_init,
    203     (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
    204     (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
    205     (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
    206 
    207     NULL, NULL, NULL, NULL, NULL
    208   )
    209 
    210 /* END */
    211