diff options
author | Alexei Podtelezhnikov <apodtele@gmail.com> | 2010-11-02 16:01:03 +0100 |
---|---|---|
committer | Werner Lemberg <wl@gnu.org> | 2010-11-02 16:01:03 +0100 |
commit | 6aee69096f7c04f3c16fa3d1a097180f9fb62154 (patch) | |
tree | 1dafcbf95bb38417c1a90f3b3ee454e5f41e7d0d /src | |
parent | 6a96bbe2752cf306ddb096a1be69d22888ec57f5 (diff) |
[ftsmooth] Improve rendering.
* src/smooth/ftsmooth.c (gray_render_conic): Since version 2.4.3,
cubic deviations have been estimated _after_ UPSCALE, whereas
conic ones have been evaluated _before_ UPSCALE, which produces
inferior rendering results. Fix this.
Partially undo change from 2010-10-15 by using ONE_PIXEL/4; this has
been tested with demo images sent to the mailing list. See
http://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html
and later mails in this thread.
Diffstat (limited to 'src')
-rw-r--r-- | src/smooth/ftgrays.c | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index 4477638d..8f93392f 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -877,40 +877,35 @@ typedef ptrdiff_t FT_PtrDist; FT_Vector* arc; - dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 ); - if ( dx < 0 ) - dx = -dx; - dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 ); - if ( dy < 0 ) - dy = -dy; + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + + dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); + dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); if ( dx < dy ) dx = dy; - if ( dx <= ONE_PIXEL / 8 ) + if ( dx <= ONE_PIXEL / 4 ) { - gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); return; } - level = 1; - dx /= ONE_PIXEL / 8; - while ( dx > 1 ) + level = 0; + while ( dx > ONE_PIXEL / 4 ) { dx >>= 2; level++; } - arc = ras.bez_stack; levels = ras.lev_stack; - top = 0; levels[0] = level; - - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control->x ); - arc[1].y = UPSCALE( control->y ); - arc[2].x = ras.x; - arc[2].y = ras.y; + top = 0; while ( top >= 0 ) { |