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

系统编程

开发平台:

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 QPAINTERPATH_H
  38. #define QPAINTERPATH_H
  39. #include <QtGui/qmatrix.h>
  40. #include <QtCore/qglobal.h>
  41. #include <QtCore/qrect.h>
  42. #include <QtCore/qline.h>
  43. #include <QtCore/qvector.h>
  44. QT_BEGIN_HEADER
  45. QT_BEGIN_NAMESPACE
  46. QT_MODULE(Gui)
  47. class QFont;
  48. class QPainterPathPrivate;
  49. class QPainterPathData;
  50. class QPainterPathStrokerPrivate;
  51. class QPolygonF;
  52. class QRegion;
  53. class Q_GUI_EXPORT QPainterPath
  54. {
  55. public:
  56.     enum ElementType {
  57.         MoveToElement,
  58.         LineToElement,
  59.         CurveToElement,
  60.         CurveToDataElement
  61.     };
  62.     class Element {
  63.     public:
  64.         qreal x;
  65.         qreal y;
  66.         ElementType type;
  67.         bool isMoveTo() const { return type == MoveToElement; }
  68.         bool isLineTo() const { return type == LineToElement; }
  69.         bool isCurveTo() const { return type == CurveToElement; }
  70.         operator QPointF () const { return QPointF(x, y); }
  71.         bool operator==(const Element &e) const { return qFuzzyCompare(x, e.x)
  72.             && qFuzzyCompare(y, e.y) && type == e.type; }
  73.         inline bool operator!=(const Element &e) const { return !operator==(e); }
  74.     };
  75.     QPainterPath();
  76.     explicit QPainterPath(const QPointF &startPoint);
  77.     QPainterPath(const QPainterPath &other);
  78.     QPainterPath &operator=(const QPainterPath &other);
  79.     ~QPainterPath();
  80.     void closeSubpath();
  81.     void moveTo(const QPointF &p);
  82.     inline void moveTo(qreal x, qreal y);
  83.     void lineTo(const QPointF &p);
  84.     inline void lineTo(qreal x, qreal y);
  85.     void arcMoveTo(const QRectF &rect, qreal angle);
  86.     inline void arcMoveTo(qreal x, qreal y, qreal w, qreal h, qreal angle);
  87.     void arcTo(const QRectF &rect, qreal startAngle, qreal arcLength);
  88.     inline void arcTo(qreal x, qreal y, qreal w, qreal h, qreal startAngle, qreal arcLength);
  89.     void cubicTo(const QPointF &ctrlPt1, const QPointF &ctrlPt2, const QPointF &endPt);
  90.     inline void cubicTo(qreal ctrlPt1x, qreal ctrlPt1y, qreal ctrlPt2x, qreal ctrlPt2y,
  91.                         qreal endPtx, qreal endPty);
  92.     void quadTo(const QPointF &ctrlPt, const QPointF &endPt);
  93.     inline void quadTo(qreal ctrlPtx, qreal ctrlPty, qreal endPtx, qreal endPty);
  94.     QPointF currentPosition() const;
  95.     void addRect(const QRectF &rect);
  96.     inline void addRect(qreal x, qreal y, qreal w, qreal h);
  97.     void addEllipse(const QRectF &rect);
  98.     inline void addEllipse(qreal x, qreal y, qreal w, qreal h);
  99.     inline void addEllipse(const QPointF &center, qreal rx, qreal ry);
  100.     void addPolygon(const QPolygonF &polygon);
  101.     void addText(const QPointF &point, const QFont &f, const QString &text);
  102.     inline void addText(qreal x, qreal y, const QFont &f, const QString &text);
  103.     void addPath(const QPainterPath &path);
  104.     void addRegion(const QRegion &region);
  105.     void addRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius,
  106.                         Qt::SizeMode mode = Qt::AbsoluteSize);
  107.     inline void addRoundedRect(qreal x, qreal y, qreal w, qreal h,
  108.                                qreal xRadius, qreal yRadius,
  109.                                Qt::SizeMode mode = Qt::AbsoluteSize);
  110.     void addRoundRect(const QRectF &rect, int xRnd, int yRnd);
  111.     inline void addRoundRect(qreal x, qreal y, qreal w, qreal h,
  112.                              int xRnd, int yRnd);
  113.     inline void addRoundRect(const QRectF &rect, int roundness);
  114.     inline void addRoundRect(qreal x, qreal y, qreal w, qreal h,
  115.                              int roundness);
  116.     void connectPath(const QPainterPath &path);
  117.     bool contains(const QPointF &pt) const;
  118.     bool contains(const QRectF &rect) const;
  119.     bool intersects(const QRectF &rect) const;
  120.     QRectF boundingRect() const;
  121.     QRectF controlPointRect() const;
  122.     Qt::FillRule fillRule() const;
  123.     void setFillRule(Qt::FillRule fillRule);
  124.     inline bool isEmpty() const;
  125.     QPainterPath toReversed() const;
  126.     QList<QPolygonF> toSubpathPolygons(const QMatrix &matrix = QMatrix()) const;
  127.     QList<QPolygonF> toFillPolygons(const QMatrix &matrix = QMatrix()) const;
  128.     QPolygonF toFillPolygon(const QMatrix &matrix = QMatrix()) const;
  129.     QList<QPolygonF> toSubpathPolygons(const QTransform &matrix) const;
  130.     QList<QPolygonF> toFillPolygons(const QTransform &matrix) const;
  131.     QPolygonF toFillPolygon(const QTransform &matrix) const;
  132.     inline int elementCount() const;
  133.     inline const QPainterPath::Element &elementAt(int i) const;
  134.     inline void setElementPositionAt(int i, qreal x, qreal y);
  135.     qreal   length() const;
  136.     qreal   percentAtLength(qreal t) const;
  137.     QPointF pointAtPercent(qreal t) const;
  138.     qreal   angleAtPercent(qreal t) const;
  139.     qreal   slopeAtPercent(qreal t) const;
  140.     bool intersects(const QPainterPath &p) const;
  141.     bool contains(const QPainterPath &p) const;
  142.     QPainterPath united(const QPainterPath &r) const;
  143.     QPainterPath intersected(const QPainterPath &r) const;
  144.     QPainterPath subtracted(const QPainterPath &r) const;
  145.     QPainterPath subtractedInverted(const QPainterPath &r) const;
  146.     QPainterPath simplified() const;
  147.     bool operator==(const QPainterPath &other) const;
  148.     bool operator!=(const QPainterPath &other) const;
  149. private:
  150.     QPainterPathPrivate *d_ptr;
  151.     inline void ensureData() { if (!d_ptr) ensureData_helper(); }
  152.     void ensureData_helper();
  153.     inline void detach();
  154.     void detach_helper();
  155.     void setDirty(bool);
  156.     void computeBoundingRect() const;
  157.     void computeControlPointRect() const;
  158.     QPainterPathData *d_func() const { return reinterpret_cast<QPainterPathData *>(d_ptr); }
  159.     friend class QPainterPathData;
  160.     friend class QPainterPathStroker;
  161.     friend class QPainterPathStrokerPrivate;
  162.     friend class QMatrix;
  163.     friend class QTransform;
  164. #ifndef QT_NO_DATASTREAM
  165.     friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QPainterPath &);
  166.     friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QPainterPath &);
  167. #endif
  168. };
  169. class QPainterPathPrivate
  170. {
  171.     friend class QPainterPath;
  172.     friend class QPainterPathData;
  173.     friend class QPainterPathStroker;
  174.     friend class QPainterPathStrokerPrivate;
  175.     friend class QMatrix;
  176.     friend class QTransform;
  177. #ifndef QT_NO_DATASTREAM
  178.     friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QPainterPath &);
  179.     friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QPainterPath &);
  180. #endif
  181. private:
  182.     QAtomicInt ref;
  183.     QVector<QPainterPath::Element> elements;
  184. };
  185. Q_DECLARE_TYPEINFO(QPainterPath::Element, Q_PRIMITIVE_TYPE);
  186. #ifndef QT_NO_DATASTREAM
  187. Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QPainterPath &);
  188. Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QPainterPath &);
  189. #endif
  190. class Q_GUI_EXPORT QPainterPathStroker
  191. {
  192.     Q_DECLARE_PRIVATE(QPainterPathStroker)
  193. public:
  194.     QPainterPathStroker();
  195.     ~QPainterPathStroker();
  196.     void setWidth(qreal width);
  197.     qreal width() const;
  198.     void setCapStyle(Qt::PenCapStyle style);
  199.     Qt::PenCapStyle capStyle() const;
  200.     void setJoinStyle(Qt::PenJoinStyle style);
  201.     Qt::PenJoinStyle joinStyle() const;
  202.     void setMiterLimit(qreal length);
  203.     qreal miterLimit() const;
  204.     void setCurveThreshold(qreal threshold);
  205.     qreal curveThreshold() const;
  206.     void setDashPattern(Qt::PenStyle);
  207.     void setDashPattern(const QVector<qreal> &dashPattern);
  208.     QVector<qreal> dashPattern() const;
  209.     void setDashOffset(qreal offset);
  210.     qreal dashOffset() const;
  211.     QPainterPath createStroke(const QPainterPath &path) const;
  212. private:
  213.     QPainterPathStrokerPrivate *d_ptr;
  214. };
  215. inline void QPainterPath::moveTo(qreal x, qreal y)
  216. {
  217.     moveTo(QPointF(x, y));
  218. }
  219. inline void QPainterPath::lineTo(qreal x, qreal y)
  220. {
  221.     lineTo(QPointF(x, y));
  222. }
  223. inline void QPainterPath::arcTo(qreal x, qreal y, qreal w, qreal h, qreal startAngle, qreal arcLenght)
  224. {
  225.     arcTo(QRectF(x, y, w, h), startAngle, arcLenght);
  226. }
  227. inline void QPainterPath::arcMoveTo(qreal x, qreal y, qreal w, qreal h, qreal angle)
  228. {
  229.     arcMoveTo(QRectF(x, y, w, h), angle);
  230. }
  231. inline void QPainterPath::cubicTo(qreal ctrlPt1x, qreal ctrlPt1y, qreal ctrlPt2x, qreal ctrlPt2y,
  232.                                    qreal endPtx, qreal endPty)
  233. {
  234.     cubicTo(QPointF(ctrlPt1x, ctrlPt1y), QPointF(ctrlPt2x, ctrlPt2y),
  235.             QPointF(endPtx, endPty));
  236. }
  237. inline void QPainterPath::quadTo(qreal ctrlPtx, qreal ctrlPty, qreal endPtx, qreal endPty)
  238. {
  239.     quadTo(QPointF(ctrlPtx, ctrlPty), QPointF(endPtx, endPty));
  240. }
  241. inline void QPainterPath::addEllipse(qreal x, qreal y, qreal w, qreal h)
  242. {
  243.     addEllipse(QRectF(x, y, w, h));
  244. }
  245. inline void QPainterPath::addEllipse(const QPointF &center, qreal rx, qreal ry)
  246. {
  247.     addEllipse(QRectF(center.x() - rx, center.y() - ry, 2 * rx, 2 * ry));
  248. }
  249. inline void QPainterPath::addRect(qreal x, qreal y, qreal w, qreal h)
  250. {
  251.     addRect(QRectF(x, y, w, h));
  252. }
  253. inline void QPainterPath::addRoundedRect(qreal x, qreal y, qreal w, qreal h,
  254.                                          qreal xRadius, qreal yRadius,
  255.                                          Qt::SizeMode mode)
  256. {
  257.     addRoundedRect(QRectF(x, y, w, h), xRadius, yRadius, mode);
  258. }
  259. inline void QPainterPath::addRoundRect(qreal x, qreal y, qreal w, qreal h,
  260.                                        int xRnd, int yRnd)
  261. {
  262.     addRoundRect(QRectF(x, y, w, h), xRnd, yRnd);
  263. }
  264. inline void QPainterPath::addRoundRect(const QRectF &rect,
  265.                                        int roundness)
  266. {
  267.     int xRnd = roundness;
  268.     int yRnd = roundness;
  269.     if (rect.width() > rect.height())
  270.         xRnd = int(roundness * rect.height()/rect.width());
  271.     else
  272.         yRnd = int(roundness * rect.width()/rect.height());
  273.     addRoundRect(rect, xRnd, yRnd);
  274. }
  275. inline void QPainterPath::addRoundRect(qreal x, qreal y, qreal w, qreal h,
  276.                                        int roundness)
  277. {
  278.     addRoundRect(QRectF(x, y, w, h), roundness);
  279. }
  280. inline void QPainterPath::addText(qreal x, qreal y, const QFont &f, const QString &text)
  281. {
  282.     addText(QPointF(x, y), f, text);
  283. }
  284. inline bool QPainterPath::isEmpty() const
  285. {
  286.     return !d_ptr || (d_ptr->elements.size() == 1 && d_ptr->elements.first().type == MoveToElement);
  287. }
  288. inline int QPainterPath::elementCount() const
  289. {
  290.     return d_ptr ? d_ptr->elements.size() : 0;
  291. }
  292. inline const QPainterPath::Element &QPainterPath::elementAt(int i) const
  293. {
  294.     Q_ASSERT(d_ptr);
  295.     Q_ASSERT(i >= 0 && i < elementCount());
  296.     return d_ptr->elements.at(i);
  297. }
  298. inline void QPainterPath::setElementPositionAt(int i, qreal x, qreal y)
  299. {
  300.     Q_ASSERT(d_ptr);
  301.     Q_ASSERT(i >= 0 && i < elementCount());
  302.     detach();
  303.     QPainterPath::Element &e = d_ptr->elements[i];
  304.     e.x = x;
  305.     e.y = y;
  306. }
  307. inline void QPainterPath::detach()
  308. {
  309.     if (d_ptr->ref != 1)
  310.         detach_helper();
  311.     setDirty(true);
  312. }
  313. #ifndef QT_NO_DEBUG_STREAM
  314. Q_GUI_EXPORT QDebug operator<<(QDebug, const QPainterPath &);
  315. #endif
  316. QT_END_NAMESPACE
  317. QT_END_HEADER
  318. #endif // QPAINTERPATH_H