shithub: freetype+ttf2subf

ref: e49ab25c0822e1043be29e836944c7886f4e8990
dir: /src/type1/t1hinter.h/

View raw version
/*******************************************************************
 *
 *  t1hinter.h                                                 1.2
 *
 *    Type1 hinter.
 *
 *  Copyright 1996-1999 by
 *  David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 *  This file is part of the FreeType project, and may only be used
 *  modified and distributed under the terms of the FreeType project
 *  license, LICENSE.TXT.  By continuing to use, modify, or distribute
 *  this file you indicate that you have read the license and
 *  understand and accept it fully.
 *
 *
 *  The Hinter is in charge of fitting th scaled outline to the
 *  pixel grid in order to considerably improve the quality of
 *  the Type 1 font driver's output..
 *
 ******************************************************************/

#ifndef T1HINTER_H
#define T1HINTER_H

#include <t1objs.h>
#include <t1gload.h>

#ifdef __cplusplus
  extern "C" {
#endif


/************************************************************************
 *
 * <Struct>
 *   T1_Snap_Zone
 *
 * <Description>
 *   A "snap zone" is used to model either a blue zone or a stem width
 *   at a given character size. It is made of a minimum and maximum
 *   edge, defined in 26.6 pixels, as well as one "original" and
 *   "scaled" position.
 *
 *   the position corresponds to the stem width (for stem snap zones)
 *   or to the blue position (for blue zones)
 *
 * <Fields>
 *   orus  :: original position in font units
 *   pix   :: current position in sub-pixel units
 *   min   :: minimum boundary in sub-pixel units
 *   max   :: maximim boundary in sub-pixel units
 *
 ************************************************************************/

  typedef struct T1_Snap_Zone_
  {
    T1_Pos  orus;
    T1_Pos  pix;
    T1_Pos  min;
    T1_Pos  max;

  } T1_Snap_Zone;


/************************************************************************
 *
 * <Struct>
 *   T1_Edge
 *
 * <Description>
 *   A very simply structure used to model an stem edge
 *
 * <Fields>
 *   orus  :: original edge position in font units
 *   pix   :: scaled edge position in sub-pixel units
 *
 ************************************************************************/

  typedef struct T1_Edge_
  {
    T1_Pos  orus;
    T1_Pos  pix;

  } T1_Edge;


/************************************************************************
 *
 * <Struct>
 *    T1_Stem_Hint
 *
 * <Description>
 *    A simple structure used to model a stem hint
 *
 * <Fields>
 *    min_edge   :: the hint's minimum edge
 *    max_edge   :: the hint's maximum edge
 *    hint_flags :: some flags describing the stem properties
 *
 * <Note>
 *    the min and max edges of a ghost stem have the same position,
 *    even if they're coded in a weird way in the charstrings
 *
 ************************************************************************/

  typedef struct T1_Stem_Hint_
  {
    T1_Edge  min_edge;
    T1_Edge  max_edge;
    T1_Int   hint_flags;

  } T1_Stem_Hint;


#define T1_HINT_FLAG_ACTIVE      1    /* indicates an active stem */
#define T1_HINT_FLAG_MIN_BORDER  2    /* unused for now..         */
#define T1_HINT_FLAG_MAX_BORDER  4    /* unused for now..         */


/* hinter's configuration constants */
#define T1_HINTER_MAX_BLUES    24    /* maximum number of blue zones      */
#define T1_HINTER_MAX_SNAPS    16    /* maximum number of stem snap zones */
#define T1_HINTER_MAX_EDGES    64    /* maximum number of stem hints      */


/************************************************************************
 *
 * <Struct>
 *   T1_Size_Hints
 *
 * <Description>
 *   A structure used to model the hinting information related to
 *   a size object
 *
 * <Fields>
 *   supress_overshoots :: a boolean flag to tell when overshoot
 *                         supression should occur.
 *
 *   num_blue_zones     :: the total number of blue zones (top+bottom)
 *   num_bottom_zones   :: the number of bottom zones
 *
 *   blue_zones         :: the blue zones table. bottom zones are
 *                         stored first in the table, followed by
 *                         all top zones
 *
 *   num_stem_snapH     :: number of horizontal stem snap zones
 *   stem_snapH         :: horizontal stem snap zones
 *
 *   num_stem_snapV     :: number of vertical stem snap zones
 *   stem_snapV         :: vertical stem snap zones
 *
 ************************************************************************/

  struct T1_Size_Hints_
  {
    T1_Bool       supress_overshoots;

    T1_Int        num_blue_zones;
    T1_Int        num_bottom_zones;
    T1_Snap_Zone  blue_zones[ T1_HINTER_MAX_BLUES ];

    T1_Int        num_snap_widths;
    T1_Snap_Zone  snap_widths[ T1_HINTER_MAX_SNAPS ];

    T1_Int        num_snap_heights;
    T1_Snap_Zone  snap_heights[ T1_HINTER_MAX_SNAPS ];
  };



/************************************************************************
 *
 * <Struct>
 *    T1_Stem_Table
 *
 * <Description>
 *    A simple structure used to model a set of stem hints in a
 *    single direction during the loading of a given glyph outline.
 *    Not all stem hints are active at a time. Moreover, stems must
 *    be sorted regularly
 *
 * <Fields>
 *    num_stems   :: total number of stems in table
 *    num_active  :: number of active stems in table
 *
 *    stems       :: the table of all stems
 *    sort        :: a table of indices into the stems table, used
 *                   to keep a sorted list of the active stems
 *
 ************************************************************************/

  typedef struct T1_Stem_Table_
  {
    T1_Int        num_stems;
    T1_Int        num_active;

    T1_Stem_Hint  stems[ T1_HINTER_MAX_EDGES ];
    T1_Int        sort [ T1_HINTER_MAX_EDGES ];

  } T1_Stem_Table;



/************************************************************************
 *
 * <Struct>
 *   T1_Glyph_Hints
 *
 * <Description>
 *   A structure used to model the stem hints of a given glyph outline
 *   during glyph loading.
 *
 * <Fields>
 *   hori_stems  :: horizontal stem hints table
 *   vert_stems  :: vertical stem hints table
 *
 ************************************************************************/

  struct T1_Glyph_Hints_
  {
    T1_Stem_Table  hori_stems;
    T1_Stem_Table  vert_stems;
  };



/************************************************************************
 *
 * <Data>
 *    t1_hinter_funcs
 *
 * <Description>
 *    A table containing the address of various functions used during
 *    the loading of an hinted scaled outline
 *
 ************************************************************************/

  LOCAL_DEF
  const T1_Hinter_Funcs  t1_hinter_funcs;


/************************************************************************
 *
 * <Function>
 *    T1_New_Size_Hinter
 *
 * <Description>
 *    Allocates a new hinter structure for a given size object
 *
 * <Input>
 *    size :: handle to target size object
 *
 * <Return>
 *    Error code. 0 means success
 *
 ************************************************************************/

  LOCAL_DEF
  T1_Error  T1_New_Size_Hinter( T1_Size  size );


/************************************************************************
 *
 * <Function>
 *    T1_Done_Size_Hinter
 *
 * <Description>
 *    Releases a given size object's hinter structure
 *
 * <Input>
 *    size :: handle to target size object
 *
 ************************************************************************/

  LOCAL_DEF
  void      T1_Done_Size_Hinter( T1_Size  size );


/************************************************************************
 *
 * <Function>
 *    T1_Reset_Size_Hinter
 *
 * <Description>
 *    Recomputes hinting information when a given size object has
 *    changed its resolutions/char sizes/pixel sizes
 *
 * <Input>
 *    size :: handle to size object
 *
 * <Return>
 *    Error code. 0 means success
 *
 ************************************************************************/

  LOCAL_DEF
  T1_Error  T1_Reset_Size_Hinter( T1_Size  size );


/************************************************************************
 *
 * <Function>
 *    T1_New_Glyph_Hinter
 *
 * <Description>
 *    Allocates a new hinter structure for a given glyph slot
 *
 * <Input>
 *    glyph :: handle to target glyph slot
 *
 * <Return>
 *    Error code. 0 means success
 *
 ************************************************************************/

  LOCAL_DEF
  T1_Error  T1_New_Glyph_Hinter( T1_GlyphSlot  glyph );


/************************************************************************
 *
 * <Function>
 *    T1_Done_Glyph_Hinter
 *
 * <Description>
 *    Releases a given glyph slot's hinter structure
 *
 * <Input>
 *    glyph :: handle to glyph slot
 *
 ************************************************************************/

  LOCAL_DEF
  void      T1_Done_Glyph_Hinter( T1_GlyphSlot  glyph );




/************************************************************************
 *
 * <Function>
 *   T1_Hint_Points
 *
 * <Description>
 *   this function grid-fits several points in a given Type 1 builder
 *   at once.
 *
 * <Input>
 *   builder  :: handle to target Type 1 builder
 *
 ************************************************************************/

  LOCAL_DEF
  void  T1_Hint_Points( T1_Builder*  builder );


/************************************************************************
 *
 * <Function>
 *    T1_Hint_Stems
 *
 * <Description>
 *    This function is used to compute the location of each stem hint
 *    between the first and second passes of the glyph loader on the
 *    charstring.
 *
 * <Input>
 *    builder :: handle to target builder
 *
 ************************************************************************/

  LOCAL_DEF
  void  T1_Hint_Stems( T1_Builder*  builder );

#ifdef __cplusplus
  }
#endif

#endif /* T1HINTER_H */