From a23b0f22a996afd457ec00fd2c1fd115e1a3c649 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Thu, 18 Jun 2020 00:13:50 +0000 Subject: [PATCH] replace QVarLengthArray with dynamic arrays where possible avoids resizing in e.g. qDrawBorderPixmap(), there are more places where performance can be squeezed by doing the same thing Signed-off-by: Ivailo Monev --- src/gui/painting/qdrawutil.cpp | 8 +++---- src/gui/painting/qpaintengine_x11.cpp | 32 +++++++++++++-------------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/gui/painting/qdrawutil.cpp b/src/gui/painting/qdrawutil.cpp index 08cb246d3..4def62338 100644 --- a/src/gui/painting/qdrawutil.cpp +++ b/src/gui/painting/qdrawutil.cpp @@ -767,9 +767,6 @@ void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargin const int targetCenterWidth = targetCenterRight - targetCenterLeft; const int targetCenterHeight = targetCenterBottom - targetCenterTop; - QVarLengthArray xTarget; // x-coordinates of target rectangles - QVarLengthArray yTarget; // y-coordinates of target rectangles - int columns = 3; int rows = 3; if (rules.horizontal != Qt::StretchTile && sourceCenterWidth != 0) @@ -777,8 +774,9 @@ void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargin if (rules.vertical != Qt::StretchTile && sourceCenterHeight != 0) rows = qMax(3, 2 + qCeil(targetCenterHeight / qreal(sourceCenterHeight))); - xTarget.resize(columns + 1); - yTarget.resize(rows + 1); + + qreal xTarget[columns + 1]; // x-coordinates of target rectangles + qreal yTarget[rows + 1]; // y-coordinates of target rectangles xTarget[0] = targetRect.left(); xTarget[1] = targetCenterLeft; diff --git a/src/gui/painting/qpaintengine_x11.cpp b/src/gui/painting/qpaintengine_x11.cpp index f5546fc30..18a7ee681 100644 --- a/src/gui/painting/qpaintengine_x11.cpp +++ b/src/gui/painting/qpaintengine_x11.cpp @@ -850,7 +850,7 @@ void QX11PaintEngine::drawRects(const QRect *rects, int rectCount) } d->resetAdaptedOrigin(); } else { - QVarLengthArray xrects(rectCount); + XRectangle xrects[rectCount]; int numClipped = rectCount; for (int i = 0; i < rectCount; ++i) { QRect r(rects[i]); @@ -879,9 +879,9 @@ void QX11PaintEngine::drawRects(const QRect *rects, int rectCount) if (numClipped) { d->setupAdaptedOrigin(rects[0].topLeft()); if (d->has_brush) - XFillRectangles(d->dpy, d->hd, d->gc_brush, xrects.data(), numClipped); + XFillRectangles(d->dpy, d->hd, d->gc_brush, xrects, numClipped); else if (d->has_pen) - XDrawRectangles(d->dpy, d->hd, d->gc, xrects.data(), numClipped); + XDrawRectangles(d->dpy, d->hd, d->gc, xrects, numClipped); d->resetAdaptedOrigin(); } } @@ -1463,7 +1463,7 @@ void QX11PaintEnginePrivate::fillPolygon_translated(const QPointF *polygonPoints QPaintEngine::PolygonDrawMode mode) { - QVarLengthArray translated_points(pointCount); + QPointF translated_points[pointCount]; QPointF offset(matrix.dx(), matrix.dy()); qreal offs = adjust_coords ? aliasedCoordinateDelta : 0.0; @@ -1477,7 +1477,7 @@ void QX11PaintEnginePrivate::fillPolygon_translated(const QPointF *polygonPoints translated_points[i].ry() = qRound(translated_points[i].y()) + offs; } - fillPolygon_dev(translated_points.data(), pointCount, gcMode, mode); + fillPolygon_dev(translated_points, pointCount, gcMode, mode); } #ifndef QT_NO_XRENDER @@ -1608,7 +1608,7 @@ void QX11PaintEnginePrivate::fillPolygon_dev(const QPointF *polygonPoints, int p q->drawImage(aligned, img, img.rect(), Qt::AutoColor); } else if (clippedCount > 0) { - QVarLengthArray xpoints(clippedCount); + XPoint xpoints[clippedCount]; for (int i = 0; i < clippedCount; ++i) { xpoints[i].x = qFloor(clippedPoints[i].x()); xpoints[i].y = qFloor(clippedPoints[i].y()); @@ -1617,7 +1617,7 @@ void QX11PaintEnginePrivate::fillPolygon_dev(const QPointF *polygonPoints, int p XSetFillRule(dpy, fill_gc, WindingRule); setupAdaptedOrigin(QPoint(xpoints[0].x, xpoints[0].y)); XFillPolygon(dpy, hd, fill_gc, - xpoints.data(), clippedCount, + xpoints, clippedCount, mode == QPaintEngine::ConvexMode ? Convex : Complex, CoordModeOrigin); resetAdaptedOrigin(); if (mode == QPaintEngine::WindingMode) @@ -1628,11 +1628,11 @@ void QX11PaintEnginePrivate::fillPolygon_dev(const QPointF *polygonPoints, int p void QX11PaintEnginePrivate::strokePolygon_translated(const QPointF *polygonPoints, int pointCount, bool close) { - QVarLengthArray translated_points(pointCount); + QPointF translated_points[pointCount]; QPointF offset(matrix.dx(), matrix.dy()); for (int i = 0; i < pointCount; ++i) translated_points[i] = polygonPoints[i] + offset; - strokePolygon_dev(translated_points.data(), pointCount, close); + strokePolygon_dev(translated_points, pointCount, close); } void QX11PaintEnginePrivate::strokePolygon_dev(const QPointF *polygonPoints, int pointCount, bool close) @@ -1643,15 +1643,14 @@ void QX11PaintEnginePrivate::strokePolygon_dev(const QPointF *polygonPoints, int &clippedPoints, &clippedCount, close); if (clippedCount > 0) { - QVarLengthArray xpoints(clippedCount); + XPoint xpoints[clippedCount]; for (int i = 0; i < clippedCount; ++i) { xpoints[i].x = qRound(clippedPoints[i].x() + aliasedCoordinateDelta); xpoints[i].y = qRound(clippedPoints[i].y() + aliasedCoordinateDelta); } uint numberPoints = qMin(clippedCount, xlibMaxLinePoints); - XPoint *pts = xpoints.data(); - XDrawLines(dpy, hd, gc, pts, numberPoints, CoordModeOrigin); - pts += numberPoints; + XDrawLines(dpy, hd, gc, xpoints, numberPoints, CoordModeOrigin); + XPoint *pts = xpoints + numberPoints; clippedCount -= numberPoints; numberPoints = qMin(clippedCount, xlibMaxLinePoints-1); while (clippedCount) { @@ -1706,9 +1705,10 @@ void QX11PaintEnginePrivate::fillPath(const QPainterPath &path, QX11PaintEngineP QList polys = clippedPath.toFillPolygons(); for (int i = 0; i < polys.size(); ++i) { - QVarLengthArray translated_points(polys.at(i).size()); + const int translated_size = polys.at(i).size(); + QPointF translated_points[translated_size]; - for (int j = 0; j < polys.at(i).size(); ++j) { + for (int j = 0; j < translated_size; ++j) { translated_points[j] = polys.at(i).at(j); if (!qt_x11Data->use_xrender || !(render_hints & QPainter::Antialiasing)) { translated_points[j].rx() = qRound(translated_points[j].rx() + aliasedCoordinateDelta) + offs; @@ -1716,7 +1716,7 @@ void QX11PaintEnginePrivate::fillPath(const QPainterPath &path, QX11PaintEngineP } } - fillPolygon_dev(translated_points.data(), polys.at(i).size(), gc_mode, + fillPolygon_dev(translated_points, translated_size, gc_mode, path.fillRule() == Qt::OddEvenFill ? QPaintEngine::OddEvenMode : QPaintEngine::WindingMode); } }