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) {