src/gui/painting/qtransform.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 #ifndef QTRANSFORM_H
       
    42 #define QTRANSFORM_H
       
    43 
       
    44 #include <QtGui/qmatrix.h>
       
    45 #include <QtGui/qpainterpath.h>
       
    46 #include <QtGui/qpolygon.h>
       
    47 #include <QtGui/qregion.h>
       
    48 #include <QtGui/qwindowdefs.h>
       
    49 #include <QtCore/qline.h>
       
    50 #include <QtCore/qpoint.h>
       
    51 #include <QtCore/qrect.h>
       
    52 
       
    53 #if defined(Q_OS_VXWORKS) && defined(m_type)
       
    54 #  undef m_type
       
    55 #endif
       
    56 
       
    57 QT_BEGIN_HEADER
       
    58 
       
    59 QT_BEGIN_NAMESPACE
       
    60 
       
    61 QT_MODULE(Gui)
       
    62 
       
    63 class QVariant;
       
    64 
       
    65 class Q_GUI_EXPORT QTransform
       
    66 {
       
    67     Q_ENUMS(TransformationType)
       
    68 public:
       
    69     enum TransformationType {
       
    70         TxNone      = 0x00,
       
    71         TxTranslate = 0x01,
       
    72         TxScale     = 0x02,
       
    73         TxRotate    = 0x04,
       
    74         TxShear     = 0x08,
       
    75         TxProject   = 0x10
       
    76     };
       
    77 
       
    78     inline explicit QTransform(Qt::Initialization) : affine(Qt::Uninitialized) {}
       
    79     QTransform();
       
    80     QTransform(qreal h11, qreal h12, qreal h13,
       
    81                qreal h21, qreal h22, qreal h23,
       
    82                qreal h31, qreal h32, qreal h33 = 1.0);
       
    83     QTransform(qreal h11, qreal h12, qreal h21,
       
    84                qreal h22, qreal dx, qreal dy);
       
    85     explicit QTransform(const QMatrix &mtx);
       
    86 
       
    87     bool isAffine() const;
       
    88     bool isIdentity() const;
       
    89     bool isInvertible() const;
       
    90     bool isScaling() const;
       
    91     bool isRotating() const;
       
    92     bool isTranslating() const;
       
    93 
       
    94     TransformationType type() const;
       
    95 
       
    96     inline qreal determinant() const;
       
    97     qreal det() const;
       
    98 
       
    99     qreal m11() const;
       
   100     qreal m12() const;
       
   101     qreal m13() const;
       
   102     qreal m21() const;
       
   103     qreal m22() const;
       
   104     qreal m23() const;
       
   105     qreal m31() const;
       
   106     qreal m32() const;
       
   107     qreal m33() const;
       
   108     qreal dx() const;
       
   109     qreal dy() const;
       
   110 
       
   111     void setMatrix(qreal m11, qreal m12, qreal m13,
       
   112                    qreal m21, qreal m22, qreal m23,
       
   113                    qreal m31, qreal m32, qreal m33);
       
   114 
       
   115     QTransform inverted(bool *invertible = 0) const;
       
   116     QTransform adjoint() const;
       
   117     QTransform transposed() const;
       
   118 
       
   119     QTransform &translate(qreal dx, qreal dy);
       
   120     QTransform &scale(qreal sx, qreal sy);
       
   121     QTransform &shear(qreal sh, qreal sv);
       
   122     QTransform &rotate(qreal a, Qt::Axis axis = Qt::ZAxis);
       
   123     QTransform &rotateRadians(qreal a, Qt::Axis axis = Qt::ZAxis);
       
   124 
       
   125     static bool squareToQuad(const QPolygonF &square, QTransform &result);
       
   126     static bool quadToSquare(const QPolygonF &quad, QTransform &result);
       
   127     static bool quadToQuad(const QPolygonF &one,
       
   128                            const QPolygonF &two,
       
   129                            QTransform &result);
       
   130 
       
   131     bool operator==(const QTransform &) const;
       
   132     bool operator!=(const QTransform &) const;
       
   133 
       
   134     QTransform &operator*=(const QTransform &);
       
   135     QTransform operator*(const QTransform &o) const;
       
   136 
       
   137     QTransform &operator=(const QTransform &);
       
   138 
       
   139     operator QVariant() const;
       
   140 
       
   141     void reset();
       
   142     QPoint       map(const QPoint &p) const;
       
   143     QPointF      map(const QPointF &p) const;
       
   144     QLine        map(const QLine &l) const;
       
   145     QLineF       map(const QLineF &l) const;
       
   146     QPolygonF    map(const QPolygonF &a) const;
       
   147     QPolygon     map(const QPolygon &a) const;
       
   148     QRegion      map(const QRegion &r) const;
       
   149     QPainterPath map(const QPainterPath &p) const;
       
   150     QPolygon     mapToPolygon(const QRect &r) const;
       
   151     QRect mapRect(const QRect &) const;
       
   152     QRectF mapRect(const QRectF &) const;
       
   153     void map(int x, int y, int *tx, int *ty) const;
       
   154     void map(qreal x, qreal y, qreal *tx, qreal *ty) const;
       
   155 
       
   156     const QMatrix &toAffine() const;
       
   157 
       
   158     QTransform &operator*=(qreal div);
       
   159     QTransform &operator/=(qreal div);
       
   160     QTransform &operator+=(qreal div);
       
   161     QTransform &operator-=(qreal div);
       
   162 
       
   163     static QTransform fromTranslate(qreal dx, qreal dy);
       
   164     static QTransform fromScale(qreal dx, qreal dy);
       
   165 
       
   166 private:
       
   167     inline QTransform(qreal h11, qreal h12, qreal h13,
       
   168                       qreal h21, qreal h22, qreal h23,
       
   169                       qreal h31, qreal h32, qreal h33, bool)
       
   170         : affine(h11, h12, h21, h22, h31, h32, true)
       
   171         , m_13(h13), m_23(h23), m_33(h33)
       
   172         , m_type(TxNone)
       
   173         , m_dirty(TxProject) {}
       
   174     inline QTransform(bool)
       
   175         : affine(true)
       
   176         , m_13(0), m_23(0), m_33(1)
       
   177         , m_type(TxNone)
       
   178         , m_dirty(TxNone) {}
       
   179     inline TransformationType inline_type() const;
       
   180     QMatrix affine;
       
   181     qreal   m_13;
       
   182     qreal   m_23;
       
   183     qreal   m_33;
       
   184 
       
   185     mutable uint m_type : 5;
       
   186     mutable uint m_dirty : 5;
       
   187 
       
   188     class Private;
       
   189     Private *d;
       
   190 };
       
   191 Q_DECLARE_TYPEINFO(QTransform, Q_MOVABLE_TYPE);
       
   192 
       
   193 /******* inlines *****/
       
   194 inline QTransform::TransformationType QTransform::inline_type() const
       
   195 {
       
   196     if (m_dirty == TxNone)
       
   197         return static_cast<TransformationType>(m_type);
       
   198     return type();
       
   199 }
       
   200 
       
   201 inline bool QTransform::isAffine() const
       
   202 {
       
   203     return inline_type() < TxProject;
       
   204 }
       
   205 inline bool QTransform::isIdentity() const
       
   206 {
       
   207     return inline_type() == TxNone;
       
   208 }
       
   209 
       
   210 inline bool QTransform::isInvertible() const
       
   211 {
       
   212     return !qFuzzyIsNull(determinant());
       
   213 }
       
   214 
       
   215 inline bool QTransform::isScaling() const
       
   216 {
       
   217     return type() >= TxScale;
       
   218 }
       
   219 inline bool QTransform::isRotating() const
       
   220 {
       
   221     return inline_type() >= TxRotate;
       
   222 }
       
   223 
       
   224 inline bool QTransform::isTranslating() const
       
   225 {
       
   226     return inline_type() >= TxTranslate;
       
   227 }
       
   228 
       
   229 inline qreal QTransform::determinant() const
       
   230 {
       
   231     return affine._m11*(m_33*affine._m22-affine._dy*m_23) -
       
   232         affine._m21*(m_33*affine._m12-affine._dy*m_13)+affine._dx*(m_23*affine._m12-affine._m22*m_13);
       
   233 }
       
   234 inline qreal QTransform::det() const
       
   235 {
       
   236     return determinant();
       
   237 }
       
   238 inline qreal QTransform::m11() const
       
   239 {
       
   240     return affine._m11;
       
   241 }
       
   242 inline qreal QTransform::m12() const
       
   243 {
       
   244     return affine._m12;
       
   245 }
       
   246 inline qreal QTransform::m13() const
       
   247 {
       
   248     return m_13;
       
   249 }
       
   250 inline qreal QTransform::m21() const
       
   251 {
       
   252     return affine._m21;
       
   253 }
       
   254 inline qreal QTransform::m22() const
       
   255 {
       
   256     return affine._m22;
       
   257 }
       
   258 inline qreal QTransform::m23() const
       
   259 {
       
   260     return m_23;
       
   261 }
       
   262 inline qreal QTransform::m31() const
       
   263 {
       
   264     return affine._dx;
       
   265 }
       
   266 inline qreal QTransform::m32() const
       
   267 {
       
   268     return affine._dy;
       
   269 }
       
   270 inline qreal QTransform::m33() const
       
   271 {
       
   272     return m_33;
       
   273 }
       
   274 inline qreal QTransform::dx() const
       
   275 {
       
   276     return affine._dx;
       
   277 }
       
   278 inline qreal QTransform::dy() const
       
   279 {
       
   280     return affine._dy;
       
   281 }
       
   282 
       
   283 inline QTransform &QTransform::operator*=(qreal num)
       
   284 {
       
   285     if (num == 1.)
       
   286         return *this;
       
   287     affine._m11 *= num;
       
   288     affine._m12 *= num;
       
   289     m_13        *= num;
       
   290     affine._m21 *= num;
       
   291     affine._m22 *= num;
       
   292     m_23        *= num;
       
   293     affine._dx  *= num;
       
   294     affine._dy  *= num;
       
   295     m_33        *= num;
       
   296     m_dirty     |= TxScale;
       
   297     return *this;
       
   298 }
       
   299 inline QTransform &QTransform::operator/=(qreal div)
       
   300 {
       
   301     if (div == 0)
       
   302         return *this;
       
   303     div = 1/div;
       
   304     return operator*=(div);
       
   305 }
       
   306 inline QTransform &QTransform::operator+=(qreal num)
       
   307 {
       
   308     if (num == 0)
       
   309         return *this;
       
   310     affine._m11 += num;
       
   311     affine._m12 += num;
       
   312     m_13        += num;
       
   313     affine._m21 += num;
       
   314     affine._m22 += num;
       
   315     m_23        += num;
       
   316     affine._dx  += num;
       
   317     affine._dy  += num;
       
   318     m_33        += num;
       
   319     m_dirty     |= TxProject;
       
   320     return *this;
       
   321 }
       
   322 inline QTransform &QTransform::operator-=(qreal num)
       
   323 {
       
   324     if (num == 0)
       
   325         return *this;
       
   326     affine._m11 -= num;
       
   327     affine._m12 -= num;
       
   328     m_13        -= num;
       
   329     affine._m21 -= num;
       
   330     affine._m22 -= num;
       
   331     m_23        -= num;
       
   332     affine._dx  -= num;
       
   333     affine._dy  -= num;
       
   334     m_33        -= num;
       
   335     m_dirty     |= TxProject;
       
   336     return *this;
       
   337 }
       
   338 
       
   339 inline bool qFuzzyCompare(const QTransform& t1, const QTransform& t2)
       
   340 {
       
   341     return qFuzzyCompare(t1.m11(), t2.m11())
       
   342         && qFuzzyCompare(t1.m12(), t2.m12())
       
   343         && qFuzzyCompare(t1.m13(), t2.m13())
       
   344         && qFuzzyCompare(t1.m21(), t2.m21())
       
   345         && qFuzzyCompare(t1.m22(), t2.m22())
       
   346         && qFuzzyCompare(t1.m23(), t2.m23())
       
   347         && qFuzzyCompare(t1.m31(), t2.m31())
       
   348         && qFuzzyCompare(t1.m32(), t2.m32())
       
   349         && qFuzzyCompare(t1.m33(), t2.m33());
       
   350 }
       
   351 
       
   352 
       
   353 /****** stream functions *******************/
       
   354 #ifndef QT_NO_DATASTREAM
       
   355 Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QTransform &);
       
   356 Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QTransform &);
       
   357 #endif
       
   358 
       
   359 #ifndef QT_NO_DEBUG_STREAM
       
   360 Q_GUI_EXPORT QDebug operator<<(QDebug, const QTransform &);
       
   361 #endif
       
   362 /****** end stream functions *******************/
       
   363 
       
   364 // mathematical semantics
       
   365 Q_GUI_EXPORT_INLINE QPoint operator*(const QPoint &p, const QTransform &m)
       
   366 { return m.map(p); }
       
   367 Q_GUI_EXPORT_INLINE QPointF operator*(const QPointF &p, const QTransform &m)
       
   368 { return m.map(p); }
       
   369 Q_GUI_EXPORT_INLINE QLineF operator*(const QLineF &l, const QTransform &m)
       
   370 { return m.map(l); }
       
   371 Q_GUI_EXPORT_INLINE QLine operator*(const QLine &l, const QTransform &m)
       
   372 { return m.map(l); }
       
   373 Q_GUI_EXPORT_INLINE QPolygon operator *(const QPolygon &a, const QTransform &m)
       
   374 { return m.map(a); }
       
   375 Q_GUI_EXPORT_INLINE QPolygonF operator *(const QPolygonF &a, const QTransform &m)
       
   376 { return m.map(a); }
       
   377 Q_GUI_EXPORT_INLINE QRegion operator *(const QRegion &r, const QTransform &m)
       
   378 { return m.map(r); }
       
   379 Q_GUI_EXPORT_INLINE QPainterPath operator *(const QPainterPath &p, const QTransform &m)
       
   380 { return m.map(p); }
       
   381 
       
   382 Q_GUI_EXPORT_INLINE QTransform operator *(const QTransform &a, qreal n)
       
   383 { QTransform t(a); t *= n; return t; }
       
   384 Q_GUI_EXPORT_INLINE QTransform operator /(const QTransform &a, qreal n)
       
   385 { QTransform t(a); t /= n; return t; }
       
   386 Q_GUI_EXPORT_INLINE QTransform operator +(const QTransform &a, qreal n)
       
   387 { QTransform t(a); t += n; return t; }
       
   388 Q_GUI_EXPORT_INLINE QTransform operator -(const QTransform &a, qreal n)
       
   389 { QTransform t(a); t -= n; return t; }
       
   390 
       
   391 QT_END_NAMESPACE
       
   392 
       
   393 QT_END_HEADER
       
   394 
       
   395 #endif