Altered Ganesh's clip stack plumbing to pass down new GrClipData class

http://codereview.appspot.com/6454047/



git-svn-id: http://skia.googlecode.com/svn/trunk@4788 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index d0bb225..d5d03cd 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -124,9 +124,10 @@
         // simply because the clip has changed if the clip doesn't affect
         // the rect.
         bool disabledClip = false;
-        if (drawState->isClipState() && fClip.isRect()) {
 
-            GrClip::Iter iter(fClip, GrClip::Iter::kBottom_IterStart);
+        if (drawState->isClipState() && fClip->fClipStack->isRect()) {
+
+            GrClip::Iter iter(*fClip->fClipStack, GrClip::Iter::kBottom_IterStart);
             const GrClip::Iter::Clip* clip = iter.next();
             GrAssert(NULL != clip && NULL != clip->fRect);
 
@@ -493,6 +494,7 @@
     fVertexPool.reset();
     fIndexPool.reset();
     fClips.reset();
+    fClipOrigins.reset();
     fClipSet = true;
 
     this->resetDrawTracking();
@@ -527,6 +529,8 @@
     GrDrawState* prevDrawState = target->drawState();
     prevDrawState->ref();
 
+    GrClipData clipData;
+
     int currState       = 0;
     int currClip        = 0;
     int currClear       = 0;
@@ -567,7 +571,9 @@
                 ++currState;
                 break;
             case kSetClip_Cmd:
-                target->setClip(fClips[currClip]);
+                clipData.fClipStack = &fClips[currClip];
+                clipData.fOrigin = fClipOrigins[currClip];
+                target->setClip(&clipData);
                 ++currClip;
                 break;
             case kClear_Cmd:
@@ -581,6 +587,7 @@
     // we should have consumed all the states, clips, etc.
     GrAssert(fStates.count() == currState);
     GrAssert(fClips.count() == currClip);
+    GrAssert(fClipOrigins.count() == currClip);
     GrAssert(fClears.count() == currClear);
     GrAssert(fDraws.count()  == currDraw);
 
@@ -809,7 +816,9 @@
 
 bool GrInOrderDrawBuffer::needsNewClip() const {
    if (this->getDrawState().isClipState()) {
-       if (fClipSet && fClips.back() != fClip) {
+       if (fClipSet && 
+           (fClips.back() != *fClip->fClipStack ||
+            fClipOrigins.back() != fClip->fOrigin)) {
            return true;
        }
     }
@@ -817,13 +826,15 @@
 }
 
 void GrInOrderDrawBuffer::recordClip() {
-    fClips.push_back() = fClip;
+    fClips.push_back() = *fClip->fClipStack;
+    fClipOrigins.push_back() = fClip->fOrigin;
     fClipSet = false;
     fCmds.push_back(kSetClip_Cmd);
 }
 
 void GrInOrderDrawBuffer::recordDefaultClip() {
     fClips.push_back() = GrClip();
+    fClipOrigins.push_back() = SkIPoint::Make(0, 0);
     fCmds.push_back(kSetClip_Cmd);
 }
 
@@ -852,7 +863,7 @@
     return &fClears.push_back();
 }
 
-void GrInOrderDrawBuffer::clipWillBeSet(const GrClip& newClip) {
-    INHERITED::clipWillBeSet(newClip);
+void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) {
+    INHERITED::clipWillBeSet(newClipData);
     fClipSet = true;
 }