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 109fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkFlattenable* SkLocalMatrixShader::CreateProc(SkReadBuffer& buffer) { 119fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkMatrix lm; 129fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.readMatrix(&lm); 139fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed SkAutoTUnref<SkShader> shader(buffer.readShader()); 149fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed if (!shader.get()) { 159fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return NULL; 169fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed } 179fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed return SkShader::CreateLocalMatrixShader(shader, lm); 189fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed} 198fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 208fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgvoid SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const { 219fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed buffer.writeMatrix(this->getLocalMatrix()); 228fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org buffer.writeFlattenable(fProxyShader.get()); 238fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 248fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 258fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgSkShader::Context* SkLocalMatrixShader::onCreateContext(const ContextRec& rec, 268fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org void* storage) const { 278fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org ContextRec newRec(rec); 288fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SkMatrix tmp; 298fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (rec.fLocalMatrix) { 303ffade63b3c97604f8aa3fb1a432e8ed0f9ba6e7reed tmp.setConcat(*rec.fLocalMatrix, this->getLocalMatrix()); 318fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org newRec.fLocalMatrix = &tmp; 328fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } else { 33c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo newRec.fLocalMatrix = &this->getLocalMatrix(); 348fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 358fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org return fProxyShader->createContext(newRec, storage); 368fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 378fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 388fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING 398fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgvoid SkLocalMatrixShader::toString(SkString* str) const { 408fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org str->append("SkLocalMatrixShader: ("); 41b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 428fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org fProxyShader->toString(str); 43b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 448fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org this->INHERITED::toString(str); 45b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 468fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org str->append(")"); 478fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 488fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org#endif 498fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 508fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgSkShader* SkShader::CreateLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix) { 519bde31e95ddd82a4a923275bb01265740407dab1sugoi if (NULL == proxy) { 529bde31e95ddd82a4a923275bb01265740407dab1sugoi return NULL; 539bde31e95ddd82a4a923275bb01265740407dab1sugoi } 549bde31e95ddd82a4a923275bb01265740407dab1sugoi 558fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (localMatrix.isIdentity()) { 568fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org return SkRef(proxy); 578fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 58b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 598fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org const SkMatrix* lm = &localMatrix; 60b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 618fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SkMatrix otherLocalMatrix; 628fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SkAutoTUnref<SkShader> otherProxy(proxy->refAsALocalMatrixShader(&otherLocalMatrix)); 638fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (otherProxy.get()) { 648fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org otherLocalMatrix.preConcat(localMatrix); 658fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org lm = &otherLocalMatrix; 668fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org proxy = otherProxy.get(); 678fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org } 68b2c82c99f891e4e846e4959c811661bf68fa43d6skia.committer@gmail.com 698fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org return SkNEW_ARGS(SkLocalMatrixShader, (proxy, *lm)); 708fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 71