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 #ifndef SkLocalMatrixShader_DEFINED
      9 #define SkLocalMatrixShader_DEFINED
     10 
     11 #include "SkShader.h"
     12 #include "SkReadBuffer.h"
     13 #include "SkWriteBuffer.h"
     14 
     15 class SkLocalMatrixShader : public SkShader {
     16 public:
     17     SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
     18     : INHERITED(&localMatrix)
     19     , fProxyShader(SkRef(proxy))
     20     {}
     21 
     22     size_t contextSize(const ContextRec& rec) const override {
     23         return fProxyShader->contextSize(rec);
     24     }
     25 
     26     GradientType asAGradient(GradientInfo* info) const override {
     27         return fProxyShader->asAGradient(info);
     28     }
     29 
     30 #if SK_SUPPORT_GPU
     31     const GrFragmentProcessor* asFragmentProcessor(GrContext* context, const SkMatrix& viewM,
     32                                                    const SkMatrix* localMatrix,
     33                                                    SkFilterQuality fq) const override {
     34         SkMatrix tmp = this->getLocalMatrix();
     35         if (localMatrix) {
     36             tmp.preConcat(*localMatrix);
     37         }
     38         return fProxyShader->asFragmentProcessor(context, viewM, &tmp, fq);
     39     }
     40 #endif
     41 
     42     SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const override {
     43         if (localMatrix) {
     44             *localMatrix = this->getLocalMatrix();
     45         }
     46         return SkRef(fProxyShader.get());
     47     }
     48 
     49     SK_TO_STRING_OVERRIDE()
     50     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
     51 
     52 protected:
     53     void flatten(SkWriteBuffer&) const override;
     54     Context* onCreateContext(const ContextRec&, void*) const override;
     55 
     56     bool onIsABitmap(SkBitmap* bitmap, SkMatrix* matrix, TileMode* mode) const override {
     57         return fProxyShader->isABitmap(bitmap, matrix, mode);
     58     }
     59 
     60 private:
     61     SkAutoTUnref<SkShader> fProxyShader;
     62 
     63     typedef SkShader INHERITED;
     64 };
     65 
     66 #endif
     67