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.
This commit is contained in:
parent
aeaafaa291
commit
611eaa7f3f
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2004-03-31 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
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 <wl@gnu.org>
|
||||||
|
|
||||||
|
* src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from
|
||||||
|
2004-03-19.
|
||||||
|
|
||||||
2004-03-27 Werner Lemberg <wl@gnu.org>
|
2004-03-27 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
* src/base/descrip.mms (OBJS): Add ftbbox.obj.
|
* src/base/descrip.mms (OBJS): Add ftbbox.obj.
|
||||||
|
|
|
@ -357,11 +357,6 @@
|
||||||
FT_READ_LONG( format_tag ) )
|
FT_READ_LONG( format_tag ) )
|
||||||
goto Exit;
|
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 */
|
/* the format tag was read, now check the rest of the header */
|
||||||
sfnt->format_tag = format_tag;
|
sfnt->format_tag = format_tag;
|
||||||
|
@ -376,8 +371,13 @@
|
||||||
{
|
{
|
||||||
FT_TRACE2(( "tt_face_load_sfnt_header: file is not SFNT!\n" ));
|
FT_TRACE2(( "tt_face_load_sfnt_header: file is not SFNT!\n" ));
|
||||||
error = SFNT_Err_Unknown_File_Format;
|
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:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,6 +121,7 @@
|
||||||
|
|
||||||
if ( font->fnt_frame )
|
if ( font->fnt_frame )
|
||||||
FT_FRAME_RELEASE( font->fnt_frame );
|
FT_FRAME_RELEASE( font->fnt_frame );
|
||||||
|
FT_FREE( font->family_name );
|
||||||
|
|
||||||
FT_FREE( font );
|
FT_FREE( font );
|
||||||
face->font = 0;
|
face->font = 0;
|
||||||
|
@ -434,8 +435,9 @@
|
||||||
/* we now need to fill the root FT_Face fields */
|
/* we now need to fill the root FT_Face fields */
|
||||||
/* with relevant information */
|
/* with relevant information */
|
||||||
{
|
{
|
||||||
FT_Face root = FT_FACE( face );
|
FT_Face root = FT_FACE( face );
|
||||||
FNT_Font font = face->font;
|
FNT_Font font = face->font;
|
||||||
|
FT_PtrDist family_size;
|
||||||
|
|
||||||
|
|
||||||
root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
|
root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
|
||||||
|
@ -506,8 +508,22 @@
|
||||||
root->num_glyphs = font->header.last_char -
|
root->num_glyphs = font->header.last_char -
|
||||||
font->header.first_char + 1 + 1;
|
font->header.first_char + 1 + 1;
|
||||||
|
|
||||||
root->family_name = (FT_String*)font->fnt_frame +
|
/* Some broken fonts don't delimit the face name with a final */
|
||||||
font->header.face_name_offset;
|
/* 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";
|
root->style_name = (char *)"Regular";
|
||||||
|
|
||||||
if ( root->style_flags & FT_STYLE_FLAG_BOLD )
|
if ( root->style_flags & FT_STYLE_FLAG_BOLD )
|
||||||
|
@ -520,10 +536,10 @@
|
||||||
else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
|
else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
|
||||||
root->style_name = (char *)"Italic";
|
root->style_name = (char *)"Italic";
|
||||||
}
|
}
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
Fail:
|
Fail:
|
||||||
if ( error )
|
FNT_Face_Done( face );
|
||||||
FNT_Face_Done( face );
|
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
/* */
|
/* */
|
||||||
/* FreeType font driver for Windows FNT/FON files */
|
/* 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. */
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||||
/* */
|
/* */
|
||||||
/* This file is part of the FreeType project, and may only be used, */
|
/* This file is part of the FreeType project, and may only be used, */
|
||||||
|
@ -79,6 +79,7 @@ FT_BEGIN_HEADER
|
||||||
|
|
||||||
FT_Byte* fnt_frame;
|
FT_Byte* fnt_frame;
|
||||||
FT_ULong fnt_size;
|
FT_ULong fnt_size;
|
||||||
|
FT_String* family_name;
|
||||||
|
|
||||||
} FNT_FontRec, *FNT_Font;
|
} FNT_FontRec, *FNT_Font;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue