blob: 4ebf39b70854df0e2773c2ab8c78ccb0e71b6fe7 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkTileMode.h"
12#include "src/shaders/SkShaderBase.h"
Mike Klein015c8992018-08-09 12:23:19 -040013#include <atomic>
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000014
Herb Derby83e939b2017-02-07 14:25:11 -050015class SkArenaAlloc;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000016class 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 */
Florin Malita4aed1382017-05-25 10:38:07 -040025class SkPictureShader : public SkShaderBase {
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000026public:
Florin Malitab00a3602017-07-13 22:34:04 -040027 ~SkPictureShader() override;
28
Mike Reede25b4472019-04-02 17:49:12 -040029 static sk_sp<SkShader> Make(sk_sp<SkPicture>, SkTileMode, SkTileMode, const SkMatrix*,
reed8a21c9f2016-03-08 18:50:00 -080030 const SkRect*);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000031
bsalomonc21b09e2015-08-28 18:46:56 -070032#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050033 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070034#endif
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000035
Hal Canary8a64fa62019-05-30 10:29:40 -040036 SkPicture* isAPicture(SkMatrix*, SkTileMode[2], SkRect* tile) const override;
37
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000038protected:
39 SkPictureShader(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070040 void flatten(SkWriteBuffer&) const override;
Mike Reed1386b2d2019-03-13 21:15:05 -040041 bool onAppendStages(const SkStageRec&) const override;
Mike Reede92aae62018-10-17 10:21:51 -040042#ifdef SK_ENABLE_LEGACY_SHADERCONTEXT
Herb Derby83e939b2017-02-07 14:25:11 -050043 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
Mike Reede92aae62018-10-17 10:21:51 -040044#endif
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000045
46private:
Mike Klein4fee3232018-10-18 17:27:16 -040047 SK_FLATTENABLE_HOOKS(SkPictureShader)
48
Mike Reedfae8fce2019-04-03 10:27:45 -040049 SkPictureShader(sk_sp<SkPicture>, SkTileMode, SkTileMode, const SkMatrix*, const SkRect*);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000050
Florin Malita8f88d892018-04-19 21:07:19 -040051 sk_sp<SkShader> refBitmapShader(const SkMatrix&, SkTCopyOnFirstWrite<SkMatrix>* localMatrix,
Brian Osman2e8f48e2018-10-19 13:50:48 -040052 SkColorType dstColorType, SkColorSpace* dstColorSpace,
reed8a21c9f2016-03-08 18:50:00 -080053 const int maxTextureSize = 0) const;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000054
Florin Malita4aed1382017-05-25 10:38:07 -040055 class PictureShaderContext : public Context {
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +000056 public:
Herb Derby83e939b2017-02-07 14:25:11 -050057 PictureShaderContext(
58 const SkPictureShader&, const ContextRec&, sk_sp<SkShader> bitmapShader, SkArenaAlloc*);
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000059
mtklein36352bf2015-03-25 18:17:31 -070060 uint32_t getFlags() const override;
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000061
mtklein36352bf2015-03-25 18:17:31 -070062 void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000063
Florin Malita4aed1382017-05-25 10:38:07 -040064 sk_sp<SkShader> fBitmapShader;
65 SkShaderBase::Context* fBitmapShaderContext;
66 void* fBitmapShaderContextStorage;
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000067
Florin Malita4aed1382017-05-25 10:38:07 -040068 typedef Context INHERITED;
commit-bot@chromium.orgce56d962014-05-05 18:39:18 +000069 };
skia.committer@gmail.comedda70e2014-05-06 03:06:53 +000070
Florin Malitab00a3602017-07-13 22:34:04 -040071 sk_sp<SkPicture> fPicture;
72 SkRect fTile;
Mike Reedfae8fce2019-04-03 10:27:45 -040073 SkTileMode fTmx, fTmy;
Florin Malitab00a3602017-07-13 22:34:04 -040074
Mike Klein015c8992018-08-09 12:23:19 -040075 const uint32_t fUniqueID;
76 mutable std::atomic<bool> fAddedToCache;
Matt Sarett28a7ad22017-04-21 15:12:34 -040077
Florin Malita4aed1382017-05-25 10:38:07 -040078 typedef SkShaderBase INHERITED;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000079};
80
81#endif // SkPictureShader_DEFINED