| Index: include/gpu/GrClip.h
|
| diff --git a/include/gpu/GrClip.h b/include/gpu/GrClip.h
|
| index 8c8b9b358f84a41433aa1a7d717cba28b76bfa0b..ba26d5c0817419e25da5e61486461e6ccb12e6a7 100644
|
| --- a/include/gpu/GrClip.h
|
| +++ b/include/gpu/GrClip.h
|
| @@ -25,8 +25,11 @@ struct SkIRect;
|
| */
|
| class GrClip : SkNoncopyable {
|
| public:
|
| - GrClip() : fClipType(kWideOpen_ClipType) {}
|
| + GrClip() : fClipType(kWideOpen_ClipType) {
|
| + fOrigin.setZero();
|
| + }
|
| GrClip(const SkIRect& rect) : fClipType(kIRect_ClipType) {
|
| + fOrigin.setZero();
|
| fClip.fIRect = rect;
|
| }
|
| ~GrClip() { this->reset(); }
|
| @@ -38,13 +41,15 @@ public:
|
| default:
|
| SkFAIL("Incomplete Switch\n");
|
| case kWideOpen_ClipType:
|
| + fOrigin.setZero();
|
| break;
|
| case kClipStack_ClipType:
|
| - fClip.fClipStack.fStack = SkRef(other.clipStack());
|
| - fClip.fClipStack.fOrigin = other.origin();
|
| + fClip.fStack = SkRef(other.clipStack());
|
| + fOrigin = other.origin();
|
| break;
|
| case kIRect_ClipType:
|
| fClip.fIRect = other.irect();
|
| + fOrigin.setZero();
|
| break;
|
| }
|
| return *this;
|
| @@ -84,19 +89,20 @@ public:
|
|
|
| const SkClipStack* clipStack() const {
|
| SkASSERT(kClipStack_ClipType == fClipType);
|
| - return fClip.fClipStack.fStack;
|
| + return fClip.fStack;
|
| }
|
|
|
| void setClipStack(const SkClipStack* clipStack, const SkIPoint* origin = NULL) {
|
| if (clipStack->isWideOpen()) {
|
| fClipType = kWideOpen_ClipType;
|
| + fOrigin.setZero();
|
| } else {
|
| fClipType = kClipStack_ClipType;
|
| - fClip.fClipStack.fStack = SkRef(clipStack);
|
| + fClip.fStack = SkRef(clipStack);
|
| if (origin) {
|
| - fClip.fClipStack.fOrigin = *origin;
|
| + fOrigin = *origin;
|
| } else {
|
| - fClip.fClipStack.fOrigin.setZero();
|
| + fOrigin.setZero();
|
| }
|
| }
|
| }
|
| @@ -108,15 +114,18 @@ public:
|
|
|
| void reset() {
|
| if (kClipStack_ClipType == fClipType) {
|
| - fClip.fClipStack.fStack->unref();
|
| - fClip.fClipStack.fStack = NULL;
|
| + fClip.fStack->unref();
|
| + fClip.fStack = NULL;
|
| }
|
| fClipType = kWideOpen_ClipType;
|
| + fOrigin.setZero();
|
| }
|
|
|
| + // We support this for all cliptypes to simplify the logic a bit in clip mask manager.
|
| + // non clipstack clip types MUST have a (0,0) origin
|
| const SkIPoint& origin() const {
|
| - SkASSERT(kClipStack_ClipType == fClipType);
|
| - return fClip.fClipStack.fOrigin;
|
| + SkASSERT(fClipType == kClipStack_ClipType || (fOrigin.fX == 0 && fOrigin.fY == 0));
|
| + return fOrigin;
|
| }
|
|
|
| bool isWideOpen(const SkRect& rect) const {
|
| @@ -159,13 +168,11 @@ public:
|
|
|
| private:
|
| union Clip {
|
| - struct ClipStack {
|
| - const SkClipStack* fStack;
|
| - SkIPoint fOrigin;
|
| - } fClipStack;
|
| + const SkClipStack* fStack;
|
| SkIRect fIRect;
|
| } fClip;
|
|
|
| + SkIPoint fOrigin;
|
| ClipType fClipType;
|
| };
|
|
|
|
|