From d18388e44b0052a7ad8b14453fd74a248ddf1e8f Mon Sep 17 00:00:00 2001 From: David Turner Date: Mon, 3 Jul 2000 15:00:49 +0000 Subject: [PATCH] fixed a few 64-bit related bugs in "sfnt/ttload.c" and "base/ftstream.c" Note that "TT_PCLT" was incorrectly defined in --- include/freetype/internal/ftstream.h | 12 +++++++++++- include/freetype/tttables.h | 2 +- src/base/ftglyph.c | 1 - src/base/ftstream.c | 22 ++++++++++++++++++---- src/sfnt/ttload.c | 19 +++++++++---------- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/include/freetype/internal/ftstream.h b/include/freetype/internal/ftstream.h index aca4a1c41..82e1bf26c 100644 --- a/include/freetype/internal/ftstream.h +++ b/include/freetype/internal/ftstream.h @@ -22,6 +22,7 @@ #define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ #define FT_FRAME_OP_LONG 4 /* read 4-byte value */ #define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ typedef enum FT_Frame_Op_ { @@ -44,7 +45,9 @@ typedef enum FT_Frame_Op_ ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), - ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ) + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ) } FT_Frame_Op; @@ -87,6 +90,13 @@ typedef struct FT_Frame_Field_ #define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } #define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } +#define FT_FRAME_BYTES( struct_type, field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + (FT_UShort)(char*)&FT_FIELD_REF(struct_type,field) } + + /*************************************************************************/ /* */ diff --git a/include/freetype/tttables.h b/include/freetype/tttables.h index d01a8e255..0ac83e6fc 100644 --- a/include/freetype/tttables.h +++ b/include/freetype/tttables.h @@ -418,7 +418,7 @@ FT_Char TypeFace[16]; FT_Char CharacterComplement[8]; FT_Char FileName[6]; - FT_Char StrokeWeight[6]; + FT_Char StrokeWeight; FT_Char WidthType; FT_Byte SerifStyle; FT_Byte Reserved; diff --git a/src/base/ftglyph.c b/src/base/ftglyph.c index 592efa382..7b6c2d332 100644 --- a/src/base/ftglyph.c +++ b/src/base/ftglyph.c @@ -561,7 +561,6 @@ /* */ /* The 2x2 transformation matrix is also applied to the glyph's */ /* advance vector. */ - /* */ FT_EXPORT_FUNC( FT_Error ) FT_Glyph_Transform( FT_Glyph glyph, FT_Matrix* matrix, FT_Vector* delta ) diff --git a/src/base/ftstream.c b/src/base/ftstream.c index c1cb12224..5be5da9dd 100644 --- a/src/base/ftstream.c +++ b/src/base/ftstream.c @@ -539,6 +539,21 @@ fields++; continue; /* loop! */ + case ft_frame_bytes: /* read a byte sequence */ + { + FT_Int len = stream->limit - stream->cursor; + + if (len > fields->size) + len = fields->size; + + p = (FT_Byte*)structure + fields->offset; + MEM_Copy( p, stream->cursor, len ); + stream->cursor += len; + fields++; + continue; + } + + case ft_frame_byte: case ft_frame_schar: /* read a single byte */ value = GET_Byte(); @@ -611,13 +626,12 @@ value = 0; p = stream->cursor; - if ( p + 3 < stream->limit ) + if ( p + 2 < stream->limit ) { value = (FT_ULong)p[0] | ( (FT_ULong)p[1] << 8 ) | - ( (FT_ULong)p[2] << 16 ) | - ( (FT_ULong)p[3] << 24 ); - stream->cursor += 4; + ( (FT_ULong)p[2] << 16 ); + stream->cursor += 3; } sign_shift = 8; break; diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index f448405ac..350693811 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -1330,7 +1330,7 @@ { static const FT_Frame_Field pclt_fields[] = { - FT_FRAME_START( 20 ), + FT_FRAME_START( 54 ), FT_FRAME_ULONG ( TT_PCLT, Version ), FT_FRAME_ULONG ( TT_PCLT, FontNumber ), FT_FRAME_USHORT( TT_PCLT, Pitch ), @@ -1338,16 +1338,19 @@ FT_FRAME_USHORT( TT_PCLT, Style ), FT_FRAME_USHORT( TT_PCLT, TypeFamily ), FT_FRAME_USHORT( TT_PCLT, CapHeight ), + FT_FRAME_BYTES ( TT_PCLT, TypeFace, 16 ), + FT_FRAME_BYTES ( TT_PCLT, CharacterComplement, 8 ), + FT_FRAME_BYTES ( TT_PCLT, FileName, 6 ), + 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 }; 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 }; @@ -1366,11 +1369,7 @@ return TT_Err_Ok; } - 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 ) ) + if ( READ_Fields( pclt_fields, pclt ) ) goto Exit; FT_TRACE2(( "loaded\n" ));