1 /****************************************************************************
   2  *
   3  * pshglob.h
   4  *
   5  *   PostScript hinter global hinting management.
   6  *
   7  * Copyright (C) 2001-2019 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 PSHGLOB_H_
  20 #define PSHGLOB_H_
  21 
  22 
  23 #include FT_FREETYPE_H
  24 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
  25 
  26 
  27 FT_BEGIN_HEADER
  28 
  29 
  30   /*************************************************************************/
  31   /*************************************************************************/
  32   /*****                                                               *****/
  33   /*****                    GLOBAL HINTS INTERNALS                     *****/
  34   /*****                                                               *****/
  35   /*************************************************************************/
  36   /*************************************************************************/
  37 
  38 
  39   /**************************************************************************
  40    *
  41    * @constant:
  42    *   PS_GLOBALS_MAX_BLUE_ZONES
  43    *
  44    * @description:
  45    *   The maximum number of blue zones in a font global hints structure.
  46    *   See @PS_Globals_BluesRec.
  47    */
  48 #define PS_GLOBALS_MAX_BLUE_ZONES  16
  49 
  50 
  51   /**************************************************************************
  52    *
  53    * @constant:
  54    *   PS_GLOBALS_MAX_STD_WIDTHS
  55    *
  56    * @description:
  57    *   The maximum number of standard and snap widths in either the
  58    *   horizontal or vertical direction.  See @PS_Globals_WidthsRec.
  59    */
  60 #define PS_GLOBALS_MAX_STD_WIDTHS  16
  61 
  62 
  63   /* standard and snap width */
  64   typedef struct  PSH_WidthRec_
  65   {
  66     FT_Int  org;
  67     FT_Pos  cur;
  68     FT_Pos  fit;
  69 
  70   } PSH_WidthRec, *PSH_Width;
  71 
  72 
  73   /* standard and snap widths table */
  74   typedef struct  PSH_WidthsRec_
  75   {
  76     FT_UInt       count;
  77     PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];
  78 
  79   } PSH_WidthsRec, *PSH_Widths;
  80 
  81 
  82   typedef struct  PSH_DimensionRec_
  83   {
  84     PSH_WidthsRec  stdw;
  85     FT_Fixed       scale_mult;
  86     FT_Fixed       scale_delta;
  87 
  88   } PSH_DimensionRec, *PSH_Dimension;
  89 
  90 
  91   /* blue zone descriptor */
  92   typedef struct  PSH_Blue_ZoneRec_
  93   {
  94     FT_Int  org_ref;
  95     FT_Int  org_delta;
  96     FT_Int  org_top;
  97     FT_Int  org_bottom;
  98 
  99     FT_Pos  cur_ref;
 100     FT_Pos  cur_delta;
 101     FT_Pos  cur_bottom;
 102     FT_Pos  cur_top;
 103 
 104   } PSH_Blue_ZoneRec, *PSH_Blue_Zone;
 105 
 106 
 107   typedef struct  PSH_Blue_TableRec_
 108   {
 109     FT_UInt           count;
 110     PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];
 111 
 112   } PSH_Blue_TableRec, *PSH_Blue_Table;
 113 
 114 
 115   /* blue zones table */
 116   typedef struct  PSH_BluesRec_
 117   {
 118     PSH_Blue_TableRec  normal_top;
 119     PSH_Blue_TableRec  normal_bottom;
 120     PSH_Blue_TableRec  family_top;
 121     PSH_Blue_TableRec  family_bottom;
 122 
 123     FT_Fixed           blue_scale;
 124     FT_Int             blue_shift;
 125     FT_Int             blue_threshold;
 126     FT_Int             blue_fuzz;
 127     FT_Bool            no_overshoots;
 128 
 129   } PSH_BluesRec, *PSH_Blues;
 130 
 131 
 132   /* font globals.                                         */
 133   /* dimension 0 => X coordinates + vertical hints/stems   */
 134   /* dimension 1 => Y coordinates + horizontal hints/stems */
 135   typedef struct  PSH_GlobalsRec_
 136   {
 137     FT_Memory         memory;
 138     PSH_DimensionRec  dimension[2];
 139     PSH_BluesRec      blues;
 140 
 141   } PSH_GlobalsRec;
 142 
 143 
 144 #define PSH_BLUE_ALIGN_NONE  0
 145 #define PSH_BLUE_ALIGN_TOP   1
 146 #define PSH_BLUE_ALIGN_BOT   2
 147 
 148 
 149   typedef struct  PSH_AlignmentRec_
 150   {
 151     int     align;
 152     FT_Pos  align_top;
 153     FT_Pos  align_bot;
 154 
 155   } PSH_AlignmentRec, *PSH_Alignment;
 156 
 157 
 158   FT_LOCAL( void )
 159   psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );
 160 
 161 
 162 #if 0
 163   /* snap a stem width to fitter coordinates.  `org_width' is in font */
 164   /* units.  The result is in device pixels (26.6 format).            */
 165   FT_LOCAL( FT_Pos )
 166   psh_dimension_snap_width( PSH_Dimension  dimension,
 167                             FT_Int         org_width );
 168 #endif
 169 
 170   FT_LOCAL( void )
 171   psh_globals_set_scale( PSH_Globals  globals,
 172                          FT_Fixed     x_scale,
 173                          FT_Fixed     y_scale,
 174                          FT_Fixed     x_delta,
 175                          FT_Fixed     y_delta );
 176 
 177   /* snap a stem to one or two blue zones */
 178   FT_LOCAL( void )
 179   psh_blues_snap_stem( PSH_Blues      blues,
 180                        FT_Int         stem_top,
 181                        FT_Int         stem_bot,
 182                        PSH_Alignment  alignment );
 183   /* */
 184 
 185 #ifdef DEBUG_HINTER
 186   extern PSH_Globals  ps_debug_globals;
 187 #endif
 188 
 189 
 190 FT_END_HEADER
 191 
 192 
 193 #endif /* PSHGLOB_H_ */
 194 
 195 
 196 /* END */