| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkAtomics.h" | 8 #include "SkAtomics.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkClipStack.h" | 10 #include "SkClipStack.h" |
| (...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 return; | 614 return; |
| 615 } | 615 } |
| 616 | 616 |
| 617 *canvFiniteBound = element->fFiniteBound; | 617 *canvFiniteBound = element->fFiniteBound; |
| 618 *boundType = element->fFiniteBoundType; | 618 *boundType = element->fFiniteBoundType; |
| 619 if (isIntersectionOfRects) { | 619 if (isIntersectionOfRects) { |
| 620 *isIntersectionOfRects = element->fIsIntersectionOfRects; | 620 *isIntersectionOfRects = element->fIsIntersectionOfRects; |
| 621 } | 621 } |
| 622 } | 622 } |
| 623 | 623 |
| 624 bool SkClipStack::quickContains(const SkRect& rect) const { | 624 bool SkClipStack::internalQuickContains(const SkRect& rect) const { |
| 625 | 625 |
| 626 Iter iter(*this, Iter::kTop_IterStart); | 626 Iter iter(*this, Iter::kTop_IterStart); |
| 627 const Element* element = iter.prev(); | 627 const Element* element = iter.prev(); |
| 628 while (element != nullptr) { | 628 while (element != nullptr) { |
| 629 if (SkRegion::kIntersect_Op != element->getOp() && SkRegion::kReplace_Op
!= element->getOp()) | 629 if (SkRegion::kIntersect_Op != element->getOp() && SkRegion::kReplace_Op
!= element->getOp()) |
| 630 return false; | 630 return false; |
| 631 if (element->isInverseFilled()) { | 631 if (element->isInverseFilled()) { |
| 632 // Part of 'rect' could be trimmed off by the inverse-filled clip el
ement | 632 // Part of 'rect' could be trimmed off by the inverse-filled clip el
ement |
| 633 if (SkRect::Intersects(element->getBounds(), rect)) { | 633 if (SkRect::Intersects(element->getBounds(), rect)) { |
| 634 return false; | 634 return false; |
| 635 } | 635 } |
| 636 } else { | 636 } else { |
| 637 if (!element->contains(rect)) { | 637 if (!element->contains(rect)) { |
| 638 return false; | 638 return false; |
| 639 } | 639 } |
| 640 } | 640 } |
| 641 if (SkRegion::kReplace_Op == element->getOp()) { | 641 if (SkRegion::kReplace_Op == element->getOp()) { |
| 642 break; | 642 break; |
| 643 } | 643 } |
| 644 element = iter.prev(); | 644 element = iter.prev(); |
| 645 } | 645 } |
| 646 return true; | 646 return true; |
| 647 } | 647 } |
| 648 | 648 |
| 649 bool SkClipStack::quickContains(const SkRRect& rrect) const { | 649 bool SkClipStack::internalQuickContains(const SkRRect& rrect) const { |
| 650 | 650 |
| 651 Iter iter(*this, Iter::kTop_IterStart); | 651 Iter iter(*this, Iter::kTop_IterStart); |
| 652 const Element* element = iter.prev(); | 652 const Element* element = iter.prev(); |
| 653 while (element != nullptr) { | 653 while (element != nullptr) { |
| 654 if (SkRegion::kIntersect_Op != element->getOp() && SkRegion::kReplace_Op
!= element->getOp()) | 654 if (SkRegion::kIntersect_Op != element->getOp() && SkRegion::kReplace_Op
!= element->getOp()) |
| 655 return false; | 655 return false; |
| 656 if (element->isInverseFilled()) { | 656 if (element->isInverseFilled()) { |
| 657 // Part of 'rrect' could be trimmed off by the inverse-filled clip e
lement | 657 // Part of 'rrect' could be trimmed off by the inverse-filled clip e
lement |
| 658 if (SkRect::Intersects(element->getBounds(), rrect.getBounds())) { | 658 if (SkRect::Intersects(element->getBounds(), rrect.getBounds())) { |
| 659 return false; | 659 return false; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 Element* element = (Element*) fDeque.back(); | 764 Element* element = (Element*) fDeque.back(); |
| 765 | 765 |
| 766 if (element && element->canBeIntersectedInPlace(fSaveCount, SkRegion::kInter
sect_Op)) { | 766 if (element && element->canBeIntersectedInPlace(fSaveCount, SkRegion::kInter
sect_Op)) { |
| 767 element->setEmpty(); | 767 element->setEmpty(); |
| 768 } | 768 } |
| 769 new (fDeque.push_back()) Element(fSaveCount); | 769 new (fDeque.push_back()) Element(fSaveCount); |
| 770 | 770 |
| 771 ((Element*)fDeque.back())->fGenID = kEmptyGenID; | 771 ((Element*)fDeque.back())->fGenID = kEmptyGenID; |
| 772 } | 772 } |
| 773 | 773 |
| 774 bool SkClipStack::isWideOpen() const { | |
| 775 return this->getTopmostGenID() == kWideOpenGenID; | |
| 776 } | |
| 777 | |
| 778 /////////////////////////////////////////////////////////////////////////////// | 774 /////////////////////////////////////////////////////////////////////////////// |
| 779 | 775 |
| 780 SkClipStack::Iter::Iter() : fStack(nullptr) { | 776 SkClipStack::Iter::Iter() : fStack(nullptr) { |
| 781 } | 777 } |
| 782 | 778 |
| 783 SkClipStack::Iter::Iter(const SkClipStack& stack, IterStart startLoc) | 779 SkClipStack::Iter::Iter(const SkClipStack& stack, IterStart startLoc) |
| 784 : fStack(&stack) { | 780 : fStack(&stack) { |
| 785 this->reset(stack, startLoc); | 781 this->reset(stack, startLoc); |
| 786 } | 782 } |
| 787 | 783 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 936 | 932 |
| 937 void SkClipStack::dump() const { | 933 void SkClipStack::dump() const { |
| 938 B2TIter iter(*this); | 934 B2TIter iter(*this); |
| 939 const Element* e; | 935 const Element* e; |
| 940 while ((e = iter.next())) { | 936 while ((e = iter.next())) { |
| 941 e->dump(); | 937 e->dump(); |
| 942 SkDebugf("\n"); | 938 SkDebugf("\n"); |
| 943 } | 939 } |
| 944 } | 940 } |
| 945 #endif | 941 #endif |
| OLD | NEW |