Painting: handle large and negative dash offset values

The mapping of the dash offset into the dash pattern was susceptible
to int overflow.

Change-Id: I254ed40b323ef516d10abc8e6008b14cfc23d2a0
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit ca604964f651b71f2b2a45a65e741167f520b714)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Eirik Aavitsland 2021-08-18 12:48:57 +02:00 committed by Qt Cherry-pick Bot
parent 97a96c26dd
commit 136e5fc206
2 changed files with 6 additions and 3 deletions

View File

@ -1633,8 +1633,9 @@ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen)
patternLength += pattern.at(i); patternLength += pattern.at(i);
if (patternLength > 0) { if (patternLength > 0) {
int n = qFloor(dashOffset / patternLength); dashOffset = std::fmod(dashOffset, patternLength);
dashOffset -= n * patternLength; if (dashOffset < 0)
dashOffset += patternLength;
while (dashOffset >= pattern.at(dashIndex)) { while (dashOffset >= pattern.at(dashIndex)) {
dashOffset -= pattern.at(dashIndex); dashOffset -= pattern.at(dashIndex);
if (++dashIndex >= pattern.size()) if (++dashIndex >= pattern.size())

View File

@ -1133,7 +1133,9 @@ void QDashStroker::processCurrentSubpath()
qreal doffset = m_dashOffset * m_stroke_width; qreal doffset = m_dashOffset * m_stroke_width;
// make sure doffset is in range [0..sumLength) // make sure doffset is in range [0..sumLength)
doffset -= qFloor(doffset * invSumLength) * sumLength; doffset = std::fmod(doffset, sumLength);
if (doffset < 0)
doffset += sumLength;
while (doffset >= dashes[idash]) { while (doffset >= dashes[idash]) {
doffset -= dashes[idash]; doffset -= dashes[idash];