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 "Sample.h"
10 #include "SkCanvas.h"
11 #include "SkGradientShader.h"
12 #include "SkGraphics.h"
13 #include "SkPath.h"
14 #include "SkRegion.h"
15 #include "SkShader.h"
16 #include "SkUTF.h"
17 #include "SkColorPriv.h"
18 #include "SkColorFilter.h"
19 #include "SkTime.h"
20 #include "SkTypeface.h"
21
make_bitmapfade(const SkBitmap & bm)22 static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
23 SkPoint pts[2];
24 SkColor colors[2];
25
26 pts[0].set(0, 0);
27 pts[1].set(0, SkIntToScalar(bm.height()));
28 colors[0] = SK_ColorBLACK;
29 colors[1] = SkColorSetARGB(0, 0, 0, 0);
30 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
31
32 auto shaderB = SkShader::MakeBitmapShader(bm,
33 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
34
35 return SkShader::MakeComposeShader(std::move(shaderB), std::move(shaderA), SkBlendMode::kDstIn);
36 }
37
38 class ShaderView : public Sample {
39 public:
40 sk_sp<SkShader> fShader;
41 SkBitmap fBitmap;
42
ShaderView()43 ShaderView() {
44 decode_file("/skimages/logo.gif", &fBitmap);
45
46 SkPoint pts[2];
47 SkColor colors[2];
48
49 pts[0].set(0, 0);
50 pts[1].set(SkIntToScalar(100), 0);
51 colors[0] = SK_ColorRED;
52 colors[1] = SK_ColorBLUE;
53 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
54
55 pts[0].set(0, 0);
56 pts[1].set(0, SkIntToScalar(100));
57 colors[0] = SK_ColorBLACK;
58 colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
59 auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
60
61 fShader = SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
62 SkBlendMode::kDstIn);
63 }
64
65 protected:
onQuery(Sample::Event * evt)66 bool onQuery(Sample::Event* evt) override {
67 if (Sample::TitleQ(*evt)) {
68 Sample::TitleR(evt, "Shaders");
69 return true;
70 }
71 return this->INHERITED::onQuery(evt);
72 }
73
onDrawContent(SkCanvas * canvas)74 void onDrawContent(SkCanvas* canvas) override {
75 canvas->drawBitmap(fBitmap, 0, 0);
76
77 canvas->translate(20, 120);
78
79 SkPaint paint;
80 SkRect r;
81
82 paint.setColor(SK_ColorGREEN);
83 canvas->drawRect(SkRect::MakeWH(100, 100), paint);
84 paint.setShader(fShader);
85 canvas->drawRect(SkRect::MakeWH(100, 100), paint);
86
87 canvas->translate(SkIntToScalar(110), 0);
88
89 int w = fBitmap.width();
90 int h = fBitmap.height();
91 w = 120;
92 h = 80;
93 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
94
95 paint.setShader(nullptr);
96 canvas->drawRect(r, paint);
97 paint.setShader(make_bitmapfade(fBitmap));
98 canvas->drawRect(r, paint);
99 }
100
101 private:
102 typedef Sample INHERITED;
103 };
104
105 //////////////////////////////////////////////////////////////////////////////
106
107 DEF_SAMPLE( return new ShaderView(); )
108