/***************************************************************************/ /* */ /* 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, 2003 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_mode :: Hinting information. */ /* */ /* @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_mode :: Hinting information. */ /* */ /* @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 */