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