diff --git a/src/pk/pkdrivr.c b/src/pk/pkdrivr.c index 851e5feb4..306d29dec 100644 --- a/src/pk/pkdrivr.c +++ b/src/pk/pkdrivr.c @@ -21,11 +21,11 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_OBJECTS_H #include FT_TRUETYPE_IDS_H +#include FT_INTERNAL_TFM_H #include FT_SERVICE_PK_H #include FT_SERVICE_FONT_FORMAT_H - #include "pk.h" #include "pkdrivr.h" #include "pkerror.h" @@ -163,9 +163,20 @@ PK_Glyph go=NULL; FT_UInt16 i,count; + TFM_Service tfm; + FT_UNUSED( num_params ); FT_UNUSED( params ); + face->tfm = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "tfm" ); + tfm = (TFM_Service)face->tfm; + if ( !tfm ) + { + FT_ERROR(( "GF_Face_Init: cannot access `tfm' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } FT_TRACE2(( "PK driver\n" )); @@ -429,6 +440,93 @@ return error; } + FT_LOCAL_DEF( void ) + TFM_Done_Metrics( FT_Memory memory, + TFM_FontInfo fi ) + { + FT_FREE(fi->width); + FT_FREE(fi->height); + FT_FREE(fi->depth); + FT_FREE( fi ); + } + + /* parse a TFM metrics file */ + FT_LOCAL_DEF( FT_Error ) + TFM_Read_Metrics( FT_Face pk_face, + FT_Stream stream ) + { + TFM_Service tfm; + FT_Memory memory = stream->memory; + TFM_ParserRec parser; + TFM_FontInfo fi = NULL; + FT_Error error = FT_ERR( Unknown_File_Format ); + PK_Face face = (PK_Face)pk_face; + PK_Glyph pk_glyph= face->pk_glyph; + + + if ( face->tfm_data ) + { + FT_TRACE1(( "TFM_Read_Metrics:" + " Freeing previously attached metrics data.\n" )); + TFM_Done_Metrics( memory, (TFM_FontInfo)face->tfm_data ); + + face->tfm_data = NULL; + } + + if ( FT_NEW( fi ) ) + goto Exit; + + FT_TRACE4(( "TFM_Read_Metrics: Invoking TFM_Service.\n" )); + + tfm = (TFM_Service)face->tfm; + + /* Initialise TFM Service */ + error = tfm->init( &parser, + memory, + stream ); + + if ( !error ) + { + FT_TRACE4(( "TFM_Read_Metrics: Initialised tfm metric data.\n" )); + parser.FontInfo = fi; + parser.user_data = pk_glyph; + + error = tfm->parse_metrics( &parser ); + if( !error ) + FT_TRACE4(( "TFM_Read_Metrics: parsing TFM metric information done.\n" )); + + FT_TRACE6(( "TFM_Read_Metrics: TFM Metric Information:\n" + " Check Sum : %ld\n" + " Design Size: %ld\n" + " Begin Char : %d\n" + " End Char : %d\n" + " font_bbx_w : %d\n" + " font_bbx_h : %d\n" + " slant : %d\n", parser.FontInfo->cs, parser.FontInfo->design_size, parser.FontInfo->begin_char, + parser.FontInfo->end_char, parser.FontInfo->font_bbx_w, + parser.FontInfo->font_bbx_h, parser.FontInfo->slant )); + tfm->done( &parser ); + } + + if ( !error ) + { + /* Modify PK_Glyph data according to TFM metric values */ + + /*face->pk_glyph->font_bbx_w = fi->font_bbx_w; + face->pk_glyph->font_bbx_h = fi->font_bbx_h; + */ + + face->tfm_data = fi; + fi = NULL; + } + + Exit: + if ( fi ) + TFM_Done_Metrics( memory, fi ); + + return error; + } + /* * * SERVICES LIST @@ -486,7 +584,7 @@ PK_Glyph_Load, /* FT_Slot_LoadFunc load_glyph */ NULL, /* FT_Face_GetKerningFunc get_kerning */ - NULL, /* FT_Face_AttachFunc attach_file */ + TFM_Read_Metrics, /* FT_Face_AttachFunc attach_file */ NULL, /* FT_Face_GetAdvancesFunc get_advances */ PK_Size_Request, /* FT_Size_RequestFunc request_size */