* src/smooth/ftgrays.c: adding experimental "gamma" support. This

produces smoother glyphs at small sizes for very little cost

	* src/autohint/ahglyph.c, src/autohint/ahhint.c: various fixes to
	the auto-hinter. They merely improve the output of sans-serif fonts.
	Note that there are still problems with serifed fonts and composites
	(accented characters)

	* tests/gview.c: updated the debugging glyph viewer to show the
	hints generated by the "autohint" module
This commit is contained in:
David Turner 2001-10-30 23:51:24 +00:00
parent 9d7e5e8b8b
commit adf07a930c
4 changed files with 70 additions and 5 deletions

View File

@ -1,3 +1,17 @@
2001-10-29 David Turner <david@freetype.org>
* src/smooth/ftgrays.c: adding experimental "gamma" support. This
produces smoother glyphs at small sizes for very little cost
* src/autohint/ahglyph.c, src/autohint/ahhint.c: various fixes to
the auto-hinter. They merely improve the output of sans-serif fonts.
Note that there are still problems with serifed fonts and composites
(accented characters)
* tests/gview.c: updated the debugging glyph viewer to show the
hints generated by the "autohint" module
2001-10-27 David Turner <david@freetype.org>
* src/cache/ftchunk.c (ftc_chunk_cache_lookup): fixed a bug that

View File

@ -994,7 +994,7 @@
dist = -dist;
if ( len < 8 )
score = 300 + dist;
score = 300*8 + dist - len*3;
else
score = dist + 300/len;

View File

@ -169,10 +169,12 @@
if ( base->flags & ah_edge_done )
{
if ( dist >= 64 )
dist = ( dist + 8 ) & -64;
dist = (dist+8) & -64;
else if ( dist <= 32 && !vertical )
dist = ( dist + 33 ) >> 1;
else
dist = 0;
}
serif->pos = base->pos + sign * dist;

View File

@ -84,6 +84,10 @@
#include <string.h> /* for memcpy() */
#include <setjmp.h>
/* experimental support for gamma correction within the rasterizer */
#define GRAYS_USE_GAMMA
/*************************************************************************/
/* */
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
@ -305,6 +309,10 @@
void* memory;
jmp_buf jump_buffer;
#ifdef GRAYS_USE_GAMMA
FT_Byte gamma[257];
#endif
} TRaster, *PRaster;
@ -1230,15 +1238,21 @@
for ( ; count > 0; count--, spans++ )
{
if ( spans->coverage )
FT_UInt coverage = spans->coverage;
#ifdef GRAYS_USE_GAMMA
coverage = raster->gamma[(FT_Byte)coverage];
#endif
if ( coverage )
#if 1
MEM_Set( p + spans->x, (unsigned char)spans->coverage, spans->len );
MEM_Set( p + spans->x, (unsigned char)coverage, spans->len );
#else /* 1 */
{
q = p + spans->x;
limit = q + spans->len;
for ( ; q < limit; q++ )
q[0] = (unsigned char)spans->coverage;
q[0] = (unsigned char)coverage;
}
#endif /* 1 */
}
@ -1960,6 +1974,33 @@
/**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
/**** a static object. *****/
#ifdef GRAYS_USE_GAMMA
/* initialize the "gamma" table. Yes, this is really a crummy function */
/* but the results look pretty good for something that simple.. */
/* */
#define M_MAX 255
#define M_X 128
#define M_Y 96
static void
grays_init_gamma( PRaster raster )
{
FT_UInt x, a;
for ( x = 0; x < 256; x++ )
{
if ( x <= M_X )
a = (x * M_Y + (M_X/2)) / M_X;
else
a = M_Y + ((x-M_X)*(M_MAX-M_Y) + (M_MAX-M_X)/2)/(M_MAX-M_X);
raster->gamma[x] = (FT_Byte)a;
}
}
#endif /* GRAYS_USE_GAMMA */
#ifdef _STANDALONE_
static int
@ -1974,6 +2015,10 @@
*araster = (FT_Raster)&the_raster;
MEM_Set( &the_raster, 0, sizeof ( the_raster ) );
#ifdef GRAYS_USE_GAMMA
grays_init_gamma( (PRaster)*araster );
#endif
return 0;
}
@ -2000,6 +2045,10 @@
{
raster->memory = memory;
*araster = (FT_Raster)raster;
#ifdef GRAYS_USE_GAMMA
grays_init_gamma( raster );
#endif
}
return error;