blob: b0452e144f2c1e47890e7a0316be4f302e3cb728 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
8#ifndef SkComposeShader_DEFINED
9#define SkComposeShader_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkBlendMode.h"
12#include "src/shaders/SkShaderBase.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013
Mike Reed9b2c4e92019-04-02 09:54:14 -040014class SkShader_Blend final : public SkShaderBase {
reed@android.com8a1c16f2008-12-17 15:59:43 +000015public:
Mike Reed9b2c4e92019-04-02 09:54:14 -040016 SkShader_Blend(SkBlendMode mode, sk_sp<SkShader> dst, sk_sp<SkShader> src)
Mike Reed01b2b832017-06-09 10:51:52 -040017 : fDst(std::move(dst))
18 , fSrc(std::move(src))
Mike Reed7d954ad2016-10-28 15:42:34 -040019 , fMode(mode)
Mike Reed9b2c4e92019-04-02 09:54:14 -040020 {}
21
22#if SK_SUPPORT_GPU
23 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
24#endif
25
26protected:
27 SkShader_Blend(SkReadBuffer&);
28 void flatten(SkWriteBuffer&) const override;
29 bool onAppendStages(const SkStageRec&) const override;
30
31private:
32 SK_FLATTENABLE_HOOKS(SkShader_Blend)
33
34 sk_sp<SkShader> fDst;
35 sk_sp<SkShader> fSrc;
36 const SkBlendMode fMode;
37
38 typedef SkShaderBase INHERITED;
39};
40
41class SkShader_Lerp final : public SkShaderBase {
42public:
43 SkShader_Lerp(float weight, sk_sp<SkShader> dst, sk_sp<SkShader> src)
44 : fDst(std::move(dst))
45 , fSrc(std::move(src))
46 , fWeight(weight)
Mike Reed01b2b832017-06-09 10:51:52 -040047 {
Mike Reed9b2c4e92019-04-02 09:54:14 -040048 SkASSERT(weight >= 0 && weight <= 1);
Mike Reed01b2b832017-06-09 10:51:52 -040049 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000050
wangyix73fa6162015-09-01 09:45:08 -070051#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050052 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
wangyix73fa6162015-09-01 09:45:08 -070053#endif
54
reed@android.com8a1c16f2008-12-17 15:59:43 +000055protected:
Mike Reed9b2c4e92019-04-02 09:54:14 -040056 SkShader_Lerp(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070057 void flatten(SkWriteBuffer&) const override;
Mike Reed1386b2d2019-03-13 21:15:05 -040058 bool onAppendStages(const SkStageRec&) const override;
reed@android.com8a1c16f2008-12-17 15:59:43 +000059
60private:
Mike Reed9b2c4e92019-04-02 09:54:14 -040061 SK_FLATTENABLE_HOOKS(SkShader_Lerp)
Mike Klein4fee3232018-10-18 17:27:16 -040062
Mike Reed9b2c4e92019-04-02 09:54:14 -040063 sk_sp<SkShader> fDst;
64 sk_sp<SkShader> fSrc;
65 const float fWeight;
reed@android.com8a1c16f2008-12-17 15:59:43 +000066
Florin Malita4aed1382017-05-25 10:38:07 -040067 typedef SkShaderBase INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +000068};
69
Mike Reedc8bea7d2019-04-09 13:55:36 -040070class SkShader_LerpRed final : public SkShaderBase {
71public:
72 SkShader_LerpRed(sk_sp<SkShader> red, sk_sp<SkShader> dst, sk_sp<SkShader> src)
73 : fDst(std::move(dst))
74 , fSrc(std::move(src))
75 , fRed(std::move(red))
76 {}
77
78#if SK_SUPPORT_GPU
79 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
80#endif
81
82protected:
83 SkShader_LerpRed(SkReadBuffer&);
84 void flatten(SkWriteBuffer&) const override;
85 bool onAppendStages(const SkStageRec&) const override;
86
87private:
88 SK_FLATTENABLE_HOOKS(SkShader_LerpRed)
89
90 sk_sp<SkShader> fDst;
91 sk_sp<SkShader> fSrc;
92 sk_sp<SkShader> fRed;
93
94 typedef SkShaderBase INHERITED;
95};
96
reed@android.com8a1c16f2008-12-17 15:59:43 +000097#endif