[psaux, type1] Trace PostScript dictionaries and other things.

The tracing of /Encoding, /Subrs, and /Charstrings is rudimentary
right now.

* src/psaux/psobjs.c (ps_parser_load_field,
ps_parser_load_field_table): Add tracing calls.

* src/psaux/t1decode.c (t1_decoder_parse_charstrings): Make tracing
output more compact.

* src/type1/t1gload.c (T1_Compute_Max_Advance, T1_Get_Advances): Add
tracing messages.

* src/type1/t1load.c (parse_blend_axis_types,
parse_blend_design_positions, parse_blend_design_map,
parse_weight_vector, t1_load_keyword, t1_parse_font_matrix,
parse_encoding, parse_subrs, parse_charstrings, T1_Open_Face): Add
tracing calls.

* src/type1/t1objs.c (T1_Face_Init): Add tracing call.

* src/sfnt/sfobjs.c (sfnt_init_face): Make tracing message more
verbose.
GSoC-2018-nikhil
Werner Lemberg 7 years ago
parent 580c94d8f7
commit 8ed5346877
  1. 27
      ChangeLog
  2. 1
      src/cff/cffparse.c
  3. 29
      src/psaux/psobjs.c
  4. 6
      src/psaux/t1decode.c
  5. 4
      src/sfnt/sfobjs.c
  6. 17
      src/type1/t1gload.c
  7. 100
      src/type1/t1load.c
  8. 4
      src/type1/t1objs.c

@ -1,3 +1,30 @@
2018-07-25 Werner Lemberg <wl@gnu.org>
[psaux, type1] Trace PostScript dictionaries and other things.
The tracing of /Encoding, /Subrs, and /Charstrings is rudimentary
right now.
* src/psaux/psobjs.c (ps_parser_load_field,
ps_parser_load_field_table): Add tracing calls.
* src/psaux/t1decode.c (t1_decoder_parse_charstrings): Make tracing
output more compact.
* src/type1/t1gload.c (T1_Compute_Max_Advance, T1_Get_Advances): Add
tracing messages.
* src/type1/t1load.c (parse_blend_axis_types,
parse_blend_design_positions, parse_blend_design_map,
parse_weight_vector, t1_load_keyword, t1_parse_font_matrix,
parse_encoding, parse_subrs, parse_charstrings, T1_Open_Face): Add
tracing calls.
* src/type1/t1objs.c (T1_Face_Init): Add tracing call.
* src/sfnt/sfobjs.c (sfnt_init_face): Make tracing message more
verbose.
2018-07-25 Werner Lemberg <wl@gnu.org>
Fix minor ASAN run-time warnings.

