Coverage Report

Created: 2025-07-23 08:13

/work/prefix/include/QtGui/qtransform.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
#ifndef QTRANSFORM_H
40
#define QTRANSFORM_H
41
42
#include <QtGui/qtguiglobal.h>
43
#include <QtGui/qmatrix.h>
44
#include <QtGui/qpolygon.h>
45
#include <QtGui/qregion.h>
46
#include <QtGui/qwindowdefs.h>
47
#include <QtCore/qline.h>
48
#include <QtCore/qpoint.h>
49
#include <QtCore/qrect.h>
50
51
QT_BEGIN_NAMESPACE
52
53
class QVariant;
54
class QPainterPath;
55
56
class Q_GUI_EXPORT QTransform
57
{
58
public:
59
    enum TransformationType {
60
        TxNone      = 0x00,
61
        TxTranslate = 0x01,
62
        TxScale     = 0x02,
63
        TxRotate    = 0x04,
64
        TxShear     = 0x08,
65
        TxProject   = 0x10
66
    };
67
68
0
    inline explicit QTransform(Qt::Initialization) : affine(Qt::Uninitialized) {}
69
    QTransform();
70
    QTransform(qreal h11, qreal h12, qreal h13,
71
               qreal h21, qreal h22, qreal h23,
72
               qreal h31, qreal h32, qreal h33 = 1.0);
73
    QTransform(qreal h11, qreal h12, qreal h21,
74
               qreal h22, qreal dx, qreal dy);
75
#if QT_DEPRECATED_SINCE(5, 15)
76
    explicit QTransform(const QMatrix &mtx);
77
#endif // QT_DEPRECATED_SINCE(5, 15)
78
79
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
80
    // ### Qt 6: remove; the compiler-generated ones are fine!
81
    QTransform &operator=(QTransform &&other) noexcept // = default
82
    { memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QTransform)); return *this; }
83
    QTransform &operator=(const QTransform &) noexcept; // = default
84
    QTransform(QTransform &&other) noexcept // = default
85
        : affine(Qt::Uninitialized)
86
    { memcpy(static_cast<void *>(this), static_cast<void *>(&other), sizeof(QTransform)); }
87
    QTransform(const QTransform &other) noexcept // = default
88
        : affine(Qt::Uninitialized)
89
    { memcpy(static_cast<void *>(this), static_cast<const void *>(&other), sizeof(QTransform)); }
90
#endif
91
92
    bool isAffine() const;
93
    bool isIdentity() const;
94
    bool isInvertible() const;
95
    bool isScaling() const;
96
    bool isRotating() const;
97
    bool isTranslating() const;
98
99
    TransformationType type() const;
100
101
    inline qreal determinant() const;
102
#if QT_DEPRECATED_SINCE(5, 13)
103
    QT_DEPRECATED_X("Use determinant() instead")
104
    qreal det() const;
105
#endif
106
107
    qreal m11() const;
108
    qreal m12() const;
109
    qreal m13() const;
110
    qreal m21() const;
111
    qreal m22() const;
112
    qreal m23() const;
113
    qreal m31() const;
114
    qreal m32() const;
115
    qreal m33() const;
116
    qreal dx() const;
117
    qreal dy() const;
118
119
    void setMatrix(qreal m11, qreal m12, qreal m13,
120
                   qreal m21, qreal m22, qreal m23,
121
                   qreal m31, qreal m32, qreal m33);
122
123
    Q_REQUIRED_RESULT QTransform inverted(bool *invertible = nullptr) const;
124
    Q_REQUIRED_RESULT QTransform adjoint() const;
125
    Q_REQUIRED_RESULT QTransform transposed() const;
126
127
    QTransform &translate(qreal dx, qreal dy);
128
    QTransform &scale(qreal sx, qreal sy);
129
    QTransform &shear(qreal sh, qreal sv);
130
    QTransform &rotate(qreal a, Qt::Axis axis = Qt::ZAxis);
131
    QTransform &rotateRadians(qreal a, Qt::Axis axis = Qt::ZAxis);
132
133
    static bool squareToQuad(const QPolygonF &square, QTransform &result);
134
    static bool quadToSquare(const QPolygonF &quad, QTransform &result);
135
    static bool quadToQuad(const QPolygonF &one,
136
                           const QPolygonF &two,
137
                           QTransform &result);
138
139
    bool operator==(const QTransform &) const;
140
    bool operator!=(const QTransform &) const;
141
142
    QTransform &operator*=(const QTransform &);
143
    QTransform operator*(const QTransform &o) const;
144
145
    operator QVariant() const;
146
147
    void reset();
148
    QPoint       map(const QPoint &p) const;
149
    QPointF      map(const QPointF &p) const;
150
    QLine        map(const QLine &l) const;
151
    QLineF       map(const QLineF &l) const;
