xref: /inferno-os/libfreetype/cffdrivr.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  cffdrivr.c                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    OpenType font driver implementation (body).                          */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 1996-2001, 2002 by                                           */
8*37da2899SCharles.Forsyth /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9*37da2899SCharles.Forsyth /*                                                                         */
10*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
11*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
12*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
14*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
15*37da2899SCharles.Forsyth /*                                                                         */
16*37da2899SCharles.Forsyth /***************************************************************************/
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 
19*37da2899SCharles.Forsyth #include <ft2build.h>
20*37da2899SCharles.Forsyth #include FT_FREETYPE_H
21*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H
22*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H
23*37da2899SCharles.Forsyth #include FT_INTERNAL_SFNT_H
24*37da2899SCharles.Forsyth #include FT_TRUETYPE_IDS_H
25*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H
26*37da2899SCharles.Forsyth 
27*37da2899SCharles.Forsyth #include "cffdrivr.h"
28*37da2899SCharles.Forsyth #include "cffgload.h"
29*37da2899SCharles.Forsyth #include "cffload.h"
30*37da2899SCharles.Forsyth 
31*37da2899SCharles.Forsyth #include "cfferrs.h"
32*37da2899SCharles.Forsyth 
33*37da2899SCharles.Forsyth 
34*37da2899SCharles.Forsyth   /*************************************************************************/
35*37da2899SCharles.Forsyth   /*                                                                       */
36*37da2899SCharles.Forsyth   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
37*37da2899SCharles.Forsyth   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
38*37da2899SCharles.Forsyth   /* messages during execution.                                            */
39*37da2899SCharles.Forsyth   /*                                                                       */
40*37da2899SCharles.Forsyth #undef  FT_COMPONENT
41*37da2899SCharles.Forsyth #define FT_COMPONENT  trace_cffdriver
42*37da2899SCharles.Forsyth 
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth   /*************************************************************************/
45*37da2899SCharles.Forsyth   /*************************************************************************/
46*37da2899SCharles.Forsyth   /*************************************************************************/
47*37da2899SCharles.Forsyth   /****                                                                 ****/
48*37da2899SCharles.Forsyth   /****                                                                 ****/
49*37da2899SCharles.Forsyth   /****                          F A C E S                              ****/
50*37da2899SCharles.Forsyth   /****                                                                 ****/
51*37da2899SCharles.Forsyth   /****                                                                 ****/
52*37da2899SCharles.Forsyth   /*************************************************************************/
53*37da2899SCharles.Forsyth   /*************************************************************************/
54*37da2899SCharles.Forsyth   /*************************************************************************/
55*37da2899SCharles.Forsyth 
56*37da2899SCharles.Forsyth 
57*37da2899SCharles.Forsyth #undef  PAIR_TAG
58*37da2899SCharles.Forsyth #define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
59*37da2899SCharles.Forsyth                                      (FT_ULong)right        )
60*37da2899SCharles.Forsyth 
61*37da2899SCharles.Forsyth 
62*37da2899SCharles.Forsyth   /*************************************************************************/
63*37da2899SCharles.Forsyth   /*                                                                       */
64*37da2899SCharles.Forsyth   /* <Function>                                                            */
65*37da2899SCharles.Forsyth   /*    Get_Kerning                                                        */
66*37da2899SCharles.Forsyth   /*                                                                       */
67*37da2899SCharles.Forsyth   /* <Description>                                                         */
68*37da2899SCharles.Forsyth   /*    A driver method used to return the kerning vector between two      */
69*37da2899SCharles.Forsyth   /*    glyphs of the same face.                                           */
70*37da2899SCharles.Forsyth   /*                                                                       */
71*37da2899SCharles.Forsyth   /* <Input>                                                               */
72*37da2899SCharles.Forsyth   /*    face        :: A handle to the source face object.                 */
73*37da2899SCharles.Forsyth   /*                                                                       */
74*37da2899SCharles.Forsyth   /*    left_glyph  :: The index of the left glyph in the kern pair.       */
75*37da2899SCharles.Forsyth   /*                                                                       */
76*37da2899SCharles.Forsyth   /*    right_glyph :: The index of the right glyph in the kern pair.      */
77*37da2899SCharles.Forsyth   /*                                                                       */
78*37da2899SCharles.Forsyth   /* <Output>                                                              */
79*37da2899SCharles.Forsyth   /*    kerning     :: The kerning vector.  This is in font units for      */
80*37da2899SCharles.Forsyth   /*                   scalable formats, and in pixels for fixed-sizes     */
81*37da2899SCharles.Forsyth   /*                   formats.                                            */
82*37da2899SCharles.Forsyth   /*                                                                       */
83*37da2899SCharles.Forsyth   /* <Return>                                                              */
84*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
85*37da2899SCharles.Forsyth   /*                                                                       */
86*37da2899SCharles.Forsyth   /* <Note>                                                                */
87*37da2899SCharles.Forsyth   /*    Only horizontal layouts (left-to-right & right-to-left) are        */
88*37da2899SCharles.Forsyth   /*    supported by this function.  Other layouts, or more sophisticated  */
89*37da2899SCharles.Forsyth   /*    kernings, are out of scope of this method (the basic driver        */
90*37da2899SCharles.Forsyth   /*    interface is meant to be simple).                                  */
91*37da2899SCharles.Forsyth   /*                                                                       */
92*37da2899SCharles.Forsyth   /*    They can be implemented by format-specific interfaces.             */
93*37da2899SCharles.Forsyth   /*                                                                       */
94*37da2899SCharles.Forsyth   static FT_Error
Get_Kerning(TT_Face face,FT_UInt left_glyph,FT_UInt right_glyph,FT_Vector * kerning)95*37da2899SCharles.Forsyth   Get_Kerning( TT_Face     face,
96*37da2899SCharles.Forsyth                FT_UInt     left_glyph,
97*37da2899SCharles.Forsyth                FT_UInt     right_glyph,
98*37da2899SCharles.Forsyth                FT_Vector*  kerning )
99*37da2899SCharles.Forsyth   {
100*37da2899SCharles.Forsyth     TT_Kern0_Pair  pair;
101*37da2899SCharles.Forsyth 
102*37da2899SCharles.Forsyth 
103*37da2899SCharles.Forsyth     if ( !face )
104*37da2899SCharles.Forsyth       return CFF_Err_Invalid_Face_Handle;
105*37da2899SCharles.Forsyth 
106*37da2899SCharles.Forsyth     kerning->x = 0;
107*37da2899SCharles.Forsyth     kerning->y = 0;
108*37da2899SCharles.Forsyth 
109*37da2899SCharles.Forsyth     if ( face->kern_pairs )
110*37da2899SCharles.Forsyth     {
111*37da2899SCharles.Forsyth       /* there are some kerning pairs in this font file! */
112*37da2899SCharles.Forsyth       FT_ULong  search_tag = PAIR_TAG( left_glyph, right_glyph );
113*37da2899SCharles.Forsyth       FT_Long   left, right;
114*37da2899SCharles.Forsyth 
115*37da2899SCharles.Forsyth 
116*37da2899SCharles.Forsyth       left  = 0;
117*37da2899SCharles.Forsyth       right = face->num_kern_pairs - 1;
118*37da2899SCharles.Forsyth 
119*37da2899SCharles.Forsyth       while ( left <= right )
120*37da2899SCharles.Forsyth       {
121*37da2899SCharles.Forsyth         FT_Long   middle = left + ( ( right - left ) >> 1 );
122*37da2899SCharles.Forsyth         FT_ULong  cur_pair;
123*37da2899SCharles.Forsyth 
124*37da2899SCharles.Forsyth 
125*37da2899SCharles.Forsyth         pair     = face->kern_pairs + middle;
126*37da2899SCharles.Forsyth         cur_pair = PAIR_TAG( pair->left, pair->right );
127*37da2899SCharles.Forsyth 
128*37da2899SCharles.Forsyth         if ( cur_pair == search_tag )
129*37da2899SCharles.Forsyth           goto Found;
130*37da2899SCharles.Forsyth 
131*37da2899SCharles.Forsyth         if ( cur_pair < search_tag )
132*37da2899SCharles.Forsyth           left = middle + 1;
133*37da2899SCharles.Forsyth         else
134*37da2899SCharles.Forsyth           right = middle - 1;
135*37da2899SCharles.Forsyth       }
136*37da2899SCharles.Forsyth     }
137*37da2899SCharles.Forsyth 
138*37da2899SCharles.Forsyth   Exit:
139*37da2899SCharles.Forsyth     return CFF_Err_Ok;
140*37da2899SCharles.Forsyth 
141*37da2899SCharles.Forsyth   Found:
142*37da2899SCharles.Forsyth     kerning->x = pair->value;
143*37da2899SCharles.Forsyth     goto Exit;
144*37da2899SCharles.Forsyth   }
145*37da2899SCharles.Forsyth 
146*37da2899SCharles.Forsyth 
147*37da2899SCharles.Forsyth #undef PAIR_TAG
148*37da2899SCharles.Forsyth 
149*37da2899SCharles.Forsyth 
150*37da2899SCharles.Forsyth   /*************************************************************************/
151*37da2899SCharles.Forsyth   /*                                                                       */
152*37da2899SCharles.Forsyth   /* <Function>                                                            */
153*37da2899SCharles.Forsyth   /*    Load_Glyph                                                         */
154*37da2899SCharles.Forsyth   /*                                                                       */
155*37da2899SCharles.Forsyth   /* <Description>                                                         */
156*37da2899SCharles.Forsyth   /*    A driver method used to load a glyph within a given glyph slot.    */
157*37da2899SCharles.Forsyth   /*                                                                       */
158*37da2899SCharles.Forsyth   /* <Input>                                                               */
159*37da2899SCharles.Forsyth   /*    slot        :: A handle to the target slot object where the glyph  */
160*37da2899SCharles.Forsyth   /*                   will be loaded.                                     */
161*37da2899SCharles.Forsyth   /*                                                                       */
162*37da2899SCharles.Forsyth   /*    size        :: A handle to the source face size at which the glyph */
163*37da2899SCharles.Forsyth   /*                   must be scaled, loaded, etc.                        */
164*37da2899SCharles.Forsyth   /*                                                                       */
165*37da2899SCharles.Forsyth   /*    glyph_index :: The index of the glyph in the font file.            */
166*37da2899SCharles.Forsyth   /*                                                                       */
167*37da2899SCharles.Forsyth   /*    load_flags  :: A flag indicating what to load for this glyph.  The */
168*37da2899SCharles.Forsyth   /*                   FTLOAD_??? constants can be used to control the     */
169*37da2899SCharles.Forsyth   /*                   glyph loading process (e.g., whether the outline    */
170*37da2899SCharles.Forsyth   /*                   should be scaled, whether to load bitmaps or not,   */
171*37da2899SCharles.Forsyth   /*                   whether to hint the outline, etc).                  */
172*37da2899SCharles.Forsyth   /*                                                                       */
173*37da2899SCharles.Forsyth   /* <Return>                                                              */
174*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
175*37da2899SCharles.Forsyth   /*                                                                       */
176*37da2899SCharles.Forsyth   static FT_Error
Load_Glyph(CFF_GlyphSlot slot,CFF_Size size,FT_UShort glyph_index,FT_Int32 load_flags)177*37da2899SCharles.Forsyth   Load_Glyph( CFF_GlyphSlot  slot,
178*37da2899SCharles.Forsyth               CFF_Size       size,
179*37da2899SCharles.Forsyth               FT_UShort      glyph_index,
180*37da2899SCharles.Forsyth               FT_Int32       load_flags )
181*37da2899SCharles.Forsyth   {
182*37da2899SCharles.Forsyth     FT_Error  error;
183*37da2899SCharles.Forsyth 
184*37da2899SCharles.Forsyth 
185*37da2899SCharles.Forsyth     if ( !slot )
186*37da2899SCharles.Forsyth       return CFF_Err_Invalid_Slot_Handle;
187*37da2899SCharles.Forsyth 
188*37da2899SCharles.Forsyth     /* check whether we want a scaled outline or bitmap */
189*37da2899SCharles.Forsyth     if ( !size )
190*37da2899SCharles.Forsyth       load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
191*37da2899SCharles.Forsyth 
192*37da2899SCharles.Forsyth     if ( load_flags & FT_LOAD_NO_SCALE )
193*37da2899SCharles.Forsyth       size = NULL;
194*37da2899SCharles.Forsyth 
195*37da2899SCharles.Forsyth     /* reset the size object if necessary */
196*37da2899SCharles.Forsyth     if ( size )
197*37da2899SCharles.Forsyth     {
198*37da2899SCharles.Forsyth       /* these two object must have the same parent */
199*37da2899SCharles.Forsyth       if ( size->face != slot->root.face )
200*37da2899SCharles.Forsyth         return CFF_Err_Invalid_Face_Handle;
201*37da2899SCharles.Forsyth     }
202*37da2899SCharles.Forsyth 
203*37da2899SCharles.Forsyth     /* now load the glyph outline if necessary */
204*37da2899SCharles.Forsyth     error = cff_slot_load( slot, size, glyph_index, load_flags );
205*37da2899SCharles.Forsyth 
206*37da2899SCharles.Forsyth     /* force drop-out mode to 2 - irrelevant now */
207*37da2899SCharles.Forsyth     /* slot->outline.dropout_mode = 2; */
208*37da2899SCharles.Forsyth 
209*37da2899SCharles.Forsyth     return error;
210*37da2899SCharles.Forsyth   }
211*37da2899SCharles.Forsyth 
212*37da2899SCharles.Forsyth 
213*37da2899SCharles.Forsyth   /*************************************************************************/
214*37da2899SCharles.Forsyth   /*************************************************************************/
215*37da2899SCharles.Forsyth   /*************************************************************************/
216*37da2899SCharles.Forsyth   /****                                                                 ****/
217*37da2899SCharles.Forsyth   /****                                                                 ****/
218*37da2899SCharles.Forsyth   /****             C H A R A C T E R   M A P P I N G S                 ****/
219*37da2899SCharles.Forsyth   /****                                                                 ****/
220*37da2899SCharles.Forsyth   /****                                                                 ****/
221*37da2899SCharles.Forsyth   /*************************************************************************/
222*37da2899SCharles.Forsyth   /*************************************************************************/
223*37da2899SCharles.Forsyth   /*************************************************************************/
224*37da2899SCharles.Forsyth 
225*37da2899SCharles.Forsyth   static FT_Error
cff_get_glyph_name(CFF_Face face,FT_UInt glyph_index,FT_Pointer buffer,FT_UInt buffer_max)226*37da2899SCharles.Forsyth   cff_get_glyph_name( CFF_Face    face,
227*37da2899SCharles.Forsyth                       FT_UInt     glyph_index,
228*37da2899SCharles.Forsyth                       FT_Pointer  buffer,
229*37da2899SCharles.Forsyth                       FT_UInt     buffer_max )
230*37da2899SCharles.Forsyth   {
231*37da2899SCharles.Forsyth     CFF_Font         font   = (CFF_Font)face->extra.data;
232*37da2899SCharles.Forsyth     FT_Memory        memory = FT_FACE_MEMORY( face );
233*37da2899SCharles.Forsyth     FT_String*       gname;
234*37da2899SCharles.Forsyth     FT_UShort        sid;
235*37da2899SCharles.Forsyth     PSNames_Service  psnames;
236*37da2899SCharles.Forsyth     FT_Error         error;
237*37da2899SCharles.Forsyth 
238*37da2899SCharles.Forsyth 
239*37da2899SCharles.Forsyth     psnames = (PSNames_Service)FT_Get_Module_Interface(
240*37da2899SCharles.Forsyth                 face->root.driver->root.library, "psnames" );
241*37da2899SCharles.Forsyth 
242*37da2899SCharles.Forsyth     if ( !psnames )
243*37da2899SCharles.Forsyth     {
244*37da2899SCharles.Forsyth       FT_ERROR(( "cff_get_glyph_name:" ));
245*37da2899SCharles.Forsyth       FT_ERROR(( " cannot open CFF & CEF fonts\n" ));
246*37da2899SCharles.Forsyth       FT_ERROR(( "                   " ));
247*37da2899SCharles.Forsyth       FT_ERROR(( " without the `PSNames' module\n" ));
248*37da2899SCharles.Forsyth       error = CFF_Err_Unknown_File_Format;
249*37da2899SCharles.Forsyth       goto Exit;
250*37da2899SCharles.Forsyth     }
251*37da2899SCharles.Forsyth 
252*37da2899SCharles.Forsyth     /* first, locate the sid in the charset table */
253*37da2899SCharles.Forsyth     sid = font->charset.sids[glyph_index];
254*37da2899SCharles.Forsyth 
255*37da2899SCharles.Forsyth     /* now, lookup the name itself */
256*37da2899SCharles.Forsyth     gname = cff_index_get_sid_string( &font->string_index, sid, psnames );
257*37da2899SCharles.Forsyth 
258*37da2899SCharles.Forsyth     if ( buffer_max > 0 )
259*37da2899SCharles.Forsyth     {
260*37da2899SCharles.Forsyth       FT_UInt  len = (FT_UInt)ft_strlen( gname );
261*37da2899SCharles.Forsyth 
262*37da2899SCharles.Forsyth 
263*37da2899SCharles.Forsyth       if ( len >= buffer_max )
264*37da2899SCharles.Forsyth         len = buffer_max - 1;
265*37da2899SCharles.Forsyth 
266*37da2899SCharles.Forsyth       FT_MEM_COPY( buffer, gname, len );
267*37da2899SCharles.Forsyth       ((FT_Byte*)buffer)[len] = 0;
268*37da2899SCharles.Forsyth     }
269*37da2899SCharles.Forsyth 
270*37da2899SCharles.Forsyth     FT_FREE ( gname );
271*37da2899SCharles.Forsyth     error = CFF_Err_Ok;
272*37da2899SCharles.Forsyth 
273*37da2899SCharles.Forsyth     Exit:
274*37da2899SCharles.Forsyth       return error;
275*37da2899SCharles.Forsyth   }
276*37da2899SCharles.Forsyth 
277*37da2899SCharles.Forsyth 
278*37da2899SCharles.Forsyth 
279*37da2899SCharles.Forsyth   /*************************************************************************/
280*37da2899SCharles.Forsyth   /*                                                                       */
281*37da2899SCharles.Forsyth   /* <Function>                                                            */
282*37da2899SCharles.Forsyth   /*    cff_get_name_index                                                 */
283*37da2899SCharles.Forsyth   /*                                                                       */
284*37da2899SCharles.Forsyth   /* <Description>                                                         */
285*37da2899SCharles.Forsyth   /*    Uses the psnames module and the CFF font's charset to to return a  */
286*37da2899SCharles.Forsyth   /*    a given glyph name's glyph index.                                  */
287*37da2899SCharles.Forsyth   /*                                                                       */
288*37da2899SCharles.Forsyth   /* <Input>                                                               */
289*37da2899SCharles.Forsyth   /*    face       :: A handle to the source face object.                  */
290*37da2899SCharles.Forsyth   /*                                                                       */
291*37da2899SCharles.Forsyth   /*    glyph_name :: The glyph name.                                      */
292*37da2899SCharles.Forsyth   /*                                                                       */
293*37da2899SCharles.Forsyth   /* <Return>                                                              */
294*37da2899SCharles.Forsyth   /*    Glyph index.  0 means `undefined character code'.                  */
295*37da2899SCharles.Forsyth   /*                                                                       */
296*37da2899SCharles.Forsyth   static FT_UInt
cff_get_name_index(CFF_Face face,FT_String * glyph_name)297*37da2899SCharles.Forsyth   cff_get_name_index( CFF_Face    face,
298*37da2899SCharles.Forsyth                       FT_String*  glyph_name )
299*37da2899SCharles.Forsyth   {
300*37da2899SCharles.Forsyth     CFF_Font         cff;
301*37da2899SCharles.Forsyth     CFF_Charset      charset;
302*37da2899SCharles.Forsyth     PSNames_Service  psnames;
303*37da2899SCharles.Forsyth     FT_Memory        memory = FT_FACE_MEMORY( face );
304*37da2899SCharles.Forsyth     FT_String*       name;
305*37da2899SCharles.Forsyth     FT_UShort        sid;
306*37da2899SCharles.Forsyth     FT_UInt          i;
307*37da2899SCharles.Forsyth     FT_Int           result;
308*37da2899SCharles.Forsyth 
309*37da2899SCharles.Forsyth 
310*37da2899SCharles.Forsyth     cff     = (CFF_FontRec *)face->extra.data;
311*37da2899SCharles.Forsyth     charset = &cff->charset;
312*37da2899SCharles.Forsyth 
313*37da2899SCharles.Forsyth     psnames = (PSNames_Service)FT_Get_Module_Interface(
314*37da2899SCharles.Forsyth                 face->root.driver->root.library, "psnames" );
315*37da2899SCharles.Forsyth 
316*37da2899SCharles.Forsyth     for ( i = 0; i < cff->num_glyphs; i++ )
317*37da2899SCharles.Forsyth     {
318*37da2899SCharles.Forsyth       sid = charset->sids[i];
319*37da2899SCharles.Forsyth 
320*37da2899SCharles.Forsyth       if ( sid > 390 )
321*37da2899SCharles.Forsyth         name = cff_index_get_name( &cff->string_index, sid - 391 );
322*37da2899SCharles.Forsyth       else
323*37da2899SCharles.Forsyth         name = (FT_String *)psnames->adobe_std_strings( sid );
324*37da2899SCharles.Forsyth 
325*37da2899SCharles.Forsyth       result = ft_strcmp( glyph_name, name );
326*37da2899SCharles.Forsyth 
327*37da2899SCharles.Forsyth       if ( sid > 390 )
328*37da2899SCharles.Forsyth         FT_FREE( name );
329*37da2899SCharles.Forsyth 
330*37da2899SCharles.Forsyth       if ( !result )
331*37da2899SCharles.Forsyth         return i;
332*37da2899SCharles.Forsyth     }
333*37da2899SCharles.Forsyth 
334*37da2899SCharles.Forsyth     return 0;
335*37da2899SCharles.Forsyth   }
336*37da2899SCharles.Forsyth 
337*37da2899SCharles.Forsyth 
338*37da2899SCharles.Forsyth   /*************************************************************************/
339*37da2899SCharles.Forsyth   /*************************************************************************/
340*37da2899SCharles.Forsyth   /*************************************************************************/
341*37da2899SCharles.Forsyth   /****                                                                 ****/
342*37da2899SCharles.Forsyth   /****                                                                 ****/
343*37da2899SCharles.Forsyth   /****                D R I V E R  I N T E R F A C E                   ****/
344*37da2899SCharles.Forsyth   /****                                                                 ****/
345*37da2899SCharles.Forsyth   /****                                                                 ****/
346*37da2899SCharles.Forsyth   /*************************************************************************/
347*37da2899SCharles.Forsyth   /*************************************************************************/
348*37da2899SCharles.Forsyth   /*************************************************************************/
349*37da2899SCharles.Forsyth 
350*37da2899SCharles.Forsyth   static FT_Module_Interface
cff_get_interface(CFF_Driver driver,const char * module_interface)351*37da2899SCharles.Forsyth   cff_get_interface( CFF_Driver   driver,
352*37da2899SCharles.Forsyth                      const char*  module_interface )
353*37da2899SCharles.Forsyth   {
354*37da2899SCharles.Forsyth     FT_Module  sfnt;
355*37da2899SCharles.Forsyth 
356*37da2899SCharles.Forsyth 
357*37da2899SCharles.Forsyth #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
358*37da2899SCharles.Forsyth 
359*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)module_interface, "glyph_name" ) == 0 )
360*37da2899SCharles.Forsyth       return (FT_Module_Interface)cff_get_glyph_name;
361*37da2899SCharles.Forsyth 
362*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)module_interface, "name_index" ) == 0 )
363*37da2899SCharles.Forsyth       return (FT_Module_Interface)cff_get_name_index;
364*37da2899SCharles.Forsyth 
365*37da2899SCharles.Forsyth #endif
366*37da2899SCharles.Forsyth 
367*37da2899SCharles.Forsyth     /* we simply pass our request to the `sfnt' module */
368*37da2899SCharles.Forsyth     sfnt = FT_Get_Module( driver->root.root.library, "sfnt" );
369*37da2899SCharles.Forsyth 
370*37da2899SCharles.Forsyth     return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
371*37da2899SCharles.Forsyth   }
372*37da2899SCharles.Forsyth 
373*37da2899SCharles.Forsyth 
374*37da2899SCharles.Forsyth   /* The FT_DriverInterface structure is defined in ftdriver.h. */
375*37da2899SCharles.Forsyth 
376*37da2899SCharles.Forsyth   FT_CALLBACK_TABLE_DEF
377*37da2899SCharles.Forsyth   const FT_Driver_ClassRec  cff_driver_class =
378*37da2899SCharles.Forsyth   {
379*37da2899SCharles.Forsyth     /* begin with the FT_Module_Class fields */
380*37da2899SCharles.Forsyth     {
381*37da2899SCharles.Forsyth       ft_module_font_driver       |
382*37da2899SCharles.Forsyth       ft_module_driver_scalable   |
383*37da2899SCharles.Forsyth       ft_module_driver_has_hinter,
384*37da2899SCharles.Forsyth 
385*37da2899SCharles.Forsyth       sizeof( CFF_DriverRec ),
386*37da2899SCharles.Forsyth       "cff",
387*37da2899SCharles.Forsyth       0x10000L,
388*37da2899SCharles.Forsyth       0x20000L,
389*37da2899SCharles.Forsyth 
390*37da2899SCharles.Forsyth       0,   /* module-specific interface */
391*37da2899SCharles.Forsyth 
392*37da2899SCharles.Forsyth       (FT_Module_Constructor)cff_driver_init,
393*37da2899SCharles.Forsyth       (FT_Module_Destructor) cff_driver_done,
394*37da2899SCharles.Forsyth       (FT_Module_Requester)  cff_get_interface,
395*37da2899SCharles.Forsyth     },
396*37da2899SCharles.Forsyth 
397*37da2899SCharles.Forsyth     /* now the specific driver fields */
398*37da2899SCharles.Forsyth     sizeof( TT_FaceRec ),
399*37da2899SCharles.Forsyth     sizeof( FT_SizeRec ),
400*37da2899SCharles.Forsyth     sizeof( CFF_GlyphSlotRec ),
401*37da2899SCharles.Forsyth 
402*37da2899SCharles.Forsyth     (FT_Face_InitFunc)       cff_face_init,
403*37da2899SCharles.Forsyth     (FT_Face_DoneFunc)       cff_face_done,
404*37da2899SCharles.Forsyth     (FT_Size_InitFunc)       cff_size_init,
405*37da2899SCharles.Forsyth     (FT_Size_DoneFunc)       cff_size_done,
406*37da2899SCharles.Forsyth     (FT_Slot_InitFunc)       cff_slot_init,
407*37da2899SCharles.Forsyth     (FT_Slot_DoneFunc)       cff_slot_done,
408*37da2899SCharles.Forsyth 
409*37da2899SCharles.Forsyth     (FT_Size_ResetPointsFunc)cff_size_reset,
410*37da2899SCharles.Forsyth     (FT_Size_ResetPixelsFunc)cff_size_reset,
411*37da2899SCharles.Forsyth 
412*37da2899SCharles.Forsyth     (FT_Slot_LoadFunc)       Load_Glyph,
413*37da2899SCharles.Forsyth 
414*37da2899SCharles.Forsyth     (FT_Face_GetKerningFunc) Get_Kerning,
415*37da2899SCharles.Forsyth     (FT_Face_AttachFunc)     0,
416*37da2899SCharles.Forsyth     (FT_Face_GetAdvancesFunc)0,
417*37da2899SCharles.Forsyth   };
418*37da2899SCharles.Forsyth 
419*37da2899SCharles.Forsyth 
420*37da2899SCharles.Forsyth /* END */
421