/* * 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 SkBlurEngine_DEFINED #define SkBlurEngine_DEFINED #include "include/core/SkM44.h" // IWYU pragma: keep #include "include/core/SkRefCnt.h" #include "include/core/SkSize.h" #include "include/core/SkSpan.h" #include "include/private/base/SkFloatingPoint.h" #include <algorithm> #include <array> #include <cmath> class SkDevice; class SkRuntimeEffect; class SkRuntimeShaderBuilder; class SkSpecialImage; struct SkImageInfo; struct SkIRect; enum class SkFilterMode; enum class SkTileMode; enum SkColorType : int; /** * SkBlurEngine is a backend-agnostic provider of blur algorithms. Each Skia backend defines a blur * engine with a set of supported algorithms and/or implementations. A given implementation may be * optimized for a particular color type, sigma range, or available hardware. Each engine and its * algorithms are assumed to operate only on SkImages corresponding to its Skia backend, and will * produce output SkImages of the same type. * * Algorithms are allowed to specify a maximum supported sigma. If the desired sigma is higher than * this, the input image and output region must be downscaled by the caller before invoking the * algorithm. This is to provide the most flexibility for input representation (e.g. directly * rasterize at half resolution or apply deferred filter effects during the first downsample pass). * * skif::FilterResult::Builder::blur() is a convenient wrapper around the blur engine and * automatically handles resizing. */ class SkBlurEngine { … }; class SkBlurEngine::Algorithm { … }; /** * The default blur implementation uses internal runtime effects to evaluate either a single 2D * kernel within a shader, or performs two 1D blur passes. This algorithm is backend agnostic but * must be subclassed per backend to define the SkDevice creation function. */ class SkShaderBlurAlgorithm : public SkBlurEngine::Algorithm { … }; #endif // SkBlurEngine_DEFINED