/******************************************************************************
 * QSkinny - Copyright (C) The authors
 *           SPDX-License-Identifier: BSD-3-Clause
 *****************************************************************************/

#ifndef QSK_RGB_VALUE_H
#define QSK_RGB_VALUE_H

#include "QskGlobal.h"
#include "QskGradientStop.h"

#include <qcolor.h>

class QEasingCurve;
class QImage;

namespace QskRgb
{
    /* Web colors */

    constexpr const QRgb AliceBlue            = 0xfff0f8ff;
    constexpr const QRgb AntiqueWhite         = 0xfffaebd7;
    constexpr const QRgb Aqua                 = 0xff00ffff;
    constexpr const QRgb Aquamarine           = 0xff7fffd4;
    constexpr const QRgb Azure                = 0xfff0ffff;
    constexpr const QRgb Beige                = 0xfff5f5dc;
    constexpr const QRgb Bisque               = 0xffffe4c4;
    constexpr const QRgb Black                = 0xff000000;
    constexpr const QRgb BlanchedAlmond       = 0xffffebcd;
    constexpr const QRgb Blue                 = 0xff0000ff;
    constexpr const QRgb BlueViolet           = 0xff8a2be2;
    constexpr const QRgb Brown                = 0xffa52a2a;
    constexpr const QRgb Burlywood            = 0xffdeb887;
    constexpr const QRgb CadetBlue            = 0xff5f9ea0;
    constexpr const QRgb Chartreuse           = 0xff7fff00;
    constexpr const QRgb Chocolate            = 0xffd2691e;
    constexpr const QRgb Coral                = 0xffff7f50;
    constexpr const QRgb CornflowerBlue       = 0xff6495ed;
    constexpr const QRgb Cornsilk             = 0xfffff8dc;
    constexpr const QRgb Crimson              = 0xffdc143c;
    constexpr const QRgb Cyan                 = 0xff00ffff;
    constexpr const QRgb DarkBlue             = 0xff00008b;
    constexpr const QRgb DarkCyan             = 0xff008b8b;
    constexpr const QRgb DarkGoldenrod        = 0xffb8860b;
    constexpr const QRgb DarkGray             = 0xffa9a9a9;
    constexpr const QRgb DarkGreen            = 0xff006400;
    constexpr const QRgb DarkGrey             = 0xffa9a9a9;
    constexpr const QRgb DarkKhaki            = 0xffbdb76b;
    constexpr const QRgb DarkMagenta          = 0xff8b008b;
    constexpr const QRgb DarkOliveGreen       = 0xff556b2f;
    constexpr const QRgb DarkOrange           = 0xffff8c00;
    constexpr const QRgb DarkOrchid           = 0xff9932cc;
    constexpr const QRgb DarkRed              = 0xff8b0000;
    constexpr const QRgb DarkSalmon           = 0xffe9967a;
    constexpr const QRgb DarkSeaGreen         = 0xff8fbc8f;
    constexpr const QRgb DarkSlateBlue        = 0xff483d8b;
    constexpr const QRgb DarkSlateGray        = 0xff2f4f4f;
    constexpr const QRgb DarkSlateGrey        = 0xff2f4f4f;
    constexpr const QRgb DarkTurquoise        = 0xff00ced1;
    constexpr const QRgb DarkViolet           = 0xff9400d3;
    constexpr const QRgb DeepPink             = 0xffff1493;
    constexpr const QRgb DeepSkyBlue          = 0xff00bfff;
    constexpr const QRgb DimGray              = 0xff696969;
    constexpr const QRgb DimGrey              = 0xff696969;
    constexpr const QRgb DodgerBlue           = 0xff1e90ff;
    constexpr const QRgb FireBrick            = 0xffb22222;
    constexpr const QRgb FloralWhite          = 0xfffffaf0;
    constexpr const QRgb ForestGreen          = 0xff228b22;
    constexpr const QRgb Fuchsia              = 0xffff00ff;
    constexpr const QRgb Gainsboro            = 0xffdcdcdc;
    constexpr const QRgb GhostWhite           = 0xfff8f8ff;
    constexpr const QRgb Gold                 = 0xffffd700;
    constexpr const QRgb Goldenrod            = 0xffdaa520;
    constexpr const QRgb Gray                 = 0xff808080;
    constexpr const QRgb Green                = 0xff008000;
    constexpr const QRgb GreenYellow          = 0xffadff2f;
    constexpr const QRgb Grey                 = 0xff808080;
    constexpr const QRgb Honeydew             = 0xfff0fff0;
    constexpr const QRgb HotPink              = 0xffff69b4;
    constexpr const QRgb IndianRed            = 0xffcd5c5c;
    constexpr const QRgb Indigo               = 0xff4b0082;
    constexpr const QRgb Ivory                = 0xfffffff0;
    constexpr const QRgb Khaki                = 0xfff0e68c;
    constexpr const QRgb Lavender             = 0xffe6e6fa;
    constexpr const QRgb LavenderBlush        = 0xfffff0f5;
    constexpr const QRgb LawnGreen            = 0xff7cfc00;
    constexpr const QRgb LemonChiffon         = 0xfffffacd;
    constexpr const QRgb LightBlue            = 0xffadd8e6;
    constexpr const QRgb LightCoral           = 0xfff08080;
    constexpr const QRgb LightCyan            = 0xffe0ffff;
    constexpr const QRgb LightGoldenrodYellow = 0xfffafad2;
    constexpr const QRgb LightGray            = 0xffd3d3d3;
    constexpr const QRgb LightGreen           = 0xff90ee90;
    constexpr const QRgb LightGrey            = 0xffd3d3d3;
    constexpr const QRgb LightPink            = 0xffffb6c1;
    constexpr const QRgb LightSalmon          = 0xffffa07a;
    constexpr const QRgb LightSeaGreen        = 0xff20b2aa;
    constexpr const QRgb LightSkyBlue         = 0xff87cefa;
    constexpr const QRgb LightSlateGray       = 0xff778899;
    constexpr const QRgb LightSlateGrey       = 0xff778899;
    constexpr const QRgb LightSteelBlue       = 0xffb0c4de;
    constexpr const QRgb LightYellow          = 0xffffffe0;
    constexpr const QRgb Lime                 = 0xff00ff00;
    constexpr const QRgb LimeGreen            = 0xff32cd32;
    constexpr const QRgb Linen                = 0xfffaf0e6;
    constexpr const QRgb Magenta              = 0xffff00ff;
    constexpr const QRgb Maroon               = 0xff800000;
    constexpr const QRgb MediumAquamarine     = 0xff66cdaa;
    constexpr const QRgb MediumBlue           = 0xff0000cd;
    constexpr const QRgb MediumOrchid         = 0xffba55d3;
    constexpr const QRgb MediumPurple         = 0xff9370db;
    constexpr const QRgb MediumSeaGreen       = 0xff3cb371;
    constexpr const QRgb MediumSlateBlue      = 0xff7b68ee;
    constexpr const QRgb MediumSpringGreen    = 0xff00fa9a;
    constexpr const QRgb MediumTurquoise      = 0xff48d1cc;
    constexpr const QRgb MediumVioletRed      = 0xffc71585;
    constexpr const QRgb MidnightBlue         = 0xff191970;
    constexpr const QRgb MintCream            = 0xfff5fffa;
    constexpr const QRgb MistyRose            = 0xffffe4e1;
    constexpr const QRgb Moccasin             = 0xffffe4b5;
    constexpr const QRgb NavajoWhite          = 0xffffdead;
    constexpr const QRgb Navy                 = 0xff000080;
    constexpr const QRgb OldLace              = 0xfffdf5e6;
    constexpr const QRgb Olive                = 0xff808000;
    constexpr const QRgb OliveDrab            = 0xff6b8e23;
    constexpr const QRgb Orange               = 0xffffa500;
    constexpr const QRgb OrangeRed            = 0xffff4500;
    constexpr const QRgb Orchid               = 0xffda70d6;
    constexpr const QRgb PaleGoldenrod        = 0xffeee8aa;
    constexpr const QRgb PaleGreen            = 0xff98fb98;
    constexpr const QRgb PaleTurquoise        = 0xffafeeee;
    constexpr const QRgb PaleVioletRed        = 0xffdb7093;
    constexpr const QRgb PapayaWhip           = 0xffffefd5;
    constexpr const QRgb PeachPuff            = 0xffffdab9;
    constexpr const QRgb Peru                 = 0xffcd853f;
    constexpr const QRgb Pink                 = 0xffffc0cb;
    constexpr const QRgb Plum                 = 0xffdda0dd;
    constexpr const QRgb PowderBlue           = 0xffb0e0e6;
    constexpr const QRgb Purple               = 0xff800080;
    constexpr const QRgb Red                  = 0xffff0000;
    constexpr const QRgb RosyBrown            = 0xffbc8f8f;
    constexpr const QRgb RoyalBlue            = 0xff4169e1;
    constexpr const QRgb SaddleBrown          = 0xff8b4513;
    constexpr const QRgb Salmon               = 0xfffa8072;
    constexpr const QRgb SandyBrown           = 0xfff4a460;
    constexpr const QRgb SeaGreen             = 0xff2e8b57;
    constexpr const QRgb Seashell             = 0xfffff5ee;
    constexpr const QRgb Sienna               = 0xffa0522d;
    constexpr const QRgb Silver               = 0xffc0c0c0;
    constexpr const QRgb SkyBlue              = 0xff87ceeb;
    constexpr const QRgb SlateBlue            = 0xff6a5acd;
    constexpr const QRgb SlateGrey            = 0xff708090;
    constexpr const QRgb Snow                 = 0xfffffafa;
    constexpr const QRgb SpringGreen          = 0xff00ff7f;
    constexpr const QRgb SteelBlue            = 0xff4682b4;
    constexpr const QRgb Tan                  = 0xffd2b48c;
    constexpr const QRgb Teal                 = 0xff008080;
    constexpr const QRgb Thistle              = 0xffd8bfd8;
    constexpr const QRgb Tomato               = 0xffff6347;
    constexpr const QRgb Turquoise            = 0xff40e0d0;
    constexpr const QRgb Violet               = 0xffee82ee;
    constexpr const QRgb Wheat                = 0xfff5deb3;
    constexpr const QRgb WhiteSmoke           = 0xfff5f5f5;
    constexpr const QRgb Yellow               = 0xffffff00;
    constexpr const QRgb YellowGreen          = 0xff9acd32;
    constexpr const QRgb White                = 0xffffffff;

