/******************************************************************* * * 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 #ifdef __cplusplus extern "C" { #endif /*************************************************************************/ /* */ /* T1_Builder_Funcs */ /* */ /* */ /* 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; /*************************************************************************/ /* */ /* T1_Builder */ /* */ /* */ /* a structure used during glyph loading to store its outline. */ /* */ /* */ /* 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_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; }; /*************************************************************************/ /* */ /* T1_Hinter_Funcs */ /* */ /* */ /* 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; /********************************************************************* * * * T1_Init_Builder * * * Initialise a given glyph builder. * * * builder :: glyph builder to initialise * face :: current face object * size :: current size object * glyph :: current glyph object * funcs :: glyph builder functions (or "methods"). * * * This function is exported for now because it is used by the * "t1dump" utility. Later, it will be accessed through a * format-specific extension * *********************************************************************/ EXPORT_DEF void T1_Init_Builder( T1_Builder* builder, T1_Face face, T1_Size size, T1_GlyphSlot glyph, const T1_Builder_Funcs* funcs ); /********************************************************************* * * * T1_Done_Builder * * * 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. * * * builder :: glyph builder to initialise * * * This function is exported for now because it is used by the * "t1dump" utility. Later, it will be accessed through a * format-specific extension * *********************************************************************/ EXPORT_DEF void T1_Done_Builder( T1_Builder* builder ); /********************************************************************* * * * T1_Init_Decoder * * * Initialise a given Type 1 decoder for parsing * * * decoder :: Type 1 decoder to initialise * funcs :: hinter functions interface * * * This function is exported for now because it is used by the * "t1dump" utility. Later, it will be accessed through a * format-specific extension * *********************************************************************/ EXPORT_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 */ EXPORT_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 ); /*************************************************************************/ /* */ /* T1_Add_Points */ /* */ /* */ /* 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.. */ /* */ /* */ /* builder :: pointer to glyph builder object */ /* num_points :: number of points that will be added later */ /* */ /* */ /* Type1 error code. 0 means success */ /* */ /* */ /* 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 ); /*************************************************************************/ /* */ /* T1_Add_Contours */ /* */ /* */ /* 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.. */ /* */ /* */ /* builder :: pointer to glyph builder object */ /* num_contours :: number of contours that will be added later */ /* */ /* */ /* Type1 error code. 0 means success */ /* */ /* */ /* 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 */