Coverage Report

Created: 2026-10-14 06:45

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(const QPixmap &pm, QIcon::Mode m, QIcon::State s)
59
0
        : pixmap(pm), size(pm.size()), mode(m), state(s) {}
60
    QPixmapIconEngineEntry(const QString &file, const QSize &sz, QIcon::Mode m, QIcon::State s)
61
0
        : fileName(file), size(sz), mode(m), state(s) {}
62
    QPixmapIconEngineEntry(const QString &file, const QImage &image, QIcon::Mode m, QIcon::State s);
63
    QPixmap pixmap;
64
    QString fileName;
65
    QSize size;
66
    QIcon::Mode mode = QIcon::Normal;
67
    QIcon::State state = QIcon::Off;
68
};
69
Q_DECLARE_TYPEINFO(QPixmapIconEngineEntry, Q_RELOCATABLE_TYPE);
70
71
inline QPixmapIconEngineEntry::QPixmapIconEngineEntry(const QString &file, const QImage &image, QIcon::Mode m, QIcon::State s)
72
0
    : fileName(file), size(image.size()), mode(m), state(s)
73
0
{
74
0
    pixmap.convertFromImage(image);
75
0
}
76
77
class Q_GUI_EXPORT QPixmapIconEngine : public QIconEngine {
78
public:
79
    QPixmapIconEngine();
80
    QPixmapIconEngine(const QPixmapIconEngine &);
81
    ~QPixmapIconEngine();
82
    void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) override;
83
    QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
84
    QPixmap scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale) override;
85
    QPixmapIconEngineEntry *bestMatch(const QSize &size, qreal scale, QIcon::Mode mode, QIcon::State state);
86
    QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
87
    QList<QSize> availableSizes(QIcon::Mode mode, QIcon::State state) override;
88
    void addPixmap(const QPixmap &pixmap, QIcon::Mode mode, QIcon::State state) override;
89
    void addFile(const QString &fileName, const QSize &size, QIcon::Mode mode, QIcon::State state) override;
90
    bool isNull() override;
91
92
    QString key() const override;
93
    QIconEngine *clone() const override;
94
    bool read(QDataStream &in) override;
95
    bool write(QDataStream &out) const override;
96
97
    static inline QSize adjustSize(const QSize &expectedSize, QSize size)
98
0
    {
99
0
        if (!size.isNull() && (size.width() > expectedSize.width() || size.height() > expectedSize.height()))
100
0
            size.scale(expectedSize, Qt::KeepAspectRatio);
101
0
        return size;
102
0
    }
103
104
private:
105
    void removePixmapEntry(QPixmapIconEngineEntry *pe)
106
0
    {
107
0
        const auto pred = [pe](const auto &entry) { return pe == &entry; };
108
0
        const auto it = std::find_if(pixmaps.begin(), pixmaps.end(), pred);
109
0
        if (it != pixmaps.end())
110
0
            pixmaps.erase(it);
111
0
    }
112
    QPixmapIconEngineEntry *tryMatch(const QSize &size, qreal scale, QIcon::Mode mode, QIcon::State state);
113
    QList<QPixmapIconEngineEntry> pixmaps;
114
115
    friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &s, const QIcon &icon);
116
    friend class QIconThemeEngine;
117
};
118
119
QT_END_NAMESPACE
120
#endif //QT_NO_ICON
121
#endif // QICON_P_H