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 "include/core/SkM44.h" 13 #include "src/shaders/SkBitmapProcShader.h" 14 #include "src/shaders/SkShaderBase.h" 15 16 class SkImageShader : public SkShaderBase { 17 public: 18 static sk_sp<SkShader> Make(sk_sp<SkImage>, 19 SkTileMode tmx, 20 SkTileMode tmy, 21 const SkSamplingOptions&, 22 const SkMatrix* localMatrix, 23 bool clampAsIfUnpremul = false); 24 25 static sk_sp<SkShader> MakeRaw(sk_sp<SkImage>, 26 SkTileMode tmx, 27 SkTileMode tmy, 28 const SkSamplingOptions&, 29 const SkMatrix* localMatrix); 30 31 // TODO(skbug.com/12784): Requires SkImage to be texture backed, and created SkShader can only 32 // be used on GPU-backed surfaces. 33 static sk_sp<SkShader> MakeSubset(sk_sp<SkImage>, 34 const SkRect& subset, 35 SkTileMode tmx, 36 SkTileMode tmy, 37 const SkSamplingOptions&, 38 const SkMatrix* localMatrix, 39 bool clampAsIfUnpremul = false); 40 41 bool isOpaque() const override; 42 43 #if SK_SUPPORT_GPU 44 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override; 45 #endif 46 47 void addToKey(SkShaderCodeDictionary*, 48 SkBackend, 49 SkPaintParamsKeyBuilder*, 50 SkUniformBlock*) const override; 51 52 static SkM44 CubicResamplerMatrix(float B, float C); 53 54 private: 55 SK_FLATTENABLE_HOOKS(SkImageShader) 56 57 SkImageShader(sk_sp<SkImage>, 58 const SkRect& subset, 59 SkTileMode tmx, 60 SkTileMode tmy, 61 const SkSamplingOptions&, 62 const SkMatrix* localMatrix, 63 bool raw, 64 bool clampAsIfUnpremul); 65 66 void flatten(SkWriteBuffer&) const override; 67 #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT 68 Context* onMakeContext(const ContextRec&, SkArenaAlloc* storage) const override; 69 #endif 70 SkImage* onIsAImage(SkMatrix*, SkTileMode*) const override; 71 72 bool onAppendStages(const SkStageRec&) const override; 73 SkStageUpdater* onAppendUpdatableStages(const SkStageRec&) const override; 74 75 SkUpdatableShader* onUpdatableShader(SkArenaAlloc* alloc) const override; 76 77 skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint, 78 const SkMatrixProvider&, const SkMatrix* localM, const SkColorInfo& dst, 79 skvm::Uniforms* uniforms, SkArenaAlloc*) const override; 80 81 class TransformShader; 82 skvm::Color makeProgram( 83 skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint, 84 const SkMatrixProvider&, const SkMatrix* localM, const SkColorInfo& dst, 85 skvm::Uniforms* uniforms, const TransformShader* coordShader, SkArenaAlloc*) const; 86 87 bool doStages(const SkStageRec&, TransformShader* = nullptr) const; 88 89 sk_sp<SkImage> fImage; 90 const SkSamplingOptions fSampling; 91 const SkTileMode fTileModeX; 92 const SkTileMode fTileModeY; 93 94 // TODO(skbug.com/12784): This is only supported for GPU images currently. 95 // If subset == (0,0,w,h) of the image, then no subset is applied. Subset will not be empty. 96 const SkRect fSubset; 97 98 const bool fRaw; 99 const bool fClampAsIfUnpremul; 100 101 friend class SkShaderBase; 102 using INHERITED = SkShaderBase; 103 }; 104 105 #endif 106