From acd5d04daa2bb601cda4aa38787a2b66b22d157f Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 27 Sep 2022 12:09:11 +0000 Subject: [PATCH] [bug-66278] Bug with multiple gradient stops at the exact same location causing a rendering failure (AWT -> not enough colors in gradient). Thanks to Gareth Floodgate. This closes #385 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1904301 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/xslf/TestXSLFBugs.java | 148 +++++++++++++++--- .../org/apache/poi/sl/draw/DrawPaint.java | 16 +- .../minimal-gradient-fill-issue.pptx | Bin 0 -> 36775 bytes 3 files changed, 138 insertions(+), 26 deletions(-) create mode 100644 test-data/slideshow/minimal-gradient-fill-issue.pptx diff --git a/poi-ooxml/src/test/java/org/apache/poi/xslf/TestXSLFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xslf/TestXSLFBugs.java index e41c91a2f1..ef4f487287 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xslf/TestXSLFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xslf/TestXSLFBugs.java @@ -25,6 +25,11 @@ import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assumptions.assumeFalse; import java.awt.Color; +import java.awt.LinearGradientPaint; +import java.awt.MultipleGradientPaint; +import java.awt.Paint; +import java.awt.RadialGradientPaint; +import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.File; import java.io.FileInputStream; @@ -247,9 +252,9 @@ class TestXSLFBugs { @Test void bug62587() throws IOException { Object[][] pics = { - {"santa.wmf", PictureType.WMF, XSLFRelation.IMAGE_WMF}, - {"tomcat.png", PictureType.PNG, XSLFRelation.IMAGE_PNG}, - {"clock.jpg", PictureType.JPEG, XSLFRelation.IMAGE_JPEG} + {"santa.wmf", PictureType.WMF, XSLFRelation.IMAGE_WMF}, + {"tomcat.png", PictureType.PNG, XSLFRelation.IMAGE_PNG}, + {"clock.jpg", PictureType.JPEG, XSLFRelation.IMAGE_JPEG} }; try (XMLSlideShow ppt1 = new XMLSlideShow()) { @@ -298,12 +303,12 @@ class TestXSLFBugs { XSLFSlide slide1 = ppt1.getSlides().get(0); Optional shapeToDelete1 = - slide1.getShapes().stream().filter(s -> s instanceof XSLFPictureShape).findFirst(); + slide1.getShapes().stream().filter(s -> s instanceof XSLFPictureShape).findFirst(); assertTrue(shapeToDelete1.isPresent()); slide1.removeShape(shapeToDelete1.get()); assertTrue(slide1.getRelationParts().stream() - .allMatch(rp -> "rId1,rId3".contains(rp.getRelationship().getId()))); + .allMatch(rp -> "rId1,rId3".contains(rp.getRelationship().getId()))); assertNotNull(ppt1.getPackage().getPart(ppn)); } @@ -311,20 +316,20 @@ class TestXSLFBugs { try (XMLSlideShow ppt2 = openSampleDocument("bug60499.pptx")) { XSLFSlide slide2 = ppt2.getSlides().get(0); Optional shapeToDelete2 = - slide2.getShapes().stream().filter(s -> s instanceof XSLFPictureShape).skip(1).findFirst(); + slide2.getShapes().stream().filter(s -> s instanceof XSLFPictureShape).skip(1).findFirst(); assertTrue(shapeToDelete2.isPresent()); slide2.removeShape(shapeToDelete2.get()); assertTrue(slide2.getRelationParts().stream() - .allMatch(rp -> "rId1,rId2".contains(rp.getRelationship().getId()))); + .allMatch(rp -> "rId1,rId2".contains(rp.getRelationship().getId()))); assertNotNull(ppt2.getPackage().getPart(ppn)); } try (XMLSlideShow ppt3 = openSampleDocument("bug60499.pptx")) { XSLFSlide slide3 = ppt3.getSlides().get(0); slide3.getShapes().stream() - .filter(s -> s instanceof XSLFPictureShape) - .collect(Collectors.toList()) - .forEach(slide3::removeShape); + .filter(s -> s instanceof XSLFPictureShape) + .collect(Collectors.toList()) + .forEach(slide3::removeShape); assertNull(ppt3.getPackage().getPart(ppn)); } } @@ -754,8 +759,8 @@ class TestXSLFBugs { void bug59273() throws IOException { try (XMLSlideShow ppt = openSampleDocument("bug59273.potx")) { ppt.getPackage().replaceContentType( - XSLFRelation.PRESENTATIONML_TEMPLATE.getContentType(), - XSLFRelation.MAIN.getContentType() + XSLFRelation.PRESENTATIONML_TEMPLATE.getContentType(), + XSLFRelation.MAIN.getContentType() ); try (XMLSlideShow rwPptx = writeOutAndReadBack(ppt)) { @@ -879,7 +884,7 @@ class TestXSLFBugs { @Test void bug62051() throws IOException { final Function, int[]> ids = (shapes) -> - shapes.stream().mapToInt(Shape::getShapeId).toArray(); + shapes.stream().mapToInt(Shape::getShapeId).toArray(); try (final XMLSlideShow ppt = new XMLSlideShow()) { final XSLFSlide slide = ppt.createSlide(); @@ -997,11 +1002,11 @@ class TestXSLFBugs { assumeFalse(xslfOnly); final double[][] clips = { - { 50.999999999999986, 51.0, 298.0, 98.0 }, - { 51.00000000000003, 51.0, 298.0, 98.0 }, - { 51.0, 51.0, 298.0, 98.0 }, - { 250.02000796164992, 93.10370370370373, 78.61839367617523, 55.89629629629627 }, - { 79.58198774450841, 53.20887318960063, 109.13118501448272, 9.40935058567127 }, + { 50.999999999999986, 51.0, 298.0, 98.0 }, + { 51.00000000000003, 51.0, 298.0, 98.0 }, + { 51.0, 51.0, 298.0, 98.0 }, + { 250.02000796164992, 93.10370370370373, 78.61839367617523, 55.89629629629627 }, + { 79.58198774450841, 53.20887318960063, 109.13118501448272, 9.40935058567127 }, }; DummyGraphics2d dgfx = new DummyGraphics2d(new NullPrintStream()) { @@ -1031,13 +1036,13 @@ class TestXSLFBugs { public void bug65228() throws IOException { try (XMLSlideShow ppt = openSampleDocument("bug65228.pptx")) { TextRun.TextCap act = ppt.getSlides().stream() - .flatMap(s -> s.getShapes().stream()) - .filter(s -> "März 2021\u2026".equals(s.getShapeName())) - .map(XSLFTextShape.class::cast) - .flatMap(s -> s.getTextParagraphs().stream()) - .flatMap(s -> s.getTextRuns().stream()) - .map(XSLFTextRun::getTextCap) - .findFirst().orElse(null); + .flatMap(s -> s.getShapes().stream()) + .filter(s -> "März 2021\u2026".equals(s.getShapeName())) + .map(XSLFTextShape.class::cast) + .flatMap(s -> s.getTextParagraphs().stream()) + .flatMap(s -> s.getTextRuns().stream()) + .map(XSLFTextRun::getTextCap) + .findFirst().orElse(null); assertEquals(TextRun.TextCap.ALL, act); } } @@ -1120,4 +1125,97 @@ class TestXSLFBugs { } } } + + @Test + void identicalGradientStopsBug() throws IOException { + + final ArrayList linearGradients = new ArrayList<>(); + final ArrayList radialGradients = new ArrayList<>(); + final DummyGraphics2d dgfx = new DummyGraphics2d(new NullPrintStream()) + { + public void setPaint(final Paint paint) { + if (paint instanceof LinearGradientPaint) { + linearGradients.add((LinearGradientPaint) paint); + } + if (paint instanceof RadialGradientPaint) { + radialGradients.add((RadialGradientPaint) paint); + } + } + }; + + final List expectedLinearGradients = Arrays.asList( + new LinearGradientPaint(new Point2D.Double(30.731732283464567, 138.7317322834646), + new Point2D.Double(122.91549846753813, 46.54796609939099), + new float[] { 0.0f, 0.99999994f, 1.0f }, + new Color[] { new Color(81, 124, 252, 255), + new Color(81, 124, 252, 255), + new Color(17,21,27, 204) }), + new LinearGradientPaint(new Point2D.Double(174.7317322834646, 138.73173228346457), + new Point2D.Double(266.9154984675381, 46.547966099391004), + new float[] { 0.0f, 0.00000005f, 1.0f }, + new Color[] { new Color(17,21,27, 204), + new Color(81, 124, 252, 255), + new Color(81, 124, 252, 255) }), + new LinearGradientPaint(new Point2D.Double(318.73173228346457, 138.73173228346462), + new Point2D.Double(410.9154984675381, 46.547966099391004), + new float[] { 0.0f, 0.5f, 0.50000006f, 1.0f }, + new Color[] { new Color(17,21,27, 204), + new Color(17,21,27, 204), + new Color(81, 124, 252, 255), + new Color(81, 124, 252, 255) }) + ); + + final List expectedRadialGradients = Arrays.asList( + new RadialGradientPaint(new Point2D.Double(30.731732283464567, 138.7317322834646), + 108.0f, new Point2D.Double(122.91549846753813, 46.54796609939099), + new float[] { 0.0f, 0.5f, 0.50000006f, 1.0f }, + new Color[] { new Color(17,21,27, 204), + new Color(17,21,27, 204), + new Color(81, 124, 252, 255), + new Color(81, 124, 252, 255) }, + MultipleGradientPaint.CycleMethod.NO_CYCLE), + new RadialGradientPaint(new Point2D.Double(228.73173228346457, 226.9755905511811), + 108.0f, new Point2D.Double(282.73173228346457, 280.9755905511811), + new float[] { 0.0f, 0.00000005f, 1.0f }, + new Color[] { new Color(17,21,27, 204), + new Color(81, 124, 252, 255), + new Color(81, 124, 252, 255) }, + MultipleGradientPaint.CycleMethod.NO_CYCLE), + new RadialGradientPaint(new Point2D.Double(84.73173228346457, 226.9755905511811), + 108.0f, new Point2D.Double(138.73173228346457, 280.9755905511811), + new float[] { 0.0f, 0.99999994f, 1.0f }, + new Color[] { new Color(81, 124, 252, 255), + new Color(81, 124, 252, 255), + new Color(17,21,27, 204) }, + MultipleGradientPaint.CycleMethod.NO_CYCLE) + ); + + try (XMLSlideShow slideShowModel = openSampleDocument("minimal-gradient-fill-issue.pptx")) { + // Render the first (and only) slide. + slideShowModel.getSlides().get(0).draw(dgfx); + + // Test that the linear gradients have the expected data (stops modified) + assertEquals(3, linearGradients.size()); + for (int i = 0 ; i < expectedLinearGradients.size() ; i++) { + final LinearGradientPaint expected = expectedLinearGradients.get(i); + final LinearGradientPaint actual = linearGradients.get(i); + assertEquals(expected.getStartPoint(), expected.getStartPoint()); + assertEquals(expected.getEndPoint(), expected.getEndPoint()); + assertArrayEquals(expected.getFractions(), actual.getFractions()); + assertArrayEquals(expected.getColors(), actual.getColors()); + } + + // Test that the radial gradients have the expected data (stops modified) + assertEquals(3, radialGradients.size()); + for (int i = 0 ; i < expectedRadialGradients.size() ; i++) { + final RadialGradientPaint expected = expectedRadialGradients.get(i); + final RadialGradientPaint actual = radialGradients.get(i); + assertEquals(expected.getCenterPoint(), expected.getCenterPoint()); + assertEquals(expected.getFocusPoint(), expected.getFocusPoint()); + assertArrayEquals(expected.getFractions(), actual.getFractions()); + assertArrayEquals(expected.getColors(), actual.getColors()); + } + } + } + } 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 78a24335a3..aa2a27fb0a 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 @@ -613,7 +613,21 @@ public class DrawPaint { // need to remap the fractions, because Java doesn't like repeating fraction values Map m = new TreeMap<>(); for (float fraction : fill.getGradientFractions()) { - m.put(fraction, styles.next()); + float gradientFraction = fraction; + + // Multiple gradient stops at the same location + // can lead to failure when creating AWT gradient, especially + // if there are only two stops and they are both on the exact + // same location. + // (The example of (only) 2 stops at exactly the same location will cause: + // java.lang.IllegalArgumentException: User must specify at least 2 colors). + // + // To fix this we nudge the stop a teeny tiny bit. + if (m.containsKey(gradientFraction)) { + gradientFraction += (gradientFraction == 1.0 ? -1.0 : 1.0) * 0.00000005; + } + + m.put(gradientFraction, styles.next()); } return init.apply(toArray(m.keySet()), m.values().toArray(new Color[0])); diff --git a/test-data/slideshow/minimal-gradient-fill-issue.pptx b/test-data/slideshow/minimal-gradient-fill-issue.pptx new file mode 100644 index 0000000000000000000000000000000000000000..9675c621e07f81df89b6c4499862157d1e89a49a GIT binary patch literal 36775 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%0ApcT}A-oiP= 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 Td;kDwAwTkv!LRt6oB#bEmKlCK literal 0 HcmV?d00001