@ -1146,6 +1146,7 @@
{
FT_UInt v = *p;
/* Opcode 31 is legacy MM T2 operator, not a number. */
/* Opcode 255 is reserved and should not appear in fonts; */
/* it is used internally for CFF2 blends. */

@ -1108,18 +1108,22 @@
{
case T1_FIELD_TYPE_BOOL:
val = ps_tobool( &cur, limit );
FT_TRACE4(( " %s", val ? "true" : "false" ));
goto Store_Integer;
case T1_FIELD_TYPE_FIXED:
val = PS_Conv_ToFixed( &cur, limit, 0 );
FT_TRACE4(( " %f", (double)val / 65536 ));
goto Store_Integer;
case T1_FIELD_TYPE_FIXED_1000:
val = PS_Conv_ToFixed( &cur, limit, 3 );
FT_TRACE4(( " %f", (double)val / 65536 / 1000 ));
goto Store_Integer;
case T1_FIELD_TYPE_INTEGER:
val = PS_Conv_ToInt( &cur, limit );
FT_TRACE4(( " %ld", val ));
/* fall through */
Store_Integer:
@ -1196,6 +1200,13 @@
FT_MEM_COPY( string, cur, len );
string[len] = 0;
#ifdef FT_DEBUG_LEVEL_TRACE
if ( token.type == T1_TOKEN_TYPE_STRING )
FT_TRACE4(( " (%s)", string ));
else
FT_TRACE4(( " /%s", string ));
#endif
*(FT_String**)q = string;
}
break;
@ -1221,6 +1232,12 @@
bbox->yMin = FT_RoundFix( temp[1] );
bbox->xMax = FT_RoundFix( temp[2] );
bbox->yMax = FT_RoundFix( temp[3] );
FT_TRACE4(( " [%d %d %d %d]",
bbox->xMin / 65536,
bbox->yMin / 65536,
bbox->xMax / 65536,
bbox->yMax / 65536 ));
}
break;
@ -1259,6 +1276,7 @@
skip_spaces( &cur, limit );
}
FT_TRACE4(( " [" ));
for ( i = 0; i < max_objects; i++ )
{
FT_BBox* bbox = (FT_BBox*)objects[i];
@ -1268,7 +1286,14 @@
bbox->yMin = FT_RoundFix( temp[i + max_objects] );
bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );
bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );
FT_TRACE4(( " [%d %d %d %d]",
bbox->xMin / 65536,
bbox->yMin / 65536,
bbox->xMax / 65536,
bbox->yMax / 65536 ));
}
FT_TRACE4(( "]" ));
FT_FREE( temp );
}
@ -1341,6 +1366,8 @@
*(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
(FT_Byte)num_elements;
FT_TRACE4(( " [" ));
/* we now load each element, adjusting the field.offset on each one */
token = elements;
for ( ; num_elements > 0; num_elements--, token++ )
@ -1359,6 +1386,8 @@
fieldrec.offset += fieldrec.size;
}
FT_TRACE4(( "]" ));
#if 0 /* obsolete -- keep for reference */
if ( pflags )
*pflags |= 1L << field->flag_bit;

@ -479,9 +479,6 @@
if ( decoder->buildchar && decoder->len_buildchar > 0 )
FT_ARRAY_ZERO( decoder->buildchar, decoder->len_buildchar );
FT_TRACE4(( "\n"
"Start charstring\n" ));
zone->base = charstring_base;
limit = zone->limit = charstring_base + charstring_len;
ip = zone->cursor = zone->base;
@ -1237,7 +1234,10 @@
/* the glyph's metrics (lsb + advance width), not load the */
/* rest of it; so exit immediately */
if ( builder->metrics_only )
{
FT_TRACE4(( "\n" ));
return FT_Err_Ok;
}
break;

@ -918,7 +918,9 @@
/* Stream may have changed in sfnt_open_font. */
stream = face->root.stream;
FT_TRACE2(( "sfnt_init_face: %08p, %d\n", face, face_instance_index ));
FT_TRACE2(( "sfnt_init_face: %08p (index %d)\n",
face,
face_instance_index ));
face_index = FT_ABS( face_instance_index ) & 0xFFFF;

@ -62,6 +62,7 @@
PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face );
#endif
decoder->font_matrix = type1->font_matrix;
decoder->font_offset = type1->font_offset;
@ -249,6 +250,8 @@
*max_advance = 0;
FT_TRACE6(( "T1_Compute_Max_Advance: start parsing glyphs\n" ));
/* for each glyph, parse the glyph charstring and extract */
/* the advance width */
for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
@ -261,6 +264,10 @@
/* ignore the error if one occurred - skip to next glyph */
}
FT_TRACE6(( "T1_Compute_Max_Advance: parsing glyphs done\n"
" max advance: %f\n",
*max_advance / 65536.0 ));
psaux->t1_decoder_funcs->done( &decoder );
return FT_Err_Ok;
@ -285,8 +292,13 @@
if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
{
for ( nn = 0; nn < count; nn++ )
{
advances[nn] = 0;
FT_TRACE5(( " idx %d: advance height 0 font units\n",
first + nn ));
}
return FT_Err_Ok;
}
@ -320,6 +332,11 @@
advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );
else
advances[nn] = 0;
FT_TRACE5(( " idx %d: advance width %d font unit%s\n",
first + nn,
advances[nn],
advances[nn] == 1 ? "" : "s" ));
}
return FT_Err_Ok;

