• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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  */
7 #include "gm.h"
8 #include "SkCanvas.h"
9 #include "SkPath.h"
10 #include "SkClipOpPriv.h"
11 
12 namespace skiagm {
13 
14 //this test exercise SkCanvas::setDeviceClipRestriction behavior
15 class ComplexClip4GM : public GM {
16 public:
ComplexClip4GM(bool aaclip)17   ComplexClip4GM(bool aaclip)
18     : fDoAAClip(aaclip) {
19         this->setBGColor(0xFFDEDFDE);
20     }
21 
22 protected:
23 
24 
onShortName()25     SkString onShortName() {
26         SkString str;
27         str.printf("complexclip4_%s",
28                    fDoAAClip ? "aa" : "bw");
29         return str;
30     }
31 
onISize()32     SkISize onISize() { return SkISize::Make(970, 780); }
33 
onDraw(SkCanvas * canvas)34     virtual void onDraw(SkCanvas* canvas) {
35         SkPaint p;
36         p.setAntiAlias(fDoAAClip);
37         p.setColor(SK_ColorYELLOW);
38 
39         canvas->save();
40             // draw a yellow rect through a rect clip
41             canvas->save();
42                 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(100, 100, 300, 300));
43                 canvas->drawColor(SK_ColorGREEN);
44                 canvas->clipRect(SkRect::MakeLTRB(100, 200, 400, 500),
45                                  kReplace_SkClipOp, fDoAAClip);
46                 canvas->drawRect(SkRect::MakeLTRB(100, 200, 400, 500), p);
47             canvas->restore();
48 
49             // draw a yellow rect through a diamond clip
50             canvas->save();
51                 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(500, 100, 800, 300));
52                 canvas->drawColor(SK_ColorGREEN);
53 
54                 SkPath pathClip;
55                 pathClip.moveTo(SkIntToScalar(650),  SkIntToScalar(200));
56                 pathClip.lineTo(SkIntToScalar(900), SkIntToScalar(300));
57                 pathClip.lineTo(SkIntToScalar(650), SkIntToScalar(400));
58                 pathClip.lineTo(SkIntToScalar(650), SkIntToScalar(300));
59                 pathClip.close();
60                 canvas->clipPath(pathClip, kReplace_SkClipOp, fDoAAClip);
61                 canvas->drawRect(SkRect::MakeLTRB(500, 200, 900, 500), p);
62             canvas->restore();
63 
64             // draw a yellow rect through a round rect clip
65             canvas->save();
66                 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(500, 500, 800, 700));
67                 canvas->drawColor(SK_ColorGREEN);
68 
69                 canvas->clipRRect(SkRRect::MakeOval(SkRect::MakeLTRB(500, 600, 900, 750)),
70                                   kReplace_SkClipOp, fDoAAClip);
71                 canvas->drawRect(SkRect::MakeLTRB(500, 600, 900, 750), p);
72             canvas->restore();
73 
74             // fill the clip with yellow color showing that androidFramework_setDeviceClipRestriction
75             // intersects with the current clip
76             canvas->save();
77                 canvas->clipRect(SkRect::MakeLTRB(100, 400, 300, 750),
78                                  kIntersect_SkClipOp, fDoAAClip);
79                 canvas->drawColor(SK_ColorGREEN);
80                 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(150, 450, 250, 700));
81                 canvas->drawColor(SK_ColorYELLOW);
82             canvas->restore();
83 
84         canvas->restore();
85     }
86 private:
87 
88     bool fDoAAClip;
89 
90     typedef GM INHERITED;
91 };
92 
93 //////////////////////////////////////////////////////////////////////////////
94 
95 DEF_GM(return new ComplexClip4GM(false);)
96 DEF_GM(return new ComplexClip4GM(true);)
97 }
98