152
    QPolygonF    map(const QPolygonF &a) const;
153
    QPolygon     map(const QPolygon &a) const;
154
    QRegion      map(const QRegion &r) const;
155
    QPainterPath map(const QPainterPath &p) const;
156
    QPolygon     mapToPolygon(const QRect &r) const;
157
    QRect mapRect(const QRect &) const;
158
    QRectF mapRect(const QRectF &) const;
159
    void map(int x, int y, int *tx, int *ty) const;
160
    void map(qreal x, qreal y, qreal *tx, qreal *ty) const;
161
162
#if QT_DEPRECATED_SINCE(5, 15)
163
    const QMatrix &toAffine() const;
164
#endif // QT_DEPRECATED_SINCE(5, 15)
165
166
    QTransform &operator*=(qreal div);
167
    QTransform &operator/=(qreal div);
168
    QTransform &operator+=(qreal div);
169
    QTransform &operator-=(qreal div);
170
171
    static QTransform fromTranslate(qreal dx, qreal dy);
172
    static QTransform fromScale(qreal dx, qreal dy);
173
174
private:
175
    inline QTransform(qreal h11, qreal h12, qreal h13,
176
                      qreal h21, qreal h22, qreal h23,
177
                      qreal h31, qreal h32, qreal h33, bool)
178
        : affine(h11, h12, h21, h22, h31, h32, true)
179
        , m_13(h13), m_23(h23), m_33(h33)
180
        , m_type(TxNone)
181
        , m_dirty(TxProject)
182
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
183
        , d(nullptr)
184
#endif
185
    {
186
    }
187
    inline QTransform(bool)
188
        : affine(true)
189
        , m_13(0), m_23(0), m_33(1)
190
        , m_type(TxNone)
191
        , m_dirty(TxNone)
192
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
193
        , d(nullptr)
194
#endif
195
    {
196
    }
197
    inline TransformationType inline_type() const;
198
    QMatrix affine;
199
    qreal   m_13;
200
    qreal   m_23;
201
    qreal   m_33;
202
203
    mutable uint m_type : 5;
204
    mutable uint m_dirty : 5;
205
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
206
    class Private;
207
    Private *d;
