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

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

First import

File size: 18.8 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  ttdriver.c                                                             */
4/*                                                                         */
5/*    TrueType font driver implementation (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_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 "ttdriver.h"
32#include "ttgload.h"
33
34#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
35#include "ttgxvar.h"
36#endif
37
38#include "tterrors.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_ttdriver
49
50
51  /*************************************************************************/
52  /*************************************************************************/
53  /*************************************************************************/
54  /****                                                                 ****/
55  /****                                                                 ****/
56  /****                          F A C E S                              ****/
57  /****                                                                 ****/
58  /****                                                                 ****/
59  /*************************************************************************/
60  /*************************************************************************/
61  /*************************************************************************/
62
63
64#undef  PAIR_TAG
65#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
66                                     (FT_ULong)right        )
67
68
69  /*************************************************************************/
70  /*                                                                       */
71  /* <Function>                                                            */
72  /*    tt_get_kerning                                                     */
73  /*                                                                       */
74  /* <Description>                                                         */
75  /*    A driver method used to return the kerning vector between two      */
76  /*    glyphs of the same face.                                           */
77  /*                                                                       */
78  /* <Input>                                                               */
79  /*    face        :: A handle to the source face object.                 */
80  /*                                                                       */
81  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
82  /*                                                                       */
83  /*    right_glyph :: The index of the right glyph in the kern pair.      */
84  /*                                                                       */
85  /* <Output>                                                              */
86  /*    kerning     :: The kerning vector.  This is in font units for      */
87  /*                   scalable formats, and in pixels for fixed-sizes     */
88  /*                   formats.                                            */
89  /*                                                                       */
90  /* <Return>                                                              */
91  /*    FreeType error code.  0 means success.                             */
92  /*                                                                       */
93  /* <Note>                                                                */
94  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
95  /*    supported by this function.  Other layouts, or more sophisticated  */
96  /*    kernings, are out of scope of this method (the basic driver        */
97  /*    interface is meant to be simple).                                  */
98  /*                                                                       */
99  /*    They can be implemented by format-specific interfaces.             */
100  /*                                                                       */
101  static FT_Error
102  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
103                  FT_UInt     left_glyph,
104                  FT_UInt     right_glyph,
105                  FT_Vector*  kerning )
106  {
107    TT_Face       face = (TT_Face)ttface;
108    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
109
110
111    kerning->x = 0;
112    kerning->y = 0;
113
114    if ( sfnt )
115      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
116     
117    return 0;
118  }
119
120
121#undef PAIR_TAG
122
123
124  /*************************************************************************/
125  /*************************************************************************/
126  /*************************************************************************/
127  /****                                                                 ****/
128  /****                                                                 ****/
129  /****                           S I Z E S                             ****/
130  /****                                                                 ****/
131  /****                                                                 ****/
132  /*************************************************************************/
133  /*************************************************************************/
134  /*************************************************************************/
135
136
137  /*************************************************************************/
138  /*                                                                       */
139  /* <Function>                                                            */
140  /*    Set_Char_Sizes                                                     */
141  /*                                                                       */
142  /* <Description>                                                         */
143  /*    A driver method used to reset a size's character sizes (horizontal */
144  /*    and vertical) expressed in fractional points.                      */
145  /*                                                                       */
146  /* <Input>                                                               */
147  /*    char_width      :: The character width expressed in 26.6           */
148  /*                       fractional points.                              */
149  /*                                                                       */
150  /*    char_height     :: The character height expressed in 26.6          */
151  /*                       fractional points.                              */
152  /*                                                                       */
153  /*    horz_resolution :: The horizontal resolution of the output device. */
154  /*                                                                       */
155  /*    vert_resolution :: The vertical resolution of the output device.   */
156  /*                                                                       */
157  /* <InOut>                                                               */
158  /*    size            :: A handle to the target size object.             */
159  /*                                                                       */
160  /* <Return>                                                              */
161  /*    FreeType error code.  0 means success.                             */
162  /*                                                                       */
163  static FT_Error
164  Set_Char_Sizes( FT_Size     ttsize,       /* TT_Size */
165                  FT_F26Dot6  char_width,
166                  FT_F26Dot6  char_height,
167                  FT_UInt     horz_resolution,
168                  FT_UInt     vert_resolution )
169  {
170    TT_Size           size     = (TT_Size)ttsize;
171    FT_Size_Metrics*  metrics  = &size->root.metrics;
172    FT_Size_Metrics*  metrics2 = &size->metrics;
173    TT_Face           face     = (TT_Face)size->root.face;
174    FT_Long           dim_x, dim_y;
175
176
177    *metrics2 = *metrics;
178
179    /* This bit flag, when set, indicates that the pixel size must be */
180    /* truncated to an integer.  Nearly all TrueType fonts have this  */
181    /* bit set, as hinting won't work really well otherwise.          */
182    /*                                                                */
183    if ( ( face->header.Flags & 8 ) != 0 )
184    {
185     /* we need to use rounding in the following computations. Otherwise,
186      * the resulting hinted outlines will be very slightly distorted
187      */
188      dim_x = ( ( char_width  * horz_resolution + (36+32*72) ) / 72 ) & ~63;
189      dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63;
190    }
191    else
192    {
193      dim_x = ( ( char_width  * horz_resolution + 36 ) / 72 );
194      dim_y = ( ( char_height * vert_resolution + 36 ) / 72 );
195    }
196
197    /* we only modify "metrics2", not "metrics", so these changes have */
198    /* no effect on the result of the auto-hinter when it is used      */
199    /*                                                                 */
200    metrics2->x_ppem  = (FT_UShort)( dim_x >> 6 );
201    metrics2->y_ppem  = (FT_UShort)( dim_y >> 6 );
202    metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
203    metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
204
205    size->ttmetrics.valid = FALSE;
206#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
207    size->strike_index    = 0xFFFFU;
208#endif
209
210    return tt_size_reset( size );
211  }
212
213
214  /*************************************************************************/
215  /*                                                                       */
216  /* <Function>                                                            */
217  /*    Set_Pixel_Sizes                                                    */
218  /*                                                                       */
219  /* <Description>                                                         */
220  /*    A driver method used to reset a size's character sizes (horizontal */
221  /*    and vertical) expressed in integer pixels.                         */
222  /*                                                                       */
223  /* <InOut>                                                               */
224  /*    size         :: A handle to the target size object.                */
225  /*                                                                       */
226  /* <Return>                                                              */
227  /*    FreeType error code.  0 means success.                             */
228  /*                                                                       */
229  static FT_Error
230  Set_Pixel_Sizes( FT_Size  ttsize,         /* TT_Size */
231                   FT_UInt  pixel_width,
232                   FT_UInt  pixel_height )
233  {
234    TT_Size  size = (TT_Size)ttsize;
235
236    FT_UNUSED( pixel_width );
237    FT_UNUSED( pixel_height );
238
239
240    /* many things have been pre-computed by the base layer */
241
242    size->metrics         = size->root.metrics;
243    size->ttmetrics.valid = FALSE;
244#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
245    size->strike_index    = 0xFFFFU;
246#endif
247
248    return tt_size_reset( size );
249  }
250
251
252  /*************************************************************************/
253  /*                                                                       */
254  /* <Function>                                                            */
255  /*    Load_Glyph                                                         */
256  /*                                                                       */
257  /* <Description>                                                         */
258  /*    A driver method used to load a glyph within a given glyph slot.    */
259  /*                                                                       */
260  /* <Input>                                                               */
261  /*    slot        :: A handle to the target slot object where the glyph  */
262  /*                   will be loaded.                                     */
263  /*                                                                       */
264  /*    size        :: A handle to the source face size at which the glyph */
265  /*                   must be scaled, loaded, etc.                        */
266  /*                                                                       */
267  /*    glyph_index :: The index of the glyph in the font file.            */
268  /*                                                                       */
269  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
270  /*                   FTLOAD_??? constants can be used to control the     */
271  /*                   glyph loading process (e.g., whether the outline    */
272  /*                   should be scaled, whether to load bitmaps or not,   */
273  /*                   whether to hint the outline, etc).                  */
274  /*                                                                       */
275  /* <Return>                                                              */
276  /*    FreeType error code.  0 means success.                             */
277  /*                                                                       */
278  static FT_Error
279  Load_Glyph( FT_GlyphSlot  ttslot,         /* TT_GlyphSlot */
280              FT_Size       ttsize,         /* TT_Size      */
281              FT_UInt       glyph_index,
282              FT_Int32      load_flags )
283  {
284    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
285    TT_Size       size = (TT_Size)ttsize;
286    FT_Error      error;
287
288
289    if ( !slot )
290      return TT_Err_Invalid_Slot_Handle;
291
292    /* check whether we want a scaled outline or bitmap */
293    if ( !size )
294      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
295
296    if ( load_flags & FT_LOAD_NO_SCALE )
297      size = NULL;
298
299    /* reset the size object if necessary */
300    if ( size )
301    {
302      /* these two object must have the same parent */
303      if ( size->root.face != slot->face )
304        return TT_Err_Invalid_Face_Handle;
305
306      if ( !size->ttmetrics.valid )
307      {
308        if ( FT_SET_ERROR( tt_size_reset( size ) ) )
309          return error;
310      }
311    }
312
313    /* now load the glyph outline if necessary */
314    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
315
316    /* force drop-out mode to 2 - irrelevant now */
317    /* slot->outline.dropout_mode = 2; */
318
319    return error;
320  }
321
322
323  /*************************************************************************/
324  /*************************************************************************/
325  /*************************************************************************/
326  /****                                                                 ****/
327  /****                                                                 ****/
328  /****                D R I V E R  I N T E R F A C E                   ****/
329  /****                                                                 ****/
330  /****                                                                 ****/
331  /*************************************************************************/
332  /*************************************************************************/
333  /*************************************************************************/
334
335#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
336  static const FT_Service_MultiMastersRec  tt_service_gx_multi_masters =
337  {
338    (FT_Get_MM_Func)        NULL,
339    (FT_Set_MM_Design_Func) NULL,
340    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,
341    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,
342    (FT_Set_Var_Design_Func)TT_Set_Var_Design
343  };
344#endif
345
346
347  static const FT_ServiceDescRec  tt_services[] =
348  {
349    { FT_SERVICE_ID_XF86_NAME,     FT_XF86_FORMAT_TRUETYPE },
350#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
351    { FT_SERVICE_ID_MULTI_MASTERS, &tt_service_gx_multi_masters },
352#endif
353    { NULL, NULL }
354  };
355
356
357  FT_CALLBACK_DEF( FT_Module_Interface )
358  tt_get_interface( FT_Module    driver,    /* TT_Driver */
359                    const char*  tt_interface )
360  {
361    FT_Module_Interface  result;
362    FT_Module            sfntd;
363    SFNT_Service         sfnt;
364
365
366    result = ft_service_list_lookup( tt_services, tt_interface );
367    if ( result != NULL )
368      return result;
369
370    /* only return the default interface from the SFNT module */
371    sfntd = FT_Get_Module( driver->library, "sfnt" );
372    if ( sfntd )
373    {
374      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
375      if ( sfnt )
376        return sfnt->get_interface( driver, tt_interface );
377    }
378
379    return 0;
380  }
381
382
383  /* The FT_DriverInterface structure is defined in ftdriver.h. */
384
385  FT_CALLBACK_TABLE_DEF
386  const FT_Driver_ClassRec  tt_driver_class =
387  {
388    {
389      FT_MODULE_FONT_DRIVER        |
390      FT_MODULE_DRIVER_SCALABLE    |
391#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
392      FT_MODULE_DRIVER_HAS_HINTER,
393#else
394      0,
395#endif
396
397      sizeof ( TT_DriverRec ),
398
399      "truetype",      /* driver name                           */
400      0x10000L,        /* driver version == 1.0                 */
401      0x20000L,        /* driver requires FreeType 2.0 or above */
402
403      (void*)0,        /* driver specific interface */
404
405      tt_driver_init,
406      tt_driver_done,
407      tt_get_interface,
408    },
409
410    sizeof ( TT_FaceRec ),
411    sizeof ( TT_SizeRec ),
412    sizeof ( FT_GlyphSlotRec ),
413
414    tt_face_init,
415    tt_face_done,
416    tt_size_init,
417    tt_size_done,
418    0,                      /* FT_Slot_InitFunc        */
419    0,                      /* FT_Slot_DoneFunc        */
420
421    Set_Char_Sizes,
422    Set_Pixel_Sizes,
423    Load_Glyph,
424
425    tt_get_kerning,
426    0,                      /* FT_Face_AttachFunc      */
427    0                       /* FT_Face_GetAdvancesFunc */
428  };
429
430
431/* END */
Note: See TracBrowser for help on using the repository browser.