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 override {
     23         return fProxyShader->contextSize();
     24     }
     25 
     26     virtual BitmapType asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
     27                                  TileMode* mode) const override {
     28         return fProxyShader->asABitmap(bitmap, matrix, mode);
     29     }
     30 
     31     GradientType asAGradient(GradientInfo* info) const override {
     32         return fProxyShader->asAGradient(info);
     33     }
     34 
     35 #if SK_SUPPORT_GPU
     36 
     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 
     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 
     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