1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  t1driver.c                                                             */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    Type 1 driver interface (body).                                      */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*  Copyright 1996-2015 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
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h>
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1driver.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1gload.h"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1load.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1errors.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "t1afm.h"
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_MULTIPLE_MASTERS_H
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_GLYPH_DICT_H
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include FT_SERVICE_FONT_FORMAT_H
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_NAME_H
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_CMAPS_H
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_INFO_H
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_KERNING_H
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* messages during execution.                                            */
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef  FT_COMPONENT
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT  trace_t1driver
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  *  GLYPH DICT SERVICE
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  *
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  */
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_get_glyph_name( T1_Face     face,
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     FT_UInt     glyph_index,
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     FT_Pointer  buffer,
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     FT_UInt     buffer_max )
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_UInt
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_get_name_index( T1_Face     face,
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     FT_String*  glyph_name )
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Int  i;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( i = 0; i < face->type1.num_glyphs; i++ )
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_String*  gname = face->type1.glyph_names[i];
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !ft_strcmp( glyph_name, gname ) )
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FT_UInt)i;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_GlyphDict_NameIndexFunc)t1_get_name_index
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  POSTSCRIPT NAME SERVICE
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const char*
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_get_ps_name( T1_Face  face )
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (const char*) face->type1.font_name;
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_Service_PsFontNameRec  t1_service_ps_name =
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_PsName_GetFunc)t1_get_ps_name
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  MULTIPLE MASTERS SERVICE
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_Service_MultiMastersRec  t1_service_multi_masters =
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Get_MM_Func)        T1_Get_Multi_Master,
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Set_MM_Design_Func) T1_Set_MM_Design,
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Set_Var_Design_Func)T1_Set_Var_Design
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  POSTSCRIPT INFO SERVICE
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_ps_get_font_info( FT_Face          face,
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       PS_FontInfoRec*  afont_info )
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *afont_info = ((T1_Face)face)->type1.font_info;
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_ps_get_font_extra( FT_Face           face,
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        PS_FontExtraRec*  afont_extra )
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *afont_extra = ((T1_Face)face)->type1.font_extra;
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Int
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_ps_has_glyph_names( FT_Face  face )
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UNUSED( face );
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 1;
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_ps_get_font_private( FT_Face         face,
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          PS_PrivateRec*  afont_private )
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *afont_private = ((T1_Face)face)->type1.private_dict;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Long
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  t1_ps_get_font_value( FT_Face       face,
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        PS_Dict_Keys  key,
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        FT_UInt       idx,
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        void         *value,
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        FT_Long       value_len_ )
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FT_ULong  retval    = 0; /* always >= 1 if valid */
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FT_ULong  value_len = value_len_ < 0 ? 0 : (FT_ULong)value_len_;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Face  t1face = (T1_Face)face;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Font  type1  = &t1face->type1;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch ( key )
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FONT_TYPE:
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->font_type );
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->font_type;
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FONT_MATRIX:
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < sizeof ( type1->font_matrix ) /
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   sizeof ( type1->font_matrix.xx ) )
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_Fixed  val = 0;
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( val );
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          switch ( idx )
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          {
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 0:
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_matrix.xx;
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 1:
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_matrix.xy;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 2:
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_matrix.yx;
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 3:
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_matrix.yy;
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          }
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Fixed *)value) = val;
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FONT_BBOX:
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < sizeof ( type1->font_bbox ) /
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   sizeof ( type1->font_bbox.xMin ) )
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FT_Fixed  val = 0;
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( val );
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          switch ( idx )
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          {
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 0:
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_bbox.xMin;
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 1:
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_bbox.yMin;
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 2:
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_bbox.xMax;
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 3:
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            val = type1->font_bbox.yMax;
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          }
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Fixed *)value) = val;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_PAINT_TYPE:
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->paint_type );
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->paint_type;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FONT_NAME:
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      retval = ft_strlen( type1->font_name ) + 1;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ft_memcpy( value, (void *)( type1->font_name ), retval );
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_UNIQUE_ID:
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.unique_id );
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Int *)value) = type1->private_dict.unique_id;
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_CHAR_STRINGS:
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->num_glyphs );
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Int *)value) = type1->num_glyphs;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_CHAR_STRING_KEY:
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < (FT_UInt)type1->num_glyphs )
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        retval = ft_strlen( type1->glyph_names[idx] ) + 1;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_CHAR_STRING:
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < (FT_UInt)type1->num_glyphs )
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        retval = type1->charstrings_len[idx] + 1;
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ft_memcpy( value, (void *)( type1->charstrings[idx] ),
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     retval - 1 );
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_ENCODING_TYPE:
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->encoding_type );
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((T1_EncodingType *)value) = type1->encoding_type;
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_ENCODING_ENTRY:
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           idx < (FT_UInt)type1->encoding.num_chars       )
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        retval = ft_strlen( type1->encoding.char_name[idx] ) + 1;
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     retval - 1 );
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_SUBRS:
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->num_subrs );
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Int *)value) = type1->num_subrs;
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_SUBR:
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < (FT_UInt)type1->num_subrs )
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        retval = type1->subrs_len[idx] + 1;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_STD_HW:
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.standard_width[0] );
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_UShort *)value) = type1->private_dict.standard_width[0];
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_STD_VW:
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.standard_height[0] );
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_UShort *)value) = type1->private_dict.standard_height[0];
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_BLUE_VALUES:
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.num_blue_values );
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->private_dict.num_blue_values;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_BLUE_VALUE:
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < type1->private_dict.num_blue_values )
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.blue_values[idx] );
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.blue_values[idx];
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_BLUE_SCALE:
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.blue_scale );
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Fixed *)value) = type1->private_dict.blue_scale;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_BLUE_FUZZ:
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.blue_fuzz );
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Int *)value) = type1->private_dict.blue_fuzz;
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_BLUE_SHIFT:
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.blue_shift );
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Int *)value) = type1->private_dict.blue_shift;
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_OTHER_BLUES:
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.num_other_blues );
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->private_dict.num_other_blues;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_OTHER_BLUE:
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < type1->private_dict.num_other_blues )
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.other_blues[idx] );
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.other_blues[idx];
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_FAMILY_BLUES:
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.num_family_blues );
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->private_dict.num_family_blues;
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FAMILY_BLUE:
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < type1->private_dict.num_family_blues )
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.family_blues[idx] );
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.family_blues[idx];
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_FAMILY_OTHER_BLUES:
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.num_family_other_blues );
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FAMILY_OTHER_BLUE:
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < type1->private_dict.num_family_other_blues )
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.family_other_blues[idx] );
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_STEM_SNAP_H:
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.num_snap_widths );
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->private_dict.num_snap_widths;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_STEM_SNAP_H:
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < type1->private_dict.num_snap_widths )
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.snap_widths[idx] );
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.snap_widths[idx];
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NUM_STEM_SNAP_V:
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.num_snap_heights );
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Byte *)value) = type1->private_dict.num_snap_heights;
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_STEM_SNAP_V:
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < type1->private_dict.num_snap_heights )
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.snap_heights[idx] );
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.snap_heights[idx];
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_RND_STEM_UP:
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.round_stem_up );
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Bool *)value) = type1->private_dict.round_stem_up;
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FORCE_BOLD:
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.force_bold );
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Bool *)value) = type1->private_dict.force_bold;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_MIN_FEATURE:
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < sizeof ( type1->private_dict.min_feature ) /
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   sizeof ( type1->private_dict.min_feature[0] ) )
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        retval = sizeof ( type1->private_dict.min_feature[idx] );
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( value && value_len >= retval )
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          *((FT_Short *)value) = type1->private_dict.min_feature[idx];
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_LEN_IV:
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.lenIV );
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Int *)value) = type1->private_dict.lenIV;
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_PASSWORD:
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.password );
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Long *)value) = type1->private_dict.password;
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_LANGUAGE_GROUP:
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->private_dict.language_group );
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Long *)value) = type1->private_dict.language_group;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_IS_FIXED_PITCH:
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->font_info.is_fixed_pitch );
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_UNDERLINE_POSITION:
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->font_info.underline_position );
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Short *)value) = type1->font_info.underline_position;
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_UNDERLINE_THICKNESS:
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->font_info.underline_thickness );
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_UShort *)value) = type1->font_info.underline_thickness;
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FS_TYPE:
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->font_extra.fs_type );
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_UShort *)value) = type1->font_extra.fs_type;
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_VERSION:
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      retval = ft_strlen( type1->font_info.version ) + 1;
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ft_memcpy( value, (void *)( type1->font_info.version ), retval );
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_NOTICE:
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      retval = ft_strlen( type1->font_info.notice ) + 1;
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FULL_NAME:
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      retval = ft_strlen( type1->font_info.full_name ) + 1;
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_FAMILY_NAME:
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      retval = ft_strlen( type1->font_info.family_name ) + 1;
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_WEIGHT:
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      retval = ft_strlen( type1->font_info.weight ) + 1;
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    case PS_DICT_ITALIC_ANGLE:
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      retval = sizeof ( type1->font_info.italic_angle );
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( value && value_len >= retval )
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *((FT_Long *)value) = type1->font_info.italic_angle;
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      break;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return retval == 0 ? -1 : (FT_Long)retval;
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_Service_PsInfoRec  t1_service_ps_info =
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontInfoFunc)   t1_ps_get_font_info,
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontPrivateFunc)t1_ps_get_font_private,
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontValueFunc)  t1_ps_get_font_value,
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_Service_KerningRec  t1_service_kerning =
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Get_Track_Kerning,
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  SERVICE LIST
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const FT_ServiceDescRec  t1_services[] =
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    { FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_TYPE_1 },
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    { NULL, NULL }
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Module_Interface )
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Get_Interface( FT_Module         module,
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 const FT_String*  t1_interface )
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UNUSED( module );
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ft_service_list_lookup( t1_services, t1_interface );
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef T1_CONFIG_OPTION_NO_AFM
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Function>                                                            */
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Get_Kerning                                                        */
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    A driver method used to return the kerning vector between two      */
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    glyphs of the same face.                                           */
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Input>                                                               */
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    face        :: A handle to the source face object.                 */
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    right_glyph :: The index of the right glyph in the kern pair.      */
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Output>                                                              */
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    kerning     :: The kerning vector.  This is in font units for      */
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   scalable formats, and in pixels for fixed-sizes     */
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   formats.                                            */
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Return>                                                              */
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    FreeType error code.  0 means success.                             */
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Note>                                                                */
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    supported by this function.  Other layouts, or more sophisticated  */
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    kernings are out of scope of this method (the basic driver         */
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    interface is meant to be simple).                                  */
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    They can be implemented by format-specific interfaces.             */
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Get_Kerning( FT_Face     t1face,        /* T1_Face */
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               FT_UInt     left_glyph,
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               FT_UInt     right_glyph,
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               FT_Vector*  kerning )
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Face  face = (T1_Face)t1face;
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    kerning->x = 0;
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    kerning->y = 0;
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( face->afm_data )
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      left_glyph,
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      right_glyph,
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      kerning );
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* T1_CONFIG_OPTION_NO_AFM */
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_TABLE_DEF
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const FT_Driver_ClassRec  t1_driver_class =
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_FONT_DRIVER       |
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_DRIVER_SCALABLE   |
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_DRIVER_HAS_HINTER,
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      sizeof ( FT_DriverRec ),
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      "type1",
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0x10000L,
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0x20000L,
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0,   /* format interface */
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      T1_Driver_Init,
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      T1_Driver_Done,
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      Get_Interface,
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    },
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( T1_FaceRec ),
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( T1_SizeRec ),
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( T1_GlyphSlotRec ),
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Face_Init,
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Face_Done,
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Size_Init,
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Size_Done,
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_GlyphSlot_Init,
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_GlyphSlot_Done,
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Load_Glyph,
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef T1_CONFIG_OPTION_NO_AFM
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0,                     /* FT_Face_GetKerningFunc */
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0,                     /* FT_Face_AttachFunc     */
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Get_Kerning,
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Read_Metrics,
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Get_Advances,
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    T1_Size_Request,
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0                      /* FT_Size_SelectFunc     */
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  };
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
726