update for HEAD-2003050101
[reactos.git] / lib / freetype / src / pshinter / pshalgo2.h
diff --git a/lib/freetype/src/pshinter/pshalgo2.h b/lib/freetype/src/pshinter/pshalgo2.h
new file mode 100644 (file)
index 0000000..405d34b
--- /dev/null
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshalgo2.h                                                             */
+/*                                                                         */
+/*    PostScript hinting algorithm 2 (specification).                      */
+/*                                                                         */
+/*  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 __PSHALGO2_H__
+#define __PSHALGO2_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_Render_Mode  hint_mode );
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHALGO2_H__ */
+
+
+/* END */