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 SkPictureShader_DEFINED
      9 #define SkPictureShader_DEFINED
     10 
     11 #include "SkShader.h"
     12 
     13 class SkBitmap;
     14 class SkPicture;
     15 
     16 /*
     17  * An SkPictureShader can be used to draw SkPicture-based patterns.
     18  *
     19  * The SkPicture is first rendered into a tile, which is then used to shade the area according
     20  * to specified tiling rules.
     21  */
     22 class SkPictureShader : public SkShader {
     23 public:
     24     static SkPictureShader* Create(const SkPicture*, TileMode, TileMode, const SkMatrix*,
     25                                    const SkRect*);
     26     virtual ~SkPictureShader();
     27 
     28     size_t contextSize() const override;
     29 
     30     SK_TO_STRING_OVERRIDE()
     31     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPictureShader)
     32 
     33     bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix& viewM, const SkMatrix*,
     34                              GrColor*, GrFragmentProcessor**) const override;
     35 
     36 protected:
     37     SkPictureShader(SkReadBuffer&);
     38     void flatten(SkWriteBuffer&) const override;
     39     Context* onCreateContext(const ContextRec&, void* storage) const override;
     40 
     41 private:
     42     SkPictureShader(const SkPicture*, TileMode, TileMode, const SkMatrix*, const SkRect*);
     43 
     44     SkShader* refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix, const int maxTextureSize = 0) const;
     45 
     46     const SkPicture* fPicture;
     47     SkRect           fTile;
     48     TileMode         fTmx, fTmy;
     49 
     50     class PictureShaderContext : public SkShader::Context {
     51     public:
     52         static Context* Create(void* storage, const SkPictureShader&, const ContextRec&,
     53                                SkShader* bitmapShader);
     54 
     55         virtual ~PictureShaderContext();
     56 
     57         uint32_t getFlags() const override;
     58 
     59         ShadeProc asAShadeProc(void** ctx) override;
     60         void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
     61         void shadeSpan16(int x, int y, uint16_t dstC[], int count) override;
     62 
     63     private:
     64         PictureShaderContext(const SkPictureShader&, const ContextRec&, SkShader* bitmapShader);
     65 
     66         SkAutoTUnref<SkShader>  fBitmapShader;
     67         SkShader::Context*      fBitmapShaderContext;
     68         void*                   fBitmapShaderContextStorage;
     69 
     70         typedef SkShader::Context INHERITED;
     71     };
     72 
     73     typedef SkShader INHERITED;
     74 };
     75 
     76 #endif // SkPictureShader_DEFINED
     77