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 "gm.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void test4(SkCanvas* canvas) {
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAntiAlias(true);
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint pts[] = {
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {10, 160}, {610, 160},
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {610, 160}, {10, 160},
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {610, 160}, {610, 160},
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {610, 199}, {610, 199},
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {10, 198}, {610, 198},
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {610, 199}, {10, 199},
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {10, 160}, {10, 160},
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {10, 199}, {10, 199}
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    char verbs[] = {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 1, 1, 1, 4,
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 1, 1, 1, 4,
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 1, 1, 1, 4,
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        0, 1, 1, 1, 4
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPath path;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint* ptPtr = pts;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (size_t i = 0; i < sizeof(verbs); ++i) {
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch ((SkPath::Verb) verbs[i]) {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case SkPath::kMove_Verb:
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                path.moveTo(ptPtr->fX, ptPtr->fY);
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                ++ptPtr;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case SkPath::kLine_Verb:
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                path.lineTo(ptPtr->fX, ptPtr->fY);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                ++ptPtr;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case SkPath::kClose_Verb:
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                path.close();
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            default:
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkASSERT(false);
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect clip = {0, 130, 772, 531};
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->clipRect(clip);
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->drawPath(path, paint);
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr SkBlendMode gModes[] = {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kClear,
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kSrc,
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kDst,
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kSrcOver,
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kDstOver,
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kSrcIn,
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kDstIn,
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kSrcOut,
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kDstOut,
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kSrcATop,
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kDstATop,
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlendMode::kXor,
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst int gWidth = 64;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst int gHeight = 64;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkScalar W = SkIntToScalar(gWidth);
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkScalar H = SkIntToScalar(gHeight);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) {
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAntiAlias(true);
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect r = SkRect::MakeWH(W, H);
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    r.inset(W/10, H/10);
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setColor(SK_ColorBLUE);
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAlpha(a0);
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->drawOval(r, paint);
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setColor(SK_ColorRED);
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setAlpha(a1);
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setBlendMode(mode);
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar offset = SK_Scalar1 / 3;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect rect = SkRect::MakeXYWH(W / 4 + offset,
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                   H / 4 + offset,
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                   W / 2, H / 2);
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->drawRect(rect, paint);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return H;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_bg_shader() {
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBitmap bm;
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bm.allocN32Pixels(2, 2);
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCE,
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                             0xCF, 0xCE);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(6), SkIntToScalar(6));
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkShader::MakeBitmapShader(bm, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode,
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      &m);
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm {
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    class AARectModesGM : public GM {
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint fBGPaint;
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public:
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        AARectModesGM () {
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fBGPaint.setShader(make_bg_shader());
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    protected:
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkString onShortName() override {
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return SkString("aarectmodes");
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkISize onISize() override { return SkISize::Make(640, 480); }
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void onDraw(SkCanvas* canvas) override {
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (false) { // avoid bit rot, suppress warning
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                test4(canvas);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkRect bounds = SkRect::MakeWH(W, H);
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            constexpr SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int alpha = 0; alpha < 4; ++alpha) {
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    if (6 == i) {
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->restore();
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->translate(W * 5, 0);
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->save();
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    }
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawRect(bounds, fBGPaint);
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->saveLayer(&bounds, nullptr);
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkScalar dy = drawCell(canvas, gModes[i],
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           gAlphaValue[alpha & 1],
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           gAlphaValue[alpha & 2]);
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->restore();
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->translate(0, dy * 5 / 4);
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(W * 5 / 4, 0);
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    private:
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        typedef GM INHERITED;
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static GM* MyFactory(void*) { return new AARectModesGM; }
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static GMRegistry reg(MyFactory);
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
178