add channel format argument

This commit is contained in:
Vogel, Rick 2023-03-24 16:42:05 +01:00
parent 5ac7be697a
commit 809966a220
2 changed files with 58 additions and 47 deletions

View File

@ -238,97 +238,113 @@ namespace QskRgb
namespace QskRgb namespace QskRgb
{ {
enum Format
{
ARGB,
RGBA
};
// Converts a '#12345678' color hex string to a '0x12345678' unsigned integer // 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 ] != '#' ) if ( ( len != 9 && len != 7 ) || str[ 0 ] != '#' )
{ {
return 0; return 0;
} }
QRgb argb = 0xFF; QRgb c = 0xFF;
for ( size_t i = 1; i < len; ++i ) for ( size_t i = 1; i < len; ++i )
{ {
switch ( str[ i ] ) switch ( str[ i ] )
{ {
case '0': case '0':
argb = ( argb << 4 ) | 0x0; c = ( c << 4 ) | 0x0;
break; break;
case '1': case '1':
argb = ( argb << 4 ) | 0x1; c = ( c << 4 ) | 0x1;
break; break;
case '2': case '2':
argb = ( argb << 4 ) | 0x2; c = ( c << 4 ) | 0x2;
break; break;
case '3': case '3':
argb = ( argb << 4 ) | 0x3; c = ( c << 4 ) | 0x3;
break; break;
case '4': case '4':
argb = ( argb << 4 ) | 0x4; c = ( c << 4 ) | 0x4;
break; break;
case '5': case '5':
argb = ( argb << 4 ) | 0x5; c = ( c << 4 ) | 0x5;
break; break;
case '6': case '6':
argb = ( argb << 4 ) | 0x6; c = ( c << 4 ) | 0x6;
break; break;
case '7': case '7':
argb = ( argb << 4 ) | 0x7; c = ( c << 4 ) | 0x7;
break; break;
case '8': case '8':
argb = ( argb << 4 ) | 0x8; c = ( c << 4 ) | 0x8;
break; break;
case '9': case '9':
argb = ( argb << 4 ) | 0x9; c = ( c << 4 ) | 0x9;
break; break;
case 'A': case 'A':
case 'a': case 'a':
argb = ( argb << 4 ) | 0xA; c = ( c << 4 ) | 0xA;
break; break;
case 'B': case 'B':
case 'b': case 'b':
argb = ( argb << 4 ) | 0xB; c = ( c << 4 ) | 0xB;
break; break;
case 'C': case 'C':
case 'c': case 'c':
argb = ( argb << 4 ) | 0xC; c = ( c << 4 ) | 0xC;
break; break;
case 'D': case 'D':
case 'd': case 'd':
argb = ( argb << 4 ) | 0xD; c = ( c << 4 ) | 0xD;
break; break;
case 'E': case 'E':
case 'e': case 'e':
argb = ( argb << 4 ) | 0xE; c = ( c << 4 ) | 0xE;
break; break;
case 'F': case 'F':
case 'f': case 'f':
argb = ( argb << 4 ) | 0xF; c = ( c << 4 ) | 0xF;
break; break;
default: default:
argb = ( argb << 4 ) | 0x0; c = ( c << 4 ) | 0x0;
break; 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 namespace literals
@ -383,17 +399,14 @@ namespace QskRgb
QSK_EXPORT constexpr QRgb operator""_rgba( QSK_EXPORT constexpr QRgb operator""_rgba(
const char* const str, const size_t len ) noexcept const char* const str, const size_t len ) noexcept
{ {
constexpr auto rrggbbaa = 9; return fromHexString( str, len, RGBA );
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 ) );
} }
// converts a hex string from '#[AA]RRGGBB' to '0xAARRGGBB' integer // converts a hex string from '#[AA]RRGGBB' to '0xAARRGGBB' integer
QSK_EXPORT constexpr QRgb operator""_argb( QSK_EXPORT constexpr QRgb operator""_argb(
const char* const str, const size_t len ) noexcept 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 // converts a hex literal from '0xRRGGBB[AA]' to '0xAARRGGBB' integer
@ -428,17 +441,15 @@ namespace QskRgb
QSK_EXPORT constexpr QColor operator""_rgba( QSK_EXPORT constexpr QColor operator""_rgba(
const char* const str, const size_t len ) noexcept const char* const str, const size_t len ) noexcept
{ {
constexpr auto rrggbbaa = 9; const auto c = fromHexString( str, len, RGBA );
const auto c = fromHexString( str, len ); return QColor{ qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) };
return len == rrggbbaa ? QColor{ qAlpha( c ), qRed( c ), qGreen( c ), qBlue( c ) }
: QColor{ qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) };
} }
// converts a hex string from '#[AA]RRGGBB' to a QColor // converts a hex string from '#[AA]RRGGBB' to a QColor
QSK_EXPORT constexpr QColor operator""_argb( QSK_EXPORT constexpr QColor operator""_argb(
const char* const str, const size_t len ) noexcept 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 ) }; return QColor{ qRed( c ), qGreen( c ), qBlue( c ), qAlpha( c ) };
} }

View File

@ -6,25 +6,25 @@
#ifdef QSK_REQUIRE_CONSTEXPR_LITERALS #ifdef QSK_REQUIRE_CONSTEXPR_LITERALS
namespace QskRgb::literals::integral namespace QskRgb::literals::integral
{ {
// RGBA hex string to QRgb with defaulted alpha = 0xFF // RGBA hex string to QRgb with defaulted alpha = 0xFF
static_assert( "#123456"_rgba == 0xFF123456, "invalid or not constexpr" ); static_assert( "#123456"_rgba == 0xFF123456, "invalid or not constexpr" );
static_assert( "#123456"_argb == 0xFF123456, "invalid or not constexpr" ); static_assert( "#123456"_argb == 0xFF123456, "invalid or not constexpr" );
// ARGB hex string to QRgb with defaulted alpha = 0xFF // ARGB hex string to QRgb with defaulted alpha = 0xFF
static_assert( "#AA112233"_argb == 0xAA112233, "invalid or not constexpr" ); static_assert( "#AA112233"_argb == 0xAA112233, "invalid or not constexpr" );
static_assert( "#112233AA"_rgba == 0xAA112233, "invalid or not constexpr" ); static_assert( "#112233AA"_rgba == 0xAA112233, "invalid or not constexpr" );
// RGBA hex literal to QRgb with defaulted alpha = 0xFF // RGBA hex literal to QRgb with defaulted alpha = 0xFF
static_assert( 0x112233_rgba == 0xFF112233, "invalid or not constexpr" ); 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( 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" ); static_assert( 0x112233aa_rgba == 0xaa112233, "invalid or not constexpr" );
// ARGB hex literal to QRgb with defaulted alpha = 0xFF // ARGB hex literal to QRgb with defaulted alpha = 0xFF
static_assert( 0x112233_argb == 0xFF112233, "invalid or not constexpr" ); 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( 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" ); static_assert( 0x112233aa_argb == 0x112233aa, "invalid or not constexpr" );
} }
#endif #endif
@ -52,7 +52,7 @@ void QskRgbLiterals::parsing()
QFETCH( QRgb, expected ); QFETCH( QRgb, expected );
const auto actual = text.toStdString(); 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() void QskRgbLiterals::qrgbLiterals_data()