diff --git a/src/common/QskRgbValue.h b/src/common/QskRgbValue.h index 74082e6a..58d633c5 100644 --- a/src/common/QskRgbValue.h +++ b/src/common/QskRgbValue.h @@ -238,97 +238,113 @@ namespace QskRgb namespace QskRgb { + enum Format + { + ARGB, + RGBA + }; + // Converts a '#12345678' color hex string to a '0x12345678' unsigned integer - QSK_EXPORT constexpr QRgb fromHexString( const char* const str, const size_t len ) noexcept + QSK_EXPORT constexpr QRgb fromHexString( + const char* const str, const size_t len, const Format format ) noexcept { if ( ( len != 9 && len != 7 ) || str[ 0 ] != '#' ) { return 0; } - QRgb argb = 0xFF; + QRgb c = 0xFF; for ( size_t i = 1; i < len; ++i ) { switch ( str[ i ] ) { case '0': - argb = ( argb << 4 ) | 0x0; + c = ( c << 4 ) | 0x0; break; case '1': - argb = ( argb << 4 ) | 0x1; + c = ( c << 4 ) | 0x1; break; case '2': - argb = ( argb << 4 ) | 0x2; + c = ( c << 4 ) | 0x2; break; case '3': - argb = ( argb << 4 ) | 0x3; + c = ( c << 4 ) | 0x3; break; case '4': - argb = ( argb << 4 ) | 0x4; + c = ( c << 4 ) | 0x4; break; case '5': - argb = ( argb << 4 ) | 0x5; + c = ( c << 4 ) | 0x5; break; case '6': - argb = ( argb << 4 ) | 0x6; + c = ( c << 4 ) | 0x6; break; case '7': - argb = ( argb << 4 ) | 0x7; + c = ( c << 4 ) | 0x7; break; case '8': - argb = ( argb << 4 ) | 0x8; + c = ( c << 4 ) | 0x8; break; case '9': - argb = ( argb << 4 ) | 0x9; + c = ( c << 4 ) | 0x9; break; case 'A': case 'a': - argb = ( argb << 4 ) | 0xA; + c = ( c << 4 ) | 0xA; break; case 'B': case 'b': - argb = ( argb << 4 ) | 0xB; + c = ( c << 4 ) | 0xB; break; case 'C': case 'c': - argb = ( argb << 4 ) | 0xC; + c = ( c << 4 ) | 0xC; break; case 'D': case 'd': - argb = ( argb << 4 ) | 0xD; + c = ( c << 4 ) | 0xD; break; case 'E': case 'e': - argb = ( argb << 4 ) | 0xE; + c = ( c << 4 ) | 0xE; break; case 'F': case 'f': - argb = ( argb << 4 ) | 0xF; + c = ( c << 4 ) | 0xF; break; default: - argb = ( argb << 4 ) | 0x0; + c = ( c << 4 ) | 0x0; break; } } - return argb; + switch ( format ) + { + case ARGB: + return c; + case RGBA: + return len == 9 ? qRgba( qAlpha( c ), qRed( c ), qGreen( c ), qBlue( c ) ) + : qRgba( qRed( c ), qGreen( c ), qBlue( c ), 255 ); + } + + return 0; } namespace literals @@ -383,17 +399,14 @@ namespace QskRgb QSK_EXPORT constexpr QRgb operator""_rgba( const char* const str, const size_t len ) noexcept { - constexpr auto rrggbbaa = 9; - const auto c = fromHexString( str, len ); - return len == rrggbbaa ? qRgba( qAlpha( c ), qRed( c ), qGreen( c ), qBlue( c ) ) - : qRgba( qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) ); + return fromHexString( str, len, RGBA ); } // converts a hex string from '#[AA]RRGGBB' to '0xAARRGGBB' integer QSK_EXPORT constexpr QRgb operator""_argb( const char* const str, const size_t len ) noexcept { - return fromHexString( str, len ); + return fromHexString( str, len, ARGB ); } // converts a hex literal from '0xRRGGBB[AA]' to '0xAARRGGBB' integer @@ -428,17 +441,15 @@ namespace QskRgb QSK_EXPORT constexpr QColor operator""_rgba( const char* const str, const size_t len ) noexcept { - constexpr auto rrggbbaa = 9; - const auto c = fromHexString( str, len ); - return len == rrggbbaa ? QColor{ qAlpha( c ), qRed( c ), qGreen( c ), qBlue( c ) } - : QColor{ qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) }; + const auto c = fromHexString( str, len, RGBA ); + return QColor{ qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) }; } // converts a hex string from '#[AA]RRGGBB' to a QColor QSK_EXPORT constexpr QColor operator""_argb( const char* const str, const size_t len ) noexcept { - const auto c = fromHexString( str, len ); + const auto c = fromHexString( str, len, ARGB ); return QColor{ qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) }; } diff --git a/tests/test_QskRgbLiterals.cpp b/tests/test_QskRgbLiterals.cpp index fb183738..e7b38e4c 100644 --- a/tests/test_QskRgbLiterals.cpp +++ b/tests/test_QskRgbLiterals.cpp @@ -6,25 +6,25 @@ #ifdef QSK_REQUIRE_CONSTEXPR_LITERALS namespace QskRgb::literals::integral { -// RGBA hex string to QRgb with defaulted alpha = 0xFF -static_assert( "#123456"_rgba == 0xFF123456, "invalid or not constexpr" ); -static_assert( "#123456"_argb == 0xFF123456, "invalid or not constexpr" ); + // RGBA hex string to QRgb with defaulted alpha = 0xFF + static_assert( "#123456"_rgba == 0xFF123456, "invalid or not constexpr" ); + static_assert( "#123456"_argb == 0xFF123456, "invalid or not constexpr" ); -// ARGB hex string to QRgb with defaulted alpha = 0xFF -static_assert( "#AA112233"_argb == 0xAA112233, "invalid or not constexpr" ); -static_assert( "#112233AA"_rgba == 0xAA112233, "invalid or not constexpr" ); + // ARGB hex string to QRgb with defaulted alpha = 0xFF + static_assert( "#AA112233"_argb == 0xAA112233, "invalid or not constexpr" ); + static_assert( "#112233AA"_rgba == 0xAA112233, "invalid or not constexpr" ); -// RGBA hex literal to QRgb with defaulted alpha = 0xFF -static_assert( 0x112233_rgba == 0xFF112233, "invalid or not constexpr" ); -static_assert( 0xaabbcc_rgba == 0xFFAABBCC, "invalid or not constexpr" ); -static_assert( 0xAABBCC_rgba == 0xFFAABBCC, "invalid or not constexpr" ); -static_assert( 0x112233aa_rgba == 0xaa112233, "invalid or not constexpr" ); + // RGBA hex literal to QRgb with defaulted alpha = 0xFF + static_assert( 0x112233_rgba == 0xFF112233, "invalid or not constexpr" ); + static_assert( 0xaabbcc_rgba == 0xFFAABBCC, "invalid or not constexpr" ); + static_assert( 0xAABBCC_rgba == 0xFFAABBCC, "invalid or not constexpr" ); + static_assert( 0x112233aa_rgba == 0xaa112233, "invalid or not constexpr" ); -// ARGB hex literal to QRgb with defaulted alpha = 0xFF -static_assert( 0x112233_argb == 0xFF112233, "invalid or not constexpr" ); -static_assert( 0xaabbcc_argb == 0xFFAABBCC, "invalid or not constexpr" ); -static_assert( 0xAABBCC_argb == 0xFFAABBCC, "invalid or not constexpr" ); -static_assert( 0x112233aa_argb == 0x112233aa, "invalid or not constexpr" ); + // ARGB hex literal to QRgb with defaulted alpha = 0xFF + static_assert( 0x112233_argb == 0xFF112233, "invalid or not constexpr" ); + static_assert( 0xaabbcc_argb == 0xFFAABBCC, "invalid or not constexpr" ); + static_assert( 0xAABBCC_argb == 0xFFAABBCC, "invalid or not constexpr" ); + static_assert( 0x112233aa_argb == 0x112233aa, "invalid or not constexpr" ); } #endif @@ -52,7 +52,7 @@ void QskRgbLiterals::parsing() QFETCH( QRgb, expected ); const auto actual = text.toStdString(); - QCOMPARE( QskRgb::fromHexString( actual.c_str(), actual.size() ), expected ); + QCOMPARE( QskRgb::fromHexString( actual.c_str(), actual.size(), QskRgb::ARGB ), expected ); } void QskRgbLiterals::qrgbLiterals_data()