| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_IMPELLER_GEOMETRY_SIGMA_H_ | |
| #define FLUTTER_IMPELLER_GEOMETRY_SIGMA_H_ | |
| #include "impeller/geometry/scalar.h" | |
| namespace impeller { | |
| /// For filters that use a Gaussian distribution, this is the `Radius` size to | |
| /// use per `Sigma` (standard deviation). | |
| /// | |
| /// This cutoff (sqrt(3)) is taken from Flutter and Skia (where the | |
| /// multiplicative inverse of this constant is used (1 / sqrt(3)): | |
| /// https://api.flutter.dev/flutter/dart-ui/Shadow/convertRadiusToSigma.html | |
| /// | |
| /// In practice, this value is somewhat arbitrary, and can be changed to a | |
| /// higher number to integrate more of the Gaussian function and render higher | |
| /// quality blurs (with exponentially diminishing returns for the same sigma | |
| /// input). Making this value any lower results in a noticable loss of | |
| /// quality in the blur. | |
| constexpr static float kKernelRadiusPerSigma = 1.73205080757; | |
| struct Radius; | |
| /// @brief In filters that use Gaussian distributions, "sigma" is a size of | |
| /// one standard deviation in terms of the local space pixel grid of | |
| /// the filter input. In other words, this determines how wide the | |
| /// distribution stretches. | |
| struct Sigma { | |
| Scalar sigma = 0.0; | |
| constexpr Sigma() = default; | |
| explicit constexpr Sigma(Scalar p_sigma) : sigma(p_sigma) {} | |
| operator Radius() const; // NOLINT(google-explicit-constructor) | |
| }; | |
| /// @brief For convolution filters, the "radius" is the size of the | |
| /// convolution kernel to use on the local space pixel grid of the | |
| /// filter input. | |
| /// For Gaussian blur kernels, this unit has a linear | |
| /// relationship with `Sigma`. See `kKernelRadiusPerSigma` for | |
| /// details on how this relationship works. | |
| struct Radius { | |
| Scalar radius = 0.0; | |
| constexpr Radius() = default; | |
| explicit constexpr Radius(Scalar p_radius) : radius(p_radius) {} | |
| operator Sigma() const; // NOLINT(google-explicit-constructor) | |
| }; | |
| } // namespace impeller | |
| #endif // FLUTTER_IMPELLER_GEOMETRY_SIGMA_H_ |