From 46960df7b377494426ebccb8b99c65aca558c2ae Mon Sep 17 00:00:00 2001 From: Graham Asher Date: Thu, 13 Feb 2003 17:49:27 +0000 Subject: [PATCH] The incremental interface now passes the old metrics when asking for replacement metrics so that they can be modified, not just replaced. For example, CFF fonts need this. --- include/freetype/ftincrem.h | 19 ++++---- src/cff/cffgload.c | 23 ++++++++++ src/cid/cidgload.c | 22 ++++----- src/truetype/ttgload.c | 91 +++++++++++++++++-------------------- src/type1/t1gload.c | 24 +++++----- 5 files changed, 96 insertions(+), 83 deletions(-) diff --git a/include/freetype/ftincrem.h b/include/freetype/ftincrem.h index 08ce7a959..c9e8b56d6 100644 --- a/include/freetype/ftincrem.h +++ b/include/freetype/ftincrem.h @@ -174,21 +174,22 @@ FT_BEGIN_HEADER * vertical :: * If true, return vertical metrics. * + * ametrics :: + * This parameter is used for both input and output. + * The original glyph metrics, if any, in font units. If metrics are + * not available all the values must be set to zero. + * * @output: * ametrics :: - * The glyph metrics in font units. - * - * afound :: - * True if there are metrics at all. + * The replacement glyph metrics in font units. * */ typedef FT_Error (*FT_Incremental_GetGlyphMetricsFunc) - ( FT_Incremental incremental, - FT_UInt glyph_index, - FT_Bool vertical, - FT_Incremental_MetricsRec *ametrics, - FT_Bool *afound ); + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); /************************************************************************** diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c index 69277ae59..0432aa021 100644 --- a/src/cff/cffgload.c +++ b/src/cff/cffgload.c @@ -2363,6 +2363,29 @@ cff_builder_done( &decoder.builder ); } + #ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + metrics.bearing_x = decoder.builder.left_bearing.x; + metrics.bearing_y = decoder.builder.left_bearing.y; + metrics.advance = decoder.builder.advance.x; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + decoder.builder.left_bearing.x = metrics.bearing_x; + decoder.builder.left_bearing.y = metrics.bearing_y; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = 0; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + font_matrix = cff->top_font.font_dict.font_matrix; font_offset = cff->top_font.font_dict.font_offset; diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c index 9e606742a..15231f86c 100644 --- a/src/cid/cidgload.c +++ b/src/cid/cidgload.c @@ -89,7 +89,7 @@ else -#endif +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ /* For ordinary fonts read the CID font dictionary index */ /* and charstring offset from the CIDMap. */ @@ -162,23 +162,21 @@ face->root.internal->incremental_interface && face->root.internal->incremental_interface->funcs->get_glyph_metrics ) { - FT_Bool found = FALSE; FT_Incremental_MetricsRec metrics; - + metrics.bearing_x = decoder->builder.left_bearing.x; + metrics.bearing_y = decoder->builder.left_bearing.y; + metrics.advance = decoder->builder.advance.x; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics, &found ); - if ( found ) - { - decoder->builder.left_bearing.x = metrics.bearing_x; - decoder->builder.left_bearing.y = metrics.bearing_y; - decoder->builder.advance.x = metrics.advance; - decoder->builder.advance.y = 0; - } + glyph_index, FALSE, &metrics ); + decoder->builder.left_bearing.x = metrics.bearing_x; + decoder->builder.left_bearing.y = metrics.bearing_y; + decoder->builder.advance.x = metrics.advance; + decoder->builder.advance.y = 0; } -#endif +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ Exit: return error; diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 7f4e8f51c..42cf13ac7 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -808,42 +808,33 @@ FT_Short left_bearing = 0; FT_UShort advance_width = 0; -#ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_Bool metrics_found = FALSE; + Get_HMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &left_bearing, + &advance_width ); +#ifdef FT_CONFIG_OPTION_INCREMENTAL /* If this is an incrementally loaded font see if there are */ /* overriding metrics for this glyph. */ if ( face->root.internal->incremental_interface && face->root.internal->incremental_interface->funcs->get_glyph_metrics ) { - FT_Incremental_MetricsRec m; - + FT_Incremental_MetricsRec metrics; + metrics.bearing_x = left_bearing; + metrics.bearing_y = 0; + metrics.advance = advance_width; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, - glyph_index, FALSE, &m, &metrics_found ); + glyph_index, FALSE, &metrics ); if ( error ) goto Exit; - left_bearing = (FT_Short)m.bearing_x; - advance_width = (FT_UShort)m.advance; + left_bearing = (FT_Short)metrics.bearing_x; + advance_width = (FT_UShort)metrics.advance; } - if ( !metrics_found ) - Get_HMetrics( face, glyph_index, - (FT_Bool)!( loader->load_flags & - FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), - &left_bearing, - &advance_width ); - -#else - - Get_HMetrics( face, glyph_index, - (FT_Bool)!( loader->load_flags & - FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), - &left_bearing, - &advance_width ); - #endif /* FT_CONFIG_OPTION_INCREMENTAL */ loader->left_bearing = left_bearing; @@ -1326,7 +1317,6 @@ exec->is_composite = TRUE; exec->pedantic_hinting = (FT_Bool)( loader->load_flags & FT_LOAD_PEDANTIC ); - error = TT_Run_Context( exec, ((TT_Size)loader->size)->debug ); if ( error && exec->pedantic_hinting ) goto Fail; @@ -1449,33 +1439,9 @@ FT_Pos left; /* scaled vertical left side bearing */ FT_Pos top; /* scaled vertical top side bearing */ FT_Pos advance; /* scaled vertical advance height */ - FT_Bool metrics_found = FALSE; - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - /* If this is an incrementally loaded font see if there are */ - /* overriding metrics for this glyph. */ - if ( face->root.internal->incremental_interface && - face->root.internal->incremental_interface->funcs->get_glyph_metrics ) - { - FT_Incremental_MetricsRec m; - FT_Error error = - face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, TRUE, &m, &metrics_found ); - - - if ( error ) - return error; - - top_bearing = (FT_Short)m.bearing_y; - advance_height = (FT_UShort)m.advance; - } - -#endif /* FT_CONFIG_OPTION_INCREMENTAL */ /* Get the unscaled top bearing and advance height. */ - if ( !metrics_found && face->vertical_info && + if ( face->vertical_info && face->vertical.number_Of_VMetrics > 0 ) { /* Don't assume that both the vertical header and vertical */ @@ -1516,8 +1482,35 @@ } } +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + FT_Error error = 0; + + metrics.bearing_x = 0; + metrics.bearing_y = top_bearing; + metrics.advance = advance_height; + error = + face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &metrics ); + + if ( error ) + return error; + + top_bearing = (FT_Short)metrics.bearing_y; + advance_height = (FT_UShort)metrics.advance; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + /* We must adjust the top_bearing value from the bounding box given */ - /* in the glyph header to te bounding box calculated with */ + /* in the glyph header to the bounding box calculated with */ /* FT_Get_Outline_CBox(). */ /* scale the metrics */ diff --git a/src/type1/t1gload.c b/src/type1/t1gload.c index 0a3155db3..6ebb8723c 100644 --- a/src/type1/t1gload.c +++ b/src/type1/t1gload.c @@ -76,7 +76,7 @@ glyph_index, char_string ); else -#endif +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ /* For ordinary fonts get the character data stored in the face record. */ { @@ -95,23 +95,21 @@ if ( !error && face->root.internal->incremental_interface && face->root.internal->incremental_interface->funcs->get_glyph_metrics ) { - FT_Bool found = FALSE; FT_Incremental_MetricsRec metrics; - + metrics.bearing_x = decoder->builder.left_bearing.x; + metrics.bearing_y = decoder->builder.left_bearing.y; + metrics.advance = decoder->builder.advance.x; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics, &found ); - if ( found ) - { - decoder->builder.left_bearing.x = metrics.bearing_x; - decoder->builder.left_bearing.y = metrics.bearing_y; - decoder->builder.advance.x = metrics.advance; - decoder->builder.advance.y = 0; - } + glyph_index, FALSE, &metrics ); + decoder->builder.left_bearing.x = metrics.bearing_x; + decoder->builder.left_bearing.y = metrics.bearing_y; + decoder->builder.advance.x = metrics.advance; + decoder->builder.advance.y = 0; } -#endif +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ return error; } @@ -137,7 +135,7 @@ face->root.internal->incremental_interface->object, &glyph_data ); } -#endif +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ return error; }