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