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