This is an automated email from the ASF dual-hosted git repository.

pjfanning pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git


The following commit(s) were added to refs/heads/trunk by this push:
     new cca6d74ba0 add unit test coverage for mathutil and use it in more 
places (#1093)
cca6d74ba0 is described below

commit cca6d74ba0300013d43cf26b19379ab732f439d3
Author: PJ Fanning <[email protected]>
AuthorDate: Wed May 27 16:36:39 2026 +0100

    add unit test coverage for mathutil and use it in more places (#1093)
    
    * Add MathUtil tests and fix float/double-to-int casts across poi, 
poi-ooxml, poi-scratchpad
    
    * Fix long line in ImageHeaderWMF.getSize()
    
    ---------
    
    Co-authored-by: copilot-swe-agent[bot] 
<[email protected]>
---
 .../apache/poi/poifs/crypt/dsig/SignatureLine.java |   3 +-
 .../poi/xddf/usermodel/chart/XDDFBarChartData.java |   3 +-
 .../poi/xddf/usermodel/text/XDDFRunProperties.java |   7 +-
 .../xddf/usermodel/text/XDDFSpacingPercent.java    |   3 +-
 .../poi/xddf/usermodel/text/XDDFSpacingPoints.java |   3 +-
 .../poi/xddf/usermodel/text/XDDFTextRun.java       |   3 +-
 .../java/org/apache/poi/xdgf/util/VsdxToPng.java   |   5 +-
 .../org/apache/poi/xslf/draw/SVGImageRenderer.java |   3 +-
 .../apache/poi/xslf/draw/SVGRenderExtension.java   |   3 +-
 .../apache/poi/xslf/usermodel/XMLSlideShow.java    |   5 +-
 .../org/apache/poi/xslf/usermodel/XSLFChart.java   |   9 +-
 .../org/apache/poi/xslf/usermodel/XSLFColor.java   |   9 +-
 .../apache/poi/xslf/usermodel/XSLFGroupShape.java  |   3 +-
 .../apache/poi/xslf/usermodel/XSLFSimpleShape.java |   3 +-
 .../poi/xslf/usermodel/XSLFTextParagraph.java      |   9 +-
 .../org/apache/poi/xslf/usermodel/XSLFTextRun.java |   7 +-
 .../apache/poi/xslf/usermodel/XSLFTextShape.java   |   3 +-
 .../org/apache/poi/xslf/util/BitmapFormat.java     |   3 +-
 .../java/org/apache/poi/xslf/util/PPTX2PNG.java    |   5 +-
 .../java/org/apache/poi/xslf/util/SVGFormat.java   |   3 +-
 .../apache/poi/xssf/streaming/SXSSFPicture.java    |   5 +-
 .../org/apache/poi/xssf/usermodel/XSSFDrawing.java |   5 +-
 .../poi/xssf/usermodel/XSSFFontFormatting.java     |   3 +-
 .../org/apache/poi/xssf/usermodel/XSSFPicture.java |   5 +-
 .../org/apache/poi/xssf/usermodel/XSSFShape.java   |   3 +-
 .../apache/poi/xssf/usermodel/XSSFSimpleShape.java |   3 +-
 .../poi/xssf/usermodel/XSSFTextParagraph.java      |  17 +--
 .../org/apache/poi/xssf/usermodel/XSSFTextRun.java |   7 +-
 .../org/apache/poi/xwpf/usermodel/XWPFRun.java     |   4 +-
 .../poi/hemf/record/emfplus/HemfPlusBrush.java     |   2 +-
 .../java/org/apache/poi/hslf/blip/Metafile.java    |   4 +-
 .../apache/poi/hslf/usermodel/HSLFAutoShape.java   |   7 +-
 .../org/apache/poi/hslf/usermodel/HSLFFill.java    |   3 +-
 .../poi/hslf/usermodel/HSLFPictureShape.java       |   3 +-
 .../org/apache/poi/hslf/usermodel/HSLFShape.java   |   3 +-
 .../org/apache/poi/hslf/usermodel/HSLFTable.java   |   9 +-
 .../apache/poi/hslf/usermodel/HSLFTextShape.java   |   2 +-
 .../org/apache/poi/hwmf/draw/HwmfGraphics.java     |   8 +-
 .../apache/poi/hssf/usermodel/EscherGraphics.java  |   7 +-
 .../poi/hssf/usermodel/EscherGraphics2d.java       |   3 +-
 .../java/org/apache/poi/sl/draw/DrawPaint.java     |   3 +-
 .../org/apache/poi/sl/draw/DrawTextParagraph.java  |   3 +-
 .../org/apache/poi/sl/image/ImageHeaderPICT.java   |   5 +-
 .../org/apache/poi/sl/image/ImageHeaderWMF.java    |   5 +-
 .../org/apache/poi/ss/format/SimpleFraction.java   |   4 +-
 .../poi/ss/formula/eval/OperandResolver.java       |   3 +-
 .../java/org/apache/poi/ss/usermodel/DateUtil.java |   3 +-
 .../java/org/apache/poi/ss/util/ImageUtils.java    |   6 +-
 .../main/java/org/apache/poi/util/MathUtil.java    |   6 +
 poi/src/main/java/org/apache/poi/util/Units.java   |  12 +-
 .../java/org/apache/poi/util/TestMathUtil.java     | 155 +++++++++++++++++++++
 51 files changed, 304 insertions(+), 96 deletions(-)

diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java 
b/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java
index 060ab3b12c..033a428920 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/dsig/SignatureLine.java
@@ -53,6 +53,7 @@ import 
org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.poifs.filesystem.FileMagic;
 import org.apache.poi.sl.draw.DrawPictureShape;
 import org.apache.poi.sl.draw.ImageRenderer;
+import org.apache.poi.util.MathUtil;
 import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STTrueFalse;
@@ -331,7 +332,7 @@ public abstract class SignatureLine {
 
         Dimension2D dim = rnd.getDimension();
         int defaultWidth = 300;
-        int defaultHeight = (int)(defaultWidth * dim.getHeight() / 
dim.getWidth());
+        int defaultHeight = MathUtil.safeDoubleToInt(defaultWidth * 
dim.getHeight() / dim.getWidth());
         BufferedImage bi = new BufferedImage(defaultWidth, defaultHeight, 
BufferedImage.TYPE_INT_ARGB);
         Graphics2D gfx = bi.createGraphics();
         gfx.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java
 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java
index 5fba0b4447..0004797244 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFBarChartData.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.poi.ooxml.util.POIXMLUnits;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
 import org.openxmlformats.schemas.drawingml.x2006.chart.*;
 
@@ -111,7 +112,7 @@ public class XDDFBarChartData extends XDDFChartData {
     }
 
     public Integer getGapWidth() {
-        return (chart.isSetGapWidth()) ? 
(int)(POIXMLUnits.parsePercent(chart.getGapWidth().xgetVal()) / 1000.) : null;
+        return (chart.isSetGapWidth()) ? 
MathUtil.safeDoubleToInt(POIXMLUnits.parsePercent(chart.getGapWidth().xgetVal())
 / 1000.) : null;
     }
 
     public void setGapWidth(Integer width) {
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java
 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java
index aae476e125..9bceb83967 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFRunProperties.java
@@ -23,6 +23,7 @@ import java.util.function.Supplier;
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.xddf.usermodel.XDDFColor;
 import org.apache.poi.xddf.usermodel.XDDFEffectContainer;
 import org.apache.poi.xddf.usermodel.XDDFEffectList;
@@ -94,7 +95,7 @@ public class XDDFRunProperties {
             throw new IllegalArgumentException("Minimum inclusive = 1. Maximum 
inclusive = 400.");
         }
 
-        update(props::isSetSz, props::unsetSz, props::setSz, size == null ? 
null : (int)(100 * size));
+        update(props::isSetSz, props::unsetSz, props::setSz, size == null ? 
null : MathUtil.safeDoubleToInt(100 * size));
     }
 
     public void setFillProperties(XDDFFillProperties properties) {
@@ -139,7 +140,7 @@ public class XDDFRunProperties {
             throw new IllegalArgumentException("Minimum inclusive = 0. Maximum 
inclusive = 4000.");
         }
 
-        update(props::isSetKern, props::unsetKern, props::setKern, kerning == 
null ? null : (int)(100 * kerning));
+        update(props::isSetKern, props::unsetKern, props::setKern, kerning == 
null ? null : MathUtil.safeDoubleToInt(100 * kerning));
     }
 
     public void setCharacterSpacing(Double spacing) {
@@ -147,7 +148,7 @@ public class XDDFRunProperties {
             throw new IllegalArgumentException("Minimum inclusive = -4000. 
Maximum inclusive = 4000.");
         }
 
-        update(props::isSetSpc, props::unsetSpc, props::setSpc, spacing == 
null ? null : (int)(100 * spacing));
+        update(props::isSetSpc, props::unsetSpc, props::setSpc, spacing == 
null ? null : MathUtil.safeDoubleToInt(100 * spacing));
     }
 
     public void setFonts(XDDFFont[] fonts) {
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPercent.java
 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPercent.java
index 70c099e725..84a96f75c2 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPercent.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPercent.java
@@ -20,6 +20,7 @@ package org.apache.poi.xddf.usermodel.text;
 import org.apache.poi.ooxml.util.POIXMLUnits;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacingPercent;
 
@@ -54,6 +55,6 @@ public class XDDFSpacingPercent extends XDDFSpacing {
     }
 
     public void setPercent(double value) {
-        percent.setVal((int)(1000 * value));
+        percent.setVal(MathUtil.safeDoubleToInt(1000 * value));
     }
 }
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPoints.java
 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPoints.java
index ea1a771f7f..c7e538791c 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPoints.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFSpacingPoints.java
@@ -19,6 +19,7 @@ package org.apache.poi.xddf.usermodel.text;
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacingPoint;
 
@@ -51,6 +52,6 @@ public class XDDFSpacingPoints extends XDDFSpacing {
     }
 
     public void setPoints(double value) {
-        points.setVal((int)(100 * value));
+        points.setVal(MathUtil.safeDoubleToInt(100 * value));
     }
 }
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java
index 40adadcc57..5b53edc912 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java
@@ -32,6 +32,7 @@ import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.openxml4j.opc.TargetMode;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xddf.usermodel.XDDFColor;
 import org.apache.poi.xddf.usermodel.XDDFFillProperties;
@@ -325,7 +326,7 @@ public class XDDFTextRun {
         if (offset == null) {
             getOrCreateProperties().setBaseline(null);
         } else {
-            getOrCreateProperties().setBaseline((int) (offset * 1000));
+            
getOrCreateProperties().setBaseline(MathUtil.safeDoubleToInt(offset * 1000));
         }
     }
 
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xdgf/util/VsdxToPng.java 
b/poi-ooxml/src/main/java/org/apache/poi/xdgf/util/VsdxToPng.java
index 5616058cbb..c7a7aef14c 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xdgf/util/VsdxToPng.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xdgf/util/VsdxToPng.java
@@ -31,6 +31,7 @@ import java.nio.file.Path;
 import javax.imageio.ImageIO;
 
 import org.apache.poi.util.Dimension2DDouble;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.xdgf.usermodel.XDGFPage;
 import org.apache.poi.xdgf.usermodel.XmlVisioDocument;
 import org.apache.poi.xdgf.usermodel.shape.ShapeDebuggerRenderer;
@@ -65,8 +66,8 @@ public class VsdxToPng {
 
         Dimension2DDouble sz = page.getPageSize();
 
-        int width = (int) (scale * sz.getWidth());
-        int height = (int) (scale * sz.getHeight());
+        int width = MathUtil.safeDoubleToInt(scale * sz.getWidth());
+        int height = MathUtil.safeDoubleToInt(scale * sz.getHeight());
 
         BufferedImage img = new BufferedImage(width, height,
                 BufferedImage.TYPE_INT_RGB);
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGImageRenderer.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGImageRenderer.java
index 2bd46c4876..66d32f85a8 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGImageRenderer.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGImageRenderer.java
@@ -40,6 +40,7 @@ import 
org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.sl.draw.Drawable;
 import org.apache.poi.sl.draw.ImageRenderer;
 import org.apache.poi.sl.usermodel.PictureData;
+import org.apache.poi.util.MathUtil;
 import org.w3c.dom.svg.SVGDocument;
 
 public class SVGImageRenderer implements ImageRenderer {
@@ -88,7 +89,7 @@ public class SVGImageRenderer implements ImageRenderer {
 
     @Override
     public BufferedImage getImage(Dimension2D dim) {
-        BufferedImage bi = new BufferedImage((int)dim.getWidth(), 
(int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB);
+        BufferedImage bi = new 
BufferedImage(MathUtil.safeDoubleToInt(dim.getWidth()), 
MathUtil.safeDoubleToInt(dim.getHeight()), BufferedImage.TYPE_INT_ARGB);
         Graphics2D g2d = (Graphics2D) bi.getGraphics();
         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
RenderingHints.VALUE_ANTIALIAS_ON);
         g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
RenderingHints.VALUE_RENDER_QUALITY);
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java
index 7f78762996..a2e60f1b13 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/SVGRenderExtension.java
@@ -71,6 +71,7 @@ import org.apache.poi.sl.usermodel.PaintStyle;
 import org.apache.poi.sl.usermodel.SimpleShape;
 import org.apache.poi.util.Dimension2DDouble;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -212,7 +213,7 @@ public class SVGRenderExtension extends 
DefaultExtensionHandler {
             Element stop = 
genCtx.getDOMFactory().createElementNS(SVG_NAMESPACE_URI, SVG_STOP_TAG);
             SVGPaintDescriptor pd = SVGColor.toSVG(colors[i], genCtx);
 
-            stop.setAttribute(SVG_OFFSET_ATTRIBUTE, (int) (fracs[i] * 100.0f) 
+ "%");
+            stop.setAttribute(SVG_OFFSET_ATTRIBUTE, 
MathUtil.safeFloatToInt(fracs[i] * 100.0f) + "%");
             stop.setAttribute(SVG_STOP_COLOR_ATTRIBUTE, pd.getPaintValue());
 
             if (colors[i].getAlpha() != 255) {
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
index 44585f8b77..74cb6ccfa1 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
@@ -55,6 +55,7 @@ import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.NotImplemented;
 import org.apache.poi.util.Units;
 import org.apache.poi.util.XMLHelper;
@@ -281,7 +282,7 @@ public class XMLSlideShow extends POIXMLDocument
                 .mapToLong(CTSlideIdListEntry::getId).max();
 
         final XSLFRelation relationType = XSLFRelation.SLIDE;
-        final int slideNumber = (int)(Math.max(maxId.orElse(0),255)+1);
+        final int slideNumber = 
MathUtil.safeDoubleToInt(Math.max(maxId.orElse(0),255)+1);
         final int cnt = findNextAvailableFileNameIndex(relationType);
 
         RelationPart rp = createRelationship
@@ -551,7 +552,7 @@ public class XMLSlideShow extends POIXMLDocument
         CTSlideSize sz = _presentation.getSldSz();
         int cx = sz.getCx();
         int cy = sz.getCy();
-        return new Dimension((int) Units.toPoints(cx), (int) 
Units.toPoints(cy));
+        return new Dimension(MathUtil.safeDoubleToInt(Units.toPoints(cx)), 
MathUtil.safeDoubleToInt(Units.toPoints(cy)));
     }
 
     @Override
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFChart.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFChart.java
index 1e528db97e..696b889bff 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFChart.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFChart.java
@@ -29,6 +29,7 @@ import org.apache.poi.ooxml.POIXMLRelation;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
 import org.apache.poi.util.Beta;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.xddf.usermodel.chart.XDDFChart;
 import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlException;
@@ -127,12 +128,12 @@ public final class XSLFChart extends XDDFChart {
         CTTransform2D xfrm = frame.addNewXfrm();
 
         CTPoint2D off = xfrm.addNewOff();
-        off.setX((int)anchor.getX());
-        off.setY((int)anchor.getY());
+        off.setX(MathUtil.safeDoubleToInt(anchor.getX()));
+        off.setY(MathUtil.safeDoubleToInt(anchor.getY()));
 
         CTPositiveSize2D ext = xfrm.addNewExt();
-        ext.setCx((int)anchor.getWidth());
-        ext.setCy((int)anchor.getHeight());
+        ext.setCx(MathUtil.safeDoubleToInt(anchor.getWidth()));
+        ext.setCy(MathUtil.safeDoubleToInt(anchor.getHeight()));
 
         xfrm.setExt(ext);
         xfrm.setOff(off);
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFColor.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFColor.java
index b19fdd0c47..db46847340 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFColor.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFColor.java
@@ -31,6 +31,7 @@ import org.apache.poi.sl.usermodel.ColorStyle;
 import org.apache.poi.sl.usermodel.PresetColor;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;
@@ -227,15 +228,15 @@ public class XSLFColor {
         } else {
             CTScRgbColor rgb = fill.addNewScrgbClr();
             double[] scRGB = DrawPaint.RGB2SCRGB(color);
-            rgb.setR((int)Math.rint(scRGB[0]*100_000d));
-            rgb.setG((int)Math.rint(scRGB[1]*100_000d));
-            rgb.setB((int)Math.rint(scRGB[2]*100_000d));
+            rgb.setR(MathUtil.safeDoubleToInt(Math.rint(scRGB[0]*100_000d)));
+            rgb.setG(MathUtil.safeDoubleToInt(Math.rint(scRGB[1]*100_000d)));
+            rgb.setB(MathUtil.safeDoubleToInt(Math.rint(scRGB[2]*100_000d)));
             alphaPct = (addAlpha) ? rgb.addNewAlpha() : null;
         }
 
         // alpha (%)
         if (alphaPct != null) {
-            alphaPct.setVal((int)Math.rint(rgbaf[3]*100_000));
+            
alphaPct.setVal(MathUtil.safeDoubleToInt(Math.rint(rgbaf[3]*100_000)));
         }
     }
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
index d01408d717..b912510462 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
@@ -33,6 +33,7 @@ import org.apache.poi.sl.draw.DrawPictureShape;
 import org.apache.poi.sl.usermodel.GroupShape;
 import org.apache.poi.sl.usermodel.PictureData;
 import org.apache.poi.util.Beta;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.NotImplemented;
 import org.apache.poi.util.Units;
 import org.apache.xmlbeans.XmlObject;
@@ -343,7 +344,7 @@ implements XSLFShapeContainer, 
GroupShape<XSLFShape,XSLFTextParagraph> {
 
     @Override
     public void setRotation(double theta){
-        getSafeXfrm().setRot((int) (theta * 60000));
+        getSafeXfrm().setRot(MathUtil.safeDoubleToInt(theta * 60000));
     }
 
     @Override
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
index 8f562bbee0..fce0e6a441 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
@@ -43,6 +43,7 @@ import org.apache.poi.sl.usermodel.StrokeStyle.LineCap;
 import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
 import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
 import org.apache.poi.util.Beta;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry;
 import org.apache.poi.xslf.model.PropertyFetcher;
@@ -159,7 +160,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     public void setRotation(double theta) {
         CTTransform2D xfrm = getXfrm(true);
         if (xfrm != null) {
-            xfrm.setRot((int) (theta * 60000));
+            xfrm.setRot(MathUtil.safeDoubleToInt(theta * 60000));
         }
     }
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
index e4f06130a2..267c7b92d5 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
@@ -35,6 +35,7 @@ import org.apache.poi.sl.usermodel.TabStop.TabStopType;
 import org.apache.poi.sl.usermodel.TextParagraph;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xslf.model.ParagraphPropertyFetcher;
 import org.apache.poi.xslf.model.ParagraphPropertyFetcher.ParaPropFetcher;
@@ -362,13 +363,13 @@ public class XSLFTextParagraph implements 
TextParagraph<XSLFShape,XSLFTextParagr
 
         if(bulletSize >= 0) {
             CTTextBulletSizePercent pt = pr.isSetBuSzPct() ? pr.getBuSzPct() : 
pr.addNewBuSzPct();
-            pt.setVal(Integer.toString((int)(bulletSize*1000)));
+            
pt.setVal(Integer.toString(MathUtil.safeDoubleToInt(bulletSize*1000)));
             if(pr.isSetBuSzPts()) {
                 pr.unsetBuSzPts();
             }
         } else {
             CTTextBulletSizePoint pt = pr.isSetBuSzPts() ? pr.getBuSzPts() : 
pr.addNewBuSzPts();
-            pt.setVal((int)(-bulletSize*100));
+            pt.setVal(MathUtil.safeDoubleToInt(-bulletSize*100));
             if(pr.isSetBuSzPct()) {
                 pr.unsetBuSzPct();
             }
@@ -588,13 +589,13 @@ public class XSLFTextParagraph implements 
TextParagraph<XSLFShape,XSLFTextParagr
                 spc.unsetSpcPts();
             }
             final CTTextSpacingPercent pct = spc.isSetSpcPct() ? 
spc.getSpcPct() : spc.addNewSpcPct();
-            pct.setVal((int)(space*1000));
+            pct.setVal(MathUtil.safeDoubleToInt(space*1000));
         } else {
             if (spc.isSetSpcPct()) {
                 spc.unsetSpcPct();
             }
             final CTTextSpacingPoint pts = spc.isSetSpcPts() ? spc.getSpcPts() 
: spc.addNewSpcPts();
-            pts.setVal((int)(-space*100));
+            pts.setVal(MathUtil.safeDoubleToInt(-space*100));
         }
     }
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
index f2e5cdc3e9..11cf9dc32d 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
@@ -36,6 +36,7 @@ import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
 import org.apache.poi.sl.usermodel.TextRun;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xslf.model.CharacterPropertyFetcher;
 import org.apache.poi.xslf.model.CharacterPropertyFetcher.CharPropFetcher;
@@ -258,7 +259,7 @@ public class XSLFTextRun implements TextRun, 
HighlightColorSupport {
                 throw new IllegalArgumentException("Minimum font size is 1pt 
but was " + fontSize);
             }
 
-            rPr.setSz((int)(100*fontSize));
+            rPr.setSz(MathUtil.safeDoubleToInt(100*fontSize));
         }
     }
 
@@ -315,7 +316,7 @@ public class XSLFTextRun implements TextRun, 
HighlightColorSupport {
                 rPr.unsetSpc();
             }
         } else {
-            rPr.setSpc((int)(100*spc));
+            rPr.setSpc(MathUtil.safeDoubleToInt(100*spc));
         }
     }
 
@@ -401,7 +402,7 @@ public class XSLFTextRun implements TextRun, 
HighlightColorSupport {
      */
     @SuppressWarnings("WeakerAccess")
     public void setBaselineOffset(double baselineOffset){
-       getRPr(true).setBaseline((int) baselineOffset * 1000);
+       getRPr(true).setBaseline(MathUtil.safeDoubleToInt(baselineOffset * 
1000));
     }
 
     /**
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
index 875e84f4f2..707c33aa31 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
@@ -39,6 +39,7 @@ import org.apache.poi.sl.usermodel.Placeholder;
 import org.apache.poi.sl.usermodel.TextShape;
 import org.apache.poi.sl.usermodel.VerticalAlignment;
 import org.apache.poi.util.Beta;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xddf.usermodel.text.TextContainer;
 import org.apache.poi.xddf.usermodel.text.XDDFTextBody;
@@ -372,7 +373,7 @@ public abstract class XSLFTextShape extends XSLFSimpleShape
     public void setTextRotation(Double rotation) {
         CTTextBodyProperties bodyPr = getTextBodyPr(true);
         if (bodyPr != null) {
-            bodyPr.setRot((int) (rotation * 60000.));
+            bodyPr.setRot(MathUtil.safeDoubleToInt(rotation * 60000.));
         }
     }
 
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/util/BitmapFormat.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/util/BitmapFormat.java
index a33a85344b..de98990257 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/util/BitmapFormat.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/util/BitmapFormat.java
@@ -29,6 +29,7 @@ import javax.imageio.ImageIO;
 
 import org.apache.poi.sl.draw.Drawable;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 
 @Internal
 public class BitmapFormat implements OutputFormat {
@@ -52,7 +53,7 @@ public class BitmapFormat implements OutputFormat {
                 type = BufferedImage.TYPE_INT_RGB;
                 break;
         }
-        img = new BufferedImage((int)width, (int)height, type);
+        img = new BufferedImage(MathUtil.safeDoubleToInt(width), 
MathUtil.safeDoubleToInt(height), type);
         graphics = img.createGraphics();
         graphics.setRenderingHint(Drawable.BUFFERED_IMAGE, new 
WeakReference<>(img));
         return graphics;
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java
index ecd3757de8..3a6e1e9b25 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java
@@ -45,6 +45,7 @@ import org.apache.poi.sl.draw.EmbeddedExtractor.EmbeddedPart;
 import org.apache.poi.util.Dimension2DDouble;
 import org.apache.poi.util.GenericRecordJsonWriter;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 
 /**
  * An utility to convert slides of a .pptx slide show to a PNG image
@@ -296,8 +297,8 @@ public final class PPTX2PNG {
 
             final Dimension2D dim = new Dimension2DDouble();
             final double lenSide = getDimensions(proxy, dim);
-            final int width = Math.max((int)Math.rint(dim.getWidth()),1);
-            final int height = Math.max((int)Math.rint(dim.getHeight()),1);
+            final int width = 
Math.max(MathUtil.safeDoubleToInt(Math.rint(dim.getWidth())),1);
+            final int height = 
Math.max(MathUtil.safeDoubleToInt(Math.rint(dim.getHeight())),1);
 
             try (OutputFormat outputFormat = getOutput()) {
                 for (int slideNo : slidenum) {
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/util/SVGFormat.java 
b/poi-ooxml/src/main/java/org/apache/poi/xslf/util/SVGFormat.java
index 3d8d119810..633f8d8f95 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xslf/util/SVGFormat.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/util/SVGFormat.java
@@ -31,6 +31,7 @@ import org.apache.batik.dom.GenericDOMImplementation;
 import org.apache.batik.svggen.SVGGraphics2D;
 import org.apache.poi.sl.draw.Drawable;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.xslf.draw.SVGPOIGraphics2D;
 import org.w3c.dom.DOMImplementation;
 import org.w3c.dom.Document;
@@ -53,7 +54,7 @@ public class SVGFormat implements OutputFormat {
         // Create an instance of org.w3c.dom.Document.
         Document document = domImpl.createDocument(svgNS, "svg", null);
         svgGenerator = new SVGPOIGraphics2D(document, textAsShapes);
-        svgGenerator.setSVGCanvasSize(new Dimension((int)width, (int)height));
+        svgGenerator.setSVGCanvasSize(new 
Dimension(MathUtil.safeDoubleToInt(width), MathUtil.safeDoubleToInt(height)));
         svgGenerator.setRenderingHint(Drawable.CACHE_IMAGE_SOURCE, true);
         return svgGenerator;
     }
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFPicture.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFPicture.java
index 19117ec60f..9d771a87f7 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFPicture.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFPicture.java
@@ -31,6 +31,7 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.ImageUtils;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xssf.usermodel.XSSFAnchor;
 import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
@@ -164,7 +165,7 @@ public final class SXSSFPicture implements Picture {
         assert (w > scaledWidth);
         double cw = getColumnWidthInPixels(col2);
         double deltaW = w - scaledWidth;
-        int dx2 = (int)(Units.EMU_PER_PIXEL * (cw - deltaW));
+        int dx2 = MathUtil.safeDoubleToInt(Units.EMU_PER_PIXEL * (cw - 
deltaW));
 
         anchor.setCol2(col2);
         anchor.setDx2(dx2);
@@ -179,7 +180,7 @@ public final class SXSSFPicture implements Picture {
         assert (h > scaledHeight);
         double ch = getRowHeightInPixels(row2);
         double deltaH = h - scaledHeight;
-        int dy2 = (int)(Units.EMU_PER_PIXEL * (ch - deltaH));
+        int dy2 = MathUtil.safeDoubleToInt(Units.EMU_PER_PIXEL * (ch - 
deltaH));
         anchor.setRow2(row2);
         anchor.setDy2(dy2);
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
index 90007843fd..3da88b42ae 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
@@ -45,6 +45,7 @@ import org.apache.poi.ss.usermodel.ClientAnchor;
 import org.apache.poi.ss.usermodel.Drawing;
 import org.apache.poi.ss.util.ImageUtils;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xssf.model.Comments;
 import org.apache.xmlbeans.XmlCursor;
@@ -566,8 +567,8 @@ public final class XSSFDrawing extends POIXMLDocumentPart 
implements Drawing<XSS
         for (int row = anchor.getRow1(); row < anchor.getRow2(); row++) {
             heightPx += ImageUtils.getRowHeightInPixels(sheet, row);
         }
-        long width = Units.pixelToEMU((int) widthPx);
-        long height = Units.pixelToEMU((int) heightPx);
+        long width = Units.pixelToEMU(MathUtil.safeDoubleToInt(widthPx));
+        long height = Units.pixelToEMU(MathUtil.safeDoubleToInt(heightPx));
         CTPositiveSize2D ext = xfrm.addNewExt();
         ext.setCx(width - anchor.getDx1() + anchor.getDx2());
         ext.setCy(height - anchor.getDy1() + anchor.getDy2());
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java
index 85c8bfcf14..03977aea6f 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java
@@ -22,6 +22,7 @@ import org.apache.poi.ss.usermodel.Color;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.FontFormatting;
 import org.apache.poi.ss.usermodel.FontUnderline;
+import org.apache.poi.util.MathUtil;
 import 
org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STVerticalAlignRun;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont;
@@ -136,7 +137,7 @@ public class XSSFFontFormatting implements FontFormatting {
         if(_font.sizeOfSzArray() == 0) return -1;
 
         CTFontSize sz = _font.getSzArray(0);
-        return (int)(20*sz.getVal());
+        return MathUtil.safeDoubleToInt(20*sz.getVal());
     }
 
     /**
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPicture.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
index e5207093ff..007d8cb757 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
@@ -29,6 +29,7 @@ import org.apache.poi.ss.usermodel.Picture;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.ImageUtils;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
 import 
org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualPictureProperties;
@@ -225,8 +226,8 @@ public final class XSSFPicture extends XSSFShape implements 
Picture {
     public XSSFClientAnchor getPreferredSize(double scaleX, double scaleY){
         Dimension dim = ImageUtils.setPreferredSize(this, scaleX, scaleY);
         CTPositiveSize2D size2d =  ctPicture.getSpPr().getXfrm().getExt();
-        size2d.setCx((int)dim.getWidth());
-        size2d.setCy((int)dim.getHeight());
+        size2d.setCx(MathUtil.safeDoubleToInt(dim.getWidth()));
+        size2d.setCy(MathUtil.safeDoubleToInt(dim.getHeight()));
         return getClientAnchor();
     }
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFShape.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFShape.java
index caf3699fb3..595de23846 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFShape.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFShape.java
@@ -18,6 +18,7 @@
 package org.apache.poi.xssf.usermodel;
 
 import org.apache.poi.ss.usermodel.Shape;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNoFillProperties;
@@ -120,7 +121,7 @@ public abstract class XSSFShape implements Shape {
     public void setLineWidth( double lineWidth ) {
         CTShapeProperties props = getShapeProperties();
         CTLineProperties ln = props.isSetLn() ? props.getLn() : 
props.addNewLn();
-        ln.setW((int)(lineWidth*Units.EMU_PER_POINT));
+        ln.setW(MathUtil.safeDoubleToInt(lineWidth*Units.EMU_PER_POINT));
     }
 
     /**
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java
index 0840483e06..90fbbb9717 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java
@@ -31,6 +31,7 @@ import org.apache.poi.ss.usermodel.SimpleShape;
 import org.apache.poi.ss.usermodel.VerticalAlignment;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.xddf.usermodel.XDDFColor;
 import org.apache.poi.xddf.usermodel.XDDFColorRgbBinary;
 import org.apache.poi.xddf.usermodel.XDDFFillProperties;
@@ -984,7 +985,7 @@ public class XSSFSimpleShape extends XSSFShape implements 
Iterable<XSSFTextParag
         }
 
         if (pr.sizeOfSzArray() > 0) {
-            int sz = (int) (pr.getSzArray(0).getVal() * 100);
+            int sz = MathUtil.safeDoubleToInt(pr.getSzArray(0).getVal() * 100);
             rPr.setSz(sz);
         }
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java
index d917f8f720..9e3e674657 100644
--- 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java
+++ 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.poi.ooxml.util.NumberHelper;
 import org.apache.poi.ooxml.util.POIXMLUnits;
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.apache.poi.xssf.model.ParagraphPropertyFetcher;
 import org.apache.xmlbeans.XmlObject;
@@ -352,13 +353,13 @@ public class XSSFTextParagraph implements 
Iterable<XSSFTextRun>{
         if(bulletSize >= 0) {
             // percentage
             CTTextBulletSizePercent pt = pr.isSetBuSzPct() ? pr.getBuSzPct() : 
pr.addNewBuSzPct();
-            pt.setVal(Integer.toString((int)(bulletSize*1000)));
+            
pt.setVal(Integer.toString(MathUtil.safeDoubleToInt(bulletSize*1000)));
             // unset points if percentage is now set
             if(pr.isSetBuSzPts()) pr.unsetBuSzPts();
         } else {
             // points
             CTTextBulletSizePoint pt = pr.isSetBuSzPts() ? pr.getBuSzPts() : 
pr.addNewBuSzPts();
-            pt.setVal((int)(-bulletSize*100));
+            pt.setVal(MathUtil.safeDoubleToInt(-bulletSize*100));
             // unset percentage if points is now set
             if(pr.isSetBuSzPct()) pr.unsetBuSzPct();
         }
@@ -546,8 +547,8 @@ public class XSSFTextParagraph implements 
Iterable<XSSFTextRun>{
     public void setLineSpacing(double linespacing){
         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : 
_p.addNewPPr();
         CTTextSpacing spc = CTTextSpacing.Factory.newInstance();
-        if(linespacing >= 0) 
spc.addNewSpcPct().setVal((int)(linespacing*1000));
-        else spc.addNewSpcPts().setVal((int)(-linespacing*100));
+        if(linespacing >= 0) 
spc.addNewSpcPct().setVal(MathUtil.safeDoubleToInt(linespacing*1000));
+        else 
spc.addNewSpcPts().setVal(MathUtil.safeDoubleToInt(-linespacing*100));
         pr.setLnSpc(spc);
     }
 
@@ -611,8 +612,8 @@ public class XSSFTextParagraph implements 
Iterable<XSSFTextRun>{
     public void setSpaceBefore(double spaceBefore){
         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : 
_p.addNewPPr();
         CTTextSpacing spc = CTTextSpacing.Factory.newInstance();
-        if(spaceBefore >= 0) 
spc.addNewSpcPct().setVal((int)(spaceBefore*1000));
-        else spc.addNewSpcPts().setVal((int)(-spaceBefore*100));
+        if(spaceBefore >= 0) 
spc.addNewSpcPct().setVal(MathUtil.safeDoubleToInt(spaceBefore*1000));
+        else 
spc.addNewSpcPts().setVal(MathUtil.safeDoubleToInt(-spaceBefore*100));
         pr.setSpcBef(spc);
     }
 
@@ -666,8 +667,8 @@ public class XSSFTextParagraph implements 
Iterable<XSSFTextRun>{
     public void setSpaceAfter(double spaceAfter){
         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : 
_p.addNewPPr();
         CTTextSpacing spc = CTTextSpacing.Factory.newInstance();
-        if(spaceAfter >= 0) spc.addNewSpcPct().setVal((int)(spaceAfter*1000));
-        else spc.addNewSpcPts().setVal((int)(-spaceAfter*100));
+        if(spaceAfter >= 0) 
spc.addNewSpcPct().setVal(MathUtil.safeDoubleToInt(spaceAfter*1000));
+        else 
spc.addNewSpcPts().setVal(MathUtil.safeDoubleToInt(-spaceAfter*100));
         pr.setSpcAft(spc);
     }
 
diff --git 
a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextRun.java 
b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextRun.java
index 7880c901f3..ff0d63b1f0 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextRun.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextRun.java
@@ -18,6 +18,7 @@ package org.apache.poi.xssf.usermodel;
 
 import org.apache.poi.ooxml.util.NumberHelper;
 import org.apache.poi.ooxml.util.POIXMLUnits;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
@@ -120,7 +121,7 @@ public class XSSFTextRun {
                 throw new IllegalArgumentException("Minimum font size is 1pt 
but was " + fontSize);
             }
 
-            rPr.setSz((int)(100*fontSize));
+            rPr.setSz(MathUtil.safeDoubleToInt(100*fontSize));
         }
     }
 
@@ -170,7 +171,7 @@ public class XSSFTextRun {
         if(spc == 0.0) {
             if(rPr.isSetSpc()) rPr.unsetSpc();
         } else {
-            rPr.setSpc((int)(100*spc));
+            rPr.setSpc(MathUtil.safeDoubleToInt(100*spc));
         }
     }
 
@@ -267,7 +268,7 @@ public class XSSFTextRun {
      *     Positive values indicate superscript, negative values indicate 
subscript.
      */
     public void setBaselineOffset(double baselineOffset){
-        getRPr().setBaseline((int) baselineOffset * 1000);
+        getRPr().setBaseline(MathUtil.safeDoubleToInt(baselineOffset * 1000));
     }
 
     /**
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java 
b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
index 1d51c10f78..d28d628eab 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
@@ -835,7 +835,7 @@ public class XWPFRun implements ISDTContents, IRunElement, 
CharacterRun {
         if (pr == null || pr.sizeOfSpacingArray() == 0) {
             return 0;
         }
-        return 
(int)Units.toDXA(POIXMLUnits.parseLength(pr.getSpacingArray(0).xgetVal()));
+        return 
MathUtil.safeDoubleToInt(Units.toDXA(POIXMLUnits.parseLength(pr.getSpacingArray(0).xgetVal())));
     }
 
     @Override
@@ -1101,7 +1101,7 @@ public class XWPFRun implements ISDTContents, 
IRunElement, CharacterRun {
      */
     public int getTextPosition() {
         CTRPr pr = getRunProperties(false);
-        return (pr != null && pr.sizeOfPositionArray() > 0) ? 
(int)(Units.toPoints(POIXMLUnits.parseLength(pr.getPositionArray(0).xgetVal())) 
/ 2.)
+        return (pr != null && pr.sizeOfPositionArray() > 0) ? 
MathUtil.safeDoubleToInt(Units.toPoints(POIXMLUnits.parseLength(pr.getPositionArray(0).xgetVal()))
 / 2.)
                 : -1;
     }
 
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
 
b/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
index 6c34385070..b787b6f427 100644
--- 
a/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
+++ 
b/poi-scratchpad/src/main/java/org/apache/poi/hemf/record/emfplus/HemfPlusBrush.java
@@ -681,7 +681,7 @@ public class HemfPlusBrush {
             double[] end = DrawPaint.RGB2SCRGB(endColor);
 
             // compute the interpolated color in linear space
-            int a = (int)Math.round(startColor.getAlpha() + factor * 
(endColor.getAlpha() - startColor.getAlpha()));
+            int a = Math.toIntExact(Math.round(startColor.getAlpha() + factor 
* (endColor.getAlpha() - startColor.getAlpha())));
             double r = start[0] + factor * (end[0] - start[0]);
             double g = start[1] + factor * (end[1] - start[1]);
             double b = start[2] + factor * (end[2] - start[2]);
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/blip/Metafile.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/blip/Metafile.java
index 8c4ae1fd13..f858de7912 100644
--- a/poi-scratchpad/src/main/java/org/apache/poi/hslf/blip/Metafile.java
+++ b/poi-scratchpad/src/main/java/org/apache/poi/hslf/blip/Metafile.java
@@ -242,8 +242,8 @@ public abstract class Metafile extends HSLFPictureData {
         Header header = new Header();
         header.read(getRawData(), prefixLen);
         return new Dimension(
-            (int)Math.round(Units.toPoints((long)header.size.getWidth())),
-            (int)Math.round(Units.toPoints((long)header.size.getHeight()))
+            
Math.toIntExact(Math.round(Units.toPoints((long)header.size.getWidth()))),
+            
Math.toIntExact(Math.round(Units.toPoints((long)header.size.getHeight())))
         );
     }
 
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFAutoShape.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFAutoShape.java
index 20417dd464..17896e2c1f 100644
--- 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFAutoShape.java
+++ 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFAutoShape.java
@@ -49,6 +49,7 @@ import org.apache.poi.ss.usermodel.ShapeTypes;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.MathUtil;
 
 /**
  * Represents an AutoShape.<p>
@@ -271,8 +272,8 @@ public class HSLFAutoShape extends HSLFTextShape implements 
AutoShape<HSLFShape,
 
         final Rectangle2D bounds = getBounds(opt, path2D);
 
-        path.setW((int)Math.rint(bounds.getWidth()));
-        path.setH((int)Math.rint(bounds.getHeight()));
+        path.setW(MathUtil.safeDoubleToInt(Math.rint(bounds.getWidth())));
+        path.setH(MathUtil.safeDoubleToInt(Math.rint(bounds.getHeight())));
 
         return cusGeo;
     }
@@ -459,7 +460,7 @@ public class HSLFAutoShape extends HSLFTextShape implements 
AutoShape<HSLFShape,
     }
 
     private static String d2s(double d) {
-        return Integer.toString((int)Math.rint(d));
+        return Integer.toString(MathUtil.safeDoubleToInt(Math.rint(d)));
     }
 
     private static Point2D xy2p(int[] xyPoints) {
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFFill.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFFill.java
index 2a565e281c..ab0061ab57 100644
--- a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFFill.java
+++ b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFFill.java
@@ -48,6 +48,7 @@ import org.apache.poi.sl.usermodel.Shape;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 
 import static org.apache.logging.log4j.util.Unbox.box;
@@ -405,7 +406,7 @@ public final class HSLFFill {
 
             @Override
             public int getAlpha() {
-                return 
(int)(shape.getAlpha(EscherPropertyTypes.FILL__FILLOPACITY)*100000.0);
+                return 
MathUtil.safeDoubleToInt(shape.getAlpha(EscherPropertyTypes.FILL__FILLOPACITY)*100000.0);
             }
 
             @Override
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
index a311dbf40d..1726b8bf60 100644
--- 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
+++ 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
@@ -35,6 +35,7 @@ import org.apache.poi.sl.draw.DrawPictureShape;
 import org.apache.poi.sl.usermodel.PictureShape;
 import org.apache.poi.sl.usermodel.ShapeContainer;
 import org.apache.poi.sl.usermodel.ShapeType;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.StringUtil;
 import org.apache.poi.util.Units;
 
@@ -209,7 +210,7 @@ public class HSLFPictureShape extends HSLFSimpleShape 
implements PictureShape<HS
         // if all crop values are zero (the default) then no crop rectangle is 
set, return null
         return (top==0 && bottom==0 && left==0 && right==0)
             ? null
-            : new Insets((int)(top*100000), (int)(left*100000), 
(int)(bottom*100000), (int)(right*100000));
+            : new Insets(MathUtil.safeDoubleToInt(top*100000), 
MathUtil.safeDoubleToInt(left*100000), MathUtil.safeDoubleToInt(bottom*100000), 
MathUtil.safeDoubleToInt(right*100000));
     }
 
     @Override
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShape.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShape.java
index e5c599ada3..0c3be1efcb 100644
--- a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShape.java
+++ b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShape.java
@@ -50,6 +50,7 @@ import org.apache.poi.sl.usermodel.PresetColor;
 import org.apache.poi.sl.usermodel.Shape;
 import org.apache.poi.sl.usermodel.ShapeContainer;
 import org.apache.poi.sl.usermodel.ShapeType;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.RecordFormatException;
 import org.apache.poi.util.StringUtil;
 import org.apache.poi.util.Units;
@@ -392,7 +393,7 @@ public abstract class HSLFShape implements 
Shape<HSLFShape,HSLFTextParagraph> {
         }
 
         double alpha = getAlpha(opacityProperty);
-        return new Color(col.getRed(), col.getGreen(), col.getBlue(), 
(int)(alpha*255.0));
+        return new Color(col.getRed(), col.getGreen(), col.getBlue(), 
MathUtil.safeDoubleToInt(alpha*255.0));
     }
 
     Color getColor(EscherColorRef ecr) {
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTable.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTable.java
index c95d241836..0c25e97ea9 100644
--- a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTable.java
+++ b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTable.java
@@ -36,6 +36,7 @@ import org.apache.poi.ddf.EscherSimpleProperty;
 import org.apache.poi.sl.usermodel.ShapeContainer;
 import org.apache.poi.sl.usermodel.TableShape;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 
 /**
@@ -238,16 +239,16 @@ implements HSLFShapeContainer, 
TableShape<HSLFShape,HSLFTextParagraph> {
             ly2 = r.getMaxY();
         }
         int leftFit(double x1, double x2, double y1, double y2) {
-            return 
(int)(Math.abs(x1-lx1)+Math.abs(y1-ly1)+Math.abs(x1-lx2)+Math.abs(y2-ly2));
+            return 
MathUtil.safeDoubleToInt(Math.abs(x1-lx1)+Math.abs(y1-ly1)+Math.abs(x1-lx2)+Math.abs(y2-ly2));
         }
         int topFit(double x1, double x2, double y1, double y2) {
-            return 
(int)(Math.abs(x1-lx1)+Math.abs(y1-ly1)+Math.abs(x2-lx2)+Math.abs(y1-ly2));
+            return 
MathUtil.safeDoubleToInt(Math.abs(x1-lx1)+Math.abs(y1-ly1)+Math.abs(x2-lx2)+Math.abs(y1-ly2));
         }
         int rightFit(double x1, double x2, double y1, double y2) {
-            return 
(int)(Math.abs(x2-lx1)+Math.abs(y1-ly1)+Math.abs(x2-lx2)+Math.abs(y2-ly2));
+            return 
MathUtil.safeDoubleToInt(Math.abs(x2-lx1)+Math.abs(y1-ly1)+Math.abs(x2-lx2)+Math.abs(y2-ly2));
         }
         int bottomFit(double x1, double x2, double y1, double y2) {
-            return 
(int)(Math.abs(x1-lx1)+Math.abs(y2-ly1)+Math.abs(x2-lx2)+Math.abs(y2-ly2));
+            return 
MathUtil.safeDoubleToInt(Math.abs(x1-lx1)+Math.abs(y2-ly1)+Math.abs(x2-lx2)+Math.abs(y2-ly2));
         }
     }
 
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTextShape.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTextShape.java
index 681aaadca8..516d3d1e7d 100644
--- 
a/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTextShape.java
+++ 
b/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFTextShape.java
@@ -801,7 +801,7 @@ implements TextShape<HSLFShape,HSLFTextParagraph> {
         if (rotation == null) {
             opt.removeEscherProperty(EscherPropertyTypes.TEXT__FONTROTATION);
         } else {
-            int rot = (int)(Math.round(rotation / 90.) % 4L);
+            int rot = Math.toIntExact(Math.round(rotation / 90.) % 4L);
             setEscherProperty(EscherPropertyTypes.TEXT__FONTROTATION, rot);
         }
     }
diff --git 
a/poi-scratchpad/src/main/java/org/apache/poi/hwmf/draw/HwmfGraphics.java 
b/poi-scratchpad/src/main/java/org/apache/poi/hwmf/draw/HwmfGraphics.java
index 14436d1ba5..68e484b874 100644
--- a/poi-scratchpad/src/main/java/org/apache/poi/hwmf/draw/HwmfGraphics.java
+++ b/poi-scratchpad/src/main/java/org/apache/poi/hwmf/draw/HwmfGraphics.java
@@ -825,10 +825,10 @@ public class HwmfGraphics implements HwmfCharsetAware {
     private static Insets getSubImageInsets(Rectangle2D srcBounds, Rectangle2D 
nativeBounds) {
         // Todo: check if we need to normalize srcBounds x/y, in case of 
flipped images
         // for now we assume the width/height is positive
-        int left = 
(int)Math.round((srcBounds.getX()-nativeBounds.getX())/nativeBounds.getWidth()*100_000.);
-        int top = 
(int)Math.round((srcBounds.getY()-nativeBounds.getY())/nativeBounds.getHeight()*100_000.);
-        int right = 
(int)Math.round((nativeBounds.getMaxX()-srcBounds.getMaxX())/nativeBounds.getWidth()*100_000.);
-        int bottom = 
(int)Math.round((nativeBounds.getMaxY()-srcBounds.getMaxY())/nativeBounds.getHeight()*100_000.);
+        int left = 
Math.toIntExact(Math.round((srcBounds.getX()-nativeBounds.getX())/nativeBounds.getWidth()*100_000.));
+        int top = 
Math.toIntExact(Math.round((srcBounds.getY()-nativeBounds.getY())/nativeBounds.getHeight()*100_000.));
+        int right = 
Math.toIntExact(Math.round((nativeBounds.getMaxX()-srcBounds.getMaxX())/nativeBounds.getWidth()*100_000.));
+        int bottom = 
Math.toIntExact(Math.round((nativeBounds.getMaxY()-srcBounds.getMaxY())/nativeBounds.getHeight()*100_000.));
 
         return new Insets(top, left, bottom, right);
     }
diff --git 
a/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics.java 
b/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics.java
index 5e535f38f3..5b31022364 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics.java
@@ -20,6 +20,7 @@ package org.apache.poi.hssf.usermodel;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.logging.PoiLogManager;
 import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.NotImplemented;
 import org.apache.poi.util.SuppressForbidden;
 
@@ -292,15 +293,15 @@ public class EscherGraphics extends Graphics {
         Font excelFont;
         if ( font.getName().equals( "SansSerif" ) )
         {
-            excelFont = new Font( "Arial", font.getStyle(), (int) ( 
font.getSize() / verticalPixelsPerPoint ) );
+            excelFont = new Font( "Arial", font.getStyle(), 
MathUtil.safeFloatToInt( font.getSize() / verticalPixelsPerPoint ) );
         }
         else
         {
-            excelFont = new Font( font.getName(), font.getStyle(), (int) ( 
font.getSize() / verticalPixelsPerPoint ));
+            excelFont = new Font( font.getName(), font.getStyle(), 
MathUtil.safeFloatToInt( font.getSize() / verticalPixelsPerPoint ));
         }
         FontDetails d = StaticFontMetrics.getFontDetails( excelFont );
         int width = d.getStringWidth( str ) * 8  + 12;
-        int height = (int) ( ( font.getSize() / verticalPixelsPerPoint ) + 6 ) 
* 2;
+        int height = MathUtil.safeFloatToInt( ( font.getSize() / 
verticalPixelsPerPoint ) + 6 ) * 2;
         y -= ( font.getSize() / verticalPixelsPerPoint ) + 2 * 
verticalPixelsPerPoint;    // we want to draw the shape from the top-left
         HSSFTextbox textbox = escherGroup.createTextbox( new HSSFChildAnchor( 
x, y, x + width, y + height ) );
         textbox.setNoFill( true );
diff --git 
a/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java 
b/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
index f32986b18b..f8a5ad8692 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
@@ -19,6 +19,7 @@ package org.apache.poi.hssf.usermodel;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.logging.PoiLogManager;
+import org.apache.poi.util.MathUtil;
 
 import java.awt.*;
 import java.awt.font.FontRenderContext;
@@ -158,7 +159,7 @@ public final class EscherGraphics2d extends Graphics2D {
                 width = (int) ((BasicStroke)_stroke).getLineWidth() * 12700;
             }
 
-            drawLine((int)shape2d.getX1(), (int)shape2d.getY1(), 
(int)shape2d.getX2(), (int)shape2d.getY2(), width);
+            drawLine(MathUtil.safeDoubleToInt(shape2d.getX1()), 
MathUtil.safeDoubleToInt(shape2d.getY1()), 
MathUtil.safeDoubleToInt(shape2d.getX2()), 
MathUtil.safeDoubleToInt(shape2d.getY2()), width);
         }
         else
         {
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java 
b/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
index 613102787c..d8e4ecebd0 100644
--- a/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
+++ b/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
@@ -59,6 +59,7 @@ import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
 import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;
 import org.apache.poi.sl.usermodel.PlaceableShape;
 import org.apache.poi.util.Dimension2DDouble;
+import org.apache.poi.util.MathUtil;
 
 
 /**
@@ -385,7 +386,7 @@ public class DrawPaint {
     private static void scaleShades(int[] samples, double ratio) {
         if (ratio != 1) {
             for (int x=0; x<samples.length; x++) {
-                samples[x] = (int)Math.rint(samples[x] * ratio);
+                samples[x] = MathUtil.safeDoubleToInt(Math.rint(samples[x] * 
ratio));
             }
         }
     }
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/DrawTextParagraph.java 
b/poi/src/main/java/org/apache/poi/sl/draw/DrawTextParagraph.java
index 28c43e6a95..bed9dec44c 100644
--- a/poi/src/main/java/org/apache/poi/sl/draw/DrawTextParagraph.java
+++ b/poi/src/main/java/org/apache/poi/sl/draw/DrawTextParagraph.java
@@ -64,6 +64,7 @@ import org.apache.poi.sl.usermodel.TextShape;
 import org.apache.poi.sl.usermodel.TextShape.TextDirection;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.StringUtil;
 import org.apache.poi.util.Units;
 import org.w3c.dom.Text;
@@ -480,7 +481,7 @@ public class DrawTextParagraph implements Drawable {
             if (tabSz == null) {
                 tabSz = wspace*4;
             }
-            numSpaces = (int)Math.min(Math.ceil(tabSz / wspace), 20);
+            numSpaces = MathUtil.safeDoubleToInt(Math.min(Math.ceil(tabSz / 
wspace), 20));
         }
 
         char[] buf = new char[numSpaces];
diff --git a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderPICT.java 
b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderPICT.java
index bf9cacefaf..3f3676441d 100644
--- a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderPICT.java
+++ b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderPICT.java
@@ -21,6 +21,7 @@ import java.awt.Dimension;
 import java.awt.Rectangle;
 
 import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 
 @Internal
@@ -77,8 +78,8 @@ public class ImageHeaderPICT {
     }
 
     public Dimension getSize() {
-        int height = (int)Math.round(bounds.height*DEFAULT_RESOLUTION/vRes);
-        int width = (int)Math.round(bounds.width*DEFAULT_RESOLUTION/hRes);
+        int height = 
MathUtil.safeDoubleToInt(Math.round(bounds.height*DEFAULT_RESOLUTION/vRes));
+        int width = 
MathUtil.safeDoubleToInt(Math.round(bounds.width*DEFAULT_RESOLUTION/hRes));
         return new Dimension(width, height);
     }
 
diff --git a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderWMF.java 
b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderWMF.java
index 23d44c2e7b..5b44fb6941 100644
--- a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderWMF.java
+++ b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderWMF.java
@@ -27,6 +27,7 @@ import org.apache.poi.logging.PoiLogManager;
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.Units;
 
 /**
@@ -143,7 +144,9 @@ public class ImageHeaderWMF {
     public Dimension getSize() {
         //coefficient to translate from WMF dpi to 72dpi
         double coeff = ((double)Units.POINT_DPI)/inch;
-        return new Dimension((int)Math.round((right-left)*coeff), 
(int)Math.round((bottom-top)*coeff));
+        int width = MathUtil.safeDoubleToInt(Math.round((right-left)*coeff));
+        int height = MathUtil.safeDoubleToInt(Math.round((bottom-top)*coeff));
+        return new Dimension(width, height);
     }
 
     public Rectangle getBounds() {
diff --git a/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java 
b/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
index 29404f6d9f..f097820ab2 100644
--- a/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
+++ b/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
@@ -16,6 +16,8 @@
 */
 package org.apache.poi.ss.format;
 
+import org.apache.poi.util.MathUtil;
+
 public class SimpleFraction {
 
 
@@ -32,7 +34,7 @@ public class SimpleFraction {
      * @return a SimpleFraction with the given values set.
      */
     public static SimpleFraction buildFractionExactDenominator(double val, int 
exactDenom){
-        int num =  (int)Math.round(val*exactDenom);
+        int num =  MathUtil.safeDoubleToInt(Math.round(val*exactDenom));
         return new SimpleFraction(num,exactDenom);
     }
 
diff --git 
a/poi/src/main/java/org/apache/poi/ss/formula/eval/OperandResolver.java 
b/poi/src/main/java/org/apache/poi/ss/formula/eval/OperandResolver.java
index 545db9fa36..cb87e0aad4 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/eval/OperandResolver.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/eval/OperandResolver.java
@@ -21,6 +21,7 @@ import org.apache.poi.ss.formula.EvaluationCell;
 import org.apache.poi.ss.formula.LazyRefEval;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.MathUtil;
 
 import java.time.DateTimeException;
 import java.util.regex.Pattern;
@@ -236,7 +237,7 @@ public final class OperandResolver {
         double d = coerceValueToDouble(ev);
         // Note - the standard java type conversion from double to int 
truncates toward zero.
         // but Math.floor() truncates toward negative infinity
-        return (int)Math.floor(d);
+        return MathUtil.safeDoubleToInt(Math.floor(d));
     }
 
     /**
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java 
b/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
index 4983feba62..edff23219e 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
@@ -36,6 +36,7 @@ import java.util.regex.Pattern;
 
 import org.apache.poi.ss.formula.ConditionalFormattingEvaluator;
 import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
 import org.apache.poi.util.ThreadLocalUtil;
 
 /**
@@ -532,7 +533,7 @@ public class DateUtil {
         if (!isValidExcelDate(date)) {
             return null;
         }
-        int wholeDays = (int)Math.floor(date);
+        int wholeDays = MathUtil.safeDoubleToInt(Math.floor(date));
         int millisecondsInDay = (int)((date - wholeDays) * DAY_MILLISECONDS + 
0.5);
         Calendar calendar;
         if (timeZone != null) {
diff --git a/poi/src/main/java/org/apache/poi/ss/util/ImageUtils.java 
b/poi/src/main/java/org/apache/poi/ss/util/ImageUtils.java
index 15785d3b06..8347618971 100644
--- a/poi/src/main/java/org/apache/poi/ss/util/ImageUtils.java
+++ b/poi/src/main/java/org/apache/poi/ss/util/ImageUtils.java
@@ -180,8 +180,8 @@ public final class ImageUtils {
                   isHSSF ? HEIGHT_UNITS : 0, (row) -> 
getRowHeightInPixels(sheet, row));
 
         return new Dimension(
-            (int)Math.round(scaledWidth*EMU_PER_PIXEL),
-            (int)Math.round(scaledHeight*EMU_PER_PIXEL)
+            MathUtil.safeDoubleToInt(Math.round(scaledWidth*EMU_PER_PIXEL)),
+            MathUtil.safeDoubleToInt(Math.round(scaledHeight*EMU_PER_PIXEL))
         );
     }
 
@@ -287,7 +287,7 @@ public final class ImageUtils {
         }
 
         endCell.accept(cellIdx);
-        endD.accept((int)Math.rint(endDval));
+        endD.accept(MathUtil.safeDoubleToInt(Math.rint(endDval)));
     }
 
     private static int getDimFromCell(double imgSize, int startCell, int 
startD, int endCell, int endD, int hssfUnits,
diff --git a/poi/src/main/java/org/apache/poi/util/MathUtil.java 
b/poi/src/main/java/org/apache/poi/util/MathUtil.java
index a653887a36..f94ce78179 100644
--- a/poi/src/main/java/org/apache/poi/util/MathUtil.java
+++ b/poi/src/main/java/org/apache/poi/util/MathUtil.java
@@ -26,6 +26,12 @@ public class MathUtil {
     private MathUtil() {}
 
     public static int safeFloatToInt(float f) {
+        if (Float.isNaN(f)) {
+            throw new IllegalArgumentException("Cannot convert NaN to int");
+        }
+        if (Float.isInfinite(f)) {
+            throw new IllegalArgumentException("Cannot convert infinity to 
int");
+        }
         if (f > Integer.MAX_VALUE || f < Integer.MIN_VALUE) {
             throw new IllegalArgumentException("Value out of range: " + f);
         }
diff --git a/poi/src/main/java/org/apache/poi/util/Units.java 
b/poi/src/main/java/org/apache/poi/util/Units.java
index 1aad77db8b..bf8b1ccbc0 100644
--- a/poi/src/main/java/org/apache/poi/util/Units.java
+++ b/poi/src/main/java/org/apache/poi/util/Units.java
@@ -19,6 +19,8 @@ package org.apache.poi.util;
 import java.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 
+import static org.apache.poi.util.MathUtil.safeDoubleToInt;
+
 public class Units {
     /**
      * In Escher absolute distances are specified in
@@ -76,7 +78,7 @@ public class Units {
      * @return EMUs
      */
     public static int toEMU(double points){
-        return (int)Math.rint(EMU_PER_POINT*points);
+        return safeDoubleToInt(Math.rint(EMU_PER_POINT*points));
     }
 
     /**
@@ -122,8 +124,8 @@ public class Units {
     public static int doubleToFixedPoint(double floatPoint) {
         double fractionalPart = floatPoint % 1d;
         double integralPart = floatPoint - fractionalPart;
-        int i = (int)Math.floor(integralPart);
-        int f = (int)Math.rint(fractionalPart*65536d);
+        int i = safeDoubleToInt(Math.floor(integralPart));
+        int f = safeDoubleToInt(Math.rint(fractionalPart*65536d));
         return (i << 16) | (f & 0xFFFF);
     }
 
@@ -137,13 +139,13 @@ public class Units {
     public static int pointsToMaster(double points) {
         points *= MASTER_DPI;
         points /= POINT_DPI;
-        return (int)Math.rint(points);
+        return safeDoubleToInt(Math.rint(points));
     }
 
     public static int pointsToPixel(double points) {
         points *= PIXEL_DPI;
         points /= POINT_DPI;
-        return (int)Math.rint(points);
+        return safeDoubleToInt(Math.rint(points));
     }
 
     public static double pixelToPoints(double pixel) {
diff --git a/poi/src/test/java/org/apache/poi/util/TestMathUtil.java 
b/poi/src/test/java/org/apache/poi/util/TestMathUtil.java
new file mode 100644
index 0000000000..238fb51921
--- /dev/null
+++ b/poi/src/test/java/org/apache/poi/util/TestMathUtil.java
@@ -0,0 +1,155 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.util;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit tests for {@link MathUtil}
+ */
+class TestMathUtil {
+
+    // ---- safeFloatToInt ----
+
+    @Test
+    void testSafeFloatToInt_normalValues() {
+        assertEquals(0, MathUtil.safeFloatToInt(0.0f));
+        assertEquals(42, MathUtil.safeFloatToInt(42.0f));
+        assertEquals(-42, MathUtil.safeFloatToInt(-42.0f));
+        assertEquals(100, MathUtil.safeFloatToInt(100.5f)); // truncation
+        assertEquals(-100, MathUtil.safeFloatToInt(-100.5f)); // truncation
+    }
+
+    @Test
+    void testSafeFloatToInt_maxValue() {
+        // Integer.MAX_VALUE as float is 2^31, which rounds to 
Integer.MAX_VALUE+1 in float,
+        // so we use a value just within range
+        assertEquals(2147483520, MathUtil.safeFloatToInt(2147483520.0f));
+    }
+
+    @Test
+    void testSafeFloatToInt_minValue() {
+        assertEquals(Integer.MIN_VALUE, MathUtil.safeFloatToInt((float) 
Integer.MIN_VALUE));
+    }
+
+    @Test
+    void testSafeFloatToInt_overflowPositive() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeFloatToInt(Float.MAX_VALUE));
+    }
+
+    @Test
+    void testSafeFloatToInt_overflowNegative() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeFloatToInt(-Float.MAX_VALUE));
+    }
+
+    @Test
+    void testSafeFloatToInt_positiveInfinity() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeFloatToInt(Float.POSITIVE_INFINITY));
+    }
+
+    @Test
+    void testSafeFloatToInt_negativeInfinity() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeFloatToInt(Float.NEGATIVE_INFINITY));
+    }
+
+    @Test
+    void testSafeFloatToInt_nan() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeFloatToInt(Float.NaN));
+    }
+
+    // ---- safeDoubleToInt ----
+
+    @Test
+    void testSafeDoubleToInt_normalValues() {
+        assertEquals(0, MathUtil.safeDoubleToInt(0.0));
+        assertEquals(42, MathUtil.safeDoubleToInt(42.0));
+        assertEquals(-42, MathUtil.safeDoubleToInt(-42.0));
+        assertEquals(100, MathUtil.safeDoubleToInt(100.9)); // truncation
+        assertEquals(-100, MathUtil.safeDoubleToInt(-100.9)); // truncation
+    }
+
+    @Test
+    void testSafeDoubleToInt_maxValue() {
+        assertEquals(Integer.MAX_VALUE, MathUtil.safeDoubleToInt((double) 
Integer.MAX_VALUE));
+    }
+
+    @Test
+    void testSafeDoubleToInt_minValue() {
+        assertEquals(Integer.MIN_VALUE, MathUtil.safeDoubleToInt((double) 
Integer.MIN_VALUE));
+    }
+
+    @Test
+    void testSafeDoubleToInt_justBelowMax() {
+        assertEquals(Integer.MAX_VALUE - 1, MathUtil.safeDoubleToInt((double) 
(Integer.MAX_VALUE - 1)));
+    }
+
+    @Test
+    void testSafeDoubleToInt_justAboveMin() {
+        assertEquals(Integer.MIN_VALUE + 1, MathUtil.safeDoubleToInt((double) 
(Integer.MIN_VALUE + 1)));
+    }
+
+    @Test
+    void testSafeDoubleToInt_overflowPositive() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt((double) Integer.MAX_VALUE + 
1.0));
+    }
+
+    @Test
+    void testSafeDoubleToInt_overflowNegative() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt((double) Integer.MIN_VALUE - 
1.0));
+    }
+
+    @Test
+    void testSafeDoubleToInt_largePositive() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt(Double.MAX_VALUE));
+    }
+
+    @Test
+    void testSafeDoubleToInt_largeNegative() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt(-Double.MAX_VALUE));
+    }
+
+    @Test
+    void testSafeDoubleToInt_positiveInfinity() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt(Double.POSITIVE_INFINITY));
+    }
+
+    @Test
+    void testSafeDoubleToInt_negativeInfinity() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt(Double.NEGATIVE_INFINITY));
+    }
+
+    @Test
+    void testSafeDoubleToInt_nan() {
+        assertThrows(IllegalArgumentException.class,
+                () -> MathUtil.safeDoubleToInt(Double.NaN));
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to