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
15class SkArenaAlloc;
16class SkBitmap;
17class 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 */
25class SkPictureShader : public SkShaderBase {
26public:
27 ~SkPictureShader() override;
28
29 static sk_sp<SkShader> Make(sk_sp<SkPicture>, SkTileMode, SkTileMode, const SkMatrix*,
30 const SkRect*);
31
32#if SK_SUPPORT_GPU
33 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
34#endif
35
36protected:
37 SkPictureShader(SkReadBuffer&);
38 void flatten(SkWriteBuffer&) const override;
39 bool onAppendStages(const SkStageRec&) const override;
40 skvm::Color onProgram(skvm::Builder*, skvm::F32 x, skvm::F32 y, skvm::Color paint,
41 const SkMatrix& ctm, const SkMatrix* localM,
42 SkFilterQuality quality, const SkColorInfo& dst,
43 skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const override;
44
45#ifdef SK_ENABLE_LEGACY_SHADERCONTEXT
46 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
47#endif
48
49private:
50 SK_FLATTENABLE_HOOKS(SkPictureShader)
51
52 SkPictureShader(sk_sp<SkPicture>, SkTileMode, SkTileMode, const SkMatrix*, const SkRect*);
53
54 sk_sp<SkShader> refBitmapShader(const SkMatrix&, SkTCopyOnFirstWrite<SkMatrix>* localMatrix,
55 SkColorType dstColorType, SkColorSpace* dstColorSpace,
56 const int maxTextureSize = 0) const;
57
58 class PictureShaderContext : public Context {
59 public:
60 PictureShaderContext(
61 const SkPictureShader&, const ContextRec&, sk_sp<SkShader> bitmapShader, SkArenaAlloc*);
62
63 uint32_t getFlags() const override;
64
65 void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
66
67 sk_sp<SkShader> fBitmapShader;
68 SkShaderBase::Context* fBitmapShaderContext;
69 void* fBitmapShaderContextStorage;
70
71 typedef Context INHERITED;
72 };
73
74 sk_sp<SkPicture> fPicture;
75 SkRect fTile;
76 SkTileMode fTmx, fTmy;
77
78 const uint32_t fUniqueID;
79 mutable std::atomic<bool> fAddedToCache;
80
81 typedef SkShaderBase INHERITED;
82};
83
84#endif // SkPictureShader_DEFINED
85