1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  cffcmap.c                                                              */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    CFF character mapping table (cmap) support (body).                   */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  Copyright 2002-2007, 2010, 2013 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
19727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include <ft2build.h>
20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffcmap.h"
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cffload.h"
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "cfferrs.h"
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  /*****                                                               *****/
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_encoding_init( CFF_CMapStd  cmap )
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font      cff      = (CFF_Font)face->extra.data;
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Encoding  encoding = &cff->encoding;
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->gids  = encoding->codes;
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return 0;
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_encoding_done( CFF_CMapStd  cmap )
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cmap->gids  = NULL;
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_UInt )
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_UInt32    char_code )
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt  result = 0;
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( char_code < 256 )
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      result = cmap->gids[char_code];
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
70295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_CALLBACK_DEF( FT_UInt32 )
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UInt32    *pchar_code )
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt    result    = 0;
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  char_code = *pchar_code;
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *pchar_code = 0;
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( char_code < 255 )
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt  code = (FT_UInt)(char_code + 1);
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for (;;)
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( code >= 256 )
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        result = cmap->gids[code];
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( result != 0 )
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          *pchar_code = code;
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        code++;
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return result;
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
104295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sizeof ( CFF_CMapStdRec ),
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_InitFunc)     cff_cmap_encoding_init,
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL, NULL, NULL, NULL, NULL
113295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( const char* )
125aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  cff_sid_to_glyph_name( TT_Face  face,
126aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                         FT_UInt  idx )
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
128aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    CFF_Font     cff     = (CFF_Font)face->extra.data;
129aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    CFF_Charset  charset = &cff->charset;
130aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UInt      sid     = charset->sids[idx];
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    return cff_index_get_sid_string( cff, sid );
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_Error )
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_unicode_init( PS_Unicodes  unicodes )
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory           memory  = FT_FACE_MEMORY( face );
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font            cff     = (CFF_Font)face->extra.data;
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Charset         charset = &cff->charset;
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* can't build Unicode map for CID-keyed font */
148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    /* because we don't know glyph names.         */
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !charset->sids )
150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_THROW( No_Unicode_Glyph_Name );
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return psnames->unicodes_init( memory,
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   unicodes,
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   cff->num_glyphs,
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                   (PS_FreeGlyphNameFunc)NULL,
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (FT_Pointer)face );
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_unicode_done( PS_Unicodes  unicodes )
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Face    face   = FT_CMAP_FACE( unicodes );
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = FT_FACE_MEMORY( face );
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( unicodes->maps );
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    unicodes->num_maps = 0;
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_UInt )
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UInt32    char_code )
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font            cff     = (CFF_Font)face->extra.data;
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return psnames->unicodes_char_index( unicodes, char_code );
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
186295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_CALLBACK_DEF( FT_UInt32 )
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_UInt32   *pchar_code )
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CFF_Font            cff     = (CFF_Font)face->extra.data;
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return psnames->unicodes_char_next( unicodes, pchar_code );
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
199295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sizeof ( PS_UnicodesRec ),
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_InitFunc)     cff_cmap_unicode_init,
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NULL, NULL, NULL, NULL, NULL
208295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  )
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
211