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