11 #include <type_traits>
20 #define _IMPELLER_ASSERT_BLEND_MODE(blend_mode) \
21 auto enum_##blend_mode = static_cast<std::underlying_type_t<BlendMode>>( \
22 BlendMode::k##blend_mode); \
23 if (i != enum_##blend_mode) { \
29 std::underlying_type_t<BlendMode> i = 0;
40 "IMPELLER_FOR_EACH_BLEND_MODE must match impeller::BlendMode.");
42 #define _IMPELLER_BLEND_MODE_NAME_LIST(blend_mode) #blend_mode,
73 f = (R == x) ? G - B : ((G == x) ? B - R : R - G);
74 i = (R == x) ? 3 : ((G == x) ? 5 : 1);
76 return ColorHSB(((i - f / (v - x)) / 6.0), (v - x) / v, v, rgb.
alpha);
98 i =
static_cast<int64_t
>(floor(h));
130 : red(value.x), green(value.y), blue(value.z), alpha(value.w) {}
133 return Color(std::min(c.
red, threshold), std::min(c.
green, threshold),
134 std::min(c.
blue, threshold), std::min(c.
alpha, threshold));
141 return color.
x * 0.3f + color.
y * 0.59f + color.
z * 0.11f;
146 Scalar mn = std::min(std::min(color.
x, color.
y), color.
z);
147 Scalar mx = std::max(std::max(color.
x, color.
y), color.
z);
151 color = lum + (((color - lum) * lum) / (lum - mn +
kEhCloseEnough));
155 lum + (((color - lum) * (1.0f - lum)) / (mx - lum +
kEhCloseEnough));
167 return std::max(std::max(color.
x, color.
y), color.
z) -
168 std::min(std::min(color.
x, color.
y), color.
z);
173 Scalar mn = std::min(std::min(color.
x, color.
y), color.
z);
174 Scalar mx = std::max(std::max(color.
x, color.
y), color.
z);
175 return (mn < mx) ? ((color - mn) * saturation) / (mx - mn) :
Vector3();
183 value.
y > cutoff ?
b.y : a.
y,
184 value.
z > cutoff ?
b.z : a.
z
193 return {color.
x, color.
y, color.
z, alpha};
213 return src + dst * (1.0f - src.
alpha);
237 switch (blend_mode) {
287 return s + d - s * d;
293 Vector3 screen_src = 2.0 * d - 1.0;
294 Vector3 screen = screen_src + s - screen_src * s;
314 return std::min(1.0f, d / (1.0f - s));
324 return 1.0f - std::min(1.0f, (1.0f - d) / s);
328 Vector3 screen_src = 2.0 * s - 1.0;
329 Vector3 screen = screen_src + d - screen_src * d;
343 d + (2.0 * s - 1.0) * (D - d),
349 return (d - s).Abs();
353 return d + s - 2.0f * d * s;
379 auto* c = color_matrix.
array;
389 static auto conversion = [](
Scalar component) {
390 if (component <= 0.0031308) {
391 return component * 12.92;
393 return 1.055 * pow(component, (1.0 / 2.4)) - 0.055;
400 static auto conversion = [](
Scalar component) {
401 if (component <= 0.04045) {
402 return component / 12.92;
404 return pow((component + 0.055) / 1.055, 2.4);
411 return SPrintF(
"R=%.1f,G=%.1f,B=%.1f,A=%.1f",