Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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