void SpiralShape::updatePath(const QSizeF &size) { createPath(size); normalize(); #if 0 Q_UNUSED(size); QPointF startpoint(m_handles[0]); QPointF curvePoints[12]; int pointCnt = arcToCurve(m_radii.x(), m_radii.y(), m_startAngle, sweepAngle() , startpoint, curvePoints); int cp = 0; m_points[cp]->setPoint(startpoint); m_points[cp]->unsetProperty(KoPathPoint::HasControlPoint1); for (int i = 0; i < pointCnt; i += 3) { m_points[cp]->setControlPoint2(curvePoints[i]); m_points[++cp]->setControlPoint1(curvePoints[i+1]); m_points[cp]->setPoint(curvePoints[i+2]); m_points[cp]->unsetProperty(KoPathPoint::HasControlPoint2); } if (m_type == Curve) { m_points[++cp]->setPoint(m_center); m_points[cp]->unsetProperty(KoPathPoint::HasControlPoint1); m_points[cp]->unsetProperty(KoPathPoint::HasControlPoint2); } else if (m_type == Line && m_startAngle == m_endAngle) { m_points[0]->setControlPoint1(m_points[cp]->controlPoint1()); m_points[0]->setPoint(m_points[cp]->point()); --cp; } m_subpaths[0]->clear(); for (int i = 0; i <= cp; ++i) { if (i < cp || (m_type == Line && m_startAngle != m_endAngle)) { m_points[i]->unsetProperty(KoPathPoint::CloseSubpath); } else { m_points[i]->setProperty(KoPathPoint::CloseSubpath); } m_subpaths[0]->push_back(m_points[i]); } #endif }
void RectangleShape::updatePath(const QSizeF &size) { qreal rx = 0; qreal ry = 0; if (m_cornerRadiusX > 0 && m_cornerRadiusY > 0) { rx = size.width() / 200.0 * m_cornerRadiusX; ry = size.height() / 200.0 * m_cornerRadiusY; } qreal x2 = size.width() - rx; qreal y2 = size.height() - ry; QPointF curvePoints[12]; int requiredCurvePointCount = 4; if (rx && m_cornerRadiusX < 100) requiredCurvePointCount += 2; if (ry && m_cornerRadiusY < 100) requiredCurvePointCount += 2; createPoints(requiredCurvePointCount); KoSubpath &points = *m_subpaths[0]; int cp = 0; // first path starts and closes path points[cp]->setProperty(KoPathPoint::StartSubpath); points[cp]->setProperty(KoPathPoint::CloseSubpath); points[cp]->setPoint(QPointF(rx, 0)); points[cp]->removeControlPoint1(); points[cp]->removeControlPoint2(); if (m_cornerRadiusX < 100 || m_cornerRadiusY == 0) { // end point of the top edge points[++cp]->setPoint(QPointF(x2, 0)); points[cp]->removeControlPoint1(); points[cp]->removeControlPoint2(); } if (rx) { // the top right radius arcToCurve(rx, ry, 90, -90, points[cp]->point(), curvePoints); points[cp]->setControlPoint2(curvePoints[0]); points[++cp]->setControlPoint1(curvePoints[1]); points[cp]->setPoint(curvePoints[2]); points[cp]->removeControlPoint2(); } if (m_cornerRadiusY < 100 || m_cornerRadiusX == 0) { // the right edge points[++cp]->setPoint(QPointF(size.width(), y2)); points[cp]->removeControlPoint1(); points[cp]->removeControlPoint2(); } if (rx) { // the bottom right radius arcToCurve(rx, ry, 0, -90, points[cp]->point(), curvePoints); points[cp]->setControlPoint2(curvePoints[0]); points[++cp]->setControlPoint1(curvePoints[1]); points[cp]->setPoint(curvePoints[2]); points[cp]->removeControlPoint2(); } if (m_cornerRadiusX < 100 || m_cornerRadiusY == 0) { // the bottom edge points[++cp]->setPoint(QPointF(rx, size.height())); points[cp]->removeControlPoint1(); points[cp]->removeControlPoint2(); } if (rx) { // the bottom left radius arcToCurve(rx, ry, 270, -90, points[cp]->point(), curvePoints); points[cp]->setControlPoint2(curvePoints[0]); points[++cp]->setControlPoint1(curvePoints[1]); points[cp]->setPoint(curvePoints[2]); points[cp]->removeControlPoint2(); } if ((m_cornerRadiusY < 100 || m_cornerRadiusX == 0) && ry) { // the right edge points[++cp]->setPoint(QPointF(0, ry)); points[cp]->removeControlPoint1(); points[cp]->removeControlPoint2(); } if (rx) { // the top left radius arcToCurve(rx, ry, 180, -90, points[cp]->point(), curvePoints); points[cp]->setControlPoint2(curvePoints[0]); points[0]->setControlPoint1(curvePoints[1]); points[0]->setPoint(curvePoints[2]); } // unset all stop/close path properties for (int i = 1; i < cp; ++i) { points[i]->unsetProperty(KoPathPoint::StopSubpath); points[i]->unsetProperty(KoPathPoint::CloseSubpath); } // last point stops and closes path points.last()->setProperty(KoPathPoint::StopSubpath); points.last()->setProperty(KoPathPoint::CloseSubpath); }