:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / subsys / win32k / freetype / src / cid / cidriver.c
1 /***************************************************************************/
2 /*                                                                         */
3 /*  cidriver.c                                                             */
4 /*                                                                         */
5 /*    CID driver interface (body).                                         */
6 /*                                                                         */
7 /*  Copyright 1996-2000 by                                                 */
8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9 /*                                                                         */
10 /*  This file is part of the FreeType project, and may only be used,       */
11 /*  modified, and distributed under the terms of the FreeType project      */
12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13 /*  this file you indicate that you have read the license and              */
14 /*  understand and accept it fully.                                        */
15 /*                                                                         */
16 /***************************************************************************/
17
18
19 #ifdef FT_FLAT_COMPILE
20
21 #include "cidriver.h"
22 #include "cidgload.h"
23
24 #else
25
26 #include <freetype/src/cid/cidriver.h>
27 #include <freetype/src/cid/cidgload.h>
28
29 #endif
30
31
32 #include <freetype/internal/ftdebug.h>
33 #include <freetype/internal/ftstream.h>
34 #include <freetype/internal/psnames.h>
35
36 #include <string.h>         /* for strcmp() */
37
38
39   /*************************************************************************/
40   /*                                                                       */
41   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
42   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
43   /* messages during execution.                                            */
44   /*                                                                       */
45 #undef  FT_COMPONENT
46 #define FT_COMPONENT  trace_ciddriver
47
48
49   static
50   FT_Module_Interface  CID_Get_Interface( FT_Driver         driver,
51                                           const FT_String*  interface )
52   {
53     FT_UNUSED( driver );
54     FT_UNUSED( interface );
55
56     return 0;
57   }
58
59
60 #if 0 /* unimplemented yet */
61
62   static
63   FT_Error  cid_Get_Kerning( T1_Face     face,
64                              FT_UInt     left_glyph,
65                              FT_UInt     right_glyph,
66                              FT_Vector*  kerning )
67   {
68     CID_AFM*  afm;
69
70
71     kerning->x = 0;
72     kerning->y = 0;
73
74     afm = (CID_AFM*)face->afm_data;
75     if ( afm )
76       CID_Get_Kerning( afm, left_glyph, right_glyph, kerning );
77
78     return T1_Err_Ok;
79   }
80
81
82 #endif /* 0 */
83
84
85   /*************************************************************************/
86   /*                                                                       */
87   /* <Function>                                                            */
88   /*    Cid_Get_Char_Index                                                 */
89   /*                                                                       */
90   /* <Description>                                                         */
91   /*    Uses a charmap to return a given character code's glyph index.     */
92   /*                                                                       */
93   /* <Input>                                                               */
94   /*    charmap  :: A handle to the source charmap object.                 */
95   /*                                                                       */
96   /*    charcode :: The character code.                                    */
97   /*                                                                       */
98   /* <Return>                                                              */
99   /*    Glyph index.  0 means `undefined character code'.                  */
100   /*                                                                       */
101   static
102   FT_UInt  CID_Get_Char_Index( FT_CharMap  charmap,
103                                FT_Long     charcode )
104   {
105     T1_Face             face;
106     FT_UInt             result = 0;
107     PSNames_Interface*  psnames;
108
109
110     face = (T1_Face)charmap->face;
111     psnames = (PSNames_Interface*)face->psnames;
112     if ( psnames )
113       switch ( charmap->encoding )
114       {
115         /*******************************************************************/
116         /*                                                                 */
117         /* Unicode encoding support                                        */
118         /*                                                                 */
119       case ft_encoding_unicode:
120         /* use the `PSNames' module to synthetize the Unicode charmap */
121         result = psnames->lookup_unicode( &face->unicode_map,
122                                           (FT_ULong)charcode );
123
124         /* the function returns 0xFFFF if the Unicode charcode has */
125         /* no corresponding glyph.                                 */
126         if ( result == 0xFFFF )
127           result = 0;
128         goto Exit;
129
130         /*******************************************************************/
131         /*                                                                 */
132         /* Custom Type 1 encoding                                          */
133         /*                                                                 */
134       case ft_encoding_adobe_custom:
135         {
136           T1_Encoding*  encoding = &face->type1.encoding;
137
138
139           if ( charcode >= encoding->code_first &&
140                charcode <= encoding->code_last  )
141             result = encoding->char_index[charcode];
142           goto Exit;
143         }
144
145         /*******************************************************************/
146         /*                                                                 */
147         /* Adobe Standard & Expert encoding support                        */
148         /*                                                                 */
149       default:
150         if ( charcode < 256 )
151         {
152           FT_UInt      code;
153           FT_Int       n;
154           const char*  glyph_name;
155
156
157           code = psnames->adobe_std_encoding[charcode];
158           if ( charmap->encoding == ft_encoding_adobe_expert )
159             code = psnames->adobe_expert_encoding[charcode];
160
161           glyph_name = psnames->adobe_std_strings( code );
162           if ( !glyph_name )
163             break;
164
165           for ( n = 0; n < face->type1.num_glyphs; n++ )
166           {
167             const char*  gname = face->type1.glyph_names[n];
168
169
170             if ( gname && gname[0] == glyph_name[0] &&
171                  strcmp( gname, glyph_name ) == 0   )
172             {
173               result = n;
174               break;
175             }
176           }
177         }
178       }
179
180   Exit:
181     return result;
182   }
183
184
185   const FT_Driver_Class  t1cid_driver_class =
186   {
187     /* first of all, the FT_Module_Class fields */
188     {
189       ft_module_font_driver | ft_module_driver_scalable,
190       sizeof( FT_DriverRec ),
191       "t1cid",   /* module name           */
192       0x10000L,  /* version 1.0 of driver */
193       0x20000L,  /* requires FreeType 2.0 */
194
195       0,
196
197       (FT_Module_Constructor)CID_Init_Driver,
198       (FT_Module_Destructor) CID_Done_Driver,
199       (FT_Module_Requester)  CID_Get_Interface
200     },
201
202     /* then the other font drivers fields */
203     sizeof( CID_FaceRec ),
204     sizeof( CID_SizeRec ),
205     sizeof( CID_GlyphSlotRec ),
206
207     (FTDriver_initFace)     CID_Init_Face,
208     (FTDriver_doneFace)     CID_Done_Face,
209
210     (FTDriver_initSize)     0,
211     (FTDriver_doneSize)     0,
212     (FTDriver_initGlyphSlot)0,
213     (FTDriver_doneGlyphSlot)0,
214
215     (FTDriver_setCharSizes) 0,
216     (FTDriver_setPixelSizes)0,
217
218     (FTDriver_loadGlyph)    CID_Load_Glyph,
219     (FTDriver_getCharIndex) CID_Get_Char_Index,
220
221     (FTDriver_getKerning)   0,
222     (FTDriver_attachFile)   0,
223
224     (FTDriver_getAdvances)  0
225   };
226
227
228 #ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS
229
230
231   /*************************************************************************/
232   /*                                                                       */
233   /* <Function>                                                            */
234   /*    getDriverClass                                                     */
235   /*                                                                       */
236   /* <Description>                                                         */
237   /*    This function is used when compiling the TrueType driver as a      */
238   /*    shared library (`.DLL' or `.so').  It will be used by the          */
239   /*    high-level library of FreeType to retrieve the address of the      */
240   /*    driver's generic interface.                                        */
241   /*                                                                       */
242   /*    It shouldn't be implemented in a static build, as each driver must */
243   /*    have the same function as an exported entry point.                 */
244   /*                                                                       */
245   /* <Return>                                                              */
246   /*    The address of the TrueType's driver generic interface.  The       */
247   /*    format-specific interface can then be retrieved through the method */
248   /*    interface->get_format_interface.                                   */
249   /*                                                                       */
250   EXPORT_FUNC( FT_Driver_Class* )  getDriverClass( void )
251   {
252     return &t1cid_driver_class;
253   }
254
255
256 #endif /* CONFIG_OPTION_DYNAMIC_DRIVERS */
257
258
259 /* END */