blob: 4ea44cff8bd4bdea0c5bc8a36c78abeb73df256c [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:
Florin Malita9ab449a2019-07-09 13:22:50 -040016 SkShader_Blend(SkBlendMode mode, sk_sp<SkShader> dst, sk_sp<SkShader> src, const SkMatrix* lm)
17 : INHERITED(lm)
18 , fDst(std::move(dst))
Mike Reed01b2b832017-06-09 10:51:52 -040019 , fSrc(std::move(src))
Mike Reed7d954ad2016-10-28 15:42:34 -040020 , fMode(mode)
Mike Reed9b2c4e92019-04-02 09:54:14 -040021 {}
22
23#if SK_SUPPORT_GPU
24 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
25#endif
26
27protected:
28 SkShader_Blend(SkReadBuffer&);
29 void flatten(SkWriteBuffer&) const override;
30 bool onAppendStages(const SkStageRec&) const override;
31
32private:
33 SK_FLATTENABLE_HOOKS(SkShader_Blend)
34
35 sk_sp<SkShader> fDst;
36 sk_sp<SkShader> fSrc;
37 const SkBlendMode fMode;
38
39 typedef SkShaderBase INHERITED;
40};
41
42class SkShader_Lerp final : public SkShaderBase {
43public:
Florin Malita9ab449a2019-07-09 13:22:50 -040044 SkShader_Lerp(float weight, sk_sp<SkShader> dst, sk_sp<SkShader> src, const SkMatrix* lm)
45 : INHERITED(lm)
46 , fDst(std::move(dst))
Mike Reed9b2c4e92019-04-02 09:54:14 -040047 , fSrc(std::move(src))
48 , fWeight(weight)
Mike Reed01b2b832017-06-09 10:51:52 -040049 {
Mike Reed9b2c4e92019-04-02 09:54:14 -040050 SkASSERT(weight >= 0 && weight <= 1);
Mike Reed01b2b832017-06-09 10:51:52 -040051 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000052
wangyix73fa6162015-09-01 09:45:08 -070053#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050054 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
wangyix73fa6162015-09-01 09:45:08 -070055#endif
56
reed@android.com8a1c16f2008-12-17 15:59:43 +000057protected:
Mike Reed9b2c4e92019-04-02 09:54:14 -040058 SkShader_Lerp(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070059 void flatten(SkWriteBuffer&) const override;
Mike Reed1386b2d2019-03-13 21:15:05 -040060 bool onAppendStages(const SkStageRec&) const override;
reed@android.com8a1c16f2008-12-17 15:59:43 +000061
62private:
Mike Reed9b2c4e92019-04-02 09:54:14 -040063 SK_FLATTENABLE_HOOKS(SkShader_Lerp)
Mike Klein4fee3232018-10-18 17:27:16 -040064
Mike Reed9b2c4e92019-04-02 09:54:14 -040065 sk_sp<SkShader> fDst;
66 sk_sp<SkShader> fSrc;
67 const float fWeight;
reed@android.com8a1c16f2008-12-17 15:59:43 +000068
Florin Malita4aed1382017-05-25 10:38:07 -040069 typedef SkShaderBase INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +000070};
71
Mike Reedc8bea7d2019-04-09 13:55:36 -040072class SkShader_LerpRed final : public SkShaderBase {
73public:
Florin Malita9ab449a2019-07-09 13:22:50 -040074 SkShader_LerpRed(sk_sp<SkShader> red, sk_sp<SkShader> dst, sk_sp<SkShader> src,
75 const SkMatrix* lm)
76 : INHERITED(lm)
77 , fDst(std::move(dst))
Mike Reedc8bea7d2019-04-09 13:55:36 -040078 , fSrc(std::move(src))
79 , fRed(std::move(red))
80 {}
81
82#if SK_SUPPORT_GPU
83 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
84#endif
85
86protected:
87 SkShader_LerpRed(SkReadBuffer&);
88 void flatten(SkWriteBuffer&) const override;
89 bool onAppendStages(const SkStageRec&) const override;
90
91private:
92 SK_FLATTENABLE_HOOKS(SkShader_LerpRed)
93
94 sk_sp<SkShader> fDst;
95 sk_sp<SkShader> fSrc;
96 sk_sp<SkShader> fRed;
97
98 typedef SkShaderBase INHERITED;
99};
100
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101#endif