blob: ad439394a12c1412a0078e0ebc45645bba8cbaa2 [file] [log] [blame]
--- freetype-2.3.11/builds/unix/configure.orig 2010-08-25 13:37:30.000000000 -0700
+++ freetype-2.3.11/builds/unix/configure 2010-08-25 14:23:35.000000000 -0700
@@ -6043,7 +6043,7 @@
fi
if test x$with_zlib != xno && test -n "$LIBZ"; then
CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB"
- LDFLAGS="$LDFLAGS $LIBZ"
+ LDFLAGS="$LDFLAGS $LIBZ -lm"
SYSTEM_ZLIB=yes
fi
/*************************************************************************/
diff --git a/src/smooth/ftsmooth.c b/src/smooth/ftsmooth.c
index 7d16b94..57de912 100644
--- a/src/smooth/ftsmooth.c
+++ b/src/smooth/ftsmooth.c
@@ -25,6 +25,7 @@
#include "ftspic.h"
#include "ftsmerrs.h"
+#include <math.h>
/* initialize renderer -- init its raster */
@@ -94,6 +95,47 @@
}
+ /* soften the sub-pixel anti-aliasing and sharpen */
+ static void
+ _ft_subpixel_sharpen( FT_Bitmap* bitmap,
+ FT_Render_Mode mode,
+ FT_Byte cutoff,
+ double gamma_value )
+ {
+ static FT_Bool initialized_gamma = FALSE;
+ static unsigned short gamma_ramp[256];
+ FT_UInt width = (FT_UInt)bitmap->width;
+ FT_UInt height = (FT_UInt)bitmap->rows;
+ int ii;
+ if (!initialized_gamma)
+ {
+ initialized_gamma = TRUE;
+ /* linear to voltage */
+ for ( ii = 0; ii < 256; ii++ )
+ {
+ gamma_ramp[ii] = (unsigned char)
+ ( pow( (double)ii/255.0, gamma_value ) * 255.0f );
+ if (gamma_ramp[ii] < cutoff) {
+ gamma_ramp[ii] = 0;
+ }
+ }
+ }
+
+ /* horizontal in-place sub-pixel sharpening filter */
+ if ( mode == FT_RENDER_MODE_LCD)
+ {
+ FT_Byte* line = bitmap->buffer;
+ for ( ; height > 0; height--, line += bitmap->pitch )
+ {
+ FT_UInt xx;
+ for ( xx = 0; xx < width; xx++ )
+ {
+ line[xx] = gamma_ramp[line[xx]];
+ }
+ }
+ }
+ }
+
/* convert a slot's glyph image into a bitmap */
static FT_Error
ft_smooth_render_generic( FT_Renderer render,
@@ -265,6 +307,12 @@
vec->y /= 3;
}
+ /* These should be controllable */
+ FT_Byte cutoff = (FT_Byte)(0.25 * 255.0);
+ double gamma_value = 1.2;
+ /* sharpen the glyphs */
+ _ft_subpixel_sharpen( bitmap, mode, cutoff, gamma_value );
+
if ( slot->library->lcd_filter_func )
slot->library->lcd_filter_func( bitmap, mode, slot->library );