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