From c0829ec48ad86393859a10020099d0a17d850e11 Mon Sep 17 00:00:00 2001 From: Kwanghyo Park Date: Wed, 20 Aug 2025 11:59:43 +0300 Subject: [PATCH] Prevent improper fill for area series on the zero-axis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an area series had consecutive points on the y=0 axis, the renderer would draw a horizontal line segment which caused visual glitches when filled. This change avoids filling that problematic segment on the y=0 axis, which fixes the improper fill. Pick-to: 6.9 6.8 Fixes: QTBUG-139112 Change-Id: I4461cbf80af9b059ccfcc714234fed5039d0cd43 Reviewed-by: Tomi Korpipää Reviewed-by: Jere Tuliniemi (cherry picked from commit 52c5d1d3eca72e6a0cebd53d2df1c6070bc7a340) Reviewed-by: Qt Cherry-pick Bot --- src/graphs2d/qsgrenderer/arearenderer.cpp | 34 +++++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/graphs2d/qsgrenderer/arearenderer.cpp b/src/graphs2d/qsgrenderer/arearenderer.cpp index 624d5689..a62baa9b 100644 --- a/src/graphs2d/qsgrenderer/arearenderer.cpp +++ b/src/graphs2d/qsgrenderer/arearenderer.cpp @@ -168,21 +168,26 @@ void AreaRenderer::handlePolish(QAreaSeries *series) int extraPointCount = lower ? 0 : 3; if (series->isVisible()) { + qreal prevUpperY = 0; for (int i = 0, j = 0; i < upperPoints.size() + extraPointCount; ++i, ++j) { qreal x; qreal y; - if (i == upperPoints.size()) - calculateRenderCoordinates(series, - upperPoints[upperPoints.size() - 1].x(), - 0, - &x, - &y); - else if (i == upperPoints.size() + 1) - calculateRenderCoordinates(series, upperPoints[0].x(), 0, &x, &y); - else if (i == upperPoints.size() + 2) - calculateRenderCoordinates(series, upperPoints[0].x(), upperPoints[0].y(), &x, &y); - else - calculateRenderCoordinates(series, upperPoints[i].x(), upperPoints[i].y(), &x, &y); + qreal upperX; + qreal upperY; + if (i == upperPoints.size()) { + upperX = upperPoints[upperPoints.size() - 1].x(); + upperY = 0; + } else if (i == upperPoints.size() + 1) { + upperX = upperPoints[0].x(); + upperY = 0; + } else if (i == upperPoints.size() + 2) { + upperX = upperPoints[0].x(); + upperY = upperPoints[0].y(); + } else { + upperX = upperPoints[i].x(); + upperY = upperPoints[i].y(); + } + calculateRenderCoordinates(series, upperX, upperY, &x, &y); if (i == 0) { painterPath.moveTo(x, y); @@ -205,8 +210,13 @@ void AreaRenderer::handlePolish(QAreaSeries *series) ++j; } else { painterPath.lineTo(x, y); + if (i != 0 && i < upper->points().size() + && upperY == 0 && prevUpperY == 0) { + painterPath.moveTo(x, y); + } } } + prevUpperY = upperY; } }