132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com/*
232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com * Copyright 2012 Google Inc.
332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com *
432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com * Use of this source code is governed by a BSD-style license that can be
532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com * found in the LICENSE file.
632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com */
732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "gm.h"
932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
1032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkCanvas.h"
1132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkGradientShader.h"
1232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkGraphics.h"
1332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkShader.h"
1432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkString.h"
1533d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "SkTDArray.h"
1632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
177d954ad797176afedb9262fdea4507d0fc60eb9dMike Reedstatic sk_sp<SkShader> make_shader(SkBlendMode mode) {
1858e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    SkPoint pts[2];
1958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    SkColor colors[2];
20edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
2158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    pts[0].set(0, 0);
2258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    pts[1].set(SkIntToScalar(100), 0);
2358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    colors[0] = SK_ColorRED;
2458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    colors[1] = SK_ColorBLUE;
252ad1aa67c6894696cdd65ec56057f81031d1c24areed    auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
26edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
2758e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    pts[0].set(0, 0);
2858e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    pts[1].set(0, SkIntToScalar(100));
2958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    colors[0] = SK_ColorBLACK;
3058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org    colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
312ad1aa67c6894696cdd65ec56057f81031d1c24areed    auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
32edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
337d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    return SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB), mode);
3458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org}
3558e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org
36ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgclass ComposeShaderGM : public skiagm::GM {
3732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.compublic:
38ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org    ComposeShaderGM() {
397d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        fShader = make_shader(SkBlendMode::kDstIn);
4032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com    }
4132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
4232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.comprotected:
4336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
4432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com        return SkString("composeshader");
4532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com    }
4632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
4736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
48ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org        return SkISize::Make(120, 120);
4932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com    }
5032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
5136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
5232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com        SkPaint paint;
5332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com        paint.setColor(SK_ColorGREEN);
543661bc997620899695041010a750d11dbe8a972dMike Reed        canvas->drawRect(SkRect::MakeWH(100, 100), paint);
5532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com        paint.setShader(fShader);
563661bc997620899695041010a750d11dbe8a972dMike Reed        canvas->drawRect(SkRect::MakeWH(100, 100), paint);
5732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com    }
5832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
59ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprotected:
602ad1aa67c6894696cdd65ec56057f81031d1c24areed    sk_sp<SkShader> fShader;
61ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org
62ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprivate:
6332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com    typedef GM INHERITED ;
6432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com};
6532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
6658e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.orgclass ComposeShaderAlphaGM : public skiagm::GM {
67ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgpublic:
68ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org    ComposeShaderAlphaGM() {}
69ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org
70ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprotected:
7136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
72ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org        return SkString("composeshader_alpha");
73ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org    }
74edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
7536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
76d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        return SkISize::Make(750, 220);
77ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org    }
78775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com
7936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
802ad1aa67c6894696cdd65ec56057f81031d1c24areed        sk_sp<SkShader> shaders[] = {
817d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed            make_shader(SkBlendMode::kDstIn),
827d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed            make_shader(SkBlendMode::kSrcOver),
832ad1aa67c6894696cdd65ec56057f81031d1c24areed        };
8458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org
85ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org        SkPaint paint;
86ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org        paint.setColor(SK_ColorGREEN);
87edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
88ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org        const SkRect r = SkRect::MakeXYWH(5, 5, 100, 100);
89edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
9058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org        for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) {
9158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org            canvas->save();
9258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org            for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) {
9358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org                paint.setAlpha(0xFF);
9496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                paint.setShader(nullptr);
9558e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org                canvas->drawRect(r, paint);
96edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
9758e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org                paint.setAlpha(alpha);
982ad1aa67c6894696cdd65ec56057f81031d1c24areed                paint.setShader(shaders[y]);
9958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org                canvas->drawRect(r, paint);
100edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com
10158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org                canvas->translate(r.width() + 5, 0);
10258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org            }
10358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org            canvas->restore();
10458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org            canvas->translate(0, r.height() + 5);
105ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org        }
106ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org    }
107d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
108d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixprivate:
109d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    typedef GM INHERITED ;
110d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix};
111d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
112d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
113d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix// creates a square bitmap with red background and a green circle in the center
114d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixstatic void draw_color_bm(SkBitmap* bm, int length) {
115d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkPaint paint;
116d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    paint.setColor(SK_ColorGREEN);
117d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
118d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    bm->allocN32Pixels(length, length);
119d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    bm->eraseColor(SK_ColorRED);
120d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
121d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkCanvas canvas(*bm);
122d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    canvas.drawCircle(SkIntToScalar(length/2), SkIntToScalar(length/2), SkIntToScalar(length/2),
123d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix                      paint);
124d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix}
125d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
126d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix// creates a square alpha8 bitmap with transparent background and an opaque circle in the center
127d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixstatic void draw_alpha8_bm(SkBitmap* bm, int length) {
128d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkPaint circlePaint;
129d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    circlePaint.setColor(SK_ColorBLACK);
130d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
131d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    bm->allocPixels(SkImageInfo::MakeA8(length, length));
132d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    bm->eraseColor(SK_ColorTRANSPARENT);
133d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
134d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkCanvas canvas(*bm);
135d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    canvas.drawCircle(SkIntToScalar(length/2), SkIntToScalar(length/2), SkIntToScalar(length/4),
136d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix                      circlePaint);
137d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix}
138d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
139d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix// creates a linear gradient shader
1402ad1aa67c6894696cdd65ec56057f81031d1c24areedstatic sk_sp<SkShader> make_linear_gradient_shader(int length) {
141d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkPoint pts[2];
142d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkColor colors[2];
143d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    pts[0].set(0, 0);
144d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    pts[1].set(SkIntToScalar(length), 0);
145d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    colors[0] = SK_ColorBLUE;
146d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    colors[1] = SkColorSetARGB(0, 0, 0, 0xFF);
1472ad1aa67c6894696cdd65ec56057f81031d1c24areed    return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
148d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix}
149d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
150d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
151d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixclass ComposeShaderBitmapGM : public skiagm::GM {
152d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixpublic:
153b10fe4941b08172378d3d1928959122f106ced37herb    ComposeShaderBitmapGM() {}
1546df611574a3cf8abf2617af0d03a5553bb17360dcaryclark
155b10fe4941b08172378d3d1928959122f106ced37herbprotected:
1566df611574a3cf8abf2617af0d03a5553bb17360dcaryclark    void onOnceBeforeDraw() override {
157d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        draw_color_bm(&fColorBitmap, squareLength);
158d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        draw_alpha8_bm(&fAlpha8Bitmap, squareLength);
159d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        SkMatrix s;
160d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        s.reset();
1612ad1aa67c6894696cdd65ec56057f81031d1c24areed        fColorBitmapShader = SkShader::MakeBitmapShader(fColorBitmap, SkShader::kRepeat_TileMode,
1622ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                        SkShader::kRepeat_TileMode, &s);
1632ad1aa67c6894696cdd65ec56057f81031d1c24areed        fAlpha8BitmapShader = SkShader::MakeBitmapShader(fAlpha8Bitmap, SkShader::kRepeat_TileMode,
1642ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                         SkShader::kRepeat_TileMode, &s);
165d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        fLinearGradientShader = make_linear_gradient_shader(squareLength);
166d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    }
1676df611574a3cf8abf2617af0d03a5553bb17360dcaryclark
168d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkString onShortName() override {
169d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        return SkString("composeshader_bitmap");
170d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    }
171d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
172d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkISize onISize() override {
173d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        return SkISize::Make(7 * (squareLength + 5), 2 * (squareLength + 5));
174d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    }
175d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
176d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    void onDraw(SkCanvas* canvas) override {
1777d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        SkBlendMode mode = SkBlendMode::kDstOver;
178d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
1792ad1aa67c6894696cdd65ec56057f81031d1c24areed        sk_sp<SkShader> shaders[] = {
1802ad1aa67c6894696cdd65ec56057f81031d1c24areed            // gradient should appear over color bitmap
1817d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed            SkShader::MakeComposeShader(fLinearGradientShader, fColorBitmapShader, mode),
1822ad1aa67c6894696cdd65ec56057f81031d1c24areed            // gradient should appear over alpha8 bitmap colorized by the paint color
1837d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed            SkShader::MakeComposeShader(fLinearGradientShader, fAlpha8BitmapShader, mode),
1842ad1aa67c6894696cdd65ec56057f81031d1c24areed        };
185d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
186d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        SkPaint paint;
187d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        paint.setColor(SK_ColorYELLOW);
188d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
189d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        const SkRect r = SkRect::MakeXYWH(0, 0, SkIntToScalar(squareLength),
190d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix                                          SkIntToScalar(squareLength));
191d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
192d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) {
193d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix            canvas->save();
194d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix            for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) {
195d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix                paint.setAlpha(alpha);
1962ad1aa67c6894696cdd65ec56057f81031d1c24areed                paint.setShader(shaders[y]);
197d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix                canvas->drawRect(r, paint);
198d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
199d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix                canvas->translate(r.width() + 5, 0);
200d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix            }
201d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix            canvas->restore();
202d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix            canvas->translate(0, r.height() + 5);
203d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix        }
204d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    }
2059d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
206d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixprivate:
2078681e60b2ccd4cea37128a129f1adf6a6d59bb7dreed    /** This determines the length and width of the bitmaps used in the ComposeShaders.  Values
208d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix     *  above 20 may cause an SkASSERT to fail in SkSmallAllocator. However, larger values will
209d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix     *  work in a release build.  You can change this parameter and then compile a release build
210d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix     *  to have this GM draw larger bitmaps for easier visual inspection.
211d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix     */
212dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int squareLength = 20;
213d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
214d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkBitmap fColorBitmap;
215d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    SkBitmap fAlpha8Bitmap;
2162ad1aa67c6894696cdd65ec56057f81031d1c24areed    sk_sp<SkShader> fColorBitmapShader;
2172ad1aa67c6894696cdd65ec56057f81031d1c24areed    sk_sp<SkShader> fAlpha8BitmapShader;
2182ad1aa67c6894696cdd65ec56057f81031d1c24areed    sk_sp<SkShader> fLinearGradientShader;
219d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix
220d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyix    typedef GM INHERITED;
221ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org};
222ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org
223c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclarkDEF_SIMPLE_GM(composeshader_bitmap2, canvas, 200, 200) {
224c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    int width = 255;
225c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    int height = 255;
226c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    SkTDArray<uint8_t> dst8Storage;
227c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    dst8Storage.setCount(width * height);
228c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    SkTDArray<uint32_t> dst32Storage;
229c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    dst32Storage.setCount(width * height * sizeof(int32_t));
230c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    for (int y = 0; y < height; ++y) {
231c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark        for (int x = 0; x < width; ++x) {
232c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark            dst8Storage[y * width + x] = (y + x) / 2;
233c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark            dst32Storage[y * width + x] = SkPackARGB32(0xFF, x, y, 0);
234c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark        }
235c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    }
236c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    SkPaint paint;
237c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    paint.setAntiAlias(true);
238c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    paint.setColor(SK_ColorBLUE);
239c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    SkRect r = {0, 0, SkIntToScalar(width), SkIntToScalar(height)};
240c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    canvas->drawRect(r, paint);
241c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    SkBitmap skBitmap, skMask;
242c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    SkImageInfo imageInfo = SkImageInfo::Make(width, height,
243c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark            SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
244c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    skBitmap.installPixels(imageInfo, dst32Storage.begin(), width * sizeof(int32_t),
245c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark            nullptr, nullptr, nullptr);
246c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    imageInfo = SkImageInfo::Make(width, height,
247c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark            SkColorType::kAlpha_8_SkColorType, kPremul_SkAlphaType);
248c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    skMask.installPixels(imageInfo, dst8Storage.begin(), width, nullptr, nullptr, nullptr);
249c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    sk_sp<SkImage> skSrc = SkImage::MakeFromBitmap(skBitmap);
250c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    sk_sp<SkShader> skSrcShader =
251c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark        skSrc->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
252c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    sk_sp<SkImage> skMaskImage = SkImage::MakeFromBitmap(skMask);
253c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    sk_sp<SkShader> skMaskShader = skMaskImage->makeShader(
254c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
255c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    paint.setShader(
2567d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        SkShader::MakeComposeShader(skMaskShader, skSrcShader, SkBlendMode::kSrcIn));
257c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark    canvas->drawRect(r, paint);
258c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark}
259c2ad65e94de8c7c178699a2cb211d3a768bfdb90caryclark
26032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com//////////////////////////////////////////////////////////////////////////////
26132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com
262ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgDEF_GM( return new ComposeShaderGM; )
263ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgDEF_GM( return new ComposeShaderAlphaGM; )
264d7059583758a4a500cb4ebfe6b3bc18c86d1816awangyixDEF_GM( return new ComposeShaderBitmapGM; )
265