Make 'Color' a 'constexpr' class
This commit is contained in:
parent
cfeb7651b5
commit
ed201ce87a
@ -37,7 +37,7 @@ namespace sf
|
|||||||
/// \brief Utility class for manipulating RGBA colors
|
/// \brief Utility class for manipulating RGBA colors
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
class SFML_GRAPHICS_API Color
|
class Color
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ public:
|
|||||||
/// sf::Color(0, 0, 0, 255).
|
/// sf::Color(0, 0, 0, 255).
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Color();
|
constexpr Color();
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Construct the color from its 4 RGBA components
|
/// \brief Construct the color from its 4 RGBA components
|
||||||
@ -59,7 +59,7 @@ public:
|
|||||||
/// \param alpha Alpha (opacity) component (in the range [0, 255])
|
/// \param alpha Alpha (opacity) component (in the range [0, 255])
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha = 255);
|
constexpr Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha = 255);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Construct the color from 32-bit unsigned integer
|
/// \brief Construct the color from 32-bit unsigned integer
|
||||||
@ -67,7 +67,7 @@ public:
|
|||||||
/// \param color Number containing the RGBA components (in that order)
|
/// \param color Number containing the RGBA components (in that order)
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
explicit Color(Uint32 color);
|
constexpr explicit Color(Uint32 color);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Retrieve the color as a 32-bit unsigned integer
|
/// \brief Retrieve the color as a 32-bit unsigned integer
|
||||||
@ -75,20 +75,20 @@ public:
|
|||||||
/// \return Color represented as a 32-bit unsigned integer
|
/// \return Color represented as a 32-bit unsigned integer
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Uint32 toInteger() const;
|
constexpr Uint32 toInteger() const;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Static member data
|
// Static member data
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
static const Color Black; //!< Black predefined color
|
SFML_GRAPHICS_API static const Color Black; //!< Black predefined color
|
||||||
static const Color White; //!< White predefined color
|
SFML_GRAPHICS_API static const Color White; //!< White predefined color
|
||||||
static const Color Red; //!< Red predefined color
|
SFML_GRAPHICS_API static const Color Red; //!< Red predefined color
|
||||||
static const Color Green; //!< Green predefined color
|
SFML_GRAPHICS_API static const Color Green; //!< Green predefined color
|
||||||
static const Color Blue; //!< Blue predefined color
|
SFML_GRAPHICS_API static const Color Blue; //!< Blue predefined color
|
||||||
static const Color Yellow; //!< Yellow predefined color
|
SFML_GRAPHICS_API static const Color Yellow; //!< Yellow predefined color
|
||||||
static const Color Magenta; //!< Magenta predefined color
|
SFML_GRAPHICS_API static const Color Magenta; //!< Magenta predefined color
|
||||||
static const Color Cyan; //!< Cyan predefined color
|
SFML_GRAPHICS_API static const Color Cyan; //!< Cyan predefined color
|
||||||
static const Color Transparent; //!< Transparent (black) predefined color
|
SFML_GRAPHICS_API static const Color Transparent; //!< Transparent (black) predefined color
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Member data
|
// Member data
|
||||||
@ -111,7 +111,7 @@ public:
|
|||||||
/// \return True if colors are equal, false if they are different
|
/// \return True if colors are equal, false if they are different
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API bool operator ==(const Color& left, const Color& right);
|
[[nodiscard]] constexpr bool operator ==(const Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -125,7 +125,7 @@ SFML_GRAPHICS_API bool operator ==(const Color& left, const Color& right);
|
|||||||
/// \return True if colors are different, false if they are equal
|
/// \return True if colors are different, false if they are equal
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API bool operator !=(const Color& left, const Color& right);
|
[[nodiscard]] constexpr bool operator !=(const Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -140,7 +140,7 @@ SFML_GRAPHICS_API bool operator !=(const Color& left, const Color& right);
|
|||||||
/// \return Result of \a left + \a right
|
/// \return Result of \a left + \a right
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API Color operator +(const Color& left, const Color& right);
|
[[nodiscard]] constexpr Color operator +(const Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -155,7 +155,7 @@ SFML_GRAPHICS_API Color operator +(const Color& left, const Color& right);
|
|||||||
/// \return Result of \a left - \a right
|
/// \return Result of \a left - \a right
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API Color operator -(const Color& left, const Color& right);
|
[[nodiscard]] constexpr Color operator -(const Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -172,7 +172,7 @@ SFML_GRAPHICS_API Color operator -(const Color& left, const Color& right);
|
|||||||
/// \return Result of \a left * \a right
|
/// \return Result of \a left * \a right
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API Color operator *(const Color& left, const Color& right);
|
[[nodiscard]] constexpr Color operator *(const Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -188,7 +188,7 @@ SFML_GRAPHICS_API Color operator *(const Color& left, const Color& right);
|
|||||||
/// \return Reference to \a left
|
/// \return Reference to \a left
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API Color& operator +=(Color& left, const Color& right);
|
constexpr Color& operator +=(Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -204,7 +204,7 @@ SFML_GRAPHICS_API Color& operator +=(Color& left, const Color& right);
|
|||||||
/// \return Reference to \a left
|
/// \return Reference to \a left
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API Color& operator -=(Color& left, const Color& right);
|
constexpr Color& operator -=(Color& left, const Color& right);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \relates Color
|
/// \relates Color
|
||||||
@ -222,7 +222,9 @@ SFML_GRAPHICS_API Color& operator -=(Color& left, const Color& right);
|
|||||||
/// \return Reference to \a left
|
/// \return Reference to \a left
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
SFML_GRAPHICS_API Color& operator *=(Color& left, const Color& right);
|
constexpr Color& operator *=(Color& left, const Color& right);
|
||||||
|
|
||||||
|
#include <SFML/Graphics/Color.inl>
|
||||||
|
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
|
||||||
|
149
include/SFML/Graphics/Color.inl
Normal file
149
include/SFML/Graphics/Color.inl
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color::Color() :
|
||||||
|
r(0),
|
||||||
|
g(0),
|
||||||
|
b(0),
|
||||||
|
a(255)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color::Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha) :
|
||||||
|
r(red),
|
||||||
|
g(green),
|
||||||
|
b(blue),
|
||||||
|
a(alpha)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color::Color(Uint32 color) :
|
||||||
|
r(static_cast<Uint8>((color & 0xff000000) >> 24)),
|
||||||
|
g(static_cast<Uint8>((color & 0x00ff0000) >> 16)),
|
||||||
|
b(static_cast<Uint8>((color & 0x0000ff00) >> 8)),
|
||||||
|
a(static_cast<Uint8>(color & 0x000000ff))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Uint32 Color::toInteger() const
|
||||||
|
{
|
||||||
|
return static_cast<Uint32>((r << 24) | (g << 16) | (b << 8) | a);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr bool operator ==(const Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
return (left.r == right.r) &&
|
||||||
|
(left.g == right.g) &&
|
||||||
|
(left.b == right.b) &&
|
||||||
|
(left.a == right.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr bool operator !=(const Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
return !(left == right);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color operator +(const Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
const auto clampedAdd = [](Uint8 lhs, Uint8 rhs) -> Uint8
|
||||||
|
{
|
||||||
|
const int intResult = static_cast<int>(lhs) + static_cast<int>(rhs);
|
||||||
|
return static_cast<Uint8>(intResult < 255 ? intResult : 255);
|
||||||
|
};
|
||||||
|
|
||||||
|
return Color(clampedAdd(left.r, right.r),
|
||||||
|
clampedAdd(left.g, right.g),
|
||||||
|
clampedAdd(left.b, right.b),
|
||||||
|
clampedAdd(left.a, right.a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color operator -(const Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
const auto clampedSub = [](Uint8 lhs, Uint8 rhs) -> Uint8
|
||||||
|
{
|
||||||
|
const int intResult = static_cast<int>(lhs) - static_cast<int>(rhs);
|
||||||
|
return static_cast<Uint8>(intResult > 0 ? intResult : 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
return Color(clampedSub(left.r, right.r),
|
||||||
|
clampedSub(left.g, right.g),
|
||||||
|
clampedSub(left.b, right.b),
|
||||||
|
clampedSub(left.a, right.a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color operator *(const Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
const auto scaledMul = [](Uint8 lhs, Uint8 rhs) -> Uint8
|
||||||
|
{
|
||||||
|
const auto uint16Result = static_cast<Uint16>(static_cast<Uint16>(lhs) * static_cast<Uint16>(rhs));
|
||||||
|
return static_cast<Uint8>(uint16Result / 255u);
|
||||||
|
};
|
||||||
|
|
||||||
|
return Color(scaledMul(left.r, right.r),
|
||||||
|
scaledMul(left.g, right.g),
|
||||||
|
scaledMul(left.b, right.b),
|
||||||
|
scaledMul(left.a, right.a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color& operator +=(Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
return left = left + right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color& operator -=(Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
return left = left - right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
constexpr Color& operator *=(Color& left, const Color& right)
|
||||||
|
{
|
||||||
|
return left = left * right;
|
||||||
|
}
|
@ -8,6 +8,7 @@ set(SRC
|
|||||||
${INCROOT}/BlendMode.hpp
|
${INCROOT}/BlendMode.hpp
|
||||||
${SRCROOT}/Color.cpp
|
${SRCROOT}/Color.cpp
|
||||||
${INCROOT}/Color.hpp
|
${INCROOT}/Color.hpp
|
||||||
|
${INCROOT}/Color.inl
|
||||||
${INCROOT}/Export.hpp
|
${INCROOT}/Export.hpp
|
||||||
${SRCROOT}/Font.cpp
|
${SRCROOT}/Font.cpp
|
||||||
${INCROOT}/Font.hpp
|
${INCROOT}/Font.hpp
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
// Headers
|
// Headers
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#include <SFML/Graphics/Color.hpp>
|
#include <SFML/Graphics/Color.hpp>
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
|
|
||||||
namespace sf
|
namespace sf
|
||||||
@ -44,112 +43,4 @@ const Color Color::Magenta(255, 0, 255);
|
|||||||
const Color Color::Cyan(0, 255, 255);
|
const Color Color::Cyan(0, 255, 255);
|
||||||
const Color Color::Transparent(0, 0, 0, 0);
|
const Color Color::Transparent(0, 0, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color::Color() :
|
|
||||||
r(0),
|
|
||||||
g(0),
|
|
||||||
b(0),
|
|
||||||
a(255)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color::Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha) :
|
|
||||||
r(red),
|
|
||||||
g(green),
|
|
||||||
b(blue),
|
|
||||||
a(alpha)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color::Color(Uint32 color) :
|
|
||||||
r(static_cast<Uint8>((color & 0xff000000) >> 24)),
|
|
||||||
g(static_cast<Uint8>((color & 0x00ff0000) >> 16)),
|
|
||||||
b((color & 0x0000ff00) >> 8 ),
|
|
||||||
a((color & 0x000000ff) >> 0 )
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Uint32 Color::toInteger() const
|
|
||||||
{
|
|
||||||
return static_cast<Uint32>((r << 24) | (g << 16) | (b << 8) | a);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
bool operator ==(const Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return (left.r == right.r) &&
|
|
||||||
(left.g == right.g) &&
|
|
||||||
(left.b == right.b) &&
|
|
||||||
(left.a == right.a);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
bool operator !=(const Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return !(left == right);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color operator +(const Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return Color(Uint8(std::min(int(left.r) + right.r, 255)),
|
|
||||||
Uint8(std::min(int(left.g) + right.g, 255)),
|
|
||||||
Uint8(std::min(int(left.b) + right.b, 255)),
|
|
||||||
Uint8(std::min(int(left.a) + right.a, 255)));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color operator -(const Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return Color(Uint8(std::max(int(left.r) - right.r, 0)),
|
|
||||||
Uint8(std::max(int(left.g) - right.g, 0)),
|
|
||||||
Uint8(std::max(int(left.b) - right.b, 0)),
|
|
||||||
Uint8(std::max(int(left.a) - right.a, 0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color operator *(const Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return Color(Uint8(int(left.r) * right.r / 255),
|
|
||||||
Uint8(int(left.g) * right.g / 255),
|
|
||||||
Uint8(int(left.b) * right.b / 255),
|
|
||||||
Uint8(int(left.a) * right.a / 255));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color& operator +=(Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return left = left + right;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color& operator -=(Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return left = left - right;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Color& operator *=(Color& left, const Color& right)
|
|
||||||
{
|
|
||||||
return left = left * right;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
Loading…
Reference in New Issue
Block a user