Commit 38e82be157ecf6fb43de5d0879bc06df243646a1

Werner Lemberg 2005-05-30T19:22:44

* 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.

diff --git a/ChangeLog b/ChangeLog
index 206d821..31780be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-05-30  Chia I Wu  <b90201047@ntu.edu.tw>
+
+	* 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  <b90201047@ntu.edu.tw>
 
 	* src/base/ftbitmap.c (FT_Bitmap_Embolden): Fix emboldening bitmap
diff --git a/include/freetype/ftbitmap.h b/include/freetype/ftbitmap.h
index 2d9e368..319dd08 100644
--- a/include/freetype/ftbitmap.h
+++ b/include/freetype/ftbitmap.h
@@ -97,7 +97,7 @@ FT_BEGIN_HEADER
   /*    FT_Bitmap_Embolden                                                 */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    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.                       */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    bitmap    :: A handle to the target bitmap.                        */
@@ -118,12 +118,11 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Note>                                                                */
   /*    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 543f151..76ad60a 100644
--- a/include/freetype/ftoutln.h
+++ b/include/freetype/ftoutln.h
@@ -319,7 +319,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Input>                                                               */
   /*    strength :: How strong the glyph is emboldened.  Expressed in      */
-  /*                16.16 pixel format.                                    */
+  /*                26.6 pixel format.                                     */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
diff --git a/src/base/ftbitmap.c b/src/base/ftbitmap.c
index 6380391..7c95af7 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;