diff options
author | Mike Reed <reed@google.com> | 2017-03-04 19:43:23 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-04 19:43:35 +0000 |
commit | 025e2444c1f5a0c3cdc0bf60d1fa59941a0b5db4 (patch) | |
tree | c353105999aa71c22d41879e2b0beb2aba5df5d9 /src/core/SkClipStackDevice.cpp | |
parent | 12da890fbdafb2a2e33ced24e207ffc8cdec54c7 (diff) |
Revert "Revert "Revert[2] "Remove SkDraw from device-draw methods, and enable device-centric clipping.""""
This reverts commit baf06bc89a0ee2ac4033281e7310f6c727faab79.
Reason for revert: reland to diagnose possible g3 failure
Original change's description:
> Revert "Revert[2] "Remove SkDraw from device-draw methods, and enable device-centric clipping."""
>
> This reverts commit cfaa63237b152ae216f1351207bce3ea9808814c.
>
> Reason for revert: speculative revert to fix Google3
>
> Original change's description:
> > Revert[2] "Remove SkDraw from device-draw methods, and enable device-centric clipping.""
> >
> > passes new (augmented) CanvasClipType unittest
> > fixed rasterclipstack::setnewsize
> >
> > This reverts commit ea5e676a7b75600edcde3912886486004ccd7626.
> >
> > BUG=skia:
> >
> > Change-Id: I004653e0f4d01454662f8516fccab0046486f273
> > Reviewed-on: https://skia-review.googlesource.com/9185
> > Reviewed-by: Brian Salomon <bsalomon@google.com>
> > Commit-Queue: Mike Reed <reed@google.com>
> >
>
> TBR=bsalomon@google.com,reed@google.com,reviews@skia.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=skia:
>
> Change-Id: Ibd7ee6383999f008eb6ee59c1c3f1c06a86044ea
> Reviewed-on: https://skia-review.googlesource.com/9230
> Reviewed-by: Cary Clark <caryclark@google.com>
> Commit-Queue: Cary Clark <caryclark@google.com>
>
TBR=bsalomon@google.com,reviews@skia.org,caryclark@google.com,reed@google.com,mtklein@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Change-Id: I093fa8788056be39af01191bbf3a9e5de9f73954
Reviewed-on: https://skia-review.googlesource.com/9244
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkClipStackDevice.cpp')
-rw-r--r-- | src/core/SkClipStackDevice.cpp | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/src/core/SkClipStackDevice.cpp b/src/core/SkClipStackDevice.cpp index 799850b839..dd5118d319 100644 --- a/src/core/SkClipStackDevice.cpp +++ b/src/core/SkClipStackDevice.cpp @@ -9,6 +9,16 @@ #include "SkDraw.h" #include "SkRasterClip.h" +SkIRect SkClipStackDevice::devClipBounds() const { + SkIRect r = fClipStack.bounds(this->imageInfo().bounds()).roundOut(); + if (!r.isEmpty()) { + SkASSERT(this->imageInfo().bounds().contains(r)); + } + return r; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + void SkClipStackDevice::onSave() { fClipStack.save(); } @@ -52,13 +62,47 @@ void SkClipStackDevice::onSetDeviceClipRestriction(SkIRect* clipRestriction) { } } -SkIRect SkClipStackDevice::devClipBounds(const SkDraw& draw) const { -#ifdef SK_USE_DEVICE_CLIPPING - SkIRect r = fClipStack.bounds(this->imageInfo().bounds()).roundOut(); - SkASSERT(this->imageInfo().bounds().contains(r)); - SkASSERT(draw.fRC->getBounds().contains(r)); - return r; -#else - return draw.fRC->getBounds(); -#endif +bool SkClipStackDevice::onClipIsAA() const { + SkClipStack::B2TIter iter(fClipStack); + const SkClipStack::Element* element; + + while ((element = iter.next()) != nullptr) { + if (element->isAA()) { + return true; + } + } + return false; +} + +void SkClipStackDevice::onAsRgnClip(SkRegion* rgn) const { + SkClipStack::BoundsType boundType; + bool isIntersectionOfRects; + SkRect bounds; + fClipStack.getBounds(&bounds, &boundType, &isIntersectionOfRects); + if (isIntersectionOfRects && SkClipStack::kNormal_BoundsType == boundType) { + rgn->setRect(bounds.round()); + } else { + SkPath path; + fClipStack.asPath(&path); + rgn->setPath(path, SkRegion(SkIRect::MakeWH(this->width(), this->height()))); + } +} + +SkBaseDevice::ClipType SkClipStackDevice::onGetClipType() const { + if (fClipStack.isWideOpen()) { + return kRect_ClipType; + } + if (fClipStack.isEmpty(SkIRect::MakeWH(this->width(), this->height()))) { + return kEmpty_ClipType; + } else { + SkClipStack::BoundsType boundType; + bool isIntersectionOfRects; + SkRect bounds; + fClipStack.getBounds(&bounds, &boundType, &isIntersectionOfRects); + if (isIntersectionOfRects && SkClipStack::kNormal_BoundsType == boundType) { + return kRect_ClipType; + } else { + return kComplex_ClipType; + } + } } |