From 85eb6695465ab93ead94abb2a6efa2a561c80752 Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 20 Dec 2001 09:36:21 +0000 Subject: [PATCH] * src/type1/t1gload.c (T1_Load_Glyph): enable font matrix transform on hinted glyphs.. * src/cid/cidgload.c, src/cid/cidobjs.c, src/cid/cidobjs.h, src/cid/cidriver.c, include/freetype/internal/t1types.h: added Postscript hinter support to the CID font driver !! --- ChangeLog | 10 ++ include/freetype/internal/t1types.h | 3 + src/cid/cidgload.c | 13 +-- src/cid/cidobjs.c | 152 ++++++++++++++++++++++++++-- src/cid/cidobjs.h | 29 +++++- src/cid/cidriver.c | 25 +++-- src/type1/t1gload.c | 3 +- 7 files changed, 203 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4764638e0..01df1e1f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2001-12-20 David Turner + + * src/type1/t1gload.c (T1_Load_Glyph): enable font matrix transform + on hinted glyphs.. + + * src/cid/cidgload.c, src/cid/cidobjs.c, src/cid/cidobjs.h, + src/cid/cidriver.c, include/freetype/internal/t1types.h: added + Postscript hinter support to the CID font driver !! + + 2001-12-19 David Turner * include/freetype/cache/ftcache.h: Added comments to indicate that diff --git a/include/freetype/internal/t1types.h b/include/freetype/internal/t1types.h index f3cb0832f..c8c87eb5a 100644 --- a/include/freetype/internal/t1types.h +++ b/include/freetype/internal/t1types.h @@ -188,6 +188,9 @@ FT_BEGIN_HEADER CID_Info cid; void* afm_data; CID_Subrs* subrs; + + /* since FT 2.1 - interface to PostScript hinter */ + void* pshinter; } CID_FaceRec; diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c index 3769da105..e7a70e8a4 100644 --- a/src/cid/cidgload.c +++ b/src/cid/cidgload.c @@ -238,7 +238,7 @@ (FT_GlyphSlot)glyph, 0, /* glyph names -- XXX */ 0, /* blend == 0 */ - 0, /* hinting == 0 */ + hinting, cid_load_glyph ); /* set up the decoder */ @@ -316,11 +316,12 @@ /* First of all, scale the points */ - for ( n = cur->n_points; n > 0; n--, vec++ ) - { - vec->x = FT_MulFix( vec->x, x_scale ); - vec->y = FT_MulFix( vec->y, y_scale ); - } + if ( !hinting ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c index 77c25edab..9967f65c9 100644 --- a/src/cid/cidobjs.c +++ b/src/cid/cidobjs.c @@ -23,6 +23,7 @@ #include "cidload.h" #include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H #include "ciderrs.h" @@ -37,6 +38,127 @@ #define FT_COMPONENT trace_cidobjs + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF void + CID_GlyphSlot_Done( CID_GlyphSlot slot ) + { + slot->root.internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF FT_Error + CID_GlyphSlot_Init( CID_GlyphSlot slot ) + { + CID_Face face; + PSHinter_Interface* pshinter; + + face = (CID_Face) slot->root.face; + pshinter = face->pshinter; + if (pshinter) + { + FT_Module module; + + module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" ); + if (module) + { + T1_Hints_Funcs funcs; + + funcs = pshinter->get_t1_funcs( module ); + slot->root.internal->glyph_hints = (void*)funcs; + } + } + return 0; + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + CID_Size_Get_Globals_Funcs( CID_Size size ) + { + CID_Face face = (CID_Face) size->root.face; + PSHinter_Interface* pshinter = face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0 ; + } + + + FT_LOCAL_DEF void + CID_Size_Done( CID_Size size ) + { + if ( size->root.internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = CID_Size_Get_Globals_Funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)size->root.internal ); + + size->root.internal = 0; + } + } + + + FT_LOCAL_DEF FT_Error + CID_Size_Init( CID_Size size ) + { + FT_Error error = 0; + PSH_Globals_Funcs funcs = CID_Size_Get_Globals_Funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + CID_Face face = (CID_Face)size->root.face; + CID_FontDict* dict = face->cid.font_dicts + face->root.face_index; + T1_Private* priv = &dict->private_dict; + + + error = funcs->create( size->root.face->memory, priv, &globals ); + if ( !error ) + size->root.internal = (FT_Size_Internal)(void*)globals; + } + + return error; + } + + + FT_LOCAL_DEF FT_Error + CID_Size_Reset( CID_Size size ) + { + PSH_Globals_Funcs funcs = CID_Size_Get_Globals_Funcs( size ); + FT_Error error = 0; + + + if ( funcs ) + error = funcs->set_scale( (PSH_Globals)size->root.internal, + size->root.metrics.x_scale, + size->root.metrics.y_scale, + 0, 0 ); + return error; + } + + + + /*************************************************************************/ /* */ /* FACE FUNCTIONS */ @@ -47,7 +169,7 @@ /*************************************************************************/ /* */ /* */ - /* CID_Done_Face */ + /* CID_Face_Done */ /* */ /* */ /* Finalizes a given face object. */ @@ -56,7 +178,7 @@ /* face :: A pointer to the face object to destroy. */ /* */ FT_LOCAL_DEF void - CID_Done_Face( CID_Face face ) + CID_Face_Done( CID_Face face ) { FT_Memory memory; @@ -94,7 +216,7 @@ /*************************************************************************/ /* */ /* */ - /* CID_Init_Face */ + /* CID_Face_Init */ /* */ /* */ /* Initializes a given CID face object. */ @@ -115,7 +237,7 @@ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL_DEF FT_Error - CID_Init_Face( FT_Stream stream, + CID_Face_Init( FT_Stream stream, CID_Face face, FT_Int face_index, FT_Int num_params, @@ -124,6 +246,7 @@ FT_Error error; PSNames_Interface* psnames; PSAux_Interface* psaux; + PSHinter_Interface* pshinter; FT_UNUSED( num_params ); FT_UNUSED( params ); @@ -151,6 +274,17 @@ face->psaux = psaux; } + + pshinter = (PSHinter_Interface*)face->pshinter; + if ( !pshinter ) + { + pshinter = (PSHinter_Interface*) + FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "pshinter" ); + + face->pshinter = pshinter; + } + + /* open the tokenizer; this will also check the font format */ if ( FILE_Seek( 0 ) ) goto Exit; @@ -166,7 +300,7 @@ /* check the face index */ if ( face_index != 0 ) { - FT_ERROR(( "CID_Init_Face: invalid face index\n" )); + FT_ERROR(( "CID_Face_Init: invalid face index\n" )); error = CID_Err_Invalid_Argument; goto Exit; } @@ -342,7 +476,7 @@ /*************************************************************************/ /* */ /* */ - /* CID_Init_Driver */ + /* CID_Driver_Init */ /* */ /* */ /* Initializes a given CID driver object. */ @@ -354,7 +488,7 @@ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL_DEF FT_Error - CID_Init_Driver( CID_Driver driver ) + CID_Driver_Init( CID_Driver driver ) { FT_UNUSED( driver ); @@ -365,7 +499,7 @@ /*************************************************************************/ /* */ /* */ - /* CID_Done_Driver */ + /* CID_Driver_Done */ /* */ /* */ /* Finalizes a given CID driver. */ @@ -374,7 +508,7 @@ /* driver :: A handle to the target CID driver. */ /* */ FT_LOCAL_DEF void - CID_Done_Driver( CID_Driver driver ) + CID_Driver_Done( CID_Driver driver ) { FT_UNUSED( driver ); } diff --git a/src/cid/cidobjs.h b/src/cid/cidobjs.h index 8330663e3..19d52c277 100644 --- a/src/cid/cidobjs.h +++ b/src/cid/cidobjs.h @@ -111,22 +111,43 @@ FT_BEGIN_HEADER } CID_GlyphSlotRec; + FT_LOCAL void + CID_GlyphSlot_Done( CID_GlyphSlot slot ); + FT_LOCAL FT_Error - CID_Init_Face( FT_Stream stream, + CID_GlyphSlot_Init( CID_GlyphSlot slot ); + + + FT_LOCAL void + CID_Size_Done( CID_Size size ); + + + FT_LOCAL FT_Error + CID_Size_Init( CID_Size size ); + + + FT_LOCAL FT_Error + CID_Size_Reset( CID_Size size ); + + + FT_LOCAL FT_Error + CID_Face_Init( FT_Stream stream, CID_Face face, FT_Int face_index, FT_Int num_params, FT_Parameter* params ); + FT_LOCAL void - CID_Done_Face( CID_Face face ); + CID_Face_Done( CID_Face face ); FT_LOCAL FT_Error - CID_Init_Driver( CID_Driver driver ); + CID_Driver_Init( CID_Driver driver ); + FT_LOCAL void - CID_Done_Driver( CID_Driver driver ); + CID_Driver_Done( CID_Driver driver ); FT_END_HEADER diff --git a/src/cid/cidriver.c b/src/cid/cidriver.c index dead1c4ad..9edbc698b 100644 --- a/src/cid/cidriver.c +++ b/src/cid/cidriver.c @@ -190,7 +190,10 @@ { /* first of all, the FT_Module_Class fields */ { - ft_module_font_driver | ft_module_driver_scalable, + ft_module_font_driver | + ft_module_driver_scalable | + ft_module_driver_has_hinter , + sizeof( FT_DriverRec ), "t1cid", /* module name */ 0x10000L, /* version 1.0 of driver */ @@ -198,8 +201,8 @@ 0, - (FT_Module_Constructor)CID_Init_Driver, - (FT_Module_Destructor) CID_Done_Driver, + (FT_Module_Constructor)CID_Driver_Init, + (FT_Module_Destructor) CID_Driver_Done, (FT_Module_Requester) CID_Get_Interface }, @@ -208,16 +211,16 @@ sizeof( CID_SizeRec ), sizeof( CID_GlyphSlotRec ), - (FTDriver_initFace) CID_Init_Face, - (FTDriver_doneFace) CID_Done_Face, + (FTDriver_initFace) CID_Face_Init, + (FTDriver_doneFace) CID_Face_Done, - (FTDriver_initSize) 0, - (FTDriver_doneSize) 0, - (FTDriver_initGlyphSlot)0, - (FTDriver_doneGlyphSlot)0, + (FTDriver_initSize) CID_Size_Init, + (FTDriver_doneSize) CID_Size_Done, + (FTDriver_initGlyphSlot)CID_GlyphSlot_Init, + (FTDriver_doneGlyphSlot)CID_GlyphSlot_Done, - (FTDriver_setCharSizes) 0, - (FTDriver_setPixelSizes)0, + (FTDriver_setCharSizes) CID_Size_Reset, + (FTDriver_setPixelSizes)CID_Size_Reset, (FTDriver_loadGlyph) CID_Load_Glyph, (FTDriver_getCharIndex) CID_Get_Char_Index, diff --git a/src/type1/t1gload.c b/src/type1/t1gload.c index 515e3050c..78fa41ff8 100644 --- a/src/type1/t1gload.c +++ b/src/type1/t1gload.c @@ -241,8 +241,7 @@ if ( size && size->root.metrics.y_ppem < 24 ) glyph->root.outline.flags |= ft_outline_high_precision; - /* XXX: the following needs serious work to work properly with hinting! */ -#if 0 +#if 1 /* apply the font matrix, if any */ FT_Outline_Transform( &glyph->root.outline, &font_matrix );