From 221f7ccbedd500fefc43036989b83fd1aa15efb2 Mon Sep 17 00:00:00 2001 From: "Vogel, Rick" Date: Tue, 14 Mar 2023 13:09:17 +0100 Subject: [PATCH] Add RGBA string literal --- src/common/QskRgbLiterals.h | 142 ++++++++++++++++++++++++++++++++++++ src/src.pro | 1 + 2 files changed, 143 insertions(+) create mode 100644 src/common/QskRgbLiterals.h diff --git a/src/common/QskRgbLiterals.h b/src/common/QskRgbLiterals.h new file mode 100644 index 00000000..e715bd61 --- /dev/null +++ b/src/common/QskRgbLiterals.h @@ -0,0 +1,142 @@ +/****************************************************************************** + * Copyright (C) 2023 Edelhirsch Software GmbH + * This file may be used under the terms of the 3-clause BSD License + *****************************************************************************/ + +#ifndef QSK_RGB_LITERALS_H +#define QSK_RGB_LITERALS_H + +namespace QskRgb +{ + namespace literals + { + /// @brief converts HTML #RRGGBB[AA] color hex string to Qt's RGB 0xAARRGGBB integer + /// @param str The string literal + /// @param len The length of the literal + /// @note non-hexadecimal characters are replaced with 0x0 value + constexpr unsigned int operator""_rgba( const char* const str, const size_t len ) + { + if ( len != 7 && len != 9 ) + { + return 0; + } + + unsigned int rgb = 0x00; + + // skip # character + for ( size_t i = 1; i < len; ++i ) + { + switch ( str[ i ] ) + { + case '0': + rgb = ( rgb << 4 ) | 0x0; + break; + + case '1': + rgb = ( rgb << 4 ) | 0x1; + break; + + case '2': + rgb = ( rgb << 4 ) | 0x2; + break; + + case '3': + rgb = ( rgb << 4 ) | 0x3; + break; + + case '4': + rgb = ( rgb << 4 ) | 0x4; + break; + + case '5': + rgb = ( rgb << 4 ) | 0x5; + break; + + case '6': + rgb = ( rgb << 4 ) | 0x6; + break; + + case '7': + rgb = ( rgb << 4 ) | 0x7; + break; + + case '8': + rgb = ( rgb << 4 ) | 0x8; + break; + + case '9': + rgb = ( rgb << 4 ) | 0x9; + break; + + case 'A': + case 'a': + rgb = ( rgb << 4 ) | 0xA; + break; + + case 'B': + case 'b': + rgb = ( rgb << 4 ) | 0xB; + break; + + case 'C': + case 'c': + rgb = ( rgb << 4 ) | 0xC; + break; + + case 'D': + case 'd': + rgb = ( rgb << 4 ) | 0xD; + break; + + case 'E': + case 'e': + rgb = ( rgb << 4 ) | 0xE; + break; + + case 'F': + case 'f': + rgb = ( rgb << 4 ) | 0xF; + break; + + default: + rgb = ( rgb << 4 ) | 0x0; + break; + } + } + + // add default 0xFF for alpha channel + if ( len > 1 && len <= 7 ) + { + rgb |= 0xFF000000; + } + + // convert rrggbbaa to aarrggbb + if ( len > 7 ) + { + rgb = ( 0x000000FF & rgb ) << 24 | ( rgb >> 8 ); + } + + return rgb; + } + + // example for rgb + static_assert( "#123456"_rgba == 0xFF123456, "not constexpr" ); + // example for rgba + static_assert( "#112233aa"_rgba == 0xAA112233, "not constexpr" ); + + // bad examples + static_assert( ""_rgba == 0x0, "not constexpr" ); + static_assert( "#"_rgba == 0x0, "not constexpr" ); + static_assert( "#1"_rgba == 0x0, "not constexpr" ); + static_assert( "#12"_rgba == 0x0, "not constexpr" ); + static_assert( "#123"_rgba == 0x0, "not constexpr" ); + static_assert( "#1234"_rgba == 0x0, "not constexpr" ); + static_assert( "#12345"_rgba == 0x0, "not constexpr" ); + static_assert( "#112233a"_rgba == 0x0, "not constexpr" ); + static_assert( "#fffffffff"_rgba == 0x0, "not constexpr" ); + static_assert( "#WTF01337"_rgba == 0x3700F013, "not constexpr" ); + static_assert( "#JUSTWHY?"_rgba == 0x0, "not constexpr" ); + } +} + +#endif diff --git a/src/src.pro b/src/src.pro index 6cd9ba77..81df011b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -40,6 +40,7 @@ HEADERS += \ common/QskPlacementPolicy.h \ common/QskPlatform.h \ common/QskRgbValue.h \ + common/QskRgbLiterals.h \ common/QskScaleEngine.h \ common/QskScaleTickmarks.h \ common/QskShadowMetrics.h \