diff options
-rw-r--r-- | src/gui/painting/qcolor.cpp | 86 | ||||
-rw-r--r-- | tests/auto/gui/painting/qcolor/tst_qcolor.cpp | 3 |
2 files changed, 46 insertions, 43 deletions
diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index 1d7375d1df..8271ca7016 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -54,77 +54,77 @@ QT_BEGIN_NAMESPACE /*! \internal - If s[0..1] is a valid hex number, returns its integer value, + If s[0..n] is a valid hex number, returns its integer value, otherwise returns -1. */ -static inline int hex2int(const char *s) +static inline int hex2int(const char *s, int n) { - const int hi = QtMiscUtils::fromHex(s[0]); - if (hi < 0) + if (n < 0) return -1; - const int lo = QtMiscUtils::fromHex(s[1]); - if (lo < 0) - return -1; - return (hi << 4) | lo; -} - -/*! - \internal - If s is a valid hex digit, returns its integer value, - multiplied by 0x11, otherwise returns -1. - */ -static inline int hex2int(char s) -{ - const int h = QtMiscUtils::fromHex(s); - return h < 0 ? h : (h << 4) | h; + int result = 0; + for (; n > 0; --n) { + result = result * 16; + const int h = QtMiscUtils::fromHex(*s++); + if (h < 0) + return -1; + result += h; + } + return result; } -static bool get_hex_rgb(const char *name, size_t len, QRgb *rgb) +static bool get_hex_rgb(const char *name, size_t len, QRgba64 *rgb) { if (name[0] != '#') return false; name++; --len; int a, r, g, b; - a = 255; + a = 65535; if (len == 12) { - r = hex2int(name); - g = hex2int(name + 4); - b = hex2int(name + 8); + r = hex2int(name + 0, 4); + g = hex2int(name + 4, 4); + b = hex2int(name + 8, 4); } else if (len == 9) { - r = hex2int(name); - g = hex2int(name + 3); - b = hex2int(name + 6); + r = hex2int(name + 0, 3); + g = hex2int(name + 3, 3); + b = hex2int(name + 6, 3); + r = (r << 4) | (r >> 8); + g = (g << 4) | (g >> 8); + b = (b << 4) | (b >> 8); } else if (len == 8) { - a = hex2int(name); - r = hex2int(name + 2); - g = hex2int(name + 4); - b = hex2int(name + 6); + a = hex2int(name + 0, 2) * 0x101; + r = hex2int(name + 2, 2) * 0x101; + g = hex2int(name + 4, 2) * 0x101; + b = hex2int(name + 6, 2) * 0x101; } else if (len == 6) { - r = hex2int(name); - g = hex2int(name + 2); - b = hex2int(name + 4); + r = hex2int(name + 0, 2) * 0x101; + g = hex2int(name + 2, 2) * 0x101; + b = hex2int(name + 4, 2) * 0x101; } else if (len == 3) { - r = hex2int(name[0]); - g = hex2int(name[1]); - b = hex2int(name[2]); + r = hex2int(name + 0, 1) * 0x1111; + g = hex2int(name + 1, 1) * 0x1111; + b = hex2int(name + 2, 1) * 0x1111; } else { r = g = b = -1; } - if ((uint)r > 255 || (uint)g > 255 || (uint)b > 255 || (uint)a > 255) { + if ((uint)r > 65535 || (uint)g > 65535 || (uint)b > 65535 || (uint)a > 65535) { *rgb = 0; return false; } - *rgb = qRgba(r, g ,b, a); + *rgb = qRgba64(r, g ,b, a); return true; } bool qt_get_hex_rgb(const char *name, QRgb *rgb) { - return get_hex_rgb(name, qstrlen(name), rgb); + QRgba64 rgba64; + if (!get_hex_rgb(name, qstrlen(name), &rgba64)) + return false; + *rgb = rgba64.toArgb32(); + return true; } -static bool get_hex_rgb(const QChar *str, size_t len, QRgb *rgb) +static bool get_hex_rgb(const QChar *str, size_t len, QRgba64 *rgb) { if (len > 13) return false; @@ -948,9 +948,9 @@ bool QColor::setColorFromString(String name) } if (name[0] == QLatin1Char('#')) { - QRgb rgba; + QRgba64 rgba; if (get_hex_rgb(name.data(), name.size(), &rgba)) { - setRgba(rgba); + setRgba64(rgba); return true; } else { invalidate(); diff --git a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp index ece7a30830..72bad03a6a 100644 --- a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp +++ b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp @@ -318,6 +318,9 @@ void tst_QColor::namehex_data() QTest::newRow("global color darkCyan") << "#008080" << QColor(Qt::darkCyan); QTest::newRow("global color darkMagenta") << "#800080" << QColor(Qt::darkMagenta); QTest::newRow("global color darkYellow") << "#808000" << QColor(Qt::darkYellow); + QTest::newRow("#RGB") << "#888" << QColor(0x88, 0x88, 0x88); + QTest::newRow("#RRRGGGBBB") << "#80F80F80F" << QColor(qRgba64(0x80f8, 0x80f8, 0x80f8, 0xffff)); + QTest::newRow("#RRRRGGGGBBBB") << "#808180818081" << QColor(qRgba64(0x8081, 0x8081, 0x8081, 0xffff)); QTest::newRow("transparent red") << "#66ff0000" << QColor(255, 0, 0, 102); QTest::newRow("invalid red") << "#gg0000" << QColor(); QTest::newRow("invalid transparent") << "#gg00ff00" << QColor(); |