| Index: src/core/SkClipStack.cpp
|
| diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp
|
| index 2c0961ab83c8254654078782903364666e260209..9e3f7c6b308071c16397e1cd6ece7d2abefc9a64 100644
|
| --- a/src/core/SkClipStack.cpp
|
| +++ b/src/core/SkClipStack.cpp
|
| @@ -452,7 +452,6 @@ void SkClipStack::restoreTo(int saveCount) {
|
| if (element->fSaveCount <= saveCount) {
|
| break;
|
| }
|
| - this->purgeClip(element);
|
| element->~Element();
|
| fDeque.pop_back();
|
| }
|
| @@ -540,7 +539,6 @@ void SkClipStack::clipDevRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
|
| return;
|
| case Element::kRect_Type:
|
| if (element->rectRectIntersectAllowed(rect, doAA)) {
|
| - this->purgeClip(element);
|
| if (!element->fRect.intersect(rect)) {
|
| element->setEmpty();
|
| return;
|
| @@ -554,7 +552,6 @@ void SkClipStack::clipDevRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
|
| break;
|
| case Element::kPath_Type:
|
| if (!SkRect::Intersects(element->fPath.getBounds(), rect)) {
|
| - this->purgeClip(element);
|
| element->setEmpty();
|
| return;
|
| }
|
| @@ -567,10 +564,6 @@ void SkClipStack::clipDevRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
|
| }
|
| new (fDeque.push_back()) Element(fSaveCount, rect, op, doAA);
|
| ((Element*) fDeque.back())->updateBoundAndGenID(element);
|
| -
|
| - if (element && element->fSaveCount == fSaveCount) {
|
| - this->purgeClip(element);
|
| - }
|
| }
|
|
|
| void SkClipStack::clipDevPath(const SkPath& path, SkRegion::Op op, bool doAA) {
|
| @@ -589,14 +582,12 @@ void SkClipStack::clipDevPath(const SkPath& path, SkRegion::Op op, bool doAA) {
|
| return;
|
| case Element::kRect_Type:
|
| if (!SkRect::Intersects(element->fRect, pathBounds)) {
|
| - this->purgeClip(element);
|
| element->setEmpty();
|
| return;
|
| }
|
| break;
|
| case Element::kPath_Type:
|
| if (!SkRect::Intersects(element->fPath.getBounds(), pathBounds)) {
|
| - this->purgeClip(element);
|
| element->setEmpty();
|
| return;
|
| }
|
| @@ -609,10 +600,6 @@ void SkClipStack::clipDevPath(const SkPath& path, SkRegion::Op op, bool doAA) {
|
| }
|
| new (fDeque.push_back()) Element(fSaveCount, path, op, doAA);
|
| ((Element*) fDeque.back())->updateBoundAndGenID(element);
|
| -
|
| - if (element && element->fSaveCount == fSaveCount) {
|
| - this->purgeClip(element);
|
| - }
|
| }
|
|
|
| void SkClipStack::clipEmpty() {
|
| @@ -626,27 +613,17 @@ void SkClipStack::clipEmpty() {
|
| return;
|
| case Element::kRect_Type:
|
| case Element::kPath_Type:
|
| - this->purgeClip(element);
|
| element->setEmpty();
|
| return;
|
| }
|
| }
|
| new (fDeque.push_back()) Element(fSaveCount);
|
|
|
| - if (element && element->fSaveCount == fSaveCount) {
|
| - this->purgeClip(element);
|
| - }
|
| ((Element*)fDeque.back())->fGenID = kEmptyGenID;
|
| }
|
|
|
| bool SkClipStack::isWideOpen() const {
|
| - if (0 == fDeque.count()) {
|
| - return true;
|
| - }
|
| -
|
| - const Element* back = (const Element*) fDeque.back();
|
| - return kWideOpenGenID == back->fGenID ||
|
| - (kInsideOut_BoundsType == back->fFiniteBoundType && back->fFiniteBound.isEmpty());
|
| + return this->getTopmostGenID() == kWideOpenGenID;
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -740,45 +717,20 @@ void SkClipStack::getConservativeBounds(int offsetX,
|
| }
|
| }
|
|
|
| -void SkClipStack::addPurgeClipCallback(PFPurgeClipCB callback, void* data) const {
|
| - ClipCallbackData temp = { callback, data };
|
| - fCallbackData.append(1, &temp);
|
| -}
|
| -
|
| -void SkClipStack::removePurgeClipCallback(PFPurgeClipCB callback, void* data) const {
|
| - ClipCallbackData temp = { callback, data };
|
| - int index = fCallbackData.find(temp);
|
| - if (index >= 0) {
|
| - fCallbackData.removeShuffle(index);
|
| - }
|
| -}
|
| -
|
| -// The clip state represented by 'element' will never be used again. Purge it.
|
| -void SkClipStack::purgeClip(Element* element) {
|
| - SkASSERT(NULL != element);
|
| - if (element->fGenID >= 0 && element->fGenID < kFirstUnreservedGenID) {
|
| - return;
|
| - }
|
| -
|
| - for (int i = 0; i < fCallbackData.count(); ++i) {
|
| - (*fCallbackData[i].fCallback)(element->fGenID, fCallbackData[i].fData);
|
| - }
|
| -
|
| - // Invalidate element's gen ID so handlers can detect already handled records
|
| - element->fGenID = kInvalidGenID;
|
| -}
|
| -
|
| int32_t SkClipStack::GetNextGenID() {
|
| // TODO: handle overflow.
|
| return sk_atomic_inc(&gGenID);
|
| }
|
|
|
| int32_t SkClipStack::getTopmostGenID() const {
|
| -
|
| if (fDeque.empty()) {
|
| - return kInvalidGenID;
|
| + return kWideOpenGenID;
|
| }
|
|
|
| - Element* element = (Element*)fDeque.back();
|
| - return element->fGenID;
|
| + const Element* back = static_cast<const Element*>(fDeque.back());
|
| + if (kInsideOut_BoundsType == back->fFiniteBoundType && back->fFiniteBound.isEmpty()) {
|
| + return kWideOpenGenID;
|
| + }
|
| +
|
| + return back->getGenID();
|
| }
|
|
|