45#ifndef UFO_VISION_COLOR_BLEND_HPP
46#define UFO_VISION_COLOR_BLEND_HPP
49#include <ufo/vision/color/arithmetic.hpp>
50#include <ufo/vision/color/concepts.hpp>
51#include <ufo/vision/color/convert.hpp>
52#include <ufo/vision/color/type_traits.hpp>
78[[nodiscard]]
constexpr C
blend(C
a, C
const&
b,
float t)
82 if constexpr (std::same_as<C, D>) {
83 return a + t * (
b -
a);
85 return convert<C>(
blend(convert<D>(
a), convert<D>(
b), t));
99template <std::ranges::input_range R, std::ranges::input_range W>
100 requires Color<std::ranges::range_value_t<R>> &&
101 std::floating_point<std::ranges::range_value_t<W>>
102[[nodiscard]]
constexpr std::ranges::range_value_t<R>
blend(R&& r, W&& w)
104 using C = std::ranges::range_value_t<R>;
107 if constexpr (std::same_as<C, D>) {
108 return std::ranges::fold_left(
109 std::views::zip(r, w) | std::views::transform([](
auto&& z) {
115 return convert<C>(std::ranges::fold_left(
116 std::views::zip(r, w) | std::views::transform([](
auto&& z) {
118 return convert<D>(c) *
weight;
134template <std::input_iterator InputIt1, std::sentinel_for<InputIt1> Sentinel,
135 std::input_iterator InputIt2>
136 requires Color<std::iter_value_t<InputIt1>> &&
137 std::floating_point<std::iter_value_t<InputIt2>>
138[[nodiscard]]
constexpr std::iter_value_t<InputIt1>
blend(InputIt1 first, Sentinel last,
139 InputIt2 first_weight)
141 auto r = std::ranges::subrange(std::move(first), std::move(last));
142 auto w = std::views::repeat(0.0f) |
143 std::views::transform([first_weight, i = 0](
auto)
mutable {
144 return *std::next(first_weight, i++);
157template <std::ranges::input_range R, std::
floating_po
int T>
158 requires Color<std::ranges::range_value_t<R>>
159[[nodiscard]]
constexpr std::ranges::range_value_t<R>
blend(R&& r,
160 std::initializer_list<T> w)
162 return blend(std::forward<R>(r), std::ranges::subrange(w));
173template <Color C, std::
floating_po
int T>
174[[nodiscard]]
constexpr C
blend(std::initializer_list<C> r, std::initializer_list<T> w)
176 return blend(std::ranges::subrange(r), std::ranges::subrange(w));
constexpr C blend(C a, C const &b, float t)
Blends two colors using a factor t.
constexpr weight_type_t< C > weight(C color) noexcept
Returns the weight of color, or 1 if color has no weight field.
All vision-related classes and functions.
constexpr T b(Lab< T, Flags > color) noexcept
Returns the un-weighted blue–yellow axis value.
constexpr T a(Lab< T, Flags > color) noexcept
Returns the un-weighted green–red axis value.
Primary template - intentionally undefined.