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 "include/core/SkTileMode.h" 12 #include "src/shaders/SkShaderBase.h" 13 #include <atomic> 14 15 class SkArenaAlloc; 16 class SkBitmap; 17 class SkPicture; 18 19 /* 20 * An SkPictureShader can be used to draw SkPicture-based patterns. 21 * 22 * The SkPicture is first rendered into a tile, which is then used to shade the area according 23 * to specified tiling rules. 24 */ 25 class SkPictureShader : public SkShaderBase { 26 public: 27 static sk_sp<SkShader> Make(sk_sp<SkPicture>, SkTileMode, SkTileMode, SkFilterMode, 28 const SkMatrix*, const SkRect*); 29 30 #if defined(SK_GANESH) 31 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&, 32 const MatrixRec&) const override; 33 #endif 34 #if defined(SK_GRAPHITE) 35 void addToKey(const skgpu::graphite::KeyContext&, 36 skgpu::graphite::PaintParamsKeyBuilder*, 37 skgpu::graphite::PipelineDataGatherer*) const override; 38 #endif 39 40 SkPictureShader(sk_sp<SkPicture>, SkTileMode, SkTileMode, SkFilterMode, const SkRect*); 41 42 protected: 43 SkPictureShader(SkReadBuffer&); 44 void flatten(SkWriteBuffer&) const override; 45 bool appendStages(const SkStageRec&, const MatrixRec&) const override; 46 skvm::Color program(skvm::Builder*, 47 skvm::Coord device, 48 skvm::Coord local, 49 skvm::Color paint, 50 const MatrixRec&, 51 const SkColorInfo& dst, 52 skvm::Uniforms* uniforms, 53 SkArenaAlloc* alloc) const override; 54 55 #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT 56 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override; 57 #endif 58 59 private: 60 SK_FLATTENABLE_HOOKS(SkPictureShader) 61 62 sk_sp<SkShader> rasterShader(const SkMatrix&, 63 SkColorType dstColorType, 64 SkColorSpace* dstColorSpace, 65 const SkSurfaceProps& props) const; 66 67 sk_sp<SkPicture> fPicture; 68 SkRect fTile; 69 SkTileMode fTmx, fTmy; 70 SkFilterMode fFilter; 71 72 using INHERITED = SkShaderBase; 73 }; 74 75 #endif // SkPictureShader_DEFINED 76