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