Index: src/core/SkClipStack.cpp |
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp |
index 7e67ddf2b40fe0fc2566bb1a2413f0f9b70fab29..b60a6c961d24977e6e3857df10585cda0b1bcf61 100644 |
--- a/src/core/SkClipStack.cpp |
+++ b/src/core/SkClipStack.cpp |
@@ -16,6 +16,31 @@ |
static const int32_t kFirstUnreservedGenID = 3; |
int32_t SkClipStack::gGenID = kFirstUnreservedGenID; |
+SkClipStack::Element::Element(const Element& that) { |
+ switch (that.getType()) { |
+ case kEmpty_Type: |
+ fPath.reset(); |
+ break; |
+ case kRect_Type: // Rect uses rrect |
+ case kRRect_Type: |
+ fPath.reset(); |
+ fRRect = that.fRRect; |
+ break; |
+ case kPath_Type: |
+ fPath.set(that.getPath()); |
+ break; |
+ } |
+ |
+ fSaveCount = that.fSaveCount; |
+ fOp = that.fOp; |
+ fType = that.fType; |
+ fDoAA = that.fDoAA; |
+ fFiniteBoundType = that.fFiniteBoundType; |
+ fFiniteBound = that.fFiniteBound; |
+ fIsIntersectionOfRects = that.fIsIntersectionOfRects; |
+ fGenID = that.fGenID; |
+} |
+ |
bool SkClipStack::Element::operator== (const Element& element) const { |
if (this == &element) { |
return true; |
@@ -28,7 +53,7 @@ bool SkClipStack::Element::operator== (const Element& element) const { |
} |
switch (fType) { |
case kPath_Type: |
- return fPath == element.fPath; |
+ return this->getPath() == element.getPath(); |
case kRRect_Type: |
return fRRect == element.fRRect; |
case kRect_Type: |
@@ -44,19 +69,19 @@ bool SkClipStack::Element::operator== (const Element& element) const { |
void SkClipStack::Element::invertShapeFillType() { |
switch (fType) { |
case kRect_Type: |
- fPath.reset(); |
- fPath.addRect(this->getRect()); |
- fPath.setFillType(SkPath::kInverseEvenOdd_FillType); |
+ fPath.init(); |
+ fPath.get()->addRect(this->getRect()); |
+ fPath.get()->setFillType(SkPath::kInverseEvenOdd_FillType); |
fType = kPath_Type; |
break; |
case kRRect_Type: |
- fPath.reset(); |
- fPath.addRRect(fRRect); |
- fPath.setFillType(SkPath::kInverseEvenOdd_FillType); |
+ fPath.init(); |
+ fPath.get()->addRRect(fRRect); |
+ fPath.get()->setFillType(SkPath::kInverseEvenOdd_FillType); |
fType = kPath_Type; |
break; |
case kPath_Type: |
- fPath.toggleInverseFillType(); |
+ fPath.get()->toggleInverseFillType(); |
break; |
case kEmpty_Type: |
// Should this set to an empty, inverse filled path? |
@@ -79,7 +104,7 @@ void SkClipStack::Element::initPath(int saveCount, const SkPath& path, SkRegion: |
return; |
} |
} |
- fPath = path; |
+ fPath.set(path); |
fType = kPath_Type; |
this->initCommon(saveCount, op, doAA); |
} |
@@ -98,7 +123,7 @@ void SkClipStack::Element::asPath(SkPath* path) const { |
path->addRRect(fRRect); |
break; |
case kPath_Type: |
- *path = fPath; |
+ *path = *fPath.get(); |
break; |
} |
} |
@@ -119,7 +144,7 @@ void SkClipStack::Element::checkEmpty() const { |
SkASSERT(kNormal_BoundsType == fFiniteBoundType); |
SkASSERT(!fIsIntersectionOfRects); |
SkASSERT(kEmptyGenID == fGenID); |
- SkASSERT(fPath.isEmpty()); |
+ SkASSERT(!fPath.isValid()); |
} |
bool SkClipStack::Element::canBeIntersectedInPlace(int saveCount, SkRegion::Op op) const { |
@@ -357,9 +382,9 @@ void SkClipStack::Element::updateBoundAndGenID(const Element* prior) { |
fFiniteBoundType = kNormal_BoundsType; |
break; |
case kPath_Type: |
- fFiniteBound = fPath.getBounds(); |
+ fFiniteBound = fPath.get()->getBounds(); |
- if (fPath.isInverseFillType()) { |
+ if (fPath.get()->isInverseFillType()) { |
fFiniteBoundType = kInsideOut_BoundsType; |
} else { |
fFiniteBoundType = kNormal_BoundsType; |