• 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 
8 #include "gm/gm.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkColor.h"
11 #include "include/core/SkPaint.h"
12 #include "include/core/SkPath.h"
13 #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"
18 #include "src/core/SkClipOpPriv.h"
19 
20 namespace skiagm {
21 
22 //this test exercise SkCanvas::setDeviceClipRestriction behavior
23 class ComplexClip4GM : public GM {
24 public:
ComplexClip4GM(bool aaclip)25   ComplexClip4GM(bool aaclip)
26     : fDoAAClip(aaclip) {
27         this->setBGColor(0xFFDEDFDE);
28     }
29 
30 protected:
31 
32 
onShortName()33     SkString onShortName() {
34         SkString str;
35         str.printf("complexclip4_%s",
36                    fDoAAClip ? "aa" : "bw");
37         return str;
38     }
39 
onISize()40     SkISize onISize() { return SkISize::Make(970, 780); }
41 
onDraw(SkCanvas * canvas)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     }
94 private:
95 
96     bool fDoAAClip;
97 
98     typedef GM INHERITED;
99 };
100 
101 //////////////////////////////////////////////////////////////////////////////
102 
103 DEF_GM(return new ComplexClip4GM(false);)
104 DEF_GM(return new ComplexClip4GM(true);)
105 }
106