1/*
2 * Copyright 2006 The Android Open Source Project
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#ifndef SkComposeShader_DEFINED
9#define SkComposeShader_DEFINED
10
11#include "include/core/SkBlendMode.h"
12#include "src/core/SkBlendModePriv.h"
13#include "src/core/SkBlenderBase.h"
14#include "src/shaders/SkShaderBase.h"
15
16class SkShader_Blend final : public SkShaderBase {
17public:
18    SkShader_Blend(SkBlendMode mode, sk_sp<SkShader> dst, sk_sp<SkShader> src)
19        : fDst(std::move(dst))
20        , fSrc(std::move(src))
21        , fBlender(nullptr)
22        , fMode(mode)
23    {}
24
25    SkShader_Blend(sk_sp<SkBlender> blender, sk_sp<SkShader> dst, sk_sp<SkShader> src)
26        : fDst(std::move(dst))
27        , fSrc(std::move(src))
28        , fBlender(std::move(blender))
29        , fMode((SkBlendMode)kCustom_SkBlendMode)
30    {}
31
32#if SK_SUPPORT_GPU
33    std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
34#endif
35
36protected:
37    SkShader_Blend(SkReadBuffer&);
38    void flatten(SkWriteBuffer&) const override;
39    bool onAppendStages(const SkStageRec&) const override;
40    skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint,
41                          const SkMatrixProvider&, const SkMatrix* localM, const SkColorInfo& dst,
42                          skvm::Uniforms*, SkArenaAlloc*) const override;
43
44private:
45    SK_FLATTENABLE_HOOKS(SkShader_Blend)
46
47    sk_sp<SkShader>     fDst;
48    sk_sp<SkShader>     fSrc;
49    sk_sp<SkBlender>    fBlender;   // if null, use fMode
50    const SkBlendMode   fMode;      // only use if fBlender is null
51
52    using INHERITED = SkShaderBase;
53};
54
55#endif
56