blob: ee1ffb52a0d4af1513131765c056954c788fca18 [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 Malitab00a3602017-07-13 22:34:04 -040011#include "SkAtomics.h"
Florin Malita4aed1382017-05-25 10:38:07 -040012#include "SkShaderBase.h"
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
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000031 SK_TO_STRING_OVERRIDE()
32 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPictureShader)
33
bsalomonc21b09e2015-08-28 18:46:56 -070034#if SK_SUPPORT_GPU
Brian Salomonaff329b2017-08-11 09:40:37 -040035 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070036#endif
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000037
38protected:
39 SkPictureShader(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070040 void flatten(SkWriteBuffer&) const override;
Yuqian Li8d2fb472017-01-30 11:33:46 -050041 bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
42 const SkMatrix&, const SkPaint&, const SkMatrix*) const override;
Herb Derby83e939b2017-02-07 14:25:11 -050043 Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
Matt Sarett28a7ad22017-04-21 15:12:34 -040044 sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
Mike Reed34042072017-08-08 16:29:22 -040045 bool onIsRasterPipelineOnly(const SkMatrix&) const override;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000046
47private:
Matt Sarett28a7ad22017-04-21 15:12:34 -040048 SkPictureShader(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*, const SkRect*,
49 sk_sp<SkColorSpace>);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000050
reed8a21c9f2016-03-08 18:50:00 -080051 sk_sp<SkShader> refBitmapShader(const SkMatrix&, const SkMatrix* localMatrix,
Brian Osman138ea972016-12-16 11:55:18 -050052 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;
73 TileMode fTmx, fTmy;
74
Matt Sarett28a7ad22017-04-21 15:12:34 -040075 // Should never be set by a public constructor. This is only used when onMakeColorSpace()
76 // forces a deferred color space xform.
Florin Malitab00a3602017-07-13 22:34:04 -040077 sk_sp<SkColorSpace> fColorSpace;
78
79 const uint32_t fUniqueID;
80 mutable SkAtomic<bool> fAddedToCache;
Matt Sarett28a7ad22017-04-21 15:12:34 -040081
Florin Malita4aed1382017-05-25 10:38:07 -040082 typedef SkShaderBase INHERITED;
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000083};
84
85#endif // SkPictureShader_DEFINED