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