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: 52a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 53a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 54a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 55a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 5632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 5732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com return SkString("composeshader"); 5832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 5932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com virtual SkISize onISize() SK_OVERRIDE { 61ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org return SkISize::Make(120, 120); 6232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 6332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6432f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 6532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6632f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com SkPaint paint; 6732f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 6832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com paint.setColor(SK_ColorGREEN); 6932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 7032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com paint.setShader(fShader); 7132f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint); 7232f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com } 7332f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 74ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprotected: 7532f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com SkShader* fShader; 76ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org 77ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprivate: 7832f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com typedef GM INHERITED ; 7932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com}; 8032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 8158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.orgclass ComposeShaderAlphaGM : public skiagm::GM { 82ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgpublic: 83ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org ComposeShaderAlphaGM() {} 84ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org 85ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgprotected: 86ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual SkString onShortName() SK_OVERRIDE { 87ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org return SkString("composeshader_alpha"); 88ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 89edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 90ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual SkISize onISize() SK_OVERRIDE { 9158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org return SkISize::Make(220, 750); 92ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 93775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com 94775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com virtual uint32_t onGetFlags() const SK_OVERRIDE { 95775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com // we're only off by 1 bit per-component 96775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com return kSkipTiled_Flag; 97775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com } 98775bf661bb161d00d1970670ca3948ccc66582b9reed@google.com 99ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 10058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkShader> shader0(make_shader(SkXfermode::kDstIn_Mode)); 10158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkAutoTUnref<SkShader> shader1(make_shader(SkXfermode::kSrcOver_Mode)); 10258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkShader* shaders[] = { shader0.get(), shader1.get() }; 10358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org 104ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org SkPaint paint; 105ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org paint.setColor(SK_ColorGREEN); 106edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 107ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org const SkRect r = SkRect::MakeXYWH(5, 5, 100, 100); 108edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 10958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) { 11058e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org SkShader* shader = shaders[y]; 11158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->save(); 11258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) { 11358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setAlpha(0xFF); 11458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setShader(NULL); 11558e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->drawRect(r, paint); 116edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 11758e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setAlpha(alpha); 11858e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org paint.setShader(shader); 11958e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->drawRect(r, paint); 120edda70e020630103270c815b7499e8b02271875dskia.committer@gmail.com 12158e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->translate(r.width() + 5, 0); 12258e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org } 12358e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->restore(); 12458e428729b8819c35092684034983973ed43ebb2commit-bot@chromium.org canvas->translate(0, r.height() + 5); 125ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 126ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org } 127ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org}; 128ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.org 12932f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com////////////////////////////////////////////////////////////////////////////// 13032f20eb02cd06fcbacb6ef15dab4a86e5ad7cc03scroggo@google.com 131ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgDEF_GM( return new ComposeShaderGM; ) 132ec7d673999b473e873dae0181b30a26f0c48b18ecommit-bot@chromium.orgDEF_GM( return new ComposeShaderAlphaGM; ) 133