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:
SkLocalMatrixShader(SkShader * proxy,const SkMatrix & localMatrix)17     SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
18     : INHERITED(&localMatrix)
19     , fProxyShader(SkRef(proxy))
20     {}
21 
contextSize()22     size_t contextSize() const override {
23         return fProxyShader->contextSize();
24     }
25 
asABitmap(SkBitmap * bitmap,SkMatrix * matrix,TileMode * mode)26     virtual BitmapType asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
27                                  TileMode* mode) const override {
28         return fProxyShader->asABitmap(bitmap, matrix, mode);
29     }
30 
asAGradient(GradientInfo * info)31     GradientType asAGradient(GradientInfo* info) const override {
32         return fProxyShader->asAGradient(info);
33     }
34 
35 #if SK_SUPPORT_GPU
36 
asFragmentProcessor(GrContext * context,const SkPaint & paint,const SkMatrix & viewM,const SkMatrix * localMatrix,GrColor * grColor,GrFragmentProcessor ** fp)37     virtual bool asFragmentProcessor(GrContext* context, const SkPaint& paint,
38                                      const SkMatrix& viewM, const SkMatrix* localMatrix,
39                                      GrColor* grColor, GrFragmentProcessor** fp) const override {
40         SkMatrix tmp = this->getLocalMatrix();
41         if (localMatrix) {
42             tmp.preConcat(*localMatrix);
43         }
44         return fProxyShader->asFragmentProcessor(context, paint, viewM, &tmp, grColor, fp);
45     }
46 
47 #else
48 
asFragmentProcessor(GrContext *,const SkPaint &,const SkMatrix &,const SkMatrix *,GrColor *,GrFragmentProcessor **)49     virtual bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix&,
50                                      const SkMatrix*, GrColor*,
51                                      GrFragmentProcessor**) const override {
52         SkDEBUGFAIL("Should not call in GPU-less build");
53         return false;
54     }
55 
56 #endif
57 
refAsALocalMatrixShader(SkMatrix * localMatrix)58     SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const override {
59         if (localMatrix) {
60             *localMatrix = this->getLocalMatrix();
61         }
62         return SkRef(fProxyShader.get());
63     }
64 
65     SK_TO_STRING_OVERRIDE()
66     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
67 
68 protected:
69     void flatten(SkWriteBuffer&) const override;
70     Context* onCreateContext(const ContextRec&, void*) const override;
71 
72 private:
73     SkAutoTUnref<SkShader> fProxyShader;
74 
75     typedef SkShader INHERITED;
76 };
77 
78 #endif
79