| Index: src/core/SkRasterClip.cpp
|
| diff --git a/src/core/SkRasterClip.cpp b/src/core/SkRasterClip.cpp
|
| index f820c5a0a44154389b5cea7521eaef7b1b3aad42..dab91d8f4ce31434af80839208961509e5746761 100644
|
| --- a/src/core/SkRasterClip.cpp
|
| +++ b/src/core/SkRasterClip.cpp
|
| @@ -6,12 +6,18 @@
|
| */
|
|
|
| #include "SkRasterClip.h"
|
| -#include "SkPath.h"
|
| +
|
| +
|
| +SkRasterClip::SkRasterClip() {
|
| + fIsBW = true;
|
| + fIsEmpty = true;
|
| + fIsRect = false;
|
| + SkDEBUGCODE(this->validate();)
|
| +}
|
|
|
| SkRasterClip::SkRasterClip(const SkRasterClip& src) {
|
| AUTO_RASTERCLIP_VALIDATE(src);
|
|
|
| - fForceConservativeRects = src.fForceConservativeRects;
|
| fIsBW = src.fIsBW;
|
| if (fIsBW) {
|
| fBW = src.fBW;
|
| @@ -24,19 +30,10 @@
|
| SkDEBUGCODE(this->validate();)
|
| }
|
|
|
| -SkRasterClip::SkRasterClip(const SkIRect& bounds, bool forceConservativeRects) : fBW(bounds) {
|
| - fForceConservativeRects = forceConservativeRects;
|
| +SkRasterClip::SkRasterClip(const SkIRect& bounds) : fBW(bounds) {
|
| fIsBW = true;
|
| fIsEmpty = this->computeIsEmpty(); // bounds might be empty, so compute
|
| fIsRect = !fIsEmpty;
|
| - SkDEBUGCODE(this->validate();)
|
| -}
|
| -
|
| -SkRasterClip::SkRasterClip(bool forceConservativeRects) {
|
| - fForceConservativeRects = forceConservativeRects;
|
| - fIsBW = true;
|
| - fIsEmpty = true;
|
| - fIsRect = false;
|
| SkDEBUGCODE(this->validate();)
|
| }
|
|
|
| @@ -73,83 +70,8 @@
|
| return fIsRect;
|
| }
|
|
|
| -/////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -bool SkRasterClip::setConservativeRect(const SkRect& r, const SkIRect& clipR, bool isInverse) {
|
| - SkIRect ir;
|
| - r.roundOut(&ir);
|
| -
|
| - SkRegion::Op op;
|
| - if (isInverse) {
|
| - op = SkRegion::kDifference_Op;
|
| - } else {
|
| - op = SkRegion::kIntersect_Op;
|
| - }
|
| - fBW.setRect(clipR);
|
| - fBW.op(ir, op);
|
| - return this->updateCacheAndReturnNonEmpty();
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -enum MutateResult {
|
| - kDoNothing_MutateResult,
|
| - kReplaceClippedAgainstGlobalBounds_MutateResult,
|
| - kContinue_MutateResult,
|
| -};
|
| -
|
| -static MutateResult mutate_conservative_op(SkRegion::Op* op, bool inverseFilled) {
|
| - if (inverseFilled) {
|
| - switch (*op) {
|
| - case SkRegion::kIntersect_Op:
|
| - case SkRegion::kDifference_Op:
|
| - // These ops can only shrink the current clip. So leaving
|
| - // the clip unchanged conservatively respects the contract.
|
| - return kDoNothing_MutateResult;
|
| - case SkRegion::kUnion_Op:
|
| - case SkRegion::kReplace_Op:
|
| - case SkRegion::kReverseDifference_Op:
|
| - case SkRegion::kXOR_Op: {
|
| - // These ops can grow the current clip up to the extents of
|
| - // the input clip, which is inverse filled, so we just set
|
| - // the current clip to the device bounds.
|
| - *op = SkRegion::kReplace_Op;
|
| - return kReplaceClippedAgainstGlobalBounds_MutateResult;
|
| - }
|
| - }
|
| - } else {
|
| - // Not inverse filled
|
| - switch (*op) {
|
| - case SkRegion::kIntersect_Op:
|
| - case SkRegion::kUnion_Op:
|
| - case SkRegion::kReplace_Op:
|
| - return kContinue_MutateResult;
|
| - case SkRegion::kDifference_Op:
|
| - // Difference can only shrink the current clip.
|
| - // Leaving clip unchanged conservatively fullfills the contract.
|
| - return kDoNothing_MutateResult;
|
| - case SkRegion::kReverseDifference_Op:
|
| - // To reverse, we swap in the bounds with a replace op.
|
| - // As with difference, leave it unchanged.
|
| - *op = SkRegion::kReplace_Op;
|
| - return kContinue_MutateResult;
|
| - case SkRegion::kXOR_Op:
|
| - // Be conservative, based on (A XOR B) always included in (A union B),
|
| - // which is always included in (bounds(A) union bounds(B))
|
| - *op = SkRegion::kUnion_Op;
|
| - return kContinue_MutateResult;
|
| - }
|
| - }
|
| - SkFAIL("should not get here");
|
| - return kDoNothing_MutateResult;
|
| -}
|
| -
|
| bool SkRasterClip::setPath(const SkPath& path, const SkRegion& clip, bool doAA) {
|
| AUTO_RASTERCLIP_VALIDATE(*this);
|
| -
|
| - if (fForceConservativeRects) {
|
| - return this->setConservativeRect(path.getBounds(), clip.getBounds(), path.isInverseFillType());
|
| - }
|
|
|
| if (this->isBW() && !doAA) {
|
| (void)fBW.setPath(path, clip);
|
| @@ -168,22 +90,7 @@
|
| // base is used to limit the size (and therefore memory allocation) of the
|
| // region that results from scan converting devPath.
|
| SkRegion base;
|
| -
|
| - if (fForceConservativeRects) {
|
| - SkIRect ir;
|
| - switch (mutate_conservative_op(&op, path.isInverseFillType())) {
|
| - case kDoNothing_MutateResult:
|
| - return !this->isEmpty();
|
| - case kReplaceClippedAgainstGlobalBounds_MutateResult:
|
| - ir = SkIRect::MakeSize(size);
|
| - break;
|
| - case kContinue_MutateResult:
|
| - path.getBounds().roundOut(&ir);
|
| - break;
|
| - }
|
| - return this->op(ir, op);
|
| - }
|
| -
|
| +
|
| if (SkRegion::kIntersect_Op == op) {
|
| // since we are intersect, we can do better (tighter) with currRgn's
|
| // bounds, than just using the device. However, if currRgn is complex,
|
| @@ -195,7 +102,7 @@
|
| return this->setPath(path, this->bwRgn(), doAA);
|
| } else {
|
| base.setRect(this->getBounds());
|
| - SkRasterClip clip(fForceConservativeRects);
|
| + SkRasterClip clip;
|
| clip.setPath(path, base, doAA);
|
| return this->op(clip, op);
|
| }
|
| @@ -205,7 +112,7 @@
|
| if (SkRegion::kReplace_Op == op) {
|
| return this->setPath(path, base, doAA);
|
| } else {
|
| - SkRasterClip clip(fForceConservativeRects);
|
| + SkRasterClip clip;
|
| clip.setPath(path, base, doAA);
|
| return this->op(clip, op);
|
| }
|
| @@ -275,24 +182,9 @@
|
| return x - SkScalarFloorToScalar(x) < domain;
|
| }
|
|
|
| -bool SkRasterClip::op(const SkRect& r, const SkISize& size, SkRegion::Op op, bool doAA) {
|
| - AUTO_RASTERCLIP_VALIDATE(*this);
|
| -
|
| - if (fForceConservativeRects) {
|
| - SkIRect ir;
|
| - switch (mutate_conservative_op(&op, false)) {
|
| - case kDoNothing_MutateResult:
|
| - return !this->isEmpty();
|
| - case kReplaceClippedAgainstGlobalBounds_MutateResult:
|
| - ir = SkIRect::MakeSize(size);
|
| - break;
|
| - case kContinue_MutateResult:
|
| - r.roundOut(&ir);
|
| - break;
|
| - }
|
| - return this->op(ir, op);
|
| - }
|
| -
|
| +bool SkRasterClip::op(const SkRect& r, SkRegion::Op op, bool doAA) {
|
| + AUTO_RASTERCLIP_VALIDATE(*this);
|
| +
|
| if (fIsBW && doAA) {
|
| // check that the rect really needs aa, or is it close enought to
|
| // integer boundaries that we can just treat it as a BW rect?
|
| @@ -359,9 +251,7 @@
|
|
|
| void SkRasterClip::convertToAA() {
|
| AUTO_RASTERCLIP_VALIDATE(*this);
|
| -
|
| - SkASSERT(!fForceConservativeRects);
|
| -
|
| +
|
| SkASSERT(fIsBW);
|
| fAA.setRegion(fBW);
|
| fIsBW = false;
|
|
|