qtransform.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:10k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtGui module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QTRANSFORM_H
  38. #define QTRANSFORM_H
  39. #include <QtGui/qmatrix.h>
  40. #include <QtGui/qpainterpath.h>
  41. #include <QtGui/qpolygon.h>
  42. #include <QtGui/qregion.h>
  43. #include <QtGui/qwindowdefs.h>
  44. #include <QtCore/qline.h>
  45. #include <QtCore/qpoint.h>
  46. #include <QtCore/qrect.h>
  47. QT_BEGIN_HEADER
  48. QT_BEGIN_NAMESPACE
  49. QT_MODULE(Gui)
  50. class QVariant;
  51. class Q_GUI_EXPORT QTransform
  52. {
  53.     Q_ENUMS(TransformationType)
  54. public:
  55.     enum TransformationType {
  56.         TxNone      = 0x00,
  57.         TxTranslate = 0x01,
  58.         TxScale     = 0x02,
  59.         TxRotate    = 0x04,
  60.         TxShear     = 0x08,
  61.         TxProject   = 0x10
  62.     };
  63.     QTransform();
  64.     QTransform(qreal h11, qreal h12, qreal h13,
  65.                qreal h21, qreal h22, qreal h23,
  66.                qreal h31, qreal h32, qreal h33 = 1.0);
  67.     QTransform(qreal h11, qreal h12, qreal h13,
  68.                qreal h21, qreal h22, qreal h23);
  69.     explicit QTransform(const QMatrix &mtx);
  70.     bool isAffine() const;
  71.     bool isIdentity() const;
  72.     bool isInvertible() const;
  73.     bool isScaling() const;
  74.     bool isRotating() const;
  75.     bool isTranslating() const;
  76.     TransformationType type() const;
  77.     inline qreal determinant() const;
  78.     qreal det() const;
  79.     qreal m11() const;
  80.     qreal m12() const;
  81.     qreal m13() const;
  82.     qreal m21() const;
  83.     qreal m22() const;
  84.     qreal m23() const;
  85.     qreal m31() const;
  86.     qreal m32() const;
  87.     qreal m33() const;
  88.     qreal dx() const;
  89.     qreal dy() const;
  90.     void setMatrix(qreal m11, qreal m12, qreal m13,
  91.                    qreal m21, qreal m22, qreal m23,
  92.                    qreal m31, qreal m32, qreal m33);
  93.     QTransform inverted(bool *invertible = 0) const;
  94.     QTransform adjoint() const;
  95.     QTransform transposed() const;
  96.     QTransform &translate(qreal dx, qreal dy);
  97.     QTransform &scale(qreal sx, qreal sy);
  98.     QTransform &shear(qreal sh, qreal sv);
  99.     QTransform &rotate(qreal a, Qt::Axis axis = Qt::ZAxis);
  100.     QTransform &rotateRadians(qreal a, Qt::Axis axis = Qt::ZAxis);
  101.     static bool squareToQuad(const QPolygonF &square, QTransform &result);
  102.     static bool quadToSquare(const QPolygonF &quad, QTransform &result);
  103.     static bool quadToQuad(const QPolygonF &one,
  104.                            const QPolygonF &two,
  105.                            QTransform &result);
  106.     bool operator==(const QTransform &) const;
  107.     bool operator!=(const QTransform &) const;
  108.     QTransform &operator*=(const QTransform &);
  109.     QTransform operator*(const QTransform &o) const;
  110.     QTransform &operator=(const QTransform &);
  111.     operator QVariant() const;
  112.     void reset();
  113.     QPoint       map(const QPoint &p) const;
  114.     QPointF      map(const QPointF &p) const;
  115.     QLine        map(const QLine &l) const;
  116.     QLineF       map(const QLineF &l) const;
  117.     QPolygonF    map(const QPolygonF &a) const;
  118.     QPolygon     map(const QPolygon &a) const;
  119.     QRegion      map(const QRegion &r) const;
  120.     QPainterPath map(const QPainterPath &p) const;
  121.     QPolygon     mapToPolygon(const QRect &r) const;
  122.     QRect mapRect(const QRect &) const;
  123.     QRectF mapRect(const QRectF &) const;
  124.     void map(int x, int y, int *tx, int *ty) const;
  125.     void map(qreal x, qreal y, qreal *tx, qreal *ty) const;
  126.     const QMatrix &toAffine() const;
  127.     QTransform &operator*=(qreal div);
  128.     QTransform &operator/=(qreal div);
  129.     QTransform &operator+=(qreal div);
  130.     QTransform &operator-=(qreal div);
  131. private:
  132.     QMatrix affine;
  133.     qreal   m_13;
  134.     qreal   m_23;
  135.     qreal   m_33;
  136.     mutable uint m_type : 5;
  137.     mutable uint m_dirty : 5;
  138.     class Private;
  139.     Private *d;
  140. };
  141. Q_DECLARE_TYPEINFO(QTransform, Q_MOVABLE_TYPE);
  142. /******* inlines *****/
  143. inline bool QTransform::isAffine() const
  144. {
  145.     return qFuzzyCompare(m_13 + 1, 1) && qFuzzyCompare(m_23 + 1, 1);
  146. }
  147. inline bool QTransform::isIdentity() const
  148. {
  149. #define qFZ qFuzzyCompare
  150.     return qFZ(affine._m11, 1) && qFZ(affine._m12 + 1, 1) && qFZ(m_13 + 1, 1)
  151.         && qFZ(affine._m21 + 1, 1) && qFZ(affine._m22, 1) && qFZ(m_23 + 1, 1)
  152.         && qFZ(affine._dx + 1, 1) && qFZ(affine._dy + 1, 1) && qFZ(m_33, 1);
  153. #undef qFZ
  154. }
  155. inline bool QTransform::isInvertible() const
  156. {
  157.     return !qFuzzyCompare(determinant() + 1, 1);
  158. }
  159. inline bool QTransform::isScaling() const
  160. {
  161.     return !qFuzzyCompare(affine._m11, 1) ||
  162.         !qFuzzyCompare(affine._m22, 1);
  163. }
  164. inline bool QTransform::isRotating() const
  165. {
  166.     return !qFuzzyCompare(affine._m12 + 1, 1) ||
  167.         !qFuzzyCompare(affine._m21 + 1, 1);
  168. }
  169. inline bool QTransform::isTranslating() const
  170. {
  171.     return !qFuzzyCompare(affine._dx + 1, 1) ||
  172.         !qFuzzyCompare(affine._dy + 1, 1);
  173. }
  174. inline qreal QTransform::determinant() const
  175. {
  176.     return affine._m11*(m_33*affine._m22-affine._dy*m_23) -
  177.         affine._m21*(m_33*affine._m12-affine._dy*m_13)+affine._dx*(m_23*affine._m12-affine._m22*m_13);
  178. }
  179. inline qreal QTransform::det() const
  180. {
  181.     return determinant();
  182. }
  183. inline qreal QTransform::m11() const
  184. {
  185.     return affine._m11;
  186. }
  187. inline qreal QTransform::m12() const
  188. {
  189.     return affine._m12;
  190. }
  191. inline qreal QTransform::m13() const
  192. {
  193.     return m_13;
  194. }
  195. inline qreal QTransform::m21() const
  196. {
  197.     return affine._m21;
  198. }
  199. inline qreal QTransform::m22() const
  200. {
  201.     return affine._m22;
  202. }
  203. inline qreal QTransform::m23() const
  204. {
  205.     return m_23;
  206. }
  207. inline qreal QTransform::m31() const
  208. {
  209.     return affine._dx;
  210. }
  211. inline qreal QTransform::m32() const
  212. {
  213.     return affine._dy;
  214. }
  215. inline qreal QTransform::m33() const
  216. {
  217.     return m_33;
  218. }
  219. inline qreal QTransform::dx() const
  220. {
  221.     return affine._dx;
  222. }
  223. inline qreal QTransform::dy() const
  224. {
  225.     return affine._dy;
  226. }
  227. inline QTransform &QTransform::operator*=(qreal num)
  228. {
  229.     affine._m11 *= num;
  230.     affine._m12 *= num;
  231.     m_13        *= num;
  232.     affine._m21 *= num;
  233.     affine._m22 *= num;
  234.     m_23        *= num;
  235.     affine._dx  *= num;
  236.     affine._dy  *= num;
  237.     m_33        *= num;
  238.     m_dirty     |= TxScale;
  239.     return *this;
  240. }
  241. inline QTransform &QTransform::operator/=(qreal div)
  242. {
  243.     div = 1/div;
  244.     return operator*=(div);
  245. }
  246. inline QTransform &QTransform::operator+=(qreal num)
  247. {
  248.     affine._m11 += num;
  249.     affine._m12 += num;
  250.     m_13        += num;
  251.     affine._m21 += num;
  252.     affine._m22 += num;
  253.     m_23        += num;
  254.     affine._dx  += num;
  255.     affine._dy  += num;
  256.     m_33        += num;
  257.     m_dirty     |= TxProject;
  258.     return *this;
  259. }
  260. inline QTransform &QTransform::operator-=(qreal num)
  261. {
  262.     affine._m11 -= num;
  263.     affine._m12 -= num;
  264.     m_13        -= num;
  265.     affine._m21 -= num;
  266.     affine._m22 -= num;
  267.     m_23        -= num;
  268.     affine._dx  -= num;
  269.     affine._dy  -= num;
  270.     m_33        -= num;
  271.     m_dirty     |= TxProject;
  272.     return *this;
  273. }
  274. /****** stream functions *******************/
  275. Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QTransform &);
  276. Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QTransform &);
  277. #ifndef QT_NO_DEBUG_STREAM
  278. Q_GUI_EXPORT QDebug operator<<(QDebug, const QTransform &);
  279. #endif
  280. /****** end stream functions *******************/
  281. // mathematical semantics
  282. Q_GUI_EXPORT_INLINE QPoint operator*(const QPoint &p, const QTransform &m)
  283. { return m.map(p); }
  284. Q_GUI_EXPORT_INLINE QPointF operator*(const QPointF &p, const QTransform &m)
  285. { return m.map(p); }
  286. Q_GUI_EXPORT_INLINE QLineF operator*(const QLineF &l, const QTransform &m)
  287. { return m.map(l); }
  288. Q_GUI_EXPORT_INLINE QLine operator*(const QLine &l, const QTransform &m)
  289. { return m.map(l); }
  290. Q_GUI_EXPORT_INLINE QPolygon operator *(const QPolygon &a, const QTransform &m)
  291. { return m.map(a); }
  292. Q_GUI_EXPORT_INLINE QPolygonF operator *(const QPolygonF &a, const QTransform &m)
  293. { return m.map(a); }
  294. Q_GUI_EXPORT_INLINE QRegion operator *(const QRegion &r, const QTransform &m)
  295. { return m.map(r); }
  296. Q_GUI_EXPORT_INLINE QPainterPath operator *(const QPainterPath &p, const QTransform &m)
  297. { return m.map(p); }
  298. Q_GUI_EXPORT_INLINE QTransform operator *(const QTransform &a, qreal n)
  299. { QTransform t(a); t *= n; return t; }
  300. Q_GUI_EXPORT_INLINE QTransform operator /(const QTransform &a, qreal n)
  301. { QTransform t(a); t /= n; return t; }
  302. Q_GUI_EXPORT_INLINE QTransform operator +(const QTransform &a, qreal n)
  303. { QTransform t(a); t += n; return t; }
  304. Q_GUI_EXPORT_INLINE QTransform operator -(const QTransform &a, qreal n)
  305. { QTransform t(a); t -= n; return t; }
  306. QT_END_NAMESPACE
  307. QT_END_HEADER
  308. #endif