1 /***************************************************************************/
   2 /*                                                                         */
   3 /*  ttobjs.h                                                               */
   4 /*                                                                         */
   5 /*    Objects manager (specification).                                     */
   6 /*                                                                         */
   7 /*  Copyright 1996-2018 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 #ifndef TTOBJS_H_
  20 #define TTOBJS_H_
  21 
  22 
  23 #include <ft2build.h>
  24 #include FT_INTERNAL_OBJECTS_H
  25 #include FT_INTERNAL_TRUETYPE_TYPES_H
  26 
  27 
  28 FT_BEGIN_HEADER
  29 
  30 
  31   /*************************************************************************/
  32   /*                                                                       */
  33   /* <Type>                                                                */
  34   /*    TT_Driver                                                          */
  35   /*                                                                       */
  36   /* <Description>                                                         */
  37   /*    A handle to a TrueType driver object.                              */
  38   /*                                                                       */
  39   typedef struct TT_DriverRec_*  TT_Driver;
  40 
  41 
  42   /*************************************************************************/
  43   /*                                                                       */
  44   /* <Type>                                                                */
  45   /*    TT_GlyphSlot                                                       */
  46   /*                                                                       */
  47   /* <Description>                                                         */
  48   /*    A handle to a TrueType glyph slot object.                          */
  49   /*                                                                       */
  50   /* <Note>                                                                */
  51   /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */
  52   /*    specific about the TrueType glyph slot.                            */
  53   /*                                                                       */
  54   typedef FT_GlyphSlot  TT_GlyphSlot;
  55 
  56 
  57   /*************************************************************************/
  58   /*                                                                       */
  59   /* <Struct>                                                              */
  60   /*    TT_GraphicsState                                                   */
  61   /*                                                                       */
  62   /* <Description>                                                         */
  63   /*    The TrueType graphics state used during bytecode interpretation.   */
  64   /*                                                                       */
  65   typedef struct  TT_GraphicsState_
  66   {
  67     FT_UShort      rp0;
  68     FT_UShort      rp1;
  69     FT_UShort      rp2;
  70 
  71     FT_UnitVector  dualVector;
  72     FT_UnitVector  projVector;
  73     FT_UnitVector  freeVector;
  74 
  75     FT_Long        loop;
  76     FT_F26Dot6     minimum_distance;
  77     FT_Int         round_state;
  78 
  79     FT_Bool        auto_flip;
  80     FT_F26Dot6     control_value_cutin;
  81     FT_F26Dot6     single_width_cutin;
  82     FT_F26Dot6     single_width_value;
  83     FT_UShort      delta_base;
  84     FT_UShort      delta_shift;
  85 
  86     FT_Byte        instruct_control;
  87     /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
  88     /* variable as documented in the TrueType specification is a 32-bit   */
  89     /* integer; the high-word part holds the SCANTYPE value, the low-word */
  90     /* part the SCANCTRL value.  We separate it into two fields.          */
  91     FT_Bool        scan_control;
  92     FT_Int         scan_type;
  93 
  94     FT_UShort      gep0;
  95     FT_UShort      gep1;
  96     FT_UShort      gep2;
  97 
  98   } TT_GraphicsState;
  99 
 100 
 101 #ifdef TT_USE_BYTECODE_INTERPRETER
 102 
 103   FT_LOCAL( void )
 104   tt_glyphzone_done( TT_GlyphZone  zone );
 105 
 106   FT_LOCAL( FT_Error )
 107   tt_glyphzone_new( FT_Memory     memory,
 108                     FT_UShort     maxPoints,
 109                     FT_Short      maxContours,
 110                     TT_GlyphZone  zone );
 111 
 112 #endif /* TT_USE_BYTECODE_INTERPRETER */
 113 
 114 
 115 
 116   /*************************************************************************/
 117   /*                                                                       */
 118   /*  EXECUTION SUBTABLES                                                  */
 119   /*                                                                       */
 120   /*  These sub-tables relate to instruction execution.                    */
 121   /*                                                                       */
 122   /*************************************************************************/
 123 
 124 
 125 #define TT_MAX_CODE_RANGES  3
 126 
 127 
 128   /*************************************************************************/
 129   /*                                                                       */
 130   /* There can only be 3 active code ranges at once:                       */
 131   /*   - the Font Program                                                  */
 132   /*   - the CVT Program                                                   */
 133   /*   - a glyph's instructions set                                        */
 134   /*                                                                       */
 135   typedef enum  TT_CodeRange_Tag_
 136   {
 137     tt_coderange_none = 0,
 138     tt_coderange_font,
 139     tt_coderange_cvt,
 140     tt_coderange_glyph
 141 
 142   } TT_CodeRange_Tag;
 143 
 144 
 145   typedef struct  TT_CodeRange_
 146   {
 147     FT_Byte*  base;
 148     FT_Long   size;
 149 
 150   } TT_CodeRange;
 151 
 152   typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
 153 
 154 
 155   /*************************************************************************/
 156   /*                                                                       */
 157   /* Defines a function/instruction definition record.                     */
 158   /*                                                                       */
 159   typedef struct  TT_DefRecord_
 160   {
 161     FT_Int    range;          /* in which code range is it located?     */
 162     FT_Long   start;          /* where does it start?                   */
 163     FT_Long   end;            /* where does it end?                     */
 164     FT_UInt   opc;            /* function #, or instruction code        */
 165     FT_Bool   active;         /* is it active?                          */
 166     FT_Bool   inline_delta;   /* is function that defines inline delta? */
 167     FT_ULong  sph_fdef_flags; /* flags to identify special functions    */
 168 
 169   } TT_DefRecord, *TT_DefArray;
 170 
 171 
 172   /*************************************************************************/
 173   /*                                                                       */
 174   /* Subglyph transformation record.                                       */
 175   /*                                                                       */
 176   typedef struct  TT_Transform_
 177   {
 178     FT_Fixed    xx, xy;     /* transformation matrix coefficients */
 179     FT_Fixed    yx, yy;
 180     FT_F26Dot6  ox, oy;     /* offsets                            */
 181 
 182   } TT_Transform;
 183 
 184 
 185   /*************************************************************************/
 186   /*                                                                       */
 187   /* A note regarding non-squared pixels:                                  */
 188   /*                                                                       */
 189   /* (This text will probably go into some docs at some time; for now, it  */
 190   /* is kept here to explain some definitions in the TT_Size_Metrics       */
 191   /* record).                                                              */
 192   /*                                                                       */
 193   /* The CVT is a one-dimensional array containing values that control     */
 194   /* certain important characteristics in a font, like the height of all   */
 195   /* capitals, all lowercase letter, default spacing or stem width/height. */
 196   /*                                                                       */
 197   /* These values are found in FUnits in the font file, and must be scaled */
 198   /* to pixel coordinates before being used by the CVT and glyph programs. */
 199   /* Unfortunately, when using distinct x and y resolutions (or distinct x */
 200   /* and y pointsizes), there are two possible scalings.                   */
 201   /*                                                                       */
 202   /* A first try was to implement a `lazy' scheme where all values were    */
 203   /* scaled when first used.  However, while some values are always used   */
 204   /* in the same direction, some others are used under many different      */
 205   /* circumstances and orientations.                                       */
 206   /*                                                                       */
 207   /* I have found a simpler way to do the same, and it even seems to work  */
 208   /* in most of the cases:                                                 */
 209   /*                                                                       */
 210   /* - All CVT values are scaled to the maximum ppem size.                 */
 211   /*                                                                       */
 212   /* - When performing a read or write in the CVT, a ratio factor is used  */
 213   /*   to perform adequate scaling.  Example:                              */
 214   /*                                                                       */
 215   /*     x_ppem = 14                                                       */
 216   /*     y_ppem = 10                                                       */
 217   /*                                                                       */
 218   /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */
 219   /*   entries are scaled to it.                                           */
 220   /*                                                                       */
 221   /*     x_ratio = 1.0                                                     */
 222   /*     y_ratio = y_ppem/ppem (< 1.0)                                     */
 223   /*                                                                       */
 224   /*   We compute the current ratio like:                                  */
 225   /*                                                                       */
 226   /*   - If projVector is horizontal,                                      */
 227   /*       ratio = x_ratio = 1.0                                           */
 228   /*                                                                       */
 229   /*   - if projVector is vertical,                                        */
 230   /*       ratio = y_ratio                                                 */
 231   /*                                                                       */
 232   /*   - else,                                                             */
 233   /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
 234   /*                                                                       */
 235   /*   Reading a cvt value returns                                         */
 236   /*     ratio * cvt[index]                                                */
 237   /*                                                                       */
 238   /*   Writing a cvt value in pixels:                                      */
 239   /*     cvt[index] / ratio                                                */
 240   /*                                                                       */
 241   /*   The current ppem is simply                                          */
 242   /*     ratio * ppem                                                      */
 243   /*                                                                       */
 244   /*************************************************************************/
 245 
 246 
 247   /*************************************************************************/
 248   /*                                                                       */
 249   /* Metrics used by the TrueType size and context objects.                */
 250   /*                                                                       */
 251   typedef struct  TT_Size_Metrics_
 252   {
 253     /* for non-square pixels */
 254     FT_Long     x_ratio;
 255     FT_Long     y_ratio;
 256 
 257     FT_UShort   ppem;               /* maximum ppem size              */
 258     FT_Long     ratio;              /* current ratio                  */
 259     FT_Fixed    scale;
 260 
 261     FT_F26Dot6  compensations[4];   /* device-specific compensations  */
 262 
 263     FT_Bool     valid;
 264 
 265     FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
 266     FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
 267 
 268   } TT_Size_Metrics;
 269 
 270 
 271   /*************************************************************************/
 272   /*                                                                       */
 273   /* TrueType size class.                                                  */
 274   /*                                                                       */
 275   typedef struct  TT_SizeRec_
 276   {
 277     FT_SizeRec         root;
 278 
 279     /* we have our own copy of metrics so that we can modify */
 280     /* it without affecting auto-hinting (when used)         */
 281     FT_Size_Metrics*   metrics;        /* for the current rendering mode */
 282     FT_Size_Metrics    hinted_metrics; /* for the hinted rendering mode  */
 283 
 284     TT_Size_Metrics    ttmetrics;
 285 
 286     FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */
 287 
 288 #ifdef TT_USE_BYTECODE_INTERPRETER
 289 
 290     FT_Long            point_size;    /* for the `MPS' bytecode instruction */
 291 
 292     FT_UInt            num_function_defs; /* number of function definitions */
 293     FT_UInt            max_function_defs;
 294     TT_DefArray        function_defs;     /* table of function definitions  */
 295 
 296     FT_UInt            num_instruction_defs;  /* number of ins. definitions */
 297     FT_UInt            max_instruction_defs;
 298     TT_DefArray        instruction_defs;      /* table of ins. definitions  */
 299 
 300     FT_UInt            max_func;
 301     FT_UInt            max_ins;
 302 
 303     TT_CodeRangeTable  codeRangeTable;
 304 
 305     TT_GraphicsState   GS;
 306 
 307     FT_ULong           cvt_size;      /* the scaled control value table */
 308     FT_Long*           cvt;
 309 
 310     FT_UShort          storage_size; /* The storage area is now part of */
 311     FT_Long*           storage;      /* the instance                    */
 312 
 313     TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
 314 
 315     TT_ExecContext     context;
 316 
 317     /* if negative, `fpgm' (resp. `prep'), wasn't executed yet; */
 318     /* otherwise it is the returned error code                  */
 319     FT_Error           bytecode_ready;
 320     FT_Error           cvt_ready;
 321 
 322 #endif /* TT_USE_BYTECODE_INTERPRETER */
 323 
 324   } TT_SizeRec;
 325 
 326 
 327   /*************************************************************************/
 328   /*                                                                       */
 329   /* TrueType driver class.                                                */
 330   /*                                                                       */
 331   typedef struct  TT_DriverRec_
 332   {
 333     FT_DriverRec  root;
 334 
 335     TT_GlyphZoneRec  zone;     /* glyph loader points zone */
 336 
 337     FT_UInt  interpreter_version;
 338 
 339   } TT_DriverRec;
 340 
 341 
 342   /* Note: All of the functions below (except tt_size_reset()) are used    */
 343   /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */
 344   /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */
 345   /* TT_Size, etc., so that the compiler can confirm that the types and    */
 346   /* number of parameters are correct.  In all cases the FT_xxx types are  */
 347   /* cast to their TT_xxx counterparts inside the functions since FreeType */
 348   /* will always use the TT driver to create them.                         */
 349 
 350 
 351   /*************************************************************************/
 352   /*                                                                       */
 353   /* Face functions                                                        */
 354   /*                                                                       */
 355   FT_LOCAL( FT_Error )
 356   tt_face_init( FT_Stream      stream,
 357                 FT_Face        ttface,      /* TT_Face */
 358                 FT_Int         face_index,
 359                 FT_Int         num_params,
 360                 FT_Parameter*  params );
 361 
 362   FT_LOCAL( void )
 363   tt_face_done( FT_Face  ttface );          /* TT_Face */
 364 
 365 
 366   /*************************************************************************/
 367   /*                                                                       */
 368   /* Size functions                                                        */
 369   /*                                                                       */
 370   FT_LOCAL( FT_Error )
 371   tt_size_init( FT_Size  ttsize );          /* TT_Size */
 372 
 373   FT_LOCAL( void )
 374   tt_size_done( FT_Size  ttsize );          /* TT_Size */
 375 
 376 #ifdef TT_USE_BYTECODE_INTERPRETER
 377 
 378   FT_LOCAL( FT_Error )
 379   tt_size_run_fpgm( TT_Size  size,
 380                     FT_Bool  pedantic );
 381 
 382   FT_LOCAL( FT_Error )
 383   tt_size_run_prep( TT_Size  size,
 384                     FT_Bool  pedantic );
 385 
 386   FT_LOCAL( FT_Error )
 387   tt_size_ready_bytecode( TT_Size  size,
 388                           FT_Bool  pedantic );
 389 
 390 #endif /* TT_USE_BYTECODE_INTERPRETER */
 391 
 392   FT_LOCAL( FT_Error )
 393   tt_size_reset( TT_Size  size,
 394                  FT_Bool  only_height );
 395 
 396 
 397   /*************************************************************************/
 398   /*                                                                       */
 399   /* Driver functions                                                      */
 400   /*                                                                       */
 401   FT_LOCAL( FT_Error )
 402   tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */
 403 
 404   FT_LOCAL( void )
 405   tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */
 406 
 407 
 408   /*************************************************************************/
 409   /*                                                                       */
 410   /* Slot functions                                                        */
 411   /*                                                                       */
 412   FT_LOCAL( FT_Error )
 413   tt_slot_init( FT_GlyphSlot  slot );
 414 
 415 
 416   /* auxiliary */
 417 #define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
 418 
 419 
 420 FT_END_HEADER
 421 
 422 #endif /* TTOBJS_H_ */
 423 
 424 
 425 /* END */