8#include <QtGui/qvector2d.h>
9#include <QtCore/qmath.h>
13QQuickDefaultClipNode::QQuickDefaultClipNode(
const QRectF &rect)
16 , m_dirty_geometry(
true)
17 , m_geometry(QSGGeometry::defaultAttributes_Point2D(), 0)
20 setGeometry(&m_geometry);
21 setIsRectangular(
true);
24void QQuickDefaultClipNode::setRect(
const QRectF &rect)
27 m_dirty_geometry =
true;
30void QQuickDefaultClipNode::setRadius(qreal radius)
33 m_dirty_geometry =
true;
34 setIsRectangular(radius == 0);
37void QQuickDefaultClipNode::update()
39 if (m_dirty_geometry) {
41 m_dirty_geometry =
false;
45void QQuickDefaultClipNode::updateGeometry()
47 QSGGeometry *g = geometry();
49 if (qFuzzyIsNull(m_radius)) {
51 QSGGeometry::updateRectGeometry(g, m_rect);
57 qreal radius = qMin(qMin(m_rect.width() / 2, m_rect.height() / 2), m_radius);
59 rect.adjust(radius, radius, -radius, -radius);
61 int segments = qMin(30, qCeil(radius));
63 g->allocate((segments + 1) * 4);
65 QVector2D *vertices = (QVector2D *)g->vertexData();
67 for (
int part = 0; part < 2; ++part) {
68 for (
int i = 0; i <= segments; ++i) {
70 qreal angle = qreal(0.5 * M_PI) * (part + i / qreal(segments));
71 qreal s = qFastSin(angle);
72 qreal c = qFastCos(angle);
73 qreal y = (part ? rect.bottom() : rect.top()) - radius * c;
74 qreal lx = rect.left() - radius * s;
75 qreal rx = rect.right() + radius * s;
77 vertices[vertexCount++] = QVector2D(rx, y);
78 vertices[vertexCount++] = QVector2D(lx, y);
83#ifdef QSG_RUNTIME_DESCRIPTION
84#ifndef QT_NO_DEBUG_STREAM
89 if (!qFuzzyIsNull(m_radius))
90 dbg <<
"radius" << m_radius;
92 qsgnode_set_description(
this, desc);
96 markDirty(DirtyGeometry);