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]