Yamano-uchi added support for SFNT-wrapped CID bitmap font files (with

minor modifications from WL).
This commit is contained in:
Werner Lemberg 2000-08-06 19:48:47 +00:00
parent 0122a4a948
commit eedd97d775
3 changed files with 125 additions and 81 deletions

View File

@ -254,6 +254,7 @@
FT_Parameter* params )
{
FT_Error error;
FT_Bool missing_outline = 0;
SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt;
FT_UNUSED( face_index );
@ -262,33 +263,60 @@
/* Load tables */
if ( LOAD_( header ) ||
LOAD_( max_profile ) ||
/* load the `hhea' & `hmtx' tables at once */
( error = sfnt->load_metrics( face, stream, 0 ) ) != TT_Err_Ok ||
/* If you load SFNT wrapped sbit font files, it will fail if you */
/* want to read the `head', `hhea', and `vhea' tables. */
/* */
if ( LOAD_( header ) )
{
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
missing_outline = 1;
#else
goto Exit;
#endif
}
if ( LOAD_( max_profile ) ||
LOAD_( charmaps ) ||
LOAD_( names ) ||
LOAD_( psnames ) )
goto Exit;
if ( /* load the `hhea' & `hmtx' tables at once */
( ( error = sfnt->load_metrics( face, stream, 0 ) ) != TT_Err_Ok ) ||
/* try to load the `vhea' & `vmtx' at once if present */
( error = sfnt->load_metrics( face, stream, 1 ) ) != TT_Err_Ok ||
( ( error = sfnt->load_metrics( face, stream, 1 ) ) != TT_Err_Ok ) ||
LOAD_( os2 ) )
{
LOAD_( charmaps ) ||
LOAD_( names ) ||
LOAD_( os2 ) ||
LOAD_( psnames ) )
goto Exit;
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
missing_outline = 1;
#else
goto Exit;
#endif
}
/* the optional tables */
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
/* embedded bitmap support. */
if ( sfnt->load_sbits && LOAD_( sbits ) )
goto Exit;
{
if ( !( ( error == TT_Err_Table_Missing ) && /* missing SBit */
( missing_outline == 0 ) ) ) /* find outline */
goto Exit;
}
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
if ( LOAD_( hdmx ) ||
LOAD_( gasp ) ||
LOAD_( kerning ) ||
LOAD_( pclt ) )
if ( LOAD_( hdmx ) ||
LOAD_( gasp ) ||
LOAD_( kerning ) ||
LOAD_( pclt ) )
goto Exit;
#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
@ -302,7 +330,7 @@
/* now set up root fields */
{
FT_Face root = &face->root;
FT_Int flags;
FT_Int flags = 0;
TT_CharMap charmap;
FT_Int n;
FT_Memory memory;
@ -314,9 +342,11 @@
/* */
/* Compute face flags. */
/* */
flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
FT_FACE_FLAG_SFNT | /* SFNT file format */
FT_FACE_FLAG_HORIZONTAL; /* horizontal data */
if ( missing_outline == 0 )
flags = FT_FACE_FLAG_SCALABLE; /* scalable outlines */
flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */
FT_FACE_FLAG_HORIZONTAL; /* horizontal data */
#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
/* might need more polish to detect the presence of a Postscript */
@ -343,24 +373,26 @@
/* Compute style flags. */
/* */
flags = 0;
if ( face->os2.version != 0xFFFF )
if ( missing_outline == 0 )
{
/* we have an OS/2 table; use the `fsSelection' field */
if ( face->os2.fsSelection & 1 )
flags |= FT_STYLE_FLAG_ITALIC;
if ( face->os2.version != 0xFFFF )
{
/* we have an OS/2 table; use the `fsSelection' field */
if ( face->os2.fsSelection & 1 )
flags |= FT_STYLE_FLAG_ITALIC;
if ( face->os2.fsSelection & 32 )
flags |= FT_STYLE_FLAG_BOLD;
}
else
{
/* this is an old Mac font, use the header field */
if ( face->header.Mac_Style & 1 )
flags |= FT_STYLE_FLAG_BOLD;
if ( face->os2.fsSelection & 32 )
flags |= FT_STYLE_FLAG_BOLD;
}
else
{
/* this is an old Mac font, use the header field */
if ( face->header.Mac_Style & 1 )
flags |= FT_STYLE_FLAG_BOLD;
if ( face->header.Mac_Style & 2 )
flags |= FT_STYLE_FLAG_ITALIC;
if ( face->header.Mac_Style & 2 )
flags |= FT_STYLE_FLAG_ITALIC;
}
}
root->style_flags = flags;
@ -403,11 +435,20 @@
if ( face->num_sbit_strikes )
{
root->num_fixed_sizes = face->num_sbit_strikes;
if ( ALLOC_ARRAY( root->available_sizes,
face->num_sbit_strikes,
FT_Bitmap_Size ) )
return error;
root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
#if 0
/* I don't know criteria whether layout is horizontal or vertical */
if ( missing_outline )
{
...
root->face_flags |= FT_FACE_FLAG_VERTICAL;
}
#endif
root->num_fixed_sizes = face->num_sbit_strikes;
if ( ALLOC_ARRAY( root->available_sizes,
face->num_sbit_strikes,
FT_Bitmap_Size ) )
return error;
for ( n = 0 ; n < face->num_sbit_strikes ; n++ )
{
@ -419,53 +460,58 @@
}
else
#else /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
{
root->num_fixed_sizes = 0;
root->available_sizes = 0;
}
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
/*********************************************************************/
/* */
/* Set up metrics. */
/* */
root->bbox.xMin = face->header.xMin;
root->bbox.yMin = face->header.yMin;
root->bbox.xMax = face->header.xMax;
root->bbox.yMax = face->header.yMax;
root->units_per_EM = face->header.Units_Per_EM;
/* The ascender/descender/height are computed from the OS/2 table */
/* when found. Otherwise, they're taken from the horizontal header. */
if ( face->os2.version != 0xFFFF )
if ( missing_outline == 0 )
{
root->ascender = face->os2.sTypoAscender;
root->descender = -face->os2.sTypoDescender;
root->height = root->ascender + root->descender +
face->os2.sTypoLineGap;
/* XXX What about if outline header is missing */
/* (e.g. sfnt wrapped outline)? */
root->bbox.xMin = face->header.xMin;
root->bbox.yMin = face->header.yMin;
root->bbox.xMax = face->header.xMax;
root->bbox.yMax = face->header.yMax;
root->units_per_EM = face->header.Units_Per_EM;
/* The ascender/descender/height are computed from the OS/2 table */
/* when found. Otherwise, they're taken from the horizontal */
/* header. */
/* */
if ( face->os2.version != 0xFFFF )
{
root->ascender = face->os2.sTypoAscender;
root->descender = -face->os2.sTypoDescender;
root->height = root->ascender + root->descender +
face->os2.sTypoLineGap;
}
else
{
root->ascender = face->horizontal.Ascender;
root->descender = face->horizontal.Descender;
root->height = root->ascender + root->descender +
face->horizontal.Line_Gap;
}
root->max_advance_width = face->horizontal.advance_Width_Max;
root->max_advance_height = face->vertical_info
? face->vertical.advance_Height_Max
: root->height;
root->underline_position = face->postscript.underlinePosition;
root->underline_thickness = face->postscript.underlineThickness;
/* root->max_points -- already set up */
/* root->max_contours -- already set up */
}
else
{
root->ascender = face->horizontal.Ascender;
root->descender = face->horizontal.Descender;
root->height = root->ascender + root->descender +
face->horizontal.Line_Gap;
}
root->max_advance_width = face->horizontal.advance_Width_Max;
root->max_advance_height = face->vertical_info
? face->vertical.advance_Height_Max
: root->height;
root->underline_position = face->postscript.underlinePosition;
root->underline_thickness = face->postscript.underlineThickness;
/* root->max_points -- already set up */
/* root->max_contours -- already set up */
}
Exit:

View File

@ -459,13 +459,10 @@
/* this table is optional */
error = face->goto_table( face, TTAG_EBLC, stream, 0 );
if (error)
if ( error )
error = face->goto_table( face, TTAG_bloc, stream, 0 );
if ( error )
{
error = 0;
goto Exit;
}
table_base = FILE_Pos();
if ( ACCESS_Frame( 8L ) )

View File

@ -212,9 +212,10 @@
if ( error )
goto Exit;
error = TT_Load_Locations( face, stream ) ||
TT_Load_CVT ( face, stream ) ||
TT_Load_Programs ( face, stream );
if ( face->root.face_flags & FT_FACE_FLAG_SCALABLE )
error = TT_Load_Locations( face, stream ) ||
TT_Load_CVT ( face, stream ) ||
TT_Load_Programs ( face, stream );
/* initialize standard glyph loading routines */
TT_Init_Glyph_Loading( face );