blob: 99d491e8f4305d28e8dbf535539a81ca56180c82 [file] [log] [blame]
// 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.
#pragma once
#include <stdint.h>
#include <array>
#include <cstdlib>
#include <ostream>
#include <type_traits>
#include "impeller/geometry/scalar.h"
#define IMPELLER_FOR_EACH_BLEND_MODE(V) \
V(Clear) \
V(Source) \
V(Destination) \
V(SourceOver) \
V(DestinationOver) \
V(SourceIn) \
V(DestinationIn) \
V(SourceOut) \
V(DestinationOut) \
V(SourceATop) \
V(DestinationATop) \
V(Xor) \
V(Plus) \
V(Modulate) \
V(Screen) \
V(Overlay) \
V(Darken) \
V(Lighten) \
V(ColorDodge) \
V(ColorBurn) \
V(HardLight) \
V(SoftLight) \
V(Difference) \
V(Exclusion) \
V(Multiply) \
V(Hue) \
V(Saturation) \
V(Color) \
V(Luminosity)
namespace impeller {
struct ColorHSB;
struct Vector4;
enum class YUVColorSpace { kBT601LimitedRange, kBT601FullRange };
/// All blend modes assume that both the source (fragment output) and
/// destination (first color attachment) have colors with premultiplied alpha.
enum class BlendMode {
// The following blend modes are able to be used as pipeline blend modes or
// via `BlendFilterContents`.
kClear,
kSource,
kDestination,
kSourceOver,
kDestinationOver,
kSourceIn,
kDestinationIn,
kSourceOut,
kDestinationOut,
kSourceATop,
kDestinationATop,
kXor,
kPlus,
kModulate,
// The following blend modes use equations that are not available for
// pipelines on most graphics devices without extensions, and so they are
// only able to be used via `BlendFilterContents`.
kScreen,
kOverlay,
kDarken,
kLighten,
kColorDodge,
kColorBurn,
kHardLight,
kSoftLight,
kDifference,
kExclusion,
kMultiply,
kHue,
kSaturation,
kColor,
kLuminosity,
kLast = kLuminosity,
};
/**
* Represents a RGBA color
*/
struct Color {
/**
* The red color component (0 to 1)
*/
Scalar red = 0.0;
/**
* The green color component (0 to 1)
*/
Scalar green = 0.0;
/**
* The blue color component (0 to 1)
*/
Scalar blue = 0.0;
/**
* The alpha component of the color (0 to 1)
*/
Scalar alpha = 0.0;
constexpr Color() {}
explicit Color(const ColorHSB& hsbColor);
Color(const Vector4& value);
constexpr Color(Scalar r, Scalar g, Scalar b, Scalar a)
: red(r), green(g), blue(b), alpha(a) {}
static constexpr Color MakeRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
return Color(
static_cast<Scalar>(r) / 255.0f, static_cast<Scalar>(g) / 255.0f,
static_cast<Scalar>(b) / 255.0f, static_cast<Scalar>(a) / 255.0f);
}
/// @brief Convert this color to a 32-bit representation.
static constexpr uint32_t ToIColor(Color color) {
return (((std::lround(color.alpha * 255.0f) & 0xff) << 24) |
((std::lround(color.red * 255.0f) & 0xff) << 16) |
((std::lround(color.green * 255.0f) & 0xff) << 8) |
((std::lround(color.blue * 255.0f) & 0xff) << 0)) &
0xFFFFFFFF;
}
constexpr bool operator==(const Color& c) const {
return ScalarNearlyEqual(red, c.red) && ScalarNearlyEqual(green, c.green) &&
ScalarNearlyEqual(blue, c.blue) && ScalarNearlyEqual(alpha, c.alpha);
}
constexpr Color Premultiply() const {
return {red * alpha, green * alpha, blue * alpha, alpha};
}
constexpr Color Unpremultiply() const {
if (ScalarNearlyEqual(alpha, 0.0f)) {
return Color::BlackTransparent();
}
return {red / alpha, green / alpha, blue / alpha, alpha};
}
/**
* @brief Return a color that is linearly interpolated between colors a
* and b, according to the value of t.
*
* @param a The lower color.
* @param b The upper color.
* @param t A value between 0.0f and 1.0f, inclusive.
* @return constexpr Color
*/
constexpr static Color lerp(Color a, Color b, Scalar t) {
Scalar tt = 1.0f - t;
return {a.red * tt + b.red * t, a.green * tt + b.green * t,
a.blue * tt + b.blue * t, a.alpha * tt + b.alpha * t};
}
/**
* @brief Convert to R8G8B8A8 representation.
*
* @return constexpr std::array<u_int8, 4>
*/
constexpr std::array<uint8_t, 4> ToR8G8B8A8() const {
uint8_t r = std::round(red * 255.0f);
uint8_t g = std::round(green * 255.0f);
uint8_t b = std::round(blue * 255.0f);
uint8_t a = std::round(alpha * 255.0f);
return {r, g, b, a};
}
static constexpr Color White() { return {1.0f, 1.0f, 1.0f, 1.0f}; }
static constexpr Color Black() { return {0.0f, 0.0f, 0.0f, 1.0f}; }
static constexpr Color WhiteTransparent() { return {1.0f, 1.0f, 1.0f, 0.0f}; }
static constexpr Color BlackTransparent() { return {0.0f, 0.0f, 0.0f, 0.0f}; }
static constexpr Color Red() { return {1.0f, 0.0f, 0.0f, 1.0f}; }
static constexpr Color Green() { return {0.0f, 1.0f, 0.0f, 1.0f}; }
static constexpr Color Blue() { return {0.0f, 0.0f, 1.0f, 1.0f}; }
constexpr Color WithAlpha(Scalar new_alpha) const {
return {red, green, blue, new_alpha};
}
static constexpr Color AliceBlue() {
return {240.0f / 255.0f, 248.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color AntiqueWhite() {
return {250.0f / 255.0f, 235.0f / 255.0f, 215.0f / 255.0f, 1.0f};
}
static constexpr Color Aqua() {
return {0.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color AquaMarine() {
return {127.0f / 255.0f, 255.0f / 255.0f, 212.0f / 255.0f, 1.0f};
}
static constexpr Color Azure() {
return {240.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color Beige() {
return {245.0f / 255.0f, 245.0f / 255.0f, 220.0f / 255.0f, 1.0f};
}
static constexpr Color Bisque() {
return {255.0f / 255.0f, 228.0f / 255.0f, 196.0f / 255.0f, 1.0f};
}
static constexpr Color BlanchedAlmond() {
return {255.0f / 255.0f, 235.0f / 255.0f, 205.0f / 255.0f, 1.0f};
}
static constexpr Color BlueViolet() {
return {138.0f / 255.0f, 43.0f / 255.0f, 226.0f / 255.0f, 1.0f};
}
static constexpr Color Brown() {
return {165.0f / 255.0f, 42.0f / 255.0f, 42.0f / 255.0f, 1.0f};
}
static constexpr Color BurlyWood() {
return {222.0f / 255.0f, 184.0f / 255.0f, 135.0f / 255.0f, 1.0f};
}
static constexpr Color CadetBlue() {
return {95.0f / 255.0f, 158.0f / 255.0f, 160.0f / 255.0f, 1.0f};
}
static constexpr Color Chartreuse() {
return {127.0f / 255.0f, 255.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color Chocolate() {
return {210.0f / 255.0f, 105.0f / 255.0f, 30.0f / 255.0f, 1.0f};
}
static constexpr Color Coral() {
return {255.0f / 255.0f, 127.0f / 255.0f, 80.0f / 255.0f, 1.0f};
}
static constexpr Color CornflowerBlue() {
return {100.0f / 255.0f, 149.0f / 255.0f, 237.0f / 255.0f, 1.0f};
}
static constexpr Color Cornsilk() {
return {255.0f / 255.0f, 248.0f / 255.0f, 220.0f / 255.0f, 1.0f};
}
static constexpr Color Crimson() {
return {220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f, 1.0f};
}
static constexpr Color Cyan() {
return {0.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color DarkBlue() {
return {0.0f / 255.0f, 0.0f / 255.0f, 139.0f / 255.0f, 1.0f};
}
static constexpr Color DarkCyan() {
return {0.0f / 255.0f, 139.0f / 255.0f, 139.0f / 255.0f, 1.0f};
}
static constexpr Color DarkGoldenrod() {
return {184.0f / 255.0f, 134.0f / 255.0f, 11.0f / 255.0f, 1.0f};
}
static constexpr Color DarkGray() {
return {169.0f / 255.0f, 169.0f / 255.0f, 169.0f / 255.0f, 1.0f};
}
static constexpr Color DarkGreen() {
return {0.0f / 255.0f, 100.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color DarkGrey() {
return {169.0f / 255.0f, 169.0f / 255.0f, 169.0f / 255.0f, 1.0f};
}
static constexpr Color DarkKhaki() {
return {189.0f / 255.0f, 183.0f / 255.0f, 107.0f / 255.0f, 1.0f};
}
static constexpr Color DarkMagenta() {
return {139.0f / 255.0f, 0.0f / 255.0f, 139.0f / 255.0f, 1.0f};
}
static constexpr Color DarkOliveGreen() {
return {85.0f / 255.0f, 107.0f / 255.0f, 47.0f / 255.0f, 1.0f};
}
static constexpr Color DarkOrange() {
return {255.0f / 255.0f, 140.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color DarkOrchid() {
return {153.0f / 255.0f, 50.0f / 255.0f, 204.0f / 255.0f, 1.0f};
}
static constexpr Color DarkRed() {
return {139.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color DarkSalmon() {
return {233.0f / 255.0f, 150.0f / 255.0f, 122.0f / 255.0f, 1.0f};
}
static constexpr Color DarkSeagreen() {
return {143.0f / 255.0f, 188.0f / 255.0f, 143.0f / 255.0f, 1.0f};
}
static constexpr Color DarkSlateBlue() {
return {72.0f / 255.0f, 61.0f / 255.0f, 139.0f / 255.0f, 1.0f};
}
static constexpr Color DarkSlateGray() {
return {47.0f / 255.0f, 79.0f / 255.0f, 79.0f / 255.0f, 1.0f};
}
static constexpr Color DarkSlateGrey() {
return {47.0f / 255.0f, 79.0f / 255.0f, 79.0f / 255.0f, 1.0f};
}
static constexpr Color DarkTurquoise() {
return {0.0f / 255.0f, 206.0f / 255.0f, 209.0f / 255.0f, 1.0f};
}
static constexpr Color DarkViolet() {
return {148.0f / 255.0f, 0.0f / 255.0f, 211.0f / 255.0f, 1.0f};
}
static constexpr Color DeepPink() {
return {255.0f / 255.0f, 20.0f / 255.0f, 147.0f / 255.0f, 1.0f};
}
static constexpr Color DeepSkyBlue() {
return {0.0f / 255.0f, 191.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color DimGray() {
return {105.0f / 255.0f, 105.0f / 255.0f, 105.0f / 255.0f, 1.0f};
}
static constexpr Color DimGrey() {
return {105.0f / 255.0f, 105.0f / 255.0f, 105.0f / 255.0f, 1.0f};
}
static constexpr Color DodgerBlue() {
return {30.0f / 255.0f, 144.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color Firebrick() {
return {178.0f / 255.0f, 34.0f / 255.0f, 34.0f / 255.0f, 1.0f};
}
static constexpr Color FloralWhite() {
return {255.0f / 255.0f, 250.0f / 255.0f, 240.0f / 255.0f, 1.0f};
}
static constexpr Color ForestGreen() {
return {34.0f / 255.0f, 139.0f / 255.0f, 34.0f / 255.0f, 1.0f};
}
static constexpr Color Fuchsia() {
return {255.0f / 255.0f, 0.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color Gainsboro() {
return {220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f, 1.0f};
}
static constexpr Color Ghostwhite() {
return {248.0f / 255.0f, 248.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color Gold() {
return {255.0f / 255.0f, 215.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color Goldenrod() {
return {218.0f / 255.0f, 165.0f / 255.0f, 32.0f / 255.0f, 1.0f};
}
static constexpr Color Gray() {
return {128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f};
}
static constexpr Color GreenYellow() {
return {173.0f / 255.0f, 255.0f / 255.0f, 47.0f / 255.0f, 1.0f};
}
static constexpr Color Grey() {
return {128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f};
}
static constexpr Color Honeydew() {
return {240.0f / 255.0f, 255.0f / 255.0f, 240.0f / 255.0f, 1.0f};
}
static constexpr Color HotPink() {
return {255.0f / 255.0f, 105.0f / 255.0f, 180.0f / 255.0f, 1.0f};
}
static constexpr Color IndianRed() {
return {205.0f / 255.0f, 92.0f / 255.0f, 92.0f / 255.0f, 1.0f};
}
static constexpr Color Indigo() {
return {75.0f / 255.0f, 0.0f / 255.0f, 130.0f / 255.0f, 1.0f};
}
static constexpr Color Ivory() {
return {255.0f / 255.0f, 255.0f / 255.0f, 240.0f / 255.0f, 1.0f};
}
static constexpr Color Khaki() {
return {240.0f / 255.0f, 230.0f / 255.0f, 140.0f / 255.0f, 1.0f};
}
static constexpr Color Lavender() {
return {230.0f / 255.0f, 230.0f / 255.0f, 250.0f / 255.0f, 1.0f};
}
static constexpr Color LavenderBlush() {
return {255.0f / 255.0f, 240.0f / 255.0f, 245.0f / 255.0f, 1.0f};
}
static constexpr Color LawnGreen() {
return {124.0f / 255.0f, 252.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color LemonChiffon() {
return {255.0f / 255.0f, 250.0f / 255.0f, 205.0f / 255.0f, 1.0f};
}
static constexpr Color LightBlue() {
return {173.0f / 255.0f, 216.0f / 255.0f, 230.0f / 255.0f, 1.0f};
}
static constexpr Color LightCoral() {
return {240.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f};
}
static constexpr Color LightCyan() {
return {224.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color LightGoldenrodYellow() {
return {50.0f / 255.0f, 250.0f / 255.0f, 210.0f / 255.0f, 1.0f};
}
static constexpr Color LightGray() {
return {211.0f / 255.0f, 211.0f / 255.0f, 211.0f / 255.0f, 1.0f};
}
static constexpr Color LightGreen() {
return {144.0f / 255.0f, 238.0f / 255.0f, 144.0f / 255.0f, 1.0f};
}
static constexpr Color LightGrey() {
return {211.0f / 255.0f, 211.0f / 255.0f, 211.0f / 255.0f, 1.0f};
}
static constexpr Color LightPink() {
return {255.0f / 255.0f, 182.0f / 255.0f, 193.0f / 255.0f, 1.0f};
}
static constexpr Color LightSalmon() {
return {255.0f / 255.0f, 160.0f / 255.0f, 122.0f / 255.0f, 1.0f};
}
static constexpr Color LightSeaGreen() {
return {32.0f / 255.0f, 178.0f / 255.0f, 170.0f / 255.0f, 1.0f};
}
static constexpr Color LightSkyBlue() {
return {135.0f / 255.0f, 206.0f / 255.0f, 250.0f / 255.0f, 1.0f};
}
static constexpr Color LightSlateGray() {
return {119.0f / 255.0f, 136.0f / 255.0f, 153.0f / 255.0f, 1.0f};
}
static constexpr Color LightSlateGrey() {
return {119.0f / 255.0f, 136.0f / 255.0f, 153.0f / 255.0f, 1.0f};
}
static constexpr Color LightSteelBlue() {
return {176.0f / 255.0f, 196.0f / 255.0f, 222.0f / 255.0f, 1.0f};
}
static constexpr Color LightYellow() {
return {255.0f / 255.0f, 255.0f / 255.0f, 224.0f / 255.0f, 1.0f};
}
static constexpr Color Lime() {
return {0.0f / 255.0f, 255.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color LimeGreen() {
return {50.0f / 255.0f, 205.0f / 255.0f, 50.0f / 255.0f, 1.0f};
}
static constexpr Color Linen() {
return {250.0f / 255.0f, 240.0f / 255.0f, 230.0f / 255.0f, 1.0f};
}
static constexpr Color Magenta() {
return {255.0f / 255.0f, 0.0f / 255.0f, 255.0f / 255.0f, 1.0f};
}
static constexpr Color Maroon() {
return {128.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color MediumAquamarine() {
return {102.0f / 255.0f, 205.0f / 255.0f, 170.0f / 255.0f, 1.0f};
}
static constexpr Color MediumBlue() {
return {0.0f / 255.0f, 0.0f / 255.0f, 205.0f / 255.0f, 1.0f};
}
static constexpr Color MediumOrchid() {
return {186.0f / 255.0f, 85.0f / 255.0f, 211.0f / 255.0f, 1.0f};
}
static constexpr Color MediumPurple() {
return {147.0f / 255.0f, 112.0f / 255.0f, 219.0f / 255.0f, 1.0f};
}
static constexpr Color MediumSeagreen() {
return {60.0f / 255.0f, 179.0f / 255.0f, 113.0f / 255.0f, 1.0f};
}
static constexpr Color MediumSlateBlue() {
return {123.0f / 255.0f, 104.0f / 255.0f, 238.0f / 255.0f, 1.0f};
}
static constexpr Color MediumSpringGreen() {
return {0.0f / 255.0f, 250.0f / 255.0f, 154.0f / 255.0f, 1.0f};
}
static constexpr Color MediumTurquoise() {
return {72.0f / 255.0f, 209.0f / 255.0f, 204.0f / 255.0f, 1.0f};
}
static constexpr Color MediumVioletRed() {
return {199.0f / 255.0f, 21.0f / 255.0f, 133.0f / 255.0f, 1.0f};
}
static constexpr Color MidnightBlue() {
return {25.0f / 255.0f, 25.0f / 255.0f, 112.0f / 255.0f, 1.0f};
}
static constexpr Color MintCream() {
return {245.0f / 255.0f, 255.0f / 255.0f, 250.0f / 255.0f, 1.0f};
}
static constexpr Color MistyRose() {
return {255.0f / 255.0f, 228.0f / 255.0f, 225.0f / 255.0f, 1.0f};
}
static constexpr Color Moccasin() {
return {255.0f / 255.0f, 228.0f / 255.0f, 181.0f / 255.0f, 1.0f};
}
static constexpr Color NavajoWhite() {
return {255.0f / 255.0f, 222.0f / 255.0f, 173.0f / 255.0f, 1.0f};
}
static constexpr Color Navy() {
return {0.0f / 255.0f, 0.0f / 255.0f, 128.0f / 255.0f, 1.0f};
}
static constexpr Color OldLace() {
return {253.0f / 255.0f, 245.0f / 255.0f, 230.0f / 255.0f, 1.0f};
}
static constexpr Color Olive() {
return {128.0f / 255.0f, 128.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color OliveDrab() {
return {107.0f / 255.0f, 142.0f / 255.0f, 35.0f / 255.0f, 1.0f};
}
static constexpr Color Orange() {
return {255.0f / 255.0f, 165.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color OrangeRed() {
return {255.0f / 255.0f, 69.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color Orchid() {
return {218.0f / 255.0f, 112.0f / 255.0f, 214.0f / 255.0f, 1.0f};
}
static constexpr Color PaleGoldenrod() {
return {238.0f / 255.0f, 232.0f / 255.0f, 170.0f / 255.0f, 1.0f};
}
static constexpr Color PaleGreen() {
return {152.0f / 255.0f, 251.0f / 255.0f, 152.0f / 255.0f, 1.0f};
}
static constexpr Color PaleTurquoise() {
return {175.0f / 255.0f, 238.0f / 255.0f, 238.0f / 255.0f, 1.0f};
}
static constexpr Color PaleVioletRed() {
return {219.0f / 255.0f, 112.0f / 255.0f, 147.0f / 255.0f, 1.0f};
}
static constexpr Color PapayaWhip() {
return {255.0f / 255.0f, 239.0f / 255.0f, 213.0f / 255.0f, 1.0f};
}
static constexpr Color Peachpuff() {
return {255.0f / 255.0f, 218.0f / 255.0f, 185.0f / 255.0f, 1.0f};
}
static constexpr Color Peru() {
return {205.0f / 255.0f, 133.0f / 255.0f, 63.0f / 255.0f, 1.0f};
}
static constexpr Color Pink() {
return {255.0f / 255.0f, 192.0f / 255.0f, 203.0f / 255.0f, 1.0f};
}
static constexpr Color Plum() {
return {221.0f / 255.0f, 160.0f / 255.0f, 221.0f / 255.0f, 1.0f};
}
static constexpr Color PowderBlue() {
return {176.0f / 255.0f, 224.0f / 255.0f, 230.0f / 255.0f, 1.0f};
}
static constexpr Color Purple() {
return {128.0f / 255.0f, 0.0f / 255.0f, 128.0f / 255.0f, 1.0f};
}
static constexpr Color RosyBrown() {
return {188.0f / 255.0f, 143.0f / 255.0f, 143.0f / 255.0f, 1.0f};
}
static constexpr Color RoyalBlue() {
return {65.0f / 255.0f, 105.0f / 255.0f, 225.0f / 255.0f, 1.0f};
}
static constexpr Color SaddleBrown() {
return {139.0f / 255.0f, 69.0f / 255.0f, 19.0f / 255.0f, 1.0f};
}
static constexpr Color Salmon() {
return {250.0f / 255.0f, 128.0f / 255.0f, 114.0f / 255.0f, 1.0f};
}
static constexpr Color SandyBrown() {
return {244.0f / 255.0f, 164.0f / 255.0f, 96.0f / 255.0f, 1.0f};
}
static constexpr Color Seagreen() {
return {46.0f / 255.0f, 139.0f / 255.0f, 87.0f / 255.0f, 1.0f};
}
static constexpr Color Seashell() {
return {255.0f / 255.0f, 245.0f / 255.0f, 238.0f / 255.0f, 1.0f};
}
static constexpr Color Sienna() {
return {160.0f / 255.0f, 82.0f / 255.0f, 45.0f / 255.0f, 1.0f};
}
static constexpr Color Silver() {
return {192.0f / 255.0f, 192.0f / 255.0f, 192.0f / 255.0f, 1.0f};
}
static constexpr Color SkyBlue() {
return {135.0f / 255.0f, 206.0f / 255.0f, 235.0f / 255.0f, 1.0f};
}
static constexpr Color SlateBlue() {
return {106.0f / 255.0f, 90.0f / 255.0f, 205.0f / 255.0f, 1.0f};
}
static constexpr Color SlateGray() {
return {112.0f / 255.0f, 128.0f / 255.0f, 144.0f / 255.0f, 1.0f};
}
static constexpr Color SlateGrey() {
return {112.0f / 255.0f, 128.0f / 255.0f, 144.0f / 255.0f, 1.0f};
}
static constexpr Color Snow() {
return {255.0f / 255.0f, 250.0f / 255.0f, 250.0f / 255.0f, 1.0f};
}
static constexpr Color SpringGreen() {
return {0.0f / 255.0f, 255.0f / 255.0f, 127.0f / 255.0f, 1.0f};
}
static constexpr Color SteelBlue() {
return {70.0f / 255.0f, 130.0f / 255.0f, 180.0f / 255.0f, 1.0f};
}
static constexpr Color Tan() {
return {210.0f / 255.0f, 180.0f / 255.0f, 140.0f / 255.0f, 1.0f};
}
static constexpr Color Teal() {
return {0.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f};
}
static constexpr Color Thistle() {
return {216.0f / 255.0f, 191.0f / 255.0f, 216.0f / 255.0f, 1.0f};
}
static constexpr Color Tomato() {
return {255.0f / 255.0f, 99.0f / 255.0f, 71.0f / 255.0f, 1.0f};
}
static constexpr Color Turquoise() {
return {64.0f / 255.0f, 224.0f / 255.0f, 208.0f / 255.0f, 1.0f};
}
static constexpr Color Violet() {
return {238.0f / 255.0f, 130.0f / 255.0f, 238.0f / 255.0f, 1.0f};
}
static constexpr Color Wheat() {
return {245.0f / 255.0f, 222.0f / 255.0f, 179.0f / 255.0f, 1.0f};
}
static constexpr Color Whitesmoke() {
return {245.0f / 255.0f, 245.0f / 255.0f, 245.0f / 255.0f, 1.0f};
}
static constexpr Color Yellow() {
return {255.0f / 255.0f, 255.0f / 255.0f, 0.0f / 255.0f, 1.0f};
}
static constexpr Color YellowGreen() {
return {154.0f / 255.0f, 205.0f / 255.0f, 50.0f / 255.0f, 1.0f};
}
static Color Random() {
return {
static_cast<Scalar>((std::rand() % 255) / 255.0f), //
static_cast<Scalar>((std::rand() % 255) / 255.0f), //
static_cast<Scalar>((std::rand() % 255) / 255.0f), //
1.0f //
};
}
static Color BlendColor(const Color& src,
const Color& dst,
BlendMode blend_mode);
Color operator*(const Color& c) const {
return Color(red * c.red, green * c.green, blue * c.blue, alpha * c.alpha);
}
Color operator+(const Color& c) const;
Color operator-(const Color& c) const;
Color operator*(Scalar value) const;
constexpr bool IsTransparent() const { return alpha == 0.0f; }
constexpr bool IsOpaque() const { return alpha == 1.0f; }
};
std::string ColorToString(const Color& color);
/**
* Represents a color by its constituent hue, saturation, brightness and alpha
*/
struct ColorHSB {
/**
* The hue of the color (0 to 1)
*/
Scalar hue;
/**
* The saturation of the color (0 to 1)
*/
Scalar saturation;
/**
* The brightness of the color (0 to 1)
*/
Scalar brightness;
/**
* The alpha of the color (0 to 1)
*/
Scalar alpha;
constexpr ColorHSB(Scalar h, Scalar s, Scalar b, Scalar a)
: hue(h), saturation(s), brightness(b), alpha(a) {}
static ColorHSB FromRGB(Color rgb);
Color ToRGBA() const;
};
static_assert(sizeof(Color) == 4 * sizeof(Scalar));
} // namespace impeller
namespace std {
inline std::ostream& operator<<(std::ostream& out, const impeller::Color& c) {
out << "(" << c.red << ", " << c.green << ", " << c.blue << ", " << c.alpha
<< ")";
return out;
}
} // namespace std