summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEirik Aavitsland <eirik.aavitsland@qt.io>2021-01-20 08:35:43 +0100
committerEirik Aavitsland <eirik.aavitsland@qt.io>2021-01-20 15:19:37 +0100
commite1ed570f9d0ec3998f130e2c3870ef49e7994dbf (patch)
tree452839109a74cdd95485de26cfdb4636598251af
parentf9fff26b2db8152dcae26c92054f031bdebd7bc1 (diff)
Rasterizer: compute intersection factors only when needed
Fixes oss-fuzz issue 29285 Pick-to: 6.0 Change-Id: I8f7e0bc898b119d153a36cef5a74371249ed7686 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Robert Loehning <robert.loehning@qt.io>
-rw-r--r--src/gui/painting/qrasterizer.cpp19
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 {