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