source: trunk/poppler/freetype-2.1.10/src/truetype/ttobjs.c @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 32.0 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  ttobjs.c                                                               */
4/*                                                                         */
5/*    Objects manager (body).                                              */
6/*                                                                         */
7/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 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_CALC_H
22#include FT_INTERNAL_STREAM_H
23#include FT_TRUETYPE_IDS_H
24#include FT_TRUETYPE_TAGS_H
25#include FT_INTERNAL_SFNT_H
26
27#include "ttgload.h"
28#include "ttpload.h"
29
30#include "tterrors.h"
31
32#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
33#include "ttinterp.h"
34#endif
35
36#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
37#include FT_TRUETYPE_UNPATENTED_H
38#endif
39
40#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
41#include "ttgxvar.h"
42#endif
43
44  /*************************************************************************/
45  /*                                                                       */
46  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
47  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
48  /* messages during execution.                                            */
49  /*                                                                       */
50#undef  FT_COMPONENT
51#define FT_COMPONENT  trace_ttobjs
52
53
54#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
55
56  /*************************************************************************/
57  /*                                                                       */
58  /*                       GLYPH ZONE FUNCTIONS                            */
59  /*                                                                       */
60  /*************************************************************************/
61
62
63  /*************************************************************************/
64  /*                                                                       */
65  /* <Function>                                                            */
66  /*    tt_glyphzone_done                                                  */
67  /*                                                                       */
68  /* <Description>                                                         */
69  /*    Deallocates a glyph zone.                                          */
70  /*                                                                       */
71  /* <Input>                                                               */
72  /*    zone :: A pointer to the target glyph zone.                        */
73  /*                                                                       */
74  FT_LOCAL_DEF( void )
75  tt_glyphzone_done( TT_GlyphZone  zone )
76  {
77    FT_Memory  memory = zone->memory;
78
79
80    if ( memory )
81    {
82      FT_FREE( zone->contours );
83      FT_FREE( zone->tags );
84      FT_FREE( zone->cur );
85      FT_FREE( zone->org );
86
87      zone->max_points   = zone->n_points   = 0;
88      zone->max_contours = zone->n_contours = 0;
89      zone->memory       = NULL;
90    }
91  }
92
93
94  /*************************************************************************/
95  /*                                                                       */
96  /* <Function>                                                            */
97  /*    tt_glyphzone_new                                                   */
98  /*                                                                       */
99  /* <Description>                                                         */
100  /*    Allocates a new glyph zone.                                        */
101  /*                                                                       */
102  /* <Input>                                                               */
103  /*    memory      :: A handle to the current memory object.              */
104  /*                                                                       */
105  /*    maxPoints   :: The capacity of glyph zone in points.               */
106  /*                                                                       */
107  /*    maxContours :: The capacity of glyph zone in contours.             */
108  /*                                                                       */
109  /* <Output>                                                              */
110  /*    zone        :: A pointer to the target glyph zone record.          */
111  /*                                                                       */
112  /* <Return>                                                              */
113  /*    FreeType error code.  0 means success.                             */
114  /*                                                                       */
115  FT_LOCAL_DEF( FT_Error )
116  tt_glyphzone_new( FT_Memory     memory,
117                    FT_UShort     maxPoints,
118                    FT_Short      maxContours,
119                    TT_GlyphZone  zone )
120  {
121    FT_Error  error;
122
123
124    if ( maxPoints > 0 )
125      maxPoints += 2;
126
127    FT_MEM_ZERO( zone, sizeof ( *zone ) );
128    zone->memory = memory;
129
130    if ( FT_NEW_ARRAY( zone->org,      maxPoints * 2 ) ||
131         FT_NEW_ARRAY( zone->cur,      maxPoints * 2 ) ||
132         FT_NEW_ARRAY( zone->tags,     maxPoints     ) ||
133         FT_NEW_ARRAY( zone->contours, maxContours   ) )
134    {
135      tt_glyphzone_done( zone );
136    }
137
138    return error;
139  }
140#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
141
142
143  /*************************************************************************/
144  /*                                                                       */
145  /* <Function>                                                            */
146  /*    tt_face_init                                                       */
147  /*                                                                       */
148  /* <Description>                                                         */
149  /*    Initializes a given TrueType face object.                          */
150  /*                                                                       */
151  /* <Input>                                                               */
152  /*    stream     :: The source font stream.                              */
153  /*                                                                       */
154  /*    face_index :: The index of the font face in the resource.          */
155  /*                                                                       */
156  /*    num_params :: Number of additional generic parameters.  Ignored.   */
157  /*                                                                       */
158  /*    params     :: Additional generic parameters.  Ignored.             */
159  /*                                                                       */
160  /* <InOut>                                                               */
161  /*    face       :: The newly built face object.                         */
162  /*                                                                       */
163  /* <Return>                                                              */
164  /*    FreeType error code.  0 means success.                             */
165  /*                                                                       */
166  FT_LOCAL_DEF( FT_Error )
167  tt_face_init( FT_Stream      stream,
168                FT_Face        ttface,      /* TT_Face */
169                FT_Int         face_index,
170                FT_Int         num_params,
171                FT_Parameter*  params )
172  {
173    FT_Error      error;
174    FT_Library    library;
175    SFNT_Service  sfnt;
176    TT_Face       face = (TT_Face)ttface;
177
178
179    library = face->root.driver->root.library;
180    sfnt    = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
181    if ( !sfnt )
182      goto Bad_Format;
183
184    /* create input stream from resource */
185    if ( FT_STREAM_SEEK( 0 ) )
186      goto Exit;
187
188    /* check that we have a valid TrueType file */
189    error = sfnt->init_face( stream, face, face_index, num_params, params );
190    if ( error )
191      goto Exit;
192
193    /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
194    /* The 0x00020000 tag is completely undocumented; some fonts from   */
195    /* Arphic made for Chinese Windows 3.1 have this.                   */
196    if ( face->format_tag != 0x00010000L &&    /* MS fonts  */
197         face->format_tag != 0x00020000L &&    /* CJK fonts for Win 3.1 */
198         face->format_tag != TTAG_true   )     /* Mac fonts */
199    {
200      FT_TRACE2(( "[not a valid TTF font]\n" ));
201      goto Bad_Format;
202    }
203
204    /* If we are performing a simple font format check, exit immediately */
205    if ( face_index < 0 )
206      return TT_Err_Ok;
207
208    /* Load font directory */
209    error = sfnt->load_face( stream, face, face_index, num_params, params );
210    if ( error )
211      goto Exit;
212
213    if ( face->root.face_flags & FT_FACE_FLAG_SCALABLE )
214    {
215
216#ifdef FT_CONFIG_OPTION_INCREMENTAL
217
218      if ( !face->root.internal->incremental_interface )
219        error = tt_face_load_loca( face, stream );
220      if ( !error )
221      {
222        error = tt_face_load_cvt( face, stream );
223        if ( !error )
224          error = tt_face_load_fpgm( face, stream );
225      }
226
227#else
228
229      if ( !error )
230        error = tt_face_load_loca( face, stream ) ||
231                tt_face_load_cvt( face, stream )  ||
232                tt_face_load_fpgm( face, stream );
233
234#endif
235
236    }
237
238#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
239
240    /* Determine whether unpatented hinting is to be used for this face. */
241    face->unpatented_hinting = FT_BOOL
242       ( library->debug_hooks[ FT_DEBUG_HOOK_UNPATENTED_HINTING ] != NULL );
243
244    {
245      int  i;
246
247
248      for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )
249        if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )
250          face->unpatented_hinting = TRUE;
251    }
252
253#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
254
255    /* initialize standard glyph loading routines */
256    TT_Init_Glyph_Loading( face );
257
258  Exit:
259    return error;
260
261  Bad_Format:
262    error = TT_Err_Unknown_File_Format;
263    goto Exit;
264  }
265
266
267  /*************************************************************************/
268  /*                                                                       */
269  /* <Function>                                                            */
270  /*    tt_face_done                                                       */
271  /*                                                                       */
272  /* <Description>                                                         */
273  /*    Finalizes a given face object.                                     */
274  /*                                                                       */
275  /* <Input>                                                               */
276  /*    face :: A pointer to the face object to destroy.                   */
277  /*                                                                       */
278  FT_LOCAL_DEF( void )
279  tt_face_done( FT_Face  ttface )           /* TT_Face */
280  {
281    TT_Face       face   = (TT_Face)ttface;
282    FT_Memory     memory = face->root.memory;
283    FT_Stream     stream = face->root.stream;
284
285    SFNT_Service  sfnt   = (SFNT_Service)face->sfnt;
286
287
288    /* for `extended TrueType formats' (i.e. compressed versions) */
289    if ( face->extra.finalizer )
290      face->extra.finalizer( face->extra.data );
291
292    if ( sfnt )
293      sfnt->done_face( face );
294
295    /* freeing the locations table */
296    tt_face_done_loca( face );
297
298    /* freeing the CVT */
299    FT_FREE( face->cvt );
300    face->cvt_size = 0;
301
302    /* freeing the programs */
303    FT_FRAME_RELEASE( face->font_program );
304    FT_FRAME_RELEASE( face->cvt_program );
305    face->font_program_size = 0;
306    face->cvt_program_size  = 0;
307
308#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
309    tt_done_blend( memory, face->blend );
310    face->blend = NULL;
311#endif
312  }
313
314
315  /*************************************************************************/
316  /*                                                                       */
317  /*                           SIZE  FUNCTIONS                             */
318  /*                                                                       */
319  /*************************************************************************/
320
321
322  /*************************************************************************/
323  /*                                                                       */
324  /* <Function>                                                            */
325  /*    tt_size_init                                                       */
326  /*                                                                       */
327  /* <Description>                                                         */
328  /*    Initializes a new TrueType size object.                            */
329  /*                                                                       */
330  /* <InOut>                                                               */
331  /*    size :: A handle to the size object.                               */
332  /*                                                                       */
333  /* <Return>                                                              */
334  /*    FreeType error code.  0 means success.                             */
335  /*                                                                       */
336  FT_LOCAL_DEF( FT_Error )
337  tt_size_init( FT_Size  ttsize )           /* TT_Size */
338  {
339    TT_Size   size  = (TT_Size)ttsize;
340    FT_Error  error = TT_Err_Ok;
341
342
343#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
344
345    TT_Face    face   = (TT_Face)size->root.face;
346    FT_Memory  memory = face->root.memory;
347    FT_Int     i;
348
349    TT_ExecContext  exec;
350    FT_UShort       n_twilight;
351    TT_MaxProfile*  maxp = &face->max_profile;
352
353
354    size->ttmetrics.valid = FALSE;
355
356    size->max_function_defs    = maxp->maxFunctionDefs;
357    size->max_instruction_defs = maxp->maxInstructionDefs;
358
359    size->num_function_defs    = 0;
360    size->num_instruction_defs = 0;
361
362    size->max_func = 0;
363    size->max_ins  = 0;
364
365    size->cvt_size     = face->cvt_size;
366    size->storage_size = maxp->maxStorage;
367
368    /* Set default metrics */
369    {
370      FT_Size_Metrics*  metrics  = &size->root.metrics;
371      TT_Size_Metrics*  metrics2 = &size->ttmetrics;
372
373
374      metrics->x_ppem = 0;
375      metrics->y_ppem = 0;
376
377      metrics2->rotated   = FALSE;
378      metrics2->stretched = FALSE;
379
380      /* set default compensation (all 0) */
381      for ( i = 0; i < 4; i++ )
382        metrics2->compensations[i] = 0;
383    }
384
385    /* allocate function defs, instruction defs, cvt, and storage area */
386    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||
387         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
388         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
389         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
390
391      goto Fail_Memory;
392
393    /* reserve twilight zone */
394    n_twilight = maxp->maxTwilightPoints;
395    error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
396    if ( error )
397      goto Fail_Memory;
398
399    size->twilight.n_points = n_twilight;
400
401    /* set `face->interpreter' according to the debug hook present */
402    {
403      FT_Library  library = face->root.driver->root.library;
404
405
406      face->interpreter = (TT_Interpreter)
407                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
408      if ( !face->interpreter )
409        face->interpreter = (TT_Interpreter)TT_RunIns;
410    }
411
412    /* Fine, now execute the font program! */
413    exec = size->context;
414    /* size objects used during debugging have their own context */
415    if ( !size->debug )
416      exec = TT_New_Context( face );
417
418    if ( !exec )
419    {
420      error = TT_Err_Could_Not_Find_Context;
421      goto Fail_Memory;
422    }
423
424    size->GS = tt_default_graphics_state;
425    TT_Load_Context( exec, face, size );
426
427    exec->callTop   = 0;
428    exec->top       = 0;
429
430    exec->period    = 64;
431    exec->phase     = 0;
432    exec->threshold = 0;
433
434    {
435      FT_Size_Metrics*  metrics    = &exec->metrics;
436      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
437
438
439      metrics->x_ppem   = 0;
440      metrics->y_ppem   = 0;
441      metrics->x_scale  = 0;
442      metrics->y_scale  = 0;
443
444      tt_metrics->ppem  = 0;
445      tt_metrics->scale = 0;
446      tt_metrics->ratio = 0x10000L;
447    }
448
449    exec->instruction_trap = FALSE;
450
451    exec->cvtSize = size->cvt_size;
452    exec->cvt     = size->cvt;
453
454    exec->F_dot_P = 0x10000L;
455
456    /* allow font program execution */
457    TT_Set_CodeRange( exec,
458                      tt_coderange_font,
459                      face->font_program,
460                      face->font_program_size );
461
462    /* disable CVT and glyph programs coderange */
463    TT_Clear_CodeRange( exec, tt_coderange_cvt );
464    TT_Clear_CodeRange( exec, tt_coderange_glyph );
465
466    if ( face->font_program_size > 0 )
467    {
468      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
469      if ( !error )
470        error = face->interpreter( exec );
471
472      if ( error )
473        goto Fail_Exec;
474    }
475    else
476      error = TT_Err_Ok;
477
478    TT_Save_Context( exec, size );
479
480    if ( !size->debug )
481      TT_Done_Context( exec );
482
483#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
484
485    size->ttmetrics.valid = FALSE;
486    return error;
487
488#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
489
490  Fail_Exec:
491    if ( !size->debug )
492      TT_Done_Context( exec );
493
494  Fail_Memory:
495
496    tt_size_done( ttsize );
497    return error;
498
499#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
500
501  }
502
503
504  /*************************************************************************/
505  /*                                                                       */
506  /* <Function>                                                            */
507  /*    tt_size_done                                                       */
508  /*                                                                       */
509  /* <Description>                                                         */
510  /*    The TrueType size object finalizer.                                */
511  /*                                                                       */
512  /* <Input>                                                               */
513  /*    size :: A handle to the target size object.                        */
514  /*                                                                       */
515  FT_LOCAL_DEF( void )
516  tt_size_done( FT_Size  ttsize )           /* TT_Size */
517  {
518    TT_Size    size = (TT_Size)ttsize;
519
520#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
521
522    FT_Memory  memory = size->root.face->memory;
523
524
525    if ( size->debug )
526    {
527      /* the debug context must be deleted by the debugger itself */
528      size->context = NULL;
529      size->debug   = FALSE;
530    }
531
532    FT_FREE( size->cvt );
533    size->cvt_size = 0;
534
535    /* free storage area */
536    FT_FREE( size->storage );
537    size->storage_size = 0;
538
539    /* twilight zone */
540    tt_glyphzone_done( &size->twilight );
541
542    FT_FREE( size->function_defs );
543    FT_FREE( size->instruction_defs );
544
545    size->num_function_defs    = 0;
546    size->max_function_defs    = 0;
547    size->num_instruction_defs = 0;
548    size->max_instruction_defs = 0;
549
550    size->max_func = 0;
551    size->max_ins  = 0;
552
553#endif
554
555    size->ttmetrics.valid = FALSE;
556  }
557
558
559  /*************************************************************************/
560  /*                                                                       */
561  /* <Function>                                                            */
562  /*    Reset_Outline_Size                                                 */
563  /*                                                                       */
564  /* <Description>                                                         */
565  /*    Resets a TrueType outline size when resolutions and character      */
566  /*    dimensions have been changed.                                      */
567  /*                                                                       */
568  /* <Input>                                                               */
569  /*    size :: A handle to the target size object.                        */
570  /*                                                                       */
571  static FT_Error
572  Reset_Outline_Size( TT_Size  size )
573  {
574    TT_Face           face;
575    FT_Error          error = TT_Err_Ok;
576
577    FT_Size_Metrics*  metrics;
578
579
580    if ( size->ttmetrics.valid )
581      return TT_Err_Ok;
582
583    face = (TT_Face)size->root.face;
584
585    metrics = &size->metrics;
586
587    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
588      return TT_Err_Invalid_PPem;
589
590    /* compute new transformation */
591    if ( metrics->x_ppem >= metrics->y_ppem )
592    {
593      size->ttmetrics.scale   = metrics->x_scale;
594      size->ttmetrics.ppem    = metrics->x_ppem;
595      size->ttmetrics.x_ratio = 0x10000L;
596      size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem,
597                                           0x10000L,
598                                           metrics->x_ppem );
599    }
600    else
601    {
602      size->ttmetrics.scale   = metrics->y_scale;
603      size->ttmetrics.ppem    = metrics->y_ppem;
604      size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem,
605                                           0x10000L,
606                                           metrics->y_ppem );
607      size->ttmetrics.y_ratio = 0x10000L;
608    }
609
610    /* Compute root ascender, descender, text height, and max_advance */
611    metrics->ascender =
612      FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );
613    metrics->descender =
614      FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );
615    metrics->height =
616      FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );
617    metrics->max_advance =
618      FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
619                               metrics->x_scale ) );
620
621
622#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
623    /* set to `invalid' by default */
624    size->strike_index = 0xFFFFU;
625#endif
626
627#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
628
629    {
630      TT_ExecContext  exec;
631      FT_UInt         i, j;
632
633
634      /* Scale the cvt values to the new ppem.          */
635      /* We use by default the y ppem to scale the CVT. */
636      for ( i = 0; i < size->cvt_size; i++ )
637        size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
638
639      /* All twilight points are originally zero */
640      for ( j = 0; j < (FT_UInt)size->twilight.n_points; j++ )
641      {
642        size->twilight.org[j].x = 0;
643        size->twilight.org[j].y = 0;
644        size->twilight.cur[j].x = 0;
645        size->twilight.cur[j].y = 0;
646      }
647
648      /* clear storage area */
649      for ( i = 0; i < (FT_UInt)size->storage_size; i++ )
650        size->storage[i] = 0;
651
652      size->GS = tt_default_graphics_state;
653
654      /* get execution context and run prep program */
655      if ( size->debug )
656        exec = size->context;
657      else
658        exec = TT_New_Context( face );
659      /* debugging instances have their own context */
660
661      if ( !exec )
662        return TT_Err_Could_Not_Find_Context;
663
664      TT_Load_Context( exec, face, size );
665
666      TT_Set_CodeRange( exec,
667                        tt_coderange_cvt,
668                        face->cvt_program,
669                        face->cvt_program_size );
670
671      TT_Clear_CodeRange( exec, tt_coderange_glyph );
672
673      exec->instruction_trap = FALSE;
674
675      exec->top     = 0;
676      exec->callTop = 0;
677
678      if ( face->cvt_program_size > 0 )
679      {
680        error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
681        if ( error )
682          goto End;
683
684        if ( !size->debug )
685          error = face->interpreter( exec );
686      }
687      else
688        error = TT_Err_Ok;
689
690      size->GS = exec->GS;
691      /* save default graphics state */
692
693    End:
694      TT_Save_Context( exec, size );
695
696      if ( !size->debug )
697        TT_Done_Context( exec );
698      /* debugging instances keep their context */
699    }
700
701#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
702
703    if ( !error )
704      size->ttmetrics.valid = TRUE;
705
706    return error;
707  }
708
709
710#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
711
712  /*************************************************************************/
713  /*                                                                       */
714  /* <Function>                                                            */
715  /*    Reset_SBit_Size                                                    */
716  /*                                                                       */
717  /* <Description>                                                         */
718  /*    Resets a TrueType sbit size when resolutions and character         */
719  /*    dimensions have been changed.                                      */
720  /*                                                                       */
721  /* <Input>                                                               */
722  /*    size :: A handle to the target size object.                        */
723  /*                                                                       */
724  static FT_Error
725  Reset_SBit_Size( TT_Size  size )
726  {
727    TT_Face           face;
728    FT_Error          error = TT_Err_Ok;
729
730    FT_ULong          strike_index;
731    FT_Size_Metrics*  metrics;
732    FT_Size_Metrics*  sbit_metrics;
733    SFNT_Service      sfnt;
734
735
736    metrics = &size->metrics;
737
738    if ( size->strike_index != 0xFFFFU )
739      return TT_Err_Ok;
740
741    face = (TT_Face)size->root.face;
742    sfnt = (SFNT_Service)face->sfnt;
743
744    sbit_metrics = &size->strike_metrics;
745
746    error = sfnt->set_sbit_strike( face,
747                                   metrics->x_ppem, metrics->y_ppem,
748                                   &strike_index );
749
750    if ( !error )
751    {
752      /* XXX: TODO: move this code to the SFNT module where it belongs */
753
754#ifdef FT_OPTIMIZE_MEMORY
755      FT_Byte*    strike = face->sbit_table + 8 + strike_index*48;
756
757      sbit_metrics->ascender  = (FT_Char)strike[16] << 6;  /* hori.ascender  */
758      sbit_metrics->descender = (FT_Char)strike[17] << 6;  /* hori.descender */
759
760      /* XXX: Is this correct? */
761      sbit_metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */
762                                             strike[18] + /* max_width      */
763                                    (FT_Char)strike[23]   /* min_advance_SB */
764                                                        ) << 6;
765
766#else /* !FT_OPTIMIZE_MEMORY */
767
768      TT_SBit_Strike  strike = face->sbit_strikes + strike_index;
769
770
771      sbit_metrics->ascender  = strike->hori.ascender << 6;
772      sbit_metrics->descender = strike->hori.descender << 6;
773
774      /* XXX: Is this correct? */
775      sbit_metrics->max_advance = ( strike->hori.min_origin_SB  +
776                                    strike->hori.max_width      +
777                                    strike->hori.min_advance_SB ) << 6;
778
779#endif /* !FT_OPTIMIZE_MEMORY */
780
781      /* XXX: Is this correct? */
782      sbit_metrics->height = sbit_metrics->ascender -
783                             sbit_metrics->descender;
784
785      sbit_metrics->x_ppem = metrics->x_ppem;
786      sbit_metrics->y_ppem = metrics->y_ppem;
787      size->strike_index   = (FT_UInt)strike_index;
788    }
789    else
790    {
791      size->strike_index = 0xFFFFU;
792
793      sbit_metrics->x_ppem      = 0;
794      sbit_metrics->y_ppem      = 0;
795      sbit_metrics->ascender    = 0;
796      sbit_metrics->descender   = 0;
797      sbit_metrics->height      = 0;
798      sbit_metrics->max_advance = 0;
799    }
800
801    return error;
802  }
803
804#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
805
806
807  /*************************************************************************/
808  /*                                                                       */
809  /* <Function>                                                            */
810  /*    tt_size_reset                                                      */
811  /*                                                                       */
812  /* <Description>                                                         */
813  /*    Resets a TrueType size when resolutions and character dimensions   */
814  /*    have been changed.                                                 */
815  /*                                                                       */
816  /* <Input>                                                               */
817  /*    size :: A handle to the target size object.                        */
818  /*                                                                       */
819  FT_LOCAL_DEF( FT_Error )
820  tt_size_reset( TT_Size  size )
821  {
822    FT_Face   face;
823    FT_Error  error = TT_Err_Ok;
824
825
826    face = size->root.face;
827
828    if ( face->face_flags & FT_FACE_FLAG_SCALABLE )
829    {
830      if ( !size->ttmetrics.valid )
831        error = Reset_Outline_Size( size );
832
833      if ( error )
834        return error;
835    }
836
837#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
838
839    if ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
840    {
841      if ( size->strike_index == 0xFFFFU )
842        error = Reset_SBit_Size( size );
843
844      if ( !error && !( face->face_flags & FT_FACE_FLAG_SCALABLE ) )
845        size->root.metrics = size->strike_metrics;
846    }
847
848#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
849
850    if ( face->face_flags & FT_FACE_FLAG_SCALABLE )
851      return TT_Err_Ok;
852    else
853      return error;
854  }
855
856
857  /*************************************************************************/
858  /*                                                                       */
859  /* <Function>                                                            */
860  /*    tt_driver_init                                                     */
861  /*                                                                       */
862  /* <Description>                                                         */
863  /*    Initializes a given TrueType driver object.                        */
864  /*                                                                       */
865  /* <Input>                                                               */
866  /*    driver :: A handle to the target driver object.                    */
867  /*                                                                       */
868  /* <Return>                                                              */
869  /*    FreeType error code.  0 means success.                             */
870  /*                                                                       */
871  FT_LOCAL_DEF( FT_Error )
872  tt_driver_init( FT_Module  driver )       /* TT_Driver */
873  {
874    FT_Error  error;
875
876
877    /* set `extra' in glyph loader */
878    error = FT_GlyphLoader_CreateExtra( FT_DRIVER( driver )->glyph_loader );
879
880    return error;
881  }
882
883
884  /*************************************************************************/
885  /*                                                                       */
886  /* <Function>                                                            */
887  /*    tt_driver_done                                                     */
888  /*                                                                       */
889  /* <Description>                                                         */
890  /*    Finalizes a given TrueType driver.                                 */
891  /*                                                                       */
892  /* <Input>                                                               */
893  /*    driver :: A handle to the target TrueType driver.                  */
894  /*                                                                       */
895  FT_LOCAL_DEF( void )
896  tt_driver_done( FT_Module  ttdriver )     /* TT_Driver */
897  {
898#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
899    TT_Driver  driver = (TT_Driver)ttdriver;
900
901
902    /* destroy the execution context */
903    if ( driver->context )
904    {
905      TT_Destroy_Context( driver->context, driver->root.root.memory );
906      driver->context = NULL;
907    }
908#else
909    FT_UNUSED( ttdriver );
910#endif
911
912  }
913
914
915/* END */
Note: See TracBrowser for help on using the repository browser.