/***************************************************************************/
/*                                                                         */
/*  pshints.h                                                              */
/*                                                                         */
/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */
/*    recorders (specification only).  These are used to support native    */
/*    T1/T2 hints in the "type1", "cid" and "cff" font drivers.            */
/*                                                                         */
/*  Copyright 2001, 2002 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 __PSHINTS_H__
#define __PSHINTS_H__


#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_TYPE1_TABLES_H


FT_BEGIN_HEADER


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  typedef struct PSH_GlobalsRec_*  PSH_Globals;

  typedef FT_Error
  (*PSH_Globals_NewFunc)( FT_Memory     memory,
                          T1_Private*   private_dict,
                          PSH_Globals*  aglobals );

  typedef FT_Error
  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,
                               FT_Fixed     x_scale,
                               FT_Fixed     y_scale,
                               FT_Fixed     x_delta,
                               FT_Fixed     y_delta );

  typedef void
  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );


  typedef struct  PSH_Globals_FuncsRec_
  {
    PSH_Globals_NewFunc       create;
    PSH_Globals_SetScaleFunc  set_scale;
    PSH_Globals_DestroyFunc   destroy;

  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  /*************************************************************************/
  /*                                                                       */
  /* @type:                                                                */
  /*    T1_Hints                                                           */
  /*                                                                       */
  /* @description:                                                         */
  /*    This is a handle to an opaque structure used to record glyph hints */
  /*    from a Type 1 character glyph character string.                    */
  /*                                                                       */
  /*    The methods used to operate on this object are defined by the      */
  /*    @T1_Hints_FuncsRec structure.  Recording glyph hints is normally   */
  /*    achieved through the following scheme:                             */
  /*                                                                       */
  /*    - Open a new hint recording session by calling the "open" method.  */
  /*      This will rewind the recorder and prepare it for new input.      */
  /*                                                                       */
  /*    - For each hint found in the glyph charstring, call the            */
  /*      corresponding method ("stem", "stem3", or "reset").  Note that   */
  /*      these functions do not return an error code.                     */
  /*                                                                       */
  /*    - Close the recording session by calling the "close" method.  It   */
  /*      will return an error code if the hints were invalid or something */
  /*      strange happened (e.g. memory shortage).                         */
  /*                                                                       */
  /*    The hints accumulated in the object can later be used by the       */
  /*    PostScript hinter.                                                 */
  /*                                                                       */
  typedef struct T1_HintsRec_*  T1_Hints;


  /*************************************************************************/
  /*                                                                       */
  /* @type:                                                                */
  /*    T1_Hints_Funcs                                                     */
  /*                                                                       */
  /* @description:                                                         */
  /*    A pointer to the @T1_Hints_FuncsRec structure that defines the     */
  /*    API of a given @T1_Hints object.                                   */
  /*                                                                       */
  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T1_Hints_OpenFunc                                                  */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T1_Hints class used to prepare it for a new       */
  /*    Type 1 hints recording session.                                    */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints :: A handle to the Type 1 hints recorder.                    */
  /*                                                                       */
  /* @note:                                                                */
  /*    You should always call the @T1_Hints_CloseFunc method in order to  */
  /*    close an opened recording session.                                 */
  /*                                                                       */
  typedef void
  (*T1_Hints_OpenFunc)( T1_Hints  hints );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T1_Hints_SetStemFunc                                               */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T1_Hints class used to record a new horizontal or */
  /*    vertical stem.  This corresponds to the Type 1 "hstem" and "vstem" */
  /*    operators.                                                         */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 1 hints recorder.                */
  /*                                                                       */
  /*    dimension :: 0 for horizontal stems (hstem), 1 for vertical ones   */
  /*                 (vstem).                                              */
  /*                                                                       */
  /*    coords    :: Array of 2 integers, used as (position,length) stem   */
  /*                 descriptor.                                           */
  /*                                                                       */
  /* @note:                                                                */
  /*    Use vertical coordinates (y) for horizontal stems (dim=0).  Use    */
  /*    horizontal coordinates (x) for vertical stems (dim=1).             */
  /*                                                                       */
  /*    "coords[0]" is the absolute stem position (lowest coordinate);     */
  /*    "coords[1]" is the length.                                         */
  /*                                                                       */
  /*    The length can be negative, in which case it must be either -20 or */
  /*    -21.  It will be interpreted as a "ghost" stem, according to       */
  /*    Type 1 specification.                                              */
  /*                                                                       */
  /*    If the length is -21 (corresponding to a bottom ghost stem), then  */
  /*    the real stem position is "coords[0]+coords[1]".                   */
  /*                                                                       */
  typedef void
  (*T1_Hints_SetStemFunc)( T1_Hints  hints,
                           FT_UInt   dimension,
                           FT_Long*  coords );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T1_Hints_SetStem3Func                                              */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T1_Hints class used to record three               */
  /*    counter-controlled horizontal or vertical stems at once.           */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 1 hints recorder.                */
  /*                                                                       */
  /*    dimension :: 0 for horizontal stems, 1 for vertical ones.          */
  /*                                                                       */
  /*    coords    :: An array of 6 integers, holding 3 (position,length)   */
  /*                 pairs for the counter-controlled stems.               */
  /*                                                                       */
  /* @note:                                                                */
  /*    Use vertical coordinates (y) for horizontal stems (dim=0).  Use    */
  /*    horizontal coordinates (x) for vertical stems (dim=1).             */
  /*                                                                       */
  /*    The lengths cannot be negative (ghost stems are never              */
  /*    counter-controlled).                                               */
  /*                                                                       */
  typedef void
  (*T1_Hints_SetStem3Func)( T1_Hints  hints,
                            FT_UInt   dimension,
                            FT_Long*  coords );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T1_Hints_ResetFunc                                                 */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T1_Hints class used to reset the stems hints in a */
  /*    recording session.                                                 */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 1 hints recorder.                */
  /*                                                                       */
  /*    end_point :: The index of the last point in the input glyph in     */
  /*                 which the previously defined hints apply.             */
  /*                                                                       */
  typedef void
  (*T1_Hints_ResetFunc)( T1_Hints  hints,
                         FT_UInt   end_point );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T1_Hints_CloseFunc                                                 */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T1_Hints class used to close a hint recording     */
  /*    session.                                                           */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 1 hints recorder.                */
  /*                                                                       */
  /*    end_point :: The index of the last point in the input glyph.       */
  /*                                                                       */
  /* @return:                                                              */
  /*    FreeType error code.  0 means success.                             */
  /*                                                                       */
  /* @note:                                                                */
  /*    The error code will be set to indicate that an error occured       */
  /*    during the recording session.                                      */
  /*                                                                       */
  typedef FT_Error
  (*T1_Hints_CloseFunc)( T1_Hints  hints,
                         FT_UInt   end_point );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T1_Hints_ApplyFunc                                                 */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T1_Hints class used to apply hints to the         */
  /*    corresponding glyph outline.  Must be called once all hints have   */
  /*    been recorded.                                                     */
  /*                                                                       */
  /* @input:                                                               */
  /*   hints      :: A handle to the Type 1 hints recorder.                */
  /*                                                                       */
  /*   outline    :: A pointer to the target outline descriptor.           */
  /*                                                                       */
  /*   globals    :: The hinter globals for this font.                     */
  /*                                                                       */
  /*   hint_flags :: Hinter bit flags.                                     */
  /*                                                                       */
  /* @return:                                                              */
  /*   FreeType error code.  0 means success.                              */
  /*                                                                       */
  /* @note:                                                                */
  /*    On input, all points within the outline are in font coordinates.   */
  /*    On output, they are in 1/64th of pixels.                           */
  /*                                                                       */
  /*    The scaling transformation is taken from the "globals" object      */
  /*    which must correspond to the same font as the glyph.               */
  /*                                                                       */
  typedef FT_Error
  (*T1_Hints_ApplyFunc)( T1_Hints        hints,
                         FT_Outline*     outline,
                         PSH_Globals     globals,
                         FT_Render_Mode  hint_mode );


  /*************************************************************************/
  /*                                                                       */
  /* @struct:                                                              */
  /*    T1_Hints_FuncsRec                                                  */
  /*                                                                       */
  /* @description:                                                         */
  /*    The structure used to provide the API to @T1_Hints objects.        */
  /*                                                                       */
  /* @fields:                                                              */
  /*    hints :: A handle to the T1 Hints recorder.                        */
  /*                                                                       */
  /*    open  :: The function to open a recording session.                 */
  /*                                                                       */
  /*    close :: The function to close a recording session.                */
  /*                                                                       */
  /*    stem  :: The function to set a simple stem.                        */
  /*                                                                       */
  /*    stem3 :: The function to set counter-controlled stems.             */
  /*                                                                       */
  /*    reset :: The function to reset stem hints.                         */
  /*                                                                       */
  /*    apply :: The function to apply the hints to the corresponding      */
  /*             glyph outline.                                            */
  /*                                                                       */
  typedef struct  T1_Hints_FuncsRec_
  {
    T1_Hints               hints;
    T1_Hints_OpenFunc      open;
    T1_Hints_CloseFunc     close;
    T1_Hints_SetStemFunc   stem;
    T1_Hints_SetStem3Func  stem3;
    T1_Hints_ResetFunc     reset;
    T1_Hints_ApplyFunc     apply;

  } T1_Hints_FuncsRec;


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  /*************************************************************************/
  /*                                                                       */
  /* @type:                                                                */
  /*    T2_Hints                                                           */
  /*                                                                       */
  /* @description:                                                         */
  /*    This is a handle to an opaque structure used to record glyph hints */
  /*    from a Type 2 character glyph character string.                    */
  /*                                                                       */
  /*    The methods used to operate on this object are defined by the      */
  /*    @T2_Hints_FuncsRec structure.  Recording glyph hints is normally   */
  /*    achieved through the following scheme:                             */
  /*                                                                       */
  /*    - Open a new hint recording session by calling the "open" method.  */
  /*      This will rewind the recorder and prepare it for new input.      */
  /*                                                                       */
  /*    - For each hint found in the glyph charstring, call the            */
  /*      corresponding method ("stems", "hintmask", "counters").  Note    */
  /*      that these functions do not return an error code.                */
  /*                                                                       */
  /*    - Close the recording session by calling the "close" method.  It   */
  /*      will return an error code if the hints were invalid or something */
  /*      strange happened (e.g. memory shortage).                         */
  /*                                                                       */
  /*    The hints accumulated in the object can later be used by the       */
  /*    Postscript hinter.                                                 */
  /*                                                                       */
  typedef struct T2_HintsRec_*  T2_Hints;


  /*************************************************************************/
  /*                                                                       */
  /* @type:                                                                */
  /*    T2_Hints_Funcs                                                     */
  /*                                                                       */
  /* @description:                                                         */
  /*    A pointer to the @T2_Hints_FuncsRec structure that defines the API */
  /*    of a given @T2_Hints object.                                       */
  /*                                                                       */
  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T2_Hints_OpenFunc                                                  */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T2_Hints class used to prepare it for a new       */
  /*    Type 2 hints recording session.                                    */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints :: A handle to the Type 2 hints recorder.                    */
  /*                                                                       */
  /* @note:                                                                */
  /*    You should always call the @T2_Hints_CloseFunc method in order to  */
  /*    close an opened recording session.                                 */
  /*                                                                       */
  typedef void
  (*T2_Hints_OpenFunc)( T2_Hints  hints );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T2_Hints_StemsFunc                                                 */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T2_Hints class used to set the table of stems in  */
  /*    either the vertical or horizontal dimension.  Equivalent to the    */
  /*    "hstem", "vstem", "hstemhm", and "vstemhm" Type 2 operators.       */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 2 hints recorder.                */
  /*                                                                       */
  /*    dimension :: 0 for horizontal stems (hstem), 1 for vertical ones   */
  /*                 (vstem).                                              */
  /*                                                                       */
  /*    count     :: The number of stems.                                  */
  /*                                                                       */
  /*    coords    :: An array of "count" (position,length) pairs.          */
  /*                                                                       */
  /* @note:                                                                */
  /*    Use vertical coordinates (y) for horizontal stems (dim=0).  Use    */
  /*    horizontal coordinates (x) for vertical stems (dim=1).             */
  /*                                                                       */
  /*    There are "2*count" elements in the "coords" aray.  Each even      */
  /*    element is an absolute position in font units, each odd element is */
  /*    a length in font units.                                            */
  /*                                                                       */
  /*    A length can be negative, in which case it must be either -20 or   */
  /*    -21.  It will be interpreted as a "ghost" stem, according to the   */
  /*    Type 1 specification.                                              */
  /*                                                                       */
  typedef void
  (*T2_Hints_StemsFunc)( T2_Hints   hints,
                         FT_UInt    dimension,
                         FT_UInt    count,
                         FT_Fixed*  coordinates );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T2_Hints_MaskFunc                                                  */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T2_Hints class used to set a given hintmask       */
  /*    (this corresponds to the "hintmask" Type 2 operator).              */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 2 hints recorder.                */
  /*                                                                       */
  /*    end_point :: The glyph index of the last point to which the        */
  /*                 previously defined/activated hints apply.             */
  /*                                                                       */
  /*    bit_count :: The number of bits in the hint mask.                  */
  /*                                                                       */
  /*    bytes     :: An array of bytes modelling the hint mask.            */
  /*                                                                       */
  /* @note:                                                                */
  /*    If the hintmask starts the charstring (before any glyph point      */
  /*    definition), the value of "end_point" should be 0.                 */
  /*                                                                       */
  /*    "bit_count" is the number of meaningful bits in the "bytes" array; */
  /*    it must be equal to the total number of hints defined so far       */
  /*    (i.e. horizontal+verticals).                                       */
  /*                                                                       */
  /*    The "bytes" array can come directly from the Type 2 charstring and */
  /*    respects the same format.                                          */
  /*                                                                       */
  typedef void
  (*T2_Hints_MaskFunc)( T2_Hints        hints,
                        FT_UInt         end_point,
                        FT_UInt         bit_count,
                        const FT_Byte*  bytes );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T2_Hints_CounterFunc                                               */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T2_Hints class used to set a given counter mask   */
  /*    (this corresponds to the "hintmask" Type 2 operator).              */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 2 hints recorder.                */
  /*                                                                       */
  /*    end_point :: A glyph index of the last point to which the          */
  /*                 previously defined/active hints apply.                */
  /*                                                                       */
  /*    bit_count :: The number of bits in the hint mask.                  */
  /*                                                                       */
  /*    bytes     :: An array of bytes modelling the hint mask.            */
  /*                                                                       */
  /* @note:                                                                */
  /*    If the hintmask starts the charstring (before any glyph point      */
  /*    definition), the value of "end_point" should be 0.                 */
  /*                                                                       */
  /*    "bit_count" is the number of meaningful bits in the "bytes" array; */
  /*    it must be equal to the total number of hints defined so far       */
  /*    (i.e. horizontal+verticals).                                       */
  /*                                                                       */
  /*    The "bytes" array can come directly from the Type 2 charstring and */
  /*    respects the same format.                                          */
  /*                                                                       */
  typedef void
  (*T2_Hints_CounterFunc)( T2_Hints        hints,
                           FT_UInt         bit_count,
                           const FT_Byte*  bytes );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T2_Hints_CloseFunc                                                 */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T2_Hints class used to close a hint recording     */
  /*    session.                                                           */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints     :: A handle to the Type 2 hints recorder.                */
  /*                                                                       */
  /*    end_point :: The index of the last point in the input glyph.       */
  /*                                                                       */
  /* @return:                                                              */
  /*    FreeType error code.  0 means success.                             */
  /*                                                                       */
  /* @note:                                                                */
  /*    The error code will be set to indicate that an error occured       */
  /*    during the recording session.                                      */
  /*                                                                       */
  typedef FT_Error
  (*T2_Hints_CloseFunc)( T2_Hints  hints,
                         FT_UInt   end_point );


  /*************************************************************************/
  /*                                                                       */
  /* @functype:                                                            */
  /*    T2_Hints_ApplyFunc                                                 */
  /*                                                                       */
  /* @description:                                                         */
  /*    A method of the @T2_Hints class used to apply hints to the         */
  /*    corresponding glyph outline.  Must be called after the "close"     */
  /*    method.                                                            */
  /*                                                                       */
  /* @input:                                                               */
  /*    hints      :: A handle to the Type 2 hints recorder.               */
  /*                                                                       */
  /*    outline    :: A pointer to the target outline descriptor.          */
  /*                                                                       */
  /*    globals    :: The hinter globals for this font.                    */
  /*                                                                       */
  /*    hint_flags :: Hinter bit flags.                                    */
  /*                                                                       */
  /* @return:                                                              */
  /*   FreeType error code.  0 means success.                              */
  /*                                                                       */
  /* @note:                                                                */
  /*    On input, all points within the outline are in font coordinates.   */
  /*    On output, they are in 1/64th of pixels.                           */
  /*                                                                       */
  /*    The scaling transformation is taken from the "globals" object      */
  /*    which must correspond to the same font than the glyph.             */
  /*                                                                       */
  typedef FT_Error
  (*T2_Hints_ApplyFunc)( T2_Hints        hints,
                         FT_Outline*     outline,
                         PSH_Globals     globals,
                         FT_Render_Mode  hint_mode );


  /*************************************************************************/
  /*                                                                       */
  /* @struct:                                                              */
  /*    T2_Hints_FuncsRec                                                  */
  /*                                                                       */
  /* @description:                                                         */
  /*    The structure used to provide the API to @T2_Hints objects.        */
  /*                                                                       */
  /* @fields:                                                              */
  /*    hints    :: A handle to the T2 hints recorder object.              */
  /*                                                                       */
  /*    open     :: The function to open a recording session.              */
  /*                                                                       */
  /*    close    :: The function to close a recording session.             */
  /*                                                                       */
  /*    stems    :: The function to set the dimension's stems table.       */
  /*                                                                       */
  /*    hintmask :: The function to set hint masks.                        */
  /*                                                                       */
  /*    counter  :: The function to set counter masks.                     */
  /*                                                                       */
  /*    apply    :: The function to apply the hints on the corresponding   */
  /*                glyph outline.                                         */
  /*                                                                       */
  typedef struct  T2_Hints_FuncsRec_
  {
    T2_Hints              hints;
    T2_Hints_OpenFunc     open;
    T2_Hints_CloseFunc    close;
    T2_Hints_StemsFunc    stems;
    T2_Hints_MaskFunc     hintmask;
    T2_Hints_CounterFunc  counter;
    T2_Hints_ApplyFunc    apply;

  } T2_Hints_FuncsRec;


  /* */


  typedef struct  PSHinter_Interface_
  {
    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );
    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );
    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );

  } PSHinter_Interface;

  typedef PSHinter_Interface*  PSHinter_Service;


FT_END_HEADER

#endif /* __PSHINTS_H__ */


/* END */
