18fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org/* 28fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org * Copyright 2014 Google Inc. 38fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org * 48fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 58fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org * found in the LICENSE file. 68fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org */ 78fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 85970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "SkLocalMatrixShader.h" 98fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 109fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 118fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgSkLocalMatrixShader::SkLocalMatrixShader(SkReadBuffer& buffer) : INHERITED(buffer) { 12c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo if (buffer.isVersionLT(SkReadBuffer::kSimplifyLocalMatrix_Version)) { 13c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo buffer.readMatrix(&(INHERITED::fLocalMatrix)); 14c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo } 155970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org fProxyShader.reset(buffer.readShader()); 168fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (NULL == fProxyShader.get()) { 178fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org sk_throw(); 188fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 198fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 209fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif 219fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed 229fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* SkLocalMatrixShader::CreateProc(SkReadBuffer& buffer) { 239fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkMatrix lm; 249fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.readMatrix(&lm); 259fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkAutoTUnref<SkShader> shader(buffer.readShader()); 269fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (!shader.get()) { 279fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 289fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 299fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return SkShader::CreateLocalMatrixShader(shader, lm); 309fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 318fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 328fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgvoid SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const { 339fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.writeMatrix(this->getLocalMatrix()); 348fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org buffer.writeFlattenable(fProxyShader.get()); 358fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 368fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 378fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgSkShader::Context* SkLocalMatrixShader::onCreateContext(const ContextRec& rec, 388fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org void* storage) const { 398fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org ContextRec newRec(rec); 408fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SkMatrix tmp; 418fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (rec.fLocalMatrix) { 423ffade63b3c97604f8aa3fb1a432e8ed0f9ba6e7reed tmp.setConcat(*rec.fLocalMatrix, this->getLocalMatrix()); 438fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org newRec.fLocalMatrix = &tmp; 448fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } else { 45c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo newRec.fLocalMatrix = &this->getLocalMatrix(); 468fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 478fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org return fProxyShader->createContext(newRec, storage); 488fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 498fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 508fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 518fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgvoid SkLocalMatrixShader::toString(SkString* str) const { 528fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org str->append("SkLocalMatrixShader: ("); 53b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 548fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org fProxyShader->toString(str); 55b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 568fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org this->INHERITED::toString(str); 57b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 588fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org str->append(")"); 598fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 608fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org#endif 618fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 628fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgSkShader* SkShader::CreateLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix) { 638fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (localMatrix.isIdentity()) { 648fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org return SkRef(proxy); 658fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 66b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 678fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org const SkMatrix* lm = &localMatrix; 68b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 698fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SkMatrix otherLocalMatrix; 708fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SkAutoTUnref<SkShader> otherProxy(proxy->refAsALocalMatrixShader(&otherLocalMatrix)); 718fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (otherProxy.get()) { 728fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org otherLocalMatrix.preConcat(localMatrix); 738fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org lm = &otherLocalMatrix; 748fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org proxy = otherProxy.get(); 758fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 76b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 778fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org return SkNEW_ARGS(SkLocalMatrixShader, (proxy, *lm)); 788fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 79