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
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(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
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(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
106private:
107    typedef GM INHERITED;
108};
109
110//////////////////////////////////////////////////////////////////////////////
111
112static GM* MyFactory(void*) { return new AAClipGM; }
113static GMRegistry reg(MyFactory);
114
115}
116