From 980b76ea5e189f42259d559df19024cd4fe22aca Mon Sep 17 00:00:00 2001 From: Ken Sharp Date: Wed, 10 Feb 2010 07:02:43 +0100 Subject: [PATCH] Really fix Savannah bug #28678 (part 1). After long discussion, we now consider the character width vector (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* direction only. For example, if you are using the horizontal writing direction, you get the horizontal and vertical components of the advance width for this direction. Note that OpenType and CFF fonts don't have such a vertical component; instead, the GPOS table can be used to generate two-dimensional advance widths (but this isn't handled by FreeType). * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add `advance_v' field to hold the vertical component of the advance value. * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c (cff_slot_load), src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c (cid_load_glyph): Use it. --- ChangeLog | 22 ++++++++++++++++++++++ include/freetype/ftincrem.h | 8 ++++++-- src/cff/cffgload.c | 20 ++++---------------- src/cid/cidgload.c | 15 ++------------- src/truetype/ttgload.c | 7 ++++--- src/type1/t1gload.c | 15 ++------------- 6 files changed, 40 insertions(+), 47 deletions(-) diff --git a/ChangeLog b/ChangeLog index fee31741e..362bc5ec9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2010-01-27 Ken Sharp + + Really fix Savannah bug #28678 (part 1). + + After long discussion, we now consider the character width vector + (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* + direction only. For example, if you are using the horizontal + writing direction, you get the horizontal and vertical components of + the advance width for this direction. Note that OpenType and CFF fonts + don't have such a vertical component; instead, the GPOS table can be + used to generate two-dimensional advance widths (but this isn't + handled by FreeType). + + * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add + `advance_v' field to hold the vertical component of the advance + value. + + * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c + (cff_slot_load), src/type1/t1gload.c + (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c + (cid_load_glyph): Use it. + 2010-02-08 Werner Lemberg * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define. diff --git a/include/freetype/ftincrem.h b/include/freetype/ftincrem.h index 96abedea7..bb636ba49 100644 --- a/include/freetype/ftincrem.h +++ b/include/freetype/ftincrem.h @@ -4,7 +4,7 @@ /* */ /* FreeType incremental loading (specification). */ /* */ -/* Copyright 2002, 2003, 2006, 2007, 2008 by */ +/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -101,7 +101,10 @@ FT_BEGIN_HEADER * Top bearing, in font units. * * advance :: - * Glyph advance, in font units. + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. * * @note: * These correspond to horizontal or vertical metrics depending on the @@ -114,6 +117,7 @@ FT_BEGIN_HEADER FT_Long bearing_x; FT_Long bearing_y; FT_Long advance; + FT_Long advance_v; } FT_Incremental_MetricsRec; diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c index d598f84c0..b97228d11 100644 --- a/src/cff/cffgload.c +++ b/src/cff/cffgload.c @@ -2764,8 +2764,8 @@ #ifdef FT_CONFIG_OPTION_INCREMENTAL /* Incremental fonts can optionally override the metrics. */ - if ( !error && - face->root.internal->incremental_interface && + if ( !error && + face->root.internal->incremental_interface && face->root.internal->incremental_interface->funcs->get_glyph_metrics ) { FT_Incremental_MetricsRec metrics; @@ -2774,6 +2774,7 @@ metrics.bearing_x = decoder.builder.left_bearing.x; metrics.bearing_y = 0; metrics.advance = decoder.builder.advance.x; + metrics.advance_v = decoder.builder.advance.y; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, @@ -2781,20 +2782,7 @@ decoder.builder.left_bearing.x = metrics.bearing_x; decoder.builder.advance.x = metrics.advance; - - if ( !error ) - { - metrics.bearing_x = 0; - metrics.bearing_y = decoder.builder.left_bearing.y; - metrics.advance = decoder.builder.advance.y; - - error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( - face->root.internal->incremental_interface->object, - glyph_index, TRUE, &metrics ); - - decoder.builder.left_bearing.y = metrics.bearing_y; - decoder.builder.advance.y = metrics.advance; - } + decoder.builder.advance.y = metrics.advance_v; } #endif /* FT_CONFIG_OPTION_INCREMENTAL */ diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c index 6c8172161..0a4619c81 100644 --- a/src/cid/cidgload.c +++ b/src/cid/cidgload.c @@ -175,25 +175,14 @@ metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); metrics.bearing_y = 0; metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); + metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); error = inc->funcs->get_glyph_metrics( inc->object, glyph_index, FALSE, &metrics ); decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); - - if ( !error ) - { - metrics.bearing_x = 0; - metrics.bearing_y = FIXED_TO_INT( decoder->builder.left_bearing.y ); - metrics.advance = FIXED_TO_INT( decoder->builder.advance.y ); - - error = inc->funcs->get_glyph_metrics( inc->object, - glyph_index, TRUE, &metrics ); - - decoder->builder.left_bearing.y = INT_TO_FIXED( metrics.bearing_y ); - decoder->builder.advance.y = INT_TO_FIXED( metrics.advance ); - } + decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); } #endif /* FT_CONFIG_OPTION_INCREMENTAL */ diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 74fb73dea..57ea0baa7 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -163,9 +163,9 @@ #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 && + /* If this is an incrementally loaded font check whether 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; @@ -175,6 +175,7 @@ metrics.bearing_x = left_bearing; metrics.bearing_y = 0; metrics.advance = advance_width; + metrics.advance_v = 0; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, diff --git a/src/type1/t1gload.c b/src/type1/t1gload.c index f23936fea..1fbc63e46 100644 --- a/src/type1/t1gload.c +++ b/src/type1/t1gload.c @@ -105,25 +105,14 @@ metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); metrics.bearing_y = 0; metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); + metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); error = inc->funcs->get_glyph_metrics( inc->object, glyph_index, FALSE, &metrics ); decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); - - if ( !error ) - { - metrics.bearing_x = 0; - metrics.bearing_y = FIXED_TO_INT( decoder->builder.left_bearing.y ); - metrics.advance = FIXED_TO_INT( decoder->builder.advance.y ); - - error = inc->funcs->get_glyph_metrics( inc->object, - glyph_index, TRUE, &metrics ); - - decoder->builder.left_bearing.y = INT_TO_FIXED( metrics.bearing_y ); - decoder->builder.advance.y = INT_TO_FIXED( metrics.advance ); - } + decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); } #endif /* FT_CONFIG_OPTION_INCREMENTAL */