summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexei Podtelezhnikov <apodtele@gmail.com>2010-11-02 16:01:03 +0100
committerWerner Lemberg <wl@gnu.org>2010-11-02 16:01:03 +0100
commit6aee69096f7c04f3c16fa3d1a097180f9fb62154 (patch)
tree1dafcbf95bb38417c1a90f3b3ee454e5f41e7d0d
parent6a96bbe2752cf306ddb096a1be69d22888ec57f5 (diff)
downloadfreetype2-6aee69096f7c04f3c16fa3d1a097180f9fb62154.tar.gz
[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.
-rw-r--r--ChangeLog15
-rw-r--r--src/smooth/ftgrays.c35
2 files changed, 30 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 414eae791..6e896b6fd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2010-11-01 Alexei Podtelezhnikov <apodtele@gmail.com>
+
+ [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 <wl@gnu.org>
[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,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 )
{