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 "sk_tool_utils.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm {
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void makebm(SkBitmap* bm, int w, int h) {
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bm->allocN32Pixels(w, h);
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bm->eraseColor(SK_ColorTRANSPARENT);
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkCanvas    canvas(*bm);
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar    s = SkIntToScalar(SkMin32(w, h));
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPoint     kPts0[] = { { 0, 0 }, { s, s } };
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPoint     kPts1[] = { { s/2, 0 }, { s/2, s } };
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkScalar    kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 };
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 };
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint     paint;
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setShader(SkGradientShader::MakeLinear(kPts0, kColors0, kPos,
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SK_ARRAY_COUNT(kColors0), SkShader::kClamp_TileMode));
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas.drawPaint(paint);
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setShader(SkGradientShader::MakeLinear(kPts1, kColors1, kPos,
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SK_ARRAY_COUNT(kColors1), SkShader::kClamp_TileMode));
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas.drawPaint(paint);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct LabeledMatrix {
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMatrix    fMatrix;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* fLabel;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr char kText[] = "B";
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int kTextLen = SK_ARRAY_COUNT(kText) - 1;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int kPointSize = 300;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ShaderText3GM : public GM {
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ShaderText3GM() {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("shadertext3");
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override{ return SkISize::Make(820, 930); }
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onOnceBeforeDraw() override {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        makebm(&fBmp, kPointSize / 4, kPointSize / 4);
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint bmpPaint;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bmpPaint.setAntiAlias(true);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bmpPaint.setFilterQuality(kLow_SkFilterQuality);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bmpPaint.setAlpha(0x80);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint outlinePaint;
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        outlinePaint.setAntiAlias(true);
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_tool_utils::set_portable_typeface(&outlinePaint);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        outlinePaint.setTextSize(SkIntToScalar(kPointSize));
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        outlinePaint.setStyle(SkPaint::kStroke_Style);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        outlinePaint.setStrokeWidth(0.f);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(15.f, 15.f);
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // draw glyphs scaled up
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->scale(2.f, 2.f);
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr SkShader::TileMode kTileModes[] = {
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkShader::kRepeat_TileMode,
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkShader::kMirror_TileMode,
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // position the baseline of the first run
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(0.f, 0.75f * kPointSize);
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int i = 0;
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (size_t tm0 = 0; tm0 < SK_ARRAY_COUNT(kTileModes); ++tm0) {
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (size_t tm1 = 0; tm1 < SK_ARRAY_COUNT(kTileModes); ++tm1) {
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkMatrix localM;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                localM.setTranslate(5.f, 5.f);
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                localM.postRotate(20);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                localM.postScale(1.15f, .85f);
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkPaint fillPaint;
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fillPaint.setAntiAlias(true);
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                sk_tool_utils::set_portable_typeface(&fillPaint);
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fillPaint.setTextSize(SkIntToScalar(kPointSize));
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fillPaint.setFilterQuality(kLow_SkFilterQuality);
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fillPaint.setShader(SkShader::MakeBitmapShader(fBmp, kTileModes[tm0],
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                               kTileModes[tm1], &localM));
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawText(kText, kTextLen, 0, 0, fillPaint);
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawText(kText, kTextLen, 0, 0, outlinePaint);
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkScalar w = fillPaint.measureText(kText, kTextLen);
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(w + 10.f, 0.f);
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                ++i;
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                if (!(i % 2)) {
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->restore();
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->translate(0, 0.75f * kPointSize);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->save();
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBitmap fBmp;
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GM INHERITED;
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GM* MyFactory(void*) { return new ShaderText3GM; }
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GMRegistry reg(MyFactory);
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
137