[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[ft-devel] suggested improvement to FT_GlyphSlot_Embolden
From: |
Graham Asher |
Subject: |
[ft-devel] suggested improvement to FT_GlyphSlot_Embolden |
Date: |
Wed, 25 Jul 2007 11:42:21 +0100 |
Dear FreeTypers,
I am using FT_Glyphslot_Embolden and so far it seems to work quite well.
However, the default extra boldness (1/24 em) is too great for my purposes,
and ought to be settable via an argument, because different values are
needed at different times. For example, 1/32 em is adequate for making
DejaVu Sans Bold extra-bold.
I therefore suggest the following changes.
The function declaration in ftsynth,h becomes:
/*
Make a glyph bolder. The argument "boldness" is a
fixed-point value in ems. Strokes are thickened
by this value.
*/
FT_EXPORT( void )
FT_GlyphSlot_Embolden( FT_GlyphSlot slot,
FT_Fixed boldness );
The function itself in ftsynth.c becomes:
FT_EXPORT_DEF( void )
FT_GlyphSlot_Embolden( FT_GlyphSlot slot,
FT_Fixed boldness )
{
FT_Library library = slot->library;
FT_Face face = FT_SLOT_FACE( slot );
FT_Error error;
FT_Pos xstr, ystr;
if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
slot->format != FT_GLYPH_FORMAT_BITMAP )
return;
/* convert boldness to pixels */
xstr = FT_MulFix( face->units_per_EM,
face->size->metrics.y_scale );
xstr = FT_MulFix( xstr, boldness );
ystr = xstr;
if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
{
error = FT_Outline_Embolden( &slot->outline, xstr );
/* ignore error */
/* this is more than enough for most glyphs; if you need accurate */
/* values, you have to call FT_Outline_Get_CBox */
xstr = xstr * 2;
ystr = xstr;
}
else if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
{
xstr = FT_PIX_FLOOR( xstr );
if ( xstr == 0 )
xstr = 1 << 6;
ystr = FT_PIX_FLOOR( ystr );
error = FT_GlyphSlot_Own_Bitmap( slot );
if ( error )
return;
error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
if ( error )
return;
}
if ( slot->advance.x )
slot->advance.x += xstr;
if ( slot->advance.y )
slot->advance.y += ystr;
slot->metrics.width += xstr;
slot->metrics.height += ystr;
slot->metrics.horiBearingY += ystr;
slot->metrics.horiAdvance += xstr;
slot->metrics.vertBearingX -= xstr / 2;
slot->metrics.vertBearingY += ystr;
slot->metrics.vertAdvance += ystr;
if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
slot->bitmap_top += ystr >> 6;
}
Using the new function I can then pass the boldness value 65536 / 32 = 2048
to get extra boldness of 1/32 em. I have tested these changes and they work
well.
Best wishes,
Graham Asher
- [ft-devel] suggested improvement to FT_GlyphSlot_Embolden,
Graham Asher <=