SkPictureShader.h revision 001f4ed2fb62ecdc98ce2884d925de11b7516d23
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 13class SkBitmap; 14class 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 */ 22class SkPictureShader : public SkShader { 23public: 24 static SkPictureShader* Create(SkPicture*, TileMode, TileMode); 25 virtual ~SkPictureShader(); 26 27 virtual bool validContext(const SkBitmap&, const SkPaint&, 28 const SkMatrix&, SkMatrix* totalInverse = NULL) const SK_OVERRIDE; 29 virtual SkShader::Context* createContext(const SkBitmap& device, const SkPaint& paint, 30 const SkMatrix& matrix, void* storage) const 31 SK_OVERRIDE; 32 virtual size_t contextSize() const SK_OVERRIDE; 33 34 class PictureShaderContext : public SkShader::Context { 35 public: 36 PictureShaderContext(const SkPictureShader& shader, const SkBitmap& device, 37 const SkPaint& paint, const SkMatrix& matrix, 38 SkShader* bitmapShader); 39 virtual ~PictureShaderContext(); 40 41 virtual uint32_t getFlags() const SK_OVERRIDE; 42 43 virtual ShadeProc asAShadeProc(void** ctx) SK_OVERRIDE; 44 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE; 45 virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) SK_OVERRIDE; 46 47 private: 48 SkAutoTUnref<SkShader> fBitmapShader; 49 SkShader::Context* fBitmapShaderContext; 50 void* fBitmapShaderContextStorage; 51 52 typedef SkShader::Context INHERITED; 53 }; 54 55 SK_TO_STRING_OVERRIDE() 56 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPictureShader) 57 58#if SK_SUPPORT_GPU 59 GrEffectRef* asNewEffect(GrContext*, const SkPaint&) const SK_OVERRIDE; 60#endif 61 62protected: 63 SkPictureShader(SkReadBuffer&); 64 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; 65 66private: 67 SkPictureShader(SkPicture*, TileMode, TileMode); 68 69 SkShader* validInternal(const SkBitmap& device, const SkPaint& paint, 70 const SkMatrix& matrix, SkMatrix* totalInverse) const; 71 72 SkShader* buildBitmapShader(const SkMatrix&) const; 73 74 SkPicture* fPicture; 75 TileMode fTmx, fTmy; 76 77 mutable SkMutex fCachedBitmapShaderMutex; 78 mutable SkAutoTUnref<SkShader> fCachedBitmapShader; 79 mutable SkSize fCachedTileScale; 80 mutable SkMatrix fCachedLocalMatrix; 81 82 typedef SkShader INHERITED; 83}; 84 85#endif // SkPictureShader_DEFINED 86