diff options
author | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2021-01-20 08:35:43 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-01-20 18:20:15 +0000 |
commit | c1cd5dcabed67ce5932879b4c0fc321cd8c305a5 (patch) | |
tree | 7330295f13c1b5358d82a8619cae14755f56ebd2 /src/gui | |
parent | a48f500c3486a5df995be82ee39a6ed5585f8231 (diff) |
Rasterizer: compute intersection factors only when needed
Fixes oss-fuzz issue 29285
Change-Id: I8f7e0bc898b119d153a36cef5a74371249ed7686
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
(cherry picked from commit e1ed570f9d0ec3998f130e2c3870ef49e7994dbf)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/painting/qrasterizer.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/gui/painting/qrasterizer.cpp b/src/gui/painting/qrasterizer.cpp index 5a63840c03..48d41f41f0 100644 --- a/src/gui/painting/qrasterizer.cpp +++ b/src/gui/painting/qrasterizer.cpp @@ -657,19 +657,22 @@ static QScFixed intersectPixelFP(int x, QScFixed top, QScFixed bottom, QScFixed QScFixed rightX = IntToQScFixed(x) + QScFixedFactor; QScFixed leftIntersectY, rightIntersectY; - if (slope > 0) { - leftIntersectY = top + QScFixedMultiply(leftX - leftIntersectX, invSlope); - rightIntersectY = leftIntersectY + invSlope; - } else { - leftIntersectY = top + QScFixedMultiply(leftX - rightIntersectX, invSlope); - rightIntersectY = leftIntersectY + invSlope; - } + auto computeIntersectY = [&]() { + if (slope > 0) { + leftIntersectY = top + QScFixedMultiply(leftX - leftIntersectX, invSlope); + rightIntersectY = leftIntersectY + invSlope; + } else { + leftIntersectY = top + QScFixedMultiply(leftX - rightIntersectX, invSlope); + rightIntersectY = leftIntersectY + invSlope; + } + }; if (leftIntersectX >= leftX && rightIntersectX <= rightX) { return QScFixedMultiply(bottom - top, leftIntersectX - leftX + ((rightIntersectX - leftIntersectX) >> 1)); } else if (leftIntersectX >= rightX) { return bottom - top; } else if (leftIntersectX >= leftX) { + computeIntersectY(); if (slope > 0) { return (bottom - top) - QScFixedFastMultiply((rightX - leftIntersectX) >> 1, rightIntersectY - top); } else { @@ -678,12 +681,14 @@ static QScFixed intersectPixelFP(int x, QScFixed top, QScFixed bottom, QScFixed } else if (rightIntersectX <= leftX) { return 0; } else if (rightIntersectX <= rightX) { + computeIntersectY(); if (slope > 0) { return QScFixedFastMultiply((rightIntersectX - leftX) >> 1, bottom - leftIntersectY); } else { return QScFixedFastMultiply((rightIntersectX - leftX) >> 1, leftIntersectY - top); } } else { + computeIntersectY(); if (slope > 0) { return (bottom - rightIntersectY) + ((rightIntersectY - leftIntersectY) >> 1); } else { |