Author: jahewson Date: Tue Jul 14 21:54:14 2015 New Revision: 1691093 URL: http://svn.apache.org/r1691093 Log: PDFBOX-2881: Calculate the number of steps using the device bounds
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java?rev=1691093&r1=1691092&r2=1691093&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java Tue Jul 14 21:54:14 2015 @@ -17,9 +17,9 @@ package org.apache.pdfbox.pdmodel.graphics.shading; import java.awt.PaintContext; +import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; -import java.awt.geom.Point2D; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; @@ -50,7 +50,7 @@ public class AxialShadingContext extends private final double x1x0; private final double y1y0; private final float d1d0; - private double denom; + private final double denom; private final int factor; private final int[] colorTable; @@ -64,10 +64,11 @@ public class AxialShadingContext extends * @param colorModel the color model to be used * @param xform transformation for user to device space * @param matrix the pattern matrix concatenated with that of the parent content stream - * @throws java.io.IOException if there is an error getting the color space or doing color conversion. + * @param deviceBounds the bounds of the area to paint, in device units + * @throws IOException if there is an error getting the color space or doing color conversion. */ public AxialShadingContext(PDShadingType2 shading, ColorModel colorModel, AffineTransform xform, - Matrix matrix) throws IOException + Matrix matrix, Rectangle deviceBounds) throws IOException { super(shading, colorModel, xform, matrix); this.axialShadingType = shading; @@ -101,7 +102,6 @@ public class AxialShadingContext extends y1y0 = coords[3] - coords[1]; d1d0 = domain[1] - domain[0]; denom = Math.pow(x1x0, 2) + Math.pow(y1y0, 2); - double longestDistance = Math.sqrt(denom); try { @@ -115,12 +115,11 @@ public class AxialShadingContext extends LOG.error(ex, ex); } - // transform the distance to actual pixel space - // use transform, because xform.getScaleX() does not return correct scaling on 90° rotated matrix - Point2D point = new Point2D.Double(longestDistance, longestDistance); - matrix.transform(point); - xform.transform(point, point); - factor = (int) Math.max(Math.abs(point.getX()), Math.abs(point.getY())); + // get the number of steps + factor = (int) Math.max(Math.abs(deviceBounds.getWidth()), + Math.abs(deviceBounds.getHeight())); + + // build the color table for the given number of steps colorTable = calcColorTable(); } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java?rev=1691093&r1=1691092&r2=1691093&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java Tue Jul 14 21:54:14 2015 @@ -64,7 +64,7 @@ public class AxialShadingPaint implement { try { - return new AxialShadingContext(shading, cm, xform, matrix); + return new AxialShadingContext(shading, cm, xform, matrix, deviceBounds); } catch (IOException e) { Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java?rev=1691093&r1=1691092&r2=1691093&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java Tue Jul 14 21:54:14 2015 @@ -17,9 +17,9 @@ package org.apache.pdfbox.pdmodel.graphics.shading; import java.awt.PaintContext; +import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; -import java.awt.geom.Point2D; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; @@ -50,8 +50,6 @@ public class RadialShadingContext extend private final double x1x0; private final double y1y0; private final double r1r0; - private final double x1x0pow2; - private final double y1y0pow2; private final double r0pow2; private final float d1d0; private final double denom; @@ -68,10 +66,11 @@ public class RadialShadingContext extend * @param colorModel the color model to be used * @param xform transformation for user to device space * @param matrix the pattern matrix concatenated with that of the parent content stream - * @throws java.io.IOException if there is an error getting the color space or doing color conversion. + * @param deviceBounds the bounds of the area to paint, in device units + * @throws IOException if there is an error getting the color space or doing color conversion. */ public RadialShadingContext(PDShadingType3 shading, ColorModel colorModel, - AffineTransform xform, Matrix matrix) + AffineTransform xform, Matrix matrix, Rectangle deviceBounds) throws IOException { super(shading, colorModel, xform, matrix); @@ -106,12 +105,9 @@ public class RadialShadingContext extend x1x0 = coords[3] - coords[0]; y1y0 = coords[4] - coords[1]; r1r0 = coords[5] - coords[2]; - x1x0pow2 = Math.pow(x1x0, 2); - y1y0pow2 = Math.pow(y1y0, 2); r0pow2 = Math.pow(coords[2], 2); - denom = x1x0pow2 + y1y0pow2 - Math.pow(r1r0, 2); + denom = Math.pow(x1x0, 2) + Math.pow(y1y0, 2) - Math.pow(r1r0, 2); d1d0 = domain[1] - domain[0]; - double longestDistance = getLongestDistance(); try { @@ -125,38 +121,12 @@ public class RadialShadingContext extend LOG.error(ex, ex); } - // transform the distance to actual pixel space - // use transform, because xform.getScaleX() does not return correct scaling on 90° rotated matrix - Point2D point = new Point2D.Double(longestDistance, longestDistance); - matrix.transform(point); - xform.transform(point, point); - factor = (int) Math.max(Math.abs(point.getX()), Math.abs(point.getY())); - colorTable = calcColorTable(); - } + // get the number of steps + factor = (int) Math.max(Math.abs(deviceBounds.getWidth()), + Math.abs(deviceBounds.getHeight())); - // get the longest distance of two points which are located on these two circles - private double getLongestDistance() - { - double centerToCenter = Math.sqrt(x1x0pow2 + y1y0pow2); - double rmin, rmax; - if (coords[2] < coords[5]) - { - rmin = coords[2]; - rmax = coords[5]; - } - else - { - rmin = coords[5]; - rmax = coords[2]; - } - if (centerToCenter + rmin <= rmax) - { - return 2 * rmax; - } - else - { - return rmin + centerToCenter + coords[5]; - } + // build the color table for the given number of steps + colorTable = calcColorTable(); } /** Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java?rev=1691093&r1=1691092&r2=1691093&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java Tue Jul 14 21:54:14 2015 @@ -65,7 +65,7 @@ public class RadialShadingPaint implemen { try { - return new RadialShadingContext(shading, cm, xform, matrix); + return new RadialShadingContext(shading, cm, xform, matrix, deviceBounds); } catch (IOException e) {