From 9faaccbfc35185eb3988aaeb0f9bc04af6a472ed Mon Sep 17 00:00:00 2001 From: "Vogel, Rick" Date: Wed, 15 Mar 2023 16:31:14 +0100 Subject: [PATCH] move implementation --- src/common/QskRgbLiterals.h | 142 ------------------------------------ src/common/QskRgbValue.h | 131 +++++++++++++++++++++++++++++++++ src/src.pro | 1 - 3 files changed, 131 insertions(+), 143 deletions(-) delete mode 100644 src/common/QskRgbLiterals.h diff --git a/src/common/QskRgbLiterals.h b/src/common/QskRgbLiterals.h deleted file mode 100644 index e715bd61..00000000 --- a/src/common/QskRgbLiterals.h +++ /dev/null @@ -1,142 +0,0 @@ -/****************************************************************************** - * 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/common/QskRgbValue.h b/src/common/QskRgbValue.h index 17e78333..eb25070b 100644 --- a/src/common/QskRgbValue.h +++ b/src/common/QskRgbValue.h @@ -236,4 +236,135 @@ namespace QskRgb #endif +namespace QskRgb +{ + // Converts a HTML #RRGGBB[AA] color hex string to Qt's RGB 0xAARRGGBB integer + QSK_EXPORT Q_REQUIRED_RESULT constexpr QRgb fromHexString( + const char* const str, const size_t len ) noexcept + { + if ( len != 7 && len != 9 ) + { + return 0; + } + + if ( str[ 0 ] != '#' ) + { + return 0; + } + + QRgb rgb = 0x00; + + 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; + } + + namespace literals + { + Q_REQUIRED_RESULT constexpr QRgb operator""_rgba( + const char* const str, const size_t len ) noexcept + { + return fromHexString( str, len ); + } + +#define QSK_CHECK_CONSTEXPR_LITERAL +#ifdef QSK_CHECK_CONSTEXPR_LITERAL + // example for rgb with alpha channel set to 0xFF + static_assert( "#123456"_rgba == 0xFF123456, "not constexpr" ); + // example for rgba + static_assert( "#112233AA"_rgba == 0xAA112233, "not constexpr" ); +#endif + } +} + #endif diff --git a/src/src.pro b/src/src.pro index 81df011b..6cd9ba77 100644 --- a/src/src.pro +++ b/src/src.pro @@ -40,7 +40,6 @@ HEADERS += \ common/QskPlacementPolicy.h \ common/QskPlatform.h \ common/QskRgbValue.h \ - common/QskRgbLiterals.h \ common/QskScaleEngine.h \ common/QskScaleTickmarks.h \ common/QskShadowMetrics.h \