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