|  | /* | 
|  | * Copyright 2006 The Android Open Source Project | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef SkComposeShader_DEFINED | 
|  | #define SkComposeShader_DEFINED | 
|  |  | 
|  | #include "include/core/SkBlendMode.h" | 
|  | #include "src/shaders/SkShaderBase.h" | 
|  |  | 
|  | class SkShader_Blend final : public SkShaderBase { | 
|  | public: | 
|  | SkShader_Blend(SkBlendMode mode, sk_sp<SkShader> dst, sk_sp<SkShader> src, const SkMatrix* lm) | 
|  | : INHERITED(lm) | 
|  | , fDst(std::move(dst)) | 
|  | , fSrc(std::move(src)) | 
|  | , fMode(mode) | 
|  | {} | 
|  |  | 
|  | #if SK_SUPPORT_GPU | 
|  | std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override; | 
|  | #endif | 
|  |  | 
|  | protected: | 
|  | SkShader_Blend(SkReadBuffer&); | 
|  | void flatten(SkWriteBuffer&) const override; | 
|  | bool onAppendStages(const SkStageRec&) const override; | 
|  |  | 
|  | private: | 
|  | SK_FLATTENABLE_HOOKS(SkShader_Blend) | 
|  |  | 
|  | sk_sp<SkShader>     fDst; | 
|  | sk_sp<SkShader>     fSrc; | 
|  | const SkBlendMode   fMode; | 
|  |  | 
|  | typedef SkShaderBase INHERITED; | 
|  | }; | 
|  |  | 
|  | class SkShader_Lerp final : public SkShaderBase { | 
|  | public: | 
|  | SkShader_Lerp(float weight, sk_sp<SkShader> dst, sk_sp<SkShader> src, const SkMatrix* lm) | 
|  | : INHERITED(lm) | 
|  | , fDst(std::move(dst)) | 
|  | , fSrc(std::move(src)) | 
|  | , fWeight(weight) | 
|  | { | 
|  | SkASSERT(weight >= 0 && weight <= 1); | 
|  | } | 
|  |  | 
|  | #if SK_SUPPORT_GPU | 
|  | std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override; | 
|  | #endif | 
|  |  | 
|  | protected: | 
|  | SkShader_Lerp(SkReadBuffer&); | 
|  | void flatten(SkWriteBuffer&) const override; | 
|  | bool onAppendStages(const SkStageRec&) const override; | 
|  |  | 
|  | private: | 
|  | SK_FLATTENABLE_HOOKS(SkShader_Lerp) | 
|  |  | 
|  | sk_sp<SkShader> fDst; | 
|  | sk_sp<SkShader> fSrc; | 
|  | const float     fWeight; | 
|  |  | 
|  | typedef SkShaderBase INHERITED; | 
|  | }; | 
|  |  | 
|  | class SkShader_LerpRed final : public SkShaderBase { | 
|  | public: | 
|  | SkShader_LerpRed(sk_sp<SkShader> red, sk_sp<SkShader> dst, sk_sp<SkShader> src, | 
|  | const SkMatrix* lm) | 
|  | : INHERITED(lm) | 
|  | , fDst(std::move(dst)) | 
|  | , fSrc(std::move(src)) | 
|  | , fRed(std::move(red)) | 
|  | {} | 
|  |  | 
|  | #if SK_SUPPORT_GPU | 
|  | std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override; | 
|  | #endif | 
|  |  | 
|  | protected: | 
|  | SkShader_LerpRed(SkReadBuffer&); | 
|  | void flatten(SkWriteBuffer&) const override; | 
|  | bool onAppendStages(const SkStageRec&) const override; | 
|  |  | 
|  | private: | 
|  | SK_FLATTENABLE_HOOKS(SkShader_LerpRed) | 
|  |  | 
|  | sk_sp<SkShader> fDst; | 
|  | sk_sp<SkShader> fSrc; | 
|  | sk_sp<SkShader> fRed; | 
|  |  | 
|  | typedef SkShaderBase INHERITED; | 
|  | }; | 
|  |  | 
|  | #endif |