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 "SkBitmapProcShader.h"
12 #include "SkColorSpaceXformer.h"
13 #include "SkImage.h"
14 #include "SkShaderBase.h"
15 
16 class SkImageShader : public SkShaderBase {
17 public:
18     static sk_sp<SkShader> Make(sk_sp<SkImage>,
19                                 SkShader::TileMode tx,
20                                 SkShader::TileMode ty,
21                                 const SkMatrix* localMatrix,
22                                 bool clampAsIfUnpremul = false);
23 
24     bool isOpaque() const override;
25 
26     SK_TO_STRING_OVERRIDE()
27     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkImageShader)
28 
29 #if SK_SUPPORT_GPU
30     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
31 #endif
32 
33     static bool IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType, SkAlphaType,
34                                      SkShader::TileMode tx, SkShader::TileMode ty,
35                                      const SkMatrix& localM);
36 
37 private:
38     SkImageShader(sk_sp<SkImage>,
39                   SkShader::TileMode tx,
40                   SkShader::TileMode ty,
41                   const SkMatrix* localMatrix,
42                   bool clampAsIfUnpremul);
43 
44     void flatten(SkWriteBuffer&) const override;
45     Context* onMakeContext(const ContextRec&, SkArenaAlloc* storage) const override;
46 #ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP
47     bool onIsABitmap(SkBitmap*, SkMatrix*, SkShader::TileMode*) const override;
48 #endif
49     SkImage* onIsAImage(SkMatrix*, SkShader::TileMode*) const override;
50 
51     bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override;
52 
53     bool onAppendStages(const StageRec&) const override;
54 
onMakeColorSpace(SkColorSpaceXformer * xformer)55     sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
56         return xformer->apply(fImage.get())->makeShader(fTileModeX, fTileModeY,
57                                                         &this->getLocalMatrix());
58     }
59 
60     sk_sp<SkImage>           fImage;
61     const SkShader::TileMode fTileModeX;
62     const SkShader::TileMode fTileModeY;
63     const bool               fClampAsIfUnpremul;
64 
65     friend class SkShaderBase;
66     typedef SkShaderBase INHERITED;
67 };
68 
69 #endif
70