Fix Savannah bug #25495.
* src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before setting metrics and bbox values. This ensures that the check for a font with neither a `glyf' table nor bitmap strikes can be performed early enough to set metrics and bbox values too.
This commit is contained in:
parent
67bbcbd72d
commit
c2cabd4291
|
@ -1,3 +1,12 @@
|
||||||
|
2009-02-09 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
Fix Savannah bug #25495.
|
||||||
|
|
||||||
|
* src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before
|
||||||
|
setting metrics and bbox values. This ensures that the check for a
|
||||||
|
font with neither a `glyf' table nor bitmap strikes can be performed
|
||||||
|
early enough to set metrics and bbox values too.
|
||||||
|
|
||||||
2009-02-04 Werner Lemberg <wl@gnu.org>
|
2009-02-04 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
Fix Savannah bug #25480.
|
Fix Savannah bug #25480.
|
||||||
|
|
|
@ -408,7 +408,7 @@
|
||||||
face->ttc_header.version = 1 << 16;
|
face->ttc_header.version = 1 << 16;
|
||||||
face->ttc_header.count = 1;
|
face->ttc_header.count = 1;
|
||||||
|
|
||||||
if ( FT_NEW( face->ttc_header.offsets) )
|
if ( FT_NEW( face->ttc_header.offsets ) )
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
face->ttc_header.offsets[0] = offset;
|
face->ttc_header.offsets[0] = offset;
|
||||||
|
@ -862,12 +862,78 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now allocate the root array of FT_Bitmap_Size records and
|
||||||
|
* populate them. Unfortunately, it isn't possible to indicate bit
|
||||||
|
* depths in the FT_Bitmap_Size record. This is a design error.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
FT_UInt i, count;
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
|
||||||
|
count = face->sbit_num_strikes;
|
||||||
|
#else
|
||||||
|
count = (FT_UInt)face->num_sbit_strikes;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( count > 0 )
|
||||||
|
{
|
||||||
|
FT_Memory memory = face->root.stream->memory;
|
||||||
|
FT_UShort em_size = face->header.Units_Per_EM;
|
||||||
|
FT_Short avgwidth = face->os2.xAvgCharWidth;
|
||||||
|
FT_Size_Metrics metrics;
|
||||||
|
|
||||||
|
|
||||||
|
if ( em_size == 0 || face->os2.version == 0xFFFFU )
|
||||||
|
{
|
||||||
|
avgwidth = 0;
|
||||||
|
em_size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( FT_NEW_ARRAY( root->available_sizes, count ) )
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
for ( i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
FT_Bitmap_Size* bsize = root->available_sizes + i;
|
||||||
|
|
||||||
|
|
||||||
|
error = sfnt->load_strike_metrics( face, i, &metrics );
|
||||||
|
if ( error )
|
||||||
|
goto Exit;
|
||||||
|
|
||||||
|
bsize->height = (FT_Short)( metrics.height >> 6 );
|
||||||
|
bsize->width = (FT_Short)(
|
||||||
|
( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
|
||||||
|
|
||||||
|
bsize->x_ppem = metrics.x_ppem << 6;
|
||||||
|
bsize->y_ppem = metrics.y_ppem << 6;
|
||||||
|
|
||||||
|
/* assume 72dpi */
|
||||||
|
bsize->size = metrics.y_ppem << 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
|
||||||
|
root->num_fixed_sizes = (FT_Int)count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
||||||
|
|
||||||
|
/* a font with no bitmaps and no outlines is scalable; */
|
||||||
|
/* it has only empty glyphs then */
|
||||||
|
if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
|
||||||
|
root->face_flags |= FT_FACE_FLAG_SCALABLE;
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* Set up metrics. */
|
/* Set up metrics. */
|
||||||
/* */
|
/* */
|
||||||
if ( has_outline == TRUE )
|
if ( FT_IS_SCALABLE( root ) )
|
||||||
{
|
{
|
||||||
/* XXX What about if outline header is missing */
|
/* XXX What about if outline header is missing */
|
||||||
/* (e.g. sfnt wrapped bitmap)? */
|
/* (e.g. sfnt wrapped bitmap)? */
|
||||||
|
@ -952,71 +1018,6 @@
|
||||||
root->underline_thickness = face->postscript.underlineThickness;
|
root->underline_thickness = face->postscript.underlineThickness;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now allocate the root array of FT_Bitmap_Size records and
|
|
||||||
* populate them. Unfortunately, it isn't possible to indicate bit
|
|
||||||
* depths in the FT_Bitmap_Size record. This is a design error.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
FT_UInt i, count;
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
|
|
||||||
count = face->sbit_num_strikes;
|
|
||||||
#else
|
|
||||||
count = (FT_UInt)face->num_sbit_strikes;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( count > 0 )
|
|
||||||
{
|
|
||||||
FT_Memory memory = face->root.stream->memory;
|
|
||||||
FT_UShort em_size = face->header.Units_Per_EM;
|
|
||||||
FT_Short avgwidth = face->os2.xAvgCharWidth;
|
|
||||||
FT_Size_Metrics metrics;
|
|
||||||
|
|
||||||
|
|
||||||
if ( em_size == 0 || face->os2.version == 0xFFFFU )
|
|
||||||
{
|
|
||||||
avgwidth = 0;
|
|
||||||
em_size = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( FT_NEW_ARRAY( root->available_sizes, count ) )
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
for ( i = 0; i < count; i++ )
|
|
||||||
{
|
|
||||||
FT_Bitmap_Size* bsize = root->available_sizes + i;
|
|
||||||
|
|
||||||
|
|
||||||
error = sfnt->load_strike_metrics( face, i, &metrics );
|
|
||||||
if ( error )
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
bsize->height = (FT_Short)( metrics.height >> 6 );
|
|
||||||
bsize->width = (FT_Short)(
|
|
||||||
( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
|
|
||||||
|
|
||||||
bsize->x_ppem = metrics.x_ppem << 6;
|
|
||||||
bsize->y_ppem = metrics.y_ppem << 6;
|
|
||||||
|
|
||||||
/* assume 72dpi */
|
|
||||||
bsize->size = metrics.y_ppem << 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
|
|
||||||
root->num_fixed_sizes = (FT_Int)count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
|
||||||
|
|
||||||
/* a font with no bitmaps and no outlines is scalable; */
|
|
||||||
/* it has only empty glyphs then */
|
|
||||||
if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
|
|
||||||
root->face_flags |= FT_FACE_FLAG_SCALABLE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
|
|
Loading…
Reference in New Issue