From 1c0d4acb256927c69bcfadc47c98458754e20865 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Tue, 6 Jun 2000 20:41:48 +0000 Subject: [PATCH] Fine-tuned a lot of tracing levels to make them more functional with ftview. Added a lot of \n to tracing messages. Fixed a serious bug in loading SBit offsets (missing parentheses around a xxx ? yyy : zzz construct). Replaced most GET_xxx() functions with calls to READ_Frame() in ttsbit.c --- src/base/ftextend.c | 8 +- src/base/ftinit.c | 2 +- src/base/ftraster.c | 4 +- src/base/ftstream.c | 14 +-- src/cff/t2objs.c | 2 +- src/cid/cidparse.c | 2 +- src/sfnt/ttload.c | 2 +- src/sfnt/ttpost.h | 7 -- src/sfnt/ttsbit.c | 201 +++++++++++++++-------------------------- src/sfnt/ttsbit.h | 59 ------------ src/truetype/ttgload.c | 17 ++-- 11 files changed, 100 insertions(+), 218 deletions(-) diff --git a/src/base/ftextend.c b/src/base/ftextend.c index 72698717b..252934db4 100644 --- a/src/base/ftextend.c +++ b/src/base/ftextend.c @@ -77,7 +77,7 @@ registry->cur_offset = 0; driver->extensions = registry; - FT_TRACE2(( "FT_Init_Extensions: success" )); + FT_TRACE2(( "FT_Init_Extensions: success\n" )); return FT_Err_Ok; } @@ -153,7 +153,7 @@ registry->num_extensions++; registry->cur_offset += ( cur->size + FT_ALIGNMENT-1 ) & -FT_ALIGNMENT; - FT_TRACE1(( "FT_Register_Extension: `%s' successfully registered", + FT_TRACE1(( "FT_Register_Extension: `%s' successfully registered\n", cur->id )); } @@ -204,7 +204,7 @@ { *extension_interface = cur->interface; - FT_TRACE1(( "FT_Get_Extension: got `%s'", extension_id )); + FT_TRACE1(( "FT_Get_Extension: got `%s'\n", extension_id )); return (void*)((char*)face->extensions + cur->offset); } @@ -212,7 +212,7 @@ /* could not find the extension id */ - FT_ERROR(( "FT_Get_Extension: couldn't find `%s'", extension_id )); + FT_ERROR(( "FT_Get_Extension: couldn't find `%s'\n", extension_id )); *extension_interface = 0; diff --git a/src/base/ftinit.c b/src/base/ftinit.c index 3d524acd0..8b5dabe42 100644 --- a/src/base/ftinit.c +++ b/src/base/ftinit.c @@ -130,7 +130,7 @@ const FT_DriverInterface* ft_default_drivers[] = if ( !memory ) { FT_ERROR(( "FT_Init_FreeType:" )); - FT_ERROR(( " cannot find memory manager" )); + FT_ERROR(( " cannot find memory manager\n" )); return FT_Err_Unimplemented_Feature; } diff --git a/src/base/ftraster.c b/src/base/ftraster.c index c450d0b4a..40ee19336 100644 --- a/src/base/ftraster.c +++ b/src/base/ftraster.c @@ -565,7 +565,7 @@ break; default: - FT_ERROR(( "Invalid profile direction in Raster:New_Profile !!\n" )); + FT_ERROR(( "New_Profile: invalid profile direction!\n" )); ras.error = Raster_Err_Invalid; return FAILURE; } @@ -609,7 +609,7 @@ if ( h < 0 ) { - FT_ERROR(( "Negative height encountered in End_Profile!\n" )); + FT_ERROR(( "End_Profile: negative height encountered!\n" )); ras.error = Raster_Err_Neg_Height; return FAILURE; } diff --git a/src/base/ftstream.c b/src/base/ftstream.c index 286cc5f69..d43eb01e5 100644 --- a/src/base/ftstream.c +++ b/src/base/ftstream.c @@ -138,7 +138,7 @@ if ( read_bytes < count ) { FT_ERROR(( "FT_Read_Stream_At:" )); - FT_ERROR(( " invalid read; expected %lu bytes, got %lu", + FT_ERROR(( " invalid read; expected %lu bytes, got %lu\n", count, read_bytes )); error = FT_Err_Invalid_Stream_Operation; @@ -208,7 +208,7 @@ if ( read_bytes < count ) { FT_ERROR(( "FT_Access_Frame:" )); - FT_ERROR(( " invalid read; expected %lu bytes, got %lu", + FT_ERROR(( " invalid read; expected %lu bytes, got %lu\n", count, read_bytes )); FREE( stream->base ); @@ -225,7 +225,7 @@ stream->pos + count > stream->size ) { FT_ERROR(( "FT_Access_Frame:" )); - FT_ERROR(( " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx", + FT_ERROR(( " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", stream->pos, count, stream->size )); error = FT_Err_Invalid_Stream_Operation; @@ -364,7 +364,7 @@ Fail: *error = FT_Err_Invalid_Stream_Operation; FT_ERROR(( "FT_Read_Char:" )); - FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx", + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", stream->pos, stream->size )); return 0; @@ -410,7 +410,7 @@ Fail: *error = FT_Err_Invalid_Stream_Operation; FT_ERROR(( "FT_Read_Short:" )); - FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx", + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", stream->pos, stream->size )); return 0; @@ -456,7 +456,7 @@ Fail: *error = FT_Err_Invalid_Stream_Operation; FT_ERROR(( "FT_Read_Offset:" )); - FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx", + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", stream->pos, stream->size )); return 0; @@ -501,7 +501,7 @@ Fail: FT_ERROR(( "FT_Read_Long:" )); - FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx", + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", stream->pos, stream->size )); *error = FT_Err_Invalid_Stream_Operation; diff --git a/src/cff/t2objs.c b/src/cff/t2objs.c index f87d0dd95..61cc856c4 100644 --- a/src/cff/t2objs.c +++ b/src/cff/t2objs.c @@ -85,7 +85,7 @@ /* We must also be able to accept Mac/GX fonts, as well as OT ones */ if ( face->format_tag != 0x4f54544f ) /* OpenType/CFF font */ { - FT_TRACE2(( "[not a valid OpenType/CFF font]" )); + FT_TRACE2(( "[not a valid OpenType/CFF font]\n" )); goto Bad_Format; } diff --git a/src/cid/cidparse.c b/src/cid/cidparse.c index c400b7b4a..1894d1564 100644 --- a/src/cid/cidparse.c +++ b/src/cid/cidparse.c @@ -868,7 +868,7 @@ if ( strncmp( stream->cursor, "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) ) { - FT_ERROR(( "Not a valid CID-keyed font\n" )); + FT_ERROR(( "[not a valid CID-keyed font]\n" )); error = FT_Err_Unknown_File_Format; } diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index 4355bed89..8a8fc8475 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -58,7 +58,7 @@ TT_Table* limit; - FT_TRACE3(( "TT_LookUp_Table: %08p, `%c%c%c%c' )\n", + FT_TRACE3(( "TT_LookUp_Table: %08p, `%c%c%c%c'\n", face, (TT_Char)( tag >> 24 ), (TT_Char)( tag >> 16 ), diff --git a/src/sfnt/ttpost.h b/src/sfnt/ttpost.h index 4c385d411..ceb7c5999 100644 --- a/src/sfnt/ttpost.h +++ b/src/sfnt/ttpost.h @@ -31,19 +31,12 @@ extern "C" { #define TT_Err_Invalid_Post_Table_Format 0x0B00 #define TT_Err_Invalid_Post_Table 0x0B01 -#if 0 - /* the 258 standard Mac glyph names, used for format 1.0 and 2.5 */ - LOCAL_DEF - const TT_String* TT_Mac_Postscript_Names[]; -#endif - LOCAL_DEF TT_Error TT_Get_PS_Name( TT_Face face, TT_UInt index, TT_String** PSname ); - LOCAL_DEF void TT_Free_Post_Names( TT_Face face ); diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c index 79e5f8a7b..07c165f2c 100644 --- a/src/sfnt/ttsbit.c +++ b/src/sfnt/ttsbit.c @@ -170,96 +170,21 @@ } - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_Small_SBit_Metrics */ - /* */ - /* */ - /* Loads a small bitmap metrics record. */ - /* */ - /* */ - /* stream :: The input stream. */ - /* */ - /* */ - /* metrics :: A small metrics structure. */ - /* */ - static - void TT_Load_Small_SBit_Metrics( TT_SBit_Small_Metrics* metrics, - FT_Stream stream ) + const FT_Frame_Field sbit_metrics_fields[] = { - metrics->height = GET_Byte(); - metrics->width = GET_Byte(); - metrics->bearingX = GET_Char(); - metrics->bearingY = GET_Char(); - metrics->advance = GET_Byte(); - } + FT_FRAME_START( 8 ), + FT_FRAME_BYTE( TT_SBit_Metrics, height ), + FT_FRAME_BYTE( TT_SBit_Metrics, width ), + FT_FRAME_CHAR( TT_SBit_Metrics, horiBearingX ), + FT_FRAME_CHAR( TT_SBit_Metrics, horiBearingY ), + FT_FRAME_BYTE( TT_SBit_Metrics, horiAdvance ), - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_SBit_Metrics */ - /* */ - /* */ - /* Loads a bitmap metrics record. */ - /* */ - /* */ - /* stream :: The input stream. */ - /* */ - /* */ - /* metrics :: A metrics structure. */ - /* */ - static - void TT_Load_SBit_Metrics( TT_SBit_Metrics* metrics, - FT_Stream stream ) - { - metrics->height = GET_Byte(); - metrics->width = GET_Byte(); - - metrics->horiBearingX = GET_Char(); - metrics->horiBearingY = GET_Char(); - metrics->horiAdvance = GET_Byte(); - - metrics->vertBearingX = GET_Char(); - metrics->vertBearingY = GET_Char(); - metrics->vertAdvance = GET_Byte(); - } - - - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_SBit_Line_Metrics */ - /* */ - /* */ - /* Loads a bitmap line metrics record. */ - /* */ - /* */ - /* stream :: The input stream. */ - /* */ - /* */ - /* metrics :: A line metrics structure. */ - /* */ - static - void TT_Load_SBit_Line_Metrics( TT_SBit_Line_Metrics* metrics, - FT_Stream stream ) - { - metrics->ascender = GET_Char(); - metrics->descender = GET_Char(); - metrics->max_width = GET_Byte(); - - metrics->caret_slope_numerator = GET_Char(); - metrics->caret_slope_denominator = GET_Char(); - metrics->caret_offset = GET_Char(); - - metrics->min_origin_SB = GET_Char(); - metrics->min_advance_SB = GET_Char(); - metrics->max_before_BL = GET_Char(); - metrics->min_after_BL = GET_Char(); - metrics->pads[0] = GET_Char(); - metrics->pads[1] = GET_Char(); - } + FT_FRAME_CHAR( TT_SBit_Metrics, vertBearingX ), + FT_FRAME_CHAR( TT_SBit_Metrics, vertBearingY ), + FT_FRAME_BYTE( TT_SBit_Metrics, vertAdvance ), + FT_FRAME_END + }; /*************************************************************************/ @@ -285,15 +210,10 @@ TT_Error error; - if ( !ACCESS_Frame( 12L ) ) - { - range->image_size = GET_ULong(); - TT_Load_SBit_Metrics( &range->metrics, stream ); + if ( READ_ULong( range->image_size ) ) + return error; - FORGET_Frame(); - } - - return error; + return READ_Fields( sbit_metrics_fields, &range->metrics ); } @@ -400,7 +320,7 @@ range->num_glyphs = num_glyphs; num_glyphs++; /* XXX: BEWARE - see spec */ - size_elem = large ? 4 : 2; + size_elem = large ? 4 : 2; if ( ALLOC_ARRAY( range->glyph_offsets, num_glyphs, TT_ULong ) || @@ -409,7 +329,8 @@ for ( n = 0; n < num_glyphs; n++ ) range->glyph_offsets[n] = (TT_ULong)( range->image_offset + - large ? GET_ULong() : GET_UShort() ); + ( large ? GET_ULong() + : GET_UShort() ) ); FORGET_Frame(); } break; @@ -462,6 +383,26 @@ TT_ULong num_strikes; TT_ULong table_base; + const FT_Frame_Field sbit_line_metrics_fields[] = + { + /* no FT_FRAME_START */ + FT_FRAME_CHAR( TT_SBit_Line_Metrics, ascender ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, descender ), + FT_FRAME_BYTE( TT_SBit_Line_Metrics, max_width ), + + FT_FRAME_CHAR( TT_SBit_Line_Metrics, caret_slope_numerator ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, caret_slope_denominator ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, caret_offset ), + + FT_FRAME_CHAR( TT_SBit_Line_Metrics, min_origin_SB ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, min_advance_SB ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, max_before_BL ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, min_after_BL ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, pads[0] ), + FT_FRAME_CHAR( TT_SBit_Line_Metrics, pads[1] ), + FT_FRAME_END + }; + face->num_sbit_strikes = 0; @@ -483,8 +424,8 @@ FORGET_Frame(); /* check version number and strike count */ - if ( version != 0x00020000 || - num_strikes >= 0x10000 ) + if ( version != 0x00020000L || + num_strikes >= 0x10000L ) { FT_ERROR(( "TT_Load_SBit_Strikes: invalid table version!\n" )); error = TT_Err_Invalid_File_Format; @@ -512,21 +453,21 @@ TT_ULong indexTablesSize; - strike->ranges_offset = GET_ULong(); - indexTablesSize = GET_ULong(); /* don't save */ + strike->ranges_offset = GET_ULong(); + indexTablesSize = GET_ULong(); /* don't save */ - strike->num_ranges = GET_ULong(); - strike->color_ref = GET_ULong(); + strike->num_ranges = GET_ULong(); + strike->color_ref = GET_ULong(); - TT_Load_SBit_Line_Metrics( &strike->hori, stream ); - TT_Load_SBit_Line_Metrics( &strike->vert, stream ); + (void)READ_Fields( sbit_line_metrics_fields, &strike->hori ); + (void)READ_Fields( sbit_line_metrics_fields, &strike->vert ); - strike->start_glyph = GET_UShort(); - strike->end_glyph = GET_UShort(); - strike->x_ppem = GET_Byte(); - strike->y_ppem = GET_Byte(); - strike->bit_depth = GET_Byte(); - strike->flags = GET_Char(); + strike->start_glyph = GET_UShort(); + strike->end_glyph = GET_UShort(); + strike->x_ppem = GET_Byte(); + strike->y_ppem = GET_Byte(); + strike->bit_depth = GET_Byte(); + strike->flags = GET_Char(); count--; strike++; @@ -799,7 +740,8 @@ TT_Error error; - error = Find_SBit_Range( glyph_index, strike, arange, aglyph_offset ); + error = Find_SBit_Range( glyph_index, strike, + arange, aglyph_offset ); if ( error ) goto Fail; @@ -859,16 +801,25 @@ case 1: case 2: case 8: - /* variable small metrics */ + /* variable small metrics */ { TT_SBit_Small_Metrics smetrics; + const FT_Frame_Field sbit_small_metrics_fields[] = + { + FT_FRAME_START( 5 ), + FT_FRAME_BYTE( TT_SBit_Small_Metrics, height ), + FT_FRAME_BYTE( TT_SBit_Small_Metrics, width ), + FT_FRAME_CHAR( TT_SBit_Small_Metrics, bearingX ), + FT_FRAME_CHAR( TT_SBit_Small_Metrics, bearingY ), + FT_FRAME_BYTE( TT_SBit_Small_Metrics, advance ), + FT_FRAME_END + }; + /* read small metrics */ - if ( ACCESS_Frame( 5L ) ) + if ( READ_Fields( sbit_small_metrics_fields, &smetrics ) ) goto Exit; - TT_Load_Small_SBit_Metrics( &smetrics, stream ); - FORGET_Frame(); /* convert it to a big metrics */ metrics->height = smetrics.height; @@ -889,12 +840,7 @@ case 7: case 9: /* variable big metrics */ - { - if ( ACCESS_Frame( 8L ) ) - goto Exit; - TT_Load_SBit_Metrics( metrics, stream ); - FORGET_Frame(); - } + (void)READ_Fields( sbit_metrics_fields, metrics ); break; case 5: @@ -1167,8 +1113,8 @@ case 2: case 5: case 7: - line_bits = glyph_width * pix_bits; - glyph_size = (glyph_height * line_bits + 7) >> 3; + line_bits = glyph_width * pix_bits; + glyph_size = ( glyph_height * line_bits + 7 ) >> 3; break; default: /* invalid format */ @@ -1225,8 +1171,8 @@ TT_Long size; - map->width = metrics->width; - map->rows = metrics->height; + map->width = metrics->width; + map->rows = metrics->height; switch ( strike->bit_depth ) { @@ -1234,14 +1180,17 @@ map->pixel_mode = ft_pixel_mode_mono; map->pitch = ( map->width + 7 ) >> 3; break; + case 2: map->pixel_mode = ft_pixel_mode_pal2; map->pitch = ( map->width + 3 ) >> 2; break; + case 4: map->pixel_mode = ft_pixel_mode_pal4; map->pitch = ( map->width + 1 ) >> 1; break; + case 8: map->pixel_mode = ft_pixel_mode_grays; map->pitch = map->width; diff --git a/src/sfnt/ttsbit.h b/src/sfnt/ttsbit.h index 91833c033..90ac39df8 100644 --- a/src/sfnt/ttsbit.h +++ b/src/sfnt/ttsbit.h @@ -22,72 +22,13 @@ #include - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_SBit_Strikes */ - /* */ - /* */ - /* Loads the table of embedded bitmap sizes for this face. */ - /* */ - /* */ - /* face :: The target face object. */ - /* stream :: The input stream. */ - /* */ - /* */ - /* TrueType error code. 0 means success. */ - /* */ LOCAL_DEF TT_Error TT_Load_SBit_Strikes( TT_Face face, FT_Stream stream ); - - /*************************************************************************/ - /* */ - /* */ - /* TT_Free_SBit_Strikes */ - /* */ - /* */ - /* Releases the embedded bitmap tables. */ - /* */ - /* */ - /* face :: The target face object. */ - /* */ LOCAL_DEF void TT_Free_SBit_Strikes( TT_Face face ); - - /*************************************************************************/ - /* */ - /* */ - /* TT_Load_SBit_Image */ - /* */ - /* */ - /* Loads a given glyph sbit image from the font resource. This also */ - /* returns its metrics. */ - /* */ - /* */ - /* face :: The target face object. */ - /* */ - /* x_ppem :: The horizontal resolution in points per EM. */ - /* */ - /* y_ppem :: The vertical resolution in points per EM. */ - /* */ - /* glyph_index :: The current glyph index. */ - /* */ - /* stream :: The input stream. */ - /* */ - /* */ - /* map :: The target pixmap. */ - /* metrics :: A big sbit metrics structure for the glyph image. */ - /* */ - /* */ - /* TrueType error code. 0 means success. Returns an error if no */ - /* glyph sbit exists for the index. */ - /* */ - /* */ - /* The `map.buffer' field is always freed before the glyph is loaded. */ - /* */ LOCAL_DEF TT_Error TT_Load_SBit_Image( TT_Face face, TT_Int x_ppem, diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 2a5ebee10..86fc468c4 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -241,7 +241,7 @@ goto Fail; } - FT_TRACE4(( "Instructions size : %d\n", n_ins )); + FT_TRACE5(( " Instructions size: %d\n", n_ins )); if ( n_ins > face->max_profile.maxSizeOfInstructions ) { @@ -552,13 +552,12 @@ FORGET_Frame(); - FT_TRACE6(( "Glyph %ld\n", index )); - FT_TRACE6(( " # of contours : %d\n", num_contours )); - FT_TRACE6(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, - loader->bbox.xMax )); - FT_TRACE6(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, - loader->bbox.yMax )); - FT_TRACE6(( "-" )); + FT_TRACE5(( "Glyph %ld\n", index )); + FT_TRACE5(( " # of contours: %d\n", contours_count )); + FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, + loader->bbox.xMax )); + FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, + loader->bbox.yMax )); count -= 10; @@ -868,7 +867,7 @@ /* read size of instructions */ if ( FILE_Seek( ins_offset ) || READ_UShort(n_ins) ) goto Fail; - FT_TRACE4(( "Instructions size = %d\n", n_ins )); + FT_TRACE5(( " Instructions size = %d\n", n_ins )); /* check it */ if ( n_ins > face->max_profile.maxSizeOfInstructions )