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 16 class SkShader_Blend final : public SkShaderBase { 17 public: SkShader_Blend(SkBlendMode mode,sk_sp<SkShader> dst,sk_sp<SkShader> src)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 SkShader_Blend(sk_sp<SkBlender> blender,sk_sp<SkShader> dst,sk_sp<SkShader> src)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 36 protected: 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 44 private: 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