* include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value

0x100 instead of 0x10000; the latter value is already occupied by
FT_LOAD_TARGET_LIGHT.  Bug reported by James Cloos.


Handle SFNT with neither outlines nor bitmaps.  This fixes Savannah
bug #25010.

* src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither
outlines nor bitmaps.

* src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there
is no table with glyphs.


* src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging
message.


Other minor cosmetics.
This commit is contained in:
Werner Lemberg 2008-12-05 18:37:44 +00:00
parent afe6016030
commit 76fffcd898
6 changed files with 58 additions and 19 deletions

View File

@ -1,3 +1,23 @@
2008-12-05 Werner Lemberg <wl@nu.org>
* include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value
0x100 instead of 0x10000; the latter value is already occupied by
FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos.
Handle SFNT with neither outlines nor bitmaps. This fixes Savannah
bug #25010.
* src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither
outlines nor bitmaps.
* src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there
is no table with glyphs.
* src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging
message.
2008-12-01 Werner Lemberg <wl@gnu.org> 2008-12-01 Werner Lemberg <wl@gnu.org>
GDEF tables need `glyph_count' too for validation. Problem reported GDEF tables need `glyph_count' too for validation. Problem reported

View File

@ -2429,11 +2429,11 @@ FT_BEGIN_HEADER
#define FT_LOAD_MONOCHROME 0x1000 #define FT_LOAD_MONOCHROME 0x1000
#define FT_LOAD_LINEAR_DESIGN 0x2000 #define FT_LOAD_LINEAR_DESIGN 0x2000
#define FT_LOAD_NO_AUTOHINT 0x8000U #define FT_LOAD_NO_AUTOHINT 0x8000U
#define FT_LOAD_ADVANCE_ONLY 0x10000UL
/* */ /* */
/* used internally only by certain font drivers! */ /* used internally only by certain font drivers! */
#define FT_LOAD_ADVANCE_ONLY 0x100
#define FT_LOAD_SBITS_ONLY 0x4000 #define FT_LOAD_SBITS_ONLY 0x4000

View File

@ -559,6 +559,10 @@
if ( !face || !face->size || !face->glyph ) if ( !face || !face->size || !face->glyph )
return FT_Err_Invalid_Face_Handle; return FT_Err_Invalid_Face_Handle;
/* fonts with neither outlines nor bitmaps can be found in PDFs */
if ( !FT_IS_SCALABLE( face ) && !FT_HAS_FIXED_SIZES( face ) )
return FT_Err_Invalid_Glyph_Index;
/* The validity test for `glyph_index' is performed by the */ /* The validity test for `glyph_index' is performed by the */
/* font drivers. */ /* font drivers. */
@ -702,7 +706,7 @@
/* compute the linear advance in 16.16 pixels */ /* compute the linear advance in 16.16 pixels */
if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) ( FT_IS_SCALABLE( face ) ) )
{ {
FT_Size_Metrics* metrics = &face->size->metrics; FT_Size_Metrics* metrics = &face->size->metrics;

View File

@ -680,19 +680,20 @@
face->os2.version = 0xFFFFU; face->os2.version = 0xFFFFU;
} }
} }
/* the optional tables */ /* the optional tables */
/* embedded bitmap support. */ /* embedded bitmap support */
if ( sfnt->load_eblc ) if ( sfnt->load_eblc )
{ {
LOAD_( eblc ); LOAD_( eblc );
if ( error ) if ( error )
{ {
/* return an error if this font file has no outlines */ /* a font which contains neither bitmaps nor outlines is */
if ( error == SFNT_Err_Table_Missing && has_outline ) /* still valid (although rather useless in most cases); */
/* however, you can find such stripped fonts in PDFs */
if ( error == SFNT_Err_Table_Missing )
error = SFNT_Err_Ok; error = SFNT_Err_Ok;
else else
goto Exit; goto Exit;

View File

@ -58,6 +58,9 @@
{ {
TT_Table entry; TT_Table entry;
TT_Table limit; TT_Table limit;
#ifdef FT_DEBUG_LEVEL_TRACE
FT_Bool zero_length = FALSE;
#endif
FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
@ -72,17 +75,28 @@
for ( ; entry < limit; entry++ ) for ( ; entry < limit; entry++ )
{ {
/* For compatibility with Windows, we consider 0-length */ /* For compatibility with Windows, we consider */
/* tables the same as missing tables. */ /* zero-length tables the same as missing tables. */
if ( entry->Tag == tag && entry->Length != 0 ) if ( entry->Tag == tag ) {
{ if ( entry->Length != 0 )
FT_TRACE4(( "found table.\n" )); {
return entry; FT_TRACE4(( "found table.\n" ));
return entry;
}
#ifdef FT_DEBUG_LEVEL_TRACE
zero_length = TRUE;
#endif
} }
} }
FT_TRACE4(( "could not find table!\n" )); #ifdef FT_DEBUG_LEVEL_TRACE
return 0; if ( zero_length )
FT_TRACE4(( "ignoring empty table!\n" ));
else
FT_TRACE4(( "could not find table!\n" ));
#endif
return NULL;
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2005 by George Williams */ /* Copyright (C) 2005, 2007, 2008 by George Williams */
/* /*
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -151,8 +151,8 @@
int load_flags = FT_LOAD_DEFAULT; int load_flags = FT_LOAD_DEFAULT;
if ( check_outlines && if ( check_outlines &&
( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) FT_IS_SCALABLE( face ) )
load_flags = FT_LOAD_NO_BITMAP; load_flags = FT_LOAD_NO_BITMAP;
if ( nohints ) if ( nohints )
@ -162,8 +162,8 @@
for ( gid = 0; gid < face->num_glyphs; ++gid ) for ( gid = 0; gid < face->num_glyphs; ++gid )
{ {
if ( check_outlines && if ( check_outlines &&
( face->face_flags & FT_FACE_FLAG_SCALABLE ) ) FT_IS_SCALABLE( face ) )
{ {
if ( !FT_Load_Glyph( face, gid, load_flags ) ) if ( !FT_Load_Glyph( face, gid, load_flags ) )
FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL ); FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL );