blob: 212da3796e2dc2b94545ee4dcd8f66dd5facff2e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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 */
reed8a21c9f2016-03-08 18:50:00 -08007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkCanvas.h"
9#include "include/core/SkColorFilter.h"
10#include "include/core/SkColorPriv.h"
11#include "include/core/SkGraphics.h"
12#include "include/core/SkPath.h"
13#include "include/core/SkRegion.h"
14#include "include/core/SkShader.h"
15#include "include/core/SkTime.h"
16#include "include/core/SkTypeface.h"
17#include "include/effects/SkGradientShader.h"
18#include "samplecode/DecodeFile.h"
19#include "samplecode/Sample.h"
20#include "src/utils/SkUTF.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000021
reed8a21c9f2016-03-08 18:50:00 -080022static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000023 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);
Mike Reedfae8fce2019-04-03 10:27:45 -040030 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
reed@android.com8a1c16f2008-12-17 15:59:43 +000031
Mike Reed50acf8f2019-04-08 13:20:23 -040032 auto shaderB = bm.makeShader();
reed@android.com8a1c16f2008-12-17 15:59:43 +000033
Mike Reedc8bea7d2019-04-09 13:55:36 -040034 return SkShaders::Blend(SkBlendMode::kDstIn, std::move(shaderB), std::move(shaderA));
reed@android.com8a1c16f2008-12-17 15:59:43 +000035}
36
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040037class ShaderView : public Sample {
reed@android.com8a1c16f2008-12-17 15:59:43 +000038public:
reed8a21c9f2016-03-08 18:50:00 -080039 sk_sp<SkShader> fShader;
40 SkBitmap fBitmap;
reed@android.com8a1c16f2008-12-17 15:59:43 +000041
rmistry@google.comae933ce2012-08-23 18:19:56 +000042 ShaderView() {
msarettd15750c2016-03-18 15:48:49 -070043 decode_file("/skimages/logo.gif", &fBitmap);
reed@android.com8a1c16f2008-12-17 15:59:43 +000044
45 SkPoint pts[2];
46 SkColor colors[2];
reed@google.com82065d62011-02-07 15:30:46 +000047
reed@android.com8a1c16f2008-12-17 15:59:43 +000048 pts[0].set(0, 0);
49 pts[1].set(SkIntToScalar(100), 0);
50 colors[0] = SK_ColorRED;
51 colors[1] = SK_ColorBLUE;
Mike Reedfae8fce2019-04-03 10:27:45 -040052 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
reed@google.com82065d62011-02-07 15:30:46 +000053
reed@android.com8a1c16f2008-12-17 15:59:43 +000054 pts[0].set(0, 0);
55 pts[1].set(0, SkIntToScalar(100));
56 colors[0] = SK_ColorBLACK;
57 colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
Mike Reedfae8fce2019-04-03 10:27:45 -040058 auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
reed@google.com82065d62011-02-07 15:30:46 +000059
Mike Reedc8bea7d2019-04-09 13:55:36 -040060 fShader = SkShaders::Blend(SkBlendMode::kDstIn, std::move(shaderA), std::move(shaderB));
reed@android.com8a1c16f2008-12-17 15:59:43 +000061 }
reed@google.com82065d62011-02-07 15:30:46 +000062
reed@android.com8a1c16f2008-12-17 15:59:43 +000063protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040064 bool onQuery(Sample::Event* evt) override {
65 if (Sample::TitleQ(*evt)) {
66 Sample::TitleR(evt, "Shaders");
reed@android.com44a63122009-05-30 02:40:28 +000067 return true;
68 }
69 return this->INHERITED::onQuery(evt);
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 }
reed@google.com82065d62011-02-07 15:30:46 +000071
mtklein36352bf2015-03-25 18:17:31 -070072 void onDrawContent(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +000073 canvas->drawBitmap(fBitmap, 0, 0);
reed@google.com82065d62011-02-07 15:30:46 +000074
Mike Reed3661bc92017-02-22 13:21:42 -050075 canvas->translate(20, 120);
reed@google.com82065d62011-02-07 15:30:46 +000076
reed@android.com8a1c16f2008-12-17 15:59:43 +000077 SkPaint paint;
78 SkRect r;
79
80 paint.setColor(SK_ColorGREEN);
Mike Reed3661bc92017-02-22 13:21:42 -050081 canvas->drawRect(SkRect::MakeWH(100, 100), paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +000082 paint.setShader(fShader);
Mike Reed3661bc92017-02-22 13:21:42 -050083 canvas->drawRect(SkRect::MakeWH(100, 100), paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +000084
85 canvas->translate(SkIntToScalar(110), 0);
86
reed@android.com44a63122009-05-30 02:40:28 +000087 int w = fBitmap.width();
88 int h = fBitmap.height();
89 w = 120;
90 h = 80;
91 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
reed@android.com8a1c16f2008-12-17 15:59:43 +000092
halcanary96fcdcc2015-08-27 07:41:13 -070093 paint.setShader(nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000094 canvas->drawRect(r, paint);
reed8a21c9f2016-03-08 18:50:00 -080095 paint.setShader(make_bitmapfade(fBitmap));
reed@android.com8a1c16f2008-12-17 15:59:43 +000096 canvas->drawRect(r, paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +000097 }
reed@google.com82065d62011-02-07 15:30:46 +000098
reed@android.com8a1c16f2008-12-17 15:59:43 +000099private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400100 typedef Sample INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101};
102
103//////////////////////////////////////////////////////////////////////////////
104
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400105DEF_SAMPLE( return new ShaderView(); )