From 09a029b687465190c828bde896173e23aa350c4c Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Tue, 30 Oct 2012 14:28:03 +0000 Subject: factor out computation for dy in SkEdge lines, so we can later try a fix. git-svn-id: http://skia.googlecode.com/svn/trunk@6198 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkEdge.cpp | 6 ++++-- src/core/SkEdge.h | 12 +++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/core/SkEdge.cpp b/src/core/SkEdge.cpp index fff3dbcc6a..e646c4765f 100644 --- a/src/core/SkEdge.cpp +++ b/src/core/SkEdge.cpp @@ -72,8 +72,9 @@ int SkEdge::setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip, } SkFixed slope = SkFDot6Div(x1 - x0, y1 - y0); + const int dy = SkEdge_Compute_DY(top, y0); - fX = SkFDot6ToFixed(x0 + SkFixedMul(slope, (32 - y0) & 63)); // + SK_Fixed1/2 + fX = SkFDot6ToFixed(x0 + SkFixedMul(slope, dy)); // + SK_Fixed1/2 fDX = slope; fFirstY = top; fLastY = bot - 1; @@ -112,8 +113,9 @@ int SkEdge::updateLine(SkFixed x0, SkFixed y0, SkFixed x1, SkFixed y1) x1 >>= 10; SkFixed slope = SkFDot6Div(x1 - x0, y1 - y0); + const int dy = SkEdge_Compute_DY(top, y0); - fX = SkFDot6ToFixed(x0 + SkFixedMul(slope, (32 - y0) & 63)); // + SK_Fixed1/2 + fX = SkFDot6ToFixed(x0 + SkFixedMul(slope, dy)); // + SK_Fixed1/2 fDX = slope; fFirstY = top; fLastY = bot - 1; diff --git a/src/core/SkEdge.h b/src/core/SkEdge.h index 53678621c3..c36ba246ce 100644 --- a/src/core/SkEdge.h +++ b/src/core/SkEdge.h @@ -14,6 +14,15 @@ #include "SkFDot6.h" #include "SkMath.h" +//#ifdef SK_IGNORE_SETLINE_FIX +#if 1 + #define SkEdge_Compute_DY(top, y0) ((32 - (y0)) & 63) +#else + // This is correct, as it favors the lower-pixel when y0 is on a 1/2 pixel + // boundary, returning 64 instead of the old code, which returns 0. + #define SkEdge_Compute_DY(top, y0) ((top << 6) + 32 - (y0)) +#endif + struct SkEdge { enum Type { kLine_Type, @@ -118,8 +127,9 @@ int SkEdge::setLine(const SkPoint& p0, const SkPoint& p1, int shift) { } SkFixed slope = SkFDot6Div(x1 - x0, y1 - y0); + const int dy = SkEdge_Compute_DY(top, y0); - fX = SkFDot6ToFixed(x0 + SkFixedMul(slope, (32 - y0) & 63)); // + SK_Fixed1/2 + fX = SkFDot6ToFixed(x0 + SkFixedMul(slope, dy)); // + SK_Fixed1/2 fDX = slope; fFirstY = top; fLastY = bot - 1; -- cgit v1.2.3