diff options
Diffstat (limited to 'src/gui/painting/qcolor.h')
-rw-r--r-- | src/gui/painting/qcolor.h | 186 |
1 files changed, 100 insertions, 86 deletions
diff --git a/src/gui/painting/qcolor.h b/src/gui/painting/qcolor.h index 4822612cf8..723b9fce73 100644 --- a/src/gui/painting/qcolor.h +++ b/src/gui/painting/qcolor.h @@ -64,35 +64,43 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QColor &); class Q_GUI_EXPORT QColor { public: - enum Spec { Invalid, Rgb, Hsv, Cmyk, Hsl }; + enum Spec { Invalid, Rgb, Hsv, Cmyk, Hsl, ExtendedRgb }; enum NameFormat { HexRgb, HexArgb }; - inline QColor() Q_DECL_NOTHROW; - QColor(Qt::GlobalColor color) Q_DECL_NOTHROW; - inline QColor(int r, int g, int b, int a = 255); - QColor(QRgb rgb) Q_DECL_NOTHROW; - QColor(QRgba64 rgba64) Q_DECL_NOTHROW; + Q_DECL_CONSTEXPR QColor() noexcept + : cspec(Invalid), ct(USHRT_MAX, 0, 0, 0, 0) {} + QColor(Qt::GlobalColor color) noexcept; + Q_DECL_CONSTEXPR QColor(int r, int g, int b, int a = 255) noexcept + : cspec(isRgbaValid(r, g, b, a) ? Rgb : Invalid), + ct(cspec == Rgb ? a * 0x0101 : 0, + cspec == Rgb ? r * 0x0101 : 0, + cspec == Rgb ? g * 0x0101 : 0, + cspec == Rgb ? b * 0x0101 : 0, + 0) {} + QColor(QRgb rgb) noexcept; + QColor(QRgba64 rgba64) noexcept; #if QT_STRINGVIEW_LEVEL < 2 inline QColor(const QString& name); #endif explicit inline QColor(QStringView name); inline QColor(const char *aname) : QColor(QLatin1String(aname)) {} inline QColor(QLatin1String name); - QColor(Spec spec) Q_DECL_NOTHROW; + QColor(Spec spec) noexcept; #if QT_VERSION < QT_VERSION_CHECK(6,0,0) - inline QColor(const QColor &color) Q_DECL_NOTHROW; // ### Qt 6: remove all of these, the trivial ones are fine. -# ifdef Q_COMPILER_RVALUE_REFS - QColor(QColor &&other) Q_DECL_NOTHROW : cspec(other.cspec), ct(other.ct) {} - QColor &operator=(QColor &&other) Q_DECL_NOTHROW + // ### Qt 6: remove all of these, the trivial ones are fine. + Q_DECL_CONSTEXPR QColor(const QColor &color) noexcept + : cspec(color.cspec), ct(color.ct) + {} + Q_DECL_CONSTEXPR QColor(QColor &&other) noexcept : cspec(other.cspec), ct(other.ct) {} + QColor &operator=(QColor &&other) noexcept { cspec = other.cspec; ct = other.ct; return *this; } -# endif - QColor &operator=(const QColor &) Q_DECL_NOTHROW; + QColor &operator=(const QColor &) noexcept; #endif // Qt < 6 - QColor &operator=(Qt::GlobalColor color) Q_DECL_NOTHROW; + QColor &operator=(Qt::GlobalColor color) noexcept; - bool isValid() const Q_DECL_NOTHROW; + bool isValid() const noexcept; // ### Qt 6: merge overloads QString name() const; @@ -106,25 +114,25 @@ public: static QStringList colorNames(); - inline Spec spec() const Q_DECL_NOTHROW + inline Spec spec() const noexcept { return cspec; } - int alpha() const Q_DECL_NOTHROW; + int alpha() const noexcept; void setAlpha(int alpha); - qreal alphaF() const Q_DECL_NOTHROW; + qreal alphaF() const noexcept; void setAlphaF(qreal alpha); - int red() const Q_DECL_NOTHROW; - int green() const Q_DECL_NOTHROW; - int blue() const Q_DECL_NOTHROW; + int red() const noexcept; + int green() const noexcept; + int blue() const noexcept; void setRed(int red); void setGreen(int green); void setBlue(int blue); - qreal redF() const Q_DECL_NOTHROW; - qreal greenF() const Q_DECL_NOTHROW; - qreal blueF() const Q_DECL_NOTHROW; + qreal redF() const noexcept; + qreal greenF() const noexcept; + qreal blueF() const noexcept; void setRedF(qreal red); void setGreenF(qreal green); void setBlueF(qreal blue); @@ -135,26 +143,26 @@ public: void getRgbF(qreal *r, qreal *g, qreal *b, qreal *a = nullptr) const; void setRgbF(qreal r, qreal g, qreal b, qreal a = 1.0); - QRgba64 rgba64() const Q_DECL_NOTHROW; - void setRgba64(QRgba64 rgba) Q_DECL_NOTHROW; + QRgba64 rgba64() const noexcept; + void setRgba64(QRgba64 rgba) noexcept; - QRgb rgba() const Q_DECL_NOTHROW; - void setRgba(QRgb rgba) Q_DECL_NOTHROW; + QRgb rgba() const noexcept; + void setRgba(QRgb rgba) noexcept; - QRgb rgb() const Q_DECL_NOTHROW; - void setRgb(QRgb rgb) Q_DECL_NOTHROW; + QRgb rgb() const noexcept; + void setRgb(QRgb rgb) noexcept; - int hue() const Q_DECL_NOTHROW; // 0 <= hue < 360 - int saturation() const Q_DECL_NOTHROW; - int hsvHue() const Q_DECL_NOTHROW; // 0 <= hue < 360 - int hsvSaturation() const Q_DECL_NOTHROW; - int value() const Q_DECL_NOTHROW; + int hue() const noexcept; // 0 <= hue < 360 + int saturation() const noexcept; + int hsvHue() const noexcept; // 0 <= hue < 360 + int hsvSaturation() const noexcept; + int value() const noexcept; - qreal hueF() const Q_DECL_NOTHROW; // 0.0 <= hueF < 360.0 - qreal saturationF() const Q_DECL_NOTHROW; - qreal hsvHueF() const Q_DECL_NOTHROW; // 0.0 <= hueF < 360.0 - qreal hsvSaturationF() const Q_DECL_NOTHROW; - qreal valueF() const Q_DECL_NOTHROW; + qreal hueF() const noexcept; // 0.0 <= hueF < 360.0 + qreal saturationF() const noexcept; + qreal hsvHueF() const noexcept; // 0.0 <= hueF < 360.0 + qreal hsvSaturationF() const noexcept; + qreal valueF() const noexcept; void getHsv(int *h, int *s, int *v, int *a = nullptr) const; void setHsv(int h, int s, int v, int a = 255); @@ -162,15 +170,15 @@ public: void getHsvF(qreal *h, qreal *s, qreal *v, qreal *a = nullptr) const; void setHsvF(qreal h, qreal s, qreal v, qreal a = 1.0); - int cyan() const Q_DECL_NOTHROW; - int magenta() const Q_DECL_NOTHROW; - int yellow() const Q_DECL_NOTHROW; - int black() const Q_DECL_NOTHROW; + int cyan() const noexcept; + int magenta() const noexcept; + int yellow() const noexcept; + int black() const noexcept; - qreal cyanF() const Q_DECL_NOTHROW; - qreal magentaF() const Q_DECL_NOTHROW; - qreal yellowF() const Q_DECL_NOTHROW; - qreal blackF() const Q_DECL_NOTHROW; + qreal cyanF() const noexcept; + qreal magentaF() const noexcept; + qreal yellowF() const noexcept; + qreal blackF() const noexcept; void getCmyk(int *c, int *m, int *y, int *k, int *a = nullptr); // ### Qt 6: remove void getCmyk(int *c, int *m, int *y, int *k, int *a = nullptr) const; @@ -180,13 +188,13 @@ public: void getCmykF(qreal *c, qreal *m, qreal *y, qreal *k, qreal *a = nullptr) const; void setCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0); - int hslHue() const Q_DECL_NOTHROW; // 0 <= hue < 360 - int hslSaturation() const Q_DECL_NOTHROW; - int lightness() const Q_DECL_NOTHROW; + int hslHue() const noexcept; // 0 <= hue < 360 + int hslSaturation() const noexcept; + int lightness() const noexcept; - qreal hslHueF() const Q_DECL_NOTHROW; // 0.0 <= hueF < 360.0 - qreal hslSaturationF() const Q_DECL_NOTHROW; - qreal lightnessF() const Q_DECL_NOTHROW; + qreal hslHueF() const noexcept; // 0.0 <= hueF < 360.0 + qreal hslSaturationF() const noexcept; + qreal lightnessF() const noexcept; void getHsl(int *h, int *s, int *l, int *a = nullptr) const; void setHsl(int h, int s, int l, int a = 255); @@ -194,21 +202,22 @@ public: void getHslF(qreal *h, qreal *s, qreal *l, qreal *a = nullptr) const; void setHslF(qreal h, qreal s, qreal l, qreal a = 1.0); - QColor toRgb() const Q_DECL_NOTHROW; - QColor toHsv() const Q_DECL_NOTHROW; - QColor toCmyk() const Q_DECL_NOTHROW; - QColor toHsl() const Q_DECL_NOTHROW; + QColor toRgb() const noexcept; + QColor toHsv() const noexcept; + QColor toCmyk() const noexcept; + QColor toHsl() const noexcept; + QColor toExtendedRgb() const noexcept; - Q_REQUIRED_RESULT QColor convertTo(Spec colorSpec) const Q_DECL_NOTHROW; + Q_REQUIRED_RESULT QColor convertTo(Spec colorSpec) const noexcept; - static QColor fromRgb(QRgb rgb) Q_DECL_NOTHROW; - static QColor fromRgba(QRgb rgba) Q_DECL_NOTHROW; + static QColor fromRgb(QRgb rgb) noexcept; + static QColor fromRgba(QRgb rgba) noexcept; static QColor fromRgb(int r, int g, int b, int a = 255); static QColor fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0); - static QColor fromRgba64(ushort r, ushort g, ushort b, ushort a = USHRT_MAX) Q_DECL_NOTHROW; - static QColor fromRgba64(QRgba64 rgba) Q_DECL_NOTHROW; + static QColor fromRgba64(ushort r, ushort g, ushort b, ushort a = USHRT_MAX) noexcept; + static QColor fromRgba64(QRgba64 rgba) noexcept; static QColor fromHsv(int h, int s, int v, int a = 255); static QColor fromHsvF(qreal h, qreal s, qreal v, qreal a = 1.0); @@ -221,32 +230,42 @@ public: #if QT_DEPRECATED_SINCE(5, 13) QT_DEPRECATED_X("Use QColor::lighter() instead") - Q_REQUIRED_RESULT QColor light(int f = 150) const Q_DECL_NOTHROW; + Q_REQUIRED_RESULT QColor light(int f = 150) const noexcept; QT_DEPRECATED_X("Use QColor::darker() instead") - Q_REQUIRED_RESULT QColor dark(int f = 200) const Q_DECL_NOTHROW; + Q_REQUIRED_RESULT QColor dark(int f = 200) const noexcept; #endif - Q_REQUIRED_RESULT QColor lighter(int f = 150) const Q_DECL_NOTHROW; - Q_REQUIRED_RESULT QColor darker(int f = 200) const Q_DECL_NOTHROW; + Q_REQUIRED_RESULT QColor lighter(int f = 150) const noexcept; + Q_REQUIRED_RESULT QColor darker(int f = 200) const noexcept; - bool operator==(const QColor &c) const Q_DECL_NOTHROW; - bool operator!=(const QColor &c) const Q_DECL_NOTHROW; + bool operator==(const QColor &c) const noexcept; + bool operator!=(const QColor &c) const noexcept; operator QVariant() const; #if QT_STRINGVIEW_LEVEL < 2 static bool isValidColor(const QString &name); #endif - static bool isValidColor(QStringView) Q_DECL_NOTHROW; - static bool isValidColor(QLatin1String) Q_DECL_NOTHROW; + static bool isValidColor(QStringView) noexcept; + static bool isValidColor(QLatin1String) noexcept; private: - void invalidate() Q_DECL_NOTHROW; + void invalidate() noexcept; template <typename String> bool setColorFromString(String name); + static Q_DECL_CONSTEXPR bool isRgbaValid(int r, int g, int b, int a = 255) noexcept Q_DECL_CONST_FUNCTION + { + return uint(r) <= 255 && uint(g) <= 255 && uint(b) <= 255 && uint(a) <= 255; + } + Spec cspec; - union { + union CT { +#ifdef Q_COMPILER_UNIFORM_INIT + CT() {} // doesn't init anything, thus can't be constexpr + Q_DECL_CONSTEXPR explicit CT(ushort a1, ushort a2, ushort a3, ushort a4, ushort a5) noexcept + : array{a1, a2, a3, a4, a5} {} +#endif struct { ushort alpha; ushort red; @@ -275,6 +294,13 @@ private: ushort lightness; ushort pad; } ahsl; + struct { + ushort alphaF16; + ushort redF16; + ushort greenF16; + ushort blueF16; + ushort pad; + } argbExtended; ushort array[5]; } ct; @@ -286,12 +312,6 @@ private: }; Q_DECLARE_TYPEINFO(QColor, QT_VERSION >= QT_VERSION_CHECK(6,0,0) ? Q_MOVABLE_TYPE : Q_RELOCATABLE_TYPE); -inline QColor::QColor() Q_DECL_NOTHROW -{ invalidate(); } - -inline QColor::QColor(int r, int g, int b, int a) -{ setRgb(r, g, b, a); } - inline QColor::QColor(QLatin1String aname) { setNamedColor(aname); } @@ -303,13 +323,7 @@ inline QColor::QColor(const QString& aname) { setNamedColor(aname); } #endif -#if QT_VERSION < QT_VERSION_CHECK(6,0,0) -inline QColor::QColor(const QColor &acolor) Q_DECL_NOTHROW - : cspec(acolor.cspec) -{ ct.argb = acolor.ct.argb; } -#endif - -inline bool QColor::isValid() const Q_DECL_NOTHROW +inline bool QColor::isValid() const noexcept { return cspec != Invalid; } QT_END_NAMESPACE |