Coverage Report

Created: 2025-07-23 08:13

/src/qtbase/src/gui/image/qicon_p.h
Line
Count
Source (jump to first uncovered line)
1
/****************************************************************************
2
**
3
** Copyright (C) 2016 The Qt Company Ltd.
4
** Contact: https://www.qt.io/licensing/
5
**
6
** This file is part of the QtGui module of the Qt Toolkit.
7
**
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and The Qt Company. For licensing terms
14
** and conditions see https://www.qt.io/terms-conditions. For further
15
** information use the contact form at https://www.qt.io/contact-us.
16
**
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 3 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL3 included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 3 requirements
23
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24
**
25
** GNU General Public License Usage
26
** Alternatively, this file may be used under the terms of the GNU
27
** General Public License version 2.0 or (at your option) the GNU General
28
** Public license version 3 or any later version approved by the KDE Free
29
** Qt Foundation. The licenses are as published by the Free Software
30
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31
** included in the packaging of this file. Please review the following
32
** information to ensure the GNU General Public License requirements will
33
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34
** https://www.gnu.org/licenses/gpl-3.0.html.
35
**
36
** $QT_END_LICENSE$
37
**
38
****************************************************************************/
39
40
#ifndef QICON_P_H
41
#define QICON_P_H
42
43
//
44
//  W A R N I N G
45
//  -------------
46
//
47
// This file is not part of the Qt API.  It exists purely as an
48
// implementation detail.  This header file may change from version to
49
// version without notice, or even be removed.
50
//
51
// We mean it.
52
//
53
54
#include <QtGui/private/qtguiglobal_p.h>
55
#include <QtCore/qsize.h>
56
#include <QtCore/qlist.h>
57
#include <QtGui/qpixmap.h>
58
#include <QtGui/qicon.h>
59
#include <QtGui/qiconengine.h>
60
61
#ifndef QT_NO_ICON
62
QT_BEGIN_NAMESPACE
63
64
class QIconPrivate
65
{
66
public:
67
    explicit QIconPrivate(QIconEngine *e);
68
69
0
    ~QIconPrivate() {
70
0
        delete engine;
71
0
    }
72
73
    qreal pixmapDevicePixelRatio(qreal displayDevicePixelRatio, const QSize &requestedSize, const QSize &actualSize);
74
75
    QIconEngine *engine;
76
77
    QAtomicInt ref;
78
    int serialNum;
79
    int detach_no;
80
    bool is_mask;
81
};
82
83
84
struct QPixmapIconEngineEntry
85
{
86
0
    QPixmapIconEngineEntry():mode(QIcon::Normal), state(QIcon::Off){}
87
    QPixmapIconEngineEntry(const QPixmap &pm, QIcon::Mode m = QIcon::Normal, QIcon::State s = QIcon::Off)
88
0
        :pixmap(pm), size(pm.size()), mode(m), state(s){}
89
    QPixmapIconEngineEntry(const QString &file, const QSize &sz = QSize(), QIcon::Mode m = QIcon::Normal, QIcon::State s = QIcon::Off)
90
0
        :fileName(file), size(sz), mode(m), state(s){}
91
    QPixmapIconEngineEntry(const QString &file, const QImage &image, QIcon::Mode m = QIcon::Normal, QIcon::State s = QIcon::Off);
92
    QPixmap pixmap;
93
    QString fileName;
94
    QSize size;
95
    QIcon::Mode mode;
96
    QIcon::State state;
97
0
    bool isNull() const {return (fileName.isEmpty() && pixmap.isNull()); }
98
};
99
Q_DECLARE_TYPEINFO(QPixmapIconEngineEntry, Q_MOVABLE_TYPE);
100
101
inline QPixmapIconEngineEntry::QPixmapIconEngineEntry(const QString &file, const QImage &image, QIcon::Mode m, QIcon::State s)
102
0
    : fileName(file), size(image.size()), mode(m), state(s)
103
0
{
104
0
    pixmap.convertFromImage(image);
105
    // Reset the devicePixelRatio. The pixmap may be loaded from a @2x file,
106
    // but be used as a 1x pixmap by QIcon.
107
0
    pixmap.setDevicePixelRatio(1.0);
108
0
}
109
110
class Q_GUI_EXPORT QPixmapIconEngine : public QIconEngine {
111
public:
112
    QPixmapIconEngine();
113
    QPixmapIconEngine(const QPixmapIconEngine &);
114
    ~QPixmapIconEngine();
115
    void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) override;
116
    QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
117
    QPixmapIconEngineEntry *bestMatch(const QSize &size, QIcon::Mode mode, QIcon::State state, bool sizeOnly);
118
    QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) override;
119
    void addPixmap(const QPixmap &pixmap, QIcon::Mode mode, QIcon::State state) override;
120
    void addFile(const QString &fileName, const QSize &size, QIcon::Mode mode, QIcon::State state) override;
121
122
    QString key() const override;
123
    QIconEngine *clone() const override;
124
    bool read(QDataStream &in) override;
125
    bool write(QDataStream &out) const override;
126
    void virtual_hook(int id, void *data) override;
127
128
private:
129
    QPixmapIconEngineEntry *tryMatch(const QSize &size, QIcon::Mode mode, QIcon::State state);
130
    QVector<QPixmapIconEngineEntry> pixmaps;
131
132
    friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &s, const QIcon &icon);
133
    friend class QIconThemeEngine;
134
};
135
136
QT_END_NAMESPACE
137
#endif //QT_NO_ICON
138
#endif // QICON_P_H