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:
parent
97a96c26dd
commit
136e5fc206
@ -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())
|
||||||
|
@ -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];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user