|
|
Definition at line 451 of file pcfdrivr.c.
{
PCF_Face face = (PCF_Face)FT_SIZE_FACE( size );
FT_Stream stream;
FT_Error error = PCF_Err_Ok;
FT_Bitmap* bitmap = &slot->bitmap;
PCF_Metric metric;
FT_Offset bytes;
FT_UNUSED( load_flags );
FT_TRACE4(( "load_glyph %d ---", glyph_index ));
if ( !face || glyph_index >= (FT_UInt)face->root.num_glyphs )
{
error = PCF_Err_Invalid_Argument;
goto Exit;
}
stream = face->root.stream;
if ( glyph_index > 0 )
glyph_index--;
metric = face->metrics + glyph_index;
bitmap->rows = metric->ascent + metric->descent;
bitmap->width = metric->rightSideBearing - metric->leftSideBearing;
bitmap->num_grays = 1;
bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n",
PCF_BIT_ORDER( face->bitmapsFormat ),
PCF_BYTE_ORDER( face->bitmapsFormat ),
PCF_GLYPH_PAD( face->bitmapsFormat ) ));
switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) )
{
case 1:
bitmap->pitch = ( bitmap->width + 7 ) >> 3;
break;
case 2:
bitmap->pitch = ( ( bitmap->width + 15 ) >> 4 ) << 1;
break;
case 4:
bitmap->pitch = ( ( bitmap->width + 31 ) >> 5 ) << 2;
break;
case 8:
bitmap->pitch = ( ( bitmap->width + 63 ) >> 6 ) << 3;
break;
default:
return PCF_Err_Invalid_File_Format;
}
bytes = bitmap->pitch * bitmap->rows;
error = ft_glyphslot_alloc_bitmap( slot, bytes );
if ( error )
goto Exit;
if ( FT_STREAM_SEEK( metric->bits ) ||
FT_STREAM_READ( bitmap->buffer, bytes ) )
goto Exit;
if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst )
BitOrderInvert( bitmap->buffer, bytes );
if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) !=
PCF_BIT_ORDER( face->bitmapsFormat ) ) )
{
switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) )
{
case 1:
break;
case 2:
TwoByteSwap( bitmap->buffer, bytes );
break;
case 4:
FourByteSwap( bitmap->buffer, bytes );
break;
}
}
slot->format = FT_GLYPH_FORMAT_BITMAP;
slot->bitmap_left = metric->leftSideBearing;
slot->bitmap_top = metric->ascent;
slot->metrics.horiAdvance = metric->characterWidth << 6;
slot->metrics.horiBearingX = metric->leftSideBearing << 6;
slot->metrics.horiBearingY = metric->ascent << 6;
slot->metrics.width = ( metric->rightSideBearing -
metric->leftSideBearing ) << 6;
slot->metrics.height = bitmap->rows << 6;
ft_synthesize_vertical_metrics( &slot->metrics,
( face->accel.fontAscent +
face->accel.fontDescent ) << 6 );
FT_TRACE4(( " --- ok\n" ));
Exit:
return error;
}
|