142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com/*
242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * Copyright 2011 Google Inc.
342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com *
442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * found in the LICENSE file.
642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com */
783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org
842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
1042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "SkCanvas.h"
1142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "SkGradientShader.h"
1242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
1342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comnamespace skiagm {
1442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
15dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.orgstatic void makebm(SkBitmap* bm, int w, int h) {
16dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org    bm->allocN32Pixels(w, h);
17dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
1842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
1942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    SkCanvas    canvas(*bm);
2042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    SkScalar    s = SkIntToScalar(SkMin32(w, h));
21dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    const SkPoint     kPts0[] = { { 0, 0 }, { s, s } };
22dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    const SkPoint     kPts1[] = { { s/2, 0 }, { s/2, s } };
23dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    const SkScalar    kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
24dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 };
25dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 };
26f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
2742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
2842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    SkPaint     paint;
2942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
301a9b9640843a64af8d9d90337ec3b3fea663196areed    paint.setShader(SkGradientShader::MakeLinear(kPts0, kColors0, kPos,
311a9b9640843a64af8d9d90337ec3b3fea663196areed                    SK_ARRAY_COUNT(kColors0), SkShader::kClamp_TileMode));
3242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    canvas.drawPaint(paint);
331a9b9640843a64af8d9d90337ec3b3fea663196areed    paint.setShader(SkGradientShader::MakeLinear(kPts1, kColors1, kPos,
341a9b9640843a64af8d9d90337ec3b3fea663196areed                    SK_ARRAY_COUNT(kColors1), SkShader::kClamp_TileMode));
3542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    canvas.drawPaint(paint);
3642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com}
3742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
3842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
3942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
4042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstruct LabeledMatrix {
4142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    SkMatrix    fMatrix;
4242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    const char* fLabel;
4342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com};
4442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
45dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr char kText[] = "B";
46dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kTextLen = SK_ARRAY_COUNT(kText) - 1;
47dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kPointSize = 300;
48a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org
4942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comclass ShaderText3GM : public GM {
5042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.compublic:
5142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    ShaderText3GM() {
5265cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
5342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    }
5442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
5542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comprotected:
5642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
5736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
5842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        return SkString("shadertext3");
5942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    }
6042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
616dc14aab5ea6be87b5b10f17a19737f586708768reed    SkISize onISize() override{ return SkISize::Make(820, 930); }
6242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
64a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org        makebm(&fBmp, kPointSize / 4, kPointSize / 4);
65a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org    }
6642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
6736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
68f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
6942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        SkPaint bmpPaint;
7042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        bmpPaint.setAntiAlias(true);
7193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        bmpPaint.setFilterQuality(kLow_SkFilterQuality);
7242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        bmpPaint.setAlpha(0x80);
73a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org        canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint);
7442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
7542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        SkPaint outlinePaint;
7642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        outlinePaint.setAntiAlias(true);
771818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&outlinePaint);
7842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        outlinePaint.setTextSize(SkIntToScalar(kPointSize));
7942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        outlinePaint.setStyle(SkPaint::kStroke_Style);
8042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        outlinePaint.setStrokeWidth(0.f);
81f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
8242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        canvas->translate(15.f, 15.f);
83f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
8442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        // draw glyphs scaled up
8542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        canvas->scale(2.f, 2.f);
8642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
87dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkShader::TileMode kTileModes[] = {
8842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com            SkShader::kRepeat_TileMode,
8942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com            SkShader::kMirror_TileMode,
9042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        };
91f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
9242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        // position the baseline of the first run
9342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        canvas->translate(0.f, 0.75f * kPointSize);
94f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
9542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        canvas->save();
9642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        int i = 0;
97f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com        for (size_t tm0 = 0; tm0 < SK_ARRAY_COUNT(kTileModes); ++tm0) {
9842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com            for (size_t tm1 = 0; tm1 < SK_ARRAY_COUNT(kTileModes); ++tm1) {
9942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                SkMatrix localM;
10042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                localM.setTranslate(5.f, 5.f);
10142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                localM.postRotate(20);
10242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                localM.postScale(1.15f, .85f);
1039c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org
10442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                SkPaint fillPaint;
10542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                fillPaint.setAntiAlias(true);
1061818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark                sk_tool_utils::set_portable_typeface(&fillPaint);
10742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                fillPaint.setTextSize(SkIntToScalar(kPointSize));
10893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                fillPaint.setFilterQuality(kLow_SkFilterQuality);
1091a9b9640843a64af8d9d90337ec3b3fea663196areed                fillPaint.setShader(SkShader::MakeBitmapShader(fBmp, kTileModes[tm0],
1101a9b9640843a64af8d9d90337ec3b3fea663196areed                                                               kTileModes[tm1], &localM));
11142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
11242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                canvas->drawText(kText, kTextLen, 0, 0, fillPaint);
11342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                canvas->drawText(kText, kTextLen, 0, 0, outlinePaint);
114ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com                SkScalar w = fillPaint.measureText(kText, kTextLen);
11542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                canvas->translate(w + 10.f, 0.f);
11642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                ++i;
11742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                if (!(i % 2)) {
11842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                    canvas->restore();
11942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                    canvas->translate(0, 0.75f * kPointSize);
12042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                    canvas->save();
12142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com                }
12242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com            }
12342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        }
12442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com        canvas->restore();
12542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    }
12642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
12742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comprivate:
128a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org    SkBitmap fBmp;
12942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com    typedef GM INHERITED;
13042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com};
13142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
13242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
13342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com
13442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstatic GM* MyFactory(void*) { return new ShaderText3GM; }
13542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstatic GMRegistry reg(MyFactory);
13642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com}
137