From 2c7b3c73854516cfde9fdb84dd036b23e990823c Mon Sep 17 00:00:00 2001 From: Tom Kacvinsky Date: Mon, 27 Nov 2000 08:22:23 +0000 Subject: [PATCH] T2_Parse_CharStrings: Added more logic to glyph width setting code to take into account even/odd argument counts. --- src/cff/t2gload.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/cff/t2gload.c b/src/cff/t2gload.c index e28331fbf..5fe11a6a4 100644 --- a/src/cff/t2gload.c +++ b/src/cff/t2gload.c @@ -857,13 +857,40 @@ { /* If `nominal_width' is non-zero, the number is really a difference */ /* against `nominal_width'. Else, the number here is truly a width, */ - /* not a difference. If the font does not set `nominal_width', then */ - /* `nominal_width' defaults to zero, and so we can set 'glyph_width' */ - /* to `nominal_width' plus number on the stack -- for either case. */ + /* not a difference against `nominal_width'. If the font does not */ + /* set `nominal_width', then `nominal_width' defaults to zero, and */ + /* so we can set 'glyph_width' to `nominal_width' plus number on the */ + /* stack -- for either case. */ - decoder->glyph_width = decoder->nominal_width + ( stack[0] >> 16 ); - num_args--; - args++; + FT_Int set_width_ok; + + switch ( op ) + { + case t2_op_hmoveto: + case t2_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case t2_op_hstem: + case t2_op_vstem: + case t2_op_hstemhm: + case t2_op_vstemhm: + case t2_op_endchar: + case t2_op_rmoveto: + set_width_ok = num_args & 1; + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + ( stack[0] >> 16 ); + num_args--; + args++; + } } decoder->read_width = 0;