Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2014 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkLocalMatrixShader.h"
      9 
     10 SkLocalMatrixShader::SkLocalMatrixShader(SkReadBuffer& buffer) : INHERITED(buffer) {
     11     fProxyShader.reset(buffer.readShader());
     12     if (NULL == fProxyShader.get()) {
     13         sk_throw();
     14     }
     15 }
     16 
     17 void SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const {
     18     this->INHERITED::flatten(buffer);
     19     buffer.writeFlattenable(fProxyShader.get());
     20 }
     21 
     22 SkShader::Context* SkLocalMatrixShader::onCreateContext(const ContextRec& rec,
     23                                                         void* storage) const {
     24     ContextRec newRec(rec);
     25     SkMatrix tmp;
     26     if (rec.fLocalMatrix) {
     27         tmp.setConcat(this->getLocalMatrix(), *rec.fLocalMatrix);
     28         newRec.fLocalMatrix = &tmp;
     29     } else {
     30         newRec.fLocalMatrix = &this->getLocalMatrix();
     31     }
     32     return fProxyShader->createContext(newRec, storage);
     33 }
     34 
     35 #ifndef SK_IGNORE_TO_STRING
     36 void SkLocalMatrixShader::toString(SkString* str) const {
     37     str->append("SkLocalMatrixShader: (");
     38 
     39     fProxyShader->toString(str);
     40 
     41     this->INHERITED::toString(str);
     42 
     43     str->append(")");
     44 }
     45 #endif
     46 
     47 SkShader* SkShader::CreateLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix) {
     48     if (localMatrix.isIdentity()) {
     49         return SkRef(proxy);
     50     }
     51 
     52     const SkMatrix* lm = &localMatrix;
     53 
     54     SkMatrix otherLocalMatrix;
     55     SkAutoTUnref<SkShader> otherProxy(proxy->refAsALocalMatrixShader(&otherLocalMatrix));
     56     if (otherProxy.get()) {
     57         otherLocalMatrix.preConcat(localMatrix);
     58         lm = &otherLocalMatrix;
     59         proxy = otherProxy.get();
     60     }
     61 
     62     return SkNEW_ARGS(SkLocalMatrixShader, (proxy, *lm));
     63 }
     64