xref: /inferno-os/libfreetype/t1driver.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  t1driver.c                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    Type 1 driver interface (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 "t1driver.h"
21*37da2899SCharles.Forsyth #include "t1gload.h"
22*37da2899SCharles.Forsyth #include "t1load.h"
23*37da2899SCharles.Forsyth 
24*37da2899SCharles.Forsyth #include "t1errors.h"
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_AFM
27*37da2899SCharles.Forsyth #include "t1afm.h"
28*37da2899SCharles.Forsyth #endif
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H
31*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H
32*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H
33*37da2899SCharles.Forsyth 
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth   /*************************************************************************/
36*37da2899SCharles.Forsyth   /*                                                                       */
37*37da2899SCharles.Forsyth   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
38*37da2899SCharles.Forsyth   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
39*37da2899SCharles.Forsyth   /* messages during execution.                                            */
40*37da2899SCharles.Forsyth   /*                                                                       */
41*37da2899SCharles.Forsyth #undef  FT_COMPONENT
42*37da2899SCharles.Forsyth #define FT_COMPONENT  trace_t1driver
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth 
45*37da2899SCharles.Forsyth   static FT_Error
t1_get_glyph_name(T1_Face face,FT_UInt glyph_index,FT_Pointer buffer,FT_UInt buffer_max)46*37da2899SCharles.Forsyth   t1_get_glyph_name( T1_Face     face,
47*37da2899SCharles.Forsyth                      FT_UInt     glyph_index,
48*37da2899SCharles.Forsyth                      FT_Pointer  buffer,
49*37da2899SCharles.Forsyth                      FT_UInt     buffer_max )
50*37da2899SCharles.Forsyth   {
51*37da2899SCharles.Forsyth     FT_String*  gname;
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth 
54*37da2899SCharles.Forsyth     gname = face->type1.glyph_names[glyph_index];
55*37da2899SCharles.Forsyth 
56*37da2899SCharles.Forsyth     if ( buffer_max > 0 )
57*37da2899SCharles.Forsyth     {
58*37da2899SCharles.Forsyth       FT_UInt  len = (FT_UInt)( ft_strlen( gname ) );
59*37da2899SCharles.Forsyth 
60*37da2899SCharles.Forsyth 
61*37da2899SCharles.Forsyth       if (len >= buffer_max)
62*37da2899SCharles.Forsyth         len = buffer_max - 1;
63*37da2899SCharles.Forsyth 
64*37da2899SCharles.Forsyth       FT_MEM_COPY( buffer, gname, len );
65*37da2899SCharles.Forsyth       ((FT_Byte*)buffer)[len] = 0;
66*37da2899SCharles.Forsyth     }
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth     return T1_Err_Ok;
69*37da2899SCharles.Forsyth   }
70*37da2899SCharles.Forsyth 
71*37da2899SCharles.Forsyth 
72*37da2899SCharles.Forsyth   /*************************************************************************/
73*37da2899SCharles.Forsyth   /*                                                                       */
74*37da2899SCharles.Forsyth   /* <Function>                                                            */
75*37da2899SCharles.Forsyth   /*    t1_get_name_index                                                  */
76*37da2899SCharles.Forsyth   /*                                                                       */
77*37da2899SCharles.Forsyth   /* <Description>                                                         */
78*37da2899SCharles.Forsyth   /*    Uses the Type 1 font's `glyph_names' table to find a given glyph   */
79*37da2899SCharles.Forsyth   /*    name's glyph index.                                                */
80*37da2899SCharles.Forsyth   /*                                                                       */
81*37da2899SCharles.Forsyth   /* <Input>                                                               */
82*37da2899SCharles.Forsyth   /*    face       :: A handle to the source face object.                  */
83*37da2899SCharles.Forsyth   /*                                                                       */
84*37da2899SCharles.Forsyth   /*    glyph_name :: The glyph name.                                      */
85*37da2899SCharles.Forsyth   /*                                                                       */
86*37da2899SCharles.Forsyth   /* <Return>                                                              */
87*37da2899SCharles.Forsyth   /*    Glyph index.  0 means `undefined character code'.                  */
88*37da2899SCharles.Forsyth   /*                                                                       */
89*37da2899SCharles.Forsyth   static FT_UInt
t1_get_name_index(T1_Face face,FT_String * glyph_name)90*37da2899SCharles.Forsyth   t1_get_name_index( T1_Face     face,
91*37da2899SCharles.Forsyth                      FT_String*  glyph_name )
92*37da2899SCharles.Forsyth   {
93*37da2899SCharles.Forsyth     FT_Int      i;
94*37da2899SCharles.Forsyth     FT_String*  gname;
95*37da2899SCharles.Forsyth 
96*37da2899SCharles.Forsyth 
97*37da2899SCharles.Forsyth     for ( i = 0; i < face->type1.num_glyphs; i++ )
98*37da2899SCharles.Forsyth     {
99*37da2899SCharles.Forsyth       gname = face->type1.glyph_names[i];
100*37da2899SCharles.Forsyth 
101*37da2899SCharles.Forsyth       if ( !ft_strcmp( glyph_name, gname ) )
102*37da2899SCharles.Forsyth         return (FT_UInt)i;
103*37da2899SCharles.Forsyth     }
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth     return 0;
106*37da2899SCharles.Forsyth   }
107*37da2899SCharles.Forsyth 
108*37da2899SCharles.Forsyth 
109*37da2899SCharles.Forsyth   static const char*
t1_get_ps_name(T1_Face face)110*37da2899SCharles.Forsyth   t1_get_ps_name( T1_Face  face )
111*37da2899SCharles.Forsyth   {
112*37da2899SCharles.Forsyth     return (const char*) face->type1.font_name;
113*37da2899SCharles.Forsyth   }
114*37da2899SCharles.Forsyth 
115*37da2899SCharles.Forsyth 
116*37da2899SCharles.Forsyth   /*************************************************************************/
117*37da2899SCharles.Forsyth   /*                                                                       */
118*37da2899SCharles.Forsyth   /* <Function>                                                            */
119*37da2899SCharles.Forsyth   /*    Get_Interface                                                      */
120*37da2899SCharles.Forsyth   /*                                                                       */
121*37da2899SCharles.Forsyth   /* <Description>                                                         */
122*37da2899SCharles.Forsyth   /*    Each driver can provide one or more extensions to the base         */
123*37da2899SCharles.Forsyth   /*    FreeType API.  These can be used to access format specific         */
124*37da2899SCharles.Forsyth   /*    features (e.g., all TrueType/OpenType resources share a common     */
125*37da2899SCharles.Forsyth   /*    file structure and common tables which can be accessed through the */
126*37da2899SCharles.Forsyth   /*    `sfnt' interface), or more simply generic ones (e.g., the          */
127*37da2899SCharles.Forsyth   /*    `postscript names' interface which can be used to retrieve the     */
128*37da2899SCharles.Forsyth   /*     PostScript name of a given glyph index).                          */
129*37da2899SCharles.Forsyth   /*                                                                       */
130*37da2899SCharles.Forsyth   /* <InOut>                                                               */
131*37da2899SCharles.Forsyth   /*    driver       :: A handle to a driver object.                       */
132*37da2899SCharles.Forsyth   /*                                                                       */
133*37da2899SCharles.Forsyth   /* <Input>                                                               */
134*37da2899SCharles.Forsyth   /*    t1_interface :: A string designing the interface.  Examples are    */
135*37da2899SCharles.Forsyth   /*                    `sfnt', `post_names', `charmaps', etc.             */
136*37da2899SCharles.Forsyth   /*                                                                       */
137*37da2899SCharles.Forsyth   /* <Return>                                                              */
138*37da2899SCharles.Forsyth   /*    A typeless pointer to the extension's interface (normally a table  */
139*37da2899SCharles.Forsyth   /*    of function pointers).  Returns NULL if the requested extension    */
140*37da2899SCharles.Forsyth   /*    isn't available (i.e., wasn't compiled in the driver at build      */
141*37da2899SCharles.Forsyth   /*    time).                                                             */
142*37da2899SCharles.Forsyth   /*                                                                       */
143*37da2899SCharles.Forsyth   static FT_Module_Interface
Get_Interface(FT_Driver driver,const FT_String * t1_interface)144*37da2899SCharles.Forsyth   Get_Interface( FT_Driver         driver,
145*37da2899SCharles.Forsyth                  const FT_String*  t1_interface )
146*37da2899SCharles.Forsyth   {
147*37da2899SCharles.Forsyth     FT_UNUSED( driver );
148*37da2899SCharles.Forsyth     FT_UNUSED( t1_interface );
149*37da2899SCharles.Forsyth 
150*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t1_interface, "glyph_name" ) == 0 )
151*37da2899SCharles.Forsyth       return (FT_Module_Interface)t1_get_glyph_name;
152*37da2899SCharles.Forsyth 
153*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t1_interface, "name_index" ) == 0 )
154*37da2899SCharles.Forsyth       return (FT_Module_Interface)t1_get_name_index;
155*37da2899SCharles.Forsyth 
156*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t1_interface, "postscript_name" ) == 0 )
157*37da2899SCharles.Forsyth       return (FT_Module_Interface)t1_get_ps_name;
158*37da2899SCharles.Forsyth 
159*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
160*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t1_interface, "get_mm" ) == 0 )
161*37da2899SCharles.Forsyth       return (FT_Module_Interface)T1_Get_Multi_Master;
162*37da2899SCharles.Forsyth 
163*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t1_interface, "set_mm_design") == 0 )
164*37da2899SCharles.Forsyth       return (FT_Module_Interface)T1_Set_MM_Design;
165*37da2899SCharles.Forsyth 
166*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t1_interface, "set_mm_blend") == 0 )
167*37da2899SCharles.Forsyth       return (FT_Module_Interface)T1_Set_MM_Blend;
168*37da2899SCharles.Forsyth #endif
169*37da2899SCharles.Forsyth     return 0;
170*37da2899SCharles.Forsyth   }
171*37da2899SCharles.Forsyth 
172*37da2899SCharles.Forsyth 
173*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_AFM
174*37da2899SCharles.Forsyth 
175*37da2899SCharles.Forsyth   /*************************************************************************/
176*37da2899SCharles.Forsyth   /*                                                                       */
177*37da2899SCharles.Forsyth   /* <Function>                                                            */
178*37da2899SCharles.Forsyth   /*    Get_Kerning                                                        */
179*37da2899SCharles.Forsyth   /*                                                                       */
180*37da2899SCharles.Forsyth   /* <Description>                                                         */
181*37da2899SCharles.Forsyth   /*    A driver method used to return the kerning vector between two      */
182*37da2899SCharles.Forsyth   /*    glyphs of the same face.                                           */
183*37da2899SCharles.Forsyth   /*                                                                       */
184*37da2899SCharles.Forsyth   /* <Input>                                                               */
185*37da2899SCharles.Forsyth   /*    face        :: A handle to the source face object.                 */
186*37da2899SCharles.Forsyth   /*                                                                       */
187*37da2899SCharles.Forsyth   /*    left_glyph  :: The index of the left glyph in the kern pair.       */
188*37da2899SCharles.Forsyth   /*                                                                       */
189*37da2899SCharles.Forsyth   /*    right_glyph :: The index of the right glyph in the kern pair.      */
190*37da2899SCharles.Forsyth   /*                                                                       */
191*37da2899SCharles.Forsyth   /* <Output>                                                              */
192*37da2899SCharles.Forsyth   /*    kerning     :: The kerning vector.  This is in font units for      */
193*37da2899SCharles.Forsyth   /*                   scalable formats, and in pixels for fixed-sizes     */
194*37da2899SCharles.Forsyth   /*                   formats.                                            */
195*37da2899SCharles.Forsyth   /*                                                                       */
196*37da2899SCharles.Forsyth   /* <Return>                                                              */
197*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
198*37da2899SCharles.Forsyth   /*                                                                       */
199*37da2899SCharles.Forsyth   /* <Note>                                                                */
200*37da2899SCharles.Forsyth   /*    Only horizontal layouts (left-to-right & right-to-left) are        */
201*37da2899SCharles.Forsyth   /*    supported by this function.  Other layouts, or more sophisticated  */
202*37da2899SCharles.Forsyth   /*    kernings are out of scope of this method (the basic driver         */
203*37da2899SCharles.Forsyth   /*    interface is meant to be simple).                                  */
204*37da2899SCharles.Forsyth   /*                                                                       */
205*37da2899SCharles.Forsyth   /*    They can be implemented by format-specific interfaces.             */
206*37da2899SCharles.Forsyth   /*                                                                       */
207*37da2899SCharles.Forsyth   static FT_Error
Get_Kerning(T1_Face face,FT_UInt left_glyph,FT_UInt right_glyph,FT_Vector * kerning)208*37da2899SCharles.Forsyth   Get_Kerning( T1_Face     face,
209*37da2899SCharles.Forsyth                FT_UInt     left_glyph,
210*37da2899SCharles.Forsyth                FT_UInt     right_glyph,
211*37da2899SCharles.Forsyth                FT_Vector*  kerning )
212*37da2899SCharles.Forsyth   {
213*37da2899SCharles.Forsyth     T1_AFM*  afm;
214*37da2899SCharles.Forsyth 
215*37da2899SCharles.Forsyth 
216*37da2899SCharles.Forsyth     kerning->x = 0;
217*37da2899SCharles.Forsyth     kerning->y = 0;
218*37da2899SCharles.Forsyth 
219*37da2899SCharles.Forsyth     afm = (T1_AFM*)face->afm_data;
220*37da2899SCharles.Forsyth     if ( afm )
221*37da2899SCharles.Forsyth       T1_Get_Kerning( afm, left_glyph, right_glyph, kerning );
222*37da2899SCharles.Forsyth 
223*37da2899SCharles.Forsyth     return T1_Err_Ok;
224*37da2899SCharles.Forsyth   }
225*37da2899SCharles.Forsyth 
226*37da2899SCharles.Forsyth 
227*37da2899SCharles.Forsyth #endif /* T1_CONFIG_OPTION_NO_AFM */
228*37da2899SCharles.Forsyth 
229*37da2899SCharles.Forsyth 
230*37da2899SCharles.Forsyth 
231*37da2899SCharles.Forsyth 
232*37da2899SCharles.Forsyth   FT_CALLBACK_TABLE_DEF
233*37da2899SCharles.Forsyth   const FT_Driver_ClassRec  t1_driver_class =
234*37da2899SCharles.Forsyth   {
235*37da2899SCharles.Forsyth     {
236*37da2899SCharles.Forsyth       ft_module_font_driver      |
237*37da2899SCharles.Forsyth       ft_module_driver_scalable  |
238*37da2899SCharles.Forsyth       ft_module_driver_has_hinter,
239*37da2899SCharles.Forsyth 
240*37da2899SCharles.Forsyth       sizeof( FT_DriverRec ),
241*37da2899SCharles.Forsyth 
242*37da2899SCharles.Forsyth       "type1",
243*37da2899SCharles.Forsyth       0x10000L,
244*37da2899SCharles.Forsyth       0x20000L,
245*37da2899SCharles.Forsyth 
246*37da2899SCharles.Forsyth       0,   /* format interface */
247*37da2899SCharles.Forsyth 
248*37da2899SCharles.Forsyth       (FT_Module_Constructor)T1_Driver_Init,
249*37da2899SCharles.Forsyth       (FT_Module_Destructor) T1_Driver_Done,
250*37da2899SCharles.Forsyth       (FT_Module_Requester)  Get_Interface,
251*37da2899SCharles.Forsyth     },
252*37da2899SCharles.Forsyth 
253*37da2899SCharles.Forsyth     sizeof( T1_FaceRec ),
254*37da2899SCharles.Forsyth     sizeof( T1_SizeRec ),
255*37da2899SCharles.Forsyth     sizeof( T1_GlyphSlotRec ),
256*37da2899SCharles.Forsyth 
257*37da2899SCharles.Forsyth     (FT_Face_InitFunc)        T1_Face_Init,
258*37da2899SCharles.Forsyth     (FT_Face_DoneFunc)        T1_Face_Done,
259*37da2899SCharles.Forsyth     (FT_Size_InitFunc)        T1_Size_Init,
260*37da2899SCharles.Forsyth     (FT_Size_DoneFunc)        T1_Size_Done,
261*37da2899SCharles.Forsyth     (FT_Slot_InitFunc)        T1_GlyphSlot_Init,
262*37da2899SCharles.Forsyth     (FT_Slot_DoneFunc)        T1_GlyphSlot_Done,
263*37da2899SCharles.Forsyth 
264*37da2899SCharles.Forsyth     (FT_Size_ResetPointsFunc) T1_Size_Reset,
265*37da2899SCharles.Forsyth     (FT_Size_ResetPixelsFunc) T1_Size_Reset,
266*37da2899SCharles.Forsyth     (FT_Slot_LoadFunc)        T1_Load_Glyph,
267*37da2899SCharles.Forsyth 
268*37da2899SCharles.Forsyth #ifdef T1_CONFIG_OPTION_NO_AFM
269*37da2899SCharles.Forsyth     (FT_Face_GetKerningFunc)  0,
270*37da2899SCharles.Forsyth     (FT_Face_AttachFunc)      0,
271*37da2899SCharles.Forsyth #else
272*37da2899SCharles.Forsyth     (FT_Face_GetKerningFunc)  Get_Kerning,
273*37da2899SCharles.Forsyth     (FT_Face_AttachFunc)      T1_Read_AFM,
274*37da2899SCharles.Forsyth #endif
275*37da2899SCharles.Forsyth     (FT_Face_GetAdvancesFunc) 0
276*37da2899SCharles.Forsyth   };
277*37da2899SCharles.Forsyth 
278*37da2899SCharles.Forsyth 
279*37da2899SCharles.Forsyth /* END */
280