blob: 71ddc2ec69d401074bb09cc83c2b179f76bc3d9a [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
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#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"
reed@android.com8a1c16f2008-12-17 15:59:43 +000015#include "SkRegion.h"
16#include "SkShader.h"
17#include "SkUtils.h"
18#include "SkXfermode.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000019#include "SkColorPriv.h"
20#include "SkColorFilter.h"
21#include "SkTime.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000022#include "SkTypeface.h"
23
reed8a21c9f2016-03-08 18:50:00 -080024static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000025 SkPoint pts[2];
26 SkColor colors[2];
27
28 pts[0].set(0, 0);
29 pts[1].set(0, SkIntToScalar(bm.height()));
30 colors[0] = SK_ColorBLACK;
31 colors[1] = SkColorSetARGB(0, 0, 0, 0);
reed8a21c9f2016-03-08 18:50:00 -080032 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000033
reed8a21c9f2016-03-08 18:50:00 -080034 auto shaderB = SkShader::MakeBitmapShader(bm,
reed@android.com8a1c16f2008-12-17 15:59:43 +000035 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
36
reed8a21c9f2016-03-08 18:50:00 -080037 SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(SkXfermode::kDstIn_Mode));
reed@android.com8a1c16f2008-12-17 15:59:43 +000038
reed8a21c9f2016-03-08 18:50:00 -080039 return SkShader::MakeComposeShader(std::move(shaderB), std::move(shaderA), mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000040}
41
mike@reedtribe.org5fd92432011-05-05 01:59:48 +000042class ShaderView : public SampleView {
reed@android.com8a1c16f2008-12-17 15:59:43 +000043public:
reed8a21c9f2016-03-08 18:50:00 -080044 sk_sp<SkShader> fShader;
45 SkBitmap fBitmap;
reed@android.com8a1c16f2008-12-17 15:59:43 +000046
rmistry@google.comae933ce2012-08-23 18:19:56 +000047 ShaderView() {
reed@android.com44a63122009-05-30 02:40:28 +000048 SkImageDecoder::DecodeFile("/skimages/logo.gif", &fBitmap);
reed@android.com8a1c16f2008-12-17 15:59:43 +000049
50 SkPoint pts[2];
51 SkColor colors[2];
reed@google.com82065d62011-02-07 15:30:46 +000052
reed@android.com8a1c16f2008-12-17 15:59:43 +000053 pts[0].set(0, 0);
54 pts[1].set(SkIntToScalar(100), 0);
55 colors[0] = SK_ColorRED;
56 colors[1] = SK_ColorBLUE;
reed8a21c9f2016-03-08 18:50:00 -080057 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
reed@google.com82065d62011-02-07 15:30:46 +000058
reed@android.com8a1c16f2008-12-17 15:59:43 +000059 pts[0].set(0, 0);
60 pts[1].set(0, SkIntToScalar(100));
61 colors[0] = SK_ColorBLACK;
62 colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
reed8a21c9f2016-03-08 18:50:00 -080063 auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
reed@google.com82065d62011-02-07 15:30:46 +000064
reed8a21c9f2016-03-08 18:50:00 -080065 SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(SkXfermode::kDstIn_Mode));
reed@android.com8a1c16f2008-12-17 15:59:43 +000066
reed8a21c9f2016-03-08 18:50:00 -080067 fShader = SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB), mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000068 }
reed@google.com82065d62011-02-07 15:30:46 +000069
reed@android.com8a1c16f2008-12-17 15:59:43 +000070protected:
71 // overrides from SkEventSink
mtklein36352bf2015-03-25 18:17:31 -070072 bool onQuery(SkEvent* evt) override {
reed@android.com44a63122009-05-30 02:40:28 +000073 if (SampleCode::TitleQ(*evt)) {
74 SampleCode::TitleR(evt, "Shaders");
75 return true;
76 }
77 return this->INHERITED::onQuery(evt);
reed@android.com8a1c16f2008-12-17 15:59:43 +000078 }
reed@google.com82065d62011-02-07 15:30:46 +000079
mtklein36352bf2015-03-25 18:17:31 -070080 void onDrawContent(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +000081 canvas->drawBitmap(fBitmap, 0, 0);
reed@google.com82065d62011-02-07 15:30:46 +000082
reed@android.com44a63122009-05-30 02:40:28 +000083 canvas->translate(SkIntToScalar(20), SkIntToScalar(120));
reed@google.com82065d62011-02-07 15:30:46 +000084
reed@android.com8a1c16f2008-12-17 15:59:43 +000085 SkPaint paint;
86 SkRect r;
87
88 paint.setColor(SK_ColorGREEN);
89 canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint);
90 paint.setShader(fShader);
91 canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint);
92
93 canvas->translate(SkIntToScalar(110), 0);
94
reed@android.com44a63122009-05-30 02:40:28 +000095 int w = fBitmap.width();
96 int h = fBitmap.height();
97 w = 120;
98 h = 80;
99 r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100
halcanary96fcdcc2015-08-27 07:41:13 -0700101 paint.setShader(nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102 canvas->drawRect(r, paint);
reed8a21c9f2016-03-08 18:50:00 -0800103 paint.setShader(make_bitmapfade(fBitmap));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000104 canvas->drawRect(r, paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 }
reed@google.com82065d62011-02-07 15:30:46 +0000106
reed56263c72015-06-05 11:31:26 -0700107 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
halcanary96fcdcc2015-08-27 07:41:13 -0700108 this->inval(nullptr);
reed@google.com4d5c26d2013-01-08 16:17:50 +0000109 return this->INHERITED::onFindClickHandler(x, y, modi);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000110 }
reed@google.com82065d62011-02-07 15:30:46 +0000111
mtklein36352bf2015-03-25 18:17:31 -0700112 bool onClick(Click* click) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113 return this->INHERITED::onClick(click);
114 }
reed@google.com82065d62011-02-07 15:30:46 +0000115
reed@android.com8a1c16f2008-12-17 15:59:43 +0000116private:
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000117 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000118};
119
120//////////////////////////////////////////////////////////////////////////////
121
122static SkView* MyFactory() { return new ShaderView; }
123static SkViewRegister reg(MyFactory);