Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Unified Diff: src/core/SkAnalyticEdge.h

Issue 2388213003: Revert of Analytic AntiAlias for Convex Shapes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkAAAConstants.h ('k') | src/core/SkAnalyticEdge.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkAnalyticEdge.h
diff --git a/src/core/SkAnalyticEdge.h b/src/core/SkAnalyticEdge.h
deleted file mode 100644
index f4b23ba2b6bd6ab77c5e0b2d0bc5aaeb1d291d96..0000000000000000000000000000000000000000
--- a/src/core/SkAnalyticEdge.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkAnalyticEdge_DEFINED
-#define SkAnalyticEdge_DEFINED
-
-#include "SkEdge.h"
-
-inline SkFixed SkFixedMul_lowprec(SkFixed a, SkFixed b) {
- SkASSERT(((int64_t)a >> 8) * (b >> 8) <= SK_MaxS32);
- return (a >> 8) * (b >> 8);
-}
-
-struct SkAnalyticEdge {
- // Similar to SkEdge, the conic edges will be converted to quadratic edges
- enum Type {
- kLine_Type,
- kQuad_Type,
- kCubic_Type
- };
-
- SkAnalyticEdge* fNext;
- SkAnalyticEdge* fPrev;
-
- SkFixed fX;
- SkFixed fDX;
- SkFixed fUpperX; // The x value when y = fUpperY
- SkFixed fY; // The current y
- SkFixed fUpperY; // The upper bound of y (our edge is from y = fUpperY to y = fLowerY)
- SkFixed fLowerY; // The lower bound of y (our edge is from y = fUpperY to y = fLowerY)
- SkFixed fDY; // abs(1/fDX); may be SK_MaxS32 when fDX is close to 0.
- // fDY is only used for blitting trapezoids.
-
- int8_t fCurveCount; // only used by kQuad(+) and kCubic(-)
- uint8_t fCurveShift; // appled to all Dx/DDx/DDDx except for fCubicDShift exception
- uint8_t fCubicDShift; // applied to fCDx and fCDy only in cubic
- int8_t fWinding; // 1 or -1
-
- static const int kDefaultAccuracy = 2; // default accuracy for snapping
-
- static inline SkFixed snapY(SkFixed y, int accuracy = kDefaultAccuracy) {
- return SkFixedRoundToFixed(y << accuracy) >> accuracy;
- }
-
- // Update fX, fY of this edge so fY = y
- inline void goY(SkFixed y) {
- if (y == fY + SK_Fixed1) {
- fX = fX + fDX;
- fY = y;
- } else if (y != fY) {
- // Drop lower digits as our alpha only has 8 bits
- // (fDX and y - fUpperY may be greater than SK_Fixed1)
- fX = fUpperX + SkFixedMul_lowprec(fDX, y - fUpperY);
- fY = y;
- }
- }
-
- inline bool setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip = nullptr);
- inline bool updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by, SkFixed slope);
- void chopLineWithClip(const SkIRect& clip);
-
- inline bool intersectsClip(const SkIRect& clip) const {
- SkASSERT(SkFixedFloorToInt(fUpperY) < clip.fBottom);
- return SkFixedCeilToInt(fLowerY) > clip.fTop;
- }
-
-#ifdef SK_DEBUG
- void dump() const {
- SkDebugf("edge: upperY:%d lowerY:%d y:%g x:%g dx:%g w:%d\n",
- fUpperY, fLowerY, SkFixedToFloat(fY), SkFixedToFloat(fX),
- SkFixedToFloat(fDX), fWinding);
- }
-
- void validate() const {
- SkASSERT(fPrev && fNext);
- SkASSERT(fPrev->fNext == this);
- SkASSERT(fNext->fPrev == this);
-
- SkASSERT(fUpperY < fLowerY);
- SkASSERT(SkAbs32(fWinding) == 1);
- }
-#endif
-};
-
-struct SkAnalyticQuadraticEdge : public SkAnalyticEdge {
- SkQuadraticEdge fQEdge;
-
- // snap y to integer points in the middle of the curve to accelerate AAA path filling
- SkFixed fSnappedX, fSnappedY;
-
- bool setQuadratic(const SkPoint pts[3]);
- bool updateQuadratic();
-};
-
-struct SkAnalyticCubicEdge : public SkAnalyticEdge {
- SkCubicEdge fCEdge;
-
- bool setCubic(const SkPoint pts[4]);
- bool updateCubic();
-};
-
-bool SkAnalyticEdge::setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip) {
- // We must set X/Y using the same way (times 4, to FDot6, then to Fixed) as Quads/Cubics.
- // Otherwise the order of the edge might be wrong due to precision limit.
- SkFixed x0 = SkFDot6ToFixed(SkScalarToFDot6(p0.fX * 4)) >> 2;
- SkFixed y0 = snapY(SkFDot6ToFixed(SkScalarToFDot6(p0.fY * 4)) >> 2);
- SkFixed x1 = SkFDot6ToFixed(SkScalarToFDot6(p1.fX * 4)) >> 2;
- SkFixed y1 = snapY(SkFDot6ToFixed(SkScalarToFDot6(p1.fY * 4)) >> 2);
-
- // are we a zero-height line?
- if (y0 == y1) {
- return false;
- }
-
- int top = SkFixedFloorToInt(y0);
- int bot = SkFixedCeilToInt(y1);
-
- // are we completely above or below the clip?
- if (clip && (top >= clip->fBottom || bot <= clip->fTop)) {
- return false;
- }
-
- int winding = 1;
-
- if (y0 > y1) {
- SkTSwap(x0, x1);
- SkTSwap(y0, y1);
- winding = -1;
- }
-
- SkFixed slope = SkFixedDiv(x1 - x0, y1 - y0);
-
- fX = x0;
- fDX = slope;
- fUpperX = x0;
- fY = y0;
- fUpperY = y0;
- fLowerY = y1;
- fDY = x1 != x0 ? SkAbs32(SkFixedDiv(y1 - y0, x1 - x0)) : SK_MaxS32;
- fCurveCount = 0;
- fWinding = SkToS8(winding);
- fCurveShift = 0;
-
- if (clip) {
- this->chopLineWithClip(*clip);
- }
- return true;
-}
-
-#endif
« no previous file with comments | « src/core/SkAAAConstants.h ('k') | src/core/SkAnalyticEdge.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698