diff options
Diffstat (limited to 'gfx/skia')
-rw-r--r-- | gfx/skia/skia/include/core/SkPath.h | 2 | ||||
-rw-r--r-- | gfx/skia/skia/include/core/SkPathRef.h | 2 | ||||
-rw-r--r-- | gfx/skia/skia/src/core/SkPath.cpp | 23 | ||||
-rw-r--r-- | gfx/skia/skia/src/core/SkPathPriv.h | 5 | ||||
-rw-r--r-- | gfx/skia/skia/src/core/SkScan_Path.cpp | 61 |
5 files changed, 35 insertions, 58 deletions
diff --git a/gfx/skia/skia/include/core/SkPath.h b/gfx/skia/skia/include/core/SkPath.h index bde07c498..d1af4f31b 100644 --- a/gfx/skia/skia/include/core/SkPath.h +++ b/gfx/skia/skia/include/core/SkPath.h @@ -373,7 +373,7 @@ public: @param extraPtCount The number of extra points the path should preallocate for. */ - void incReserve(int extraPtCount); + void incReserve(unsigned extraPtCount); /** Set the beginning of the next contour to the point (x,y). diff --git a/gfx/skia/skia/include/core/SkPathRef.h b/gfx/skia/skia/include/core/SkPathRef.h index d497e7e08..0c5cc1aed 100644 --- a/gfx/skia/skia/include/core/SkPathRef.h +++ b/gfx/skia/skia/include/core/SkPathRef.h @@ -547,8 +547,6 @@ private: friend class PathRefTest_Private; friend class ForceIsRRect_Private; // unit test isRRect - friend class SkPath; - friend class SkPathPriv; }; #endif diff --git a/gfx/skia/skia/src/core/SkPath.cpp b/gfx/skia/skia/src/core/SkPath.cpp index db160d9b7..8f93c9c18 100644 --- a/gfx/skia/skia/src/core/SkPath.cpp +++ b/gfx/skia/skia/src/core/SkPath.cpp @@ -716,11 +716,9 @@ void SkPath::setConvexity(Convexity c) { fFirstDirection = SkPathPriv::kUnknown_FirstDirection; \ } while (0) -void SkPath::incReserve(int inc) { +void SkPath::incReserve(U16CPU inc) { SkDEBUGCODE(this->validate();) - if (inc > 0) { - SkPathRef::Editor(&fPathRef, inc, inc); - } + SkPathRef::Editor(&fPathRef, inc, inc); SkDEBUGCODE(this->validate();) } @@ -1693,13 +1691,6 @@ static void subdivide_cubic_to(SkPath* path, const SkPoint pts[4], } void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const { - if (matrix.isIdentity()) { - if (dst != nullptr && dst != this) { - *dst = *this; - } - return; - } - SkDEBUGCODE(this->validate();) if (dst == nullptr) { dst = (SkPath*)this; @@ -1747,20 +1738,13 @@ void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const { matrix.mapPoints(ed.points(), ed.pathRef()->countPoints()); dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection; } else { - Convexity convexity = Convexity(fConvexity); - SkPathRef::CreateTransformedCopy(&dst->fPathRef, *fPathRef.get(), matrix); if (this != dst) { dst->fFillType = fFillType; + dst->fConvexity = fConvexity; dst->fIsVolatile = fIsVolatile; } - - if (matrix.isScaleTranslate() && SkPathPriv::IsAxisAligned(*this)) { - dst->fConvexity = convexity; - } else { - dst->fConvexity = kUnknown_Convexity; - } if (SkPathPriv::kUnknown_FirstDirection == fFirstDirection) { dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection; @@ -1774,6 +1758,7 @@ void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const { } else if (det2x2 > 0) { dst->fFirstDirection = fFirstDirection.load(); } else { + dst->fConvexity = kUnknown_Convexity; dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection; } } diff --git a/gfx/skia/skia/src/core/SkPathPriv.h b/gfx/skia/skia/src/core/SkPathPriv.h index cfcdc4cac..029cb759d 100644 --- a/gfx/skia/skia/src/core/SkPathPriv.h +++ b/gfx/skia/skia/src/core/SkPathPriv.h @@ -121,11 +121,6 @@ public: static const SkScalar* ConicWeightData(const SkPath& path) { return path.fPathRef->conicWeights(); } - - static bool IsAxisAligned(const SkPath& path) { - SkRect tmp; - return (path.fPathRef->fIsRRect | path.fPathRef->fIsOval) || path.isRect(&tmp); - } }; #endif diff --git a/gfx/skia/skia/src/core/SkScan_Path.cpp b/gfx/skia/skia/src/core/SkScan_Path.cpp index 5e00e3abe..d15d2d54b 100644 --- a/gfx/skia/skia/src/core/SkScan_Path.cpp +++ b/gfx/skia/skia/src/core/SkScan_Path.cpp @@ -241,17 +241,9 @@ static bool update_edge(SkEdge* edge, int last_y) { return false; } -// Unexpected conditions for which we need to return
-#define ASSERT_RETURN(cond) \
- do { \
- if (!(cond)) { \
- SkASSERT(false); \
- return; \
- } \
- } while (0)
-
-// Needs Y to only change once (looser than convex in X)
-static void walk_simple_edges(SkEdge* prevHead, SkBlitter* blitter, int start_y, int stop_y) { +static void walk_convex_edges(SkEdge* prevHead, SkPath::FillType, + SkBlitter* blitter, int start_y, int stop_y, + PrePostProc proc) { validate_sort(prevHead->fNext); SkEdge* leftE = prevHead->fNext; @@ -266,28 +258,30 @@ static void walk_simple_edges(SkEdge* prevHead, SkBlitter* blitter, int start_y, // not lining up, so we take the max. int local_top = SkMax32(leftE->fFirstY, riteE->fFirstY); #endif - ASSERT_RETURN(local_top >= start_y); + SkASSERT(local_top >= start_y); - while (local_top < stop_y) { + for (;;) { SkASSERT(leftE->fFirstY <= stop_y); SkASSERT(riteE->fFirstY <= stop_y); + if (leftE->fX > riteE->fX || (leftE->fX == riteE->fX && + leftE->fDX > riteE->fDX)) { + SkTSwap(leftE, riteE); + } + int local_bot = SkMin32(leftE->fLastY, riteE->fLastY); local_bot = SkMin32(local_bot, stop_y - 1); - ASSERT_RETURN(local_top <= local_bot); + SkASSERT(local_top <= local_bot); SkFixed left = leftE->fX; SkFixed dLeft = leftE->fDX; SkFixed rite = riteE->fX; SkFixed dRite = riteE->fDX; int count = local_bot - local_top; - ASSERT_RETURN(count >= 0); + SkASSERT(count >= 0); if (0 == (dLeft | dRite)) { int L = SkFixedRoundToInt(left); int R = SkFixedRoundToInt(rite); - if (L > R) { - SkTSwap(L, R); - } if (L < R) { count += 1; blitter->blitRect(L, local_top, R - L, count); @@ -297,9 +291,6 @@ static void walk_simple_edges(SkEdge* prevHead, SkBlitter* blitter, int start_y, do { int L = SkFixedRoundToInt(left); int R = SkFixedRoundToInt(rite); - if (L > R) { - SkTSwap(L, R); - } if (L < R) { blitter->blitH(L, local_top, R - L); } @@ -312,21 +303,28 @@ static void walk_simple_edges(SkEdge* prevHead, SkBlitter* blitter, int start_y, leftE->fX = left; riteE->fX = rite; - if (!update_edge(leftE, local_bot)) { + if (update_edge(leftE, local_bot)) { if (currE->fFirstY >= stop_y) { - return; // we're done + break; } leftE = currE; currE = currE->fNext; - ASSERT_RETURN(leftE->fFirstY == local_top); } - if (!update_edge(riteE, local_bot)) { + if (update_edge(riteE, local_bot)) { if (currE->fFirstY >= stop_y) { - return; // we're done + break; } riteE = currE; currE = currE->fNext; - ASSERT_RETURN(riteE->fFirstY == local_top); + } + + SkASSERT(leftE); + SkASSERT(riteE); + + // check our bottom clip + SkASSERT(local_top == local_bot + 1); + if (local_top >= stop_y) { + break; } } } @@ -502,9 +500,9 @@ void sk_fill_path(const SkPath& path, const SkIRect* clipRect, SkBlitter* blitte proc = PrePostInverseBlitterProc; } - // count >= 2 is required as the convex walker does not handle missing right edges - if (path.isConvex() && (nullptr == proc) && count >= 2) { - walk_simple_edges(&headEdge, blitter, start_y, stop_y); + if (path.isConvex() && (nullptr == proc)) { + SkASSERT(count >= 2); // convex walker does not handle missing right edges + walk_convex_edges(&headEdge, path.getFillType(), blitter, start_y, stop_y, nullptr); } else { int rightEdge; if (clipRect) { @@ -768,7 +766,8 @@ static void sk_fill_triangle(const SkPoint pts[], const SkIRect* clipRect, if (clipRect && start_y < clipRect->fTop) { start_y = clipRect->fTop; } - walk_simple_edges(&headEdge, blitter, start_y, stop_y); + walk_convex_edges(&headEdge, SkPath::kEvenOdd_FillType, blitter, start_y, stop_y, nullptr); +// walk_edges(&headEdge, SkPath::kEvenOdd_FillType, blitter, start_y, stop_y, nullptr); } void SkScan::FillTriangle(const SkPoint pts[], const SkRasterClip& clip, |