From d53bfeb810eca2e0a796ad7bbb2f0e122cfa4426 Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 29 Aug 2002 22:50:17 +0000 Subject: [PATCH] * src/pshinter/pshalgo.c: slight modification to the Postscript hinter to slightly increase the contrast of smooth hinting. This is very similar to what the auto-hinter does when it comes to stem width computations. However, it produces better results with well-hinted fonts.. --- ChangeLog | 21 ++++++++----- src/pshinter/pshalgo3.c | 65 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 90bf2ad63..4c0068fa3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,19 @@ +2002-08-29 David Turner + + * src/pshinter/pshalgo.c: slight modification to the Postscript hinter + to slightly increase the contrast of smooth hinting. This is very similar + to what the auto-hinter does when it comes to stem width computations. + However, it produces better results with well-hinted fonts.. + 2002-08-27 David Turner * massive re-formatting changes to many, many source files. I don't want to list them all here. The operations performed were all logical transformations of the sources: - + - trying to convert all enums and constants to CAPITALIZED_STYLE, with #define definitions like - + #define my_old_constants MY_NEW_CONSTANT - big, big update of the documentation comments @@ -14,7 +21,7 @@ * include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c, include/freetype/ftimage.h: adding support for LCD-optimized rendering though the new constants/enums: - + FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V @@ -23,12 +30,12 @@ * adding new FT_LOAD_XXX flags, used to specify both hinting and rendering targets: - + FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering FT_LOAD_TARGET_MONO :: monochrome bitmaps FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering - + note that FT_LOAD_TARGET_NORMAL is 0, which means that the default behaviour of the font engine is _unchanged_. @@ -185,7 +192,7 @@ 2002-08-15 Graham Asher - Implemented the incremental font loading system for the CFF driver. + Implemented the incremental font loading system for the CFF driver. Tested using the GhostScript-to-FreeType bridge (under development). * src/cff/cffgload.c (cff_get_glyph_data, cff_free_glyph_data): New @@ -300,7 +307,7 @@ 2002-07-18 Graham Asher - Added types and structures to support incremental typeface loading. + Added types and structures to support incremental typeface loading. The FT_Incremental_Interface structure, defined in freetype.h, is designed to be passed to FT_Open_Face to provide callback functions to obtain glyph recipes and metrics, for fonts like those passed diff --git a/src/pshinter/pshalgo3.c b/src/pshinter/pshalgo3.c index 0a178e04a..518cc3428 100644 --- a/src/pshinter/pshalgo3.c +++ b/src/pshinter/pshalgo3.c @@ -33,10 +33,8 @@ #endif -#undef SNAP_STEMS -#undef ONLY_ALIGN_Y - -#define COMPUTE_INFLEXS +#define COMPUTE_INFLEXS /* compute inflection points to optimize "S" and others */ +#define STRONGER /* slightly increase the contrast of smooth hinting */ /*************************************************************************/ /*************************************************************************/ @@ -412,7 +410,7 @@ /* perform stem snapping when requested */ no_snapping = ( dimension == 0 && !glyph->no_horz_snapping ) || ( dimension == 1 && !glyph->no_vert_snapping ); - + if ( !no_snapping ) { /* compute fitted width/height */ @@ -499,6 +497,58 @@ } else { +#ifdef STRONGER + if ( len <= 64 ) + { + /* the stem is less than one pixel, we will center it */ + /* around the nearest pixel center */ + /* */ + pos = ( pos + (len >> 1) & -64 ); + len = 64; + } + else + { + FT_Pos delta = len - dim->stdw.widths[0].cur; + + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + len = dim->stdw.widths[0].cur; + if ( len < 32 ) + len = 32; + } + + if ( len < 3 * 64 ) + { + delta = ( len & 63 ); + len &= -64; + + if ( delta < 10 ) + len += delta; + + else if ( delta < 32 ) + len += 10; + + else if ( delta < 54 ) + len += 54; + + else + len += delta; + } + else + len = ( len + 32 ) & -64; + } + + /* now that we have a good hinted stem width, try to position */ + /* the stem along a pixel grid integer coordinate */ + hint->cur_pos = pos + psh3_hint_snap_stem_side_delta( pos, len ); + hint->cur_len = len; + +#else /* !STRONGER */ + /* Stems less than one pixel wide are easy - we want to * make them as dark as possible, so they must fall within * one pixel. If the stem is split between two pixels @@ -541,7 +591,7 @@ FT_Fixed delta_a, delta_b; - if ( len & 64 ) + if ( len & 64 ) { delta_a = ( center & -64 ) + 32 - center; delta_b = ( ( center + 32 ) & - 64 ) - center; @@ -573,6 +623,7 @@ pos += delta_b; } hint->cur_pos = pos; +#endif /* !STRONGER */ } } } @@ -1712,7 +1763,7 @@ glyph->no_horz_hints = 0; glyph->no_vert_hints = 0; - + glyph->no_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_NORMAL || hint_mode == FT_RENDER_MODE_LCD_V );