aboutsummaryrefslogtreecommitdiffstats
path: root/gm/complexclip.cpp
diff options
context:
space:
mode:
authorDerek Sollenberger <djsollen@google.com>2011-03-14 11:20:24 -0400
committerDerek Sollenberger <djsollen@google.com>2011-03-14 16:33:36 -0400
commit05b6b4d746867a9fb02e14edfe1bf3685abeb813 (patch)
tree34b121f598d1693c014df48ee70bffa382b0cc23 /gm/complexclip.cpp
parent6210a7c68844602ee390bcce61dbb637910a3c6b (diff)
downloadexternal_skia-05b6b4d746867a9fb02e14edfe1bf3685abeb813.zip
external_skia-05b6b4d746867a9fb02e14edfe1bf3685abeb813.tar.gz
external_skia-05b6b4d746867a9fb02e14edfe1bf3685abeb813.tar.bz2
Skia Merge (revision 922)
Change-Id: I7ed57d10905d8bad6486a4d7410165eec1cc2b4f
Diffstat (limited to 'gm/complexclip.cpp')
-rw-r--r--gm/complexclip.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/gm/complexclip.cpp b/gm/complexclip.cpp
new file mode 100644
index 0000000..867d230
--- /dev/null
+++ b/gm/complexclip.cpp
@@ -0,0 +1,152 @@
+#include "gm.h"
+#include "SkCanvas.h"
+//#include "SkParsePath.h"
+#include "SkPath.h"
+//#include "SkRandom.h"
+
+namespace skiagm {
+
+class ComplexClipGM : public GM {
+public:
+ ComplexClipGM() {
+ }
+
+protected:
+
+ SkString onShortName() {
+ return SkString("complexclip");
+ }
+
+ SkISize onISize() { return make_isize(550, 1000); }
+
+ void drawBG(SkCanvas* canvas) {
+ canvas->drawColor(SkColorSetRGB(0xA0,0xDD,0xA0));
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ SkPath path;
+ path.moveTo(SkIntToScalar(0), SkIntToScalar(50));
+ path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0));
+ path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
+ path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25));
+ path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
+ path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
+ path.lineTo(SkIntToScalar(0), SkIntToScalar(200));
+ path.close();
+ path.moveTo(SkIntToScalar(50), SkIntToScalar(50));
+ path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
+ path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
+ path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
+ path.lineTo(SkIntToScalar(50), SkIntToScalar(150));
+ path.close();
+ path.setFillType(SkPath::kEvenOdd_FillType);
+ SkColor pathColor = SK_ColorBLACK;
+ SkPaint pathPaint;
+ pathPaint.setAntiAlias(true);
+ pathPaint.setColor(pathColor);
+
+ SkPath clipA;
+ clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20));
+ clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
+ clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105));
+ clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
+ clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180));
+ clipA.close();
+ SkColor colorA = SK_ColorCYAN;
+
+ SkPath clipB;
+ clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10));
+ clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
+ clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
+ clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185));
+ clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
+ clipB.close();
+ SkColor colorB = SK_ColorRED;
+
+ drawBG(canvas);
+ SkPaint paint;
+ paint.setAntiAlias(true);
+
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setStrokeWidth(0);
+
+ canvas->translate(SkIntToScalar(10),SkIntToScalar(10));
+ canvas->drawPath(path, pathPaint);
+ paint.setColor(colorA);
+ canvas->drawPath(clipA, paint);
+ paint.setColor(colorB);
+ canvas->drawPath(clipB, paint);
+
+ static const struct {
+ SkRegion::Op fOp;
+ const char* fName;
+ } gOps[] = { //extra spaces in names for measureText
+ {SkRegion::kIntersect_Op, "Isect "},
+ {SkRegion::kDifference_Op, "Diff " },
+ {SkRegion::kUnion_Op, "Union "},
+ {SkRegion::kXOR_Op, "Xor " },
+ {SkRegion::kReverseDifference_Op, "RDiff "}
+ };
+
+ canvas->translate(0, SkIntToScalar(40));
+ canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
+ canvas->save();
+
+ for (int invA = 0; invA < 2; ++invA) {
+ for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
+ int idx = invA * SK_ARRAY_COUNT(gOps) + op;
+ if (!(idx % 3)) {
+ canvas->restore();
+ canvas->translate(0, SkIntToScalar(250));
+ canvas->save();
+ }
+ canvas->save();
+ // set clip
+ clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType :
+ SkPath::kEvenOdd_FillType);
+ canvas->clipPath(clipA);
+ canvas->clipPath(clipB, gOps[op].fOp);
+
+ // draw path clipped
+ canvas->drawPath(path, pathPaint);
+ canvas->restore();
+
+ // draw path in hairline
+ paint.setColor(pathColor);
+ canvas->drawPath(path, paint);
+
+ // draw clips in hair line
+ paint.setColor(colorA);
+ canvas->drawPath(clipA, paint);
+ paint.setColor(colorB);
+ canvas->drawPath(clipB, paint);
+
+ paint.setTextSize(SkIntToScalar(20));
+
+ SkScalar txtX = SkIntToScalar(55);
+ paint.setColor(colorA);
+ const char* aTxt = invA ? "InverseA " : "A ";
+ canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint);
+ txtX += paint.measureText(aTxt, strlen(aTxt));
+ paint.setColor(SK_ColorBLACK);
+ canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
+ txtX, SkIntToScalar(220), paint);
+ txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
+ paint.setColor(colorB);
+ canvas->drawText("B", 1, txtX, SkIntToScalar(220), paint);
+
+ canvas->translate(SkIntToScalar(250),0);
+ }
+ }
+ canvas->restore();
+ }
+private:
+ typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static GM* MyFactory(void*) { return new ComplexClipGM; }
+static GMRegistry reg(MyFactory);
+
+}