T2_Parse_CharStrings: Added more logic to glyph width setting code to take into account even/odd argument counts.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
diff --git a/src/cff/t2gload.c b/src/cff/t2gload.c
index e28331f..5fe11a6 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;