/***************************************************************************/
/*                                                                         */
/*  psobjs.h                                                               */
/*                                                                         */
/*    Auxiliary functions for PostScript fonts (specification).            */
/*                                                                         */
/*  Copyright 1996-2000 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 PSOBJS_H
#define PSOBJS_H

#include <freetype/internal/psaux.h>


#ifdef __cplusplus
  extern "C" {
#endif


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                             T1_TABLE                          *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/


  FT_CALLBACK_TABLE
  const PS_Table_Funcs  ps_table_funcs;

  FT_CALLBACK_TABLE
  const T1_Parser_Funcs  t1_parser_funcs;

  FT_CALLBACK_TABLE
  const T1_Builder_Funcs  t1_builder_funcs;


  FT_LOCAL
  FT_Error  PS_Table_New( PS_Table*  table,
                          FT_Int     count,
                          FT_Memory  memory );

  FT_LOCAL
  FT_Error  PS_Table_Add( PS_Table*  table,
                          FT_Int     index,
                          void*      object,
                          FT_Int     length );

  FT_LOCAL
  void  PS_Table_Done( PS_Table*  table );


  FT_LOCAL
  void  PS_Table_Release( PS_Table*  table );


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                            T1 PARSER                          *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/


  FT_LOCAL
  void  T1_Skip_Spaces( T1_Parser*  parser );

  FT_LOCAL
  void  T1_Skip_Alpha( T1_Parser*  parser );

  FT_LOCAL
  void  T1_ToToken( T1_Parser*  parser,
                    T1_Token*   token );

  FT_LOCAL
  void  T1_ToTokenArray( T1_Parser*  parser,
                         T1_Token*   tokens,
                         FT_UInt     max_tokens,
                         FT_Int*     pnum_tokens );

  FT_LOCAL
  FT_Error  T1_Load_Field( T1_Parser*       parser,
                           const T1_Field*  field,
                           void**           objects,
                           FT_UInt          max_objects,
                           FT_ULong*        pflags );

  FT_LOCAL
  FT_Error  T1_Load_Field_Table( T1_Parser*       parser,
                                 const T1_Field*  field,
                                 void**           objects,
                                 FT_UInt          max_objects,
                                 FT_ULong*        pflags );

  FT_LOCAL
  FT_Long  T1_ToInt( T1_Parser*  parser );


  FT_LOCAL
  FT_Fixed  T1_ToFixed( T1_Parser*  parser,
                        FT_Int      power_ten );


  FT_LOCAL
  FT_Int  T1_ToCoordArray( T1_Parser*  parser,
                           FT_Int      max_coords,
                           FT_Short*   coords );

  FT_LOCAL
  FT_Int  T1_ToFixedArray( T1_Parser*  parser,
                           FT_Int      max_values,
                           FT_Fixed*   values,
                           FT_Int      power_ten );


  FT_LOCAL
  void  T1_Init_Parser( T1_Parser*  parser,
                        FT_Byte*    base,
                        FT_Byte*    limit,
                        FT_Memory   memory );

  FT_LOCAL
  void  T1_Done_Parser( T1_Parser*  parser );


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                            T1 BUILDER                         *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  FT_LOCAL
  void  T1_Builder_Init( T1_Builder*   builder,
                         FT_Face       face,
                         FT_Size       size,
                         FT_GlyphSlot  glyph );

  FT_LOCAL
  void  T1_Builder_Done( T1_Builder*  builder );

  FT_LOCAL
  FT_Error  T1_Builder_Check_Points( T1_Builder*  builder,
                                     FT_Int       count );

  FT_LOCAL
  void  T1_Builder_Add_Point( T1_Builder*  builder,
                              FT_Pos       x,
                              FT_Pos       y,
                              FT_Byte      flag );

  FT_LOCAL
  FT_Error  T1_Builder_Add_Point1( T1_Builder*  builder,
                                   FT_Pos       x,
                                   FT_Pos       y );

  FT_LOCAL
  FT_Error  T1_Builder_Add_Contour( T1_Builder*  builder );


  FT_LOCAL
  FT_Error  T1_Builder_Start_Point( T1_Builder*  builder,
                                    FT_Pos       x,
                                    FT_Pos       y );


  FT_LOCAL
  void  T1_Builder_Close_Contour( T1_Builder*  builder );


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                            OTHER                              *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  FT_LOCAL
  void  T1_Decrypt( FT_Byte*   buffer,
                    FT_Int     length,
                    FT_UShort  seed );


#ifdef __cplusplus
  }
#endif


#endif /* PSOBJS_H */


/* END */
