/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_TiledTextureUtils_DEFINED #define skgpu_TiledTextureUtils_DEFINED #include "include/core/SkCanvas.h" #include "include/core/SkTileMode.h" #include class GrClip; class GrRecordingContext; class SkBitmap; struct SkIRect; struct SkISize; class SkMatrix; class SkPaint; struct SkRect; struct SkSamplingOptions; namespace skgpu { class TiledTextureUtils { public: static bool ShouldTileImage(SkIRect conservativeClipBounds, const SkISize& imageSize, const SkMatrix& ctm, const SkMatrix& srcToDst, const SkRect* src, int maxTileSize, size_t cacheSize, int* tileSize, SkIRect* clippedSubset); enum class ImageDrawMode { // Src and dst have been restricted to the image content. May need to clamp, no need to // decal. kOptimized, // Src and dst are their original sizes, requires use of a decal instead of plain clamping. // This is used when a dst clip is provided and extends outside of the optimized dst rect. kDecal, // Src or dst are empty, or do not intersect the image content so don't draw anything. kSkip }; static ImageDrawMode OptimizeSampleArea(const SkISize& imageSize, const SkRect& origSrcRect, const SkRect& origDstRect, const SkPoint dstClip[4], SkRect* outSrcRect, SkRect* outDstRect, SkMatrix* outSrcToDst); static bool CanDisableMipmap(const SkMatrix& viewM, const SkMatrix& localM, bool sharpenMipmappedTextures); static void ClampedOutsetWithOffset(SkIRect* iRect, int outset, SkPoint* offset, const SkIRect& clamp); static std::tuple DrawAsTiledImageRect(SkCanvas*, const SkImage*, const SkRect& srcRect, const SkRect& dstRect, SkCanvas::QuadAAFlags, const SkSamplingOptions&, const SkPaint*, SkCanvas::SrcRectConstraint, bool sharpenMM, size_t cacheSize, size_t maxTextureSize); }; } // namespace skgpu #endif // skgpu_TiledTextureUtils_DEFINED