1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  t1cmap.c                                                               */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Type 1 character map support (body).                                 */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  Copyright 2002, 2003, 2006, 2007 by                                    */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "t1cmap.h"
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "psauxerr.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_std_init( T1_CMapStd  cmap,
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Int      is_expert )
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->num_glyphs    = face->type1.num_glyphs;
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->sid_to_string = psnames->adobe_std_strings;
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    : psnames->adobe_std_encoding;
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( cmap->code_to_sid != NULL );
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_std_done( T1_CMapStd  cmap )
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->num_glyphs    = 0;
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->glyph_names   = NULL;
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->sid_to_string = NULL;
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->code_to_sid   = NULL;
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_UInt )
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_std_char_index( T1_CMapStd  cmap,
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UInt32   char_code )
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt  result = 0;
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( char_code < 256 )
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt      code, n;
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      const char*  glyph_name;
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* convert character code to Adobe SID string */
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      code       = cmap->code_to_sid[char_code];
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      glyph_name = cmap->sid_to_string( code );
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look for the corresponding glyph name */
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( n = 0; n < cmap->num_glyphs; n++ )
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        const char* gname = cmap->glyph_names[n];
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( gname && gname[0] == glyph_name[0]  &&
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             ft_strcmp( gname, glyph_name ) == 0 )
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          result = n;
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
98295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_CALLBACK_DEF( FT_UInt32 )
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_std_char_next( T1_CMapStd   cmap,
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_UInt32   *pchar_code )
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt    result    = 0;
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  char_code = *pchar_code + 1;
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( char_code < 256 )
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      result = t1_cmap_std_char_index( cmap, char_code );
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( result != 0 )
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      char_code++;
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char_code = 0;
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *pchar_code = char_code;
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_standard_init( T1_CMapStd  cmap )
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    t1_cmap_std_init( cmap, 0 );
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return 0;
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_standard_class_rec =
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sizeof ( T1_CMapStdRec ),
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_InitFunc)     t1_cmap_standard_init,
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_DoneFunc)     t1_cmap_std_done,
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL, NULL, NULL, NULL, NULL
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_expert_init( T1_CMapStd  cmap )
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    t1_cmap_std_init( cmap, 1 );
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return 0;
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_expert_class_rec =
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sizeof ( T1_CMapStdRec ),
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_InitFunc)     t1_cmap_expert_init,
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_DoneFunc)     t1_cmap_std_done,
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL, NULL, NULL, NULL, NULL
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_custom_init( T1_CMapCustom  cmap )
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    T1_Encoding  encoding = &face->type1.encoding;
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->first   = encoding->code_first;
182295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    cmap->count   = (FT_UInt)( encoding->code_last - cmap->first );
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->indices = encoding->char_index;
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( cmap->indices != NULL );
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( encoding->code_first <= encoding->code_last );
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return 0;
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_custom_done( T1_CMapCustom  cmap )
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->indices = NULL;
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->first   = 0;
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->count   = 0;
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_UInt )
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_custom_char_index( T1_CMapCustom  cmap,
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_UInt32      char_code )
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt    result = 0;
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( char_code >= cmap->first )                  &&
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ( char_code < ( cmap->first + cmap->count ) ) )
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      result = cmap->indices[char_code];
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
216295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_CALLBACK_DEF( FT_UInt32 )
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_custom_char_next( T1_CMapCustom  cmap,
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            FT_UInt32     *pchar_code )
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt    result = 0;
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  char_code = *pchar_code;
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ++char_code;
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( char_code < cmap->first )
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      char_code = cmap->first;
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      result = cmap->indices[char_code];
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( result != 0 )
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Exit;
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char_code = 0;
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Exit:
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *pchar_code = char_code;
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_custom_class_rec =
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sizeof ( T1_CMapCustomRec ),
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_InitFunc)     t1_cmap_custom_init,
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_DoneFunc)     t1_cmap_custom_done,
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL, NULL, NULL, NULL, NULL
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( const char * )
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_get_glyph_name( T1_Face  face,
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt  idx )
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return face->type1.glyph_names[idx];
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_unicode_init( PS_Unicodes  unicodes )
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory           memory  = FT_FACE_MEMORY( face );
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return psnames->unicodes_init( memory,
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   unicodes,
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   face->type1.num_glyphs,
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (PS_GetGlyphNameFunc)&t1_get_glyph_name,
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (PS_FreeGlyphNameFunc)NULL,
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (FT_Pointer)face );
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_unicode_done( PS_Unicodes  unicodes )
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Face    face   = FT_CMAP_FACE( unicodes );
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = FT_FACE_MEMORY( face );
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( unicodes->maps );
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    unicodes->num_maps = 0;
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_UInt )
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_unicode_char_index( PS_Unicodes  unicodes,
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_UInt32    char_code )
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return psnames->unicodes_char_index( unicodes, char_code );
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
315295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_CALLBACK_DEF( FT_UInt32 )
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_unicode_char_next( PS_Unicodes  unicodes,
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_UInt32   *pchar_code )
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return psnames->unicodes_char_next( unicodes, pchar_code );
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  t1_cmap_unicode_class_rec =
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sizeof ( PS_UnicodesRec ),
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_InitFunc)     t1_cmap_unicode_init,
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL, NULL, NULL, NULL, NULL
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
342