Index: src/core/SkRecordDraw.cpp |
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp |
index b66c721aee2346129e01a7b53ec504ede6543949..76c0ae378ae426bf1a5e9e224ff8f9477b8130ef 100644 |
--- a/src/core/SkRecordDraw.cpp |
+++ b/src/core/SkRecordDraw.cpp |
@@ -248,7 +248,18 @@ private: |
Bounds clip = SkRect::Make(devBounds); |
// We don't call adjustAndMap() because as its last step it would intersect the adjusted |
// clip bounds with the previous clip, exactly what we can't do when the clip grows. |
- fCurrentClipBounds = this->adjustForSaveLayerPaints(&clip) ? clip : fCullRect; |
+ bool isBoundedClip = this->adjustForSaveLayerPaints(&clip); |
+ if (isBoundedClip) { |
mtklein
2015/03/06 18:18:50
Let's definitely create a little method for the as
|
+ bool intersects = clip.intersect(fCullRect); |
+ if (intersects) |
+ fCurrentClipBounds = clip; |
+ else |
+ fCurrentClipBounds = Bounds::MakeEmpty(); |
+ } else { |
+ fCurrentClipBounds = fCullRect; |
+ } |
+ SkASSERT((fCurrentClipBounds.isEmpty() || fCullRect.contains(fCurrentClipBounds)) |
+ || (fCurrentClipBounds.isEmpty() && fCullRect.isEmpty())); |
} |
// Restore holds the devBounds for the clip after the {save,saveLayer}/restore block completes. |
@@ -259,8 +270,18 @@ private: |
// so they are not affected by the saveLayer's paint. |
const int kSavesToIgnore = 1; |
Bounds clip = SkRect::Make(op.devBounds); |
- fCurrentClipBounds = |
- this->adjustForSaveLayerPaints(&clip, kSavesToIgnore) ? clip : fCullRect; |
+ bool isBoundedClip = this->adjustForSaveLayerPaints(&clip, kSavesToIgnore); |
+ if (isBoundedClip) { |
+ bool intersects = clip.intersect(fCullRect); |
+ if (intersects) |
+ fCurrentClipBounds = clip; |
+ else |
+ fCurrentClipBounds = Bounds::MakeEmpty(); |
+ } else { |
+ fCurrentClipBounds = fCullRect; |
+ } |
+ SkASSERT((fCurrentClipBounds.isEmpty() || fCullRect.contains(fCurrentClipBounds)) |
+ || (fCurrentClipBounds.isEmpty() && fCullRect.isEmpty())); |
} |
// We also take advantage of SaveLayer bounds when present to further cut the clip down. |
@@ -268,6 +289,8 @@ private: |
if (op.bounds) { |
// adjustAndMap() intersects these layer bounds with the previous clip for us. |
fCurrentClipBounds = this->adjustAndMap(*op.bounds, op.paint); |
+ SkASSERT((fCurrentClipBounds.isEmpty() || fCullRect.contains(fCurrentClipBounds)) |
+ || (fCurrentClipBounds.isEmpty() && fCullRect.isEmpty())); |
} |
} |
@@ -275,7 +298,11 @@ private: |
// from the bounds of the ops in the same Save block. |
void trackBounds(const Save&) { this->pushSaveBlock(NULL); } |
void trackBounds(const SaveLayer& op) { this->pushSaveBlock(op.paint); } |
- void trackBounds(const Restore&) { fBounds[fCurrentOp] = this->popSaveBlock(); } |
+ void trackBounds(const Restore&) { |
+ fBounds[fCurrentOp] = this->popSaveBlock(); |
+ SkASSERT((fBounds[fCurrentOp].isEmpty() || fCullRect.contains(fBounds[fCurrentOp])) |
+ || (fBounds[fCurrentOp].isEmpty() && fCullRect.isEmpty())); |
+ } |
void trackBounds(const SetMatrix&) { this->pushControl(); } |
void trackBounds(const ClipRect&) { this->pushControl(); } |
@@ -289,6 +316,8 @@ private: |
// For all other ops, we can calculate and store the bounds directly now. |
template <typename T> void trackBounds(const T& op) { |
fBounds[fCurrentOp] = this->bounds(op); |
+ SkASSERT((fBounds[fCurrentOp].isEmpty() || fCullRect.contains(fBounds[fCurrentOp])) |
+ || (fBounds[fCurrentOp].isEmpty() && fCullRect.isEmpty())); |
this->updateSaveBounds(fBounds[fCurrentOp]); |
} |
@@ -370,6 +399,8 @@ private: |
} |
void popControl(const Bounds& bounds) { |
+ SkASSERT((bounds.isEmpty() || fCullRect.contains(bounds)) |
+ || (bounds.isEmpty() && fCullRect.isEmpty())); |
fBounds[fControlIndices.top()] = bounds; |
fControlIndices.pop(); |
} |