Coverage Report

Created: 2026-08-17 07:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qtbase/src/gui/image/qicon_p.h
Line
Count
Source
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#ifndef QICON_P_H
6
#define QICON_P_H
7
8
//
9
//  W A R N I N G
10
//  -------------
11
//
12
// This file is not part of the Qt API.  It exists purely as an
13
// implementation detail.  This header file may change from version to
14
// version without notice, or even be removed.
15
//
16
// We mean it.
17
//
18
19
#include <QtGui/private/qtguiglobal_p.h>
20
#include <QtCore/qsize.h>
21
#include <QtCore/qlist.h>
22
#include <QtGui/qpixmap.h>
23
#include <QtGui/qicon.h>
24
#include <QtGui/qiconengine.h>
25
26
#ifndef QT_NO_ICON
27
QT_BEGIN_NAMESPACE
28
29
class QIconPrivate
30
{
31
public:
32
    explicit QIconPrivate(QIconEngine *e);
33
34
0
    ~QIconPrivate() {
35
0
        delete engine;
36
0
    }
37
38
0
    static QIconPrivate *get(QIcon *icon) { return icon->d; }
39
0
    static const QIconPrivate *get(const QIcon *icon) { return icon->d; }
40
41
    enum IconEngineHook { PlatformIconHook = 1000 };
42
43
    static qreal pixmapDevicePixelRatio(qreal displayDevicePixelRatio, const QSize &requestedSize, const QSize &actualSize);
44
45
    QIconEngine *engine;
46
47
    QAtomicInt ref;
48
    int serialNum;
49
    int detach_no;
50
    bool is_mask;
51
52
    static void clearIconCache();
53
};
54
55
56
struct QPixmapIconEngineEntry
57
{
58
    QPixmapIconEngineEntry() = default;
59
    QPixmapIconEngineEntry(const QPixmap &pm, QIcon::Mode m, QIcon::State s)
60
0
        : pixmap(pm), size(pm.size()), mode(m), state(s) {}
61
    QPixmapIconEngineEntry(const QString &file, const QSize &sz, QIcon::Mode m, QIcon::State s)
62
0
        : fileName(file), size(sz), mode(m), state(s) {}
63
    QPixmapIconEngineEntry(const QString &file, const QImage &image, QIcon::Mode m, QIcon::State s);
64
    QPixmap pixmap;
65
    QString fileName;
66
    QSize size;
67
    QIcon::Mode mode = QIcon::Normal;
68
    QIcon::State state = QIcon::Off;
69
};
70
Q_DECLARE_TYPEINFO(QPixmapIconEngineEntry, Q_RELOCATABLE_TYPE);
71
72
inline QPixmapIconEngineEntry::QPixmapIconEngineEntry(const QString &file, const QImage &image, QIcon::Mode m, QIcon::State s)
73
0
    : fileName(file), size(image.size()), mode(m), state(s)
74
0
{
75
0
    pixmap.convertFromImage(image);
76
0
}
77
78
class Q_GUI_EXPORT QPixmapIconEngine : public QIconEngine {
79
public:
80
    QPixmapIconEngine();
81
    QPixmapIconEngine(const QPixmapIconEngine &);
82
    ~QPixmapIconEngine();
83
    void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) override;
84
    QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
85
    QPixmap scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale) override;
86
    QPixmapIconEngineEntry *bestMatch(const QSize &size, qreal scale, QIcon::Mode mode, QIcon::State state);
87
    QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
88
    QList<QSize> availableSizes(QIcon::Mode mode, QIcon::State state) override;
89
    void addPixmap(const QPixmap &pixmap, QIcon::Mode mode, QIcon::State state) override;
90
    void addFile(const QString &fileName, const QSize &size, QIcon::Mode mode, QIcon::State state) override;
91
    bool isNull() override;
92
93
    QString key() const override;
94
    QIconEngine *clone() const override;
95
    bool read(QDataStream &in) override;
96
    bool write(QDataStream &out) const override;
97
98
    static inline QSize adjustSize(const QSize &expectedSize, QSize size)
99
0
    {
100
0
        if (!size.isNull() && (size.width() > expectedSize.width() || size.height() > expectedSize.height()))
101
0
            size.scale(expectedSize, Qt::KeepAspectRatio);
102
0
        return size;
103
0
    }
104
105
private:
106
    void removePixmapEntry(QPixmapIconEngineEntry *pe)
107
0
    {
108
0
        auto idx = pixmaps.size();
109
0
        while (--idx >= 0) {
110
0
            if (pe == &pixmaps.at(idx)) {
111
0
                pixmaps.remove(idx);
112
0
                return;
113
0
            }
114
0
        }
115
0
    }
116
    QPixmapIconEngineEntry *tryMatch(const QSize &size, qreal scale, QIcon::Mode mode, QIcon::State state);
117
    QList<QPixmapIconEngineEntry> pixmaps;
118
119
    friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &s, const QIcon &icon);
120
    friend class QIconThemeEngine;
121
};
122
123
QT_END_NAMESPACE
124
#endif //QT_NO_ICON
125
#endif // QICON_P_H