1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "qmlprofilertimelinemodel.h"
#include <QColor>
#include <QSize>
#include <QStringList>
namespace QmlProfiler::Internal {
class PixmapCacheModel : public QmlProfilerTimelineModel
{
Q_OBJECT
public:
enum CacheState {
Uncached, // After loading started (or some other proof of existence) or after uncaching
ToBeCached, // After determining the pixmap is to be cached but before knowing its size
Cached, // After caching a pixmap or determining the size of a ToBeCached pixmap
Uncacheable, // If loading failed without ToBeCached or after a corrupt pixmap has been uncached
Corrupt, // If after ToBeCached we learn that loading failed
MaximumCacheState
};
enum LoadState {
Initial,
Loading,
Finished,
Error,
MaximumLoadState
};
struct PixmapState {
PixmapState(int width, int height, CacheState cache = Uncached) :
size(width, height), cacheState(cache) {}
PixmapState(CacheState cache = Uncached) : cacheState(cache) {}
QSize size;
int started = -1;
LoadState loadState = Initial;
CacheState cacheState;
};
struct Pixmap {
Pixmap() = default;
Pixmap(const QString &url) : url(url), sizes(1) {}
QString url;
QList<PixmapState> sizes;
};
enum PixmapEventType {
PixmapSizeKnown,
PixmapReferenceCountChanged,
PixmapCacheCountChanged,
PixmapLoadingStarted,
PixmapLoadingFinished,
PixmapLoadingError,
MaximumPixmapEventType
};
struct Item {
int typeId = -1;
PixmapEventType pixmapEventType = MaximumPixmapEventType;
int urlIndex = -1;
int sizeIndex = -1;
int rowNumberCollapsed = -1;
qint64 cacheSize = 0;
};
PixmapCacheModel(QmlProfilerModelManager *manager, Timeline::TimelineModelAggregator *parent);
qint64 rowMaxValue(int rowNumber) const override;
int expandedRow(int index) const override;
int collapsedRow(int index) const override;
int typeId(int index) const override;
QRgb color(int index) const override;
float relativeHeight(int index) const override;
QVariantList labels() const override;
QVariantMap details(int index) const override;
void loadEvent(const QmlEvent &event, const QmlEventType &type) override;
void finalize() override;
void clear() override;
#ifdef WITH_TESTS
LoadState loadState(int index) const;
CacheState cacheState(int index) const;
QString fileName(int index) const;
#endif
private:
void computeMaxCacheSize();
void resizeUnfinishedLoads();
void flattenLoads();
int updateCacheCount(int m_lastCacheSizeEvent, qint64 startTime, qint64 pixSize,
Item &newEvent, int typeId);
QList<Item> m_data;
QList<Pixmap> m_pixmaps;
qint64 m_maxCacheSize = 1;
int m_lastCacheSizeEvent = -1;
int m_cumulatedCount = 0;
static const int s_pixmapCacheCountHue = 240;
};
} // namespace QmlProfiler::Internal
|