blob: f130439bdb3d589afd6594fc0f59dc4823b67c73 [file] [log] [blame]
tomhudson@google.comef279d32011-12-21 14:27:14 +00001/*
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
12namespace 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
18void 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(x, y);
31 target.inset(-2, -2);
32 canvas->drawRect(target, borderPaint);
33 target.inset(2, 2);
34 canvas->drawRect(target, backgroundPaint);
35 canvas->clipRect(target, SkRegion::kIntersect_Op, true);
36 target.inset(-4, -4);
37 canvas->drawRect(target, foregroundPaint);
38 canvas->restore();
39}
40
41void 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
46void 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
51void 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
56void 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
69class AAClipGM : public GM {
70public:
71 AAClipGM() {
72
73 }
74
75protected:
76 virtual SkString onShortName() {
77 return SkString("aaclip");
78 }
79
80 virtual SkISize onISize() {
81 return make_isize(640, 480);
82 }
83
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(50, 0);
91 draw_rect_tests(canvas);
92
93 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
94 canvas->translate(50, 0);
95 draw_rect_tests(canvas);
96
97 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
98 canvas->translate(50, 0);
99 draw_rect_tests(canvas);
100
101 canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
102 canvas->translate(50, 0);
103 draw_rect_tests(canvas);
104 }
105
106private:
107 typedef GM INHERITED;
108};
109
110//////////////////////////////////////////////////////////////////////////////
111
112static GM* MyFactory(void*) { return new AAClipGM; }
113static GMRegistry reg(MyFactory);
114
115}