| /* | |
| * Copyright 2016 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "gm/gm.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkColor.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkPath.h" | |
| #include "include/core/SkRRect.h" | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/core/SkSize.h" | |
| #include "include/core/SkString.h" | |
| #include "src/core/SkCanvasPriv.h" | |
| namespace skiagm { | |
| // This test exercise SkCanvas::androidFramework_replaceClip behavior | |
| class ComplexClip4GM : public GM { | |
| public: | |
| ComplexClip4GM(bool aaclip) | |
| : fDoAAClip(aaclip) { | |
| this->setBGColor(0xFFDEDFDE); | |
| } | |
| protected: | |
| SkString getName() const override { | |
| SkString str; | |
| str.printf("complexclip4_%s", | |
| fDoAAClip ? "aa" : "bw"); | |
| return str; | |
| } | |
| SkISize getISize() override { return SkISize::Make(970, 780); } | |
| // Android Framework will still support the legacy kReplace SkClipOp on older devices, so | |
| // this represents how to do so while also respecting the device restriction using the newer | |
| // androidFramework_resetClip() API. | |
| void emulateDeviceRestriction(SkCanvas* canvas, const SkIRect& deviceRestriction) { | |
| // TODO(michaelludwig): It may make more sense for device clip restriction to move on to | |
| // the SkSurface (which would let this GM draw correctly in viewer). | |
| canvas->androidFramework_setDeviceClipRestriction(deviceRestriction); | |
| } | |
| void emulateClipRectReplace(SkCanvas* canvas, | |
| const SkRect& clipRect, | |
| bool aa) { | |
| SkCanvasPriv::ResetClip(canvas); | |
| canvas->clipRect(clipRect, SkClipOp::kIntersect, aa); | |
| } | |
| void emulateClipRRectReplace(SkCanvas* canvas, | |
| const SkRRect& clipRRect, | |
| bool aa) { | |
| SkCanvasPriv::ResetClip(canvas); | |
| canvas->clipRRect(clipRRect, SkClipOp::kIntersect, aa); | |
| } | |
| void emulateClipPathReplace(SkCanvas* canvas, | |
| const SkPath& path, | |
| bool aa) { | |
| SkCanvasPriv::ResetClip(canvas); | |
| canvas->clipPath(path, SkClipOp::kIntersect, aa); | |
| } | |
| void onDraw(SkCanvas* canvas) override { | |
| SkPaint p; | |
| p.setAntiAlias(fDoAAClip); | |
| p.setColor(SK_ColorYELLOW); | |
| canvas->save(); | |
| // draw a yellow rect through a rect clip | |
| canvas->save(); | |
| emulateDeviceRestriction(canvas, SkIRect::MakeLTRB(100, 100, 300, 300)); | |
| canvas->drawColor(SK_ColorGREEN); | |
| emulateClipRectReplace(canvas, SkRect::MakeLTRB(100, 200, 400, 500), fDoAAClip); | |
| canvas->drawRect(SkRect::MakeLTRB(100, 200, 400, 500), p); | |
| canvas->restore(); | |
| // draw a yellow rect through a diamond clip | |
| canvas->save(); | |
| emulateDeviceRestriction(canvas, SkIRect::MakeLTRB(500, 100, 800, 300)); | |
| canvas->drawColor(SK_ColorGREEN); | |
| SkPath pathClip = SkPath::Polygon({{ | |
| {650, 200}, | |
| {900, 300}, | |
| {650, 400}, | |
| {650, 300}, | |
| }}, true); | |
| emulateClipPathReplace(canvas, pathClip, fDoAAClip); | |
| canvas->drawRect(SkRect::MakeLTRB(500, 200, 900, 500), p); | |
| canvas->restore(); | |
| // draw a yellow rect through a round rect clip | |
| canvas->save(); | |
| emulateDeviceRestriction(canvas, SkIRect::MakeLTRB(500, 500, 800, 700)); | |
| canvas->drawColor(SK_ColorGREEN); | |
| emulateClipRRectReplace( | |
| canvas, SkRRect::MakeOval(SkRect::MakeLTRB(500, 600, 900, 750)), fDoAAClip); | |
| canvas->drawRect(SkRect::MakeLTRB(500, 600, 900, 750), p); | |
| canvas->restore(); | |
| // fill the clip with yellow color showing that androidFramework_replaceClip is | |
| // in device space | |
| canvas->save(); | |
| canvas->clipRect(SkRect::MakeLTRB(100, 400, 300, 750), | |
| SkClipOp::kIntersect, fDoAAClip); | |
| canvas->drawColor(SK_ColorGREEN); | |
| // should not affect the device-space clip | |
| canvas->rotate(20.f); | |
| canvas->translate(50.f, 50.f); | |
| emulateDeviceRestriction(canvas, SkIRect::MakeLTRB(150, 450, 250, 700)); | |
| canvas->drawColor(SK_ColorYELLOW); | |
| canvas->restore(); | |
| canvas->restore(); | |
| } | |
| private: | |
| bool fDoAAClip; | |
| using INHERITED = GM; | |
| }; | |
| ////////////////////////////////////////////////////////////////////////////// | |
| DEF_GM(return new ComplexClip4GM(false);) | |
| DEF_GM(return new ComplexClip4GM(true);) | |
| } // namespace skiagm |