qskinny/src/common/QskRgbPalette.cpp

119 lines
3.0 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 ) \
2021-12-23 18:05:59 +00:00
{ \
RGB( c, 0 ), RGB( c, 10 ), RGB( c, 20 ), RGB( c, 30 ), RGB( c, 40 ), \
RGB( c, 50 ), RGB( c, 60 ), RGB( c, 70 ), RGB( c, 80 ), RGB( c, 90 ), \
RGB( c, 95 ), RGB( c, 99 ), RGB( c, 100 ) \
2021-12-23 18:05:59 +00:00
}
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 )
{
2020-08-15 11:29:17 +00:00
using namespace QskRgb;
2020-07-31 10:43:08 +00:00
static constexpr QRgb table[][ Palette::NumWeights ] =
{
RGBTABLE( DefaultMaterialPrimary ),
RGBTABLE( DefaultMaterialSecondary ),
RGBTABLE( DefaultMaterialTertiary ),
RGBTABLE( DefaultMaterialError ),
RGBTABLE( DefaultMaterialNeutral ),
RGBTABLE( DefaultMaterialNeutralVariant ),
};
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
2021-09-17 11:47:43 +00:00
static QskGradientStops qskColorStops(
const QRgb* rgb, int count, bool discrete )
2020-07-31 11:26:22 +00:00
{
2021-09-17 11:47:43 +00:00
QskGradientStops stops;
2020-07-31 11:26:22 +00:00
if ( discrete )
stops.reserve( 2 * count - 2 );
2020-07-31 11:26:22 +00:00
else
stops.reserve( count );
2020-07-31 11:26:22 +00:00
stops += QskGradientStop( 0.0, rgb[0] );
2020-07-31 11:26:22 +00:00
if ( discrete )
{
const auto step = 1.0 / count;
2020-07-31 11:26:22 +00:00
for ( int i = 1; i < count; i++ )
2020-07-31 11:26:22 +00:00
{
const qreal pos = i * step;
2021-12-23 18:05:59 +00:00
stops += QskGradientStop( pos, rgb[i - 1] );
stops += QskGradientStop( pos, rgb[i] );
2020-07-31 11:26:22 +00:00
}
}
else
{
const auto step = 1.0 / ( count - 1 );
2020-07-31 11:26:22 +00:00
for ( int i = 1; i < count - 1; i++ )
stops += QskGradientStop( i * step, rgb[i] );
2020-07-31 11:26:22 +00:00
}
stops += QskGradientStop( 1.0, rgb[count - 1] );
2020-07-31 11:26:22 +00:00
return stops;
}
2021-09-17 11:47:43 +00:00
QskGradientStops QskRgbPalette::colorStops( bool discrete ) const
{
return qskColorStops( m_rgb, NumWeights, discrete );
}
2021-09-17 11:47:43 +00:00
QskGradientStops QskRgbPalette::colorStops( Theme theme, bool discrete )
{
const auto pal = QskRgbPalette::palette( theme );
return pal.colorStops( discrete );
}
2021-09-17 11:47:43 +00:00
QskGradientStops QskRgbPalette::colorStops(
const QVector< QRgb >& rgb, bool discrete )
{
const int count = rgb.count();
if ( count == 0 )
2021-09-17 11:47:43 +00:00
return QskGradientStops();
if ( count == 0 )
{
2021-09-17 11:47:43 +00:00
QskGradientStops stops;
stops.reserve( 2 );
stops += QskGradientStop( 0.0, rgb[0] );
stops += QskGradientStop( 1.0, rgb[0] );
return stops;
}
return qskColorStops( rgb.constData(), count, discrete );
}
#include "moc_QskRgbPalette.cpp"