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 |