blob: 5a01f0ae87050c77a9bb22e087114aa8e80139e5 [file] [log] [blame]
reed856e9d92015-09-30 12:21:45 -07001/*
2 * Copyright 2015 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 SkImageShader_DEFINED
9#define SkImageShader_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkImage.h"
12#include "src/shaders/SkBitmapProcShader.h"
13#include "src/shaders/SkShaderBase.h"
reed856e9d92015-09-30 12:21:45 -070014
Mike Reed9318a6c2019-08-16 16:16:25 -040015// private subclass of SkStageUpdater
16class SkImageStageUpdater;
17
Florin Malita4aed1382017-05-25 10:38:07 -040018class SkImageShader : public SkShaderBase {
reed856e9d92015-09-30 12:21:45 -070019public:
Mike Klein1f313092018-01-03 10:30:21 -050020 static sk_sp<SkShader> Make(sk_sp<SkImage>,
Mike Reede25b4472019-04-02 17:49:12 -040021 SkTileMode tmx,
22 SkTileMode tmy,
Mike Klein1f313092018-01-03 10:30:21 -050023 const SkMatrix* localMatrix,
24 bool clampAsIfUnpremul = false);
reed856e9d92015-09-30 12:21:45 -070025
26 bool isOpaque() const override;
reed856e9d92015-09-30 12:21:45 -070027
reed856e9d92015-09-30 12:21:45 -070028#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050029 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
reed856e9d92015-09-30 12:21:45 -070030#endif
31
Mike Klein1f313092018-01-03 10:30:21 -050032private:
Mike Klein4fee3232018-10-18 17:27:16 -040033 SK_FLATTENABLE_HOOKS(SkImageShader)
34
Mike Klein1f313092018-01-03 10:30:21 -050035 SkImageShader(sk_sp<SkImage>,
Mike Reede25b4472019-04-02 17:49:12 -040036 SkTileMode tmx,
37 SkTileMode tmy,
Mike Klein1f313092018-01-03 10:30:21 -050038 const SkMatrix* localMatrix,
39 bool clampAsIfUnpremul);
40
reed856e9d92015-09-30 12:21:45 -070041 void flatten(SkWriteBuffer&) 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* storage) const override;
Mike Reede92aae62018-10-17 10:21:51 -040044#endif
Mike Reedfae8fce2019-04-03 10:27:45 -040045 SkImage* onIsAImage(SkMatrix*, SkTileMode*) const override;
reed856e9d92015-09-30 12:21:45 -070046
Mike Reed1386b2d2019-03-13 21:15:05 -040047 bool onAppendStages(const SkStageRec&) const override;
Mike Reed9318a6c2019-08-16 16:16:25 -040048 SkStageUpdater* onAppendUpdatableStages(const SkStageRec&) const override;
49
50 bool doStages(const SkStageRec&, SkImageStageUpdater* = nullptr) const;
Mike Klein06a65e22016-11-17 12:39:09 -050051
Mike Reedfae8fce2019-04-03 10:27:45 -040052 sk_sp<SkImage> fImage;
53 const SkTileMode fTileModeX;
54 const SkTileMode fTileModeY;
55 const bool fClampAsIfUnpremul;
reed856e9d92015-09-30 12:21:45 -070056
Florin Malita4aed1382017-05-25 10:38:07 -040057 friend class SkShaderBase;
Florin Malita4aed1382017-05-25 10:38:07 -040058 typedef SkShaderBase INHERITED;
reed856e9d92015-09-30 12:21:45 -070059};
60
61#endif