added draft "psaux" code
the t1 driver now reads the complete font matrix and applies it (some fonts do not work properly without hinting though...)
This commit is contained in:
parent
710354b8e9
commit
24d7024c44
|
@ -0,0 +1,459 @@
|
|||
#ifndef PSAUX_H
|
||||
#define PSAUX_H
|
||||
|
||||
#include <freetype/internal/ftobjs.h>
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** T1_TABLE *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* <Struct> */
|
||||
/* T1_Table */
|
||||
/* */
|
||||
/* <Description> */
|
||||
/* A T1_Table is a simple object used to store an array of objects in */
|
||||
/* a single memory block. */
|
||||
/* */
|
||||
/* <Fields> */
|
||||
/* block :: The address in memory of the growheap's block. This */
|
||||
/* can change between two object adds, due to */
|
||||
/* reallocation. */
|
||||
/* */
|
||||
/* cursor :: The current top of the grow heap within its block. */
|
||||
/* */
|
||||
/* capacity :: The current size of the heap block. Increments by */
|
||||
/* 1kByte chunks. */
|
||||
/* */
|
||||
/* max_elems :: The maximum number of elements in table. */
|
||||
/* */
|
||||
/* num_elems :: The current number of elements in table. */
|
||||
/* */
|
||||
/* elements :: A table of element addresses within the block. */
|
||||
/* */
|
||||
/* lengths :: A table of element sizes within the block. */
|
||||
/* */
|
||||
/* memory :: The object used for memory operations */
|
||||
/* (alloc/realloc). */
|
||||
/* */
|
||||
typedef struct T1_Table_
|
||||
{
|
||||
FT_Byte* block; /* current memory block */
|
||||
FT_Int cursor; /* current cursor in memory block */
|
||||
FT_Int capacity; /* current size of memory block */
|
||||
FT_Long init;
|
||||
|
||||
FT_Int max_elems;
|
||||
FT_Int num_elems;
|
||||
FT_Byte** elements; /* addresses of table elements */
|
||||
FT_Int* lengths; /* lengths of table elements */
|
||||
|
||||
FT_Memory memory;
|
||||
|
||||
} T1_Table;
|
||||
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* <Struct> */
|
||||
/* T1_Table_Funcs */
|
||||
/* */
|
||||
/* <Description> */
|
||||
/* A set of function pointers used to manage T1_Table objects.. */
|
||||
/* */
|
||||
/* <Fields> */
|
||||
/* table_init :: used to initialise a a table */
|
||||
/* table_done :: finalize/destroy a given table */
|
||||
/* table_add :: add one new object to a table */
|
||||
/* table_release :: release table data, then finalize it */
|
||||
/* */
|
||||
typedef struct T1_Table_Funcs_
|
||||
{
|
||||
FT_Error (*init) ( T1_Table* table,
|
||||
FT_Int count,
|
||||
FT_Memory memory );
|
||||
|
||||
void (*done) ( T1_Table* table );
|
||||
|
||||
FT_Error (*add) ( T1_Table* table,
|
||||
FT_Int index,
|
||||
void* object,
|
||||
FT_Int length );
|
||||
|
||||
void (*release)( T1_Table* table );
|
||||
|
||||
} T1_Table_Funcs;
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** T1 FIELDS & TOKENS *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
/* simple enumeration type used to identify token types */
|
||||
typedef enum T1_Token_Type_
|
||||
{
|
||||
t1_token_none = 0,
|
||||
t1_token_any,
|
||||
t1_token_string,
|
||||
t1_token_array,
|
||||
|
||||
/* do not remove */
|
||||
t1_token_max
|
||||
|
||||
} T1_Token_Type;
|
||||
|
||||
|
||||
/* a simple structure used to identify tokens */
|
||||
typedef struct T1_Token_
|
||||
{
|
||||
FT_Byte* start; /* first character of token in input stream */
|
||||
FT_Byte* limit; /* first character after the token */
|
||||
T1_Token_Type type; /* type of token.. */
|
||||
|
||||
} T1_Token;
|
||||
|
||||
|
||||
/* enumeration type used to identify object fields */
|
||||
typedef enum T1_Field_Type_
|
||||
{
|
||||
t1_field_none = 0,
|
||||
t1_field_bool,
|
||||
t1_field_integer,
|
||||
t1_field_fixed,
|
||||
t1_field_string,
|
||||
t1_field_integer_array,
|
||||
t1_field_fixed_array,
|
||||
|
||||
/* do not remove */
|
||||
t1_field_max
|
||||
|
||||
} T1_Field_Type;
|
||||
|
||||
|
||||
/* structure type used to model object fields */
|
||||
typedef struct T1_Field_
|
||||
{
|
||||
T1_Field_Type type; /* type of field */
|
||||
FT_UInt offset; /* offset of field in object */
|
||||
FT_Byte size; /* size of field in bytes */
|
||||
FT_UInt array_max; /* maximum number of elements for array */
|
||||
FT_UInt count_offset; /* offset of element count for arrays */
|
||||
FT_Int flag_bit; /* bit number for field flag */
|
||||
|
||||
} T1_Field;
|
||||
|
||||
|
||||
#define T1_FIELD_BOOL( _fname ) \
|
||||
{ \
|
||||
t1_field_bool, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE( _fname ), \
|
||||
0, 0, 0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_NUM( _fname ) \
|
||||
{ \
|
||||
t1_field_integer, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE( _fname ), \
|
||||
0, 0, 0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_FIXED( _fname, _power ) \
|
||||
{ \
|
||||
t1_field_fixed, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE( _fname ), \
|
||||
0, 0, 0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_STRING( _fname ) \
|
||||
{ \
|
||||
t1_field_string, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE( _fname ), \
|
||||
0, 0, 0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_NUM_ARRAY( _fname, _fcount, _fmax ) \
|
||||
{ \
|
||||
t1_field_integer, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE_DELTA( _fname ), \
|
||||
_fmax, \
|
||||
FT_FIELD_OFFSET( _fcount ), \
|
||||
0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_FIXED_ARRAY( _fname, _fcount, _fmax ) \
|
||||
{ \
|
||||
t1_field_fixed, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE_DELTA( _fname ), \
|
||||
_fmax, \
|
||||
FT_FIELD_OFFSET( _fcount ), \
|
||||
0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_NUM_ARRAY2( _fname, _fmax ) \
|
||||
{ \
|
||||
t1_field_integer, \
|
||||
FT_FIELD_OFFSET( _fname ), \
|
||||
FT_FIELD_SIZE_DELTA( _fname ), \
|
||||
_fmax, \
|
||||
0, 0 \
|
||||
}
|
||||
|
||||
#define T1_FIELD_FIXED_ARRAY2( _fname, _fmax ) \
|
||||
{ \
|
||||
t1_field_fixed, \
|
||||
FT_FIELD_OFFSTE( _fname ), \
|
||||
FT_FIELD_SIZE_DELTA( _fname ), \
|
||||
_fmax, \
|
||||
0, 0 \
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** T1 PARSER *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* <Struct> */
|
||||
/* T1_Parser */
|
||||
/* */
|
||||
/* <Description> */
|
||||
/* A T1_Parser is an object used to parse a Type 1 font very */
|
||||
/* quickly. */
|
||||
/* */
|
||||
/* <Fields> */
|
||||
/* cursor :: current position in text. */
|
||||
/* base :: start of processed text. */
|
||||
/* limit :: end of processed text. */
|
||||
/* error :: last error returned. */
|
||||
/* */
|
||||
|
||||
typedef struct T1_Parser_
|
||||
{
|
||||
FT_Byte* cursor;
|
||||
FT_Byte* base;
|
||||
FT_Byte* limit;
|
||||
FT_Error error;
|
||||
FT_Memory memory;
|
||||
|
||||
} T1_Parser;
|
||||
|
||||
|
||||
typedef struct T1_Parser_Funcs_
|
||||
{
|
||||
void (*init) ( T1_Parser* parser,
|
||||
FT_Byte* base,
|
||||
FT_Byte* limit,
|
||||
FT_Memory memory );
|
||||
|
||||
void (*done) ( T1_Parser* parser );
|
||||
|
||||
void (*skip_spaces) ( T1_Parser* parser );
|
||||
void (*skip_alpha) ( T1_Parser* parser );
|
||||
|
||||
FT_Long (*to_int) ( T1_Parser* parser );
|
||||
FT_Fixed (*to_fixed) ( T1_Parser* parser,
|
||||
FT_Int power_ten );
|
||||
FT_Int (*to_coord_array)( T1_Parser* parser,
|
||||
FT_Int max_coords,
|
||||
FT_Short* coords );
|
||||
FT_Int (*to_fixed_array)( T1_Parser* parser,
|
||||
FT_Int max_values,
|
||||
FT_Fixed* values,
|
||||
FT_Int power_ten );
|
||||
|
||||
void (*to_token) ( T1_Parser* parser,
|
||||
T1_Token *token );
|
||||
void (*to_token_array)( T1_Parser* parser,
|
||||
T1_Token* tokens,
|
||||
FT_UInt max_tokens,
|
||||
FT_Int *pnum_tokens );
|
||||
|
||||
FT_Error (*load_field) ( T1_Parser* parser,
|
||||
const T1_Field* field,
|
||||
void** objects,
|
||||
FT_UInt max_objects,
|
||||
FT_ULong* pflags );
|
||||
|
||||
FT_Error (*load_field_table)( T1_Parser* parser,
|
||||
const T1_Field* field,
|
||||
void** objects,
|
||||
FT_UInt max_objects,
|
||||
FT_ULong* pflags );
|
||||
|
||||
} T1_Parser_Funcs;
|
||||
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** T1 BUILDER *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* <Structure> */
|
||||
/* T1_Builder */
|
||||
/* */
|
||||
/* <Description> */
|
||||
/* A structure used during glyph loading to store its outline. */
|
||||
/* */
|
||||
/* <Fields> */
|
||||
/* memory :: The current memory object. */
|
||||
/* */
|
||||
/* face :: The current face object. */
|
||||
/* */
|
||||
/* glyph :: The current glyph slot. */
|
||||
/* */
|
||||
/* current :: The current glyph outline. */
|
||||
/* */
|
||||
/* base :: The base glyph outline. */
|
||||
/* */
|
||||
/* max_points :: maximum points in builder outline */
|
||||
/* */
|
||||
/* max_contours :: Maximal number of contours in builder outline. */
|
||||
/* */
|
||||
/* last :: The last point position. */
|
||||
/* */
|
||||
/* scale_x :: The horizontal scale (FUnits to sub-pixels). */
|
||||
/* */
|
||||
/* scale_y :: The vertical scale (FUnits to sub-pixels). */
|
||||
/* */
|
||||
/* pos_x :: The horizontal translation (if composite glyph). */
|
||||
/* */
|
||||
/* pos_y :: The vertical translation (if composite glyph). */
|
||||
/* */
|
||||
/* left_bearing :: The left side bearing point. */
|
||||
/* */
|
||||
/* advance :: The horizontal advance vector. */
|
||||
/* */
|
||||
/* bbox :: Unused. */
|
||||
/* */
|
||||
/* path_begun :: A flag which indicates that a new path has begun. */
|
||||
/* */
|
||||
/* load_points :: If this flag is not set, no points are loaded. */
|
||||
/* */
|
||||
/* no_recurse :: Set but not used. */
|
||||
/* */
|
||||
/* error :: An error code that is only used to report memory */
|
||||
/* allocation problems. */
|
||||
/* */
|
||||
/* metrics_only :: A boolean indicating that we only want to compute */
|
||||
/* the metrics of a given glyph, not load all of its */
|
||||
/* points. */
|
||||
/* */
|
||||
typedef struct T2_Builder_
|
||||
{
|
||||
FT_Memory memory;
|
||||
FT_Face face;
|
||||
FT_GlyphSlot glyph;
|
||||
FT_GlyphLoader* loader;
|
||||
FT_Outline* base;
|
||||
FT_Outline* current;
|
||||
|
||||
FT_Vector last;
|
||||
|
||||
FT_Fixed scale_x;
|
||||
FT_Fixed scale_y;
|
||||
|
||||
FT_Pos pos_x;
|
||||
FT_Pos pos_y;
|
||||
|
||||
FT_Vector left_bearing;
|
||||
FT_Vector advance;
|
||||
|
||||
FT_BBox bbox; /* bounding box */
|
||||
FT_Bool path_begun;
|
||||
FT_Bool load_points;
|
||||
FT_Bool no_recurse;
|
||||
|
||||
FT_Error error; /* only used for memory errors */
|
||||
FT_Bool metrics_only;
|
||||
|
||||
} T1_Builder;
|
||||
|
||||
|
||||
typedef FT_Error (*T1_Builder_Check_Points_Func)( T1_Builder* builder,
|
||||
FT_Int count );
|
||||
|
||||
typedef void (*T1_Builder_Add_Point_Func) ( T1_Builder* builder,
|
||||
FT_Pos x,
|
||||
FT_Pos y,
|
||||
FT_Byte flag );
|
||||
|
||||
typedef void (*T1_Builder_Add_Point1_Func)( T1_Builder* builder,
|
||||
FT_Pos x,
|
||||
FT_Pos y );
|
||||
|
||||
typedef FT_Error (*T1_Builder_Add_Contour_Func)( T1_Builder* builder );
|
||||
|
||||
typedef FT_Error (*T1_Builder_Start_Point_Func)( T1_Builder* builder,
|
||||
FT_Pos x,
|
||||
FT_Pos y );
|
||||
|
||||
typedef void (*T1_Builder_Close_Contour_Func)( T1_Builder* builder );
|
||||
|
||||
|
||||
typedef struct T1_Builder_Funcs_
|
||||
{
|
||||
FT_Error (*init)( T1_Builder* builder,
|
||||
FT_Face face,
|
||||
FT_Size size,
|
||||
FT_GlyphSlot slot );
|
||||
|
||||
void (*done)( T1_Builder* builder );
|
||||
|
||||
T1_Builder_Check_Points_Func check_points;
|
||||
T1_Builder_Add_Points_Func add_point;
|
||||
T1_Builder_Add_Point1_Func add_point1;
|
||||
T1_Builder_Add_Contour_Func add_contour;
|
||||
T1_Builder_Start_Point_Func start_point;
|
||||
T1_Builder_Close_Contour_Func close_contour;
|
||||
|
||||
} T1_Builder_Funcs;
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** PSAux Module Interface *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
|
||||
typedef struct PSAux_Interface_
|
||||
{
|
||||
const T1_Table_Funcs* t1_table_funcs;
|
||||
const T1_Parser_Funcs* t1_parser_funcs;
|
||||
const T1_Builder_Funcs* t1_builder_funcs;
|
||||
|
||||
} PSAux_Interface;
|
||||
|
||||
|
||||
#endif /* PSAUX_H */
|
|
@ -116,6 +116,7 @@
|
|||
FT_Byte paint_type;
|
||||
FT_Byte font_type;
|
||||
FT_Matrix font_matrix;
|
||||
FT_Vector font_offset;
|
||||
FT_BBox font_bbox;
|
||||
FT_Long font_id;
|
||||
|
||||
|
|
|
@ -1020,7 +1020,7 @@
|
|||
}
|
||||
|
||||
/* now, transform the glyph image when needed */
|
||||
if ( face->transform_flags )
|
||||
if ( face->transform_flags && !(load_flags & FT_LOAD_NO_RECURSE))
|
||||
{
|
||||
/* get renderer */
|
||||
FT_Renderer renderer = ft_lookup_glyph_renderer( slot );
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
#ifndef OLTYPES_H
|
||||
#define OLTYPES_H
|
||||
|
||||
#include <ftobjs.h>
|
||||
#include <tttypes.h>
|
||||
#include <freetype/internal/ftobjs.h>
|
||||
|
||||
/*************************************************************
|
||||
*
|
||||
|
@ -48,34 +47,34 @@
|
|||
{
|
||||
FT_Memory memory;
|
||||
|
||||
TT_Int num_scripts;
|
||||
TT_Tag* script_tags;
|
||||
FT_Int num_scripts;
|
||||
FT_Tag* script_tags;
|
||||
|
||||
TT_Int max_languages;
|
||||
TT_Int num_languages;
|
||||
TT_Tag* language_tags;
|
||||
FT_Int max_languages;
|
||||
FT_Int num_languages;
|
||||
FT_Tag* language_tags;
|
||||
|
||||
TT_Int max_features;
|
||||
TT_Tag* feature_tags;
|
||||
TT_Bool* features;
|
||||
FT_Int max_features;
|
||||
FT_Tag* feature_tags;
|
||||
FT_Bool* features;
|
||||
|
||||
TT_Int max_lookups;
|
||||
TT_Bool* lookups;
|
||||
FT_Int max_lookups;
|
||||
FT_Bool* lookups;
|
||||
|
||||
TT_Byte* scripts_table;
|
||||
TT_Long scripts_len;
|
||||
FT_Byte* scripts_table;
|
||||
FT_Long scripts_len;
|
||||
|
||||
TT_Byte* features_table;
|
||||
TT_Long* features_len;
|
||||
FT_Byte* features_table;
|
||||
FT_Long* features_len;
|
||||
|
||||
TT_Byte* lookups_table;
|
||||
TT_Byte* lookups_len;
|
||||
FT_Byte* lookups_table;
|
||||
FT_Byte* lookups_len;
|
||||
|
||||
TT_Byte* cur_script; /* current script */
|
||||
TT_Byte* cur_language; /* current language */
|
||||
FT_Byte* cur_script; /* current script */
|
||||
FT_Byte* cur_language; /* current language */
|
||||
|
||||
TT_Byte* cur_base_values;
|
||||
TT_Byte* cur_min_max;
|
||||
FT_Byte* cur_base_values;
|
||||
FT_Byte* cur_min_max;
|
||||
|
||||
OTL_Type otl_type;
|
||||
|
||||
|
@ -84,58 +83,43 @@
|
|||
|
||||
typedef struct OTL_BaseCoord_
|
||||
{
|
||||
TT_UShort format;
|
||||
TT_Short coordinate;
|
||||
TT_UShort ref_glyph;
|
||||
TT_UShort ref_point;
|
||||
TT_Byte* device;
|
||||
FT_UShort format;
|
||||
FT_Short coordinate;
|
||||
FT_UShort ref_glyph;
|
||||
FT_UShort ref_point;
|
||||
FT_Byte* device;
|
||||
|
||||
} OTL_BaseCoord;
|
||||
|
||||
|
||||
typedef struct OTL_ValueRecord_
|
||||
{
|
||||
TT_Vector placement;
|
||||
TT_Vector advance;
|
||||
FT_Vector placement;
|
||||
FT_Vector advance;
|
||||
|
||||
TT_Byte* device_pla_x;
|
||||
TT_Byte* device_pla_y;
|
||||
TT_Byte* device_adv_x;
|
||||
TT_Byte* device_adv_y;
|
||||
FT_Byte* device_pla_x;
|
||||
FT_Byte* device_pla_y;
|
||||
FT_Byte* device_adv_x;
|
||||
FT_Byte* device_adv_y;
|
||||
|
||||
} OTL_ValueRecord;
|
||||
|
||||
|
||||
typedef struct OTL_Anchor_
|
||||
{
|
||||
TT_UInt format;
|
||||
TT_Vector coord;
|
||||
TT_UInt anchor_point;
|
||||
TT_Byte* device_x;
|
||||
TT_Byte* device_y;
|
||||
FT_UInt format;
|
||||
FT_Vector coord;
|
||||
FT_UInt anchor_point;
|
||||
FT_Byte* device_x;
|
||||
FT_Byte* device_y;
|
||||
|
||||
} OTL_Anchor;
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Error OTL_Table_Init( OTL_Table* table,
|
||||
FT_Error OTL_Table_Init( OTL_Table* table,
|
||||
FT_Memory memory );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Error OTL_Table_Set_Scripts( OTL_Table* table,
|
||||
TT_Byte* bytes,
|
||||
TT_Long len,
|
||||
OTL_Type otl_type );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Error OTL_Table_Set_Features( OTL_Table* table,
|
||||
TT_Byte* bytes,
|
||||
TT_Long len );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Error OTL_Table_Set_Lookups( OTL_Table* table,
|
||||
TT_Byte* bytes,
|
||||
TT_Long len );
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Table_Done( OTL_Table* table );
|
||||
|
||||
|
@ -153,6 +137,12 @@
|
|||
* table->num_scripts is the number of scripts
|
||||
*
|
||||
*/
|
||||
LOCAL_DEF
|
||||
FT_Error OTL_Table_Set_Scripts( OTL_Table* table,
|
||||
FT_Byte* bytes,
|
||||
FT_Long len,
|
||||
OTL_Type otl_type );
|
||||
|
||||
|
||||
/********************************************************
|
||||
*
|
||||
|
@ -169,6 +159,18 @@
|
|||
* it is empty (zero-filled) by default.
|
||||
*
|
||||
*/
|
||||
LOCAL_DEF
|
||||
FT_Error OTL_Table_Set_Features( OTL_Table* table,
|
||||
FT_Byte* bytes,
|
||||
FT_Long len );
|
||||
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Error OTL_Table_Set_Lookups( OTL_Table* table,
|
||||
FT_Byte* bytes,
|
||||
FT_Long len );
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
|
@ -187,7 +189,7 @@
|
|||
*/
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Languages_List( OTL_Table* table,
|
||||
TT_ULong script_tag );
|
||||
FT_ULong script_tag );
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
|
@ -208,15 +210,15 @@
|
|||
*/
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Features_List( OTL_Table* table,
|
||||
TT_ULong language_tag );
|
||||
FT_ULong language_tag );
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Baseline_Values( OTL_Table* table,
|
||||
TT_ULong language_tag );
|
||||
FT_ULong language_tag );
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Justification( OTL_Table* table,
|
||||
TT_ULong language_tag );
|
||||
FT_ULong language_tag );
|
||||
|
||||
/*******************************************************************
|
||||
*
|
||||
|
@ -259,52 +261,52 @@
|
|||
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Long OTL_Get_Coverage_Index( TT_Byte* coverage,
|
||||
TT_UInt glyph_id );
|
||||
FT_Long OTL_Get_Coverage_Index( FT_Byte* coverage,
|
||||
FT_UInt glyph_id );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_UInt OTL_Get_Glyph_Class( TT_Byte* class_def,
|
||||
TT_UInt glyph_id );
|
||||
FT_UInt OTL_Get_Glyph_Class( FT_Byte* class_def,
|
||||
FT_UInt glyph_id );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Int OTL_Get_Device_Adjustment( TT_Byte* device,
|
||||
TT_UInt size );
|
||||
FT_Int OTL_Get_Device_Adjustment( FT_Byte* device,
|
||||
FT_UInt size );
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Base_Coordinate( TT_Byte* base_coord,
|
||||
void OTL_Get_Base_Coordinate( FT_Byte* base_coord,
|
||||
OTL_BaseCoord* coord );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Int OTL_ValueRecord_Size( TT_UShort value_format );
|
||||
FT_Int OTL_ValueRecord_Size( FT_UShort value_format );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_ValueRecord( TT_Byte* value_record,
|
||||
TT_UShort value_format,
|
||||
TT_Byte* pos_table,
|
||||
void OTL_Get_ValueRecord( FT_Byte* value_record,
|
||||
FT_UShort value_format,
|
||||
FT_Byte* pos_table,
|
||||
OTL_ValueRecord* record );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Anchor( TT_Byte* anchor_table,
|
||||
void OTL_Get_Anchor( FT_Byte* anchor_table,
|
||||
OTL_Anchor* anchor );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Mark( TT_Byte* mark_array,
|
||||
TT_UInt index,
|
||||
TT_UShort* clazz,
|
||||
void OTL_Get_Mark( FT_Byte* mark_array,
|
||||
FT_UInt index,
|
||||
FT_UShort* clazz,
|
||||
OTL_Anchor* anchor );
|
||||
|
||||
|
||||
|
||||
#define OTL_Byte(p) (p++, p[-1])
|
||||
|
||||
#define OTL_UShort(p) (p+=2, ((TT_UShort)p[-2] << 8) | p[-1])
|
||||
#define OTL_UShort(p) (p+=2, ((FT_UShort)p[-2] << 8) | p[-1])
|
||||
|
||||
#define OTL_ULong(p) (p+=4, ((TT_ULong)p[-4] << 24) | \
|
||||
((TT_ULong)p[-3] << 16) | \
|
||||
((TT_ULong)p[-2] << 8 ) | p[-1] )
|
||||
#define OTL_ULong(p) (p+=4, ((FT_ULong)p[-4] << 24) | \
|
||||
((FT_ULong)p[-3] << 16) | \
|
||||
((FT_ULong)p[-2] << 8 ) | p[-1] )
|
||||
|
||||
#endif /* OLTYPES_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,113 @@
|
|||
#ifndef PSOBJS_H
|
||||
#define PSOBJS_H
|
||||
|
||||
#include <freetype/internal/psaux.h>
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** T1_TABLE *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Error T1_New_Table( T1_Table* table,
|
||||
FT_Int count,
|
||||
FT_Memory memory );
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Error T1_Add_Table( T1_Table* table,
|
||||
FT_Int index,
|
||||
void* object,
|
||||
FT_Int length );
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Done_Table( T1_Table* table );
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Release_Table( T1_Table* table );
|
||||
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
/***** T1 PARSER *****/
|
||||
/***** *****/
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Skip_Spaces( T1_Parser* parser );
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Skip_Alpha( T1_Parser* parser );
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_ToToken( T1_Parser* parser,
|
||||
T1_Token* token );
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_ToTokenArray( T1_Parser* parser,
|
||||
T1_Token* tokens,
|
||||
FT_UInt max_tokens,
|
||||
FT_Int* pnum_tokens );
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Error T1_Load_Field( T1_Parser* parser,
|
||||
const T1_Field* field,
|
||||
void** objects,
|
||||
FT_UInt max_objects,
|
||||
FT_ULong* pflags );
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Error T1_Load_Field_Table( T1_Parser* parser,
|
||||
const T1_Field* field,
|
||||
void** objects,
|
||||
FT_UInt max_objects,
|
||||
FT_ULong* pflags );
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Long T1_ToInt ( T1_Parser* parser );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Fixed T1_ToFixed( T1_Parser* parser,
|
||||
FT_Int power_ten );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Int T1_ToCoordArray( T1_Parser* parser,
|
||||
FT_Int max_coords,
|
||||
FT_Short* coords );
|
||||
|
||||
LOCAL_DEF
|
||||
FT_Int T1_ToFixedArray( T1_Parser* parser,
|
||||
FT_Int max_values,
|
||||
FT_Fixed* values,
|
||||
FT_Int power_ten );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Init_Parser( T1_Parser* parser,
|
||||
FT_Byte* base,
|
||||
FT_Byte* limit,
|
||||
FT_Memory memory );
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Done_Parser( T1_Parser* parser )
|
||||
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void T1_Decrypt( FT_Byte* buffer,
|
||||
FT_Int length,
|
||||
FT_UShort seed );
|
||||
|
||||
|
||||
#endif /* PSOBJS_H */
|
||||
|
|
@ -436,7 +436,7 @@
|
|||
stream = face->root.stream;
|
||||
/* the `if' is syntactic sugar for picky compilers */
|
||||
if ( FILE_Read_At( offset, buffer, size ) )
|
||||
;
|
||||
goto Exit;
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
|
|
|
@ -1425,6 +1425,14 @@
|
|||
if ( size && size->root.metrics.y_ppem < 24 )
|
||||
glyph->root.outline.flags |= ft_outline_high_precision;
|
||||
|
||||
/* apply the font matrix */
|
||||
FT_Outline_Transform( &glyph->root.outline,
|
||||
&face->type1.font_matrix );
|
||||
|
||||
FT_Outline_Translate( &glyph->root.outline,
|
||||
face->type1.font_offset.x,
|
||||
face->type1.font_offset.y );
|
||||
|
||||
#if 0
|
||||
glyph->root.outline.second_pass = TRUE;
|
||||
glyph->root.outline.high_precision = size->root.metrics.y_ppem < 24;
|
||||
|
@ -1458,10 +1466,6 @@
|
|||
metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
|
||||
}
|
||||
|
||||
/* apply the font matrix */
|
||||
FT_Outline_Transform( &glyph->root.outline,
|
||||
&face->type1.font_matrix );
|
||||
|
||||
/* compute the other metrics */
|
||||
FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
|
||||
|
||||
|
|
|
@ -1069,18 +1069,33 @@
|
|||
{
|
||||
Z1_Parser* parser = &loader->parser;
|
||||
FT_Matrix* matrix = &face->type1.font_matrix;
|
||||
FT_Fixed temp[4];
|
||||
FT_Vector* offset = &face->type1.font_offset;
|
||||
FT_Fixed temp[6];
|
||||
|
||||
|
||||
if ( matrix->xx || matrix->yx )
|
||||
/* with synthetic fonts, it's possible we get here twice */
|
||||
return;
|
||||
|
||||
(void)Z1_ToFixedArray( parser, 4, temp, 3 );
|
||||
(void)Z1_ToFixedArray( parser, 6, temp, 3 );
|
||||
|
||||
/* we need to scale the values by 1.0/temp[3] */
|
||||
if ( temp[3] != 0x10000 )
|
||||
{
|
||||
temp[0] = FT_DivFix( temp[0], temp[3] );
|
||||
temp[1] = FT_DivFix( temp[1], temp[3] );
|
||||
temp[2] = FT_DivFix( temp[2], temp[3] );
|
||||
temp[4] = FT_DivFix( temp[4], temp[3] );
|
||||
temp[5] = FT_DivFix( temp[5], temp[3] );
|
||||
temp[3] = 0x10000;
|
||||
}
|
||||
|
||||
matrix->xx = temp[0];
|
||||
matrix->yx = temp[1];
|
||||
matrix->xy = temp[2];
|
||||
matrix->yy = temp[3];
|
||||
offset->x = temp[4];
|
||||
offset->y = temp[5];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -64,69 +64,4 @@
|
|||
Z1_TOPDICT_NUM( "FontType", font_type )
|
||||
Z1_TOPDICT_NUM( "StrokeWidth", stroke_width )
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
/* define the font info dictionary parsing callbacks */
|
||||
#undef FACE
|
||||
#define FACE (face->type1.font_info)
|
||||
|
||||
PARSE_STRING( "version", version )
|
||||
PARSE_STRING( "Notice", notice )
|
||||
PARSE_STRING( "FullName", full_name )
|
||||
PARSE_STRING( "FamilyName", family_name )
|
||||
PARSE_STRING( "Weight", weight )
|
||||
|
||||
PARSE_INT ( "ItalicAngle", italic_angle )
|
||||
PARSE_BOOL ( "isFixedPitch", is_fixed_pitch )
|
||||
PARSE_NUM ( "UnderlinePosition", underline_position, FT_Short )
|
||||
PARSE_NUM ( "UnderlineThickness", underline_thickness, FT_UShort )
|
||||
|
||||
|
||||
/* define the private dict parsing callbacks */
|
||||
#undef FACE
|
||||
#define FACE (face->type1.private_dict)
|
||||
|
||||
PARSE_INT ("UniqueID", unique_id )
|
||||
PARSE_INT ("lenIV", lenIV )
|
||||
|
||||
PARSE_COORDS ( "BlueValues", num_blues, 14, blue_values)
|
||||
PARSE_COORDS ( "OtherBlues", num_other_blues, 10, other_blues)
|
||||
|
||||
PARSE_COORDS ( "FamilyBlues", num_family_blues, 14, family_blues )
|
||||
PARSE_COORDS ( "FamilyOtherBlues", num_family_other_blues, 10,
|
||||
family_other_blues )
|
||||
|
||||
PARSE_FIXED ( "BlueScale", blue_scale )
|
||||
PARSE_INT ( "BlueShift", blue_shift )
|
||||
|
||||
PARSE_INT ( "BlueFuzz", blue_fuzz )
|
||||
|
||||
PARSE_COORDS2( "StdHW", 1, standard_width )
|
||||
PARSE_COORDS2( "StdVW", 1, standard_height )
|
||||
|
||||
PARSE_COORDS ( "StemSnapH", num_snap_widths, 12, stem_snap_widths )
|
||||
PARSE_COORDS ( "StemSnapV", num_snap_heights, 12, stem_snap_heights )
|
||||
|
||||
PARSE_INT ( "LanguageGroup", language_group )
|
||||
PARSE_INT ( "password", password )
|
||||
PARSE_COORDS2( "MinFeature", 2, min_feature )
|
||||
|
||||
|
||||
/* define the top-level dictionary parsing callbacks */
|
||||
#undef FACE
|
||||
#define FACE (face->type1)
|
||||
|
||||
/*PARSE_STRING ( "FontName", font_name ) -- handled by special routine */
|
||||
PARSE_NUM ( "PaintType", paint_type, FT_Byte )
|
||||
PARSE_NUM ( "FontType", font_type, FT_Byte )
|
||||
PARSE_FIXEDS2( "FontMatrix", 4, font_matrix )
|
||||
/*PARSE_COORDS2( "FontBBox", 4, font_bbox ) -- handled by special routine */
|
||||
PARSE_INT ( "StrokeWidth", stroke_width )
|
||||
|
||||
#undef FACE
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
|
||||
/* END */
|
||||
|
|
Loading…
Reference in New Issue