Chromium Code Reviews| Index: src/core/SkPath.cpp |
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp |
| index c9bcb8fce287539750c62bfa97a6ef496a2709b2..defedd2e5db4026a38f33e38e18310aabfd7da9d 100644 |
| --- a/src/core/SkPath.cpp |
| +++ b/src/core/SkPath.cpp |
| @@ -9,7 +9,7 @@ |
| #include "SkErrorInternals.h" |
| #include "SkGeometry.h" |
| #include "SkMath.h" |
| -#include "SkPath.h" |
| +#include "SkPathPriv.h" |
| #include "SkPathRef.h" |
| #include "SkRRect.h" |
| #include "SkThread.h" |
| @@ -37,16 +37,16 @@ static bool is_degenerate(const SkPath& path) { |
| class SkAutoDisableDirectionCheck { |
| public: |
| SkAutoDisableDirectionCheck(SkPath* path) : fPath(path) { |
| - fSaved = static_cast<SkPath::Direction>(fPath->fDirection); |
| + fSaved = static_cast<SkPathPriv::FirstDirection>(fPath->fFirstDirection); |
| } |
| ~SkAutoDisableDirectionCheck() { |
| - fPath->fDirection = fSaved; |
| + fPath->fFirstDirection = fSaved; |
| } |
| private: |
| - SkPath* fPath; |
| - SkPath::Direction fSaved; |
| + SkPath* fPath; |
| + SkPathPriv::FirstDirection fSaved; |
| }; |
| #define SkAutoDisableDirectionCheck(...) SK_REQUIRE_LOCAL_VAR(SkAutoDisableDirectionCheck) |
| @@ -135,7 +135,7 @@ void SkPath::resetFields() { |
| fLastMoveToIndex = INITIAL_LASTMOVETOINDEX_VALUE; |
| fFillType = kWinding_FillType; |
| fConvexity = kUnknown_Convexity; |
| - fDirection = kUnknown_Direction; |
| + fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| // We don't touch Android's fSourcePath. It's used to track texture garbage collection, so we |
| // don't want to muck with it if it's been set to something non-NULL. |
| @@ -167,7 +167,7 @@ void SkPath::copyFields(const SkPath& that) { |
| fLastMoveToIndex = that.fLastMoveToIndex; |
| fFillType = that.fFillType; |
| fConvexity = that.fConvexity; |
| - fDirection = that.fDirection; |
| + fFirstDirection = that.fFirstDirection; |
| fIsVolatile = that.fIsVolatile; |
| } |
| @@ -184,7 +184,7 @@ void SkPath::swap(SkPath& that) { |
| SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex); |
| SkTSwap<uint8_t>(fFillType, that.fFillType); |
| SkTSwap<uint8_t>(fConvexity, that.fConvexity); |
| - SkTSwap<uint8_t>(fDirection, that.fDirection); |
| + SkTSwap<uint8_t>(fFirstDirection, that.fFirstDirection); |
| SkTSwap<SkBool8>(fIsVolatile, that.fIsVolatile); |
| } |
| } |
| @@ -192,10 +192,10 @@ void SkPath::swap(SkPath& that) { |
| static inline bool check_edge_against_rect(const SkPoint& p0, |
| const SkPoint& p1, |
| const SkRect& rect, |
| - SkPath::Direction dir) { |
| + SkPathPriv::FirstDirection dir) { |
| const SkPoint* edgeBegin; |
| SkVector v; |
| - if (SkPath::kCW_Direction == dir) { |
| + if (SkPathPriv::kCW_FirstDirection == dir) { |
| v = p1 - p0; |
| edgeBegin = &p0; |
| } else { |
| @@ -221,8 +221,8 @@ bool SkPath::conservativelyContainsRect(const SkRect& rect) const { |
| return false; |
| } |
| - Direction direction; |
| - if (!this->cheapComputeDirection(&direction)) { |
| + SkPathPriv::FirstDirection direction; |
| + if (!SkPathPriv::CheapComputeFirstDirection(*this, &direction)) { |
| return false; |
| } |
| @@ -662,10 +662,10 @@ void SkPath::setConvexity(Convexity c) { |
| ////////////////////////////////////////////////////////////////////////////// |
| // Construction methods |
| -#define DIRTY_AFTER_EDIT \ |
| - do { \ |
| - fConvexity = kUnknown_Convexity; \ |
| - fDirection = kUnknown_Direction; \ |
| +#define DIRTY_AFTER_EDIT \ |
| + do { \ |
| + fConvexity = kUnknown_Convexity; \ |
| + fFirstDirection = SkPathPriv::kUnknown_FirstDirection; \ |
| } while (0) |
| void SkPath::incReserve(U16CPU inc) { |
| @@ -848,7 +848,8 @@ void SkPath::addRect(const SkRect& rect, Direction dir) { |
| void SkPath::addRect(SkScalar left, SkScalar top, SkScalar right, |
| SkScalar bottom, Direction dir) { |
| assert_known_direction(dir); |
| - fDirection = this->hasOnlyMoveTos() ? dir : kUnknown_Direction; |
| + fFirstDirection = this->hasOnlyMoveTos() ? |
| + (SkPathPriv::FirstDirection)dir : SkPathPriv::kUnknown_FirstDirection; |
| SkAutoDisableDirectionCheck addc(this); |
| SkAutoPathBoundsUpdate apbu(this, left, top, right, bottom); |
| @@ -988,7 +989,8 @@ void SkPath::addRRect(const SkRRect& rrect, Direction dir) { |
| } else if (rrect.isOval()) { |
| this->addOval(bounds, dir); |
| } else { |
| - fDirection = this->hasOnlyMoveTos() ? dir : kUnknown_Direction; |
| + fFirstDirection = this->hasOnlyMoveTos() ? |
| + (SkPathPriv::FirstDirection)dir : SkPathPriv::kUnknown_FirstDirection; |
| SkAutoPathBoundsUpdate apbu(this, bounds); |
| SkAutoDisableDirectionCheck addc(this); |
| @@ -1077,9 +1079,9 @@ void SkPath::addOval(const SkRect& oval, Direction dir) { |
| */ |
| bool isOval = hasOnlyMoveTos(); |
| if (isOval) { |
| - fDirection = dir; |
| + fFirstDirection = (SkPathPriv::FirstDirection)dir; |
| } else { |
| - fDirection = kUnknown_Direction; |
| + fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| } |
| SkAutoDisableDirectionCheck addc(this); |
| @@ -1477,7 +1479,7 @@ void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const { |
| dst->swap(tmp); |
| SkPathRef::Editor ed(&dst->fPathRef); |
| matrix.mapPoints(ed.points(), ed.pathRef()->countPoints()); |
| - dst->fDirection = kUnknown_Direction; |
| + dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| } else { |
| SkPathRef::CreateTransformedCopy(&dst->fPathRef, *fPathRef.get(), matrix); |
| @@ -1487,19 +1489,19 @@ void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const { |
| dst->fIsVolatile = fIsVolatile; |
| } |
| - if (kUnknown_Direction == fDirection) { |
| - dst->fDirection = kUnknown_Direction; |
| + if (SkPathPriv::kUnknown_FirstDirection == fFirstDirection) { |
| + dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| } else { |
| SkScalar det2x2 = |
| SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix::kMScaleY)) - |
| SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix::kMSkewY)); |
| if (det2x2 < 0) { |
| - dst->fDirection = SkPath::OppositeDirection(static_cast<Direction>(fDirection)); |
| + dst->fFirstDirection = SkPathPriv::OppositeFirstDirection((SkPathPriv::FirstDirection)fFirstDirection); |
| } else if (det2x2 > 0) { |
| - dst->fDirection = fDirection; |
| + dst->fFirstDirection = fFirstDirection; |
| } else { |
| dst->fConvexity = kUnknown_Convexity; |
| - dst->fDirection = kUnknown_Direction; |
| + dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| } |
| } |
| @@ -1858,7 +1860,7 @@ size_t SkPath::writeToMemory(void* storage) const { |
| int32_t packed = (fConvexity << kConvexity_SerializationShift) | |
| (fFillType << kFillType_SerializationShift) | |
| - (fDirection << kDirection_SerializationShift) | |
| + (fFirstDirection << kDirection_SerializationShift) | |
| (fIsVolatile << kIsVolatile_SerializationShift); |
| buffer.write32(packed); |
| @@ -1879,7 +1881,7 @@ size_t SkPath::readFromMemory(const void* storage, size_t length) { |
| fConvexity = (packed >> kConvexity_SerializationShift) & 0xFF; |
| fFillType = (packed >> kFillType_SerializationShift) & 0xFF; |
| - fDirection = (packed >> kDirection_SerializationShift) & 0x3; |
| + fFirstDirection = (packed >> kDirection_SerializationShift) & 0x3; |
| fIsVolatile = (packed >> kIsVolatile_SerializationShift) & 0x1; |
| SkPathRef* pathRef = SkPathRef::CreateFromBuffer(&buffer); |
| @@ -2061,7 +2063,7 @@ struct Convexicator { |
| Convexicator() |
| : fPtCount(0) |
| , fConvexity(SkPath::kConvex_Convexity) |
| - , fDirection(SkPath::kUnknown_Direction) |
| + , fFirstDirection(SkPathPriv::kUnknown_FirstDirection) |
| , fIsFinite(true) |
| , fIsCurve(false) { |
| fExpectedDir = kInvalid_DirChange; |
| @@ -2078,7 +2080,7 @@ struct Convexicator { |
| SkPath::Convexity getConvexity() const { return fConvexity; } |
| /** The direction returned is only valid if the path is determined convex */ |
| - SkPath::Direction getDirection() const { return fDirection; } |
| + SkPathPriv::FirstDirection getFirstDirection() const { return fFirstDirection; } |
| void addPt(const SkPoint& pt) { |
| if (SkPath::kConcave_Convexity == fConvexity || !fIsFinite) { |
| @@ -2179,11 +2181,11 @@ private: |
| case kRight_DirChange: |
| if (kInvalid_DirChange == fExpectedDir) { |
| fExpectedDir = dir; |
| - fDirection = (kRight_DirChange == dir) ? SkPath::kCW_Direction |
| - : SkPath::kCCW_Direction; |
| + fFirstDirection = (kRight_DirChange == dir) ? SkPathPriv::kCW_FirstDirection |
| + : SkPathPriv::kCCW_FirstDirection; |
| } else if (dir != fExpectedDir) { |
| fConvexity = SkPath::kConcave_Convexity; |
| - fDirection = SkPath::kUnknown_Direction; |
| + fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| } |
| fLastVec = vec; |
| break; |
| @@ -2192,7 +2194,7 @@ private: |
| case kBackwards_DirChange: |
| if (fIsCurve) { |
| fConvexity = SkPath::kConcave_Convexity; |
| - fDirection = SkPath::kUnknown_Direction; |
| + fFirstDirection = SkPathPriv::kUnknown_FirstDirection; |
| } |
| fLastVec = vec; |
| break; |
| @@ -2211,7 +2213,7 @@ private: |
| int fPtCount; // non-degenerate points |
| DirChange fExpectedDir; |
| SkPath::Convexity fConvexity; |
| - SkPath::Direction fDirection; |
| + SkPathPriv::FirstDirection fFirstDirection; |
| int fDx, fDy, fSx, fSy; |
| bool fIsFinite; |
| bool fIsCurve; |
| @@ -2277,8 +2279,8 @@ SkPath::Convexity SkPath::internalGetConvexity() const { |
| } |
| } |
| fConvexity = state.getConvexity(); |
| - if (kConvex_Convexity == fConvexity && kUnknown_Direction == fDirection) { |
| - fDirection = state.getDirection(); |
| + if (kConvex_Convexity == fConvexity && SkPathPriv::kUnknown_FirstDirection == fFirstDirection) { |
| + fFirstDirection = state.getFirstDirection(); |
| } |
| return static_cast<Convexity>(fConvexity); |
| } |
| @@ -2439,8 +2441,8 @@ static int find_min_max_x_at_y(const SkPoint pts[], int index, int n, |
| return minIndex; |
| } |
|
robertphillips
2015/06/15 15:22:35
cross_to_dir ?
|
| -static void crossToDir(SkScalar cross, SkPath::Direction* dir) { |
| - *dir = cross > 0 ? SkPath::kCW_Direction : SkPath::kCCW_Direction; |
| +static void crossToDir(SkScalar cross, SkPathPriv::FirstDirection* dir) { |
| + *dir = cross > 0 ? SkPathPriv::kCW_FirstDirection : SkPathPriv::kCCW_FirstDirection; |
| } |
| /* |
| @@ -2451,24 +2453,24 @@ static void crossToDir(SkScalar cross, SkPath::Direction* dir) { |
| * that is outer most (or at least has the global y-max) before we can consider |
| * its cross product. |
| */ |
| -bool SkPath::cheapComputeDirection(Direction* dir) const { |
| - if (kUnknown_Direction != fDirection) { |
| - *dir = static_cast<Direction>(fDirection); |
| +bool SkPathPriv::CheapComputeFirstDirection(const SkPath& path, FirstDirection* dir) { |
| + if (kUnknown_FirstDirection != path.fFirstDirection) { |
| + *dir = static_cast<FirstDirection>(path.fFirstDirection); |
| return true; |
| } |
| // don't want to pay the cost for computing this if it |
| // is unknown, so we don't call isConvex() |
| - if (kConvex_Convexity == this->getConvexityOrUnknown()) { |
| - SkASSERT(kUnknown_Direction == fDirection); |
| - *dir = static_cast<Direction>(fDirection); |
| + if (SkPath::kConvex_Convexity == path.getConvexityOrUnknown()) { |
| + SkASSERT(kUnknown_FirstDirection == path.fFirstDirection); |
| + *dir = static_cast<FirstDirection>(path.fFirstDirection); |
| return false; |
| } |
| - ContourIter iter(*fPathRef.get()); |
| + ContourIter iter(*path.fPathRef.get()); |
| // initialize with our logical y-min |
| - SkScalar ymax = this->getBounds().fTop; |
| + SkScalar ymax = path.getBounds().fTop; |
| SkScalar ymaxCross = 0; |
| for (; !iter.done(); iter.next()) { |
| @@ -2534,7 +2536,7 @@ bool SkPath::cheapComputeDirection(Direction* dir) const { |
| } |
| if (ymaxCross) { |
| crossToDir(ymaxCross, dir); |
| - fDirection = *dir; |
| + path.fFirstDirection = *dir; |
| return true; |
| } else { |
| return false; |