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 <xakepa10@laimg.moc>
This commit is contained in:
Ivailo Monev 2020-06-18 00:13:50 +00:00
parent 9703898116
commit a23b0f22a9
2 changed files with 19 additions and 21 deletions

View file

@ -767,9 +767,6 @@ void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargin
const int targetCenterWidth = targetCenterRight - targetCenterLeft; const int targetCenterWidth = targetCenterRight - targetCenterLeft;
const int targetCenterHeight = targetCenterBottom - targetCenterTop; const int targetCenterHeight = targetCenterBottom - targetCenterTop;
QVarLengthArray<qreal, 16> xTarget; // x-coordinates of target rectangles
QVarLengthArray<qreal, 16> yTarget; // y-coordinates of target rectangles
int columns = 3; int columns = 3;
int rows = 3; int rows = 3;
if (rules.horizontal != Qt::StretchTile && sourceCenterWidth != 0) 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) if (rules.vertical != Qt::StretchTile && sourceCenterHeight != 0)
rows = qMax(3, 2 + qCeil(targetCenterHeight / qreal(sourceCenterHeight))); 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[0] = targetRect.left();
xTarget[1] = targetCenterLeft; xTarget[1] = targetCenterLeft;

View file

@ -850,7 +850,7 @@ void QX11PaintEngine::drawRects(const QRect *rects, int rectCount)
} }
d->resetAdaptedOrigin(); d->resetAdaptedOrigin();
} else { } else {
QVarLengthArray<XRectangle> xrects(rectCount); XRectangle xrects[rectCount];
int numClipped = rectCount; int numClipped = rectCount;
for (int i = 0; i < rectCount; ++i) { for (int i = 0; i < rectCount; ++i) {
QRect r(rects[i]); QRect r(rects[i]);
@ -879,9 +879,9 @@ void QX11PaintEngine::drawRects(const QRect *rects, int rectCount)
if (numClipped) { if (numClipped) {
d->setupAdaptedOrigin(rects[0].topLeft()); d->setupAdaptedOrigin(rects[0].topLeft());
if (d->has_brush) 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) 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(); d->resetAdaptedOrigin();
} }
} }
@ -1463,7 +1463,7 @@ void QX11PaintEnginePrivate::fillPolygon_translated(const QPointF *polygonPoints
QPaintEngine::PolygonDrawMode mode) QPaintEngine::PolygonDrawMode mode)
{ {
QVarLengthArray<QPointF> translated_points(pointCount); QPointF translated_points[pointCount];
QPointF offset(matrix.dx(), matrix.dy()); QPointF offset(matrix.dx(), matrix.dy());
qreal offs = adjust_coords ? aliasedCoordinateDelta : 0.0; 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; 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 #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); q->drawImage(aligned, img, img.rect(), Qt::AutoColor);
} else if (clippedCount > 0) { } else if (clippedCount > 0) {
QVarLengthArray<XPoint> xpoints(clippedCount); XPoint xpoints[clippedCount];
for (int i = 0; i < clippedCount; ++i) { for (int i = 0; i < clippedCount; ++i) {
xpoints[i].x = qFloor(clippedPoints[i].x()); xpoints[i].x = qFloor(clippedPoints[i].x());
xpoints[i].y = qFloor(clippedPoints[i].y()); 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); XSetFillRule(dpy, fill_gc, WindingRule);
setupAdaptedOrigin(QPoint(xpoints[0].x, xpoints[0].y)); setupAdaptedOrigin(QPoint(xpoints[0].x, xpoints[0].y));
XFillPolygon(dpy, hd, fill_gc, XFillPolygon(dpy, hd, fill_gc,
xpoints.data(), clippedCount, xpoints, clippedCount,
mode == QPaintEngine::ConvexMode ? Convex : Complex, CoordModeOrigin); mode == QPaintEngine::ConvexMode ? Convex : Complex, CoordModeOrigin);
resetAdaptedOrigin(); resetAdaptedOrigin();
if (mode == QPaintEngine::WindingMode) 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) void QX11PaintEnginePrivate::strokePolygon_translated(const QPointF *polygonPoints, int pointCount, bool close)
{ {
QVarLengthArray<QPointF> translated_points(pointCount); QPointF translated_points[pointCount];
QPointF offset(matrix.dx(), matrix.dy()); QPointF offset(matrix.dx(), matrix.dy());
for (int i = 0; i < pointCount; ++i) for (int i = 0; i < pointCount; ++i)
translated_points[i] = polygonPoints[i] + offset; 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) 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); &clippedPoints, &clippedCount, close);
if (clippedCount > 0) { if (clippedCount > 0) {
QVarLengthArray<XPoint> xpoints(clippedCount); XPoint xpoints[clippedCount];
for (int i = 0; i < clippedCount; ++i) { for (int i = 0; i < clippedCount; ++i) {
xpoints[i].x = qRound(clippedPoints[i].x() + aliasedCoordinateDelta); xpoints[i].x = qRound(clippedPoints[i].x() + aliasedCoordinateDelta);
xpoints[i].y = qRound(clippedPoints[i].y() + aliasedCoordinateDelta); xpoints[i].y = qRound(clippedPoints[i].y() + aliasedCoordinateDelta);
} }
uint numberPoints = qMin(clippedCount, xlibMaxLinePoints); uint numberPoints = qMin(clippedCount, xlibMaxLinePoints);
XPoint *pts = xpoints.data(); XDrawLines(dpy, hd, gc, xpoints, numberPoints, CoordModeOrigin);
XDrawLines(dpy, hd, gc, pts, numberPoints, CoordModeOrigin); XPoint *pts = xpoints + numberPoints;
pts += numberPoints;
clippedCount -= numberPoints; clippedCount -= numberPoints;
numberPoints = qMin(clippedCount, xlibMaxLinePoints-1); numberPoints = qMin(clippedCount, xlibMaxLinePoints-1);
while (clippedCount) { while (clippedCount) {
@ -1706,9 +1705,10 @@ void QX11PaintEnginePrivate::fillPath(const QPainterPath &path, QX11PaintEngineP
QList<QPolygonF> polys = clippedPath.toFillPolygons(); QList<QPolygonF> polys = clippedPath.toFillPolygons();
for (int i = 0; i < polys.size(); ++i) { for (int i = 0; i < polys.size(); ++i) {
QVarLengthArray<QPointF> 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); translated_points[j] = polys.at(i).at(j);
if (!qt_x11Data->use_xrender || !(render_hints & QPainter::Antialiasing)) { if (!qt_x11Data->use_xrender || !(render_hints & QPainter::Antialiasing)) {
translated_points[j].rx() = qRound(translated_points[j].rx() + aliasedCoordinateDelta) + offs; 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); path.fillRule() == Qt::OddEvenFill ? QPaintEngine::OddEvenMode : QPaintEngine::WindingMode);
} }
} }