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