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