QmlMaterial 0.1.0
Loading...
Searching...
No Matches
gaussian.hpp
1#pragma once
2
3/*
4 * Gaussian blur math: sigma<->radius, CDF profile LUT, separable kernel.
5 *
6 * Based on principles from Skia's SkBlurMask (BSD-3, third_party/skia/LICENSE).
7 * Implementations are independent re-expressions; no Skia code is copied.
8 */
9
10#include <cstdint>
11#include <span>
12
13#include "qml_material/math/scalar.hpp"
14
15namespace qml_material::math
16{
17
19inline constexpr scalar k_blur_sigma_scale = 0.57735f; // ≈ 1/sqrt(3)
20
21[[nodiscard]] inline scalar radius_to_sigma(scalar radius) {
22 return radius > 0 ? k_blur_sigma_scale * radius + 0.5f : 0.0f;
23}
24
25[[nodiscard]] inline scalar sigma_to_radius(scalar sigma) {
26 return sigma > 0.5f ? (sigma - 0.5f) / k_blur_sigma_scale : 0.0f;
27}
28
31[[nodiscard]] float gaussian_cdf(float x);
32
39void fill_unit_cdf_profile(std::span<std::uint8_t> out);
40
43[[nodiscard]] int gaussian_kernel_radius(scalar sigma);
44
47void fill_gaussian_kernel_1d(std::span<float> out, scalar sigma);
48
51[[nodiscard]] int rrect_corner_blur_size(scalar sigma, scalar radius);
52
61void fill_rrect_corner_blur(std::span<std::uint8_t> out, scalar sigma, scalar radius);
62
63} // namespace qml_material::math