ref: d53bfeb810eca2e0a796ad7bbb2f0e122cfa4426
parent: d1245c0dd28f3604e266b44e7b3ff0108ae0c806
author: David Turner <[email protected]>
date: Thu Aug 29 18:50:17 EDT 2002
* 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..
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,19 @@
+2002-08-29 David Turner <[email protected]>
+
+ * 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 <[email protected]>
* 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 <[email protected]>
- 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 <[email protected]>
- 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
--- a/src/pshinter/pshalgo3.c
+++ b/src/pshinter/pshalgo3.c
@@ -33,11 +33,9 @@
#endif
-#undef SNAP_STEMS
-#undef ONLY_ALIGN_Y
+#define COMPUTE_INFLEXS /* compute inflection points to optimize "S" and others */
+#define STRONGER /* slightly increase the contrast of smooth hinting */
-#define COMPUTE_INFLEXS
-
/*************************************************************************/
/*************************************************************************/
/***** *****/
@@ -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 );