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