@ -716,6 +716,8 @@
if ( error )
goto Exit;
FT_TRACE4(( " [" ));
blend = face->blend;
memory = face->root.memory;
@ -738,11 +740,13 @@
goto Exit;
}
FT_TRACE4(( " /%.*s", len, token->start ));
name = (FT_Byte*)blend->axis_names[n];
if ( name )
{
FT_TRACE0(( "parse_blend_axis_types:"
" overwriting axis name `%s' with `%*.s'\n",
" overwriting axis name `%s' with `%.*s'\n",
name, len, token->start ));
FT_FREE( name );
}
@ -755,6 +759,8 @@
name[len] = '\0';
}
FT_TRACE4(( "]\n" ));
Exit:
loader->parser.root.error = error;
}
@ -799,6 +805,8 @@
blend = face->blend;
num_axis = 0; /* make compiler happy */
FT_TRACE4(( " [" ));
for ( n = 0; n < num_designs; n++ )
{
T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
@ -839,6 +847,7 @@
}
/* now read each axis token into the design position */
FT_TRACE4(( " [" )) ;
for ( axis = 0; axis < n_axis; axis++ )
{
T1_Token token2 = axis_tokens + axis;
@ -847,9 +856,13 @@
parser->root.cursor = token2->start;
parser->root.limit = token2->limit;
blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );
FT_TRACE4(( " %f", (double)blend->design_pos[n][axis] / 65536 ));
}
FT_TRACE4(( "]" )) ;
}
FT_TRACE4(( "]\n" ));
loader->parser.root.cursor = old_cursor;
loader->parser.root.limit = old_limit;
}
@ -896,6 +909,8 @@
goto Exit;
blend = face->blend;
FT_TRACE4(( " [" ));
/* now read each axis design map */
for ( n = 0; n < num_axis; n++ )
{
@ -912,6 +927,8 @@
T1_ToTokenArray( parser, point_tokens,
T1_MAX_MM_MAP_POINTS, &num_points );
FT_TRACE4(( " [" ));
if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
{
FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
@ -945,9 +962,17 @@
map->design_points[p] = T1_ToInt( parser );
map->blend_points [p] = T1_ToFixed( parser, 0 );
FT_TRACE4(( " [%d %f]",
map->design_points[p],
(double)map->blend_points[p] / 65536 ));
}
FT_TRACE4(( "]" ));
}
FT_TRACE4(( "]\n" ));
parser->root.cursor = old_cursor;
parser->root.limit = old_limit;
@ -1007,6 +1032,8 @@
old_cursor = parser->root.cursor;
old_limit = parser->root.limit;
FT_TRACE4(( "[" ));
for ( n = 0; n < num_designs; n++ )
{
token = design_tokens + n;
@ -1015,8 +1042,12 @@
blend->default_weight_vector[n] =
blend->weight_vector[n] = T1_ToFixed( parser, 0 );
FT_TRACE4(( " %f", (float)blend->weight_vector[n] / 65536 ));
}
FT_TRACE4(( "]\n" ));
parser->root.cursor = old_cursor;
parser->root.limit = old_limit;
@ -1031,8 +1062,16 @@
parse_buildchar( T1_Face face,
T1_Loader loader )
{
FT_UInt i;
face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser,
0, NULL, 0 );
FT_TRACE4(( " [" ));
for ( i = 0; i < face->len_buildchar; i++ )
FT_TRACE4(( " 0" ));
FT_TRACE4(( "]\n" ));
return;
}
@ -1068,6 +1107,8 @@
/* if the keyword has a dedicated callback, call it */
if ( field->type == T1_FIELD_TYPE_CALLBACK )
{
FT_TRACE4(( " %s", field->ident ));
field->reader( (FT_Face)face, loader );
error = loader->parser.root.error;
goto Exit;
@ -1145,6 +1186,8 @@
max_objects = 0;
}
FT_TRACE4(( " %s", field->ident ));
if ( *objects )
{
if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
@ -1164,6 +1207,8 @@
error = FT_Err_Ok;
}
FT_TRACE4(( "\n" ));
Exit:
return error;
}
@ -1176,6 +1221,8 @@
FT_UNUSED( face );
loader->keywords_encountered |= T1_PRIVATE;
FT_TRACE4(( "\n" ));
}
@ -1255,6 +1302,14 @@
return;
}
FT_TRACE4(( " [%f %f %f %f %f %f]\n",
(double)temp[0] / 65536 / 1000,
(double)temp[1] / 65536 / 1000,
(double)temp[2] / 65536 / 1000,
(double)temp[3] / 65536 / 1000,
(double)temp[4] / 65536 / 1000,
(double)temp[5] / 65536 / 1000));
temp_scale = FT_ABS( temp[3] );
if ( temp_scale == 0 )
@ -1277,7 +1332,6 @@
temp[5] = FT_DivFix( temp[5], temp_scale );
temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
}
matrix->xx = temp[0];
matrix->yx = temp[1];
matrix->xy = temp[2];
@ -1498,6 +1552,15 @@
T1_Skip_Spaces( parser );
}
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE4(( " [" ));
/* XXX show encoding vector */
FT_TRACE4(( "..." ));
FT_TRACE4(( "]\n" ));
#endif
face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
parser->root.cursor = cur;
}
@ -1508,18 +1571,30 @@
{
if ( cur + 17 < limit &&
ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
{
face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
FT_TRACE4(( " StandardEncoding\n" ));
}
else if ( cur + 15 < limit &&
ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
{
face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
FT_TRACE4(( " ExpertEncoding\n" ));
}
else if ( cur + 18 < limit &&
ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
{
face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
FT_TRACE4(( " ISOLatin1Encoding\n" ));
}
else
{
parser->root.error = FT_ERR( Ignore );
FT_TRACE4(( "<unknown>\n" ));
}
}
}
@ -1700,6 +1775,15 @@
if ( !loader->num_subrs )
loader->num_subrs = num_subrs;
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE4(( " <" ));
/* XXX show subrs? */
FT_TRACE4(( "%d elements", num_subrs ));
FT_TRACE4(( ">\n" ));
#endif
return;
Fail:
@ -2021,6 +2105,15 @@
loader->num_glyphs += 1;
}
#ifdef FT_DEBUG_LEVEL_TRACE
FT_TRACE4(( " <" ));
/* XXX show charstrings? */
FT_TRACE4(( "%d elements", loader->num_glyphs ));
FT_TRACE4(( ">\n" ));
#endif
return;
Fail:
@ -2220,6 +2313,7 @@
? T1_FIELD_DICT_PRIVATE
: T1_FIELD_DICT_FONTDICT;
if ( !( dict & keyword->dict ) )
{
FT_TRACE1(( "parse_dict: found `%s' but ignoring it"
@ -2334,6 +2428,7 @@
if ( error )
goto Exit;
FT_TRACE4(( " top dictionary:\n" ));
error = parse_dict( face, &loader,
parser->base_dict, parser->base_len );
if ( error )
@ -2343,6 +2438,7 @@
if ( error )
goto Exit;
FT_TRACE4(( " private dictionary:\n" ));
error = parse_dict( face, &loader,
parser->private_dict, parser->private_len );
if ( error )

@ -347,6 +347,10 @@
if ( error )
goto Exit;
FT_TRACE2(( "T1_Face_Init: %08p (index %d)\n",
face,
face_index ));
/* if we just wanted to check the format, leave successfully now */
if ( face_index < 0 )
goto Exit;

Loading…
Cancel
Save