| 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; | 
| }; | 
|  | 
|  |