1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPictureShader_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkPictureShader_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFlattenable.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPicture.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/shaders/SkShaderBase.h" 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class SkArenaAlloc; 23*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace; 24*c8dee2aaSAndroid Build Coastguard Worker class SkImage; 25*c8dee2aaSAndroid Build Coastguard Worker class SkReadBuffer; 26*c8dee2aaSAndroid Build Coastguard Worker class SkShader; 27*c8dee2aaSAndroid Build Coastguard Worker class SkSurface; 28*c8dee2aaSAndroid Build Coastguard Worker class SkWriteBuffer; 29*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int; 30*c8dee2aaSAndroid Build Coastguard Worker enum class SkFilterMode; 31*c8dee2aaSAndroid Build Coastguard Worker enum class SkTileMode; 32*c8dee2aaSAndroid Build Coastguard Worker struct SkStageRec; 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /* 35*c8dee2aaSAndroid Build Coastguard Worker * An SkPictureShader can be used to draw SkPicture-based patterns. 36*c8dee2aaSAndroid Build Coastguard Worker * 37*c8dee2aaSAndroid Build Coastguard Worker * The SkPicture is first rendered into a tile, which is then used to shade the area according 38*c8dee2aaSAndroid Build Coastguard Worker * to specified tiling rules. 39*c8dee2aaSAndroid Build Coastguard Worker */ 40*c8dee2aaSAndroid Build Coastguard Worker class SkPictureShader : public SkShaderBase { 41*c8dee2aaSAndroid Build Coastguard Worker public: 42*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkShader> Make(sk_sp<SkPicture>, SkTileMode, SkTileMode, SkFilterMode, 43*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix*, const SkRect*); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker SkPictureShader(sk_sp<SkPicture>, SkTileMode, SkTileMode, SkFilterMode, const SkRect*); 46*c8dee2aaSAndroid Build Coastguard Worker type()47*c8dee2aaSAndroid Build Coastguard Worker ShaderType type() const override { return ShaderType::kPicture; } 48*c8dee2aaSAndroid Build Coastguard Worker picture()49*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPicture> picture() const { return fPicture; } tile()50*c8dee2aaSAndroid Build Coastguard Worker SkRect tile() const { return fTile; } tileModeX()51*c8dee2aaSAndroid Build Coastguard Worker SkTileMode tileModeX() const { return fTmx; } tileModeY()52*c8dee2aaSAndroid Build Coastguard Worker SkTileMode tileModeY() const { return fTmy; } filter()53*c8dee2aaSAndroid Build Coastguard Worker SkFilterMode filter() const { return fFilter; } 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker struct CachedImageInfo { 56*c8dee2aaSAndroid Build Coastguard Worker bool success; 57*c8dee2aaSAndroid Build Coastguard Worker SkSize tileScale; // Additional scale factors to apply when sampling image. 58*c8dee2aaSAndroid Build Coastguard Worker SkMatrix matrixForDraw; // Matrix used to produce an image from the picture 59*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo imageInfo; 60*c8dee2aaSAndroid Build Coastguard Worker SkSurfaceProps props; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker static CachedImageInfo Make(const SkRect& bounds, 63*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& totalM, 64*c8dee2aaSAndroid Build Coastguard Worker SkColorType dstColorType, 65*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace* dstColorSpace, 66*c8dee2aaSAndroid Build Coastguard Worker const int maxTextureSize, 67*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps& propsIn); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> makeImage(sk_sp<SkSurface> surf, const SkPicture* pict) const; 70*c8dee2aaSAndroid Build Coastguard Worker }; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker protected: 73*c8dee2aaSAndroid Build Coastguard Worker SkPictureShader(SkReadBuffer&); 74*c8dee2aaSAndroid Build Coastguard Worker void flatten(SkWriteBuffer&) const override; 75*c8dee2aaSAndroid Build Coastguard Worker bool appendStages(const SkStageRec&, const SkShaders::MatrixRec&) const override; 76*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT 77*c8dee2aaSAndroid Build Coastguard Worker Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override; 78*c8dee2aaSAndroid Build Coastguard Worker #endif 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker private: 81*c8dee2aaSAndroid Build Coastguard Worker SK_FLATTENABLE_HOOKS(SkPictureShader) 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> rasterShader(const SkMatrix&, 84*c8dee2aaSAndroid Build Coastguard Worker SkColorType dstColorType, 85*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace* dstColorSpace, 86*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps& props) const; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPicture> fPicture; 89*c8dee2aaSAndroid Build Coastguard Worker SkRect fTile; 90*c8dee2aaSAndroid Build Coastguard Worker SkTileMode fTmx, fTmy; 91*c8dee2aaSAndroid Build Coastguard Worker SkFilterMode fFilter; 92*c8dee2aaSAndroid Build Coastguard Worker }; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker #endif // SkPictureShader_DEFINED 95