/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkPictureShader_DEFINED #define SkPictureShader_DEFINED #include "include/core/SkFlattenable.h" #include "include/core/SkImageInfo.h" #include "include/core/SkMatrix.h" #include "include/core/SkPicture.h" #include "include/core/SkRect.h" #include "include/core/SkRefCnt.h" #include "include/core/SkSize.h" #include "include/core/SkSurfaceProps.h" #include "include/core/SkTypes.h" #include "src/shaders/SkShaderBase.h" class SkArenaAlloc; class SkColorSpace; class SkImage; class SkReadBuffer; class SkShader; class SkSurface; class SkWriteBuffer; enum SkColorType : int; enum class SkFilterMode; enum class SkTileMode; struct SkStageRec; /* * An SkPictureShader can be used to draw SkPicture-based patterns. * * The SkPicture is first rendered into a tile, which is then used to shade the area according * to specified tiling rules. */ class SkPictureShader : public SkShaderBase { public: static sk_sp Make(sk_sp, SkTileMode, SkTileMode, SkFilterMode, const SkMatrix*, const SkRect*); SkPictureShader(sk_sp, SkTileMode, SkTileMode, SkFilterMode, const SkRect*); ShaderType type() const override { return ShaderType::kPicture; } sk_sp picture() const { return fPicture; } SkRect tile() const { return fTile; } SkTileMode tileModeX() const { return fTmx; } SkTileMode tileModeY() const { return fTmy; } SkFilterMode filter() const { return fFilter; } struct CachedImageInfo { bool success; SkSize tileScale; // Additional scale factors to apply when sampling image. SkMatrix matrixForDraw; // Matrix used to produce an image from the picture SkImageInfo imageInfo; SkSurfaceProps props; static CachedImageInfo Make(const SkRect& bounds, const SkMatrix& totalM, SkColorType dstColorType, SkColorSpace* dstColorSpace, const int maxTextureSize, const SkSurfaceProps& propsIn); sk_sp makeImage(sk_sp surf, const SkPicture* pict) const; }; protected: SkPictureShader(SkReadBuffer&); void flatten(SkWriteBuffer&) const override; bool appendStages(const SkStageRec&, const SkShaders::MatrixRec&) const override; #ifdef SK_ENABLE_LEGACY_SHADERCONTEXT Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override; #endif private: SK_FLATTENABLE_HOOKS(SkPictureShader) sk_sp rasterShader(const SkMatrix&, SkColorType dstColorType, SkColorSpace* dstColorSpace, const SkSurfaceProps& props) const; sk_sp fPicture; SkRect fTile; SkTileMode fTmx, fTmy; SkFilterMode fFilter; }; #endif // SkPictureShader_DEFINED