#ifndef __AFLATIN_H__
#define __AFLATIN_H__

#include "afhints.h"

FT_BEGIN_HEADER

 /*
  * the latin-specific script class
  *
  */
  FT_LOCAL( const AF_ScriptClassRec )    af_latin_script_class;

 /***************************************************************************/
 /***************************************************************************/
 /*****                                                                 *****/
 /*****       L A T I N   G L O B A L   M E T R I C S                   *****/
 /*****                                                                 *****/
 /***************************************************************************/
 /***************************************************************************/

 /*
  * the following declarations could be embedded in the file "aflatin.c"
  * they've been made semi-public to allow alternate script hinters to
  * re-use some of them
  */

 /*
  *  Latin (global) metrics management
  *
  */

  enum
  {
    AF_LATIN_BLUE_CAPITAL_TOP,
    AF_LATIN_BLUE_CAPITAL_BOTTOM,
    AF_LATIN_BLUE_SMALL_F_TOP,
    AF_LATIN_BLUE_SMALL_TOP,
    AF_LATIN_BLUE_SMALL_BOTTOM,
    AF_LATIN_BLUE_SMALL_MINOR,

    AF_LATIN_BLUE_MAX
  };

#define AF_LATIN_IS_TOP_BLUE( b )  ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \
                                     (b) == AF_LATIN_BLUE_SMALL_F_TOP || \
                                     (b) == AF_LATIN_BLUE_SMALL_TOP   )

#define  AF_LATIN_MAX_WIDTHS     16
#define  AF_LATIN_MAX_BLUES      AF_LATIN_BLUE_MAX

  enum
  {
    AF_LATIN_BLUE_ACTIVE     = (1 << 0),
    AF_LATIN_BLUE_TOP        = (1 << 1),
    AF_LATIN_BLUE_ADJUSTMENT = (1 << 2),  /* used for scale adjustment */
                                          /* optimization              */
    AF_LATIN_BLUE_FLAG_MAX
  };


  typedef struct AF_LatinBlueRec_
  {
    AF_WidthRec   ref;
    AF_WidthRec   shoot;
    FT_UInt       flags;

  } AF_LatinBlueRec, *AF_LatinBlue;


  typedef struct AF_LatinAxisRec_
  {
    FT_Fixed         scale;
    FT_Pos           delta;

    FT_UInt          width_count;
    AF_WidthRec      widths[ AF_LATIN_MAX_WIDTHS ];
    FT_Pos           edge_distance_threshold;

   /* ignored for horizontal metrics */
    FT_Bool          control_overshoot;
    FT_UInt          blue_count;
    AF_LatinBlueRec  blues[ AF_LATIN_BLUE_MAX ];

    FT_Fixed         org_scale;
    FT_Pos           org_delta;

  } AF_LatinAxisRec, *AF_LatinAxis;


  typedef struct AF_LatinMetricsRec_
  {
    AF_ScriptMetricsRec   root;
    FT_UInt               units_per_em;
    AF_LatinAxisRec       axis[ AF_DIMENSION_MAX ];

  } AF_LatinMetricsRec, *AF_LatinMetrics;



  FT_LOCAL( FT_Error )
  af_latin_metrics_init( AF_LatinMetrics  metrics,
                         FT_Face          face );

  FT_LOCAL( void )
  af_latin_metrics_scale( AF_LatinMetrics  metrics,
                          AF_Scaler        scaler );



 /***************************************************************************/
 /***************************************************************************/
 /*****                                                                 *****/
 /*****            L A T I N   G L Y P H   A N A L Y S I S              *****/
 /*****                                                                 *****/
 /***************************************************************************/
 /***************************************************************************/

  enum
  {
    AF_LATIN_HINTS_HORZ_SNAP   = (1 << 0),  /* enable stem width snapping  */
    AF_LATIN_HINTS_VERT_SNAP   = (1 << 1),  /* enable stem height snapping */
    AF_LATIN_HINTS_STEM_ADJUST = (1 << 2),  /* enable stem width/height adjustment */
    AF_LATIN_HINTS_MONO        = (1 << 3)   /* indicate monochrome rendering */
  };

#define  AF_LATIN_HINTS_DO_HORZ_SNAP(h) \
   AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_HORZ_SNAP)

#define  AF_LATIN_HINTS_DO_VERT_SNAP(h) \
   AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_VERT_SNAP)

#define  AF_LATIN_HINTS_DO_STEM_ADJUST(h)  \
   AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_STEM_ADJUST)

#define  AF_LATIN_HINTS_DO_MONO(h)  \
   AF_HINTS_TEST_OTHER(h,AF_LATIN_HINTS_MONO)


 /* this shouldn't normally be exported. However, other scripts might
  * like to use this function as-is
  */
  FT_LOCAL( void )
  af_latin_hints_compute_segments( AF_GlyphHints  hints,
                                   AF_Dimension   dim );

 /* this shouldn't normally be exported. However, other scripts might
  * want to use this function as-is
  */
  FT_LOCAL( void )
  af_latin_hints_link_segments( AF_GlyphHints  hints,
                                AF_Dimension   dim );

 /* this shouldn't normally be exported. However, other scripts might
  * want to use this function as-is
  */
  FT_LOCAL( void )
  af_latin_hints_compute_edges( AF_GlyphHints  hints,
                                AF_Dimension   dim );

  FT_LOCAL( void )
  af_latin_hints_detect_features( AF_GlyphHints  hints,
                                  AF_Dimension   dim );

/* */

FT_END_HEADER

#endif /* __AFLATIN_H__ */