208
#endif
209
};
210
Q_DECLARE_TYPEINFO(QTransform, Q_MOVABLE_TYPE);
211
212
Q_GUI_EXPORT Q_DECL_CONST_FUNCTION uint qHash(const QTransform &key, uint seed = 0) noexcept;
213
214
/******* inlines *****/
215
inline QTransform::TransformationType QTransform::inline_type() const
216
{
217
    if (m_dirty == TxNone)
218
        return static_cast<TransformationType>(m_type);
219
    return type();
220
}
221
222
inline bool QTransform::isAffine() const
223
{
224
    return inline_type() < TxProject;
225
}
226
inline bool QTransform::isIdentity() const
227
{
228
    return inline_type() == TxNone;
229
}
230
231
inline bool QTransform::isInvertible() const
232
0
{
233
0
    return !qFuzzyIsNull(determinant());
234
0
}
235
236
inline bool QTransform::isScaling() const
237
0
{
238
0
    return type() >= TxScale;
239
0
}
240
inline bool QTransform::isRotating() const
241
0
{
242
0
    return inline_type() >= TxRotate;
243
0
}
244
245
inline bool QTransform::isTranslating() const
246
{
247
    return inline_type() >= TxTranslate;
248
}
249
250
inline qreal QTransform::determinant() const
251
{
252
    return affine._m11*(m_33*affine._m22-affine._dy*m_23) -
253
        affine._m21*(m_33*affine._m12-affine._dy*m_13)+affine._dx*(m_23*affine._m12-affine._m22*m_13);
254
}
255
#if QT_DEPRECATED_SINCE(5, 13)
256
inline qreal QTransform::det() const
257
0
{
258
0
    return determinant();
259
0
}
260
#endif
261
inline qreal QTransform::m11() const
262
{
263
    return affine._m11;
264
}
265
inline qreal QTransform::m12() const
266
{
267
    return affine._m12;
268
}
269
inline qreal QTransform::m13() const
270
{
271
    return m_13;
272
}
273
inline qreal QTransform::m21() const
274
{
275
    return affine._m21;
276
}
277
inline qreal QTransform::m22() const
278
{
279
    return affine._m22;
280
}
281
inline qreal QTransform::m23() const
282
{
283
    return m_23;
284
}
285
inline qreal QTransform::m31() const
286
{
287
    return affine._dx;
288
}
289
inline qreal QTransform::m32() const
290
{
291
    return affine._dy;
292
}
293
inline qreal QTransform::m33() const
294
{
295
    return m_33;
296
}
297
inline qreal QTransform::dx() const
298
{
299
    return affine._dx;
300
}
301
inline qreal QTransform::dy() const
302
{
303
    return affine._dy;
304
}
305
306
QT_WARNING_PUSH
307
QT_WARNING_DISABLE_CLANG("-Wfloat-equal")
308
QT_WARNING_DISABLE_GCC("-Wfloat-equal")
309
QT_WARNING_DISABLE_INTEL(1572)
310
311
inline QTransform &QTransform::operator*=(qreal num)
312
{
313
    if (num == 1.)
314
        return *this;
315
    affine._m11 *= num;
316
    affine._m12 *= num;
317
    m_13        *= num;
318
    affine._m21 *= num;
319
    affine._m22 *= num;
320
    m_23        *= num;
321
    affine._dx  *= num;
322
    affine._dy  *= num;
323
    m_33        *= num;
324
    if (m_dirty < TxScale)
325
        m_dirty = TxScale;
326
    return *this;
327
}
328
inline QTransform &QTransform::operator/=(qreal div)
329
{
330
    if (div == 0)
331
        return *this;
332
    div = 1/div;
333
    return operator*=(div);
334
}
335
inline QTransform &QTransform::operator+=(qreal num)
336
0
{
337
0
    if (num == 0)
338
0
        return *this;
339
0
    affine._m11 += num;
340
0
    affine._m12 += num;
341
0
    m_13        += num;
342
0
    affine._m21 += num;
343
0
    affine._m22 += num;
344
0
    m_23        += num;
345
0
    affine._dx  += num;
346
0
    affine._dy  += num;
347
0
    m_33        += num;
348
0
    m_dirty     = TxProject;
349
0
    return *this;
350
0
}
351
inline QTransform &QTransform::operator-=(qreal num)
352
0
{
353
0
    if (num == 0)
354
0
        return *this;
355
0
    affine._m11 -= num;
356
0
    affine._m12 -= num;
357
0
    m_13        -= num;
358
0
    affine._m21 -= num;
359
0
    affine._m22 -= num;
360
0
    m_23        -= num;
361
0
    affine._dx  -= num;
362
0
    affine._dy  -= num;
363
0
    m_33        -= num;
364
0
    m_dirty     = TxProject;
365
0
    return *this;
366
0
}
367
368
QT_WARNING_POP
369
370
inline bool qFuzzyCompare(const QTransform& t1, const QTransform& t2)
371
0
{
372
0
    return qFuzzyCompare(t1.m11(), t2.m11())
373
0
        && qFuzzyCompare(t1.m12(), t2.m12())
374
0
        && qFuzzyCompare(t1.m13(), t2.m13())
375
0
        && qFuzzyCompare(t1.m21(), t2.m21())
376
0
        && qFuzzyCompare(t1.m22(), t2.m22())
377
0
        && qFuzzyCompare(t1.m23(), t2.m23())
378
0
        && qFuzzyCompare(t1.m31(), t2.m31())
379
0
        && qFuzzyCompare(t1.m32(), t2.m32())
380
0
        && qFuzzyCompare(t1.m33(), t2.m33());
381
0
}
382
383
384
/****** stream functions *******************/
385
#ifndef QT_NO_DATASTREAM
386
Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QTransform &);
387
Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QTransform &);
388
#endif
389
390
#ifndef QT_NO_DEBUG_STREAM
391
Q_GUI_EXPORT QDebug operator<<(QDebug, const QTransform &);
392
#endif
393
/****** end stream functions *******************/
394
395
// mathematical semantics
396
inline QPoint operator*(const QPoint &p, const QTransform &m)
397
0
{ return m.map(p); }
398
inline QPointF operator*(const QPointF &p, const QTransform &m)
399
{ return m.map(p); }
400
inline QLineF operator*(const QLineF &l, const QTransform &m)
401
0
{ return m.map(l); }
402
inline QLine operator*(const QLine &l, const QTransform &m)
403
0
{ return m.map(l); }
404
inline QPolygon operator *(const QPolygon &a, const QTransform &m)
405
0
{ return m.map(a); }
406
inline QPolygonF operator *(const QPolygonF &a, const QTransform &m)
407
0
{ return m.map(a); }
408
inline QRegion operator *(const QRegion &r, const QTransform &m)
409
{ return m.map(r); }
410
411
inline QTransform operator *(const QTransform &a, qreal n)
412
0
{ QTransform t(a); t *= n; return t; }
413
inline QTransform operator /(const QTransform &a, qreal n)
414
{ QTransform t(a); t /= n; return t; }
415
inline QTransform operator +(const QTransform &a, qreal n)
416
0
{ QTransform t(a); t += n; return t; }
417
inline QTransform operator -(const QTransform &a, qreal n)
418
0
{ QTransform t(a); t -= n; return t; }
419
420
QT_END_NAMESPACE
421
422
#endif // QTRANSFORM_H