xref: /inferno-os/libfreetype/t42drivr.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  t42drivr.c                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    High-level Type 42 driver interface (body).                          */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 2002 by Roberto Alameda.                                     */
8*37da2899SCharles.Forsyth /*                                                                         */
9*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
10*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
11*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
12*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
13*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
14*37da2899SCharles.Forsyth /*                                                                         */
15*37da2899SCharles.Forsyth /***************************************************************************/
16*37da2899SCharles.Forsyth 
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth   /*************************************************************************/
19*37da2899SCharles.Forsyth   /*                                                                       */
20*37da2899SCharles.Forsyth   /* This driver implements Type42 fonts as described in the               */
21*37da2899SCharles.Forsyth   /* Technical Note #5012 from Adobe, with these limitations:              */
22*37da2899SCharles.Forsyth   /*                                                                       */
23*37da2899SCharles.Forsyth   /* 1) CID Fonts are not currently supported.                             */
24*37da2899SCharles.Forsyth   /* 2) Incremental fonts making use of the GlyphDirectory keyword         */
25*37da2899SCharles.Forsyth   /*    will be loaded, but the rendering will be using the TrueType       */
26*37da2899SCharles.Forsyth   /*    tables.                                                            */
27*37da2899SCharles.Forsyth   /* 3) The sfnts array is expected to be ASCII, not binary.               */
28*37da2899SCharles.Forsyth   /* 4) As for Type1 fonts, CDevProc is not supported.                     */
29*37da2899SCharles.Forsyth   /* 5) The Metrics dictionary is not supported.                           */
30*37da2899SCharles.Forsyth   /* 6) AFM metrics are not supported.                                     */
31*37da2899SCharles.Forsyth   /*                                                                       */
32*37da2899SCharles.Forsyth   /* In other words, this driver supports Type42 fonts derived from        */
33*37da2899SCharles.Forsyth   /* TrueType fonts in a non-CID manner, as done by usual conversion       */
34*37da2899SCharles.Forsyth   /* programs.                                                             */
35*37da2899SCharles.Forsyth   /*                                                                       */
36*37da2899SCharles.Forsyth   /*************************************************************************/
37*37da2899SCharles.Forsyth 
38*37da2899SCharles.Forsyth 
39*37da2899SCharles.Forsyth #include "t42drivr.h"
40*37da2899SCharles.Forsyth #include "t42objs.h"
41*37da2899SCharles.Forsyth #include "t42error.h"
42*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth 
45*37da2899SCharles.Forsyth #undef  FT_COMPONENT
46*37da2899SCharles.Forsyth #define FT_COMPONENT  trace_t42
47*37da2899SCharles.Forsyth 
48*37da2899SCharles.Forsyth 
49*37da2899SCharles.Forsyth   static FT_Error
t42_get_glyph_name(T42_Face face,FT_UInt glyph_index,FT_Pointer buffer,FT_UInt buffer_max)50*37da2899SCharles.Forsyth   t42_get_glyph_name( T42_Face    face,
51*37da2899SCharles.Forsyth                       FT_UInt     glyph_index,
52*37da2899SCharles.Forsyth                       FT_Pointer  buffer,
53*37da2899SCharles.Forsyth                       FT_UInt     buffer_max )
54*37da2899SCharles.Forsyth   {
55*37da2899SCharles.Forsyth     FT_String*  gname;
56*37da2899SCharles.Forsyth 
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth     gname = face->type1.glyph_names[glyph_index];
59*37da2899SCharles.Forsyth 
60*37da2899SCharles.Forsyth     if ( buffer_max > 0 )
61*37da2899SCharles.Forsyth     {
62*37da2899SCharles.Forsyth       FT_UInt  len = (FT_UInt)( ft_strlen( gname ) );
63*37da2899SCharles.Forsyth 
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth       if ( len >= buffer_max )
66*37da2899SCharles.Forsyth         len = buffer_max - 1;
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth       FT_MEM_COPY( buffer, gname, len );
69*37da2899SCharles.Forsyth       ((FT_Byte*)buffer)[len] = 0;
70*37da2899SCharles.Forsyth     }
71*37da2899SCharles.Forsyth 
72*37da2899SCharles.Forsyth     return T42_Err_Ok;
73*37da2899SCharles.Forsyth   }
74*37da2899SCharles.Forsyth 
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth   static const char*
t42_get_ps_name(T42_Face face)77*37da2899SCharles.Forsyth   t42_get_ps_name( T42_Face  face )
78*37da2899SCharles.Forsyth   {
79*37da2899SCharles.Forsyth     return (const char*)face->type1.font_name;
80*37da2899SCharles.Forsyth   }
81*37da2899SCharles.Forsyth 
82*37da2899SCharles.Forsyth 
83*37da2899SCharles.Forsyth   static FT_UInt
t42_get_name_index(T42_Face face,FT_String * glyph_name)84*37da2899SCharles.Forsyth   t42_get_name_index( T42_Face    face,
85*37da2899SCharles.Forsyth                       FT_String*  glyph_name )
86*37da2899SCharles.Forsyth   {
87*37da2899SCharles.Forsyth     FT_Int      i;
88*37da2899SCharles.Forsyth     FT_String*  gname;
89*37da2899SCharles.Forsyth 
90*37da2899SCharles.Forsyth 
91*37da2899SCharles.Forsyth     for ( i = 0; i < face->type1.num_glyphs; i++ )
92*37da2899SCharles.Forsyth     {
93*37da2899SCharles.Forsyth       gname = face->type1.glyph_names[i];
94*37da2899SCharles.Forsyth 
95*37da2899SCharles.Forsyth       if ( !ft_strcmp( glyph_name, gname ) )
96*37da2899SCharles.Forsyth         return ft_atoi( (const char *)face->type1.charstrings[i] );
97*37da2899SCharles.Forsyth     }
98*37da2899SCharles.Forsyth 
99*37da2899SCharles.Forsyth     return 0;
100*37da2899SCharles.Forsyth   }
101*37da2899SCharles.Forsyth 
102*37da2899SCharles.Forsyth 
103*37da2899SCharles.Forsyth   static FT_Module_Interface
T42_Get_Interface(FT_Driver driver,const FT_String * t42_interface)104*37da2899SCharles.Forsyth   T42_Get_Interface( FT_Driver         driver,
105*37da2899SCharles.Forsyth                      const FT_String*  t42_interface )
106*37da2899SCharles.Forsyth   {
107*37da2899SCharles.Forsyth     FT_UNUSED( driver );
108*37da2899SCharles.Forsyth 
109*37da2899SCharles.Forsyth     /* Any additional interface are defined here */
110*37da2899SCharles.Forsyth     if (ft_strcmp( (const char*)t42_interface, "glyph_name" ) == 0 )
111*37da2899SCharles.Forsyth       return (FT_Module_Interface)t42_get_glyph_name;
112*37da2899SCharles.Forsyth 
113*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t42_interface, "name_index" ) == 0 )
114*37da2899SCharles.Forsyth       return (FT_Module_Interface)t42_get_name_index;
115*37da2899SCharles.Forsyth 
116*37da2899SCharles.Forsyth     if ( ft_strcmp( (const char*)t42_interface, "postscript_name" ) == 0 )
117*37da2899SCharles.Forsyth       return (FT_Module_Interface)t42_get_ps_name;
118*37da2899SCharles.Forsyth 
119*37da2899SCharles.Forsyth     return 0;
120*37da2899SCharles.Forsyth   }
121*37da2899SCharles.Forsyth 
122*37da2899SCharles.Forsyth 
123*37da2899SCharles.Forsyth   const FT_Driver_ClassRec  t42_driver_class =
124*37da2899SCharles.Forsyth   {
125*37da2899SCharles.Forsyth     {
126*37da2899SCharles.Forsyth       ft_module_font_driver      |
127*37da2899SCharles.Forsyth       ft_module_driver_scalable  |
128*37da2899SCharles.Forsyth #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
129*37da2899SCharles.Forsyth       ft_module_driver_has_hinter,
130*37da2899SCharles.Forsyth #else
131*37da2899SCharles.Forsyth       0,
132*37da2899SCharles.Forsyth #endif
133*37da2899SCharles.Forsyth 
134*37da2899SCharles.Forsyth       sizeof ( T42_DriverRec ),
135*37da2899SCharles.Forsyth 
136*37da2899SCharles.Forsyth       "type42",
137*37da2899SCharles.Forsyth       0x10000L,
138*37da2899SCharles.Forsyth       0x20000L,
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth       0,    /* format interface */
141*37da2899SCharles.Forsyth 
142*37da2899SCharles.Forsyth       (FT_Module_Constructor)T42_Driver_Init,
143*37da2899SCharles.Forsyth       (FT_Module_Destructor) T42_Driver_Done,
144*37da2899SCharles.Forsyth       (FT_Module_Requester)  T42_Get_Interface,
145*37da2899SCharles.Forsyth     },
146*37da2899SCharles.Forsyth 
147*37da2899SCharles.Forsyth     sizeof ( T42_FaceRec ),
148*37da2899SCharles.Forsyth     sizeof ( T42_SizeRec ),
149*37da2899SCharles.Forsyth     sizeof ( T42_GlyphSlotRec ),
150*37da2899SCharles.Forsyth 
151*37da2899SCharles.Forsyth     (FT_Face_InitFunc)        T42_Face_Init,
152*37da2899SCharles.Forsyth     (FT_Face_DoneFunc)        T42_Face_Done,
153*37da2899SCharles.Forsyth     (FT_Size_InitFunc)        T42_Size_Init,
154*37da2899SCharles.Forsyth     (FT_Size_DoneFunc)        T42_Size_Done,
155*37da2899SCharles.Forsyth     (FT_Slot_InitFunc)        T42_GlyphSlot_Init,
156*37da2899SCharles.Forsyth     (FT_Slot_DoneFunc)        T42_GlyphSlot_Done,
157*37da2899SCharles.Forsyth 
158*37da2899SCharles.Forsyth     (FT_Size_ResetPointsFunc) T42_Size_SetChars,
159*37da2899SCharles.Forsyth     (FT_Size_ResetPixelsFunc) T42_Size_SetPixels,
160*37da2899SCharles.Forsyth     (FT_Slot_LoadFunc)        T42_GlyphSlot_Load,
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth     (FT_Face_GetKerningFunc)  0,
163*37da2899SCharles.Forsyth     (FT_Face_AttachFunc)      0,
164*37da2899SCharles.Forsyth 
165*37da2899SCharles.Forsyth     (FT_Face_GetAdvancesFunc) 0
166*37da2899SCharles.Forsyth   };
167*37da2899SCharles.Forsyth 
168*37da2899SCharles.Forsyth 
169*37da2899SCharles.Forsyth /* END */
170