    // others
    constexpr const QRgb Transparent = 0x00000000;
    constexpr const QRgb AlphaMask   = 0xff000000;
    constexpr const QRgb ColorMask   = 0x00ffffff;
    constexpr const QRgb RGBAMask    = 0xffffffff;
}

namespace QskRgb
{
    QSK_EXPORT QRgb rgb( Qt::GlobalColor );
    QSK_EXPORT QRgb interpolated( QRgb rgb1, QRgb rgb2, qreal ratio );
    QSK_EXPORT QColor interpolated( const QColor& c1, const QColor& c2, qreal ratio );

    inline QColor toTransparent( const QColor& c1, int alpha = 0 )
    {
        const auto alphaU = static_cast< uint >( alpha );
        return QColor::fromRgba( ( c1.rgb() & ColorMask ) | ( ( alphaU & 0xffu ) << 24 ) );
    }

    inline QColor toTransparent( Qt::GlobalColor color, int alpha = 0 )
    {
        return toTransparent( QColor( color ), alpha );
    }

    inline constexpr QRgb toTransparent( QRgb rgb, int alpha = 0 ) noexcept
    {
        return ( rgb & ColorMask ) | ( ( static_cast< uint >( alpha ) & 0xffu ) << 24 );
    }

    inline QColor toTransparentF( const QColor& color, qreal opacity )
    {
        return toTransparent( color, qRound( opacity * 255 ) );
    }

    inline QColor toTransparentF( Qt::GlobalColor color, qreal opacity )
    {
        return toTransparent( QColor( color ), qRound( opacity * 255 ) );
    }

    inline constexpr QRgb toTransparentF( QRgb rgb, qreal opacity ) noexcept
    {
        return toTransparent( rgb, qRound( opacity * 255 ) );
    }

    QSK_EXPORT QRgb lighter( QRgb, int factor = 150 ) noexcept;
    QSK_EXPORT QRgb darker( QRgb, int factor = 200 ) noexcept;
}

namespace QskRgb
{
    /*
        One dimensional array of colors ( height is always 1 ) of
        Format_RGBA8888_Premultiplied
     */

    QSK_EXPORT QImage colorTable( int size, const QskGradientStops& );
    QSK_EXPORT QImage colorTable( int size, QRgb, QRgb, const QEasingCurve& );
}

#ifndef QT_NO_DEBUG_STREAM

class QDebug;

namespace QskRgb
{
    QSK_EXPORT void debugColor( QDebug, const QColor& );
    QSK_EXPORT void debugColor( QDebug, QRgb );
}

#endif

#endif
