1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "DecodeFile.h"
9#include "SampleCode.h"
10#include "SkView.h"
11#include "SkCanvas.h"
12#include "SkGradientShader.h"
13#include "SkGraphics.h"
14#include "SkPath.h"
15#include "SkRegion.h"
16#include "SkShader.h"
17#include "SkUtils.h"
18#include "SkColorPriv.h"
19#include "SkColorFilter.h"
20#include "SkTime.h"
21#include "SkTypeface.h"
22
23static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
24    SkPoint pts[2];
25    SkColor colors[2];
26
27    pts[0].set(0, 0);
28    pts[1].set(0, SkIntToScalar(bm.height()));
29    colors[0] = SK_ColorBLACK;
30    colors[1] = SkColorSetARGB(0, 0, 0, 0);
31    auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
32
33    auto shaderB = SkShader::MakeBitmapShader(bm,
34                                              SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
35
36    return SkShader::MakeComposeShader(std::move(shaderB), std::move(shaderA), SkBlendMode::kDstIn);
37}
38
39class ShaderView : public SampleView {
40public:
41    sk_sp<SkShader> fShader;
42    SkBitmap        fBitmap;
43
44    ShaderView() {
45        decode_file("/skimages/logo.gif", &fBitmap);
46
47        SkPoint pts[2];
48        SkColor colors[2];
49
50        pts[0].set(0, 0);
51        pts[1].set(SkIntToScalar(100), 0);
52        colors[0] = SK_ColorRED;
53        colors[1] = SK_ColorBLUE;
54        auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
55
56        pts[0].set(0, 0);
57        pts[1].set(0, SkIntToScalar(100));
58        colors[0] = SK_ColorBLACK;
59        colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
60        auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
61
62        fShader = SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
63                                              SkBlendMode::kDstIn);
64    }
65
66protected:
67    // overrides from SkEventSink
68    bool onQuery(SkEvent* evt) override {
69        if (SampleCode::TitleQ(*evt)) {
70            SampleCode::TitleR(evt, "Shaders");
71            return true;
72        }
73        return this->INHERITED::onQuery(evt);
74    }
75
76    void onDrawContent(SkCanvas* canvas) override {
77        canvas->drawBitmap(fBitmap, 0, 0);
78
79        canvas->translate(20, 120);
80
81        SkPaint paint;
82        SkRect  r;
83
84        paint.setColor(SK_ColorGREEN);
85        canvas->drawRect(SkRect::MakeWH(100, 100), paint);
86        paint.setShader(fShader);
87        canvas->drawRect(SkRect::MakeWH(100, 100), paint);
88
89        canvas->translate(SkIntToScalar(110), 0);
90
91        int w = fBitmap.width();
92        int h = fBitmap.height();
93        w = 120;
94        h = 80;
95        r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
96
97        paint.setShader(nullptr);
98        canvas->drawRect(r, paint);
99        paint.setShader(make_bitmapfade(fBitmap));
100        canvas->drawRect(r, paint);
101    }
102
103    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
104        this->inval(nullptr);
105        return this->INHERITED::onFindClickHandler(x, y, modi);
106    }
107
108    bool onClick(Click* click)  override {
109        return this->INHERITED::onClick(click);
110    }
111
112private:
113    typedef SampleView INHERITED;
114};
115
116//////////////////////////////////////////////////////////////////////////////
117
118static SkView* MyFactory() { return new ShaderView; }
119static SkViewRegister reg(MyFactory);
120