diff --git a/ChangeLog b/ChangeLog index 414eae791..6e896b6fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2010-11-01 Alexei Podtelezhnikov + + [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. + 2010-10-28 Werner Lemberg [ftraster] Minor fixes. diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index 4477638d0..8f93392fb 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -877,34 +877,7 @@ 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; - if ( dx < dy ) - dx = dy; - - if ( dx <= ONE_PIXEL / 8 ) - { - gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); - return; - } - - level = 1; - dx /= ONE_PIXEL / 8; - while ( dx > 1 ) - { - dx >>= 2; - level++; - } - - arc = ras.bez_stack; - levels = ras.lev_stack; - top = 0; - levels[0] = level; - + arc = ras.bez_stack; arc[0].x = UPSCALE( to->x ); arc[0].y = UPSCALE( to->y ); arc[1].x = UPSCALE( control->x ); @@ -912,6 +885,28 @@ typedef ptrdiff_t FT_PtrDist; 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 / 4 ) + { + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + return; + } + + level = 0; + while ( dx > ONE_PIXEL / 4 ) + { + dx >>= 2; + level++; + } + + levels = ras.lev_stack; + levels[0] = level; + top = 0; + while ( top >= 0 ) { level = levels[top];