qskinny/src/common/QskRgbPalette.cpp

95 lines
2.6 KiB
C++
Raw Normal View History

2019-06-20 10:02:28 +00:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
2020-07-31 10:43:08 +00:00
* This file may be used under the terms of the QSkinny License, Version 1.0
2019-06-20 10:02:28 +00:00
*****************************************************************************/
2020-07-31 10:43:08 +00:00
#include "QskRgbPalette.h"
#include "QskRgbValue.h"
2020-07-31 11:26:22 +00:00
#include "QskGradient.h"
#define RGB( color, weight ) color ## weight
#define RGBTABLE( c ) \
{ \
RGB( c, 50 ), RGB( c, 100 ), RGB( c, 200 ), RGB( c, 300 ), RGB( c, 400 ), \
RGB( c, 500 ), RGB( c, 600 ), RGB( c, 700 ), RGB( c, 800 ), RGB( c, 900 ) \
}
namespace
{
2020-07-31 10:43:08 +00:00
class Palette : public QskRgbPalette
{
2018-08-03 06:15:28 +00:00
public:
2020-07-31 10:43:08 +00:00
Palette( int index )
{
using namespace QskRgbValue;
2020-07-31 10:43:08 +00:00
static constexpr QRgb table[][ Palette::NumWeights ] =
{
RGBTABLE( Red ),
RGBTABLE( Pink ),
RGBTABLE( Purple ),
RGBTABLE( DeepPurple ),
RGBTABLE( Indigo ),
RGBTABLE( Blue ),
RGBTABLE( LightBlue ),
RGBTABLE( Cyan ),
RGBTABLE( Teal ),
RGBTABLE( Green ),
2018-08-03 06:15:28 +00:00
RGBTABLE( LightGreen ),
RGBTABLE( Lime ),
RGBTABLE( Yellow ),
RGBTABLE( Amber ),
RGBTABLE( Orange ),
RGBTABLE( DeepOrange ),
RGBTABLE( Brown ),
RGBTABLE( Grey ),
RGBTABLE( BlueGrey ),
};
2018-08-03 06:15:28 +00:00
const int count = sizeof( table ) / sizeof( table[ 0 ] );
m_rgb = table[ qBound( 0, index, count ) ];
}
};
}
2020-07-31 10:43:08 +00:00
QskRgbPalette QskRgbPalette::palette( Theme theme )
{
2020-07-31 10:43:08 +00:00
return Palette( static_cast< int >( theme ) );
}
2020-07-31 11:26:22 +00:00
QVector< QskGradientStop > QskRgbPalette::colorStops( bool discrete ) const
{
QVector< QskGradientStop > stops;
if ( discrete )
stops.reserve( 2 * QskRgbPalette::NumWeights - 2 );
else
stops.reserve( QskRgbPalette::NumWeights );
stops += QskGradientStop( 0.0, m_rgb[0] );
if ( discrete )
{
constexpr auto step = 1.0 / NumWeights;
for ( int i = 1; i < NumWeights; i++ )
{
const qreal pos = i * step;
stops += QskGradientStop( pos, m_rgb[i-1] );
stops += QskGradientStop( pos, m_rgb[i] );
}
}
else
{
constexpr auto step = 1.0 / ( NumWeights - 1 );
for ( int i = 1; i < NumWeights - 1; i++ )
stops += QskGradientStop( i * step, m_rgb[i] );
}
stops += QskGradientStop( 1.0, m_rgb[NumWeights - 1] );
return stops;
}