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