From 51179f0ae3a7bcb0d45c736df1189942e9fc99be Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 18 May 2000 16:18:05 +0000 Subject: [PATCH] some fixes for 64-bit systems. Mainly changed some FT_TRACE calls to use %p instead of %lx when dumping a pointer address --- CHANGES | 3 + include/freetype/internal/sfnt.h | 2 +- include/freetype/internal/tttypes.h | 4 ++ include/freetype/tttables.h | 29 ++++++++++ src/base/ftcalc.c | 4 +- src/base/ftobjs.c | 8 +-- src/sfnt/sfdriver.c | 1 + src/sfnt/ttload.c | 88 +++++++++++++++++++++++++---- src/sfnt/ttload.h | 3 + src/truetype/ttdriver.c | 1 + src/truetype/ttinterp.c | 4 +- src/truetype/ttobjs.c | 4 ++ 12 files changed, 130 insertions(+), 21 deletions(-) diff --git a/CHANGES b/CHANGES index 20c1c070b..249665e7a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,8 @@ LATEST_CHANGES + - some fixes for 64-bit systems (mainly changing some FT_TRACE calls + to use %p instead of %lx).. Thanks to Karl Robillard + - fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be cropped when loaded from a file (maybe I should move the bitmap cropper to the diff --git a/include/freetype/internal/sfnt.h b/include/freetype/internal/sfnt.h index 577566755..d6dd15e79 100644 --- a/include/freetype/internal/sfnt.h +++ b/include/freetype/internal/sfnt.h @@ -358,7 +358,7 @@ TT_Load_Table_Func load_kerning; TT_Load_Table_Func load_gasp; - + TT_Load_Table_Func load_pclt; /* see `ttsbit.h' */ TT_Load_Table_Func load_sbits; diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index 2a0f46c41..a2df87708 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -1971,6 +1971,7 @@ TTC_Header ttc_header; + FT_ULong format_tag; TT_UShort num_tables; TT_Table* dir_tables; @@ -2018,6 +2019,9 @@ /* grid-fitting and scaling table */ TT_Gasp gasp; /* the `gasp' table */ + /* PCL 5 table */ + TT_PCLT pclt; + /* embedded bitmaps support */ TT_Int num_sbit_strikes; TT_SBit_Strike* sbit_strikes; diff --git a/include/freetype/tttables.h b/include/freetype/tttables.h index 3cd9e4dbc..6bbe87009 100644 --- a/include/freetype/tttables.h +++ b/include/freetype/tttables.h @@ -392,6 +392,34 @@ } TT_Postscript; + /*************************************************************************/ + /* */ + /* */ + /* TT_PCLT */ + /* */ + /* */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType table. */ + /* */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight[6]; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; /*************************************************************************/ /* */ @@ -491,6 +519,7 @@ ft_sfnt_hhea = 3, ft_sfnt_vhea = 4, ft_sfnt_post = 5, + ft_sfnt_pclt = 6, sfnt_max /* don't remove */ diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c index 2feee6986..f3d97ade7 100644 --- a/src/base/ftcalc.c +++ b/src/base/ftcalc.c @@ -204,8 +204,8 @@ /* 32 bits, then the division is computed directly. Otherwise, we */ /* use a specialized version of the old FT_MulDiv64(). */ /* */ - EXPORT_FUNC(FT_Int32) FT_DivFix( FT_Long a, - FT_Long b ) + EXPORT_FUNC(FT_Long) FT_DivFix( FT_Long a, + FT_Long b ) { FT_Int32 s; FT_Word32 q; diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 81438e24d..f87ccad71 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -89,8 +89,8 @@ *P = NULL; FT_TRACE2(( "FT_Alloc:" )); - FT_TRACE2(( " size = %ld, block = 0x%08lx, ref = 0x%08lx\n", - size, (long)*P, (long)P )); + FT_TRACE2(( " size = %ld, block = 0x%08p, ref = 0x%08p\n", + size, *P, P )); return FT_Err_Ok; } @@ -193,8 +193,8 @@ void** P ) { FT_TRACE2(( "FT_Free:" )); - FT_TRACE2(( " Freeing block 0x%08lx, ref 0x%08lx\n", - (long)P, (P ? (long)*P : -1) )); + FT_TRACE2(( " Freeing block 0x%08p, ref 0x%08p\n", + P, (P ? *P : (void*)0) )); FT_Assert( P != 0 ); diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index 23682c445..dcc163bef 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -28,6 +28,7 @@ TT_Load_Kern, TT_Load_Gasp, + TT_Load_PCLT, #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS /* see `ttsbit.h' */ diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index c764d28d0..20811fdb0 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -57,8 +57,8 @@ TT_Table* entry; TT_Table* limit; - FT_TRACE4(( "TT_LookUp_Table( %08lx, %c%c%c%c )\n", - (TT_Long)face, + FT_TRACE4(( "TT_LookUp_Table( %08p, %c%c%c%c )\n", + face, (TT_Char)(tag >> 24), (TT_Char)(tag >> 16), (TT_Char)(tag >> 8), @@ -156,8 +156,8 @@ FT_FRAME_END }; #endif - FT_TRACE2(( "TT_Load_Format_Tag(%08lx, %ld )\n", - (TT_Long)face, faceIndex )); + FT_TRACE2(( "TT_Load_Format_Tag(%08p, %ld )\n", + face, faceIndex )); face->ttc_header.Tag = 0; face->ttc_header.version = 0; @@ -269,8 +269,8 @@ UNUSED(faceIndex); - FT_TRACE2(( "TT_Load_Directory( %08lx, %ld )\n", - (TT_Long)face, faceIndex )); + FT_TRACE2(( "TT_Load_Directory( %08p, %ld )\n", + face, faceIndex )); #ifdef READ_FIELDS if ( READ_Fields( table_dir_fields, &tableDir ) ) @@ -462,7 +462,7 @@ FT_FRAME_END }; #endif - FT_TRACE2(( "Load_TT_Header( %08lx )\n", (TT_Long)face )); + FT_TRACE2(( "Load_TT_Header( %08p )\n", face )); error = face->goto_table( face, TTAG_head, stream, 0 ); if ( error ) @@ -558,7 +558,7 @@ FT_FRAME_END }; #endif - FT_TRACE2(( "Load_TT_MaxProfile( %08lx )\n", (TT_Long)face )); + FT_TRACE2(( "Load_TT_MaxProfile( %08p )\n", face )); error = face->goto_table( face, TTAG_maxp, stream, 0 ); if (error) goto Exit; @@ -658,8 +658,8 @@ TT_LongMetrics** longs; TT_ShortMetrics** shorts; - FT_TRACE2(( "TT_Load_%s_Metrics( %08lx )\n", - vertical ? "Vertical" : "Horizontal", (TT_Long)face )); + FT_TRACE2(( "TT_Load_%s_Metrics( %08p )\n", + vertical ? "Vertical" : "Horizontal", face )); if ( vertical ) { @@ -1413,7 +1413,7 @@ TT_Error error; TT_Postscript* post = &face->postscript; #ifdef READ_FIELDS - const FT_Frame_Field post_fields[] = { + static const FT_Frame_Field post_fields[] = { FT_FRAME_START(32), FT_FRAME_ULONG( TT_Postscript, FormatType ), FT_FRAME_ULONG( TT_Postscript, italicAngle ), @@ -1461,6 +1461,70 @@ } + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_PCLT */ + /* */ + /* */ + /* Loads the PCL 5 Table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* TrueType error code. 0 means success. */ + /* */ + LOCAL_FUNC + TT_Error TT_Load_PCLT( TT_Face face, + FT_Stream stream ) + { + static const FT_Frame_Field pclt_fields[] = { + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( TT_PCLT, Version ), + FT_FRAME_ULONG ( TT_PCLT, FontNumber ), + FT_FRAME_USHORT( TT_PCLT, Pitch ), + FT_FRAME_USHORT( TT_PCLT, xHeight ), + FT_FRAME_USHORT( TT_PCLT, Style ), + FT_FRAME_USHORT( TT_PCLT, TypeFamily ), + FT_FRAME_USHORT( TT_PCLT, CapHeight ), + FT_FRAME_END }; + + static const FT_Frame_Field pclt_fields2[] = { + FT_FRAME_START( 4 ), + FT_FRAME_CHAR( TT_PCLT, StrokeWeight ), + FT_FRAME_CHAR( TT_PCLT, WidthType ), + FT_FRAME_BYTE( TT_PCLT, SerifStyle ), + FT_FRAME_BYTE( TT_PCLT, Reserved ), + FT_FRAME_END }; + + TT_Error error; + TT_PCLT* pclt = &face->pclt; + + FT_TRACE2(( "PCLT " )); + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if (error) + { + FT_TRACE2(( "missing (optional)\n" )); + pclt->Version = 0; + return 0; + } + + if ( READ_Fields( pclt_fields, pclt ) || + FILE_Read ( pclt->TypeFace, 16 ) || + FILE_Read ( pclt->CharacterComplement, 8 ) || + FILE_Read ( pclt->FileName, 6 ) || + READ_Fields( pclt_fields2, pclt ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + Exit: + return error; + } + /*************************************************************************/ /* */ /* */ @@ -1487,7 +1551,7 @@ TT_GaspRange* gaspranges; - FT_TRACE2(( "TT_Load_Gasp( %08lx )\n", (TT_Long)face )); + FT_TRACE2(( "TT_Load_Gasp( %08p )\n", face )); /* the gasp table is optional */ error = face->goto_table( face, TTAG_gasp, stream, 0 ); diff --git a/src/sfnt/ttload.h b/src/sfnt/ttload.h index d8ff20b2c..cde84011e 100644 --- a/src/sfnt/ttload.h +++ b/src/sfnt/ttload.h @@ -103,6 +103,9 @@ TT_Error TT_Load_Hdmx( TT_Face face, FT_Stream stream ); + LOCAL_DEF + TT_Error TT_Load_PCLT( TT_Face face, + FT_Stream stream ); LOCAL_DEF void TT_Free_Names( TT_Face face ); diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index 33b412382..1e8318a4b 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -651,6 +651,7 @@ case ft_sfnt_os2: table = (face->os2.version == 0xFFFF ? 0 : &face->os2 ); break; case ft_sfnt_post: table = &face->postscript; break; case ft_sfnt_maxp: table = &face->max_profile; break; + case ft_sfnt_pclt: table = face->pclt.Version ? &face->pclt : 0 ; break; default: table = 0; diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c index 64bce53a0..4fcdac847 100644 --- a/src/truetype/ttinterp.c +++ b/src/truetype/ttinterp.c @@ -435,8 +435,8 @@ TT_Error error; - FT_TRACE1(( "TT.Create_Create: new object at 0x%08lx, parent = 0x%08lx\n", - (long)exec, (long)face )); + FT_TRACE1(( "TT.Create_Create: new object at 0x%08p, parent = 0x%08p\n", + exec, face )); /* XXX: We don't reserve arrays anymore, this is done automatically */ /* during a call to Context_Load(). */ diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c index faccdc321..8f2a60d5c 100644 --- a/src/truetype/ttobjs.c +++ b/src/truetype/ttobjs.c @@ -215,6 +215,9 @@ goto Exit; } + /* store format tag */ + face->format_tag = format_tag; + /* Load font directory */ error = sfnt->load_directory( face, stream, face_index ); if ( error ) goto Exit; @@ -254,6 +257,7 @@ if ( LOAD_( hdmx ) || LOAD_( gasp ) || LOAD_( kerning ) || + LOAD_( pclt ) || (error = TT_Load_Locations( face, stream )) != TT_Err_Ok || (error = TT_Load_CVT ( face, stream )) != TT_Err_Ok ||