blob: 1389742c3a6a271f4e7c8fc139ab1966dba22709 [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
Florin Malita4aed1382017-05-25 10:38:07 -040011#include "SkShaderBase.h"
Mike Reed7d954ad2016-10-28 15:42:34 -040012#include "SkBlendMode.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013
Florin Malita5769dd22017-07-12 13:31:25 -040014class SkComposeShader final : public SkShaderBase {
reed@android.com8a1c16f2008-12-17 15:59:43 +000015public:
Mike Reed01b2b832017-06-09 10:51:52 -040016 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)
Mike Reed7d954ad2016-10-28 15:42:34 -040020 , fMode(mode)
Mike Reed01b2b832017-06-09 10:51:52 -040021 {
22 SkASSERT(lerpT >= 0 && lerpT <= 1);
23 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000024
wangyix73fa6162015-09-01 09:45:08 -070025#if SK_SUPPORT_GPU
brianosman839345d2016-07-22 11:04:53 -070026 sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
wangyix73fa6162015-09-01 09:45:08 -070027#endif
28
Mike Reed01b2b832017-06-09 10:51:52 -040029#ifdef SK_DEBUGx
reed8a21c9f2016-03-08 18:50:00 -080030 SkShader* getShaderA() { return fShaderA.get(); }
31 SkShader* getShaderB() { return fShaderB.get(); }
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000032#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000033
Mike Reeda6aaa302017-06-09 10:29:40 -040034#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
mtklein36352bf2015-03-25 18:17:31 -070035 bool asACompose(ComposeRec* rec) const override;
Mike Reeda6aaa302017-06-09 10:29:40 -040036#endif
commit-bot@chromium.org79590552014-05-13 18:14:45 +000037
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000038 SK_TO_STRING_OVERRIDE()
djsollen@google.comba28d032012-03-26 17:57:35 +000039 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeShader)
40
reed@android.com8a1c16f2008-12-17 15:59:43 +000041protected:
reedcfb6bdf2016-03-29 11:32:50 -070042 SkComposeShader(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070043 void flatten(SkWriteBuffer&) const override;
Mike Klein2814d912017-05-10 12:35:51 -040044 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
Mike Reed9959f722017-05-15 09:34:22 -040045 bool onAppendStages(SkRasterPipeline*, SkColorSpace* dstCS, SkArenaAlloc*,
46 const SkMatrix&, const SkPaint&, const SkMatrix* localM) const override;
reed@android.com8a1c16f2008-12-17 15:59:43 +000047
Mike Reed34042072017-08-08 16:29:22 -040048 bool onIsRasterPipelineOnly(const SkMatrix&) const override { return true; }
Florin Malita7d022e02017-05-15 15:06:39 -040049
reed@android.com8a1c16f2008-12-17 15:59:43 +000050private:
Mike Reed01b2b832017-06-09 10:51:52 -040051 sk_sp<SkShader> fDst;
52 sk_sp<SkShader> fSrc;
53 const float fLerpT;
54 const SkBlendMode fMode;
55
56 bool isJustMode() const { return fLerpT == 1; }
57 bool isJustLerp() const { return fMode == SkBlendMode::kSrc; }
reed@android.com8a1c16f2008-12-17 15:59:43 +000058
Florin Malita4aed1382017-05-25 10:38:07 -040059 typedef SkShaderBase INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +000060};
61
62#endif