shithub: freetype+ttf2subf

ref: 98289a2a65a79c329f769882a45f6aada7123fc0
dir: /src/pshinter/pshalgo2.h/

View raw version
/***************************************************************************/
/*                                                                         */
/*  pshalgo2.h                                                             */
/*                                                                         */
/*    First (basic) Postscript hinting routines                            */
/*                                                                         */
/*  Copyright 2001 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 __PS_HINTER_ALGO2_H__
#define __PS_HINTER_ALGO2_H__

#include "pshrec.h"
#include "pshglob.h"
#include FT_TRIGONOMETRY_H

FT_BEGIN_HEADER

  typedef struct PSH2_HintRec_*   PSH2_Hint;

  typedef enum
  {
    PSH2_HINT_GHOST  = PS_HINT_FLAG_GHOST,
    PSH2_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
    PSH2_HINT_ACTIVE = 4,
    PSH2_HINT_FITTED = 8  
  } PSH2_Hint_Flags;

#define  psh2_hint_is_active(x)  (((x)->flags  & PSH2_HINT_ACTIVE) != 0)
#define  psh2_hint_is_ghost(x)   (((x)->flags  & PSH2_HINT_GHOST)  != 0)  
#define  psh2_hint_is_fitted(x)  (((x)->flags  & PSH2_HINT_FITTED) != 0)

#define  psh2_hint_activate(x)     (x)->flags |=  PSH2_HINT_ACTIVE
#define  psh2_hint_deactivate(x)   (x)->flags &= ~PSH2_HINT_ACTIVE
#define  psh2_hint_set_fitted(x)   (x)->flags |=  PSH2_HINT_FITTED

  typedef struct PSH2_HintRec_
  {
    FT_Int     org_pos;
    FT_Int     org_len;
    FT_Pos     cur_pos;
    FT_Pos     cur_len;
    FT_UInt    flags;
    PSH2_Hint  parent;
    FT_Int     order;
  
  } PSH2_HintRec;


 /* this is an interpolation zone used for strong points   */
 /* weak points are interpolated according to their strong */
 /* neighbours..                                           */
  typedef struct PSH2_ZoneRec_
  {
    FT_Fixed  scale;
    FT_Fixed  delta;
    FT_Pos    min;
    FT_Pos    max;
    
  } PSH2_ZoneRec, *PSH2_Zone;


  typedef struct PSH2_Hint_TableRec_
  {
    FT_UInt        max_hints;
    FT_UInt        num_hints;
    PSH2_Hint      hints;
    PSH2_Hint*     sort;
    PSH2_Hint*     sort_global;
    FT_UInt        num_zones;
    PSH2_Zone      zones;
    PSH2_Zone      zone;
    PS_Mask_Table  hint_masks;
    PS_Mask_Table  counter_masks;
    
  } PSH2_Hint_TableRec, *PSH2_Hint_Table;

  typedef struct PSH2_PointRec_*    PSH2_Point;
  typedef struct PSH2_ContourRec_*  PSH2_Contour;
  
  enum
  {
    PSH2_DIR_NONE   =  4,
    PSH2_DIR_UP     =  1,
    PSH2_DIR_DOWN   = -1,
    PSH2_DIR_LEFT   = -2,
    PSH2_DIR_RIGHT  =  2
  };
  
  enum
  {
    PSH2_POINT_OFF    = 1,   /* point is off the curve  */
    PSH2_POINT_STRONG = 2,   /* point is strong         */
    PSH2_POINT_SMOOTH = 4,   /* point is smooth         */
    PSH2_POINT_FITTED = 8    /* point is already fitted */
  };


  typedef struct PSH2_PointRec_
  {
    PSH2_Point    prev;
    PSH2_Point    next;
    PSH2_Contour  contour;
    FT_UInt       flags;
    FT_Char       dir_in;
    FT_Char       dir_out;
    FT_Angle      angle_in;
    FT_Angle      angle_out;
    PSH2_Hint     hint;
    FT_Pos        org_u;
    FT_Pos        cur_u;
#ifdef DEBUG_HINTER
    FT_Pos        org_x;
    FT_Pos        cur_x;
    FT_Pos        org_y;
    FT_Pos        cur_y;
    FT_UInt       flags_x;
    FT_UInt       flags_y;
#endif    
    
  } PSH2_PointRec;

#define  psh2_point_is_strong(p)   ((p)->flags & PSH2_POINT_STRONG)
#define  psh2_point_is_fitted(p)   ((p)->flags & PSH2_POINT_FITTED)
#define  psh2_point_is_smooth(p)   ((p)->flags & PSH2_POINT_SMOOTH)

#define  psh2_point_set_strong(p)  (p)->flags |= PSH2_POINT_STRONG
#define  psh2_point_set_fitted(p)  (p)->flags |= PSH2_POINT_FITTED
#define  psh2_point_set_smooth(p)  (p)->flags |= PSH2_POINT_SMOOTH

  typedef struct PSH2_ContourRec_
  {
    PSH2_Point  start;
    FT_UInt     count;
   
  } PSH2_ContourRec;

  

  typedef struct PSH2_GlyphRec_
  {
    FT_UInt             num_points;
    FT_UInt             num_contours;
    
    PSH2_Point          points;
    PSH2_Contour        contours;
               
    FT_Memory           memory;
    FT_Outline*         outline;
    PSH_Globals         globals;
    PSH2_Hint_TableRec  hint_tables[2];
    
    FT_Bool             vertical;
    FT_Int              major_dir;
    FT_Int              minor_dir;
    
  } PSH2_GlyphRec, *PSH2_Glyph;


#ifdef DEBUG_HINTER  
  extern  PSH2_Hint_Table  ps2_debug_hint_table;

  typedef void  (*PSH2_HintFunc)( PSH2_Hint  hint, FT_Bool vertical );
  extern  PSH2_HintFunc    ps2_debug_hint_func;
  
  extern  PSH2_Glyph       ps2_debug_glyph;
#endif


  extern FT_Error
  ps2_hints_apply( PS_Hints      ps_hints,
                   FT_Outline*   outline,
                   PSH_Globals   globals );

FT_END_HEADER

#endif /* __PS_HINTS_ALGO_2_H__ */