summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/gm/pathopsinverse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/gm/pathopsinverse.cpp')
-rw-r--r--chromium/third_party/skia/gm/pathopsinverse.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/chromium/third_party/skia/gm/pathopsinverse.cpp b/chromium/third_party/skia/gm/pathopsinverse.cpp
new file mode 100644
index 00000000000..bdd8217f575
--- /dev/null
+++ b/chromium/third_party/skia/gm/pathopsinverse.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2013 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 "SkBitmap.h"
+#include "SkPath.h"
+#include "SkPathOps.h"
+#include "SkRect.h"
+
+namespace skiagm {
+
+class PathOpsInverseGM : public GM {
+public:
+ PathOpsInverseGM() {
+ }
+
+protected:
+ virtual void onOnceBeforeDraw() SK_OVERRIDE {
+ const unsigned oneColor = 0xFF8080FF;
+ const unsigned twoColor = 0x807F1f1f;
+ SkColor blendColor = blend(oneColor, twoColor);
+ makePaint(&fOnePaint, oneColor);
+ makePaint(&fTwoPaint, twoColor);
+ makePaint(&fOpPaint[kDifference_PathOp], oneColor);
+ makePaint(&fOpPaint[kIntersect_PathOp], blendColor);
+ makePaint(&fOpPaint[kUnion_PathOp], 0xFFc0FFc0);
+ makePaint(&fOpPaint[kReverseDifference_PathOp], twoColor);
+ makePaint(&fOpPaint[kXOR_PathOp], 0xFFa0FFe0);
+ makePaint(&fOutlinePaint, 0xFF000000);
+ fOutlinePaint.setStyle(SkPaint::kStroke_Style);
+ }
+
+ SkColor blend(SkColor one, SkColor two) {
+ SkBitmap temp;
+ temp.allocN32Pixels(1, 1);
+ SkCanvas canvas(temp);
+ canvas.drawColor(one);
+ canvas.drawColor(two);
+ void* pixels = temp.getPixels();
+ return *(SkColor*) pixels;
+ }
+
+ void makePaint(SkPaint* paint, SkColor color) {
+ paint->setAntiAlias(true);
+ paint->setStyle(SkPaint::kFill_Style);
+ paint->setColor(color);
+ }
+
+ virtual uint32_t onGetFlags() const SK_OVERRIDE {
+ return kSkipTiled_Flag; // Only for 565. 8888 is fine.
+ }
+
+ virtual SkString onShortName() SK_OVERRIDE {
+ return SkString("pathopsinverse");
+ }
+
+ virtual SkISize onISize() SK_OVERRIDE {
+ return SkISize::Make(1200, 900);
+ }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ SkPath one, two;
+ int yPos = 0;
+ for (int oneFill = 0; oneFill <= 1; ++oneFill) {
+ SkPath::FillType oneF = oneFill ? SkPath::kInverseEvenOdd_FillType
+ : SkPath::kEvenOdd_FillType;
+ for (int twoFill = 0; twoFill <= 1; ++twoFill) {
+ SkPath::FillType twoF = twoFill ? SkPath::kInverseEvenOdd_FillType
+ : SkPath::kEvenOdd_FillType;
+ one.reset();
+ one.setFillType(oneF);
+ one.addRect(10, 10, 70, 70);
+ two.reset();
+ two.setFillType(twoF);
+ two.addRect(40, 40, 100, 100);
+ canvas->save();
+ canvas->translate(0, SkIntToScalar(yPos));
+ canvas->clipRect(SkRect::MakeWH(110, 110), SkRegion::kIntersect_Op, true);
+ canvas->drawPath(one, fOnePaint);
+ canvas->drawPath(one, fOutlinePaint);
+ canvas->drawPath(two, fTwoPaint);
+ canvas->drawPath(two, fOutlinePaint);
+ canvas->restore();
+ int xPos = 150;
+ for (int op = kDifference_PathOp; op <= kReverseDifference_PathOp; ++op) {
+ SkPath result;
+ Op(one, two, (SkPathOp) op, &result);
+ canvas->save();
+ canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos));
+ canvas->clipRect(SkRect::MakeWH(110, 110), SkRegion::kIntersect_Op, true);
+ canvas->drawPath(result, fOpPaint[op]);
+ canvas->drawPath(result, fOutlinePaint);
+ canvas->restore();
+ xPos += 150;
+ }
+ yPos += 150;
+ }
+ }
+ }
+
+private:
+ SkPaint fOnePaint;
+ SkPaint fTwoPaint;
+ SkPaint fOutlinePaint;
+ SkPaint fOpPaint[kReverseDifference_PathOp - kDifference_PathOp + 1];
+ typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static GM* MyFactory(void*) { return new PathOpsInverseGM; }
+static GMRegistry reg(MyFactory);
+
+}