:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / subsys / win32k / freetype / src / type1z / z1objs.c
1 /***************************************************************************/
2 /*                                                                         */
3 /*  z1objs.c                                                               */
4 /*                                                                         */
5 /*    Experimental Type 1 objects manager (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 #include <freetype/internal/ftdebug.h>
20 #include <freetype/internal/ftstream.h>
21
22
23 #ifdef FT_FLAT_COMPILE
24
25 #include "z1gload.h"
26 #include "z1load.h"
27 #include "z1afm.h"
28
29 #else
30
31 #include <freetype/src/type1z/z1gload.h>
32 #include <freetype/src/type1z/z1load.h>
33 #include <freetype/src/type1z/z1afm.h>
34
35 #endif
36
37
38 #include <freetype/internal/psnames.h>
39
40
41   /*************************************************************************/
42   /*                                                                       */
43   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
44   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
45   /* messages during execution.                                            */
46   /*                                                                       */
47 #undef  FT_COMPONENT
48 #define FT_COMPONENT  trace_z1objs
49
50
51   /*************************************************************************/
52   /*                                                                       */
53   /*                            FACE  FUNCTIONS                            */
54   /*                                                                       */
55   /*************************************************************************/
56
57
58   /*************************************************************************/
59   /*                                                                       */
60   /* <Function>                                                            */
61   /*    Z1_Done_Face                                                       */
62   /*                                                                       */
63   /* <Description>                                                         */
64   /*    The face object destructor.                                        */
65   /*                                                                       */
66   /* <Input>                                                               */
67   /*    face :: A typeless pointer to the face object to destroy.          */
68   /*                                                                       */
69   LOCAL_FUNC
70   void  Z1_Done_Face( T1_Face  face )
71   {
72     FT_Memory  memory;
73     T1_Font*   type1 = &face->type1;
74
75
76     if ( face )
77     {
78       memory = face->root.memory;
79
80 #ifndef Z1_CONFIG_OPTION_NO_MM_SUPPORT
81       /* release multiple masters information */
82       Z1_Done_Blend( face );
83       face->blend = 0;
84 #endif
85
86       /* release font info strings */
87       {
88         T1_FontInfo*  info = &type1->font_info;
89
90
91         FREE( info->version );
92         FREE( info->notice );
93         FREE( info->full_name );
94         FREE( info->family_name );
95         FREE( info->weight );
96       }
97
98       /* release top dictionary */
99       FREE( type1->charstrings_len );
100       FREE( type1->charstrings );
101       FREE( type1->glyph_names );
102
103       FREE( type1->subrs );
104       FREE( type1->subrs_len );
105
106       FREE( type1->subrs_block );
107       FREE( type1->charstrings_block );
108       FREE( type1->glyph_names_block );
109
110       FREE( type1->encoding.char_index );
111       FREE( type1->font_name );
112
113 #ifndef Z1_CONFIG_OPTION_NO_AFM
114       /* release afm data if present */
115       if ( face->afm_data )
116         Z1_Done_AFM( memory, (Z1_AFM*)face->afm_data );
117 #endif
118
119       /* release unicode map, if any */
120       FREE( face->unicode_map.maps );
121       face->unicode_map.num_maps = 0;
122
123       face->root.family_name = 0;
124       face->root.style_name  = 0;
125     }
126   }
127
128
129   /*************************************************************************/
130   /*                                                                       */
131   /* <Function>                                                            */
132   /*    Z1_Init_Face                                                       */
133   /*                                                                       */
134   /* <Description>                                                         */
135   /*    The face object constructor.                                       */
136   /*                                                                       */
137   /* <Input>                                                               */
138   /*    stream     ::  input stream where to load font data.               */
139   /*                                                                       */
140   /*    face_index :: The index of the font face in the resource.          */
141   /*                                                                       */
142   /*    num_params :: Number of additional generic parameters.  Ignored.   */
143   /*                                                                       */
144   /*    params     :: Additional generic parameters.  Ignored.             */
145   /*                                                                       */
146   /* <InOut>                                                               */
147   /*    face       :: The face record to build.                            */
148   /*                                                                       */
149   /* <Return>                                                              */
150   /*    FreeType error code.  0 means success.                             */
151   /*                                                                       */
152   LOCAL_FUNC
153   FT_Error  Z1_Init_Face( FT_Stream      stream,
154                           T1_Face        face,
155                           FT_Int         face_index,
156                           FT_Int         num_params,
157                           FT_Parameter*  params )
158   {
159     FT_Error            error;
160     PSNames_Interface*  psnames;
161
162     FT_UNUSED( num_params );
163     FT_UNUSED( params );
164     FT_UNUSED( face_index );
165     FT_UNUSED( stream );
166
167
168     face->root.num_faces = 1;
169
170     psnames = (PSNames_Interface*)face->psnames;
171     if ( !psnames )
172     {
173       psnames = (PSNames_Interface*)
174                 FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "psnames" );
175
176       face->psnames = psnames;
177     }
178
179     /* open the tokenizer, this will also check the font format */
180     error = Z1_Open_Face( face );
181     if ( error )
182       goto Exit;
183
184     /* if we just wanted to check the format, leave successfully now */
185     if ( face_index < 0 )
186       goto Exit;
187
188     /* check the face index */
189     if ( face_index != 0 )
190     {
191       FT_ERROR(( "Z1_Init_Face: invalid face index\n" ));
192       error = T1_Err_Invalid_Argument;
193       goto Exit;
194     }
195
196     /* Now, load the font program into the face object */
197
198     /* Init the face object fields */
199     /* Now set up root face fields */
200     {
201       FT_Face  root = (FT_Face)&face->root;
202
203
204       root->num_glyphs   = face->type1.num_glyphs;
205       root->num_charmaps = 1;
206
207       root->face_index = face_index;
208       root->face_flags = FT_FACE_FLAG_SCALABLE;
209
210       root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
211
212       root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
213
214       if ( face->type1.font_info.is_fixed_pitch )
215         root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
216
217       if ( face->blend )
218         root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
219
220       /* XXX: TODO -- add kerning with .afm support */
221
222       /* get style name -- be careful, some broken fonts only */
223       /* have a `/FontName' dictionary entry!                 */
224       root->family_name = face->type1.font_info.family_name;
225       if ( root->family_name )
226       {
227         char*  full   = face->type1.font_info.full_name;
228         char*  family = root->family_name;
229
230
231         while ( *family && *full == *family )
232         {
233           family++;
234           full++;
235         }
236
237         root->style_name = ( *full == ' ' ? full + 1
238                                           : (char *)"Regular" );
239       }
240       else
241       {
242         /* do we have a `/FontName'? */
243         if ( face->type1.font_name )
244         {
245           root->family_name = face->type1.font_name;
246           root->style_name  = "Regular";
247         }
248       }
249
250       /* no embedded bitmap support */
251       root->num_fixed_sizes = 0;
252       root->available_sizes = 0;
253
254       root->bbox         = face->type1.font_bbox;
255       root->units_per_EM = 1000;
256       root->ascender     =  (FT_Short)face->type1.font_bbox.yMax;
257       root->descender    = -(FT_Short)face->type1.font_bbox.yMin;
258       root->height       = ( ( root->ascender + root->descender ) * 12 ) / 10;
259
260       /* now compute the maximum advance width */
261
262       root->max_advance_width = face->type1.private_dict.standard_width[0];
263
264       /* compute max advance width for proportional fonts */
265       if ( !face->type1.font_info.is_fixed_pitch )
266       {
267         FT_Int  max_advance;
268
269
270         error = Z1_Compute_Max_Advance( face, &max_advance );
271
272         /* in case of error, keep the standard width */
273         if ( !error )
274           root->max_advance_width = max_advance;
275         else
276           error = 0;   /* clear error */
277       }
278
279       root->max_advance_height = root->height;
280
281       root->underline_position  = face->type1.font_info.underline_position;
282       root->underline_thickness = face->type1.font_info.underline_thickness;
283
284       root->max_points   = 0;
285       root->max_contours = 0;
286     }
287
288     /* charmap support -- synthetize unicode charmap if possible */
289     {
290       FT_Face     root    = &face->root;
291       FT_CharMap  charmap = face->charmaprecs;
292
293
294       /* synthesize a Unicode charmap if there is support in the `PSNames' */
295       /* module                                                            */
296       if ( face->psnames )
297       {
298         PSNames_Interface*  psnames = (PSNames_Interface*)face->psnames;
299
300
301         if ( psnames->unicode_value )
302         {
303           error = psnames->build_unicodes(
304                     root->memory,
305                     face->type1.num_glyphs,
306                     (const char**)face->type1.glyph_names,
307                     &face->unicode_map );
308           if ( !error )
309           {
310             root->charmap        = charmap;
311             charmap->face        = (FT_Face)face;
312             charmap->encoding    = ft_encoding_unicode;
313             charmap->platform_id = 3;
314             charmap->encoding_id = 1;
315             charmap++;
316           }
317
318           /* simply clear the error in case of failure (which really) */
319           /* means that out of memory or no unicode glyph names       */
320           error = FT_Err_Ok;
321         }
322       }
323
324       /* now, support either the standard, expert, or custom encoding */
325       charmap->face        = (FT_Face)face;
326       charmap->platform_id = 7;  /* a new platform id for Adobe fonts? */
327
328       switch ( face->type1.encoding_type )
329       {
330       case t1_encoding_standard:
331         charmap->encoding    = ft_encoding_adobe_standard;
332         charmap->encoding_id = 0;
333         break;
334
335       case t1_encoding_expert:
336         charmap->encoding    = ft_encoding_adobe_expert;
337         charmap->encoding_id = 1;
338         break;
339
340       default:
341         charmap->encoding    = ft_encoding_adobe_custom;
342         charmap->encoding_id = 2;
343         break;
344       }
345
346       root->charmaps     = face->charmaps;
347       root->num_charmaps = charmap - face->charmaprecs + 1;
348       face->charmaps[0]  = &face->charmaprecs[0];
349       face->charmaps[1]  = &face->charmaprecs[1];
350     }
351
352   Exit:
353     return error;
354   }
355
356
357   /*************************************************************************/
358   /*                                                                       */
359   /* <Function>                                                            */
360   /*    Z1_Init_Driver                                                     */
361   /*                                                                       */
362   /* <Description>                                                         */
363   /*    Initializes a given Type 1 driver object.                          */
364   /*                                                                       */
365   /* <Input>                                                               */
366   /*    driver :: A handle to the target driver object.                    */
367   /*                                                                       */
368   /* <Return>                                                              */
369   /*    FreeType error code.  0 means success.                             */
370   /*                                                                       */
371   LOCAL_FUNC
372   FT_Error  Z1_Init_Driver( Z1_Driver  driver )
373   {
374     FT_UNUSED( driver );
375
376     return T1_Err_Ok;
377   }
378
379
380   /*************************************************************************/
381   /*                                                                       */
382   /* <Function>                                                            */
383   /*    Z1_Done_Driver                                                     */
384   /*                                                                       */
385   /* <Description>                                                         */
386   /*    Finalizes a given Type 1 driver.                                   */
387   /*                                                                       */
388   /* <Input>                                                               */
389   /*    driver  :: A handle to the target Type 1 driver.                   */
390   /*                                                                       */
391   LOCAL_DEF
392   void  Z1_Done_Driver( Z1_Driver  driver )
393   {
394     FT_UNUSED( driver );
395   }
396
397
398 /* END */