status bits introduced to cache information, that would be recaclulated
many times otherwise
This commit is contained in:
parent
262e5517f7
commit
b5da0da76d
|
@ -63,6 +63,18 @@ static inline bool qskIsMonochrome( const QskGradientStops& stops )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool qskIsVisible( const QskGradientStops& stops )
|
||||||
|
{
|
||||||
|
for ( const auto& stop : stops )
|
||||||
|
{
|
||||||
|
const auto& c = stop.color();
|
||||||
|
if ( c.isValid() && c.alpha() > 0 )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline QColor qskInterpolated(
|
static inline QColor qskInterpolated(
|
||||||
const QskGradientStop& s1, const QskGradientStop& s2, qreal pos )
|
const QskGradientStop& s1, const QskGradientStop& s2, qreal pos )
|
||||||
{
|
{
|
||||||
|
@ -167,13 +179,17 @@ static inline QskGradientStops qskExtractedStops(
|
||||||
return extracted;
|
return extracted;
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::QskGradient()
|
QskGradient::QskGradient( Orientation orientation )
|
||||||
: m_orientation( Vertical )
|
: m_orientation( orientation )
|
||||||
|
, m_isDirty( true )
|
||||||
|
, m_isValid( false )
|
||||||
|
, m_isMonchrome( false )
|
||||||
|
, m_isVisible( false )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::QskGradient( const QColor& color )
|
QskGradient::QskGradient( const QColor& color )
|
||||||
: m_orientation( Vertical )
|
: QskGradient( Vertical )
|
||||||
{
|
{
|
||||||
setColor( color );
|
setColor( color );
|
||||||
}
|
}
|
||||||
|
@ -186,22 +202,20 @@ QskGradient::QskGradient( Qt::Orientation orientation,
|
||||||
|
|
||||||
QskGradient::QskGradient( Orientation orientation,
|
QskGradient::QskGradient( Orientation orientation,
|
||||||
const QColor& startColor, const QColor& stopColor )
|
const QColor& startColor, const QColor& stopColor )
|
||||||
: m_orientation( orientation )
|
: QskGradient( orientation )
|
||||||
{
|
{
|
||||||
setColors( startColor, stopColor );
|
setColors( startColor, stopColor );
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::QskGradient( Qt::Orientation orientation,
|
QskGradient::QskGradient( Qt::Orientation orientation, const QskGradientStops& stops )
|
||||||
const QskGradientStops& stops )
|
|
||||||
: QskGradient( qskOrientation( orientation ), stops )
|
: QskGradient( qskOrientation( orientation ), stops )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::QskGradient( Orientation orientation,
|
QskGradient::QskGradient( Orientation orientation, const QskGradientStops& stops )
|
||||||
const QskGradientStops& stops )
|
: QskGradient( orientation )
|
||||||
: m_orientation( orientation )
|
|
||||||
, m_stops( stops )
|
|
||||||
{
|
{
|
||||||
|
m_stops = stops;
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::~QskGradient()
|
QskGradient::~QskGradient()
|
||||||
|
@ -210,35 +224,35 @@ QskGradient::~QskGradient()
|
||||||
|
|
||||||
bool QskGradient::isValid() const
|
bool QskGradient::isValid() const
|
||||||
{
|
{
|
||||||
return qskIsGradientValid( m_stops );
|
if ( m_isDirty )
|
||||||
|
updateStatusBits();
|
||||||
|
|
||||||
|
return m_isValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskGradient::invalidate()
|
void QskGradient::invalidate()
|
||||||
{
|
{
|
||||||
|
if ( !m_stops.isEmpty() )
|
||||||
|
{
|
||||||
m_stops.clear();
|
m_stops.clear();
|
||||||
|
m_isDirty = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QskGradient::isMonochrome() const
|
bool QskGradient::isMonochrome() const
|
||||||
{
|
{
|
||||||
if ( !qskIsGradientValid( m_stops ) )
|
if ( m_isDirty )
|
||||||
return true;
|
updateStatusBits();
|
||||||
|
|
||||||
return qskIsMonochrome( m_stops );
|
return m_isMonchrome;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QskGradient::isVisible() const
|
bool QskGradient::isVisible() const
|
||||||
{
|
{
|
||||||
if ( isValid() )
|
if ( m_isDirty )
|
||||||
{
|
updateStatusBits();
|
||||||
for ( const auto& stop : m_stops )
|
|
||||||
{
|
|
||||||
const auto& c = stop.color();
|
|
||||||
if ( c.isValid() && c.alpha() > 0 )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return m_isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskGradient::setOrientation( Qt::Orientation orientation )
|
void QskGradient::setOrientation( Qt::Orientation orientation )
|
||||||
|
@ -248,14 +262,10 @@ void QskGradient::setOrientation( Qt::Orientation orientation )
|
||||||
|
|
||||||
void QskGradient::setOrientation( Orientation orientation )
|
void QskGradient::setOrientation( Orientation orientation )
|
||||||
{
|
{
|
||||||
|
// does not change m_isDirty
|
||||||
m_orientation = orientation;
|
m_orientation = orientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient::Orientation QskGradient::orientation() const
|
|
||||||
{
|
|
||||||
return m_orientation;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QskGradient::setColor( const QColor& color )
|
void QskGradient::setColor( const QColor& color )
|
||||||
{
|
{
|
||||||
m_stops.clear();
|
m_stops.clear();
|
||||||
|
@ -263,6 +273,8 @@ void QskGradient::setColor( const QColor& color )
|
||||||
|
|
||||||
m_stops.append( QskGradientStop( 0.0, color ) );
|
m_stops.append( QskGradientStop( 0.0, color ) );
|
||||||
m_stops.append( QskGradientStop( 1.0, color ) );
|
m_stops.append( QskGradientStop( 1.0, color ) );
|
||||||
|
|
||||||
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskGradient::setColors( const QColor& startColor, const QColor& stopColor )
|
void QskGradient::setColors( const QColor& startColor, const QColor& stopColor )
|
||||||
|
@ -272,6 +284,8 @@ void QskGradient::setColors( const QColor& startColor, const QColor& stopColor )
|
||||||
|
|
||||||
m_stops.append( QskGradientStop( 0.0, startColor ) );
|
m_stops.append( QskGradientStop( 0.0, startColor ) );
|
||||||
m_stops.append( QskGradientStop( 1.0, stopColor ) );
|
m_stops.append( QskGradientStop( 1.0, stopColor ) );
|
||||||
|
|
||||||
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QskGradient::setStops( const QskGradientStops& stops )
|
void QskGradient::setStops( const QskGradientStops& stops )
|
||||||
|
@ -284,6 +298,7 @@ void QskGradient::setStops( const QskGradientStops& stops )
|
||||||
}
|
}
|
||||||
|
|
||||||
m_stops = stops;
|
m_stops = stops;
|
||||||
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradientStops QskGradient::stops() const
|
QskGradientStops QskGradient::stops() const
|
||||||
|
@ -308,6 +323,7 @@ void QskGradient::setStopAt( int index, qreal stop )
|
||||||
m_stops.resize( index + 1 );
|
m_stops.resize( index + 1 );
|
||||||
|
|
||||||
m_stops[ index ].setPosition( stop );
|
m_stops[ index ].setPosition( stop );
|
||||||
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal QskGradient::stopAt( int index ) const
|
qreal QskGradient::stopAt( int index ) const
|
||||||
|
@ -330,6 +346,7 @@ void QskGradient::setColorAt( int index, const QColor& color )
|
||||||
m_stops.resize( index + 1 );
|
m_stops.resize( index + 1 );
|
||||||
|
|
||||||
m_stops[ index ].setColor( color );
|
m_stops[ index ].setColor( color );
|
||||||
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QColor QskGradient::colorAt( int index ) const
|
QColor QskGradient::colorAt( int index ) const
|
||||||
|
@ -351,6 +368,8 @@ void QskGradient::setAlpha( int alpha )
|
||||||
stop.setColor( c );
|
stop.setColor( c );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QskGradient::hasStopAt( qreal value ) const
|
bool QskGradient::hasStopAt( qreal value ) const
|
||||||
|
@ -373,7 +392,9 @@ uint QskGradient::hash( uint seed ) const
|
||||||
if ( m_stops.isEmpty() )
|
if ( m_stops.isEmpty() )
|
||||||
return seed;
|
return seed;
|
||||||
|
|
||||||
uint hash = qHashBits( &m_orientation, sizeof( m_orientation ), seed );
|
const auto o = orientation();
|
||||||
|
|
||||||
|
uint hash = qHashBits( &o, sizeof( o ), seed );
|
||||||
for ( const auto& stop : m_stops )
|
for ( const auto& stop : m_stops )
|
||||||
hash = stop.hash( hash );
|
hash = stop.hash( hash );
|
||||||
|
|
||||||
|
@ -410,7 +431,7 @@ QskGradient QskGradient::extracted( qreal from, qreal to ) const
|
||||||
to = qMin( to, 1.0 );
|
to = qMin( to, 1.0 );
|
||||||
|
|
||||||
const auto stops = qskExtractedStops( m_stops, from, to );
|
const auto stops = qskExtractedStops( m_stops, from, to );
|
||||||
return QskGradient( m_orientation, stops );
|
return QskGradient( orientation(), stops );
|
||||||
}
|
}
|
||||||
|
|
||||||
QskGradient QskGradient::interpolated(
|
QskGradient QskGradient::interpolated(
|
||||||
|
@ -449,10 +470,10 @@ QskGradient QskGradient::interpolated(
|
||||||
stop.setColor( c );
|
stop.setColor( c );
|
||||||
}
|
}
|
||||||
|
|
||||||
return QskGradient( gradient->m_orientation, stops );
|
return QskGradient( gradient->orientation(), stops );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( qskIsMonochrome( m_stops ) )
|
if ( isMonochrome() )
|
||||||
{
|
{
|
||||||
// we can ignore our stops
|
// we can ignore our stops
|
||||||
|
|
||||||
|
@ -465,10 +486,10 @@ QskGradient QskGradient::interpolated(
|
||||||
s2[ i ].setColor( c2 );
|
s2[ i ].setColor( c2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return QskGradient( to.m_orientation, s2 );
|
return QskGradient( to.orientation(), s2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( qskIsMonochrome( to.m_stops ) )
|
if ( to.isMonochrome() )
|
||||||
{
|
{
|
||||||
// we can ignore the stops of to
|
// we can ignore the stops of to
|
||||||
|
|
||||||
|
@ -481,7 +502,7 @@ QskGradient QskGradient::interpolated(
|
||||||
s2[ i ].setColor( c2 );
|
s2[ i ].setColor( c2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return QskGradient( m_orientation, s2 );
|
return QskGradient( orientation(), s2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_orientation == to.m_orientation )
|
if ( m_orientation == to.m_orientation )
|
||||||
|
@ -502,7 +523,7 @@ QskGradient QskGradient::interpolated(
|
||||||
s2[ i ].setColor( c2 );
|
s2[ i ].setColor( c2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return QskGradient( m_orientation, s2 );
|
return QskGradient( orientation(), s2 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -527,7 +548,7 @@ QskGradient QskGradient::interpolated(
|
||||||
s2[ i ].setColor( c2 );
|
s2[ i ].setColor( c2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return QskGradient( m_orientation, s2 );
|
return QskGradient( orientation(), s2 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -541,7 +562,7 @@ QskGradient QskGradient::interpolated(
|
||||||
s2[ i ].setColor( c2 );
|
s2[ i ].setColor( c2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return QskGradient( to.m_orientation, s2 );
|
return QskGradient( to.orientation(), s2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -552,6 +573,25 @@ QVariant QskGradient::interpolate(
|
||||||
return QVariant::fromValue( from.interpolated( to, progress ) );
|
return QVariant::fromValue( from.interpolated( to, progress ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QskGradient::updateStatusBits() const
|
||||||
|
{
|
||||||
|
// doing all bits in one loop ?
|
||||||
|
m_isValid = qskIsGradientValid( m_stops );
|
||||||
|
|
||||||
|
if ( m_isValid )
|
||||||
|
{
|
||||||
|
m_isMonchrome = qskIsMonochrome( m_stops );
|
||||||
|
m_isVisible = qskIsVisible( m_stops );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_isMonchrome = true;
|
||||||
|
m_isVisible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_isDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
|
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
|
|
|
@ -44,6 +44,7 @@ class QSK_EXPORT QskGradient
|
||||||
Q_ENUM( Orientation )
|
Q_ENUM( Orientation )
|
||||||
|
|
||||||
QskGradient();
|
QskGradient();
|
||||||
|
QskGradient( Orientation );
|
||||||
QskGradient( Qt::GlobalColor );
|
QskGradient( Qt::GlobalColor );
|
||||||
QskGradient( QRgb );
|
QskGradient( QRgb );
|
||||||
QskGradient( const QColor& );
|
QskGradient( const QColor& );
|
||||||
|
@ -103,12 +104,25 @@ class QSK_EXPORT QskGradient
|
||||||
void setStopAt( int index, qreal stop );
|
void setStopAt( int index, qreal stop );
|
||||||
void setColorAt( int index, const QColor& color );
|
void setColorAt( int index, const QColor& color );
|
||||||
|
|
||||||
Orientation m_orientation;
|
void updateStatusBits() const;
|
||||||
|
|
||||||
QVector< QskGradientStop > m_stops;
|
QVector< QskGradientStop > m_stops;
|
||||||
|
|
||||||
|
int m_orientation : 4;
|
||||||
|
|
||||||
|
mutable bool m_isDirty : 1;
|
||||||
|
mutable bool m_isValid : 1;
|
||||||
|
mutable bool m_isMonchrome : 1;
|
||||||
|
mutable bool m_isVisible : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE( QskGradient )
|
Q_DECLARE_METATYPE( QskGradient )
|
||||||
|
|
||||||
|
inline QskGradient::QskGradient()
|
||||||
|
: QskGradient( Vertical )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
inline QskGradient::QskGradient( Qt::GlobalColor color )
|
inline QskGradient::QskGradient( Qt::GlobalColor color )
|
||||||
: QskGradient( QColor( color ) )
|
: QskGradient( QColor( color ) )
|
||||||
{
|
{
|
||||||
|
@ -119,6 +133,11 @@ inline QskGradient::QskGradient( QRgb rgb )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline QskGradient::Orientation QskGradient::orientation() const
|
||||||
|
{
|
||||||
|
return static_cast< Orientation >( m_orientation );
|
||||||
|
}
|
||||||
|
|
||||||
inline QColor QskGradient::startColor() const
|
inline QColor QskGradient::startColor() const
|
||||||
{
|
{
|
||||||
return ( m_stops.size() >= 2 ) ? m_stops.first().color() : QColor();
|
return ( m_stops.size() >= 2 ) ? m_stops.first().color() : QColor();
|
||||||
|
|
Loading…
Reference in New Issue