Visualization Library 2.0.0-b5

A lightweight C++ OpenGL middleware for 2D/3D graphics

VL     Star     Watch     Fork     Issue

[Download] [Tutorials] [All Classes] [Grouped Classes]
cidobjs.c
Go to the documentation of this file.
1 /***************************************************************************/
2 /* */
3 /* cidobjs.c */
4 /* */
5 /* CID objects manager (body). */
6 /* */
7 /* Copyright 1996-2006, 2008, 2010-2011, 2013 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 <ft2build.h>
20 #include FT_INTERNAL_DEBUG_H
21 #include FT_INTERNAL_STREAM_H
22 
23 #include "cidgload.h"
24 #include "cidload.h"
25 
26 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
27 #include FT_INTERNAL_POSTSCRIPT_AUX_H
28 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
29 
30 #include "ciderrs.h"
31 
32 
33  /*************************************************************************/
34  /* */
35  /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
36  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
37  /* messages during execution. */
38  /* */
39 #undef FT_COMPONENT
40 #define FT_COMPONENT trace_cidobjs
41 
42 
43  /*************************************************************************/
44  /* */
45  /* SLOT FUNCTIONS */
46  /* */
47  /*************************************************************************/
48 
49  FT_LOCAL_DEF( void )
51  {
52  slot->internal->glyph_hints = 0;
53  }
54 
55 
58  {
59  CID_Face face;
60  PSHinter_Service pshinter;
61 
62 
63  face = (CID_Face)slot->face;
64  pshinter = (PSHinter_Service)face->pshinter;
65 
66  if ( pshinter )
67  {
68  FT_Module module;
69 
70 
71  module = FT_Get_Module( slot->face->driver->root.library,
72  "pshinter" );
73  if ( module )
74  {
75  T1_Hints_Funcs funcs;
76 
77 
78  funcs = pshinter->get_t1_funcs( module );
79  slot->internal->glyph_hints = (void*)funcs;
80  }
81  }
82 
83  return 0;
84  }
85 
86 
87  /*************************************************************************/
88  /* */
89  /* SIZE FUNCTIONS */
90  /* */
91  /*************************************************************************/
92 
93 
94  static PSH_Globals_Funcs
95  cid_size_get_globals_funcs( CID_Size size )
96  {
97  CID_Face face = (CID_Face)size->root.face;
98  PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
99  FT_Module module;
100 
101 
102  module = FT_Get_Module( size->root.face->driver->root.library,
103  "pshinter" );
104  return ( module && pshinter && pshinter->get_globals_funcs )
105  ? pshinter->get_globals_funcs( module )
106  : 0;
107  }
108 
109 
110  FT_LOCAL_DEF( void )
111  cid_size_done( FT_Size cidsize ) /* CID_Size */
112  {
113  CID_Size size = (CID_Size)cidsize;
114 
115 
116  if ( cidsize->internal )
117  {
118  PSH_Globals_Funcs funcs;
119 
120 
121  funcs = cid_size_get_globals_funcs( size );
122  if ( funcs )
123  funcs->destroy( (PSH_Globals)cidsize->internal );
124 
125  cidsize->internal = 0;
126  }
127  }
128 
129 
131  cid_size_init( FT_Size cidsize ) /* CID_Size */
132  {
133  CID_Size size = (CID_Size)cidsize;
135  PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size );
136 
137 
138  if ( funcs )
139  {
140  PSH_Globals globals;
141  CID_Face face = (CID_Face)cidsize->face;
142  CID_FaceDict dict = face->cid.font_dicts + face->root.face_index;
143  PS_Private priv = &dict->private_dict;
144 
145 
146  error = funcs->create( cidsize->face->memory, priv, &globals );
147  if ( !error )
148  cidsize->internal = (FT_Size_Internal)(void*)globals;
149  }
150 
151  return error;
152  }
153 
154 
155  FT_LOCAL( FT_Error )
157  FT_Size_Request req )
158  {
159  PSH_Globals_Funcs funcs;
160 
161 
162  FT_Request_Metrics( size->face, req );
163 
164  funcs = cid_size_get_globals_funcs( (CID_Size)size );
165 
166  if ( funcs )
167  funcs->set_scale( (PSH_Globals)size->internal,
168  size->metrics.x_scale,
169  size->metrics.y_scale,
170  0, 0 );
171 
172  return FT_Err_Ok;
173  }
174 
175 
176  /*************************************************************************/
177  /* */
178  /* FACE FUNCTIONS */
179  /* */
180  /*************************************************************************/
181 
182  /*************************************************************************/
183  /* */
184  /* <Function> */
185  /* cid_face_done */
186  /* */
187  /* <Description> */
188  /* Finalizes a given face object. */
189  /* */
190  /* <Input> */
191  /* face :: A pointer to the face object to destroy. */
192  /* */
193  FT_LOCAL_DEF( void )
194  cid_face_done( FT_Face cidface ) /* CID_Face */
195  {
196  CID_Face face = (CID_Face)cidface;
197  FT_Memory memory;
198  CID_FaceInfo cid;
200 
201 
202  if ( !face )
203  return;
204 
205  cid = &face->cid;
206  info = &cid->font_info;
207  memory = cidface->memory;
208 
209  /* release subrs */
210  if ( face->subrs )
211  {
212  FT_Int n;
213 
214 
215  for ( n = 0; n < cid->num_dicts; n++ )
216  {
217  CID_Subrs subr = face->subrs + n;
218 
219 
220  if ( subr->code )
221  {
222  FT_FREE( subr->code[0] );
223  FT_FREE( subr->code );
224  }
225  }
226 
227  FT_FREE( face->subrs );
228  }
229 
230  /* release FontInfo strings */
231  FT_FREE( info->version );
232  FT_FREE( info->notice );
233  FT_FREE( info->full_name );
234  FT_FREE( info->family_name );
235  FT_FREE( info->weight );
236 
237  /* release font dictionaries */
238  FT_FREE( cid->font_dicts );
239  cid->num_dicts = 0;
240 
241  /* release other strings */
242  FT_FREE( cid->cid_font_name );
243  FT_FREE( cid->registry );
244  FT_FREE( cid->ordering );
245 
246  cidface->family_name = 0;
247  cidface->style_name = 0;
248 
249  FT_FREE( face->binary_data );
250  FT_FREE( face->cid_stream );
251  }
252 
253 
254  /*************************************************************************/
255  /* */
256  /* <Function> */
257  /* cid_face_init */
258  /* */
259  /* <Description> */
260  /* Initializes a given CID face object. */
261  /* */
262  /* <Input> */
263  /* stream :: The source font stream. */
264  /* */
265  /* face_index :: The index of the font face in the resource. */
266  /* */
267  /* num_params :: Number of additional generic parameters. Ignored. */
268  /* */
269  /* params :: Additional generic parameters. Ignored. */
270  /* */
271  /* <InOut> */
272  /* face :: The newly built face object. */
273  /* */
274  /* <Return> */
275  /* FreeType error code. 0 means success. */
276  /* */
279  FT_Face cidface, /* CID_Face */
280  FT_Int face_index,
281  FT_Int num_params,
283  {
284  CID_Face face = (CID_Face)cidface;
285  FT_Error error;
286  PSAux_Service psaux;
287  PSHinter_Service pshinter;
288 
289  FT_UNUSED( num_params );
290  FT_UNUSED( params );
291  FT_UNUSED( stream );
292 
293 
294  cidface->num_faces = 1;
295 
296  psaux = (PSAux_Service)face->psaux;
297  if ( !psaux )
298  {
300  FT_FACE_LIBRARY( face ), "psaux" );
301 
302  if ( !psaux )
303  {
304  FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" ));
305  error = FT_THROW( Missing_Module );
306  goto Exit;
307  }
308 
309  face->psaux = psaux;
310  }
311 
312  pshinter = (PSHinter_Service)face->pshinter;
313  if ( !pshinter )
314  {
316  FT_FACE_LIBRARY( face ), "pshinter" );
317 
318  face->pshinter = pshinter;
319  }
320 
321  FT_TRACE2(( "CID driver\n" ));
322 
323  /* open the tokenizer; this will also check the font format */
324  if ( FT_STREAM_SEEK( 0 ) )
325  goto Exit;
326 
327  error = cid_face_open( face, face_index );
328  if ( error )
329  goto Exit;
330 
331  /* if we just wanted to check the format, leave successfully now */
332  if ( face_index < 0 )
333  goto Exit;
334 
335  /* check the face index */
336  /* XXX: handle CID fonts with more than a single face */
337  if ( face_index != 0 )
338  {
339  FT_ERROR(( "cid_face_init: invalid face index\n" ));
340  error = FT_THROW( Invalid_Argument );
341  goto Exit;
342  }
343 
344  /* now load the font program into the face object */
345 
346  /* initialize the face object fields */
347 
348  /* set up root face fields */
349  {
350  CID_FaceInfo cid = &face->cid;
351  PS_FontInfo info = &cid->font_info;
352 
353 
354  cidface->num_glyphs = cid->cid_count;
355  cidface->num_charmaps = 0;
356 
357  cidface->face_index = face_index;
358  cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
359  FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
360  FT_FACE_FLAG_HINTER; /* has native hinter */
361 
362  if ( info->is_fixed_pitch )
363  cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
364 
365  /* XXX: TODO: add kerning with .afm support */
366 
367  /* get style name -- be careful, some broken fonts only */
368  /* have a /FontName dictionary entry! */
369  cidface->family_name = info->family_name;
370  /* assume "Regular" style if we don't know better */
371  cidface->style_name = (char *)"Regular";
372  if ( cidface->family_name )
373  {
374  char* full = info->full_name;
375  char* family = cidface->family_name;
376 
377 
378  if ( full )
379  {
380  while ( *full )
381  {
382  if ( *full == *family )
383  {
384  family++;
385  full++;
386  }
387  else
388  {
389  if ( *full == ' ' || *full == '-' )
390  full++;
391  else if ( *family == ' ' || *family == '-' )
392  family++;
393  else
394  {
395  if ( !*family )
396  cidface->style_name = full;
397  break;
398  }
399  }
400  }
401  }
402  }
403  else
404  {
405  /* do we have a `/FontName'? */
406  if ( cid->cid_font_name )
407  cidface->family_name = cid->cid_font_name;
408  }
409 
410  /* compute style flags */
411  cidface->style_flags = 0;
412  if ( info->italic_angle )
413  cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
414  if ( info->weight )
415  {
416  if ( !ft_strcmp( info->weight, "Bold" ) ||
417  !ft_strcmp( info->weight, "Black" ) )
418  cidface->style_flags |= FT_STYLE_FLAG_BOLD;
419  }
420 
421  /* no embedded bitmap support */
422  cidface->num_fixed_sizes = 0;
423  cidface->available_sizes = 0;
424 
425  cidface->bbox.xMin = cid->font_bbox.xMin >> 16;
426  cidface->bbox.yMin = cid->font_bbox.yMin >> 16;
427  /* no `U' suffix here to 0xFFFF! */
428  cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
429  cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
430 
431  if ( !cidface->units_per_EM )
432  cidface->units_per_EM = 1000;
433 
434  cidface->ascender = (FT_Short)( cidface->bbox.yMax );
435  cidface->descender = (FT_Short)( cidface->bbox.yMin );
436 
437  cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
438  if ( cidface->height < cidface->ascender - cidface->descender )
439  cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
440 
441  cidface->underline_position = (FT_Short)info->underline_position;
442  cidface->underline_thickness = (FT_Short)info->underline_thickness;
443  }
444 
445  Exit:
446  return error;
447  }
448 
449 
450  /*************************************************************************/
451  /* */
452  /* <Function> */
453  /* cid_driver_init */
454  /* */
455  /* <Description> */
456  /* Initializes a given CID driver object. */
457  /* */
458  /* <Input> */
459  /* driver :: A handle to the target driver object. */
460  /* */
461  /* <Return> */
462  /* FreeType error code. 0 means success. */
463  /* */
466  {
467  FT_UNUSED( driver );
468 
469  return FT_Err_Ok;
470  }
471 
472 
473  /*************************************************************************/
474  /* */
475  /* <Function> */
476  /* cid_driver_done */
477  /* */
478  /* <Description> */
479  /* Finalizes a given CID driver. */
480  /* */
481  /* <Input> */
482  /* driver :: A handle to the target CID driver. */
483  /* */
484  FT_LOCAL_DEF( void )
486  {
487  FT_UNUSED( driver );
488  }
489 
490 
491 /* END */
PSH_Globals_SetScaleFunc set_scale
Definition: pshints.h:62
typedefFT_BEGIN_HEADER struct PSH_GlobalsRec_ * PSH_Globals
Definition: pshints.h:41
FT_Face face
Definition: freetype.h:1404
int FT_Error
Definition: fttypes.h:296
GLuint GLuint stream
CID_FaceDict font_dicts
Definition: t1tables.h:374
FT_String * registry
Definition: t1tables.h:357
struct CID_FaceRec_ * CID_Face
Definition: t1types.h:195
void * psaux
Definition: t1types.h:236
signed int FT_Int
Definition: fttypes.h:216
FT_SizeRec root
Definition: cidobjs.h:95
FT_Long face_index
Definition: freetype.h:922
PSHinter_Interface * PSHinter_Service
Definition: pshints.h:680
#define FT_FACE_FLAG_SCALABLE
Definition: freetype.h:1076
return FT_THROW(Missing_Property)
#define FT_UNUSED(arg)
Definition: ftconfig.h:76
FT_Library library
Definition: ftobjs.h:476
cid_driver_init(FT_Module driver)
Definition: cidobjs.c:465
FT_Int num_dicts
Definition: t1tables.h:373
cid_size_done(FT_Size cidsize)
Definition: cidobjs.c:111
PSH_Globals_NewFunc create
Definition: pshints.h:61
FT_Stream cid_stream
Definition: t1types.h:249
FT_Long italic_angle
Definition: t1tables.h:76
return FT_Err_Ok
Definition: ftbbox.c:645
struct FT_Size_InternalRec_ * FT_Size_Internal
Definition: freetype.h:1309
PSH_Globals_DestroyFunc destroy
Definition: pshints.h:63
GLenum GLuint GLint GLenum face
#define FT_ERROR(varformat)
Definition: ftdebug.h:181
cid_driver_done(FT_Module driver)
Definition: cidobjs.c:485
#define FT_STYLE_FLAG_BOLD
Definition: freetype.h:1297
FT_String * cid_font_name
Definition: t1tables.h:353
FT_BBox font_bbox
Definition: t1tables.h:362
FT_String * notice
Definition: t1tables.h:72
FT_Byte ** code
Definition: t1types.h:131
FT_FaceRec root
Definition: t1types.h:234
#define FT_FREE(ptr)
Definition: ftmemory.h:286
#define FT_LOCAL(x)
Definition: ftconfig.h:235
#define FT_FACE_FLAG_FIXED_WIDTH
Definition: freetype.h:1078
FT_Pos yMax
Definition: ftimage.h:119
cid_face_done(FT_Face cidface)
Definition: cidobjs.c:194
FT_Pos xMin
Definition: ftimage.h:118
FT_ModuleRec root
Definition: ftobjs.h:751
FT_ULong cid_count
Definition: t1tables.h:371
FT_Request_Metrics(FT_Face face, FT_Size_Request req)
Definition: ftobjs.c:2649
FT_Error error
Definition: cffdrivr.c:411
#define FT_FACE_FLAG_HORIZONTAL
Definition: freetype.h:1080
T1_Hints_Funcs(* get_t1_funcs)(FT_Module module)
Definition: pshints.h:675
struct PSAux_ServiceRec_ * PSAux_Service
FT_String * family_name
Definition: t1tables.h:74
cid_face_init(FT_Stream stream, FT_Face cidface, FT_Int face_index, FT_Int num_params, FT_Parameter *params)
Definition: cidobjs.c:278
GLdouble n
#define FT_TRACE2(varformat)
Definition: ftdebug.h:159
FT_Short underline_position
Definition: t1tables.h:78
FT_String * ordering
Definition: t1tables.h:358
PS_FontInfoRec font_info
Definition: t1tables.h:361
cid_face_open(CID_Face face, FT_Int face_index)
Definition: cidload.c:635
CID_Subrs subrs
Definition: t1types.h:242
FT_Pos xMax
Definition: ftimage.h:119
signed short FT_Short
Definition: fttypes.h:194
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
Definition: ftsystem.h:66
#define FT_FACE_FLAG_HINTER
Definition: freetype.h:1087
#define FT_STREAM_SEEK(position)
Definition: ftstream.h:489
CFF_Driver driver
Definition: cffdrivr.c:585
CID_FaceInfoRec cid
Definition: t1types.h:237
if(!abbox) return FT_THROW(Invalid_Argument)
GLenum const GLfloat * params
backing_store_ptr info
Definition: jmemsys.h:181
FT_String * version
Definition: t1tables.h:71
FT_String * full_name
Definition: t1tables.h:73
void * pshinter
Definition: t1types.h:245
FT_UShort underline_thickness
Definition: t1tables.h:79
FT_String * weight
Definition: t1tables.h:75
cid_slot_done(FT_GlyphSlot slot)
Definition: cidobjs.c:50
cid_size_request(FT_Size size, FT_Size_Request req)
Definition: cidobjs.c:156
struct CID_SizeRec_ * CID_Size
Definition: cidobjs.h:56
FT_Get_Module(FT_Library library, const char *module_name)
Definition: ftobjs.c:4309
cid_size_init(FT_Size cidsize)
Definition: cidobjs.c:131
FT_Bool is_fixed_pitch
Definition: t1tables.h:77
FT_Driver driver
Definition: freetype.h:962
FT_Get_Module_Interface(FT_Library library, const char *mod_name)
Definition: ftobjs.c:4337
PSH_Globals_Funcs(* get_globals_funcs)(FT_Module module)
Definition: pshints.h:674
cid_slot_init(FT_GlyphSlot slot)
Definition: cidobjs.c:57
#define FT_STYLE_FLAG_ITALIC
Definition: freetype.h:1296
#define FT_FACE_LIBRARY(x)
Definition: ftobjs.h:562
FT_Pos yMin
Definition: ftimage.h:118
GLsizeiptr size
#define FT_LOCAL_DEF(x)
Definition: ftconfig.h:236
#define ft_strcmp
Definition: ftstdlib.h:85
FT_Byte * binary_data
Definition: t1types.h:248