diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-03 16:43:54 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-03 16:43:54 +0000 |
commit | 466310dbd3073add2ec934e336c30deaaf702eae (patch) | |
tree | c29d296dcf5a52098fe9410035fffab445fedbf2 /src/core/SkPath.cpp | |
parent | 8272d87d3098c8e43feae5bd7bb2b4a7ab8f3337 (diff) |
Move fIsOval from SkPath to SkPathRef
https://codereview.chromium.org/89123002/
git-svn-id: http://skia.googlecode.com/svn/trunk@12463 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkPath.cpp')
-rw-r--r-- | src/core/SkPath.cpp | 58 |
1 files changed, 12 insertions, 46 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp index d25ec3c1df..571452a7d9 100644 --- a/src/core/SkPath.cpp +++ b/src/core/SkPath.cpp @@ -42,22 +42,6 @@ static bool is_degenerate(const SkPath& path) { return SkPath::kDone_Verb == iter.next(pts); } -class SkAutoDisableOvalCheck { -public: - SkAutoDisableOvalCheck(SkPath* path) : fPath(path) { - fSaved = fPath->fIsOval; - } - - ~SkAutoDisableOvalCheck() { - fPath->fIsOval = fSaved; - } - -private: - SkPath* fPath; - bool fSaved; -}; -#define SkAutoDisableOvalCheck(...) SK_REQUIRE_LOCAL_VAR(SkAutoDisableOvalCheck) - class SkAutoDisableDirectionCheck { public: SkAutoDisableDirectionCheck(SkPath* path) : fPath(path) { @@ -84,7 +68,7 @@ private: It also notes if the path was originally degenerate, and if so, sets isConvex to true. Thus it can only be used if the contour being added is - convex (which is always true since we only allow the addition of rects). + convex. */ class SkAutoPathBoundsUpdate { public: @@ -164,7 +148,6 @@ void SkPath::resetFields() { fSegmentMask = 0; fConvexity = kUnknown_Convexity; fDirection = kUnknown_Direction; - fIsOval = false; // 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. @@ -204,7 +187,6 @@ void SkPath::copyFields(const SkPath& that) { fSegmentMask = that.fSegmentMask; fConvexity = that.fConvexity; fDirection = that.fDirection; - fIsOval = that.fIsOval; } bool operator==(const SkPath& a, const SkPath& b) { @@ -230,7 +212,6 @@ void SkPath::swap(SkPath& that) { SkTSwap<uint8_t>(fSegmentMask, that.fSegmentMask); SkTSwap<uint8_t>(fConvexity, that.fConvexity); SkTSwap<uint8_t>(fDirection, that.fDirection); - SkTSwap<SkBool8>(fIsOval, that.fIsOval); #ifdef SK_BUILD_FOR_ANDROID SkTSwap<const SkPath*>(fSourcePath, that.fSourcePath); #endif @@ -631,7 +612,6 @@ void SkPath::setLastPt(SkScalar x, SkScalar y) { if (count == 0) { this->moveTo(x, y); } else { - fIsOval = false; SkPathRef::Editor ed(&fPathRef); ed.atPoint(count-1)->set(x, y); } @@ -650,7 +630,6 @@ void SkPath::setConvexity(Convexity c) { do { \ fConvexity = kUnknown_Convexity; \ fDirection = kUnknown_Direction; \ - fIsOval = false; \ } while (0) void SkPath::incReserve(U16CPU inc) { @@ -1263,14 +1242,13 @@ void SkPath::addOval(const SkRect& oval, Direction dir) { We can't simply check isEmpty() in this case, as additional moveTo() would mark the path non empty. */ - fIsOval = hasOnlyMoveTos(); - if (fIsOval) { + bool isOval = hasOnlyMoveTos(); + if (isOval) { fDirection = dir; } else { fDirection = kUnknown_Direction; } - SkAutoDisableOvalCheck adoc(this); SkAutoDisableDirectionCheck addc(this); SkAutoPathBoundsUpdate apbu(this, oval); @@ -1318,14 +1296,10 @@ void SkPath::addOval(const SkRect& oval, Direction dir) { this->quadTo( R, cy - sy, R, cy ); } this->close(); -} -bool SkPath::isOval(SkRect* rect) const { - if (fIsOval && rect) { - *rect = getBounds(); - } + SkPathRef::Editor ed(&fPathRef); - return fIsOval; + ed.setIsOval(isOval); } void SkPath::addCircle(SkScalar x, SkScalar y, SkScalar r, Direction dir) { @@ -1459,8 +1433,6 @@ void SkPath::addPath(const SkPath& path, SkScalar dx, SkScalar dy) { void SkPath::addPath(const SkPath& path, const SkMatrix& matrix) { SkPathRef::Editor(&fPathRef, path.countVerbs(), path.countPoints()); - fIsOval = false; - RawIter iter(path); SkPoint pts[4]; Verb verb; @@ -1525,8 +1497,6 @@ void SkPath::reversePathTo(const SkPath& path) { SkPathRef::Editor(&fPathRef, vcount, path.countPoints()); - fIsOval = false; - const uint8_t* verbs = path.fPathRef->verbs(); const SkPoint* pts = path.fPathRef->points(); const SkScalar* conicWeights = path.fPathRef->conicWeights(); @@ -1574,8 +1544,6 @@ void SkPath::reverseAddPath(const SkPath& src) { const uint8_t* verbsEnd = src.fPathRef->verbs(); // points just past the first verb const SkScalar* conicWeights = src.fPathRef->conicWeightsEnd(); - fIsOval = false; - bool needMove = true; bool needClose = false; while (verbs < verbsEnd) { @@ -1725,9 +1693,6 @@ void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const { } } - // It's an oval only if it stays a rect. - dst->fIsOval = fIsOval && matrix.rectStaysRect(); - SkDEBUGCODE(dst->validate();) } } @@ -2080,14 +2045,16 @@ size_t SkPath::writeToMemory(void* storage) const { SkWBuffer buffer(storage); - int32_t packed = ((fIsOval & 1) << kIsOval_SerializationShift) | - (fConvexity << kConvexity_SerializationShift) | + int32_t packed = (fConvexity << kConvexity_SerializationShift) | (fFillType << kFillType_SerializationShift) | (fSegmentMask << kSegmentMask_SerializationShift) | (fDirection << kDirection_SerializationShift) #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO | (0x1 << kNewFormat_SerializationShift) #endif +#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V16_AND_ALL_OTHER_INSTANCES_TOO + | (0x1 << kNewFormat2_SerializationShift) +#endif ; buffer.write32(packed); @@ -2106,17 +2073,16 @@ size_t SkPath::readFromMemory(const void* storage, size_t length) { return 0; } - fIsOval = (packed >> kIsOval_SerializationShift) & 1; fConvexity = (packed >> kConvexity_SerializationShift) & 0xFF; fFillType = (packed >> kFillType_SerializationShift) & 0xFF; fSegmentMask = (packed >> kSegmentMask_SerializationShift) & 0xF; fDirection = (packed >> kDirection_SerializationShift) & 0x3; -#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO - bool newFormat = (packed >> kNewFormat_SerializationShift) & 1; +#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V16_AND_ALL_OTHER_INSTANCES_TOO + bool newFormat = (packed >> kNewFormat2_SerializationShift) & 1; #endif SkPathRef* pathRef = SkPathRef::CreateFromBuffer(&buffer -#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO +#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V16_AND_ALL_OTHER_INSTANCES_TOO , newFormat, packed #endif ); |