/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkLocalMatrixShader.h" #if SK_SUPPORT_GPU #include "GrFragmentProcessor.h" #endif #if SK_SUPPORT_GPU sk_sp SkLocalMatrixShader::asFragmentProcessor(const AsFPArgs& args) const { SkMatrix tmp = this->getLocalMatrix(); if (args.fLocalMatrix) { tmp.preConcat(*args.fLocalMatrix); } return fProxyShader->asFragmentProcessor(AsFPArgs( args.fContext, args.fViewMatrix, &tmp, args.fFilterQuality, args.fDstColorSpace, args.fGammaTreatment)); } #endif sk_sp SkLocalMatrixShader::CreateProc(SkReadBuffer& buffer) { SkMatrix lm; buffer.readMatrix(&lm); auto baseShader(buffer.readShader()); if (!baseShader) { return nullptr; } return baseShader->makeWithLocalMatrix(lm); } void SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const { buffer.writeMatrix(this->getLocalMatrix()); buffer.writeFlattenable(fProxyShader.get()); } SkShader::Context* SkLocalMatrixShader::onCreateContext(const ContextRec& rec, void* storage) const { ContextRec newRec(rec); SkMatrix tmp; if (rec.fLocalMatrix) { tmp.setConcat(*rec.fLocalMatrix, this->getLocalMatrix()); newRec.fLocalMatrix = &tmp; } else { newRec.fLocalMatrix = &this->getLocalMatrix(); } return fProxyShader->createContext(newRec, storage); } #ifndef SK_IGNORE_TO_STRING void SkLocalMatrixShader::toString(SkString* str) const { str->append("SkLocalMatrixShader: ("); fProxyShader->toString(str); this->INHERITED::toString(str); str->append(")"); } #endif sk_sp SkShader::makeWithLocalMatrix(const SkMatrix& localMatrix) const { if (localMatrix.isIdentity()) { return sk_ref_sp(const_cast(this)); } const SkMatrix* lm = &localMatrix; SkShader* baseShader = const_cast(this); SkMatrix otherLocalMatrix; SkAutoTUnref proxy(this->refAsALocalMatrixShader(&otherLocalMatrix)); if (proxy) { otherLocalMatrix.preConcat(localMatrix); lm = &otherLocalMatrix; baseShader = proxy.get(); } return sk_make_sp(baseShader, *lm); }