• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
11 #include "include/core/SkImage.h"
12 #include "src/shaders/SkBitmapProcShader.h"
13 #include "src/shaders/SkShaderBase.h"
14 
15 // private subclass of SkStageUpdater
16 class SkImageStageUpdater;
17 
18 class SkImageShader : public SkShaderBase {
19 public:
20     static sk_sp<SkShader> Make(sk_sp<SkImage>,
21                                 SkTileMode tmx,
22                                 SkTileMode tmy,
23                                 const SkMatrix* localMatrix,
24                                 bool clampAsIfUnpremul = false);
25 
26     bool isOpaque() const override;
27 
28 #if SK_SUPPORT_GPU
29     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
30 #endif
31 
32 private:
33     SK_FLATTENABLE_HOOKS(SkImageShader)
34 
35     SkImageShader(sk_sp<SkImage>,
36                   SkTileMode tmx,
37                   SkTileMode tmy,
38                   const SkMatrix* localMatrix,
39                   bool clampAsIfUnpremul);
40 
41     void flatten(SkWriteBuffer&) const override;
42 #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT
43     Context* onMakeContext(const ContextRec&, SkArenaAlloc* storage) const override;
44 #endif
45     SkImage* onIsAImage(SkMatrix*, SkTileMode*) const override;
46 
47     bool onAppendStages(const SkStageRec&) const override;
48     SkStageUpdater* onAppendUpdatableStages(const SkStageRec&) const override;
49 
50     bool onProgram(skvm::Builder*,
51                    const SkMatrix& ctm, const SkMatrix* localM,
52                    SkFilterQuality quality, SkColorSpace* dstCS,
53                    skvm::Uniforms* uniforms, SkArenaAlloc*,
54                    skvm::F32 x, skvm::F32 y,
55                    skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
56 
57     bool doStages(const SkStageRec&, SkImageStageUpdater* = nullptr) const;
58 
59     sk_sp<SkImage>   fImage;
60     const SkTileMode fTileModeX;
61     const SkTileMode fTileModeY;
62     const bool       fClampAsIfUnpremul;
63 
64     friend class SkShaderBase;
65     typedef SkShaderBase INHERITED;
66 };
67 
68 #endif
69