/***************************************************************************/

/*                                                                         */

/*  pshglob.h                                                              */

/*                                                                         */

/*    PostScript hinter global hinting management.                         */

/*                                                                         */

/*  Copyright 2001, 2002, 2003 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.                                        */

/*                                                                         */

/***************************************************************************/





#ifndef __PSHGLOB_H__

#define __PSHGLOB_H__





#include FT_FREETYPE_H

#include FT_INTERNAL_POSTSCRIPT_HINTS_H





FT_BEGIN_HEADER





  /*************************************************************************/

  /*************************************************************************/

  /*****                                                               *****/

  /*****                    GLOBAL HINTS INTERNALS                     *****/

  /*****                                                               *****/

  /*************************************************************************/

  /*************************************************************************/





  /*************************************************************************/

  /*                                                                       */

  /* @constant:                                                            */

  /*    PS_GLOBALS_MAX_BLUE_ZONES                                          */

  /*                                                                       */

  /* @description:                                                         */

  /*    The maximum number of blue zones in a font global hints structure. */

  /*    See @PS_Globals_BluesRec.                                          */

  /*                                                                       */

#define PS_GLOBALS_MAX_BLUE_ZONES  16





  /*************************************************************************/

  /*                                                                       */

  /* @constant:                                                            */

  /*    PS_GLOBALS_MAX_STD_WIDTHS                                          */

  /*                                                                       */

  /* @description:                                                         */

  /*    The maximum number of standard and snap widths in either the       */

  /*    horizontal or vertical direction.  See @PS_Globals_WidthsRec.      */

  /*                                                                       */

#define PS_GLOBALS_MAX_STD_WIDTHS  16





  /* standard and snap width */

  typedef struct  PSH_WidthRec_

  {

    FT_Int  org;

    FT_Pos  cur;

    FT_Pos  fit;



  } PSH_WidthRec, *PSH_Width;





  /* standard and snap widths table */

  typedef struct  PSH_WidthsRec_

  {

    FT_UInt       count;

    PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];



  } PSH_WidthsRec, *PSH_Widths;





  typedef struct  PSH_DimensionRec_

  {

    PSH_WidthsRec  stdw;

    FT_Fixed       scale_mult;

    FT_Fixed       scale_delta;



  } PSH_DimensionRec, *PSH_Dimension;





  /* blue zone descriptor */

  typedef struct  PSH_Blue_ZoneRec_

  {

    FT_Int  org_ref;

    FT_Int  org_delta;

    FT_Int  org_top;

    FT_Int  org_bottom;



    FT_Pos  cur_ref;

    FT_Pos  cur_delta;

    FT_Pos  cur_bottom;

    FT_Pos  cur_top;



  } PSH_Blue_ZoneRec, *PSH_Blue_Zone;





  typedef struct  PSH_Blue_TableRec_

  {

    FT_UInt           count;

    PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];



  } PSH_Blue_TableRec, *PSH_Blue_Table;





  /* blue zones table */

  typedef struct  PSH_BluesRec_

  {

    PSH_Blue_TableRec  normal_top;

    PSH_Blue_TableRec  normal_bottom;

    PSH_Blue_TableRec  family_top;

    PSH_Blue_TableRec  family_bottom;



    FT_Fixed           blue_scale;

    FT_Int             blue_shift;

    FT_Int             blue_threshold;

    FT_Int             blue_fuzz;

    FT_Bool            no_overshoots;



  } PSH_BluesRec, *PSH_Blues;





  /* font globals.                                         */

  /* dimension 0 => X coordinates + vertical hints/stems   */

  /* dimension 1 => Y coordinates + horizontal hints/stems */

  typedef struct  PSH_GlobalsRec_

  {

    FT_Memory         memory;

    PSH_DimensionRec  dimension[2];

    PSH_BluesRec      blues;



  } PSH_GlobalsRec;





#define PSH_BLUE_ALIGN_NONE  0

#define PSH_BLUE_ALIGN_TOP   1

#define PSH_BLUE_ALIGN_BOT   2





  typedef struct  PSH_AlignmentRec_

  {

    int     align;

    FT_Pos  align_top;

    FT_Pos  align_bot;



  } PSH_AlignmentRec, *PSH_Alignment;





  FT_LOCAL( void )

  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );





#if 0

  /* snap a stem width to fitter coordinates.  `org_width' is in font */

  /* units.  The result is in device pixels (26.6 format).            */

  FT_LOCAL( FT_Pos )

  psh_dimension_snap_width( PSH_Dimension  dimension,

                            FT_Int         org_width );

#endif



  FT_LOCAL( FT_Error )

  psh_globals_set_scale( PSH_Globals  globals,

                         FT_Fixed     x_scale,

                         FT_Fixed     y_scale,

                         FT_Fixed     x_delta,

                         FT_Fixed     y_delta );



  /* snap a stem to one or two blue zones */

  FT_LOCAL( void )

  psh_blues_snap_stem( PSH_Blues      blues,

                       FT_Int         stem_top,

                       FT_Int         stem_bot,

                       PSH_Alignment  alignment );

  /* */



#ifdef DEBUG_HINTER

  extern PSH_Globals  ps_debug_globals;

#endif





FT_END_HEADER





#endif /* __PSHGLOB_H__ */





/* END */

