diff options
author | Derek Sollenberger <djsollen@google.com> | 2011-03-14 11:20:24 -0400 |
---|---|---|
committer | Derek Sollenberger <djsollen@google.com> | 2011-03-14 16:33:36 -0400 |
commit | 05b6b4d746867a9fb02e14edfe1bf3685abeb813 (patch) | |
tree | 34b121f598d1693c014df48ee70bffa382b0cc23 /gm/complexclip.cpp | |
parent | 6210a7c68844602ee390bcce61dbb637910a3c6b (diff) | |
download | external_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.cpp | 152 |
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); + +} |