aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkCanvas.h8
-rw-r--r--src/core/SkCanvas.cpp24
2 files changed, 25 insertions, 7 deletions
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index aa400d6ad4..058979d0f7 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -429,13 +429,7 @@ public:
@return true if the horizontal band is completely clipped out (i.e. does
not intersect the current clip)
*/
- bool quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const {
- SkASSERT(SkScalarToCompareType(top) >= SkScalarToCompareType(bottom));
-
- const SkRectCompareType& clipR = this->getLocalClipBoundsCompareType(et);
- return SkScalarToCompareType(top) >= clipR.fBottom ||
- SkScalarToCompareType(bottom) <= clipR.fTop;
- }
+ bool quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const;
/** Return the bounds of the current clip (in local coordinates) in the
bounds parameter, and return true if it is non-empty. This can be useful
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 984549aea7..6e061c2005 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1184,6 +1184,30 @@ bool SkCanvas::quickReject(const SkPath& path, EdgeType et) const {
return path.isEmpty() || this->quickReject(path.getBounds(), et);
}
+bool SkCanvas::quickRejectY(SkScalar top, SkScalar bottom, EdgeType et) const {
+ /* current impl ignores edgetype, and relies on
+ getLocalClipBoundsCompareType(), which always returns a value assuming
+ antialiasing (worst case)
+ */
+
+ if (fMCRec->fRasterClip->isEmpty()) {
+ return true;
+ }
+
+ SkScalarCompareType userT = SkScalarToCompareType(top);
+ SkScalarCompareType userB = SkScalarToCompareType(bottom);
+
+ // check for invalid user Y coordinates (i.e. empty)
+ // reed: why do we need to do this check, since it slows us down?
+ if (userT >= userB) {
+ return true;
+ }
+
+ // check if we are above or below the local clip bounds
+ const SkRectCompareType& clipR = this->getLocalClipBoundsCompareType();
+ return userT >= clipR.fBottom || userB <= clipR.fTop;
+}
+
static inline int pinIntForScalar(int x) {
#ifdef SK_SCALAR_IS_FIXED
if (x < SK_MinS16) {