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 "SkComposeShader.h" 1232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkGradientShader.h" 1332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkGraphics.h" 1432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkShader.h" 1532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkString.h" 1632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com#include "SkXfermode.h" 1732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 1858e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.orgstatic SkShader* make_shader(SkXfermode::Mode mode) { 1958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkPoint pts[2]; 2058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkColor colors[2]; 21edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 2258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org pts[0].set(0, 0); 2358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org pts[1].set(SkIntToScalar(100), 0); 2458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org colors[0] = SK_ColorRED; 2558e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org colors[1] = SK_ColorBLUE; 2658e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkShader> shaderA(SkGradientShader::CreateLinear(pts, colors, NULL, 2, 2758e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkShader::kClamp_TileMode)); 28edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 2958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org pts[0].set(0, 0); 3058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org pts[1].set(0, SkIntToScalar(100)); 3158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org colors[0] = SK_ColorBLACK; 3258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org colors[1] = SkColorSetARGB(0x80, 0, 0, 0); 3358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkShader> shaderB(SkGradientShader::CreateLinear(pts, colors, NULL, 2, 3458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkShader::kClamp_TileMode)); 35edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 3658e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(mode)); 37edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 3858e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org return SkNEW_ARGS(SkComposeShader, (shaderA, shaderB, xfer)); 3958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org} 4058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org 41ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgclass ComposeShaderGM : public skiagm::GM { 4232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.compublic: 43ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org ComposeShaderGM() { 4458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org fShader = make_shader(SkXfermode::kDstIn_Mode); 4532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 4632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 47ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual ~ComposeShaderGM() { 4832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com SkSafeUnref(fShader); 4932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 5032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 5132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.comprotected: 5232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 5332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com return SkString("composeshader"); 5432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 5532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 5632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com virtual SkISize onISize() SK_OVERRIDE { 57ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org return SkISize::Make(120, 120); 5832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 5932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 6132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com SkPaint paint; 6332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com paint.setColor(SK_ColorGREEN); 6532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 6632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com paint.setShader(fShader); 6732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 6832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 6932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 70ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprotected: 7132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com SkShader* fShader; 72ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org 73ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprivate: 7432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com typedef GM INHERITED ; 7532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com}; 7632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 7758e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.orgclass ComposeShaderAlphaGM : public skiagm::GM { 78ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgpublic: 79ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org ComposeShaderAlphaGM() {} 80ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org 81ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprotected: 82ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual SkString onShortName() SK_OVERRIDE { 83ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org return SkString("composeshader_alpha"); 84ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 85edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 86ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual SkISize onISize() SK_OVERRIDE { 8758e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org return SkISize::Make(220, 750); 88ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 89775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com 90ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 9158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkShader> shader0(make_shader(SkXfermode::kDstIn_Mode)); 9258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkShader> shader1(make_shader(SkXfermode::kSrcOver_Mode)); 9358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkShader* shaders[] = { shader0.get(), shader1.get() }; 9458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org 95ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org SkPaint paint; 96ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org paint.setColor(SK_ColorGREEN); 97edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 98ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org const SkRect r = SkRect::MakeXYWH(5, 5, 100, 100); 99edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 10058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) { 10158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkShader* shader = shaders[y]; 10258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->save(); 10358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) { 10458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setAlpha(0xFF); 10558e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setShader(NULL); 10658e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->drawRect(r, paint); 107edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 10858e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setAlpha(alpha); 10958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setShader(shader); 11058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->drawRect(r, paint); 111edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 11258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->translate(r.width() + 5, 0); 11358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org } 11458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->restore(); 11558e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->translate(0, r.height() + 5); 116ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 117ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 118ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org}; 119ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org 12032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com////////////////////////////////////////////////////////////////////////////// 12132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 122ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgDEF_GM( return new ComposeShaderGM; ) 123ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgDEF_GM( return new ComposeShaderAlphaGM; ) 124