diff --git a/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/AbstractLinearGradientBuilder.java b/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/AbstractLinearGradientBuilder.java index 9e2d3c9789..e416a0d5d2 100644 --- a/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/AbstractLinearGradientBuilder.java +++ b/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/AbstractLinearGradientBuilder.java @@ -123,21 +123,17 @@ public GradientSpreadMethod getSpreadMethod() { * the current space. The {@code null} value is valid and can be used * if there is no transformation from base coordinates to current space * specified, or it is equal to identity transformation. - * @return the constructed {@link Color} + * @return the constructed {@link Color} or {@code null} if no color to be applied + * or base gradient vector has been specified */ public Color buildColor(Rectangle targetBoundingBox, AffineTransform contextTransform) { - Point[] coordinates = getGradientVector(targetBoundingBox, contextTransform); - if (coordinates == null || this.stops.isEmpty()) { - // Can not create gradient color with 0 stops + Point[] baseCoordinatesVector = getGradientVector(targetBoundingBox, contextTransform); + if (baseCoordinatesVector == null || this.stops.isEmpty()) { + // Can not create gradient color with 0 stops or null coordinates vector return null; - } else if (this.stops.size() == 1 || coordinates[0].equals(coordinates[1])) { - // single stop and zero vector case - float[] lastStopRgb = this.stops.get(this.stops.size() - 1).getRgbArray(); - return new DeviceRgb(lastStopRgb[0], lastStopRgb[1], lastStopRgb[2]); } // evaluate actual coordinates and transformation - Point[] baseCoordinatesVector = new Point[] {coordinates[0].getLocation(), coordinates[1].getLocation()}; AffineTransform shadingTransform = new AffineTransform(); if (contextTransform != null) { shadingTransform.concatenate(contextTransform); @@ -167,6 +163,9 @@ public Color buildColor(Rectangle targetBoundingBox, AffineTransform contextTran PdfShading.Axial axial = createAxialShading(baseCoordinatesVector, this.stops, this.spreadMethod, targetBoundingBox); + if (axial == null) { + return null; + } PdfPattern.Shading shading = new PdfPattern.Shading(axial); if (!shadingTransform.isIdentity()) { @@ -271,91 +270,61 @@ protected static Point[] createCoordinatesForNewDomain(double[] newDomain, Point private static PdfShading.Axial createAxialShading(Point[] baseCoordinatesVector, List stops, GradientSpreadMethod spreadMethod, Rectangle targetBoundingBox) { - List stopsToConstruct = normalizeStops(stops, baseCoordinatesVector); + double baseVectorLength = baseCoordinatesVector[1].distance(baseCoordinatesVector[0]); + List stopsToConstruct = normalizeStops(stops, baseVectorLength); double[] coordinatesDomain = new double[] {0, 1}; - if (spreadMethod == GradientSpreadMethod.REPEAT || spreadMethod == GradientSpreadMethod.REFLECT) { - coordinatesDomain = evaluateCoveringDomain(baseCoordinatesVector, targetBoundingBox); - stopsToConstruct = adjustNormalizedStopsToCoverDomain(stopsToConstruct, coordinatesDomain, spreadMethod); + Point[] actualCoordinates; + if (baseVectorLength < ZERO_EPSILON || stopsToConstruct.size() == 1) { + // single color case + if (spreadMethod == GradientSpreadMethod.NONE) { + return null; + } + actualCoordinates = new Point[]{new Point(targetBoundingBox.getLeft(), targetBoundingBox.getBottom()), + new Point(targetBoundingBox.getRight(), targetBoundingBox.getBottom())}; + + GradientColorStop lastColorStop = stopsToConstruct.get(stopsToConstruct.size() - 1); + stopsToConstruct = Arrays.asList(new GradientColorStop(lastColorStop, 0d, OffsetType.RELATIVE), + new GradientColorStop(lastColorStop, 1d, OffsetType.RELATIVE)); } else { - // to ensure that stops list covers the full domain. For repeat and reflect cases - // this is done by adjusting the initial stops to cover the evaluated domain - coordinatesDomain[0] = Math.max(coordinatesDomain[0], stopsToConstruct.get(0).getOffset()); - coordinatesDomain[1] = Math.min(coordinatesDomain[1], - stopsToConstruct.get(stopsToConstruct.size() - 1).getOffset()); - coordinatesDomain[1] = Math.max(coordinatesDomain[0], coordinatesDomain[1]); - } + coordinatesDomain = evaluateCoveringDomain(baseCoordinatesVector, targetBoundingBox); + if (spreadMethod == GradientSpreadMethod.REPEAT || spreadMethod == GradientSpreadMethod.REFLECT) { + stopsToConstruct = adjustNormalizedStopsToCoverDomain(stopsToConstruct, coordinatesDomain, + spreadMethod); + } else if (spreadMethod == GradientSpreadMethod.PAD) { + adjustStopsForPadIfNeeded(stopsToConstruct, coordinatesDomain); + } else { + // none case + double firstStopOffset = stopsToConstruct.get(0).getOffset(); + double lastStopOffset = stopsToConstruct.get(stopsToConstruct.size() - 1).getOffset(); + if ((lastStopOffset - firstStopOffset < ZERO_EPSILON) + || coordinatesDomain[1] <= firstStopOffset + || coordinatesDomain[0] >= lastStopOffset) { + return null; + } + coordinatesDomain[0] = Math.max(coordinatesDomain[0], firstStopOffset); + coordinatesDomain[1] = Math.min(coordinatesDomain[1], lastStopOffset); + } + assert coordinatesDomain[0] <= coordinatesDomain[1]; - // workaround for PAD case - if (spreadMethod == GradientSpreadMethod.PAD) { - coordinatesDomain = modifyNormalizedStopsForPad(stopsToConstruct, coordinatesDomain); + actualCoordinates = createCoordinatesForNewDomain(coordinatesDomain, baseCoordinatesVector); } - assert coordinatesDomain[0] <= coordinatesDomain[1]; - - Point[] actualCoordinates = createCoordinatesForNewDomain(coordinatesDomain, baseCoordinatesVector); - - PdfShading.Axial axial = new PdfShading.Axial( + return new PdfShading.Axial( new PdfDeviceCs.Rgb(), createCoordsPdfArray(actualCoordinates), new PdfArray(coordinatesDomain), constructFunction(stopsToConstruct) ); - // apply extended flag for PAD case - if (spreadMethod == GradientSpreadMethod.PAD) { - axial.setExtend(true, true); - } - return axial; - } - - private static double[] modifyNormalizedStopsForPad(List stopsToConstruct, - double[] coordinatesDomain) { - double[] newDomain = new double[] {coordinatesDomain[0], coordinatesDomain[1]}; - double eps = Math.max(1, (coordinatesDomain[1] - coordinatesDomain[0])) * 0.05; - - for (int i = stopsToConstruct.size() - 1; i > 0; --i) { - GradientColorStop currentStop = stopsToConstruct.get(i); - double currentStopOffset = currentStop.getOffset(); - if (Math.abs(currentStopOffset - coordinatesDomain[1]) < eps) { - GradientColorStop prevStop = stopsToConstruct.get(i - 1); - if ((prevStop.getHintOffsetType() == HintOffsetType.RELATIVE_BETWEEN_COLORS - && prevStop.getHintOffset() >= 1d - ZERO_EPSILON) - || (prevStop.getOffset() > currentStopOffset - eps)) { - double lastOffset = currentStopOffset + eps; - stopsToConstruct.add(i + 1, new GradientColorStop(currentStop, lastOffset, OffsetType.RELATIVE)); - newDomain[1] = lastOffset; - } - break; - } - if (currentStopOffset < coordinatesDomain[1]) { - break; - } - } - - for (int i = 0; i < stopsToConstruct.size() - 1; ++i) { - GradientColorStop currentStop = stopsToConstruct.get(i); - double currentStopOffset = currentStop.getOffset(); - if (Math.abs(currentStopOffset - coordinatesDomain[0]) < eps) { - if ((currentStop.getHintOffsetType() == HintOffsetType.RELATIVE_BETWEEN_COLORS - && currentStop.getHintOffset() <= 0d + ZERO_EPSILON) - || (stopsToConstruct.get(i + 1).getOffset() < currentStopOffset + eps)) { - double firstOffset = currentStopOffset - eps; - stopsToConstruct.add(i, new GradientColorStop(currentStop, firstOffset, OffsetType.RELATIVE)); - newDomain[0] = firstOffset; - } - break; - } - if (currentStopOffset > coordinatesDomain[0]) { - break; - } - } - return newDomain; } // the result list would have the same list of stop colors as the original one // with all offsets on coordinates domain dimension and adjusted for ascending values - private static List normalizeStops(List toNormalize, Point[] coordinates) { - double baseVectorLength = coordinates[1].distance(coordinates[0]); + private static List normalizeStops(List toNormalize, double baseVectorLength) { + if (baseVectorLength < ZERO_EPSILON) { + return Arrays.asList(new GradientColorStop(toNormalize.get(toNormalize.size() - 1), + 0d, OffsetType.RELATIVE)); + } // get rid of all absolute on vector offsets and hint offsets List result = copyStopsAndNormalizeAbsoluteOffsets(toNormalize, baseVectorLength); // normalize 1st stop as it may be a special case @@ -502,6 +471,18 @@ private static List copyStopsAndNormalizeAbsoluteOffsets(List return copy; } + private static void adjustStopsForPadIfNeeded(List stopsToConstruct, + double[] coordinatesDomain) { + GradientColorStop firstStop = stopsToConstruct.get(0); + if (coordinatesDomain[0] < firstStop.getOffset()) { + stopsToConstruct.add(0, new GradientColorStop(firstStop, coordinatesDomain[0], OffsetType.RELATIVE)); + } + GradientColorStop lastStop = stopsToConstruct.get(stopsToConstruct.size() - 1); + if (coordinatesDomain[1] > lastStop.getOffset()) { + stopsToConstruct.add(new GradientColorStop(lastStop, coordinatesDomain[1], OffsetType.RELATIVE)); + } + } + private static List adjustNormalizedStopsToCoverDomain(List normalizedStops, double[] targetDomain, GradientSpreadMethod spreadMethod) { List adjustedStops = new ArrayList<>(); diff --git a/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilder.java b/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilder.java index 109b897d21..c582dd61db 100644 --- a/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilder.java +++ b/kernel/src/main/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilder.java @@ -74,7 +74,7 @@ public LinearGradientBuilder setCurrentSpaceToGradientVectorSpaceTransformation( @Override public Point[] getGradientVector(Rectangle targetBoundingBox, AffineTransform contextTransform) { - return this.coordinates; + return new Point[] {this.coordinates[0].getLocation(), this.coordinates[1].getLocation()}; } @Override diff --git a/kernel/src/test/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest.java b/kernel/src/test/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest.java index bd047c9362..45ba11fa6d 100644 --- a/kernel/src/test/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest.java +++ b/kernel/src/test/java/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest.java @@ -695,6 +695,71 @@ public void builderWithZeroColorsLengthAndReflect() throws IOException, Interrup generateAndComparePdfs("builderWithZeroColorsLengthAndReflect.pdf", targetBoundingBox, null, gradientBuilder); } + @Test + public void buildWithTwoStopsBeforeTheBeginningAndNoneTest() throws IOException, InterruptedException { + Rectangle targetBoundingBox = new Rectangle(50f, 450f, 300f, 300f); + AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() + .setGradientVector(targetBoundingBox.getLeft() + 100f, targetBoundingBox.getBottom() + 100f, + targetBoundingBox.getRight() - 100f, targetBoundingBox.getTop() - 100f) + .setSpreadMethod(GradientSpreadMethod.NONE) + .addColorStop(new GradientColorStop(ColorConstants.RED.getColorValue(), -10d, OffsetType.RELATIVE)) + .addColorStop(new GradientColorStop(ColorConstants.BLUE.getColorValue(), -5d, OffsetType.RELATIVE)); + + Assert.assertNull(gradientBuilder.buildColor(targetBoundingBox, null)); + } + + @Test + public void buildWithTwoStopsAfterEndAndNoneTest() throws IOException, InterruptedException { + Rectangle targetBoundingBox = new Rectangle(50f, 450f, 300f, 300f); + AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() + .setGradientVector(targetBoundingBox.getLeft() + 100f, targetBoundingBox.getBottom() + 100f, + targetBoundingBox.getRight() - 100f, targetBoundingBox.getTop() - 100f) + .setSpreadMethod(GradientSpreadMethod.NONE) + .addColorStop(new GradientColorStop(ColorConstants.RED.getColorValue(), 5d, OffsetType.RELATIVE)) + .addColorStop(new GradientColorStop(ColorConstants.BLUE.getColorValue(), 10d, OffsetType.RELATIVE)); + + Assert.assertNull(gradientBuilder.buildColor(targetBoundingBox, null)); + } + + @Test + public void buildWithTwoEqualOffsetsStopsAndNoneTest() throws IOException, InterruptedException { + Rectangle targetBoundingBox = new Rectangle(50f, 450f, 300f, 300f); + AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() + .setGradientVector(targetBoundingBox.getLeft() + 100f, targetBoundingBox.getBottom() + 100f, + targetBoundingBox.getRight() - 100f, targetBoundingBox.getTop() - 100f) + .setSpreadMethod(GradientSpreadMethod.NONE) + .addColorStop(new GradientColorStop(ColorConstants.RED.getColorValue(), 0.5d, OffsetType.RELATIVE)) + .addColorStop(new GradientColorStop(ColorConstants.BLUE.getColorValue(), 0.5d, OffsetType.RELATIVE)); + + Assert.assertNull(gradientBuilder.buildColor(targetBoundingBox, null)); + } + + @Test + public void buildWithTwoStopsInCenterAndNoneTest() throws IOException, InterruptedException { + Rectangle targetBoundingBox = new Rectangle(50f, 450f, 300f, 300f); + AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() + .setGradientVector(targetBoundingBox.getLeft() + 100f, targetBoundingBox.getBottom() + 100f, + targetBoundingBox.getRight() - 100f, targetBoundingBox.getTop() - 100f) + .setSpreadMethod(GradientSpreadMethod.NONE) + .addColorStop(new GradientColorStop(ColorConstants.RED.getColorValue(), 0.2d, OffsetType.RELATIVE)) + .addColorStop(new GradientColorStop(ColorConstants.BLUE.getColorValue(), 0.8d, OffsetType.RELATIVE)); + + generateAndComparePdfs("buildWithTwoEqualOffsetsStopsTest.pdf", targetBoundingBox, null, gradientBuilder); + } + + @Test + public void buildWithTwoStopsOutsideAndNoneTest() throws IOException, InterruptedException { + Rectangle targetBoundingBox = new Rectangle(50f, 450f, 300f, 300f); + AbstractLinearGradientBuilder gradientBuilder = new LinearGradientBuilder() + .setGradientVector(targetBoundingBox.getLeft() + 100f, targetBoundingBox.getBottom() + 100f, + targetBoundingBox.getRight() - 100f, targetBoundingBox.getTop() - 100f) + .setSpreadMethod(GradientSpreadMethod.NONE) + .addColorStop(new GradientColorStop(ColorConstants.RED.getColorValue(), -1.5d, OffsetType.RELATIVE)) + .addColorStop(new GradientColorStop(ColorConstants.BLUE.getColorValue(), 2.5d, OffsetType.RELATIVE)); + + generateAndComparePdfs("buildWithTwoStopsOutsideAndNoneTest.pdf", targetBoundingBox, null, gradientBuilder); + } + private void generateAndComparePdfs(String fileName, Rectangle toDraw, AffineTransform transform, AbstractLinearGradientBuilder gradientBuilder) throws InterruptedException, IOException { String outPdfPath = destinationFolder + fileName; diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDecreasingOffsetsTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDecreasingOffsetsTest.pdf index def6292e32..3e98ac8411 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDecreasingOffsetsTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDecreasingOffsetsTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndEndsOfCoordinatesAndPadTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndEndsOfCoordinatesAndPadTest.pdf index c9211cbc83..46bc3a8fd7 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndEndsOfCoordinatesAndPadTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndEndsOfCoordinatesAndPadTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndPadTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndPadTest.pdf index 5e19847bf1..55b7916734 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndPadTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithDoublingStopsAtEndsAndPadTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithNullArgumentsAndPadSpreadingTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithNullArgumentsAndPadSpreadingTest.pdf index e152c765c0..d8a20ab386 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithNullArgumentsAndPadSpreadingTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithNullArgumentsAndPadSpreadingTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithOneStopTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithOneStopTest.pdf index 4872194071..c6764bac53 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithOneStopTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithOneStopTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsOneHintTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsOneHintTest.pdf index 5bf5cddcd6..a732812163 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsOneHintTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsOneHintTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsZeroHintTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsZeroHintTest.pdf index 0fc3e802f7..2955cb6f8e 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsZeroHintTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithPadSpreadingAndRelativeBetweenColorsZeroHintTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoEqualOffsetsStopsTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoEqualOffsetsStopsTest.pdf new file mode 100644 index 0000000000..2c23f43846 Binary files /dev/null and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoEqualOffsetsStopsTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAfterTheEndTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAfterTheEndTest.pdf index 29a4bed9b8..8bdd5812fc 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAfterTheEndTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAfterTheEndTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheBeginningTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheBeginningTest.pdf index 41332d440c..fc25dfa84a 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheBeginningTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheBeginningTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheEndTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheEndTest.pdf index 0237ebbcbd..0b78054a5e 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheEndTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsAtTheEndTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsBeforeTheBeginningTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsBeforeTheBeginningTest.pdf index e32d96c13a..a12d920af0 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsBeforeTheBeginningTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsBeforeTheBeginningTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsInTheMiddleTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsInTheMiddleTest.pdf index 11dfad0d23..7fe4cb5d38 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsInTheMiddleTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsInTheMiddleTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsOutsideAndNoneTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsOutsideAndNoneTest.pdf new file mode 100644 index 0000000000..358a54089a Binary files /dev/null and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsOutsideAndNoneTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsTest.pdf index 0c08a41eaf..102f6f88c5 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithTwoStopsTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithZeroVectorTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithZeroVectorTest.pdf index d7a3e1d402..bdc865655c 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithZeroVectorTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithZeroVectorTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithoutCoordinatesTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithoutCoordinatesTest.pdf index 7098f8bdb0..1ec790d9c8 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithoutCoordinatesTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_buildWithoutCoordinatesTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_builderWithPadSpreadingTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_builderWithPadSpreadingTest.pdf index e3d00d598d..cdbd9c06dd 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_builderWithPadSpreadingTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_builderWithPadSpreadingTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_padCaseWithVeryCloseCornerStopsTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_padCaseWithVeryCloseCornerStopsTest.pdf index 0b5510e0e2..c27196d860 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_padCaseWithVeryCloseCornerStopsTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/LinearGradientBuilderTest/cmp_padCaseWithVeryCloseCornerStopsTest.pdf differ diff --git a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/StrategyBasedLinearGradientBuilderTest/cmp_builderWithToCornerAndInnerStopsAndPadSpreadingTest.pdf b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/StrategyBasedLinearGradientBuilderTest/cmp_builderWithToCornerAndInnerStopsAndPadSpreadingTest.pdf index 245b0f96c8..3535cace3b 100644 Binary files a/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/StrategyBasedLinearGradientBuilderTest/cmp_builderWithToCornerAndInnerStopsAndPadSpreadingTest.pdf and b/kernel/src/test/resources/com/itextpdf/kernel/colors/gradients/StrategyBasedLinearGradientBuilderTest/cmp_builderWithToCornerAndInnerStopsAndPadSpreadingTest.pdf differ diff --git a/layout/src/main/java/com/itextpdf/layout/renderer/AbstractRenderer.java b/layout/src/main/java/com/itextpdf/layout/renderer/AbstractRenderer.java index 955c448d90..350841599b 100644 --- a/layout/src/main/java/com/itextpdf/layout/renderer/AbstractRenderer.java +++ b/layout/src/main/java/com/itextpdf/layout/renderer/AbstractRenderer.java @@ -581,12 +581,15 @@ public PdfFormXObject createXObject(AbstractLinearGradientBuilder linearGradient return null; } Rectangle formBBox = new Rectangle(0, 0, xObjectArea.getWidth(), xObjectArea.getHeight()); - PdfFormXObject xObject = new PdfFormXObject(formBBox); + PdfFormXObject xObject = null; Color gradientColor = linearGradientBuilder.buildColor(formBBox, null); - new PdfCanvas(xObject, document) - .setColor(gradientColor, true) - .rectangle(formBBox) - .fill(); + if (gradientColor != null) { + xObject = new PdfFormXObject(formBBox); + new PdfCanvas(xObject, document) + .setColor(gradientColor, true) + .rectangle(formBBox) + .fill(); + } return xObject; } diff --git a/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtil.java b/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtil.java index 96b8a56495..09c17669cc 100644 --- a/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtil.java +++ b/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtil.java @@ -116,6 +116,10 @@ public static StrategyBasedLinearGradientBuilder parseCssLinearGradient(String c if (buff.length() != 0) { argumentsList.add(buff.toString().trim()); } + if (argumentsList.isEmpty()) { + throw new StyledXMLParserException(MessageFormatUtil.format( + StyledXMLParserException.INVALID_GRADIENT_FUNCTION_ARGUMENTS_LIST, cssGradientValue)); + } return parseCssLinearGradient(argumentsList, isRepeating, emValue, remValue); } } diff --git a/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/exceptions/StyledXMLParserException.java b/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/exceptions/StyledXMLParserException.java index 382d9a8434..614d4114ca 100644 --- a/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/exceptions/StyledXMLParserException.java +++ b/styled-xml-parser/src/main/java/com/itextpdf/styledxmlparser/exceptions/StyledXMLParserException.java @@ -47,6 +47,8 @@ This file is part of the iText (R) project. */ public class StyledXMLParserException extends RuntimeException { + /** The Constant INVALID_GRADIENT_VALUE. */ + public static final String INVALID_GRADIENT_FUNCTION_ARGUMENTS_LIST = "Invalid gradient function arguments list: {0}"; /** The Constant INVALID_GRADIENT_TO_SIDE_OR_CORNER_STRING. */ public static final String INVALID_GRADIENT_TO_SIDE_OR_CORNER_STRING = "Invalid direction string: {0}"; /** The Constant INVALID_GRADIENT_COLOR_STOP_VALUE. */ diff --git a/styled-xml-parser/src/test/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtilTest.java b/styled-xml-parser/src/test/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtilTest.java index d3bd1c60af..803b835922 100644 --- a/styled-xml-parser/src/test/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtilTest.java +++ b/styled-xml-parser/src/test/java/com/itextpdf/styledxmlparser/css/util/CssGradientUtilTest.java @@ -160,6 +160,28 @@ public void repeatingLinearGradientWithRgbFunctionsTest() { assertStrategyBasedBuilderEquals(gradientBuilder, false, 0d, GradientStrategy.TO_BOTTOM, GradientSpreadMethod.REPEAT, colorStops); } + @Test + public void emptyParsedArguments1Test() { + junitExpectedException.expect(StyledXMLParserException.class); + junitExpectedException.expectMessage(MessageFormatUtil.format(StyledXMLParserException.INVALID_GRADIENT_FUNCTION_ARGUMENTS_LIST, "linear-gradient()")); + + String gradientValue = "linear-gradient()"; + + Assert.assertTrue(CssGradientUtil.isCssLinearGradientValue(gradientValue)); + CssGradientUtil.parseCssLinearGradient(gradientValue, 24, 12); + } + + @Test + public void emptyParsedArguments2Test() { + junitExpectedException.expect(StyledXMLParserException.class); + junitExpectedException.expectMessage(MessageFormatUtil.format(StyledXMLParserException.INVALID_GRADIENT_FUNCTION_ARGUMENTS_LIST, "linear-gradient( , )")); + + String gradientValue = "linear-gradient( , )"; + + Assert.assertTrue(CssGradientUtil.isCssLinearGradientValue(gradientValue)); + CssGradientUtil.parseCssLinearGradient(gradientValue, 24, 12); + } + @Test public void invalidFirstArgumentTest() { junitExpectedException.expect(StyledXMLParserException.class); diff --git a/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromFileTest.pdf b/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromFileTest.pdf index d1fa03c456..9f202d782f 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromFileTest.pdf and b/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromFileTest.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromStringTest.pdf b/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromStringTest.pdf index f02a3ad675..862123fc9d 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromStringTest.pdf and b/svg/src/test/resources/com/itextpdf/svg/JFreeSvgTest/cmp_usingJFreeSvgBarChartFromStringTest.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/googlecharts/GeoChartsTest/cmp_geoMarkerChart.pdf b/svg/src/test/resources/com/itextpdf/svg/googlecharts/GeoChartsTest/cmp_geoMarkerChart.pdf index b70cf3b797..215c595f6e 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/googlecharts/GeoChartsTest/cmp_geoMarkerChart.pdf and b/svg/src/test/resources/com/itextpdf/svg/googlecharts/GeoChartsTest/cmp_geoMarkerChart.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemaps2Chart.pdf b/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemaps2Chart.pdf index c060d20fd4..24672b2a9f 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemaps2Chart.pdf and b/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemaps2Chart.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemapsChart.pdf b/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemapsChart.pdf index 0ec2284900..43fca1d52f 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemapsChart.pdf and b/svg/src/test/resources/com/itextpdf/svg/googlecharts/TreemapsChartsTest/cmp_treemapsChart.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees2Chart.pdf b/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees2Chart.pdf index 876c2a464a..2ec3f4115e 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees2Chart.pdf and b/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees2Chart.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees3Chart.pdf b/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees3Chart.pdf index 5440933f6d..e25d836981 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees3Chart.pdf and b/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees3Chart.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees4Chart.pdf b/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees4Chart.pdf index 8cd880ed5b..81a86a87cf 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees4Chart.pdf and b/svg/src/test/resources/com/itextpdf/svg/googlecharts/WordTreesChartsTest/cmp_wordTrees4Chart.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/FillTest/cmp_invalidUrlFillTest.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/FillTest/cmp_invalidUrlFillTest.pdf index e1ecfb3982..51ed89285b 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/FillTest/cmp_invalidUrlFillTest.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/FillTest/cmp_invalidUrlFillTest.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_circle.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_circle.pdf index 1812529148..95f3764408 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_circle.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_circle.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_ellipse.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_ellipse.pdf index 9e1d9a0cf1..e74510d7f9 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_ellipse.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_ellipse.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_line.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_line.pdf index 7571b07468..0b130f945c 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_line.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_line.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentAbsoluteUnitsInGradient.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentAbsoluteUnitsInGradient.pdf index d05495da44..37954f1dc2 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentAbsoluteUnitsInGradient.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentAbsoluteUnitsInGradient.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentRelativeUnitsInGradient.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentRelativeUnitsInGradient.pdf index 1a8143e001..87fe1547a2 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentRelativeUnitsInGradient.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxDifferentRelativeUnitsInGradient.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithAbsoluteCoordinates.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithAbsoluteCoordinates.pdf index aa11886569..8cfec934fa 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithAbsoluteCoordinates.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithAbsoluteCoordinates.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithChUnit.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithChUnit.pdf index 25bdec99d1..0e48905e78 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithChUnit.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithChUnit.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToFont.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToFont.pdf index e96d38fe59..cc0cb4233e 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToFont.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToFont.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToViewport.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToViewport.pdf index a66f4f9b3a..762d9d22a9 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToViewport.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_objectBoundingBoxWithUnitsRelativeToViewport.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polygon.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polygon.pdf index 20366141ed..196bc9d98a 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polygon.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polygon.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polyline.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polyline.pdf index 398d863ed8..72cd19c1f3 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polyline.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_polyline.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rect.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rect.pdf index d07cc97462..a002ef9ac9 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rect.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rect.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectInvalidCoordinatesMetrics.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectInvalidCoordinatesMetrics.pdf index f77cbf36ed..77c1e3f881 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectInvalidCoordinatesMetrics.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectInvalidCoordinatesMetrics.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthPad.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthPad.pdf index ebd9372568..985d4153f3 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthPad.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthPad.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthReflect.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthReflect.pdf index 296f275d21..f3c906f819 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthReflect.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthReflect.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthRepeat.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthRepeat.pdf index 4077cdedaf..b06b8e3d8e 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthRepeat.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithDiffOffsetAndZeroCoordLengthRepeat.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthPad.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthPad.pdf index c420397ecd..5571c526be 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthPad.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthPad.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthReflect.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthReflect.pdf index fec8f3715c..324c869d00 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthReflect.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthReflect.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthRepeat.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthRepeat.pdf index 9fc1e7fe56..b78a787ff9 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthRepeat.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetAndZeroCoordLengthRepeat.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetPad.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetPad.pdf index d04e5293cd..c143b0023c 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetPad.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectMultipleStopsWithSameOffsetPad.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle0Stop.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle0Stop.pdf index a4719f5a41..ff48404545 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle0Stop.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle0Stop.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle1Stop.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle1Stop.pdf index a23da775eb..b1b4d15c20 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle1Stop.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectSingle1Stop.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectStopWithoutColor.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectStopWithoutColor.pdf index e2d141f848..35d9f6f456 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectStopWithoutColor.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectStopWithoutColor.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectTransformed.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectTransformed.pdf index 3a0ea3b8d6..a79ac83c32 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectTransformed.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectTransformed.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithGradientTransform.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithGradientTransform.pdf index 454ba47e56..5536b1bd52 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithGradientTransform.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithGradientTransform.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithInvalidSpreadMethodValue.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithInvalidSpreadMethodValue.pdf index 6f4a43f68a..3535318aa0 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithInvalidSpreadMethodValue.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectWithInvalidSpreadMethodValue.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectsWithFallBackColors.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectsWithFallBackColors.pdf index a68ab366bb..2d791ab951 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectsWithFallBackColors.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_rectsWithFallBackColors.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffAbsoluteUnitsInGradient.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffAbsoluteUnitsInGradient.pdf index be9f33eb49..33a9ad9f22 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffAbsoluteUnitsInGradient.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffAbsoluteUnitsInGradient.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffRelativeUnitsInGradient.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffRelativeUnitsInGradient.pdf index 8a9a89396e..53ee5f119b 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffRelativeUnitsInGradient.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseDiffRelativeUnitsInGradient.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithAbsoluteCoordinates.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithAbsoluteCoordinates.pdf index 25729e262f..a7ccafe971 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithAbsoluteCoordinates.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithAbsoluteCoordinates.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithChUnit.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithChUnit.pdf index 52c100c514..a351ab6267 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithChUnit.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithChUnit.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToFont.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToFont.pdf index ae092379b7..bc181394bb 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToFont.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToFont.pdf differ diff --git a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToViewport.pdf b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToViewport.pdf index e1a61ca9f4..39ac735cef 100644 Binary files a/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToViewport.pdf and b/svg/src/test/resources/com/itextpdf/svg/renderers/impl/LinearGradientSvgNodeRendererTest/cmp_userSpaceOnUseWithUnitsRelativeToViewport.pdf differ