filter/source/graphicfilter/icgm/class4.cxx | 189 ++++++++++++++++------------ 1 file changed, 110 insertions(+), 79 deletions(-)
New commits: commit f408713503a6c03427f8736c2bb2216cd151b2a5 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sun Jun 13 20:23:58 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Jun 14 09:42:19 2021 +0200 ofz#33769 Integer-overflow Change-Id: I6b76ab866cc843f52b3c0994e9812a0f1b87270c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117098 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/filter/source/graphicfilter/icgm/class4.cxx b/filter/source/graphicfilter/icgm/class4.cxx index 18eff3452451..0a498426b3bc 100644 --- a/filter/source/graphicfilter/icgm/class4.cxx +++ b/filter/source/graphicfilter/icgm/class4.cxx @@ -107,6 +107,11 @@ bool CGM::ImplGetEllipse( FloatPoint& rCenter, FloatPoint& rRadius, double& rAng return true; } +static bool useless(double value) +{ + return std::isnan(value) || std::isinf(value); +} + void CGM::ImplDoClass4() { if ( mbFirstOutPut ) @@ -377,11 +382,18 @@ void CGM::ImplDoClass4() double fG = 2.0 * ( fA * ( aEndingPoint.Y - aIntermediatePoint.Y ) - fB * ( aEndingPoint.X - aIntermediatePoint.X ) ); - if ( fG != 0 ) + bool bUseless = fG == 0; + + FloatPoint aCenterPoint; + if (!bUseless) { - FloatPoint aCenterPoint; aCenterPoint.X = ( fD * fE - fB * fF ) / fG; aCenterPoint.Y = ( fA * fF - fC * fE ) / fG; + bUseless = useless(aCenterPoint.X) || useless(aCenterPoint.Y); + } + + if (!bUseless) + { double fStartAngle = ImplGetOrientation( aCenterPoint, aStartingPoint ); double fInterAngle = ImplGetOrientation( aCenterPoint, aIntermediatePoint ); double fEndAngle = ImplGetOrientation( aCenterPoint, aEndingPoint ); @@ -516,35 +528,39 @@ void CGM::ImplDoClass4() ImplMapDouble( aRadius.X ); aRadius.Y = aRadius.X; - const double fStartSqrt = sqrt(vector[0] * vector[ 0 ] + vector[1] * vector[1]); - fStartAngle = fStartSqrt != 0.0 ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; - const double fEndSqrt = sqrt(vector[2] * vector[ 2 ] + vector[3] * vector[3]); - fEndAngle = fEndSqrt != 0.0 ? (acos(vector[ 2 ] / fEndSqrt) * 57.29577951308) : 0.0; + bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]); + if (!bUseless) + { + const double fStartSqrt = sqrt(vector[0] * vector[ 0 ] + vector[1] * vector[1]); + fStartAngle = fStartSqrt != 0.0 ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; + const double fEndSqrt = sqrt(vector[2] * vector[ 2 ] + vector[3] * vector[3]); + fEndAngle = fEndSqrt != 0.0 ? (acos(vector[ 2 ] / fEndSqrt) * 57.29577951308) : 0.0; - if ( vector[ 1 ] > 0 ) - fStartAngle = 360 - fStartAngle; - if ( vector[ 3 ] > 0 ) - fEndAngle = 360 - fEndAngle; + if ( vector[ 1 ] > 0 ) + fStartAngle = 360 - fStartAngle; + if ( vector[ 3 ] > 0 ) + fEndAngle = 360 - fEndAngle; - if ( mbAngReverse ) - ImplSwitchStartEndAngle( fStartAngle, fEndAngle ); + if ( mbAngReverse ) + ImplSwitchStartEndAngle( fStartAngle, fEndAngle ); - if ( mbFigure ) - { - tools::Rectangle aBoundingBox(aCenter.X - aRadius.X, aCenter.Y - aRadius.X); - aBoundingBox.SaturatingSetSize(Size(2 * aRadius.X, 2 * aRadius.X)); - tools::Polygon aPolygon( aBoundingBox, - Point( static_cast<tools::Long>(vector[ 0 ]), static_cast<tools::Long>(vector[ 1 ]) ), - Point( static_cast<tools::Long>(vector[ 2 ]), static_cast<tools::Long>(vector[ 3 ]) ), PolyStyle::Arc ); - mpOutAct->RegPolyLine( aPolygon ); - } - else - { - double fOrientation = 0; - mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, 2, fStartAngle, fEndAngle ); + if ( mbFigure ) + { + tools::Rectangle aBoundingBox(aCenter.X - aRadius.X, aCenter.Y - aRadius.X); + aBoundingBox.SaturatingSetSize(Size(2 * aRadius.X, 2 * aRadius.X)); + tools::Polygon aPolygon( aBoundingBox, + Point( static_cast<tools::Long>(vector[ 0 ]), static_cast<tools::Long>(vector[ 1 ]) ), + Point( static_cast<tools::Long>(vector[ 2 ]), static_cast<tools::Long>(vector[ 3 ]) ), PolyStyle::Arc ); + mpOutAct->RegPolyLine( aPolygon ); + } + else + { + double fOrientation = 0; + mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, 2, fStartAngle, fEndAngle ); + } } - mnParaSize = mnElementSize; + mnParaSize = mnElementSize; } break; @@ -568,29 +584,35 @@ void CGM::ImplDoClass4() } ImplMapDouble( aRadius.X ); aRadius.Y = aRadius.X; - const double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); - double fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; - const double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]); - double fEndAngle = fEndSqrt ? acos(vector[2] / fEndSqrt) * 57.29577951308 : 0.0; - if ( vector[ 1 ] > 0 ) - fStartAngle = 360 - fStartAngle; - if ( vector[ 3 ] > 0 ) - fEndAngle = 360 - fEndAngle; + sal_uInt32 nType = ImplGetUI16(); - if ( mbAngReverse ) - ImplSwitchStartEndAngle( fStartAngle, fEndAngle ); + bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]); + if (!bUseless) + { + const double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + double fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; + const double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]); + double fEndAngle = fEndSqrt ? acos(vector[2] / fEndSqrt) * 57.29577951308 : 0.0; + if ( vector[ 1 ] > 0 ) + fStartAngle = 360 - fStartAngle; + if ( vector[ 3 ] > 0 ) + fEndAngle = 360 - fEndAngle; - sal_uInt32 nType = ImplGetUI16(); - if ( nType == 0 ) - nType = 0; // is PIE - else - nType = 1; // is CHORD - fOrientation = 0; + if ( mbAngReverse ) + ImplSwitchStartEndAngle( fStartAngle, fEndAngle ); + + if ( nType == 0 ) + nType = 0; // is PIE + else + nType = 1; // is CHORD + fOrientation = 0; + + mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, + nType, fStartAngle, fEndAngle ); + } - mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, - nType, fStartAngle, fEndAngle ); mnParaSize = mnElementSize; } break; @@ -622,22 +644,26 @@ void CGM::ImplDoClass4() bool bDirection = ImplGetEllipse( aCenter, aRadius, fOrientation ); ImplGetVector( &vector[ 0 ] ); - double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); - fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; - double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]); - fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0; - - if ( vector[ 1 ] > 0 ) - fStartAngle = 360 - fStartAngle; - if ( vector[ 3 ] > 0 ) - fEndAngle = 360 - fEndAngle; - - if ( bDirection ) - mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, - 2, fStartAngle, fEndAngle ); - else - mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, - 2, fEndAngle, fStartAngle); + bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]); + if (!bUseless) + { + double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; + double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]); + fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0; + + if ( vector[ 1 ] > 0 ) + fStartAngle = 360 - fStartAngle; + if ( vector[ 3 ] > 0 ) + fEndAngle = 360 - fEndAngle; + + if ( bDirection ) + mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, + 2, fStartAngle, fEndAngle ); + else + mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, + 2, fEndAngle, fStartAngle); + } } break; @@ -652,28 +678,33 @@ void CGM::ImplDoClass4() bool bDirection = ImplGetEllipse( aCenter, aRadius, fOrientation ); ImplGetVector( &vector[ 0 ] ); - double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); - fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; - double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]); - fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0; + sal_uInt32 nType = ImplGetUI16(); - if ( vector[ 1 ] > 0 ) - fStartAngle = 360 - fStartAngle; - if ( vector[ 3 ] > 0 ) - fEndAngle = 360 - fEndAngle; + bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]); + if (!bUseless) + { + double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0; + double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]); + fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0; - sal_uInt32 nType = ImplGetUI16(); - if ( nType == 0 ) - nType = 0; // is PIE - else - nType = 1; // is CHORD + if ( vector[ 1 ] > 0 ) + fStartAngle = 360 - fStartAngle; + if ( vector[ 3 ] > 0 ) + fEndAngle = 360 - fEndAngle; - if ( bDirection ) - mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, - nType, fStartAngle, fEndAngle ); - else - mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, - nType, fEndAngle, fStartAngle); + if ( nType == 0 ) + nType = 0; // is PIE + else + nType = 1; // is CHORD + + if ( bDirection ) + mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, + nType, fStartAngle, fEndAngle ); + else + mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, + nType, fEndAngle, fStartAngle); + } } break; case 0x14 : /*Circular Arc Centre Reversed*/ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits