Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Unified Diff: gm/pathopsinverse.cpp

Issue 14371011: path ops : add support for inverse fill (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gyp/gmslides.gypi » ('j') | include/pathops/SkPathOps.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/pathopsinverse.cpp
===================================================================
--- gm/pathopsinverse.cpp (revision 0)
+++ gm/pathopsinverse.cpp (revision 0)
@@ -0,0 +1,116 @@
+/*
+ * 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() {
+ this->makePaints();
bsalomon 2013/04/22 13:13:57 There's a virtual on GM called "onOnceBeforeDraw".
+ }
+
+protected:
+ void makePaints() {
+ const unsigned oneColor = 0xFF8080FF;
+ const unsigned twoColor = 0x807F1f1f;
+ SkColor blendColor = blend(oneColor, twoColor);
+ makePaint(&onePaint, oneColor);
+ makePaint(&twoPaint, twoColor);
+ makePaint(&opPaint[kDifference_PathOp], oneColor);
+ makePaint(&opPaint[kIntersect_PathOp], blendColor);
+ makePaint(&opPaint[kUnion_PathOp], 0xFFc0FFc0);
+ makePaint(&opPaint[kReverseDifference_PathOp], twoColor);
+ makePaint(&opPaint[kXOR_PathOp], 0xFFa0FFe0);
+ makePaint(&outlinePaint, 0xFF000000);
+ outlinePaint.setStyle(SkPaint::kStroke_Style);
+ }
+
+ SkColor blend(SkColor one, SkColor two) {
+ SkBitmap temp;
+ temp.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
+ temp.allocPixels();
+ 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 SkString onShortName() SK_OVERRIDE {
+ return SkString("pathopsinverse");
+ }
+
+ virtual SkISize onISize() SK_OVERRIDE {
+ return make_isize(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, onePaint);
+ canvas->drawPath(one, outlinePaint);
+ canvas->drawPath(two, twoPaint);
+ canvas->drawPath(two, outlinePaint);
+ 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, opPaint[op]);
+ canvas->drawPath(result, outlinePaint);
+ canvas->restore();
+ xPos += 150;
+ }
+ yPos += 150;
+ }
+ }
+ }
+
+private:
+ SkPaint onePaint;
bsalomon 2013/04/22 13:13:57 fOnePaint, etc?
+ SkPaint twoPaint;
+ SkPaint outlinePaint;
+ SkPaint opPaint[kReverseDifference_PathOp - kDifference_PathOp + 1];
+ typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static GM* MyFactory(void*) { return new PathOpsInverseGM; }
+static GMRegistry reg(MyFactory);
+
+}
« no previous file with comments | « no previous file | gyp/gmslides.gypi » ('j') | include/pathops/SkPathOps.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698