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,
56 return Color(std::min(c.
red, threshold), std::min(c.
green, threshold),
57 std::min(c.
blue, threshold), std::min(c.
alpha, threshold));
64 return color.
x * 0.3f + color.
y * 0.59f + color.
z * 0.11f;
69 Scalar mn = std::min(std::min(color.
x, color.
y), color.
z);
70 Scalar mx = std::max(std::max(color.
x, color.
y), color.
z);
74 color = lum + (((color - lum) * lum) / (lum - mn +
kEhCloseEnough));
78 lum + (((color - lum) * (1.0f - lum)) / (mx - lum +
kEhCloseEnough));
90 return std::max(std::max(color.
x, color.
y), color.
z) -
91 std::min(std::min(color.
x, color.
y), color.
z);
96 Scalar mn = std::min(std::min(color.
x, color.
y), color.
z);
97 Scalar mx = std::max(std::max(color.
x, color.
y), color.
z);
98 return (mn < mx) ? ((color - mn) * saturation) / (mx - mn) :
Vector3();
116 return {color.
x, color.
y, color.
z, alpha};
136 return src + dst * (1.0f - src.
alpha);
160 switch (blend_mode) {
210 return s + d - s * d;
216 Vector3 screen_src = 2.0 * d - 1.0;
217 Vector3 screen = screen_src + s - screen_src * s;
237 return std::min(1.0f, d / (1.0f - s));
247 return 1.0f - std::min(1.0f, (1.0f - d) / s);
251 Vector3 screen_src = 2.0 * s - 1.0;
252 Vector3 screen = screen_src + d - screen_src * d;
266 d + (2.0 * s - 1.0) * (D - d),
272 return (d - s).Abs();
276 return d + s - 2.0f * d * s;
302 auto* c = color_matrix.
array;
312 static auto conversion = [](
Scalar component) {
313 if (component <= 0.0031308) {
314 return component * 12.92;
316 return 1.055 * pow(component, (1.0 / 2.4)) - 0.055;
323 static auto conversion = [](
Scalar component) {
324 if (component <= 0.04045) {
325 return component / 12.92;
327 return pow((component + 0.055) / 1.055, 2.4);
334 return SPrintF(
"R=%.1f,G=%.1f,B=%.1f,A=%.1f",
#define _IMPELLER_ASSERT_BLEND_MODE(blend_mode)
#define _IMPELLER_BLEND_MODE_NAME_LIST(blend_mode)
#define IMPELLER_FOR_EACH_BLEND_MODE(V)
static constexpr const char * kBlendModeNames[]
static constexpr Color Min(Color c, float threshold)
static constexpr bool ValidateBlendModes()
static constexpr Vector3 SetSaturation(Vector3 color, Scalar saturation)
static Color DoColorBlendComponents(Color dst, Color src, const std::function< Scalar(Scalar, Scalar)> &blend_func)
constexpr float kEhCloseEnough
static constexpr Scalar Saturation(Vector3 color)
static constexpr Vector3 ToRGB(Color color)
const char * BlendModeToString(BlendMode blend_mode)
std::string SPrintF(const char *format,...)
static constexpr Color FromRGB(Vector3 color, Scalar alpha)
static constexpr Vector3 SetLuminosity(Vector3 color, Scalar luminosity)
static constexpr Color ApplyBlendedColor(Color dst, Color src, Vector3 blend_result)
std::string ColorToString(const Color &color)
static Color DoColorBlend(Color dst, Color src, const std::function< Vector3(Vector3, Vector3)> &blend_rgb_func)
static constexpr Vector3 ComponentChoose(Vector3 a, Vector3 b, Vector3 value, Scalar cutoff)
static constexpr Vector3 ClipColor(Vector3 color)
static constexpr Scalar Luminosity(Vector3 color)
static constexpr Color BlackTransparent()
Color LinearToSRGB() const
Convert the color from linear space to sRGB space.
Color ApplyColorMatrix(const ColorMatrix &color_matrix) const
A color filter that transforms colors through a 4x5 color matrix.
constexpr Color Unpremultiply() const
constexpr Color Premultiply() const
Color SRGBToLinear() const
Convert the color from sRGB space to linear space.
Color Blend(Color source, BlendMode blend_mode) const
Blends an unpremultiplied destination color into a given unpremultiplied source color to form a new u...
Vector3 Min(const Vector3 &p) const
Vector3 Max(const Vector3 &p) const