aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/complexclip3.cpp136
-rw-r--r--gyp/gmslides.gypi1
2 files changed, 137 insertions, 0 deletions
diff --git a/gm/complexclip3.cpp b/gm/complexclip3.cpp
new file mode 100644
index 0000000000..1cea1ce7bd
--- /dev/null
+++ b/gm/complexclip3.cpp
@@ -0,0 +1,136 @@
+
+/*
+ * Copyright 2014 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"
+
+namespace skiagm {
+
+static const SkColor gPathColor = SK_ColorYELLOW;
+
+class ComplexClip3GM : public GM {
+public:
+ ComplexClip3GM(bool doSimpleClipFirst)
+ : fDoSimpleClipFirst(doSimpleClipFirst) {
+ this->setBGColor(0xFFDDDDDD);
+ }
+
+protected:
+ uint32_t onGetFlags() const SK_OVERRIDE {
+ return kSkipTiled_Flag | kSkipGPU_Flag;
+ }
+
+ SkString onShortName() {
+ SkString str;
+ str.printf("complexclip3_%s", fDoSimpleClipFirst ? "simple" : "complex");
+ return str;
+ }
+
+ SkISize onISize() { return SkISize::Make(1000, 950); }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ SkPath clipSimple;
+ clipSimple.addCircle(SkIntToScalar(70), SkIntToScalar(50), SkIntToScalar(20));
+
+ SkRect r1 = { 10, 20, 70, 80 };
+ SkPath clipComplex;
+ clipComplex.moveTo(SkIntToScalar(40), SkIntToScalar(50));
+ clipComplex.arcTo(r1, SkIntToScalar(30), SkIntToScalar(300), false);
+ clipComplex.close();
+
+ SkPath* firstClip = &clipSimple;
+ SkPath* secondClip = &clipComplex;
+
+ if (!fDoSimpleClipFirst) {
+ SkTSwap<SkPath*>(firstClip, secondClip);
+ }
+
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ sk_tool_utils::set_portable_typeface(&paint);
+ paint.setTextSize(SkIntToScalar(20));
+
+ static const struct {
+ SkRegion::Op fOp;
+ const char* fName;
+ } gOps[] = {
+ {SkRegion::kIntersect_Op, "I"},
+ {SkRegion::kDifference_Op, "D" },
+ {SkRegion::kUnion_Op, "U"},
+ {SkRegion::kXOR_Op, "X" },
+ {SkRegion::kReverseDifference_Op, "R"}
+ };
+
+ canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
+ canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
+
+ SkPaint pathPaint;
+ pathPaint.setAntiAlias(true);
+ pathPaint.setColor(gPathColor);
+
+ for (int invA = 0; invA < 2; ++invA) {
+ for (int aaBits = 0; aaBits < 4; ++aaBits) {
+ canvas->save();
+ for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
+ for (int invB = 0; invB < 2; ++invB) {
+ bool doAAA = SkToBool(aaBits & 1);
+ bool doAAB = SkToBool(aaBits & 2);
+ bool doInvA = SkToBool(invA);
+ bool doInvB = SkToBool(invB);
+ canvas->save();
+ // set clip
+ firstClip->setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType :
+ SkPath::kEvenOdd_FillType);
+ secondClip->setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType :
+ SkPath::kEvenOdd_FillType);
+ canvas->clipPath(*firstClip, SkRegion::kIntersect_Op, doAAA);
+ canvas->clipPath(*secondClip, gOps[op].fOp, doAAB);
+
+ // draw rect clipped
+ SkRect r = { 0, 0, 100, 100 };
+ canvas->drawRect(r, pathPaint);
+ canvas->restore();
+
+
+ SkScalar txtX = SkIntToScalar(10);
+ paint.setColor(SK_ColorBLACK);
+ SkString str;
+ str.printf("%s%s %s %s%s", doAAA ? "A" : "B",
+ doInvA ? "I" : "N",
+ gOps[op].fName,
+ doAAB ? "A" : "B",
+ doInvB ? "I" : "N");
+
+ canvas->drawText(str.c_str(), strlen(str.c_str()), txtX, SkIntToScalar(130),
+ paint);
+ if (doInvB) {
+ canvas->translate(SkIntToScalar(150),0);
+ } else {
+ canvas->translate(SkIntToScalar(120),0);
+ }
+ }
+ }
+ canvas->restore();
+ canvas->translate(0, SkIntToScalar(150));
+ }
+ }
+ }
+
+private:
+ bool fDoSimpleClipFirst;
+
+ typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+// Simple clip first
+DEF_GM( return new ComplexClip3GM(true); )
+// Complex clip first
+DEF_GM( return new ComplexClip3GM(false); )
+}
diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi
index 61ba3acbc0..1b78cc0cec 100644
--- a/gyp/gmslides.gypi
+++ b/gyp/gmslides.gypi
@@ -54,6 +54,7 @@
'../gm/colorwheel.cpp',
'../gm/complexclip.cpp',
'../gm/complexclip2.cpp',
+ '../gm/complexclip3.cpp',
'../gm/composeshader.cpp',
#'../gm/conicpaths.cpp',
'../gm/convexpaths.cpp',