| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #ifndef SkClipStack_DEFINED | 8 #ifndef SkClipStack_DEFINED |
| 9 #define SkClipStack_DEFINED | 9 #define SkClipStack_DEFINED |
| 10 | 10 |
| 11 #include "SkDeque.h" | 11 #include "SkDeque.h" |
| 12 #include "SkPath.h" | 12 #include "SkPath.h" |
| 13 #include "SkRect.h" | 13 #include "SkRect.h" |
| 14 #include "SkRRect.h" | 14 #include "SkRRect.h" |
| 15 #include "SkRegion.h" | 15 #include "SkRegion.h" |
| 16 #include "SkTDArray.h" | 16 #include "SkTDArray.h" |
| 17 #include "SkTLazy.h" |
| 17 | 18 |
| 18 | 19 |
| 19 // Because a single save/restore state can have multiple clips, this class | 20 // Because a single save/restore state can have multiple clips, this class |
| 20 // stores the stack depth (fSaveCount) and clips (fDeque) separately. | 21 // stores the stack depth (fSaveCount) and clips (fDeque) separately. |
| 21 // Each clip in fDeque stores the stack state to which it belongs | 22 // Each clip in fDeque stores the stack state to which it belongs |
| 22 // (i.e., the fSaveCount in force when it was added). Restores are thus | 23 // (i.e., the fSaveCount in force when it was added). Restores are thus |
| 23 // implemented by removing clips from fDeque that have an fSaveCount larger | 24 // implemented by removing clips from fDeque that have an fSaveCount larger |
| 24 // then the freshly decremented count. | 25 // then the freshly decremented count. |
| 25 class SK_API SkClipStack { | 26 class SK_API SkClipStack { |
| 26 public: | 27 public: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 46 kRRect_Type, | 47 kRRect_Type, |
| 47 //!< This element combines a path with the current clip using a set
operation | 48 //!< This element combines a path with the current clip using a set
operation |
| 48 kPath_Type, | 49 kPath_Type, |
| 49 }; | 50 }; |
| 50 | 51 |
| 51 Element() { | 52 Element() { |
| 52 this->initCommon(0, SkRegion::kReplace_Op, false); | 53 this->initCommon(0, SkRegion::kReplace_Op, false); |
| 53 this->setEmpty(); | 54 this->setEmpty(); |
| 54 } | 55 } |
| 55 | 56 |
| 57 Element(const Element&); |
| 58 |
| 56 Element(const SkRect& rect, SkRegion::Op op, bool doAA) { | 59 Element(const SkRect& rect, SkRegion::Op op, bool doAA) { |
| 57 this->initRect(0, rect, op, doAA); | 60 this->initRect(0, rect, op, doAA); |
| 58 } | 61 } |
| 59 | 62 |
| 60 Element(const SkRRect& rrect, SkRegion::Op op, bool doAA) { | 63 Element(const SkRRect& rrect, SkRegion::Op op, bool doAA) { |
| 61 this->initRRect(0, rrect, op, doAA); | 64 this->initRRect(0, rrect, op, doAA); |
| 62 } | 65 } |
| 63 | 66 |
| 64 Element(const SkPath& path, SkRegion::Op op, bool doAA) { | 67 Element(const SkPath& path, SkRegion::Op op, bool doAA) { |
| 65 this->initPath(0, path, op, doAA); | 68 this->initPath(0, path, op, doAA); |
| 66 } | 69 } |
| 67 | 70 |
| 68 bool operator== (const Element& element) const; | 71 bool operator== (const Element& element) const; |
| 69 bool operator!= (const Element& element) const { return !(*this == eleme
nt); } | 72 bool operator!= (const Element& element) const { return !(*this == eleme
nt); } |
| 70 | 73 |
| 71 //!< Call to get the type of the clip element. | 74 //!< Call to get the type of the clip element. |
| 72 Type getType() const { return fType; } | 75 Type getType() const { return fType; } |
| 73 | 76 |
| 74 //!< Call if getType() is kPath to get the path. | 77 //!< Call if getType() is kPath to get the path. |
| 75 const SkPath& getPath() const { SkASSERT(kPath_Type == fType); return fP
ath; } | 78 const SkPath& getPath() const { SkASSERT(kPath_Type == fType); return *f
Path.get(); } |
| 76 | 79 |
| 77 //!< Call if getType() is kRRect to get the round-rect. | 80 //!< Call if getType() is kRRect to get the round-rect. |
| 78 const SkRRect& getRRect() const { SkASSERT(kRRect_Type == fType); return
fRRect; } | 81 const SkRRect& getRRect() const { SkASSERT(kRRect_Type == fType); return
fRRect; } |
| 79 | 82 |
| 80 //!< Call if getType() is kRect to get the rect. | 83 //!< Call if getType() is kRect to get the rect. |
| 81 const SkRect& getRect() const { | 84 const SkRect& getRect() const { |
| 82 SkASSERT(kRect_Type == fType && (fRRect.isRect() || fRRect.isEmpty()
)); | 85 SkASSERT(kRect_Type == fType && (fRRect.isRect() || fRRect.isEmpty()
)); |
| 83 return fRRect.getBounds(); | 86 return fRRect.getBounds(); |
| 84 } | 87 } |
| 85 | 88 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 110 * Gets the bounds of the clip element, either the rect or path bounds.
(Whether the shape | 113 * Gets the bounds of the clip element, either the rect or path bounds.
(Whether the shape |
| 111 * is inverse filled is not considered.) | 114 * is inverse filled is not considered.) |
| 112 */ | 115 */ |
| 113 const SkRect& getBounds() const { | 116 const SkRect& getBounds() const { |
| 114 static const SkRect kEmpty = { 0, 0, 0, 0 }; | 117 static const SkRect kEmpty = { 0, 0, 0, 0 }; |
| 115 switch (fType) { | 118 switch (fType) { |
| 116 case kRect_Type: // fallthrough | 119 case kRect_Type: // fallthrough |
| 117 case kRRect_Type: | 120 case kRRect_Type: |
| 118 return fRRect.getBounds(); | 121 return fRRect.getBounds(); |
| 119 case kPath_Type: | 122 case kPath_Type: |
| 120 return fPath.getBounds(); | 123 return fPath.get()->getBounds(); |
| 121 case kEmpty_Type: | 124 case kEmpty_Type: |
| 122 return kEmpty; | 125 return kEmpty; |
| 123 default: | 126 default: |
| 124 SkDEBUGFAIL("Unexpected type."); | 127 SkDEBUGFAIL("Unexpected type."); |
| 125 return kEmpty; | 128 return kEmpty; |
| 126 } | 129 } |
| 127 } | 130 } |
| 128 | 131 |
| 129 /** | 132 /** |
| 130 * Conservatively checks whether the clip shape contains the rect param.
(Whether the shape | 133 * Conservatively checks whether the clip shape contains the rect param.
(Whether the shape |
| 131 * is inverse filled is not considered.) | 134 * is inverse filled is not considered.) |
| 132 */ | 135 */ |
| 133 bool contains(const SkRect& rect) const { | 136 bool contains(const SkRect& rect) const { |
| 134 switch (fType) { | 137 switch (fType) { |
| 135 case kRect_Type: | 138 case kRect_Type: |
| 136 return this->getRect().contains(rect); | 139 return this->getRect().contains(rect); |
| 137 case kRRect_Type: | 140 case kRRect_Type: |
| 138 return fRRect.contains(rect); | 141 return fRRect.contains(rect); |
| 139 case kPath_Type: | 142 case kPath_Type: |
| 140 return fPath.conservativelyContainsRect(rect); | 143 return fPath.get()->conservativelyContainsRect(rect); |
| 141 case kEmpty_Type: | 144 case kEmpty_Type: |
| 142 return false; | 145 return false; |
| 143 default: | 146 default: |
| 144 SkDEBUGFAIL("Unexpected type."); | 147 SkDEBUGFAIL("Unexpected type."); |
| 145 return false; | 148 return false; |
| 146 } | 149 } |
| 147 } | 150 } |
| 148 | 151 |
| 149 /** | 152 /** |
| 150 * Is the clip shape inverse filled. | 153 * Is the clip shape inverse filled. |
| 151 */ | 154 */ |
| 152 bool isInverseFilled() const { | 155 bool isInverseFilled() const { |
| 153 return kPath_Type == fType && fPath.isInverseFillType(); | 156 return kPath_Type == fType && fPath.get()->isInverseFillType(); |
| 154 } | 157 } |
| 155 | 158 |
| 156 private: | 159 private: |
| 157 friend class SkClipStack; | 160 friend class SkClipStack; |
| 158 | 161 |
| 159 SkPath fPath; | 162 SkTLazy<SkPath> fPath; |
| 160 SkRRect fRRect; | 163 SkRRect fRRect; |
| 161 int fSaveCount; // save count of stack when this element was
added. | 164 int fSaveCount; // save count of stack when this element was
added. |
| 162 SkRegion::Op fOp; | 165 SkRegion::Op fOp; |
| 163 Type fType; | 166 Type fType; |
| 164 bool fDoAA; | 167 bool fDoAA; |
| 165 | 168 |
| 166 /* fFiniteBoundType and fFiniteBound are used to incrementally update th
e clip stack's | 169 /* fFiniteBoundType and fFiniteBound are used to incrementally update th
e clip stack's |
| 167 bound. When fFiniteBoundType is kNormal_BoundsType, fFiniteBound repr
esents the | 170 bound. When fFiniteBoundType is kNormal_BoundsType, fFiniteBound repr
esents the |
| 168 conservative bounding box of the pixels that aren't clipped (i.e., an
y pixels that can be | 171 conservative bounding box of the pixels that aren't clipped (i.e., an
y pixels that can be |
| 169 drawn to are inside the bound). When fFiniteBoundType is kInsideOut_B
oundsType (which | 172 drawn to are inside the bound). When fFiniteBoundType is kInsideOut_B
oundsType (which |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 */ | 442 */ |
| 440 void restoreTo(int saveCount); | 443 void restoreTo(int saveCount); |
| 441 | 444 |
| 442 /** | 445 /** |
| 443 * Return the next unique generation ID. | 446 * Return the next unique generation ID. |
| 444 */ | 447 */ |
| 445 static int32_t GetNextGenID(); | 448 static int32_t GetNextGenID(); |
| 446 }; | 449 }; |
| 447 | 450 |
| 448 #endif | 451 #endif |
| OLD | NEW |