ref: 611eaa7f3fde94dadfc9067564c7c23c1e717f91
parent: aeaafaa291b9c985a05c42dd0423da8703d318af
author: Werner Lemberg <[email protected]>
date: Thu Apr 1 15:35:57 EST 2004
Handle broken FNT files which don't have a trailing NULL byte in the face name string. * src/winfnt/winfnt.h (FNT_FontRec): New member `family_name'. * src/winfnt/winfnt.c (fnt_font_done): Free font->family_name. (FNT_Face_Init): Append a final zero byte to the font face name. * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from 2004-03-19.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2004-03-31 Werner Lemberg <[email protected]>
+
+ Handle broken FNT files which don't have a trailing NULL byte
+ in the face name string.
+
+ * src/winfnt/winfnt.h (FNT_FontRec): New member `family_name'.
+ * src/winfnt/winfnt.c (fnt_font_done): Free font->family_name.
+ (FNT_Face_Init): Append a final zero byte to the font face name.
+
+2004-03-30 Werner Lemberg <[email protected]>
+
+ * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from
+ 2004-03-19.
+
2004-03-27 Werner Lemberg <[email protected]>
* src/base/descrip.mms (OBJS): Add ftbbox.obj.
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -357,11 +357,6 @@
FT_READ_LONG( format_tag ) )
goto Exit;
}
- else if ( face_index > 0 )
- {
- error = SFNT_Err_Bad_Argument;
- goto Exit;
- }
/* the format tag was read, now check the rest of the header */
sfnt->format_tag = format_tag;
@@ -376,7 +371,12 @@
{
FT_TRACE2(( "tt_face_load_sfnt_header: file is not SFNT!\n" ));
error = SFNT_Err_Unknown_File_Format;
+ goto Exit;
}
+
+ /* disallow face index values > 0 for non-TTC files */
+ if ( format_tag != TTAG_ttcf && face_index > 0 )
+ error = SFNT_Err_Bad_Argument;
Exit:
return error;
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -121,6 +121,7 @@
if ( font->fnt_frame )
FT_FRAME_RELEASE( font->fnt_frame );
+ FT_FREE( font->family_name );
FT_FREE( font );
face->font = 0;
@@ -434,8 +435,9 @@
/* we now need to fill the root FT_Face fields */
/* with relevant information */
{
- FT_Face root = FT_FACE( face );
- FNT_Font font = face->font;
+ FT_Face root = FT_FACE( face );
+ FNT_Font font = face->font;
+ FT_PtrDist family_size;
root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
@@ -506,8 +508,22 @@
root->num_glyphs = font->header.last_char -
font->header.first_char + 1 + 1;
- root->family_name = (FT_String*)font->fnt_frame +
- font->header.face_name_offset;
+ /* Some broken fonts don't delimit the face name with a final */
+ /* NULL byte -- the frame is erroneously one byte too small. */
+ /* We thus allocate one more byte, setting it explicitly to */
+ /* zero. */
+ family_size = font->header.file_size - font->header.face_name_offset;
+ if ( FT_ALLOC( font->family_name, family_size + 1 ) )
+ goto Fail;
+ FT_MEM_COPY( font->family_name,
+ font->fnt_frame + font->header.face_name_offset,
+ family_size );
+ font->family_name[family_size] = '\0';
+ if ( FT_REALLOC( font->family_name,
+ family_size,
+ ft_strlen( font->family_name ) + 1 ) )
+ goto Fail;
+ root->family_name = font->family_name;
root->style_name = (char *)"Regular";
if ( root->style_flags & FT_STYLE_FLAG_BOLD )
@@ -520,10 +536,10 @@
else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
root->style_name = (char *)"Italic";
}
+ goto Exit;
Fail:
- if ( error )
- FNT_Face_Done( face );
+ FNT_Face_Done( face );
Exit:
return error;
--- a/src/winfonts/winfnt.h
+++ b/src/winfonts/winfnt.h
@@ -4,7 +4,7 @@
/* */
/* FreeType font driver for Windows FNT/FON files */
/* */
-/* Copyright 1996-2001, 2002, 2003 by */
+/* Copyright 1996-2001, 2002, 2003, 2004 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -79,6 +79,7 @@
FT_Byte* fnt_frame;
FT_ULong fnt_size;
+ FT_String* family_name;
} FNT_FontRec, *FNT_Font;