Timeline: Use QRgb and a lookup table for colors

It makes no sense to return a QColor as the only things we are using
are the red, green, and blue components. Furthermore, colorFromHue()
can only generate 360 different colors which we can easily cache
instead of recalculating them on each request.

This significantly reduces the time it takes to update the timeline
render nodes.

Change-Id: I7961014364a1bec5b089285148b2e6c141a6dc7d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Ulf Hermann
2016-11-08 18:11:36 +01:00
parent aaca50f705
commit faf77fd0e5
18 changed files with 46 additions and 29 deletions

View File

@@ -707,10 +707,10 @@ int NodeUpdater::updateNodes(const int from, const int to) const
if (start > end) if (start > end)
continue; continue;
QColor color = m_model->color(i); QRgb color = m_model->color(i);
item.red = color.red(); item.red = qRed(color);
item.green = color.green(); item.green = qGreen(color);
item.blue = color.blue(); item.blue = qBlue(color);
item.width = end > start ? (end - start) * m_parentState->scale() : item.width = end > start ? (end - start) * m_parentState->scale() :
std::numeric_limits<float>::min(); std::numeric_limits<float>::min();

View File

@@ -400,21 +400,20 @@ QList<const TimelineRenderPass *> TimelineModel::supportedRenderPasses() const
return passes; return passes;
} }
QColor TimelineModel::colorBySelectionId(int index) const QRgb TimelineModel::colorBySelectionId(int index) const
{ {
return colorByHue(selectionId(index) * TimelineModelPrivate::SelectionIdHueMultiplier); return colorByHue(selectionId(index) * TimelineModelPrivate::SelectionIdHueMultiplier);
} }
QColor TimelineModel::colorByFraction(double fraction) const QRgb TimelineModel::colorByFraction(double fraction) const
{ {
return colorByHue(fraction * TimelineModelPrivate::FractionHueMultiplier + return colorByHue(fraction * TimelineModelPrivate::FractionHueMultiplier +
TimelineModelPrivate::FractionHueMininimum); TimelineModelPrivate::FractionHueMininimum);
} }
QColor TimelineModel::colorByHue(int hue) const QRgb TimelineModel::colorByHue(int hue) const
{ {
return QColor::fromHsl(hue % 360, TimelineModelPrivate::Saturation, return TimelineModelPrivate::hueTable[hue];
TimelineModelPrivate::Lightness);
} }
/*! /*!
@@ -518,10 +517,10 @@ int TimelineModel::rowCount() const
return d->expanded ? d->expandedRowCount : d->collapsedRowCount; return d->expanded ? d->expandedRowCount : d->collapsedRowCount;
} }
QColor TimelineModel::color(int index) const QRgb TimelineModel::color(int index) const
{ {
Q_UNUSED(index); Q_UNUSED(index);
return QColor(); return QRgb();
} }
QVariantList TimelineModel::labels() const QVariantList TimelineModel::labels() const
@@ -613,6 +612,15 @@ int TimelineModel::prevItemByTypeId(int requestedTypeId, qint64 time, int curren
}, time, currentItem); }, time, currentItem);
} }
HueLookupTable::HueLookupTable() {
for (int hue = 0; hue < 360; ++hue) {
table[hue] = QColor::fromHsl(hue, TimelineModel::TimelineModelPrivate::Saturation,
TimelineModel::TimelineModelPrivate::Lightness).rgb();
}
}
const HueLookupTable TimelineModel::TimelineModelPrivate::hueTable;
int TimelineModel::TimelineModelPrivate::nextItemById(std::function<bool(int)> matchesId, int TimelineModel::TimelineModelPrivate::nextItemById(std::function<bool(int)> matchesId,
qint64 time, int currentItem) const qint64 time, int currentItem) const
{ {

View File

@@ -88,7 +88,7 @@ public:
int rowCount() const; int rowCount() const;
// Methods which can optionally be implemented by child models. // Methods which can optionally be implemented by child models.
Q_INVOKABLE virtual QColor color(int index) const; Q_INVOKABLE virtual QRgb color(int index) const;
virtual QVariantList labels() const; virtual QVariantList labels() const;
Q_INVOKABLE virtual QVariantMap details(int index) const; Q_INVOKABLE virtual QVariantMap details(int index) const;
Q_INVOKABLE virtual int expandedRow(int index) const; Q_INVOKABLE virtual int expandedRow(int index) const;
@@ -123,9 +123,9 @@ signals:
void displayNameChanged(); void displayNameChanged();
protected: protected:
QColor colorBySelectionId(int index) const; QRgb colorBySelectionId(int index) const;
QColor colorByFraction(double fraction) const; QRgb colorByFraction(double fraction) const;
QColor colorByHue(int hue) const; QRgb colorByHue(int hue) const;
int insert(qint64 startTime, qint64 duration, int selectionId); int insert(qint64 startTime, qint64 duration, int selectionId);
int insertStart(qint64 startTime, int selectionId); int insertStart(qint64 startTime, int selectionId);

View File

@@ -30,8 +30,17 @@
namespace Timeline { namespace Timeline {
struct HueLookupTable {
QRgb table[360];
HueLookupTable();
QRgb operator[](int hue) const { return table[hue % 360]; }
};
class TIMELINE_EXPORT TimelineModel::TimelineModelPrivate { class TIMELINE_EXPORT TimelineModel::TimelineModelPrivate {
public: public:
static const HueLookupTable hueTable;
static const int DefaultRowHeight = 30; static const int DefaultRowHeight = 30;
enum BoxColorProperties { enum BoxColorProperties {

View File

@@ -39,7 +39,7 @@ int DebugMessagesModel::typeId(int index) const
return m_data[index].typeId; return m_data[index].typeId;
} }
QColor DebugMessagesModel::color(int index) const QRgb DebugMessagesModel::color(int index) const
{ {
return colorBySelectionId(index); return colorBySelectionId(index);
} }

View File

@@ -38,7 +38,7 @@ public:
DebugMessagesModel(QmlProfilerModelManager *manager, QObject *parent = 0); DebugMessagesModel(QmlProfilerModelManager *manager, QObject *parent = 0);
int typeId(int index) const override; int typeId(int index) const override;
QColor color(int index) const override; QRgb color(int index) const override;
QVariantList labels() const override; QVariantList labels() const override;
QVariantMap details(int index) const override; QVariantMap details(int index) const override;
int expandedRow(int index) const override; int expandedRow(int index) const override;

View File

@@ -45,7 +45,7 @@ int InputEventsModel::typeId(int index) const
return selectionId(index) == Mouse ? m_mouseTypeId : m_keyTypeId; return selectionId(index) == Mouse ? m_mouseTypeId : m_keyTypeId;
} }
QColor InputEventsModel::color(int index) const QRgb InputEventsModel::color(int index) const
{ {
return colorBySelectionId(index); return colorBySelectionId(index);
} }

View File

@@ -50,7 +50,7 @@ public:
void clear() override; void clear() override;
int typeId(int index) const override; int typeId(int index) const override;
QColor color(int index) const override; QRgb color(int index) const override;
QVariantList labels() const override; QVariantList labels() const override;
QVariantMap details(int index) const override; QVariantMap details(int index) const override;
int expandedRow(int index) const override; int expandedRow(int index) const override;

View File

@@ -61,7 +61,7 @@ int MemoryUsageModel::typeId(int index) const
return m_data[index].typeId; return m_data[index].typeId;
} }
QColor MemoryUsageModel::color(int index) const QRgb MemoryUsageModel::color(int index) const
{ {
return colorBySelectionId(index); return colorBySelectionId(index);
} }

View File

@@ -59,7 +59,7 @@ public:
int expandedRow(int index) const override; int expandedRow(int index) const override;
int collapsedRow(int index) const override; int collapsedRow(int index) const override;
int typeId(int index) const override; int typeId(int index) const override;
QColor color(int index) const override; QRgb color(int index) const override;
float relativeHeight(int index) const override; float relativeHeight(int index) const override;
QVariantMap location(int index) const override; QVariantMap location(int index) const override;

View File

@@ -60,7 +60,7 @@ int PixmapCacheModel::typeId(int index) const
return m_data[index].typeId; return m_data[index].typeId;
} }
QColor PixmapCacheModel::color(int index) const QRgb PixmapCacheModel::color(int index) const
{ {
if (m_data[index].pixmapEventType == PixmapCacheCountChanged) if (m_data[index].pixmapEventType == PixmapCacheCountChanged)
return colorByHue(s_pixmapCacheCountHue); return colorByHue(s_pixmapCacheCountHue);

View File

@@ -102,7 +102,7 @@ public:
int expandedRow(int index) const override; int expandedRow(int index) const override;
int collapsedRow(int index) const override; int collapsedRow(int index) const override;
int typeId(int index) const override; int typeId(int index) const override;
QColor color(int index) const override; QRgb color(int index) const override;
float relativeHeight(int index) const override; float relativeHeight(int index) const override;
QVariantList labels() const override; QVariantList labels() const override;

View File

@@ -137,7 +137,7 @@ int QmlProfilerAnimationsModel::collapsedRow(int index) const
return rowFromThreadId(selectionId(index)); return rowFromThreadId(selectionId(index));
} }
QColor QmlProfilerAnimationsModel::color(int index) const QRgb QmlProfilerAnimationsModel::color(int index) const
{ {
double fpsFraction = m_data[index].framerate / 60.0; double fpsFraction = m_data[index].framerate / 60.0;
if (fpsFraction > 1.0) if (fpsFraction > 1.0)

View File

@@ -58,7 +58,7 @@ public:
Q_INVOKABLE int expandedRow(int index) const override; Q_INVOKABLE int expandedRow(int index) const override;
Q_INVOKABLE int collapsedRow(int index) const override; Q_INVOKABLE int collapsedRow(int index) const override;
QColor color(int index) const override; QRgb color(int index) const override;
float relativeHeight(int index) const override; float relativeHeight(int index) const override;
QVariantList labels() const override; QVariantList labels() const override;

View File

@@ -180,7 +180,7 @@ int QmlProfilerRangeModel::bindingLoopDest(int index) const
return m_data[index].bindingLoopHead; return m_data[index].bindingLoopHead;
} }
QColor QmlProfilerRangeModel::color(int index) const QRgb QmlProfilerRangeModel::color(int index) const
{ {
return colorBySelectionId(index); return colorBySelectionId(index);
} }

View File

@@ -62,7 +62,7 @@ public:
Q_INVOKABLE int expandedRow(int index) const override; Q_INVOKABLE int expandedRow(int index) const override;
Q_INVOKABLE int collapsedRow(int index) const override; Q_INVOKABLE int collapsedRow(int index) const override;
int bindingLoopDest(int index) const; int bindingLoopDest(int index) const;
QColor color(int index) const override; QRgb color(int index) const override;
QVariantList labels() const override; QVariantList labels() const override;
QVariantMap details(int index) const override; QVariantMap details(int index) const override;

View File

@@ -94,7 +94,7 @@ int SceneGraphTimelineModel::typeId(int index) const
return m_data[index].typeId; return m_data[index].typeId;
} }
QColor SceneGraphTimelineModel::color(int index) const QRgb SceneGraphTimelineModel::color(int index) const
{ {
return colorBySelectionId(index); return colorBySelectionId(index);
} }

View File

@@ -88,7 +88,7 @@ public:
int expandedRow(int index) const override; int expandedRow(int index) const override;
int collapsedRow(int index) const override; int collapsedRow(int index) const override;
int typeId(int index) const override; int typeId(int index) const override;
QColor color(int index) const override; QRgb color(int index) const override;
QVariantList labels() const override; QVariantList labels() const override;