complexclip2.cpp revision 45482d1d2b97de185df137a1db40cbe5a62313a5
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
9#include "gm.h"
10#include "SkCanvas.h"
11#include "SkPath.h"
12#include "SkRandom.h"
13
14namespace skiagm {
15
16class ComplexClip2GM : public GM {
17public:
18    ComplexClip2GM() {
19        SkScalar xA =  0 * SK_Scalar1;
20        SkScalar xB = 10 * SK_Scalar1;
21        SkScalar xC = 20 * SK_Scalar1;
22        SkScalar xD = 30 * SK_Scalar1;
23        SkScalar xE = 40 * SK_Scalar1;
24        SkScalar xF = 50 * SK_Scalar1;
25
26        SkScalar yA =  0 * SK_Scalar1;
27        SkScalar yB = 10 * SK_Scalar1;
28        SkScalar yC = 20 * SK_Scalar1;
29        SkScalar yD = 30 * SK_Scalar1;
30        SkScalar yE = 40 * SK_Scalar1;
31        SkScalar yF = 50 * SK_Scalar1;
32
33        fWidth = xF - xA;
34        fHeight = yF - yA;
35
36        fRects[0].set(xB, yB, xE, yE);
37        fRectColors[0] = SK_ColorRED;
38
39        fRects[1].set(xA, yA, xD, yD);
40        fRectColors[1] = SK_ColorGREEN;
41
42        fRects[2].set(xC, yA, xF, yD);
43        fRectColors[2] = SK_ColorBLUE;
44
45        fRects[3].set(xA, yC, xD, yF);
46        fRectColors[3] = SK_ColorYELLOW;
47
48        fRects[4].set(xC, yC, xF, yF);
49        fRectColors[4] = SK_ColorCYAN;
50
51        fTotalWidth = kCols * fWidth + SK_Scalar1 * (kCols + 1) * kPadX;
52        fTotalHeight = kRows * fHeight + SK_Scalar1 * (kRows + 1) * kPadY;
53
54        SkRegion::Op ops[] = {
55            SkRegion::kDifference_Op,
56            SkRegion::kIntersect_Op,
57            SkRegion::kUnion_Op,
58            SkRegion::kXOR_Op,
59            SkRegion::kReverseDifference_Op,
60            SkRegion::kReplace_Op,
61        };
62
63        SkRandom r;
64        for (int i = 0; i < kRows; ++i) {
65            for (int j = 0; j < kCols; ++j) {
66                for (int k = 0; k < 5; ++k) {
67                    fOps[j*kRows+i][k] = ops[r.nextU() % SK_ARRAY_COUNT(ops)];
68                }
69            }
70        }
71    }
72
73protected:
74
75    static const int kRows = 5;
76    static const int kCols = 5;
77    static const int kPadX = 20;
78    static const int kPadY = 20;
79
80    virtual SkString onShortName() {
81        return SkString("complexclip2");
82    }
83
84    virtual SkISize onISize() {
85        return make_isize(SkScalarRoundToInt(fTotalWidth),
86                          SkScalarRoundToInt(fTotalHeight));
87    }
88
89    void drawBG(SkCanvas* canvas) {
90        canvas->drawColor(SkColorSetRGB(0xDD,0xA0,0xDD));
91    }
92
93    virtual void onDraw(SkCanvas* canvas) {
94        this->drawBG(canvas);
95        SkPaint rectPaint;
96        rectPaint.setStyle(SkPaint::kStroke_Style);
97        rectPaint.setStrokeWidth(-1);
98
99        SkPaint fillPaint;
100        fillPaint.setColor(SkColorSetRGB(0xA0,0xDD,0xA0));
101
102        for (int i = 0; i < kRows; ++i) {
103            for (int j = 0; j < kCols; ++j) {
104                canvas->save();
105                canvas->translate(kPadX * SK_Scalar1 + (fWidth + kPadX * SK_Scalar1)*j,
106                                  kPadY * SK_Scalar1 + (fHeight + kPadY * SK_Scalar1)*i);
107                canvas->save();
108                for (int k = 0; k < 5; ++k) {
109                    canvas->clipRect(fRects[k], fOps[j*kRows+i][k]);
110                }
111                canvas->drawRect(SkRect::MakeWH(fWidth, fHeight), fillPaint);
112                canvas->restore();
113                for (int k = 0; k < 5; ++k) {
114                    rectPaint.setColor(fRectColors[k]);
115                    canvas->drawRect(fRects[k], rectPaint);
116                }
117                canvas->restore();
118            }
119        }
120    }
121private:
122    SkRect fRects[5];
123    SkColor fRectColors[5];
124    SkRegion::Op fOps[kRows * kCols][5];
125    SkScalar fWidth;
126    SkScalar fHeight;
127    SkScalar fTotalWidth;
128    SkScalar fTotalHeight;
129
130    typedef GM INHERITED;
131};
132
133//////////////////////////////////////////////////////////////////////////////
134
135static GM* MyFactory(void*) { return new ComplexClip2GM; }
136static GMRegistry reg(MyFactory);
137
138}
139