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/SkFlattenable.h" 12 #include "include/core/SkImage.h" 13 #include "include/core/SkM44.h" 14 #include "include/core/SkRect.h" 15 #include "include/core/SkRefCnt.h" 16 #include "include/core/SkSamplingOptions.h" 17 #include "include/core/SkTypes.h" 18 #include "src/shaders/SkShaderBase.h" 19 20 class SkArenaAlloc; 21 class SkMatrix; 22 class SkReadBuffer; 23 class SkShader; 24 class SkWriteBuffer; 25 enum class SkTileMode; 26 struct SkStageRec; 27 28 class SkImageShader : public SkShaderBase { 29 public: 30 static sk_sp<SkShader> Make(sk_sp<SkImage>, 31 SkTileMode tmx, 32 SkTileMode tmy, 33 const SkSamplingOptions&, 34 const SkMatrix* localMatrix, 35 bool clampAsIfUnpremul = false); 36 37 static sk_sp<SkShader> MakeRaw(sk_sp<SkImage>, 38 SkTileMode tmx, 39 SkTileMode tmy, 40 const SkSamplingOptions&, 41 const SkMatrix* localMatrix); 42 43 // TODO(skbug.com/12784): Requires SkImage to be texture backed, and created SkShader can only 44 // be used on GPU-backed surfaces. 45 static sk_sp<SkShader> MakeSubset(sk_sp<SkImage>, 46 const SkRect& subset, 47 SkTileMode tmx, 48 SkTileMode tmy, 49 const SkSamplingOptions&, 50 const SkMatrix* localMatrix, 51 bool clampAsIfUnpremul = false); 52 53 SkImageShader(sk_sp<SkImage>, 54 const SkRect& subset, 55 SkTileMode tmx, SkTileMode tmy, 56 const SkSamplingOptions&, 57 bool raw, 58 bool clampAsIfUnpremul); 59 60 bool isOpaque() const override; 61 type()62 ShaderType type() const override { return ShaderType::kImage; } 63 64 static SkM44 CubicResamplerMatrix(float B, float C); 65 tileModeX()66 SkTileMode tileModeX() const { return fTileModeX; } tileModeY()67 SkTileMode tileModeY() const { return fTileModeY; } image()68 sk_sp<SkImage> image() const { return fImage; } sampling()69 SkSamplingOptions sampling() const { return fSampling; } subset()70 SkRect subset() const { return fSubset; } isRaw()71 bool isRaw() const { return fRaw; } 72 73 private: 74 SK_FLATTENABLE_HOOKS(SkImageShader) 75 76 void flatten(SkWriteBuffer&) const override; 77 #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT 78 Context* onMakeContext(const ContextRec&, SkArenaAlloc* storage) const override; 79 #endif 80 SkImage* onIsAImage(SkMatrix*, SkTileMode*) const override; 81 82 bool appendStages(const SkStageRec&, const SkShaders::MatrixRec&) const override; 83 84 sk_sp<SkImage> fImage; 85 const SkSamplingOptions fSampling; 86 const SkTileMode fTileModeX; 87 const SkTileMode fTileModeY; 88 89 // TODO(skbug.com/12784): This is only supported for GPU images currently. 90 // If subset == (0,0,w,h) of the image, then no subset is applied. Subset will not be empty. 91 const SkRect fSubset; 92 93 const bool fRaw; 94 const bool fClampAsIfUnpremul; 95 96 friend class SkShaderBase; 97 using INHERITED = SkShaderBase; 98 }; 99 100 #endif 101