misc/libfreetype/src/psaux/t1cmap.c
changeset 9372 915436ff64ab
parent 9371 f3840de881bd
child 9373 b769a8e38cbd
equal deleted inserted replaced
9371:f3840de881bd 9372:915436ff64ab
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  t1cmap.c                                                               */
       
     4 /*                                                                         */
       
     5 /*    Type 1 character map support (body).                                 */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2002, 2003, 2006, 2007 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 "t1cmap.h"
       
    20 
       
    21 #include FT_INTERNAL_DEBUG_H
       
    22 
       
    23 #include "psauxerr.h"
       
    24 
       
    25 
       
    26   /*************************************************************************/
       
    27   /*************************************************************************/
       
    28   /*****                                                               *****/
       
    29   /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
       
    30   /*****                                                               *****/
       
    31   /*************************************************************************/
       
    32   /*************************************************************************/
       
    33 
       
    34   static void
       
    35   t1_cmap_std_init( T1_CMapStd  cmap,
       
    36                     FT_Int      is_expert )
       
    37   {
       
    38     T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );
       
    39     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
       
    40 
       
    41 
       
    42     cmap->num_glyphs    = face->type1.num_glyphs;
       
    43     cmap->glyph_names   = (const char* const*)face->type1.glyph_names;
       
    44     cmap->sid_to_string = psnames->adobe_std_strings;
       
    45     cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
       
    46                                     : psnames->adobe_std_encoding;
       
    47 
       
    48     FT_ASSERT( cmap->code_to_sid != NULL );
       
    49   }
       
    50 
       
    51 
       
    52   FT_CALLBACK_DEF( void )
       
    53   t1_cmap_std_done( T1_CMapStd  cmap )
       
    54   {
       
    55     cmap->num_glyphs    = 0;
       
    56     cmap->glyph_names   = NULL;
       
    57     cmap->sid_to_string = NULL;
       
    58     cmap->code_to_sid   = NULL;
       
    59   }
       
    60 
       
    61 
       
    62   FT_CALLBACK_DEF( FT_UInt )
       
    63   t1_cmap_std_char_index( T1_CMapStd  cmap,
       
    64                           FT_UInt32   char_code )
       
    65   {
       
    66     FT_UInt  result = 0;
       
    67 
       
    68 
       
    69     if ( char_code < 256 )
       
    70     {
       
    71       FT_UInt      code, n;
       
    72       const char*  glyph_name;
       
    73 
       
    74 
       
    75       /* convert character code to Adobe SID string */
       
    76       code       = cmap->code_to_sid[char_code];
       
    77       glyph_name = cmap->sid_to_string( code );
       
    78 
       
    79       /* look for the corresponding glyph name */
       
    80       for ( n = 0; n < cmap->num_glyphs; n++ )
       
    81       {
       
    82         const char* gname = cmap->glyph_names[n];
       
    83 
       
    84 
       
    85         if ( gname && gname[0] == glyph_name[0]  &&
       
    86              ft_strcmp( gname, glyph_name ) == 0 )
       
    87         {
       
    88           result = n;
       
    89           break;
       
    90         }
       
    91       }
       
    92     }
       
    93 
       
    94     return result;
       
    95   }
       
    96 
       
    97 
       
    98   FT_CALLBACK_DEF( FT_UInt32 )
       
    99   t1_cmap_std_char_next( T1_CMapStd   cmap,
       
   100                          FT_UInt32   *pchar_code )
       
   101   {
       
   102     FT_UInt    result    = 0;
       
   103     FT_UInt32  char_code = *pchar_code + 1;
       
   104 
       
   105 
       
   106     while ( char_code < 256 )
       
   107     {
       
   108       result = t1_cmap_std_char_index( cmap, char_code );
       
   109       if ( result != 0 )
       
   110         goto Exit;
       
   111 
       
   112       char_code++;
       
   113     }
       
   114     char_code = 0;
       
   115 
       
   116   Exit:
       
   117     *pchar_code = char_code;
       
   118     return result;
       
   119   }
       
   120 
       
   121 
       
   122   FT_CALLBACK_DEF( FT_Error )
       
   123   t1_cmap_standard_init( T1_CMapStd  cmap )
       
   124   {
       
   125     t1_cmap_std_init( cmap, 0 );
       
   126     return 0;
       
   127   }
       
   128 
       
   129 
       
   130   FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
       
   131   t1_cmap_standard_class_rec =
       
   132   {
       
   133     sizeof ( T1_CMapStdRec ),
       
   134 
       
   135     (FT_CMap_InitFunc)     t1_cmap_standard_init,
       
   136     (FT_CMap_DoneFunc)     t1_cmap_std_done,
       
   137     (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
       
   138     (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
       
   139 
       
   140     NULL, NULL, NULL, NULL, NULL
       
   141   };
       
   142 
       
   143 
       
   144   FT_CALLBACK_DEF( FT_Error )
       
   145   t1_cmap_expert_init( T1_CMapStd  cmap )
       
   146   {
       
   147     t1_cmap_std_init( cmap, 1 );
       
   148     return 0;
       
   149   }
       
   150 
       
   151   FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
       
   152   t1_cmap_expert_class_rec =
       
   153   {
       
   154     sizeof ( T1_CMapStdRec ),
       
   155 
       
   156     (FT_CMap_InitFunc)     t1_cmap_expert_init,
       
   157     (FT_CMap_DoneFunc)     t1_cmap_std_done,
       
   158     (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
       
   159     (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
       
   160 
       
   161     NULL, NULL, NULL, NULL, NULL
       
   162   };
       
   163 
       
   164 
       
   165   /*************************************************************************/
       
   166   /*************************************************************************/
       
   167   /*****                                                               *****/
       
   168   /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/
       
   169   /*****                                                               *****/
       
   170   /*************************************************************************/
       
   171   /*************************************************************************/
       
   172 
       
   173 
       
   174   FT_CALLBACK_DEF( FT_Error )
       
   175   t1_cmap_custom_init( T1_CMapCustom  cmap )
       
   176   {
       
   177     T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );
       
   178     T1_Encoding  encoding = &face->type1.encoding;
       
   179 
       
   180 
       
   181     cmap->first   = encoding->code_first;
       
   182     cmap->count   = (FT_UInt)( encoding->code_last - cmap->first );
       
   183     cmap->indices = encoding->char_index;
       
   184 
       
   185     FT_ASSERT( cmap->indices != NULL );
       
   186     FT_ASSERT( encoding->code_first <= encoding->code_last );
       
   187 
       
   188     return 0;
       
   189   }
       
   190 
       
   191 
       
   192   FT_CALLBACK_DEF( void )
       
   193   t1_cmap_custom_done( T1_CMapCustom  cmap )
       
   194   {
       
   195     cmap->indices = NULL;
       
   196     cmap->first   = 0;
       
   197     cmap->count   = 0;
       
   198   }
       
   199 
       
   200 
       
   201   FT_CALLBACK_DEF( FT_UInt )
       
   202   t1_cmap_custom_char_index( T1_CMapCustom  cmap,
       
   203                              FT_UInt32      char_code )
       
   204   {
       
   205     FT_UInt    result = 0;
       
   206 
       
   207 
       
   208     if ( ( char_code >= cmap->first )                  &&
       
   209          ( char_code < ( cmap->first + cmap->count ) ) )
       
   210       result = cmap->indices[char_code];
       
   211 
       
   212     return result;
       
   213   }
       
   214 
       
   215 
       
   216   FT_CALLBACK_DEF( FT_UInt32 )
       
   217   t1_cmap_custom_char_next( T1_CMapCustom  cmap,
       
   218                             FT_UInt32     *pchar_code )
       
   219   {
       
   220     FT_UInt    result = 0;
       
   221     FT_UInt32  char_code = *pchar_code;
       
   222 
       
   223 
       
   224     ++char_code;
       
   225 
       
   226     if ( char_code < cmap->first )
       
   227       char_code = cmap->first;
       
   228 
       
   229     for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
       
   230     {
       
   231       result = cmap->indices[char_code];
       
   232       if ( result != 0 )
       
   233         goto Exit;
       
   234     }
       
   235 
       
   236     char_code = 0;
       
   237 
       
   238   Exit:
       
   239     *pchar_code = char_code;
       
   240     return result;
       
   241   }
       
   242 
       
   243 
       
   244   FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
       
   245   t1_cmap_custom_class_rec =
       
   246   {
       
   247     sizeof ( T1_CMapCustomRec ),
       
   248 
       
   249     (FT_CMap_InitFunc)     t1_cmap_custom_init,
       
   250     (FT_CMap_DoneFunc)     t1_cmap_custom_done,
       
   251     (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
       
   252     (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
       
   253 
       
   254     NULL, NULL, NULL, NULL, NULL
       
   255   };
       
   256 
       
   257 
       
   258   /*************************************************************************/
       
   259   /*************************************************************************/
       
   260   /*****                                                               *****/
       
   261   /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/
       
   262   /*****                                                               *****/
       
   263   /*************************************************************************/
       
   264   /*************************************************************************/
       
   265 
       
   266   FT_CALLBACK_DEF( const char * )
       
   267   t1_get_glyph_name( T1_Face  face,
       
   268                      FT_UInt  idx )
       
   269   {
       
   270     return face->type1.glyph_names[idx];
       
   271   }
       
   272 
       
   273 
       
   274   FT_CALLBACK_DEF( FT_Error )
       
   275   t1_cmap_unicode_init( PS_Unicodes  unicodes )
       
   276   {
       
   277     T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
       
   278     FT_Memory           memory  = FT_FACE_MEMORY( face );
       
   279     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
       
   280 
       
   281 
       
   282     return psnames->unicodes_init( memory,
       
   283                                    unicodes,
       
   284                                    face->type1.num_glyphs,
       
   285                                    (PS_GetGlyphNameFunc)&t1_get_glyph_name,
       
   286                                    (PS_FreeGlyphNameFunc)NULL,
       
   287                                    (FT_Pointer)face );
       
   288   }
       
   289 
       
   290 
       
   291   FT_CALLBACK_DEF( void )
       
   292   t1_cmap_unicode_done( PS_Unicodes  unicodes )
       
   293   {
       
   294     FT_Face    face   = FT_CMAP_FACE( unicodes );
       
   295     FT_Memory  memory = FT_FACE_MEMORY( face );
       
   296 
       
   297 
       
   298     FT_FREE( unicodes->maps );
       
   299     unicodes->num_maps = 0;
       
   300   }
       
   301 
       
   302 
       
   303   FT_CALLBACK_DEF( FT_UInt )
       
   304   t1_cmap_unicode_char_index( PS_Unicodes  unicodes,
       
   305                               FT_UInt32    char_code )
       
   306   {
       
   307     T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
       
   308     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
       
   309 
       
   310 
       
   311     return psnames->unicodes_char_index( unicodes, char_code );
       
   312   }
       
   313 
       
   314 
       
   315   FT_CALLBACK_DEF( FT_UInt32 )
       
   316   t1_cmap_unicode_char_next( PS_Unicodes  unicodes,
       
   317                              FT_UInt32   *pchar_code )
       
   318   {
       
   319     T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
       
   320     FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
       
   321 
       
   322 
       
   323     return psnames->unicodes_char_next( unicodes, pchar_code );
       
   324   }
       
   325 
       
   326 
       
   327   FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
       
   328   t1_cmap_unicode_class_rec =
       
   329   {
       
   330     sizeof ( PS_UnicodesRec ),
       
   331 
       
   332     (FT_CMap_InitFunc)     t1_cmap_unicode_init,
       
   333     (FT_CMap_DoneFunc)     t1_cmap_unicode_done,
       
   334     (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
       
   335     (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
       
   336 
       
   337     NULL, NULL, NULL, NULL, NULL
       
   338   };
       
   339 
       
   340 
       
   341 /* END */