source: trunk/poppler/freetype2/src/truetype/ttdriver.c @ 182

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

freetype update to version 2.3.0

File size: 15.7 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  ttdriver.c                                                             */
4/*                                                                         */
5/*    TrueType font driver implementation (body).                          */
6/*                                                                         */
7/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 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#include FT_INTERNAL_SFNT_H
23#include FT_TRUETYPE_IDS_H
24#include FT_SERVICE_XFREE86_NAME_H
25
26#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
27#include FT_MULTIPLE_MASTERS_H
28#include FT_SERVICE_MULTIPLE_MASTERS_H
29#endif
30
31#include FT_SERVICE_TRUETYPE_ENGINE_H
32
33#include "ttdriver.h"
34#include "ttgload.h"
35
36#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
37#include "ttgxvar.h"
38#endif
39
40#include "tterrors.h"
41
42
43  /*************************************************************************/
44  /*                                                                       */
45  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
46  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
47  /* messages during execution.                                            */
48  /*                                                                       */
49#undef  FT_COMPONENT
50#define FT_COMPONENT  trace_ttdriver
51
52
53  /*************************************************************************/
54  /*************************************************************************/
55  /*************************************************************************/
56  /****                                                                 ****/
57  /****                                                                 ****/
58  /****                          F A C E S                              ****/
59  /****                                                                 ****/
60  /****                                                                 ****/
61  /*************************************************************************/
62  /*************************************************************************/
63  /*************************************************************************/
64
65
66#undef  PAIR_TAG
67#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
68                                     (FT_ULong)right        )
69
70
71  /*************************************************************************/
72  /*                                                                       */
73  /* <Function>                                                            */
74  /*    tt_get_kerning                                                     */
75  /*                                                                       */
76  /* <Description>                                                         */
77  /*    A driver method used to return the kerning vector between two      */
78  /*    glyphs of the same face.                                           */
79  /*                                                                       */
80  /* <Input>                                                               */
81  /*    face        :: A handle to the source face object.                 */
82  /*                                                                       */
83  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
84  /*                                                                       */
85  /*    right_glyph :: The index of the right glyph in the kern pair.      */
86  /*                                                                       */
87  /* <Output>                                                              */
88  /*    kerning     :: The kerning vector.  This is in font units for      */
89  /*                   scalable formats, and in pixels for fixed-sizes     */
90  /*                   formats.                                            */
91  /*                                                                       */
92  /* <Return>                                                              */
93  /*    FreeType error code.  0 means success.                             */
94  /*                                                                       */
95  /* <Note>                                                                */
96  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
97  /*    supported by this function.  Other layouts, or more sophisticated  */
98  /*    kernings, are out of scope of this method (the basic driver        */
99  /*    interface is meant to be simple).                                  */
100  /*                                                                       */
101  /*    They can be implemented by format-specific interfaces.             */
102  /*                                                                       */
103  static FT_Error
104  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
105                  FT_UInt     left_glyph,
106                  FT_UInt     right_glyph,
107                  FT_Vector*  kerning )
108  {
109    TT_Face       face = (TT_Face)ttface;
110    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
111
112
113    kerning->x = 0;
114    kerning->y = 0;
115
116    if ( sfnt )
117      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
118
119    return 0;
120  }
121
122
123#undef PAIR_TAG
124
125
126  /*************************************************************************/
127  /*************************************************************************/
128  /*************************************************************************/
129  /****                                                                 ****/
130  /****                                                                 ****/
131  /****                           S I Z E S                             ****/
132  /****                                                                 ****/
133  /****                                                                 ****/
134  /*************************************************************************/
135  /*************************************************************************/
136  /*************************************************************************/
137
138
139#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
140
141  static FT_Error
142  tt_size_select( FT_Size   size,
143                  FT_ULong  strike_index )
144  {
145    TT_Face   ttface = (TT_Face)size->face;
146    TT_Size   ttsize = (TT_Size)size;
147    FT_Error  error  = TT_Err_Ok;
148
149
150    ttsize->strike_index = strike_index;
151
152    if ( FT_IS_SCALABLE( size->face ) )
153    {
154      /* use the scaled metrics, even when tt_size_reset fails */
155      FT_Select_Metrics( size->face, strike_index );
156
157      tt_size_reset( ttsize );
158    }
159    else
160    {
161      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;
162      FT_Size_Metrics*  metrics = &size->metrics;
163
164
165      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
166      if ( error )
167        ttsize->strike_index = 0xFFFFFFFFUL;
168    }
169
170    return error;
171  }
172
173#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
174
175
176  static FT_Error
177  tt_size_request( FT_Size          size,
178                   FT_Size_Request  req )
179  {
180    TT_Size   ttsize = (TT_Size)size;
181    FT_Error  error  = TT_Err_Ok;
182
183
184#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
185
186    if ( FT_HAS_FIXED_SIZES( size->face ) )
187    {
188      TT_Face       ttface = (TT_Face)size->face;
189      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;
190      FT_ULong      strike_index;
191
192
193      error = sfnt->set_sbit_strike( ttface, req, &strike_index );
194
195      if ( error )
196        ttsize->strike_index = 0xFFFFFFFFUL;
197      else
198        return tt_size_select( size, strike_index );
199    }
200
201#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
202
203    FT_Request_Metrics( size->face, req );
204
205    if ( FT_IS_SCALABLE( size->face ) )
206      error = tt_size_reset( ttsize );
207
208    return error;
209  }
210
211
212  /*************************************************************************/
213  /*                                                                       */
214  /* <Function>                                                            */
215  /*    Load_Glyph                                                         */
216  /*                                                                       */
217  /* <Description>                                                         */
218  /*    A driver method used to load a glyph within a given glyph slot.    */
219  /*                                                                       */
220  /* <Input>                                                               */
221  /*    slot        :: A handle to the target slot object where the glyph  */
222  /*                   will be loaded.                                     */
223  /*                                                                       */
224  /*    size        :: A handle to the source face size at which the glyph */
225  /*                   must be scaled, loaded, etc.                        */
226  /*                                                                       */
227  /*    glyph_index :: The index of the glyph in the font file.            */
228  /*                                                                       */
229  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
230  /*                   FTLOAD_??? constants can be used to control the     */
231  /*                   glyph loading process (e.g., whether the outline    */
232  /*                   should be scaled, whether to load bitmaps or not,   */
233  /*                   whether to hint the outline, etc).                  */
234  /*                                                                       */
235  /* <Return>                                                              */
236  /*    FreeType error code.  0 means success.                             */
237  /*                                                                       */
238  static FT_Error
239  Load_Glyph( FT_GlyphSlot  ttslot,         /* TT_GlyphSlot */
240              FT_Size       ttsize,         /* TT_Size      */
241              FT_UInt       glyph_index,
242              FT_Int32      load_flags )
243  {
244    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
245    TT_Size       size = (TT_Size)ttsize;
246    FT_Face       face = ttslot->face;
247    FT_Error      error;
248
249
250    if ( !slot )
251      return TT_Err_Invalid_Slot_Handle;
252
253    if ( !size )
254      return TT_Err_Invalid_Size_Handle;
255
256    if ( !face || glyph_index >= (FT_UInt)face->num_glyphs )
257      return TT_Err_Invalid_Argument;
258
259    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
260    {
261      load_flags |= FT_LOAD_NO_HINTING |
262                    FT_LOAD_NO_BITMAP  |
263                    FT_LOAD_NO_SCALE;
264    }
265
266    /* now load the glyph outline if necessary */
267    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
268
269    /* force drop-out mode to 2 - irrelevant now */
270    /* slot->outline.dropout_mode = 2; */
271
272    return error;
273  }
274
275
276  /*************************************************************************/
277  /*************************************************************************/
278  /*************************************************************************/
279  /****                                                                 ****/
280  /****                                                                 ****/
281  /****                D R I V E R  I N T E R F A C E                   ****/
282  /****                                                                 ****/
283  /****                                                                 ****/
284  /*************************************************************************/
285  /*************************************************************************/
286  /*************************************************************************/
287
288#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
289  static const FT_Service_MultiMastersRec  tt_service_gx_multi_masters =
290  {
291    (FT_Get_MM_Func)        NULL,
292    (FT_Set_MM_Design_Func) NULL,
293    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,
294    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,
295    (FT_Set_Var_Design_Func)TT_Set_Var_Design
296  };
297#endif
298
299  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =
300  {
301#ifdef TT_USE_BYTECODE_INTERPRETER
302
303#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
304    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
305#else
306    FT_TRUETYPE_ENGINE_TYPE_PATENTED
307#endif
308
309#else /* !TT_USE_BYTECODE_INTERPRETER */
310
311    FT_TRUETYPE_ENGINE_TYPE_NONE
312
313#endif /* TT_USE_BYTECODE_INTERPRETER */
314  };
315
316  static const FT_ServiceDescRec  tt_services[] =
317  {
318    { FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE },
319#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
320    { FT_SERVICE_ID_MULTI_MASTERS,   &tt_service_gx_multi_masters },
321#endif
322    { FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine },
323    { NULL, NULL }
324  };
325
326
327  FT_CALLBACK_DEF( FT_Module_Interface )
328  tt_get_interface( FT_Module    driver,    /* TT_Driver */
329                    const char*  tt_interface )
330  {
331    FT_Module_Interface  result;
332    FT_Module            sfntd;
333    SFNT_Service         sfnt;
334
335
336    result = ft_service_list_lookup( tt_services, tt_interface );
337    if ( result != NULL )
338      return result;
339
340    /* only return the default interface from the SFNT module */
341    sfntd = FT_Get_Module( driver->library, "sfnt" );
342    if ( sfntd )
343    {
344      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
345      if ( sfnt )
346        return sfnt->get_interface( driver, tt_interface );
347    }
348
349    return 0;
350  }
351
352
353  /* The FT_DriverInterface structure is defined in ftdriver.h. */
354
355  FT_CALLBACK_TABLE_DEF
356  const FT_Driver_ClassRec  tt_driver_class =
357  {
358    {
359      FT_MODULE_FONT_DRIVER        |
360      FT_MODULE_DRIVER_SCALABLE    |
361#ifdef TT_USE_BYTECODE_INTERPRETER
362      FT_MODULE_DRIVER_HAS_HINTER,
363#else
364      0,
365#endif
366
367      sizeof ( TT_DriverRec ),
368
369      "truetype",      /* driver name                           */
370      0x10000L,        /* driver version == 1.0                 */
371      0x20000L,        /* driver requires FreeType 2.0 or above */
372
373      (void*)0,        /* driver specific interface */
374
375      tt_driver_init,
376      tt_driver_done,
377      tt_get_interface,
378    },
379
380    sizeof ( TT_FaceRec ),
381    sizeof ( TT_SizeRec ),
382    sizeof ( FT_GlyphSlotRec ),
383
384    tt_face_init,
385    tt_face_done,
386    tt_size_init,
387    tt_size_done,
388    tt_slot_init,
389    0,                      /* FT_Slot_DoneFunc */
390
391#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
392    ft_stub_set_char_sizes,
393    ft_stub_set_pixel_sizes,
394#endif
395    Load_Glyph,
396
397    tt_get_kerning,
398    0,                      /* FT_Face_AttachFunc      */
399    0,                      /* FT_Face_GetAdvancesFunc */
400
401    tt_size_request,
402#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
403    tt_size_select
404#else
405    0                       /* FT_Size_SelectFunc      */
406#endif
407  };
408
409
410/* END */
Note: See TracBrowser for help on using the repository browser.