summaryrefslogtreecommitdiff
path: root/chromium/third_party/skia/samplecode/SampleShaders.cpp
blob: fb3fec98d865bf3569d90ce44ab5b841a3c68252 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "include/core/SkCanvas.h"
#include "include/core/SkShader.h"
#include "include/effects/SkGradientShader.h"
#include "samplecode/DecodeFile.h"
#include "samplecode/Sample.h"
#include "tools/Resources.h"

namespace {
static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
    SkPoint pts[2] = {
        {0, 0},
        {0, (float)bm.height()},
    };
    SkColor colors[2] = {
        SkColorSetARGB(255, 0, 0, 0),
        SkColorSetARGB(0,   0, 0, 0),
    };
    return SkShaders::Blend(SkBlendMode::kDstIn,
                            bm.makeShader(),
                            SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
                                                         SkTileMode::kClamp));
}

static sk_sp<SkShader> make_blend_shader() {
    SkPoint pts[2];
    SkColor colors[2];

    pts[0].set(0, 0);
    pts[1].set(SkIntToScalar(100), 0);
    colors[0] = SK_ColorRED;
    colors[1] = SK_ColorBLUE;
    auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);

    pts[0].set(0, 0);
    pts[1].set(0, SkIntToScalar(100));
    colors[0] = SK_ColorBLACK;
    colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
    auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);

    return SkShaders::Blend(SkBlendMode::kDstIn, std::move(shaderA), std::move(shaderB));
}

struct ShaderView : public Sample {
    sk_sp<SkShader> fShader;
    sk_sp<SkShader> fShaderFade;
    SkBitmap        fBitmap;

    void onOnceBeforeDraw() override {
        decode_file(GetResourceAsData("images/dog.jpg"), &fBitmap);
        fShader = make_blend_shader();
        fShaderFade = make_bitmapfade(fBitmap);
    }

    SkString name() override { return SkString("Shaders"); }

    void onDrawContent(SkCanvas* canvas) override {
        canvas->drawBitmap(fBitmap, 0, 0);
        canvas->translate(20, 120);

        SkPaint paint;
        paint.setColor(SK_ColorGREEN);
        canvas->drawRect(SkRect{0, 0, 100, 100}, paint);
        paint.setShader(fShader);
        canvas->drawRect(SkRect{0, 0, 100, 100}, paint);

        canvas->translate(SkIntToScalar(110), 0);

        paint.setShader(nullptr);
        canvas->drawRect(SkRect{0, 0, 120, 80}, paint);
        paint.setShader(fShaderFade);
        canvas->drawRect(SkRect{0, 0, 120, 80}, paint);
    }
};
}  // namespace
DEF_SAMPLE( return new ShaderView(); )