blob: 69dc32bd12cc91ff4579aeeb96c36af179dbe4e8 [file] [log] [blame]
Stan Iliev5f1bb0a2016-12-12 17:39:55 -05001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
Ben Wagner7fde8e12019-05-01 17:28:53 -04007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
9#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040010#include "include/core/SkColor.h"
11#include "include/core/SkPaint.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkPath.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkRRect.h"
14#include "include/core/SkRect.h"
15#include "include/core/SkScalar.h"
16#include "include/core/SkSize.h"
17#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050018#include "src/core/SkClipOpPriv.h"
Stan Iliev5f1bb0a2016-12-12 17:39:55 -050019
20namespace skiagm {
21
22//this test exercise SkCanvas::setDeviceClipRestriction behavior
23class ComplexClip4GM : public GM {
24public:
25 ComplexClip4GM(bool aaclip)
26 : fDoAAClip(aaclip) {
27 this->setBGColor(0xFFDEDFDE);
28 }
29
30protected:
31
32
33 SkString onShortName() {
34 SkString str;
35 str.printf("complexclip4_%s",
36 fDoAAClip ? "aa" : "bw");
37 return str;
38 }
39
40 SkISize onISize() { return SkISize::Make(970, 780); }
41
42 virtual void onDraw(SkCanvas* canvas) {
43 SkPaint p;
44 p.setAntiAlias(fDoAAClip);
45 p.setColor(SK_ColorYELLOW);
46
47 canvas->save();
48 // draw a yellow rect through a rect clip
49 canvas->save();
50 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(100, 100, 300, 300));
51 canvas->drawColor(SK_ColorGREEN);
52 canvas->clipRect(SkRect::MakeLTRB(100, 200, 400, 500),
53 kReplace_SkClipOp, fDoAAClip);
54 canvas->drawRect(SkRect::MakeLTRB(100, 200, 400, 500), p);
55 canvas->restore();
56
57 // draw a yellow rect through a diamond clip
58 canvas->save();
59 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(500, 100, 800, 300));
60 canvas->drawColor(SK_ColorGREEN);
61
62 SkPath pathClip;
63 pathClip.moveTo(SkIntToScalar(650), SkIntToScalar(200));
64 pathClip.lineTo(SkIntToScalar(900), SkIntToScalar(300));
65 pathClip.lineTo(SkIntToScalar(650), SkIntToScalar(400));
66 pathClip.lineTo(SkIntToScalar(650), SkIntToScalar(300));
67 pathClip.close();
68 canvas->clipPath(pathClip, kReplace_SkClipOp, fDoAAClip);
69 canvas->drawRect(SkRect::MakeLTRB(500, 200, 900, 500), p);
70 canvas->restore();
71
72 // draw a yellow rect through a round rect clip
73 canvas->save();
74 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(500, 500, 800, 700));
75 canvas->drawColor(SK_ColorGREEN);
76
77 canvas->clipRRect(SkRRect::MakeOval(SkRect::MakeLTRB(500, 600, 900, 750)),
78 kReplace_SkClipOp, fDoAAClip);
79 canvas->drawRect(SkRect::MakeLTRB(500, 600, 900, 750), p);
80 canvas->restore();
81
82 // fill the clip with yellow color showing that androidFramework_setDeviceClipRestriction
83 // intersects with the current clip
84 canvas->save();
85 canvas->clipRect(SkRect::MakeLTRB(100, 400, 300, 750),
86 kIntersect_SkClipOp, fDoAAClip);
87 canvas->drawColor(SK_ColorGREEN);
88 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(150, 450, 250, 700));
89 canvas->drawColor(SK_ColorYELLOW);
90 canvas->restore();
91
92 canvas->restore();
93 }
94private:
95
96 bool fDoAAClip;
97
98 typedef GM INHERITED;
99};
100
101//////////////////////////////////////////////////////////////////////////////
102
103DEF_GM(return new ComplexClip4GM(false);)
104DEF_GM(return new ComplexClip4GM(true);)
105}