ttobjs.h

Go to the documentation of this file.
00001 /***************************************************************************/
00002 /*                                                                         */
00003 /*  ttobjs.h                                                               */
00004 /*                                                                         */
00005 /*    Objects manager (specification).                                     */
00006 /*                                                                         */
00007 /*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */
00008 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
00009 /*                                                                         */
00010 /*  This file is part of the FreeType project, and may only be used,       */
00011 /*  modified, and distributed under the terms of the FreeType project      */
00012 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
00013 /*  this file you indicate that you have read the license and              */
00014 /*  understand and accept it fully.                                        */
00015 /*                                                                         */
00016 /***************************************************************************/
00017 
00018 
00019 #ifndef __TTOBJS_H__
00020 #define __TTOBJS_H__
00021 
00022 
00023 #include <ft2build.h>
00024 #include FT_INTERNAL_OBJECTS_H
00025 #include FT_INTERNAL_TRUETYPE_TYPES_H
00026 
00027 
00028 FT_BEGIN_HEADER
00029 
00030 
00031   /*************************************************************************/
00032   /*                                                                       */
00033   /* <Type>                                                                */
00034   /*    TT_Driver                                                          */
00035   /*                                                                       */
00036   /* <Description>                                                         */
00037   /*    A handle to a TrueType driver object.                              */
00038   /*                                                                       */
00039   typedef struct TT_DriverRec_*  TT_Driver;
00040 
00041 
00042   /*************************************************************************/
00043   /*                                                                       */
00044   /* <Type>                                                                */
00045   /*    TT_Instance                                                        */
00046   /*                                                                       */
00047   /* <Description>                                                         */
00048   /*    A handle to a TrueType size object.                                */
00049   /*                                                                       */
00050   typedef struct TT_SizeRec_*  TT_Size;
00051 
00052 
00053   /*************************************************************************/
00054   /*                                                                       */
00055   /* <Type>                                                                */
00056   /*    TT_GlyphSlot                                                       */
00057   /*                                                                       */
00058   /* <Description>                                                         */
00059   /*    A handle to a TrueType glyph slot object.                          */
00060   /*                                                                       */
00061   /* <Note>                                                                */
00062   /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */
00063   /*    specific about the TrueType glyph slot.                            */
00064   /*                                                                       */
00065   typedef FT_GlyphSlot  TT_GlyphSlot;
00066 
00067 
00068   /*************************************************************************/
00069   /*                                                                       */
00070   /* <Struct>                                                              */
00071   /*    TT_GraphicsState                                                   */
00072   /*                                                                       */
00073   /* <Description>                                                         */
00074   /*    The TrueType graphics state used during bytecode interpretation.   */
00075   /*                                                                       */
00076   typedef struct  TT_GraphicsState_
00077   {
00078     FT_UShort      rp0;
00079     FT_UShort      rp1;
00080     FT_UShort      rp2;
00081 
00082     FT_UnitVector  dualVector;
00083     FT_UnitVector  projVector;
00084     FT_UnitVector  freeVector;
00085 
00086 #ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
00087     FT_Bool        both_x_axis;
00088 #endif
00089 
00090     FT_Long        loop;
00091     FT_F26Dot6     minimum_distance;
00092     FT_Int         round_state;
00093 
00094     FT_Bool        auto_flip;
00095     FT_F26Dot6     control_value_cutin;
00096     FT_F26Dot6     single_width_cutin;
00097     FT_F26Dot6     single_width_value;
00098     FT_Short       delta_base;
00099     FT_Short       delta_shift;
00100 
00101     FT_Byte        instruct_control;
00102     /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
00103     /* variable as documented in the TrueType specification is a 32-bit   */
00104     /* integer; the high-word part holds the SCANTYPE value, the low-word */
00105     /* part the SCANCTRL value.  We separate it into two fields.          */
00106     FT_Bool        scan_control;
00107     FT_Int         scan_type;
00108 
00109     FT_UShort      gep0;
00110     FT_UShort      gep1;
00111     FT_UShort      gep2;
00112 
00113   } TT_GraphicsState;
00114 
00115 
00116 #ifdef TT_USE_BYTECODE_INTERPRETER
00117 
00118   FT_LOCAL( void )
00119   tt_glyphzone_done( TT_GlyphZone  zone );
00120 
00121   FT_LOCAL( FT_Error )
00122   tt_glyphzone_new( FT_Memory     memory,
00123                     FT_UShort     maxPoints,
00124                     FT_Short      maxContours,
00125                     TT_GlyphZone  zone );
00126 
00127 #endif /* TT_USE_BYTECODE_INTERPRETER */
00128 
00129 
00130 
00131   /*************************************************************************/
00132   /*                                                                       */
00133   /*  EXECUTION SUBTABLES                                                  */
00134   /*                                                                       */
00135   /*  These sub-tables relate to instruction execution.                    */
00136   /*                                                                       */
00137   /*************************************************************************/
00138 
00139 
00140 #define TT_MAX_CODE_RANGES  3
00141 
00142 
00143   /*************************************************************************/
00144   /*                                                                       */
00145   /* There can only be 3 active code ranges at once:                       */
00146   /*   - the Font Program                                                  */
00147   /*   - the CVT Program                                                   */
00148   /*   - a glyph's instructions set                                        */
00149   /*                                                                       */
00150   typedef enum  TT_CodeRange_Tag_
00151   {
00152     tt_coderange_none = 0,
00153     tt_coderange_font,
00154     tt_coderange_cvt,
00155     tt_coderange_glyph
00156 
00157   } TT_CodeRange_Tag;
00158 
00159 
00160   typedef struct  TT_CodeRange_
00161   {
00162     FT_Byte*  base;
00163     FT_ULong  size;
00164 
00165   } TT_CodeRange;
00166 
00167   typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
00168 
00169 
00170   /*************************************************************************/
00171   /*                                                                       */
00172   /* Defines a function/instruction definition record.                     */
00173   /*                                                                       */
00174   typedef struct  TT_DefRecord_
00175   {
00176     FT_Int   range;      /* in which code range is it located? */
00177     FT_Long  start;      /* where does it start?               */
00178     FT_UInt  opc;        /* function #, or instruction code    */
00179     FT_Bool  active;     /* is it active?                      */
00180 
00181   } TT_DefRecord, *TT_DefArray;
00182 
00183 
00184   /*************************************************************************/
00185   /*                                                                       */
00186   /* Subglyph transformation record.                                       */
00187   /*                                                                       */
00188   typedef struct  TT_Transform_
00189   {
00190     FT_Fixed    xx, xy;     /* transformation matrix coefficients */
00191     FT_Fixed    yx, yy;
00192     FT_F26Dot6  ox, oy;     /* offsets        */
00193 
00194   } TT_Transform;
00195 
00196 
00197   /*************************************************************************/
00198   /*                                                                       */
00199   /* A note regarding non-squared pixels:                                  */
00200   /*                                                                       */
00201   /* (This text will probably go into some docs at some time; for now, it  */
00202   /* is kept here to explain some definitions in the TT_Size_Metrics       */
00203   /* record).                                                              */
00204   /*                                                                       */
00205   /* The CVT is a one-dimensional array containing values that control     */
00206   /* certain important characteristics in a font, like the height of all   */
00207   /* capitals, all lowercase letter, default spacing or stem width/height. */
00208   /*                                                                       */
00209   /* These values are found in FUnits in the font file, and must be scaled */
00210   /* to pixel coordinates before being used by the CVT and glyph programs. */
00211   /* Unfortunately, when using distinct x and y resolutions (or distinct x */
00212   /* and y pointsizes), there are two possible scalings.                   */
00213   /*                                                                       */
00214   /* A first try was to implement a `lazy' scheme where all values were    */
00215   /* scaled when first used.  However, while some values are always used   */
00216   /* in the same direction, some others are used under many different      */
00217   /* circumstances and orientations.                                       */
00218   /*                                                                       */
00219   /* I have found a simpler way to do the same, and it even seems to work  */
00220   /* in most of the cases:                                                 */
00221   /*                                                                       */
00222   /* - All CVT values are scaled to the maximum ppem size.                 */
00223   /*                                                                       */
00224   /* - When performing a read or write in the CVT, a ratio factor is used  */
00225   /*   to perform adequate scaling.  Example:                              */
00226   /*                                                                       */
00227   /*     x_ppem = 14                                                       */
00228   /*     y_ppem = 10                                                       */
00229   /*                                                                       */
00230   /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */
00231   /*   entries are scaled to it.                                           */
00232   /*                                                                       */
00233   /*     x_ratio = 1.0                                                     */
00234   /*     y_ratio = y_ppem/ppem (< 1.0)                                     */
00235   /*                                                                       */
00236   /*   We compute the current ratio like:                                  */
00237   /*                                                                       */
00238   /*   - If projVector is horizontal,                                      */
00239   /*       ratio = x_ratio = 1.0                                           */
00240   /*                                                                       */
00241   /*   - if projVector is vertical,                                        */
00242   /*       ratio = y_ratio                                                 */
00243   /*                                                                       */
00244   /*   - else,                                                             */
00245   /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
00246   /*                                                                       */
00247   /*   Reading a cvt value returns                                         */
00248   /*     ratio * cvt[index]                                                */
00249   /*                                                                       */
00250   /*   Writing a cvt value in pixels:                                      */
00251   /*     cvt[index] / ratio                                                */
00252   /*                                                                       */
00253   /*   The current ppem is simply                                          */
00254   /*     ratio * ppem                                                      */
00255   /*                                                                       */
00256   /*************************************************************************/
00257 
00258 
00259   /*************************************************************************/
00260   /*                                                                       */
00261   /* Metrics used by the TrueType size and context objects.                */
00262   /*                                                                       */
00263   typedef struct  TT_Size_Metrics_
00264   {
00265     /* for non-square pixels */
00266     FT_Long     x_ratio;
00267     FT_Long     y_ratio;
00268 
00269     FT_UShort   ppem;               /* maximum ppem size              */
00270     FT_Long     ratio;              /* current ratio                  */
00271     FT_Fixed    scale;
00272 
00273     FT_F26Dot6  compensations[4];   /* device-specific compensations  */
00274 
00275     FT_Bool     valid;
00276 
00277     FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
00278     FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
00279 
00280   } TT_Size_Metrics;
00281 
00282 
00283   /*************************************************************************/
00284   /*                                                                       */
00285   /* TrueType size class.                                                  */
00286   /*                                                                       */
00287   typedef struct  TT_SizeRec_
00288   {
00289     FT_SizeRec         root;
00290 
00291     /* we have our own copy of metrics so that we can modify */
00292     /* it without affecting auto-hinting (when used)         */
00293     FT_Size_Metrics    metrics;
00294 
00295     TT_Size_Metrics    ttmetrics;
00296 
00297     FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */
00298 
00299 #ifdef TT_USE_BYTECODE_INTERPRETER
00300 
00301     FT_UInt            num_function_defs; /* number of function definitions */
00302     FT_UInt            max_function_defs;
00303     TT_DefArray        function_defs;     /* table of function definitions  */
00304 
00305     FT_UInt            num_instruction_defs;  /* number of ins. definitions */
00306     FT_UInt            max_instruction_defs;
00307     TT_DefArray        instruction_defs;      /* table of ins. definitions  */
00308 
00309     FT_UInt            max_func;
00310     FT_UInt            max_ins;
00311 
00312     TT_CodeRangeTable  codeRangeTable;
00313 
00314     TT_GraphicsState   GS;
00315 
00316     FT_ULong           cvt_size;      /* the scaled control value table */
00317     FT_Long*           cvt;
00318 
00319     FT_UShort          storage_size; /* The storage area is now part of */
00320     FT_Long*           storage;      /* the instance                    */
00321 
00322     TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
00323 
00324     /* debugging variables */
00325 
00326     /* When using the debugger, we must keep the */
00327     /* execution context tied to the instance    */
00328     /* object rather than asking it on demand.   */
00329 
00330     FT_Bool            debug;
00331     TT_ExecContext     context;
00332 
00333     FT_Bool            bytecode_ready;
00334     FT_Bool            cvt_ready;
00335 
00336 #endif /* TT_USE_BYTECODE_INTERPRETER */
00337 
00338   } TT_SizeRec;
00339 
00340 
00341   /*************************************************************************/
00342   /*                                                                       */
00343   /* TrueType driver class.                                                */
00344   /*                                                                       */
00345   typedef struct  TT_DriverRec_
00346   {
00347     FT_DriverRec     root;
00348     TT_ExecContext   context;  /* execution context        */
00349     TT_GlyphZoneRec  zone;     /* glyph loader points zone */
00350 
00351     void*            extension_component;
00352 
00353   } TT_DriverRec;
00354 
00355 
00356   /* Note: All of the functions below (except tt_size_reset()) are used    */
00357   /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */
00358   /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */
00359   /* TT_Size, etc., so that the compiler can confirm that the types and    */
00360   /* number of parameters are correct.  In all cases the FT_xxx types are  */
00361   /* cast to their TT_xxx counterparts inside the functions since FreeType */
00362   /* will always use the TT driver to create them.                         */
00363 
00364 
00365   /*************************************************************************/
00366   /*                                                                       */
00367   /* Face functions                                                        */
00368   /*                                                                       */
00369   FT_LOCAL( FT_Error )
00370   tt_face_init( FT_Stream      stream,
00371                 FT_Face        ttface,      /* TT_Face */
00372                 FT_Int         face_index,
00373                 FT_Int         num_params,
00374                 FT_Parameter*  params );
00375 
00376   FT_LOCAL( void )
00377   tt_face_done( FT_Face  ttface );          /* TT_Face */
00378 
00379 
00380   /*************************************************************************/
00381   /*                                                                       */
00382   /* Size functions                                                        */
00383   /*                                                                       */
00384   FT_LOCAL( FT_Error )
00385   tt_size_init( FT_Size  ttsize );          /* TT_Size */
00386 
00387   FT_LOCAL( void )
00388   tt_size_done( FT_Size  ttsize );          /* TT_Size */
00389 
00390 #ifdef TT_USE_BYTECODE_INTERPRETER
00391 
00392   FT_LOCAL( FT_Error )
00393   tt_size_run_fpgm( TT_Size  size );
00394 
00395   FT_LOCAL( FT_Error )
00396   tt_size_run_prep( TT_Size  size );
00397 
00398   FT_LOCAL( FT_Error )
00399   tt_size_ready_bytecode( TT_Size  size );
00400 
00401 #endif /* TT_USE_BYTECODE_INTERPRETER */
00402 
00403   FT_LOCAL( FT_Error )
00404   tt_size_reset( TT_Size  size );
00405 
00406 
00407   /*************************************************************************/
00408   /*                                                                       */
00409   /* Driver functions                                                      */
00410   /*                                                                       */
00411   FT_LOCAL( FT_Error )
00412   tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */
00413 
00414   FT_LOCAL( void )
00415   tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */
00416 
00417 
00418   /*************************************************************************/
00419   /*                                                                       */
00420   /* Slot functions                                                        */
00421   /*                                                                       */
00422   FT_LOCAL( FT_Error )
00423   tt_slot_init( FT_GlyphSlot  slot );
00424 
00425 
00426 FT_END_HEADER
00427 
00428 #endif /* __TTOBJS_H__ */
00429 
00430 
00431 /* END */

Generated on Tue Jul 5 14:13:54 2011 for ROOT_528-00b_version by  doxygen 1.5.1