blob: 810220ec58bd960c80a6814990b0c86065953dec [file] [log] [blame]
commit-bot@chromium.org5970f622014-05-12 20:42:21 +00001/*
2 * Copyright 2014 Google Inc.
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 SkLocalMatrixShader_DEFINED
9#define SkLocalMatrixShader_DEFINED
10
Florin Malita4aed1382017-05-25 10:38:07 -040011#include "SkShaderBase.h"
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000012#include "SkReadBuffer.h"
13#include "SkWriteBuffer.h"
14
bungeman06ca8ec2016-06-09 08:01:03 -070015class GrFragmentProcessor;
Herb Derby83e939b2017-02-07 14:25:11 -050016class SkArenaAlloc;
Matt Sarett6cc6ae752017-04-18 18:29:12 -040017class SkColorSpaceXformer;
bungeman06ca8ec2016-06-09 08:01:03 -070018
Florin Malita5769dd22017-07-12 13:31:25 -040019class SkLocalMatrixShader final : public SkShaderBase {
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000020public:
Ben Wagnera8834bb2016-10-24 11:36:21 -040021 SkLocalMatrixShader(sk_sp<SkShader> proxy, const SkMatrix& localMatrix)
scroggoc870d492014-07-11 10:42:12 -070022 : INHERITED(&localMatrix)
Ben Wagnera8834bb2016-10-24 11:36:21 -040023 , fProxyShader(std::move(proxy))
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000024 {}
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000025
mtklein36352bf2015-03-25 18:17:31 -070026 GradientType asAGradient(GradientInfo* info) const override {
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000027 return fProxyShader->asAGradient(info);
28 }
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000029
dandov9de5b512014-06-10 14:38:28 -070030#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050031 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
dandov9de5b512014-06-10 14:38:28 -070032#endif
mtklein3f3b3d02014-12-01 11:47:08 -080033
Ben Wagnera8834bb2016-10-24 11:36:21 -040034 sk_sp<SkShader> makeAsALocalMatrixShader(SkMatrix* localMatrix) const override {
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000035 if (localMatrix) {
scroggoc870d492014-07-11 10:42:12 -070036 *localMatrix = this->getLocalMatrix();
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000037 }
Ben Wagnera8834bb2016-10-24 11:36:21 -040038 return fProxyShader;
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000039 }
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000040
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000041protected:
mtklein36352bf2015-03-25 18:17:31 -070042 void flatten(SkWriteBuffer&) const override;
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000043
Mike Reede92aae62018-10-17 10:21:51 -040044#ifdef SK_ENABLE_LEGACY_SHADERCONTEXT
Herb Derby83e939b2017-02-07 14:25:11 -050045 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
Mike Reede92aae62018-10-17 10:21:51 -040046#endif
reed773ceda2016-03-03 18:18:25 -080047
Matt Sarett547a7272017-04-12 11:52:47 -040048 SkImage* onIsAImage(SkMatrix* matrix, TileMode* mode) const override;
Mike Reed627778d2016-09-28 17:13:38 -040049
Mike Reed1d8c42e2017-08-29 14:58:19 -040050 bool onAppendStages(const StageRec&) const override;
Florin Malita882ccaf2017-01-27 10:51:58 -050051
Matt Sarett6cc6ae752017-04-18 18:29:12 -040052 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
Florin Malita4aed1382017-05-25 10:38:07 -040053 return as_SB(fProxyShader)->makeColorSpace(xformer)->makeWithLocalMatrix(
54 this->getLocalMatrix());
Matt Sarett6cc6ae752017-04-18 18:29:12 -040055 }
56
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000057private:
Mike Klein4fee3232018-10-18 17:27:16 -040058 SK_FLATTENABLE_HOOKS(SkLocalMatrixShader)
59
Ben Wagnera8834bb2016-10-24 11:36:21 -040060 sk_sp<SkShader> fProxyShader;
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000061
Florin Malita4aed1382017-05-25 10:38:07 -040062 typedef SkShaderBase INHERITED;
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000063};
64
65#endif