blob: 2d7e313ddd187a1fc69cbdacdb668caa820621f9 [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 +000041 SK_TO_STRING_OVERRIDE()
42 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000043
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000044protected:
mtklein36352bf2015-03-25 18:17:31 -070045 void flatten(SkWriteBuffer&) const override;
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000046
Herb Derby83e939b2017-02-07 14:25:11 -050047 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
reed773ceda2016-03-03 18:18:25 -080048
Matt Sarett547a7272017-04-12 11:52:47 -040049 SkImage* onIsAImage(SkMatrix* matrix, TileMode* mode) const override;
Mike Reed627778d2016-09-28 17:13:38 -040050
Mike Reed1d8c42e2017-08-29 14:58:19 -040051 bool onAppendStages(const StageRec&) const override;
Florin Malita882ccaf2017-01-27 10:51:58 -050052
Matt Sarett6cc6ae752017-04-18 18:29:12 -040053 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
Florin Malita4aed1382017-05-25 10:38:07 -040054 return as_SB(fProxyShader)->makeColorSpace(xformer)->makeWithLocalMatrix(
55 this->getLocalMatrix());
Matt Sarett6cc6ae752017-04-18 18:29:12 -040056 }
57
Mike Reed627778d2016-09-28 17:13:38 -040058#ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP
reed0f0af232015-09-08 11:02:04 -070059 bool onIsABitmap(SkBitmap* bitmap, SkMatrix* matrix, TileMode* mode) const override {
60 return fProxyShader->isABitmap(bitmap, matrix, mode);
61 }
Mike Reed627778d2016-09-28 17:13:38 -040062#endif
reed0f0af232015-09-08 11:02:04 -070063
Mike Reed34042072017-08-08 16:29:22 -040064 bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override {
Mike Reedeefe9f92017-08-21 11:39:15 -040065 return as_SB(fProxyShader)->isRasterPipelineOnly(SkMatrix::Concat(ctm,
66 this->getLocalMatrix()));
Florin Malita7d022e02017-05-15 15:06:39 -040067 }
68
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000069private:
Ben Wagnera8834bb2016-10-24 11:36:21 -040070 sk_sp<SkShader> fProxyShader;
skia.committer@gmail.come92c68f72014-05-13 03:06:05 +000071
Florin Malita4aed1382017-05-25 10:38:07 -040072 typedef SkShaderBase INHERITED;
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000073};
74
75#endif