/***************************************************************************/
/*                                                                         */
/*  ahmodule.c                                                             */
/*                                                                         */
/*    Auto-hinting module implementation (declaration).                    */
/*                                                                         */
/*  Copyright 2000-2001, 2002 Catharon Productions Inc.                    */
/*  Author: David Turner                                                   */
/*                                                                         */
/*  This file is part of the Catharon Typography Project and shall only    */
/*  be used, modified, and distributed under the terms of the Catharon     */
/*  Open Source License that should come with this file under the name     */
/*  `CatharonLicense.txt'.  By continuing to use, modify, or distribute    */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/*  Note that this license is compatible with the FreeType license.        */
/*                                                                         */
/***************************************************************************/


#include <ft2build.h>
#include FT_MODULE_H
#include "ahhint.h"


#ifdef  DEBUG_HINTER
   AH_Hinter  ah_debug_hinter       = NULL;
   FT_Bool    ah_debug_disable_horz = 0;
   FT_Bool    ah_debug_disable_vert = 0;
#endif

  typedef struct  FT_AutoHinterRec_
  {
    FT_ModuleRec  root;
    AH_Hinter     hinter;

  } FT_AutoHinterRec;


  FT_CALLBACK_DEF( FT_Error )
  ft_autohinter_init( FT_AutoHinter  module )
  {
    FT_Error  error;


    error = ah_hinter_new( module->root.library, &module->hinter );
#ifdef DEBUG_HINTER
    if ( !error )
      ah_debug_hinter = module->hinter;
#endif
    return error;
  }


  FT_CALLBACK_DEF( void )
  ft_autohinter_done( FT_AutoHinter  module )
  {
    ah_hinter_done( module->hinter );

#ifdef DEBUG_HINTER
    ah_debug_hinter = NULL;
#endif
  }


  FT_CALLBACK_DEF( FT_Error )
  ft_autohinter_load_glyph( FT_AutoHinter  module,
                            FT_GlyphSlot   slot,
                            FT_Size        size,
                            FT_UInt        glyph_index,
                            FT_Int32       load_flags )
  {
    return ah_hinter_load_glyph( module->hinter,
                                 slot, size, glyph_index, load_flags );
  }


  FT_CALLBACK_DEF( void )
  ft_autohinter_reset_globals( FT_AutoHinter  module,
                               FT_Face        face )
  {
    FT_UNUSED( module );

    if ( face->autohint.data )
      ah_hinter_done_face_globals( (AH_Face_Globals)(face->autohint.data) );
  }


  FT_CALLBACK_DEF( void )
  ft_autohinter_get_globals( FT_AutoHinter  module,
                             FT_Face        face,
                             void**         global_hints,
                             long*          global_len )
  {
    ah_hinter_get_global_hints( module->hinter, face,
                                global_hints, global_len );
  }


  FT_CALLBACK_DEF( void )
  ft_autohinter_done_globals( FT_AutoHinter  module,
                              void*          global_hints )
  {
    ah_hinter_done_global_hints( module->hinter, global_hints );
  }


  FT_CALLBACK_TABLE_DEF
  const FT_AutoHinter_ServiceRec  ft_autohinter_service =
  {
    ft_autohinter_reset_globals,
    ft_autohinter_get_globals,
    ft_autohinter_done_globals,
    ft_autohinter_load_glyph
  };


  FT_CALLBACK_TABLE_DEF
  const FT_Module_Class  autohint_module_class =
  {
    ft_module_hinter,
    sizeof ( FT_AutoHinterRec ),

    "autohinter",
    0x10000L,   /* version 1.0 of the autohinter  */
    0x20000L,   /* requires FreeType 2.0 or above */

    (const void*) &ft_autohinter_service,

    (FT_Module_Constructor)ft_autohinter_init,
    (FT_Module_Destructor) ft_autohinter_done,
    (FT_Module_Requester)  0
  };


/* END */
