From 38e82be157ecf6fb43de5d0879bc06df243646a1 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Mon, 30 May 2005 19:22:44 +0000 Subject: [PATCH] * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Minor documentation improvements. * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix typos. * src/base/ftbitmap.c (FT_Bitmap_Embolden): Add support for bitmap of pixel_mode FT_PIXEL_MODE_GRAY2 or FT_PIXEL_MODE_GRAY4. If xstr is larger than 8 and bitmap is of pixel_mode FT_PIXEL_MODE_MONO, set xstr to 8 instead of returning error. --- ChangeLog | 12 +++++++++++ include/freetype/ftbitmap.h | 9 ++++----- include/freetype/ftoutln.h | 2 +- src/base/ftbitmap.c | 40 ++++++++++++++++++++++++++++++------- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 206d821ac..31780bed9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-05-30 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Minor + documentation improvements. + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix typos. + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Add support for bitmap + of pixel_mode FT_PIXEL_MODE_GRAY2 or FT_PIXEL_MODE_GRAY4. + If xstr is larger than 8 and bitmap is of pixel_mode + FT_PIXEL_MODE_MONO, set xstr to 8 instead of returning error. + 2005-05-29 Chia I Wu * src/base/ftbitmap.c (FT_Bitmap_Embolden): Fix emboldening bitmap diff --git a/include/freetype/ftbitmap.h b/include/freetype/ftbitmap.h index 2d9e36822..319dd0869 100644 --- a/include/freetype/ftbitmap.h +++ b/include/freetype/ftbitmap.h @@ -97,7 +97,7 @@ FT_BEGIN_HEADER /* FT_Bitmap_Embolden */ /* */ /* */ - /* Emboldens a bitmap. The new bitmap will be about `xStrength' */ + /* Embolden a bitmap. The new bitmap will be about `xStrength' */ /* pixels wider and `yStrength' pixels higher. The left and bottom */ /* borders are kept unchanged. */ /* */ @@ -105,10 +105,10 @@ FT_BEGIN_HEADER /* library :: A handle to a library object. */ /* */ /* xStrength :: How strong the glyph is emboldened horizontally. */ - /* Expressed in 16.16 pixel format. */ + /* Expressed in 26.6 pixel format. */ /* */ /* yStrength :: How strong the glyph is emboldened vertically. */ - /* Expressed in 16.16 pixel format. */ + /* Expressed in 26.6 pixel format. */ /* */ /* */ /* bitmap :: A handle to the target bitmap. */ @@ -118,12 +118,11 @@ FT_BEGIN_HEADER /* */ /* */ /* The current implementation restricts `xStrength' to be less than */ - /* or equal to 8. */ + /* or equal to 8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ /* */ /* Don't embolden the bitmap owned by a @FT_GlyphSlot directly! Call */ /* @FT_Bitmap_Copy to get a copy and work on the copy instead. */ /* */ - /* */ FT_EXPORT_DEF( FT_Error ) FT_Bitmap_Embolden( FT_Library library, FT_Bitmap* bitmap, diff --git a/include/freetype/ftoutln.h b/include/freetype/ftoutln.h index 543f1512e..76ad60a61 100644 --- a/include/freetype/ftoutln.h +++ b/include/freetype/ftoutln.h @@ -319,7 +319,7 @@ FT_BEGIN_HEADER /* */ /* */ /* strength :: How strong the glyph is emboldened. Expressed in */ - /* 16.16 pixel format. */ + /* 26.6 pixel format. */ /* */ /* */ /* FreeType error code. 0 means success. */ diff --git a/src/base/ftbitmap.c b/src/base/ftbitmap.c index 638039100..7c95af7fa 100644 --- a/src/base/ftbitmap.c +++ b/src/base/ftbitmap.c @@ -211,30 +211,56 @@ if ( !library ) return FT_Err_Invalid_Library_Handle; - if ( !bitmap ) + if ( !bitmap || !bitmap->buffer ) return FT_Err_Invalid_Argument; xstr = FT_PIX_ROUND( xStrength ) >> 6; ystr = FT_PIX_ROUND( yStrength ) >> 6; + if ( xstr == 0 && ystr == 0 ) + return FT_Err_Ok; + else if ( xstr < 0 || ystr < 0 ) + return FT_Err_Invalid_Argument; + switch ( bitmap->pixel_mode ) { case FT_PIXEL_MODE_GRAY2: case FT_PIXEL_MODE_GRAY4: - return FT_Err_Invalid_Glyph_Format; + { + FT_Bitmap tmp; + FT_Int align; + + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 ) + align = ( bitmap->width + xstr + 3 ) / 4; + else + align = ( bitmap->width + xstr + 1 ) / 2; + + FT_Bitmap_New( &tmp ); + error = FT_Bitmap_Convert( library, bitmap, &tmp, align ); + + if ( error ) + return error; + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + } + break; + + case FT_PIXEL_MODE_MONO: + if ( xstr > 8 ) + xstr = 8; + break; + case FT_PIXEL_MODE_LCD: xstr *= 3; break; + case FT_PIXEL_MODE_LCD_V: ystr *= 3; break; } - if ( xstr == 0 && ystr == 0 ) - return FT_Err_Ok; - else if ( xstr < 0 || ystr < 0 || xstr > 8 ) - return FT_Err_Invalid_Argument; - error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr ); if ( error ) return error;