add new test for complex clips
temp disable picture testing until I fix the bug w/ expanding clips



git-svn-id: http://skia.googlecode.com/svn/trunk@2184 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/complexclip2.cpp b/gm/complexclip2.cpp
new file mode 100644
index 0000000..401f4af
--- /dev/null
+++ b/gm/complexclip2.cpp
@@ -0,0 +1,151 @@
+
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "gm.h"
+#include "SkCanvas.h"
+#include "SkPath.h"
+#include "SkRandom.h"
+
+namespace skiagm {
+
+class ComplexClip2GM : public GM {
+public:
+    ComplexClip2GM() {
+        SkScalar xA =  0 * SK_Scalar1;
+        SkScalar xB = 10 * SK_Scalar1;
+        SkScalar xC = 20 * SK_Scalar1;
+        SkScalar xD = 30 * SK_Scalar1;
+        SkScalar xE = 40 * SK_Scalar1;
+        SkScalar xF = 50 * SK_Scalar1;
+
+        SkScalar yA =  0 * SK_Scalar1;
+        SkScalar yB = 10 * SK_Scalar1;
+        SkScalar yC = 20 * SK_Scalar1;
+        SkScalar yD = 30 * SK_Scalar1;
+        SkScalar yE = 40 * SK_Scalar1;
+        SkScalar yF = 50 * SK_Scalar1;
+
+        fWidth = xF - xA;
+        fHeight = yF - yA;
+
+        fRects[0].fLeft   = xB;
+        fRects[0].fTop    = yB;
+        fRects[0].fRight  = xE;
+        fRects[0].fBottom = yE;
+        fRectColors[0] = SK_ColorRED;
+
+        fRects[1].fLeft   = xA;
+        fRects[1].fTop    = yA;
+        fRects[1].fRight  = xD;
+        fRects[1].fBottom = yD;
+        fRectColors[1] = SK_ColorGREEN;
+
+        fRects[2].fLeft   = xC;
+        fRects[2].fTop    = yA;
+        fRects[2].fRight  = xF;
+        fRects[2].fBottom = yD;
+        fRectColors[2] = SK_ColorBLUE;
+
+        fRects[3].fLeft   = xA;
+        fRects[3].fTop    = yC;
+        fRects[3].fRight  = xD;
+        fRects[3].fBottom = yF;
+        fRectColors[3] = SK_ColorYELLOW;
+
+        fRects[4].fLeft   = xC;
+        fRects[4].fTop    = yC;
+        fRects[4].fRight  = xF;
+        fRects[4].fBottom = yF;
+        fRectColors[4] = SK_ColorCYAN;
+
+        fTotalWidth = kCols * fWidth + SK_Scalar1 * (kCols + 1) * kPadX;
+        fTotalHeight = kRows * fHeight + SK_Scalar1 * (kRows + 1) * kPadY;
+    }
+
+    virtual bool validForPicture() const { return false; }
+
+protected:
+
+    static const int kRows = 5;
+    static const int kCols = 5;
+    static const int kPadX = 20;
+    static const int kPadY = 20;
+
+    SkString onShortName() {
+        return SkString("complexclip2");
+    }
+
+    SkISize onISize() { return make_isize(fTotalWidth, fTotalHeight); }
+
+    void drawBG(SkCanvas* canvas) {
+        canvas->drawColor(SkColorSetRGB(0xDD,0xA0,0xDD));
+        SkRegion::Op ops[] = {
+            SkRegion::kDifference_Op,
+            SkRegion::kIntersect_Op,
+            SkRegion::kUnion_Op,
+            SkRegion::kXOR_Op,
+            SkRegion::kReverseDifference_Op,
+            SkRegion::kReplace_Op,
+        };
+
+        SkRandom r;
+        for (int i = 0; i < kRows; ++i) {
+            for (int j = 0; j < kCols; ++j) {
+                for (int k = 0; k < 5; ++k) {
+                    fOps[j*kRows+i][k] = ops[r.nextU() % SK_ARRAY_COUNT(ops)];
+                }
+            }
+        }
+
+    }
+
+    virtual void onDraw(SkCanvas* canvas) {
+        this->drawBG(canvas);
+        SkPaint rectPaint;
+        rectPaint.setStyle(SkPaint::kStroke_Style);
+        rectPaint.setStrokeWidth(-1);
+
+        SkPaint fillPaint;
+        fillPaint.setColor(SkColorSetRGB(0xA0,0xDD,0xA0));
+
+        for (int i = 0; i < kRows; ++i) {
+            for (int j = 0; j < kCols; ++j) {
+                canvas->save();
+                canvas->translate(kPadX * SK_Scalar1 + (fWidth + kPadX * SK_Scalar1)*j,
+                                  kPadY * SK_Scalar1 + (fHeight + kPadY * SK_Scalar1)*i);
+                canvas->save();
+                for (int k = 0; k < 5; ++k) {
+                    canvas->clipRect(fRects[k], fOps[j*kRows+i][k]);
+                }
+                canvas->drawRect(SkRect::MakeWH(fWidth, fHeight), fillPaint);
+                canvas->restore();
+                for (int k = 0; k < 5; ++k) {
+                    rectPaint.setColor(fRectColors[k]);
+                    canvas->drawRect(fRects[k], rectPaint);
+                }
+                canvas->restore();
+            }
+        }
+    }
+private:
+    SkRect fRects[5];
+    SkColor fRectColors[5];
+    SkRegion::Op fOps[kRows * kCols][5];
+    SkScalar fWidth;
+    SkScalar fHeight;
+    SkScalar fTotalWidth;
+    SkScalar fTotalHeight;
+
+    typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static GM* MyFactory(void*) { return new ComplexClip2GM; }
+static GMRegistry reg(MyFactory);
+
+}
diff --git a/gm/gm.h b/gm/gm.h
index 531ade2..d8a9751 100644
--- a/gm/gm.h
+++ b/gm/gm.h
@@ -39,6 +39,8 @@
             return fShortName.c_str();
         }
 
+        virtual bool validForPicture() const { return true; }
+
 	protected:
 		virtual void onDraw(SkCanvas*) = 0;
 		virtual SkISize onISize() = 0;
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 6f7f67b..4ac53e1 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -435,6 +435,10 @@
                                   const SkBitmap& comparisonBitmap,
                                   const char readPath [],
                                   const char diffPath []) {
+    if (!gm->validForPicture()) {
+        return true;
+    }
+
     SkPicture* pict = generate_new_picture(gm);
     SkAutoUnref aur(pict);