handling of primitives optimized

This commit is contained in:
Uwe Rathmann 2020-12-18 13:09:22 +01:00
parent 38f48a7cb0
commit 8426e71156
3 changed files with 56 additions and 26 deletions

View File

@ -36,6 +36,32 @@ namespace
};
}
static quint8 qskPrimitiveCount[ 3 ] =
{ QskAspect::FontRole + 1, QskAspect::Border + 1, QskAspect::LinkColor + 1 };
quint8 QskAspect::primitiveCount( Type type )
{
return qskPrimitiveCount[ type ];
}
void QskAspect::reservePrimitives( Type type, quint8 count )
{
constexpr quint8 maxCount = 1 << 5; // we have 5 bits for the primitives
Q_ASSERT( count <= maxCount );
if ( count > maxCount )
{
qWarning() << "QskAspect: having more than"
<< maxCount << "primitives is not supported.";
count = maxCount;
}
if ( count > qskPrimitiveCount[ type ] )
qskPrimitiveCount[ type ] = count;
}
Q_GLOBAL_STATIC( AspectRegistry, qskAspectRegistry )
QskAspect::State QskAspect::registerState(
@ -201,27 +227,27 @@ static inline QDebug qskDebugEnum(
return debug;
}
QDebug operator<<( QDebug debug, const QskAspect::Type& type )
QDebug operator<<( QDebug debug, QskAspect::Type type )
{
return qskDebugEnum( debug, "Type", type );
}
QDebug operator<<( QDebug debug, const QskAspect::FlagPrimitive& primitive )
QDebug operator<<( QDebug debug, QskAspect::FlagPrimitive primitive )
{
return qskDebugEnum( debug, "FlagPrimitive", primitive );
}
QDebug operator<<( QDebug debug, const QskAspect::ColorPrimitive& primitive )
QDebug operator<<( QDebug debug, QskAspect::ColorPrimitive primitive )
{
return qskDebugEnum( debug, "ColorPrimitive", primitive );
}
QDebug operator<<( QDebug debug, const QskAspect::MetricPrimitive& primitive )
QDebug operator<<( QDebug debug, QskAspect::MetricPrimitive primitive )
{
return qskDebugEnum( debug, "MetricPrimitive", primitive );
}
QDebug operator<<( QDebug debug, const QskAspect::Subcontrol& subControl )
QDebug operator<<( QDebug debug, QskAspect::Subcontrol subControl )
{
QDebugStateSaver saver( debug );
@ -233,19 +259,19 @@ QDebug operator<<( QDebug debug, const QskAspect::Subcontrol& subControl )
return debug;
}
QDebug operator<<( QDebug debug, const QskAspect::Placement& placement )
QDebug operator<<( QDebug debug, QskAspect::Placement placement )
{
qskDebugEnum( debug, "Placement", placement );
return debug;
}
QDebug operator<<( QDebug debug, const QskAspect::State& state )
QDebug operator<<( QDebug debug, QskAspect::State state )
{
qskDebugState( debug, nullptr, state );
return debug;
}
QDebug operator<<( QDebug debug, const QskAspect::Aspect& aspect )
QDebug operator<<( QDebug debug, QskAspect::Aspect aspect )
{
qskDebugAspect( debug, nullptr, aspect );
return debug;
@ -264,8 +290,6 @@ void qskDebugState( QDebug debug, const QMetaObject* metaObject, QskAspect::Stat
void qskDebugAspect( QDebug debug, const QMetaObject* metaObject, QskAspect::Aspect aspect )
{
using namespace QskAspect;
QDebugStateSaver saver( debug );
debug.resetFormat();
@ -286,13 +310,13 @@ void qskDebugAspect( QDebug debug, const QMetaObject* metaObject, QskAspect::Asp
switch ( aspect.type() )
{
case Color:
case QskAspect::Color:
{
if ( aspect.colorPrimitive() != 0 )
debug << ", " << qskEnumString( "ColorPrimitive", aspect.colorPrimitive() );
break;
}
case Metric:
case QskAspect::Metric:
{
if ( aspect.metricPrimitive() != 0 )
debug << ", " << qskEnumString( "MetricPrimitive", aspect.metricPrimitive() );

View File

@ -51,7 +51,7 @@ QSK_NAMESPACE( QskAspect )
};
QSK_ENUM( Type )
enum { LastType = Color }; // max. value for all types
constexpr uint typeCount = 3;
enum FlagPrimitive : quint8
{
@ -209,9 +209,9 @@ namespace QskAspect
uint type : 3;
uint isAnimator : 1;
uint primitive : 7;
uint primitive : 5;
uint placement : 3;
uint reserved1 : 6;
uint reserved1 : 8;
uint states : 16;
uint reserved2 : 16;
@ -537,6 +537,10 @@ namespace QskAspect
QSK_EXPORT QByteArray subControlName( Subcontrol );
QSK_EXPORT QVector< QByteArray > subControlNames( const QMetaObject* = nullptr );
QSK_EXPORT QVector< Subcontrol > subControls( const QMetaObject* );
QSK_EXPORT quint8 primitiveCount( Type );
QSK_EXPORT void reservePrimitives( Type, quint8 count );
}
namespace std
@ -556,16 +560,16 @@ Q_DECLARE_TYPEINFO( QskAspect::Aspect, Q_MOVABLE_TYPE );
class QDebug;
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Aspect& );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Type& );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Subcontrol& );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Aspect );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Type );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Subcontrol );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::FlagPrimitive& );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::ColorPrimitive& );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::MetricPrimitive& );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::FlagPrimitive );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::ColorPrimitive );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::MetricPrimitive );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Placement& );
QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::State& );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Placement );
QSK_EXPORT QDebug operator<<( QDebug, QskAspect::State );
QSK_EXPORT void qskDebugState( QDebug, const QMetaObject*, QskAspect::State );
QSK_EXPORT void qskDebugAspect( QDebug, const QMetaObject*, QskAspect::Aspect );

View File

@ -977,7 +977,7 @@ void QskSkinnable::setSkinState( QskAspect::State newState, bool animated )
const auto& skinTable = skin->hintTable();
for ( int i = 0; i <= QskAspect::LastType; i++ )
for ( uint i = 0; i < QskAspect::typeCount; i++ )
{
const auto type = static_cast< QskAspect::Type >( i );
@ -989,8 +989,10 @@ void QskSkinnable::setSkinState( QskAspect::State newState, bool animated )
Starting an animator for all primitives,
that differ between the states
*/
for ( uint primitive = 0;
primitive <= QskAspect::LastPrimitive; primitive++ )
const auto primitiveCount = QskAspect::primitiveCount( type );
for ( uint primitive = 0; primitive < primitiveCount; primitive++ )
{
aspect.setPrimitive( type, primitive );