Index: gm/complexclip.cpp |
diff --git a/gm/complexclip.cpp b/gm/complexclip.cpp |
index 61a19fd48624e02f0debdda4d03c0afac27b6b7b..ebb7707c9cfeec36dbabfe5b269bc36d1c57693e 100644 |
--- a/gm/complexclip.cpp |
+++ b/gm/complexclip.cpp |
@@ -18,14 +18,12 @@ static const SkColor gClipAColor = SK_ColorBLUE; |
static const SkColor gClipBColor = SK_ColorRED; |
class ComplexClipGM : public GM { |
- bool fDoAAClip; |
- bool fDoSaveLayer; |
public: |
- ComplexClipGM(bool aaclip, bool saveLayer) |
+ ComplexClipGM(bool aaclip, bool saveLayer, bool invertDraw) |
: fDoAAClip(aaclip) |
- , fDoSaveLayer(saveLayer) { |
+ , fDoSaveLayer(saveLayer) |
+ , fInvertDraw(invertDraw) { |
this->setBGColor(0xFFDDDDDD); |
-// this->setBGColor(SkColorSetRGB(0xB0,0xDD,0xB0)); |
} |
protected: |
@@ -36,9 +34,10 @@ protected: |
SkString onShortName() { |
SkString str; |
- str.printf("complexclip_%s%s", |
+ str.printf("complexclip_%s%s%s", |
fDoAAClip ? "aa" : "bw", |
- fDoSaveLayer ? "_layer" : ""); |
+ fDoSaveLayer ? "_layer" : "", |
+ fInvertDraw ? "_invert" : ""); |
return str; |
} |
@@ -60,7 +59,11 @@ protected: |
path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); |
path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); |
path.close(); |
- path.setFillType(SkPath::kEvenOdd_FillType); |
+ if (fInvertDraw) { |
+ path.setFillType(SkPath::kInverseEvenOdd_FillType); |
+ } else { |
+ path.setFillType(SkPath::kEvenOdd_FillType); |
+ } |
SkPaint pathPaint; |
pathPaint.setAntiAlias(true); |
pathPaint.setColor(gPathColor); |
@@ -134,6 +137,16 @@ protected: |
canvas->clipPath(clipA, SkRegion::kIntersect_Op, fDoAAClip); |
canvas->clipPath(clipB, gOps[op].fOp, fDoAAClip); |
+ // In the inverse case we need to prevent the draw from covering the whole |
+ // canvas. |
+ if (fInvertDraw) { |
+ SkRect rectClip = clipA.getBounds(); |
+ rectClip.join(path.getBounds()); |
+ rectClip.join(path.getBounds()); |
+ rectClip.outset(5, 5); |
+ canvas->clipRect(rectClip); |
+ } |
+ |
// draw path clipped |
canvas->drawPath(path, pathPaint); |
canvas->restore(); |
@@ -181,22 +194,22 @@ private: |
canvas->drawPath(clipB, paint); |
} |
+ bool fDoAAClip; |
+ bool fDoSaveLayer; |
+ bool fInvertDraw; |
+ |
typedef GM INHERITED; |
}; |
////////////////////////////////////////////////////////////////////////////// |
-// aliased and anti-aliased w/o a layer |
-static GM* gFact0(void*) { return new ComplexClipGM(false, false); } |
-static GM* gFact1(void*) { return new ComplexClipGM(true, false); } |
- |
-// aliased and anti-aliased w/ a layer |
-static GM* gFact2(void*) { return new ComplexClipGM(false, true); } |
-static GM* gFact3(void*) { return new ComplexClipGM(true, true); } |
- |
-static GMRegistry gReg0(gFact0); |
-static GMRegistry gReg1(gFact1); |
-static GMRegistry gReg2(gFact2); |
-static GMRegistry gReg3(gFact3); |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (false, false, false)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (false, false, true)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (false, true, false)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (false, true, true)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (true, false, false)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (true, false, true)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (true, true, false)); ) |
+DEF_GM( return SkNEW_ARGS(ComplexClipGM, (true, true, true)); ) |
} |