Chromium Code Reviews| Index: gm/complexclip3.cpp |
| diff --git a/gm/complexclip3.cpp b/gm/complexclip3.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..58dbb769329611045792b873dbe755bb9c9926c5 |
| --- /dev/null |
| +++ b/gm/complexclip3.cpp |
| @@ -0,0 +1,136 @@ |
| + |
| +/* |
| + * Copyright 2011 Google Inc. |
|
bsalomon
2014/12/17 19:07:22
2014
egdaniel
2014/12/17 19:13:35
Done.
|
| + * |
| + * 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); |
|
bsalomon
2014/12/17 19:07:22
wrap
egdaniel
2014/12/17 19:13:35
Done.
|
| + 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; |
| +}; |
| + |
| +////////////////////////////////////////////////////////////////////////////// |
| + |
| +static GM* gFact0(void*) { return new ComplexClip3GM(true); } |
|
bsalomon
2014/12/17 19:07:22
DEF_GM() (grep for examples)
egdaniel
2014/12/17 19:13:35
Done.
|
| +static GM* gFact1(void*) { return new ComplexClip3GM(false); } |
| + |
| +static GMRegistry gReg0(gFact0); |
| +static GMRegistry gReg1(gFact1); |
| +} |