/*******************************************************************
 *
 *  t1gload.h                                                   1.0
 *
 *    Type1 Glyph Loader.
 *
 *  Copyright 1996-1998 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.
 *
 *
 *  The Type 1 glyph loader uses three distinct objects to build
 *  scaled and hinted outlines from a charstrings program. These are :
 *
 *  - a glyph builder, T1_Builder, used to store the built outline
 *
 *  - a glyph hinter, T1_Hinter, used to record and apply the stem
 *    hints
 *
 *  - a charstrings interpreter, T1_Decoder, used to parse the
 *    Type 1 charstrings stream, manage a stack and call the builder
 *    and/or hinter depending on the opcodes.
 *
 *  Ideally, a Type 2 glyph loader would only need to have its own
 *  T2_Decoder object (assuming the hinter is able to manage all
 *  kinds of hints).
 *
 ******************************************************************/

#ifndef T1GLOAD_H
#define T1GLOAD_H

#include <t1objs.h>

#ifdef __cplusplus
  extern "C" {
#endif


/*************************************************************************/
/*                                                                       */
/* <Structure> T1_Builder_Funcs                                          */
/*                                                                       */
/* <Description>                                                         */
/*     a structure used to store the address of various functions        */
/*     used by a glyph builder to implement the outline's "path          */
/*     construction".                                                    */
/*                                                                       */
/*                                                                       */
  typedef struct T1_Builder_  T1_Builder;

  typedef T1_Error  (*T1_Builder_EndChar)( T1_Builder*  loader );

  typedef T1_Error  (*T1_Builder_Sbw)    ( T1_Builder*  loader,
                                           T1_Pos       sbx,
                                           T1_Pos       sby,
                                           T1_Pos       wx,
                                           T1_Pos       wy );

  typedef T1_Error  (*T1_Builder_ClosePath)( T1_Builder*  loader );

  typedef T1_Error  (*T1_Builder_RLineTo)( T1_Builder*  loader,
                                           T1_Pos       dx,
                                           T1_Pos       dy );

  typedef T1_Error  (*T1_Builder_RMoveTo)( T1_Builder*  loader,
                                           T1_Pos       dx,
                                           T1_Pos       dy );

  typedef T1_Error  (*T1_Builder_RCurveTo)( T1_Builder*  loader,
                                            T1_Pos       dx1,
                                            T1_Pos       dy1,
                                            T1_Pos       dx2,
                                            T1_Pos       dy2,
                                            T1_Pos       dx3,
                                            T1_Pos       dy3 );

  typedef struct T1_Builder_Funcs_
  {
    T1_Builder_EndChar    end_char;
    T1_Builder_Sbw        set_bearing_point;
    T1_Builder_ClosePath  close_path;
    T1_Builder_RLineTo    rline_to;
    T1_Builder_RMoveTo    rmove_to;
    T1_Builder_RCurveTo   rcurve_to;

  } T1_Builder_Funcs;



/*************************************************************************/
/*                                                                       */
/* <Structure> T1_Builder                                                */
/*                                                                       */
/* <Description>                                                         */
/*     a structure used during glyph loading to store its outline.       */
/*                                                                       */
/* <Fields>                                                              */
/*    system :: current system object                                    */
/*    face   :: current face object                                      */
/*    size   :: current size object                                      */
/*    glyph  :: current glyph slot                                       */
/*                                                                       */
/*    current :: current glyph outline                                   */
/*    base    :: base glyph outline                                      */
/*                                                                       */
/*    max_points   :: maximum points in builder outline                  */
/*    max_contours :: maximum contours in builder outline                */
/*                                                                       */
/*    last     :: last point position                                    */
/*                                                                       */
/*    scale_x  :: horizontal scale ( FUnits to sub-pixels )              */
/*    scale_y  :: vertical scale   ( FUnits to sub-pixels )              */
/*    pos_x    :: horizontal translation (composite glyphs)              */
/*    pos_y    :: vertical translation   (composite glyph)               */
/*                                                                       */
/*    left_bearing  :: left side bearing point                           */
/*    advance       :: horizontal advance vector                         */
/*                                                                       */
/*    path_begun    :: flag, indicates that a new path has begun         */
/*    load_points   :: flag, if not set, no points are loaded            */
/*                                                                       */
/*    pass     :: pass number for multi-pass hinters                     */
/*                                                                       */
/*    funcs    :: table of builder functions used to perform             */
/*                the outline's path construction                        */
/*                                                                       */
/*    hint_point :: index of next point to hint..                        */
/*                                                                       */
/*                                                                       */
/*                                                                       */
/*                                                                       */

  struct T1_Builder_
  {
    FT_Memory     memory;
    T1_Face       face;
    T1_Size       size;
    T1_GlyphSlot  glyph;

    FT_Outline    current;       /* the current glyph outline   */
    FT_Outline    base;          /* the composite glyph outline */

    T1_Int        max_points;    /* capacity of base outline in points   */
    T1_Int        max_contours;  /* capacity of base outline in contours */

    T1_Vector     last;

    T1_Fixed      scale_x;
    T1_Fixed      scale_y;

    T1_Pos        pos_x;
    T1_Pos        pos_y;

    T1_Vector     left_bearing;
    T1_Vector     advance;
    T1_Bool       no_recurse;

    T1_BBox       bbox;          /* bounding box */
    T1_Bool       path_begun;
    T1_Bool       load_points;

    T1_Int        pass;
    T1_Int        hint_point;

    /* path construction function interface */
    T1_Builder_Funcs  funcs;
  };


/*************************************************************************/
/*                                                                       */
/* <Structure> T1_Hinter_Funcs                                           */
/*                                                                       */
/* <Description>                                                         */
/*     a structure used to store the address of various functions        */
/*     used by a Type 1 hinter to perform outline hinting.               */
/*                                                                       */

  typedef T1_Error  (*T1_Hinter_ChangeHints)( T1_Builder*  builder );

  typedef T1_Error  (*T1_Hinter_DotSection)( T1_Builder*  builder );

  typedef T1_Error  (*T1_Hinter_Stem)( T1_Builder*  builder,
                                       T1_Pos       pos,
                                       T1_Pos       width,
                                       T1_Bool      vertical );


  typedef T1_Error  (*T1_Hinter_Stem3)( T1_Builder*  builder,
                                        T1_Pos       pos0,
                                        T1_Pos       width0,
                                        T1_Pos       pos1,
                                        T1_Pos       width1,
                                        T1_Pos       pos2,
                                        T1_Pos       width2,
                                        T1_Bool      vertical );

  typedef struct T1_Hinter_Func_
  {
    T1_Hinter_ChangeHints     change_hints;
    T1_Hinter_DotSection      dot_section;
    T1_Hinter_Stem            stem;
    T1_Hinter_Stem3           stem3;

  } T1_Hinter_Funcs;



  typedef enum T1_Operator_
  {
    op_none = 0,
    op_endchar,
    op_hsbw,
    op_seac,
    op_sbw,
    op_closepath,
    op_hlineto,
    op_hmoveto,
    op_hvcurveto,
    op_rlineto,
    op_rmoveto,
    op_rrcurveto,
    op_vhcurveto,
    op_vlineto,
    op_vmoveto,
    op_dotsection,
    op_hstem,
    op_hstem3,
    op_vstem,
    op_vstem3,
    op_div,
    op_callothersubr,
    op_callsubr,
    op_pop,
    op_return,
    op_setcurrentpoint,

    op_max    /* never remove this one */

  } T1_Operator;




  /* execution context charstring zone */
  typedef struct T1_Decoder_Zone_
  {
    T1_Byte*  base;
    T1_Byte*  limit;
    T1_Byte*  cursor;

  } T1_Decoder_Zone;


  typedef struct T1_Decoder_
  {
    T1_Builder         builder;
    T1_Hinter_Funcs    hinter;

    T1_Int             stack[ T1_MAX_CHARSTRINGS_OPERANDS ];
    T1_Int*            top;

    T1_Decoder_Zone    zones[ T1_MAX_SUBRS_CALLS+1 ];
    T1_Decoder_Zone*   zone;

    T1_Int             flex_state;
    T1_Int             num_flex_vectors;
    T1_Vector          flex_vectors[7];

  } T1_Decoder;



/*********************************************************************
 *
 * <Function>
 *    T1_Init_Builder
 *
 * <Description>
 *    Initialise a given glyph builder.
 *
 * <Input>
 *    builder :: glyph builder to initialise
 *    face    :: current face object
 *    size    :: current size object
 *    glyph   :: current glyph object
 *    funcs   :: glyph builder functions (or "methods").
 *
 * <Note>
 *    This function is exported for now because it is used by the
 *    "t1dump" utility. Later, it will be accessed through a
 *    format-specific extension
 *
 *********************************************************************/

  LOCAL_DEF
  void  T1_Init_Builder( T1_Builder*             builder,
                         T1_Face                 face,
                         T1_Size                 size,
                         T1_GlyphSlot            glyph,
                         const T1_Builder_Funcs* funcs );

/*********************************************************************
 *
 * <Function>
 *    T1_Done_Builder
 *
 * <Description>
 *    Finalise a given glyph builder. Its content can still be
 *    used after the call, but the function saves important information
 *    within the corresponding glyph slot.
 *
 * <Input>
 *    builder :: glyph builder to initialise
 *
 * <Note>
 *    This function is exported for now because it is used by the
 *    "t1dump" utility. Later, it will be accessed through a
 *    format-specific extension
 *
 *********************************************************************/

  LOCAL_DEF
  void T1_Done_Builder( T1_Builder*  builder );


/*********************************************************************
 *
 * <Function>
 *    T1_Init_Decoder
 *
 * <Description>
 *    Initialise a given Type 1 decoder for parsing
 *
 * <Input>
 *    decoder :: Type 1 decoder to initialise
 *    funcs   :: hinter functions interface
 *
 * <Note>
 *    This function is exported for now because it is used by the
 *    "t1dump" utility. Later, it will be accessed through a
 *    format-specific extension
 *
 *********************************************************************/

  LOCAL_DEF
  void  T1_Init_Decoder( T1_Decoder*             decoder,
                         const T1_Hinter_Funcs*  funcs );



  /* Compute the maximum advance width of a font through quick parsing */
  LOCAL_DEF
  T1_Error  T1_Compute_Max_Advance( T1_Face  face,
                                    T1_Int  *max_advance );


  /* This function is exported, because it is used by the T1Dump utility */
  LOCAL_DEF
  T1_Error   T1_Parse_CharStrings( T1_Decoder*  decoder,
                                   T1_Byte*     charstring_base,
                                   T1_Int       charstring_len,
                                   T1_Int       num_subrs,
                                   T1_Byte**    subrs_base,
                                   T1_Int*      subrs_len );



/*************************************************************************/
/*                                                                       */
/* <Function> T1_Add_Points                                              */
/*                                                                       */
/* <Description>                                                         */
/*    Checks that there is enough room in the current load glyph outline */
/*    to accept "num_points" additional outline points. If not, this     */
/*    function grows the load outline's arrays accordingly..             */
/*                                                                       */
/* <Input>                                                               */
/*    builder    :: pointer to glyph builder object                      */
/*    num_points :: number of points that will be added later            */
/*                                                                       */
/* <Return>                                                              */
/*    Type1 error code. 0 means success                                  */
/*                                                                       */
/* <Note>                                                                */
/*    This function does NOT update the points count in the glyph loader */
/*    This must be done by the caller itself, after this function is     */
/*    invoked..                                                          */
/*                                                                       */
  LOCAL_DEF
  T1_Error  T1_Add_Points( T1_Builder*  builder,
                           T1_Int       num_points );

/*************************************************************************/
/*                                                                       */
/* <Function> T1_Add_Contours                                            */
/*                                                                       */
/* <Description>                                                         */
/*    Checks that there is enough room in the current load glyph outline */
/*    to accept "num_contours" additional contours. If not, this func    */
/*    the load outline's arrays accordingly..                            */
/*                                                                       */
/* <Input>                                                               */
/*    builder      :: pointer to glyph builder object                    */
/*    num_contours :: number of contours that will be added later        */
/*                                                                       */
/* <Return>                                                              */
/*    Type1 error code. 0 means success                                  */
/*                                                                       */
/* <Note>                                                                */
/*    This function does NOT update the contours count in the load glyph */
/*    This must be done by the caller itself, after this function is     */
/*    invoked..                                                          */
/*                                                                       */
  LOCAL_DEF
  T1_Error  T1_Add_Contours( T1_Builder*  builder,
                             T1_Int       num_contours );


  LOCAL_DEF
  T1_Error  T1_Load_Glyph( T1_GlyphSlot  glyph,
                           T1_Size       size,
                           T1_Int        glyph_index,
                           T1_Int        load_flags );


#ifdef __cplusplus
  }
#endif

#endif /* T1GLOAD_H */
