• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 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.h"
9 #include "SkCanvas.h"
10 #include "SkPath.h"
11 
12 namespace skiagm {
13 
14 /** Draw a 2px border around the target, then red behind the target;
15     set the clip to match the target, then draw >> the target in blue.
16 */
17 
draw(SkCanvas * canvas,SkRect & target,int x,int y)18 void draw (SkCanvas* canvas, SkRect& target, int x, int y) {
19     SkPaint borderPaint;
20     borderPaint.setColor(SkColorSetRGB(0x0, 0xDD, 0x0));
21     borderPaint.setAntiAlias(true);
22     SkPaint backgroundPaint;
23     backgroundPaint.setColor(SkColorSetRGB(0xDD, 0x0, 0x0));
24     backgroundPaint.setAntiAlias(true);
25     SkPaint foregroundPaint;
26     foregroundPaint.setColor(SkColorSetRGB(0x0, 0x0, 0xDD));
27     foregroundPaint.setAntiAlias(true);
28 
29     canvas->save();
30     canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
31     target.inset(SkIntToScalar(-2), SkIntToScalar(-2));
32     canvas->drawRect(target, borderPaint);
33     target.inset(SkIntToScalar(2), SkIntToScalar(2));
34     canvas->drawRect(target, backgroundPaint);
35     canvas->clipRect(target, SkRegion::kIntersect_Op, true);
36     target.inset(SkIntToScalar(-4), SkIntToScalar(-4));
37     canvas->drawRect(target, foregroundPaint);
38     canvas->restore();
39 }
40 
draw_square(SkCanvas * canvas,int x,int y)41 void draw_square (SkCanvas* canvas, int x, int y) {
42     SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 10 * SK_Scalar1));
43     draw(canvas, target, x, y);
44 }
45 
draw_column(SkCanvas * canvas,int x,int y)46 void draw_column (SkCanvas* canvas, int x, int y) {
47     SkRect target (SkRect::MakeWH(1 * SK_Scalar1, 10 * SK_Scalar1));
48     draw(canvas, target, x, y);
49 }
50 
draw_bar(SkCanvas * canvas,int x,int y)51 void draw_bar (SkCanvas* canvas, int x, int y) {
52     SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 1 * SK_Scalar1));
53     draw(canvas, target, x, y);
54 }
55 
draw_rect_tests(SkCanvas * canvas)56 void draw_rect_tests (SkCanvas* canvas) {
57     draw_square(canvas, 10, 10);
58     draw_column(canvas, 30, 10);
59     draw_bar(canvas, 10, 30);
60 }
61 
62 /**
63    Test a set of clipping problems discovered while writing blitAntiRect,
64    and test all the code paths through the clipping blitters.
65    Each region should show as a blue center surrounded by a 2px green
66    border, with no red.
67 */
68 
69 class AAClipGM : public GM {
70 public:
AAClipGM()71     AAClipGM() {
72 
73     }
74 
75 protected:
onShortName()76     virtual SkString onShortName() {
77         return SkString("aaclip");
78     }
79 
onISize()80     virtual SkISize onISize() {
81         return make_isize(640, 480);
82     }
83 
onDraw(SkCanvas * canvas)84     virtual void onDraw(SkCanvas* canvas) {
85         // Initial pixel-boundary-aligned draw
86         draw_rect_tests(canvas);
87 
88         // Repeat 4x with .2, .4, .6, .8 px offsets
89         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
90         canvas->translate(SkIntToScalar(50), 0);
91         draw_rect_tests(canvas);
92 
93         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
94         canvas->translate(SkIntToScalar(50), 0);
95         draw_rect_tests(canvas);
96 
97         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
98         canvas->translate(SkIntToScalar(50), 0);
99         draw_rect_tests(canvas);
100 
101         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
102         canvas->translate(SkIntToScalar(50), 0);
103         draw_rect_tests(canvas);
104     }
105 
106 private:
107     typedef GM INHERITED;
108 };
109 
110 //////////////////////////////////////////////////////////////////////////////
111 
MyFactory(void *)112 static GM* MyFactory(void*) { return new AAClipGM; }
113 static GMRegistry reg(MyFactory);
114 
115 }
116