1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkAAClip.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int W = 150;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int H = 200;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_text(SkCanvas* canvas, bool doAA) {
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandom rand;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAntiAlias(doAA);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setLCDRenderText(true);
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setTextSize(SkIntToScalar(20));
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < 200; ++i) {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawString("Hamburgefons",
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20,
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         paint);
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_fill(SkCanvas* canvas, bool doAA) {
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandom rand;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAntiAlias(doAA);
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < 50; ++i) {
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath p;
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(rand.nextU());
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawRect(r, paint);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(rand.nextU());
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.addOval(r);
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawPath(p, paint);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(min <= max);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return min + rand.nextUScalar1() * (max - min);
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandom rand;
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAntiAlias(doAA);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setStyle(SkPaint::kStroke_Style);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setStrokeWidth(strokeWidth);
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < n; ++i) {
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath p;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(rand.nextU());
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawRect(r, paint);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(rand.nextU());
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.addOval(r);
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawPath(p, paint);
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar minx = -SkIntToScalar(W)/4;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar maxx = 5*SkIntToScalar(W)/4;
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar miny = -SkIntToScalar(H)/4;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar maxy = 5*SkIntToScalar(H)/4;
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(rand.nextU());
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawLine(randRange(rand, minx, maxx), randRange(rand, miny, maxy),
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         randRange(rand, minx, maxx), randRange(rand, miny, maxy),
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         paint);
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_hair(SkCanvas* canvas, bool doAA) {
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    show_stroke(canvas, doAA, 0, 150);
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void show_thick(SkCanvas* canvas, bool doAA) {
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    show_stroke(canvas, doAA, SkIntToScalar(5), 50);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void (*CanvasProc)(SkCanvas*, bool);
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ClipView : public SampleView {
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ClipView() {
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkAAClip clip;
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIRect r = { -2, -3, 842, 18 };
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clip.setRect(r);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~ClipView() {
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // overrides from SkEventSink
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual bool onQuery(SkEvent* evt) {
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SampleCode::TitleQ(*evt)) {
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SampleCode::TitleR(evt, "Clip");
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return true;
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->INHERITED::onQuery(evt);
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void onDrawContent(SkCanvas* canvas) {
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawColor(SK_ColorWHITE);
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const CanvasProc gProc[] = {
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            show_text, show_thick, show_hair, show_fill
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath clipPath;
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20));
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//        clipPath.toggleInverseFillType();
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int aa = 0; aa <= 1; ++aa) {
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->save();
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) {
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->clipPath(clipPath, kIntersect_SkClipOp, SkToBool(aa));
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//                canvas->drawColor(SK_ColorWHITE);
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                gProc[i](canvas, SkToBool(aa));
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(W * SK_Scalar1 * 8 / 7, 0);
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->restore();
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(0, H * SK_Scalar1 * 8 / 7);
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SampleView INHERITED;
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new ClipView; }
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory);
165