blob: e941c1f35bba06e282b5fb734eb9e536443ca21b [file] [log] [blame]
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +00001/*
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
Florin Malita4aed1382017-05-25 10:38:07 -040011#include "SkShaderBase.h"
Mike Klein015c8992018-08-09 12:23:19 -040012#include <atomic>
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000013
Herb Derby83e939b2017-02-07 14:25:11 -050014class SkArenaAlloc;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000015class SkBitmap;
16class SkPicture;
17
18/*
19 * An SkPictureShader can be used to draw SkPicture-based patterns.
20 *
21 * The SkPicture is first rendered into a tile, which is then used to shade the area according
22 * to specified tiling rules.
23 */
Florin Malita4aed1382017-05-25 10:38:07 -040024class SkPictureShader : public SkShaderBase {
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000025public:
Florin Malitab00a3602017-07-13 22:34:04 -040026 ~SkPictureShader() override;
27
reed7fb4f8b2016-03-11 04:33:52 -080028 static sk_sp<SkShader> Make(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*,
reed8a21c9f2016-03-08 18:50:00 -080029 const SkRect*);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000030
bsalomonc21b09e2015-08-28 18:46:56 -070031#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050032 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070033#endif
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000034
35protected:
36 SkPictureShader(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070037 void flatten(SkWriteBuffer&) const override;
Mike Reed1d8c42e2017-08-29 14:58:19 -040038 bool onAppendStages(const StageRec&) const override;
Mike Reede92aae62018-10-17 10:21:51 -040039#ifdef SK_ENABLE_LEGACY_SHADERCONTEXT
Herb Derby83e939b2017-02-07 14:25:11 -050040 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
Mike Reede92aae62018-10-17 10:21:51 -040041#endif
Matt Sarett28a7ad22017-04-21 15:12:34 -040042 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000043
44private:
Mike Klein4fee3232018-10-18 17:27:16 -040045 SK_FLATTENABLE_HOOKS(SkPictureShader)
46
Matt Sarett28a7ad22017-04-21 15:12:34 -040047 SkPictureShader(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*, const SkRect*,
48 sk_sp<SkColorSpace>);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000049
Florin Malita8f88d892018-04-19 21:07:19 -040050 sk_sp<SkShader> refBitmapShader(const SkMatrix&, SkTCopyOnFirstWrite<SkMatrix>* localMatrix,
Brian Osman2e8f48e2018-10-19 13:50:48 -040051 SkColorType dstColorType, SkColorSpace* dstColorSpace,
reed8a21c9f2016-03-08 18:50:00 -080052 const int maxTextureSize = 0) const;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000053
Florin Malita4aed1382017-05-25 10:38:07 -040054 class PictureShaderContext : public Context {
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +000055 public:
Herb Derby83e939b2017-02-07 14:25:11 -050056 PictureShaderContext(
57 const SkPictureShader&, const ContextRec&, sk_sp<SkShader> bitmapShader, SkArenaAlloc*);
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000058
mtklein36352bf2015-03-25 18:17:31 -070059 uint32_t getFlags() const override;
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000060
mtklein36352bf2015-03-25 18:17:31 -070061 void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000062
Florin Malita4aed1382017-05-25 10:38:07 -040063 sk_sp<SkShader> fBitmapShader;
64 SkShaderBase::Context* fBitmapShaderContext;
65 void* fBitmapShaderContextStorage;
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000066
Florin Malita4aed1382017-05-25 10:38:07 -040067 typedef Context INHERITED;
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +000068 };
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000069
Florin Malitab00a3602017-07-13 22:34:04 -040070 sk_sp<SkPicture> fPicture;
71 SkRect fTile;
72 TileMode fTmx, fTmy;
73
Matt Sarett28a7ad22017-04-21 15:12:34 -040074 // Should never be set by a public constructor. This is only used when onMakeColorSpace()
75 // forces a deferred color space xform.
Florin Malitab00a3602017-07-13 22:34:04 -040076 sk_sp<SkColorSpace> fColorSpace;
77
Mike Klein015c8992018-08-09 12:23:19 -040078 const uint32_t fUniqueID;
79 mutable std::atomic<bool> fAddedToCache;
Matt Sarett28a7ad22017-04-21 15:12:34 -040080
Florin Malita4aed1382017-05-25 10:38:07 -040081 typedef SkShaderBase INHERITED;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000082};
83
84#endif // SkPictureShader_DEFINED