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