blob: a08fea14a5f1f6ace18bf0833373721998827526 [file] [log] [blame]
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +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
commit-bot@chromium.org5970f622014-05-12 20:42:21 +00008#include "SkLocalMatrixShader.h"
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +00009
bungeman06ca8ec2016-06-09 08:01:03 -070010#if SK_SUPPORT_GPU
11#include "GrFragmentProcessor.h"
12#endif
13
14#if SK_SUPPORT_GPU
Brian Salomonaff329b2017-08-11 09:40:37 -040015std::unique_ptr<GrFragmentProcessor> SkLocalMatrixShader::asFragmentProcessor(
Mike Reede3429e62018-01-19 11:43:34 -050016 const GrFPArgs& args) const {
bungeman06ca8ec2016-06-09 08:01:03 -070017 SkMatrix tmp = this->getLocalMatrix();
brianosman839345d2016-07-22 11:04:53 -070018 if (args.fLocalMatrix) {
19 tmp.preConcat(*args.fLocalMatrix);
bungeman06ca8ec2016-06-09 08:01:03 -070020 }
Brian Salomon4cbb6e62017-10-25 15:12:19 -040021 return as_SB(fProxyShader)
Mike Reede3429e62018-01-19 11:43:34 -050022 ->asFragmentProcessor(GrFPArgs(args.fContext, args.fViewMatrix, &tmp,
Brian Salomon4cbb6e62017-10-25 15:12:19 -040023 args.fFilterQuality, args.fDstColorSpaceInfo));
bungeman06ca8ec2016-06-09 08:01:03 -070024}
25#endif
26
reed60c9b582016-04-03 09:11:13 -070027sk_sp<SkFlattenable> SkLocalMatrixShader::CreateProc(SkReadBuffer& buffer) {
reed9fa60da2014-08-21 07:59:51 -070028 SkMatrix lm;
29 buffer.readMatrix(&lm);
reed8a21c9f2016-03-08 18:50:00 -080030 auto baseShader(buffer.readShader());
reedf880e452015-12-30 13:39:41 -080031 if (!baseShader) {
halcanary96fcdcc2015-08-27 07:41:13 -070032 return nullptr;
reed9fa60da2014-08-21 07:59:51 -070033 }
reed60c9b582016-04-03 09:11:13 -070034 return baseShader->makeWithLocalMatrix(lm);
reed9fa60da2014-08-21 07:59:51 -070035}
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000036
37void SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const {
reed9fa60da2014-08-21 07:59:51 -070038 buffer.writeMatrix(this->getLocalMatrix());
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000039 buffer.writeFlattenable(fProxyShader.get());
40}
41
Florin Malita4aed1382017-05-25 10:38:07 -040042SkShaderBase::Context* SkLocalMatrixShader::onMakeContext(
Herb Derby83e939b2017-02-07 14:25:11 -050043 const ContextRec& rec, SkArenaAlloc* alloc) const
44{
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000045 ContextRec newRec(rec);
46 SkMatrix tmp;
47 if (rec.fLocalMatrix) {
reed3ffade62014-08-06 12:43:09 -070048 tmp.setConcat(*rec.fLocalMatrix, this->getLocalMatrix());
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000049 newRec.fLocalMatrix = &tmp;
50 } else {
scroggoc870d492014-07-11 10:42:12 -070051 newRec.fLocalMatrix = &this->getLocalMatrix();
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000052 }
Florin Malita4aed1382017-05-25 10:38:07 -040053 return as_SB(fProxyShader)->makeContext(newRec, alloc);
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000054}
55
Matt Sarett547a7272017-04-12 11:52:47 -040056SkImage* SkLocalMatrixShader::onIsAImage(SkMatrix* outMatrix, enum TileMode* mode) const {
57 SkMatrix imageMatrix;
58 SkImage* image = fProxyShader->isAImage(&imageMatrix, mode);
59 if (image && outMatrix) {
60 // Local matrix must be applied first so it is on the right side of the concat.
61 *outMatrix = SkMatrix::Concat(imageMatrix, this->getLocalMatrix());
62 }
63
64 return image;
65}
66
Mike Reed1d8c42e2017-08-29 14:58:19 -040067bool SkLocalMatrixShader::onAppendStages(const StageRec& rec) const {
Florin Malita882ccaf2017-01-27 10:51:58 -050068 SkMatrix tmp;
Mike Reed1d8c42e2017-08-29 14:58:19 -040069 if (rec.fLocalM) {
70 tmp.setConcat(*rec.fLocalM, this->getLocalMatrix());
Florin Malita882ccaf2017-01-27 10:51:58 -050071 }
Mike Reed1d8c42e2017-08-29 14:58:19 -040072 StageRec newRec = rec;
73 newRec.fLocalM = rec.fLocalM ? &tmp : &this->getLocalMatrix();
74 return as_SB(fProxyShader)->appendStages(newRec);
Florin Malita882ccaf2017-01-27 10:51:58 -050075}
76
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000077#ifndef SK_IGNORE_TO_STRING
78void SkLocalMatrixShader::toString(SkString* str) const {
79 str->append("SkLocalMatrixShader: (");
skia.committer@gmail.comb2c82c92014-05-08 03:05:29 +000080
Florin Malita4aed1382017-05-25 10:38:07 -040081 as_SB(fProxyShader)->toString(str);
skia.committer@gmail.comb2c82c92014-05-08 03:05:29 +000082
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000083 this->INHERITED::toString(str);
skia.committer@gmail.comb2c82c92014-05-08 03:05:29 +000084
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000085 str->append(")");
86}
87#endif
88
reed150835e2016-03-10 06:36:49 -080089sk_sp<SkShader> SkShader::makeWithLocalMatrix(const SkMatrix& localMatrix) const {
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000090 if (localMatrix.isIdentity()) {
reed150835e2016-03-10 06:36:49 -080091 return sk_ref_sp(const_cast<SkShader*>(this));
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000092 }
skia.committer@gmail.comb2c82c92014-05-08 03:05:29 +000093
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000094 const SkMatrix* lm = &localMatrix;
skia.committer@gmail.comb2c82c92014-05-08 03:05:29 +000095
Ben Wagnera8834bb2016-10-24 11:36:21 -040096 sk_sp<SkShader> baseShader;
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +000097 SkMatrix otherLocalMatrix;
Florin Malita4aed1382017-05-25 10:38:07 -040098 sk_sp<SkShader> proxy(as_SB(this)->makeAsALocalMatrixShader(&otherLocalMatrix));
reedf880e452015-12-30 13:39:41 -080099 if (proxy) {
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +0000100 otherLocalMatrix.preConcat(localMatrix);
101 lm = &otherLocalMatrix;
Ben Wagnera8834bb2016-10-24 11:36:21 -0400102 baseShader = proxy;
103 } else {
104 baseShader = sk_ref_sp(const_cast<SkShader*>(this));
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +0000105 }
skia.committer@gmail.comb2c82c92014-05-08 03:05:29 +0000106
Ben Wagnera8834bb2016-10-24 11:36:21 -0400107 return sk_make_sp<SkLocalMatrixShader>(std::move(baseShader), *lm);
commit-bot@chromium.org8fae2132014-05-07 22:26:37 +0000108}