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 "SkShaderBase.h" 12 #include "SkBlendMode.h" 13 14 class SkComposeShader final : public SkShaderBase { 15 public: 16 SkComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src, SkBlendMode mode, float lerpT) 17 : fDst(std::move(dst)) 18 , fSrc(std::move(src)) 19 , fLerpT(lerpT) 20 , fMode(mode) 21 { 22 SkASSERT(lerpT >= 0 && lerpT <= 1); 23 } 24 25 #if SK_SUPPORT_GPU 26 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override; 27 #endif 28 29 #ifdef SK_DEBUGx 30 SkShader* getShaderA() { return fShaderA.get(); } 31 SkShader* getShaderB() { return fShaderB.get(); } 32 #endif 33 34 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 35 bool asACompose(ComposeRec* rec) const override; 36 #endif 37 38 SK_TO_STRING_OVERRIDE() 39 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeShader) 40 41 protected: 42 SkComposeShader(SkReadBuffer&); 43 void flatten(SkWriteBuffer&) const override; 44 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override; 45 bool onAppendStages(const StageRec&) const override; 46 47 bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; } 48 49 private: 50 sk_sp<SkShader> fDst; 51 sk_sp<SkShader> fSrc; 52 const float fLerpT; 53 const SkBlendMode fMode; 54 55 bool isJustMode() const { return fLerpT == 1; } 56 bool isJustLerp() const { return fMode == SkBlendMode::kSrc; } 57 58 typedef SkShaderBase INHERITED; 59 }; 60 61 #endif 62