Author: tilman Date: Tue May 5 16:15:18 2015 New Revision: 1677851 URL: http://svn.apache.org/r1677851 Log: PDFBOX-2576: refactor, make some more fields private, use accessors, remove unused constructor param, organize imports
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/GouraudShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType2.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType3.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType6.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType7.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDTriangleBasedShadingType.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.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 pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.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=1677851&r1=1677850&r2=1677851&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 May 5 16:15:18 2015 @@ -1,303 +1,298 @@ -/* - * 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.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; -import java.io.IOException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.cos.COSArray; -import org.apache.pdfbox.cos.COSBoolean; -import org.apache.pdfbox.pdmodel.common.function.PDFunction; -import org.apache.pdfbox.util.Matrix; - -/** - * AWT PaintContext for axial shading. - * - * Performance improvement done as part of GSoC2014, Tilman Hausherr is the mentor. - * - * @author Shaola Ren - */ -public class AxialShadingContext extends ShadingContext implements PaintContext -{ - private static final Log LOG = LogFactory.getLog(AxialShadingContext.class); - - private PDShadingType2 axialShadingType; - - private final float[] coords; - private final float[] domain; - private final boolean[] extend; - private final double x1x0; - private final double y1y0; - private final float d1d0; - private double denom; - - private final int factor; - private final int[] colorTable; - - private AffineTransform rat; - - /** - * Constructor creates an instance to be used for fill operations. - * - * @param shading the shading type to be used - * @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 - * @param deviceBounds device bounds - * @throws java.io.IOException if there is an error getting the color space or doing color conversion. - */ - public AxialShadingContext(PDShadingType2 shading, ColorModel colorModel, AffineTransform xform, - Matrix matrix, Rectangle deviceBounds) throws IOException - { - super(shading, colorModel, xform, matrix); - this.axialShadingType = shading; - coords = shading.getCoords().toFloatArray(); - - // domain values - if (shading.getDomain() != null) - { - domain = shading.getDomain().toFloatArray(); - } - else - { - // set default values - domain = new float[] { 0, 1 }; - } - // extend values - COSArray extendValues = shading.getExtend(); - if (shading.getExtend() != null) - { - extend = new boolean[2]; - extend[0] = ((COSBoolean) extendValues.get(0)).getValue(); - extend[1] = ((COSBoolean) extendValues.get(1)).getValue(); - } - else - { - // set default values - extend = new boolean[] { false, false }; - } - // calculate some constants to be used in getRaster - x1x0 = coords[2] - coords[0]; - 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 - { - // get inverse transform to be independent of current user / device space - // when handling actual pixels in getRaster() - rat = matrix.createAffineTransform().createInverse(); - rat.concatenate(xform.createInverse()); - } - catch (NoninvertibleTransformException ex) - { - 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(); - } - - /** - * Calculate the color on the axial line and store them in an array. - * - * @return an array, index denotes the relative position, the corresponding - * value is the color on the axial line - * @throws IOException if the color conversion fails. - */ - private int[] calcColorTable() throws IOException - { - int[] map = new int[factor + 1]; - if (factor == 0 || d1d0 == 0) - { - float[] values = axialShadingType.evalFunction(domain[0]); - map[0] = convertToRGB(values); - } - else - { - for (int i = 0; i <= factor; i++) - { - float t = domain[0] + d1d0 * i / factor; - float[] values = axialShadingType.evalFunction(t); - map[i] = convertToRGB(values); - } - } - return map; - } - - @Override - public void dispose() - { - outputColorModel = null; - shadingColorSpace = null; - axialShadingType = null; - } - - @Override - public ColorModel getColorModel() - { - return outputColorModel; - } - - @Override - public Raster getRaster(int x, int y, int w, int h) - { - // create writable raster - WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h); - boolean useBackground; - int[] data = new int[w * h * 4]; - for (int j = 0; j < h; j++) - { - double currentY = y + j; - if (bboxRect != null && (currentY < minBBoxY || currentY > maxBBoxY)) - { - continue; - } - for (int i = 0; i < w; i++) - { - double currentX = x + i; - if (bboxRect != null && (currentX < minBBoxX || currentX > maxBBoxX)) - { - continue; - } - useBackground = false; - float[] values = new float[] { x + i, y + j }; - rat.transform(values, 0, values, 0, 1); - currentX = values[0]; - currentY = values[1]; - double inputValue = x1x0 * (currentX - coords[0]); - inputValue += y1y0 * (currentY - coords[1]); - // TODO this happens if start == end, see PDFBOX-1442 - if (denom == 0) - { - if (background == null) - { - continue; - } - useBackground = true; - } - else - { - inputValue /= denom; - } - // input value is out of range - if (inputValue < 0) - { - // the shading has to be extended if extend[0] == true - if (extend[0]) - { - inputValue = 0; - } - else - { - if (background == null) - { - continue; - } - useBackground = true; - } - } - // input value is out of range - else if (inputValue > 1) - { - // the shading has to be extended if extend[1] == true - if (extend[1]) - { - inputValue = 1; - } - else - { - if (background == null) - { - continue; - } - useBackground = true; - } - } - int value; - if (useBackground) - { - // use the given backgound color values - value = rgbBackground; - } - else - { - int key = (int) (inputValue * factor); - value = colorTable[key]; - } - int index = (j * w + i) * 4; - data[index] = value & 255; - value >>= 8; - data[index + 1] = value & 255; - value >>= 8; - data[index + 2] = value & 255; - data[index + 3] = 255; - } - } - raster.setPixels(0, 0, w, h, data); - return raster; - } - - /** - * Returns the coords values. - */ - public float[] getCoords() - { - return coords; - } - - /** - * Returns the domain values. - */ - public float[] getDomain() - { - return domain; - } - - /** - * Returns the extend values. - */ - public boolean[] getExtend() - { - return extend; - } - - /** - * Returns the function. - * - * @throws java.io.IOException if we were not able to create the function. - */ - public PDFunction getFunction() throws IOException - { - return axialShadingType.getFunction(); - } -} +/* + * 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.pdfbox.pdmodel.graphics.shading; + +import java.awt.PaintContext; +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; +import java.io.IOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.pdfbox.cos.COSArray; +import org.apache.pdfbox.cos.COSBoolean; +import org.apache.pdfbox.pdmodel.common.function.PDFunction; +import org.apache.pdfbox.util.Matrix; + +/** + * AWT PaintContext for axial shading. + * + * Performance improvement done as part of GSoC2014, Tilman Hausherr is the mentor. + * + * @author Shaola Ren + */ +public class AxialShadingContext extends ShadingContext implements PaintContext +{ + private static final Log LOG = LogFactory.getLog(AxialShadingContext.class); + + private PDShadingType2 axialShadingType; + + private final float[] coords; + private final float[] domain; + private final boolean[] extend; + private final double x1x0; + private final double y1y0; + private final float d1d0; + private double denom; + + private final int factor; + private final int[] colorTable; + + private AffineTransform rat; + + /** + * Constructor creates an instance to be used for fill operations. + * + * @param shading the shading type to be used + * @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. + */ + public AxialShadingContext(PDShadingType2 shading, ColorModel colorModel, AffineTransform xform, + Matrix matrix) throws IOException + { + super(shading, colorModel, xform, matrix); + this.axialShadingType = shading; + coords = shading.getCoords().toFloatArray(); + + // domain values + if (shading.getDomain() != null) + { + domain = shading.getDomain().toFloatArray(); + } + else + { + // set default values + domain = new float[] { 0, 1 }; + } + // extend values + COSArray extendValues = shading.getExtend(); + if (shading.getExtend() != null) + { + extend = new boolean[2]; + extend[0] = ((COSBoolean) extendValues.get(0)).getValue(); + extend[1] = ((COSBoolean) extendValues.get(1)).getValue(); + } + else + { + // set default values + extend = new boolean[] { false, false }; + } + // calculate some constants to be used in getRaster + x1x0 = coords[2] - coords[0]; + 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 + { + // get inverse transform to be independent of current user / device space + // when handling actual pixels in getRaster() + rat = matrix.createAffineTransform().createInverse(); + rat.concatenate(xform.createInverse()); + } + catch (NoninvertibleTransformException ex) + { + 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(); + } + + /** + * Calculate the color on the axial line and store them in an array. + * + * @return an array, index denotes the relative position, the corresponding + * value is the color on the axial line + * @throws IOException if the color conversion fails. + */ + private int[] calcColorTable() throws IOException + { + int[] map = new int[factor + 1]; + if (factor == 0 || d1d0 == 0) + { + float[] values = axialShadingType.evalFunction(domain[0]); + map[0] = convertToRGB(values); + } + else + { + for (int i = 0; i <= factor; i++) + { + float t = domain[0] + d1d0 * i / factor; + float[] values = axialShadingType.evalFunction(t); + map[i] = convertToRGB(values); + } + } + return map; + } + + @Override + public void dispose() + { + super.dispose(); + axialShadingType = null; + } + + @Override + public ColorModel getColorModel() + { + return super.getColorModel(); + } + + @Override + public Raster getRaster(int x, int y, int w, int h) + { + // create writable raster + WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h); + boolean useBackground; + int[] data = new int[w * h * 4]; + for (int j = 0; j < h; j++) + { + double currentY = y + j; + if (bboxRect != null && (currentY < minBBoxY || currentY > maxBBoxY)) + { + continue; + } + for (int i = 0; i < w; i++) + { + double currentX = x + i; + if (bboxRect != null && (currentX < minBBoxX || currentX > maxBBoxX)) + { + continue; + } + useBackground = false; + float[] values = new float[] { x + i, y + j }; + rat.transform(values, 0, values, 0, 1); + currentX = values[0]; + currentY = values[1]; + double inputValue = x1x0 * (currentX - coords[0]) + y1y0 * (currentY - coords[1]); + // TODO this happens if start == end, see PDFBOX-1442 + if (denom == 0) + { + if (getBackground() == null) + { + continue; + } + useBackground = true; + } + else + { + inputValue /= denom; + } + // input value is out of range + if (inputValue < 0) + { + // the shading has to be extended if extend[0] == true + if (extend[0]) + { + inputValue = 0; + } + else + { + if (getBackground() == null) + { + continue; + } + useBackground = true; + } + } + // input value is out of range + else if (inputValue > 1) + { + // the shading has to be extended if extend[1] == true + if (extend[1]) + { + inputValue = 1; + } + else + { + if (getBackground() == null) + { + continue; + } + useBackground = true; + } + } + int value; + if (useBackground) + { + // use the given backgound color values + value = getRgbBackground(); + } + else + { + int key = (int) (inputValue * factor); + value = colorTable[key]; + } + int index = (j * w + i) * 4; + data[index] = value & 255; + value >>= 8; + data[index + 1] = value & 255; + value >>= 8; + data[index + 2] = value & 255; + data[index + 3] = 255; + } + } + raster.setPixels(0, 0, w, h, data); + return raster; + } + + /** + * Returns the coords values. + */ + public float[] getCoords() + { + return coords; + } + + /** + * Returns the domain values. + */ + public float[] getDomain() + { + return domain; + } + + /** + * Returns the extend values. + */ + public boolean[] getExtend() + { + return extend; + } + + /** + * Returns the function. + * + * @throws java.io.IOException if we were not able to create the function. + */ + public PDFunction getFunction() throws IOException + { + return axialShadingType.getFunction(); + } +} 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=1677851&r1=1677850&r2=1677851&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 May 5 16:15:18 2015 @@ -1,76 +1,75 @@ -/* - * 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.pdfbox.pdmodel.graphics.shading; - -import java.awt.Color; -import java.awt.Paint; -import java.awt.PaintContext; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.awt.image.ColorModel; -import java.io.IOException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.util.Matrix; - -/** - * AWT Paint for axial shading. - * - */ -public class AxialShadingPaint implements Paint -{ - private static final Log LOG = LogFactory.getLog(AxialShadingPaint.class); - - private final PDShadingType2 shading; - private final Matrix matrix; - - /** - * Constructor. - * - * @param shadingType2 the shading resources - * @param matrix the pattern matrix concatenated with that of the parent content stream - */ - AxialShadingPaint(PDShadingType2 shadingType2, Matrix matrix) - { - shading = shadingType2; - this.matrix = matrix; - } - - @Override - public int getTransparency() - { - return 0; - } - - @Override - public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, - AffineTransform xform, RenderingHints hints) - { - try - { - return new AxialShadingContext(shading, cm, xform, matrix, deviceBounds); - } - catch (IOException e) - { - LOG.error("An error occurred while painting", e); - return new Color(0, 0, 0, 0).createContext(cm, deviceBounds, userBounds, xform, hints); - } - } -} +/* + * 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.pdfbox.pdmodel.graphics.shading; + +import java.awt.Color; +import java.awt.Paint; +import java.awt.PaintContext; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.ColorModel; +import java.io.IOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.pdfbox.util.Matrix; + +/** + * AWT Paint for axial shading. + * + */ +public class AxialShadingPaint implements Paint +{ + private static final Log LOG = LogFactory.getLog(AxialShadingPaint.class); + + private final PDShadingType2 shading; + private final Matrix matrix; + + /** + * Constructor. + * + * @param shadingType2 the shading resources + * @param matrix the pattern matrix concatenated with that of the parent content stream + */ + AxialShadingPaint(PDShadingType2 shadingType2, Matrix matrix) + { + shading = shadingType2; + this.matrix = matrix; + } + + @Override + public int getTransparency() + { + return 0; + } + + @Override + public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, + AffineTransform xform, RenderingHints hints) + { + try + { + return new AxialShadingContext(shading, cm, xform, matrix); + } + catch (IOException e) + { + LOG.error("An error occurred while painting", e); + return new Color(0, 0, 0, 0).createContext(cm, deviceBounds, userBounds, xform, hints); + } + } +} Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java Tue May 5 16:15:18 2015 @@ -45,7 +45,7 @@ abstract class GouraudShadingContext ext /** * triangle list. */ - protected List<ShadedTriangle> triangleList; + private List<ShadedTriangle> triangleList = new ArrayList<ShadedTriangle>(); /** * Constructor creates an instance to be used for fill operations. @@ -60,7 +60,6 @@ abstract class GouraudShadingContext ext Matrix matrix) throws IOException { super(shading, colorModel, xform, matrix); - triangleList = new ArrayList<ShadedTriangle>(); } /** @@ -100,6 +99,11 @@ abstract class GouraudShadingContext ext return new Vertex(p, colorComponentTab); } + void setTriangleList(List<ShadedTriangle> triangleList) + { + this.triangleList = triangleList; + } + @Override protected Map<Point, Integer> calcPixelTable(Rectangle deviceBounds) throws IOException { Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java Tue May 5 16:15:18 2015 @@ -18,7 +18,6 @@ package org.apache.pdfbox.pdmodel.graphi import java.awt.Paint; import java.io.IOException; - import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType2.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType2.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType2.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType2.java Tue May 5 16:15:18 2015 @@ -16,13 +16,13 @@ */ package org.apache.pdfbox.pdmodel.graphics.shading; +import java.awt.Paint; + import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.util.Matrix; -import java.awt.Paint; - /** * Resources for an axial shading. */ Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType3.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType3.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType3.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType3.java Tue May 5 16:15:18 2015 @@ -16,11 +16,11 @@ */ package org.apache.pdfbox.pdmodel.graphics.shading; +import java.awt.Paint; + import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.util.Matrix; -import java.awt.Paint; - /** * Resources for a radial shading. */ Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType4.java Tue May 5 16:15:18 2015 @@ -1,72 +1,72 @@ -/* - * 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.pdfbox.pdmodel.graphics.shading; - -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.util.Matrix; - -import java.awt.Paint; - -/** - * Resources for a shading type 4 (Free-Form Gouraud-Shaded Triangle Mesh). - */ -public class PDShadingType4 extends PDTriangleBasedShadingType -{ - /** - * Constructor using the given shading dictionary. - * - * @param shadingDictionary the dictionary for this shading - */ - public PDShadingType4(COSDictionary shadingDictionary) - { - super(shadingDictionary); - } - - @Override - public int getShadingType() - { - return PDShading.SHADING_TYPE4; - } - - /** - * The bits per flag of this shading. This will return -1 if one has not - * been set. - * - * @return The number of bits per flag. - */ - public int getBitsPerFlag() - { - return getCOSObject().getInt(COSName.BITS_PER_FLAG, -1); - } - - /** - * Set the number of bits per flag. - * - * @param bitsPerFlag the number of bits per flag - */ - public void setBitsPerFlag(int bitsPerFlag) - { - getCOSObject().setInt(COSName.BITS_PER_FLAG, bitsPerFlag); - } - - @Override - public Paint toPaint(Matrix matrix) - { - return new Type4ShadingPaint(this, matrix); - } -} +/* + * 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.pdfbox.pdmodel.graphics.shading; + +import java.awt.Paint; + +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.util.Matrix; + +/** + * Resources for a shading type 4 (Free-Form Gouraud-Shaded Triangle Mesh). + */ +public class PDShadingType4 extends PDTriangleBasedShadingType +{ + /** + * Constructor using the given shading dictionary. + * + * @param shadingDictionary the dictionary for this shading + */ + public PDShadingType4(COSDictionary shadingDictionary) + { + super(shadingDictionary); + } + + @Override + public int getShadingType() + { + return PDShading.SHADING_TYPE4; + } + + /** + * The bits per flag of this shading. This will return -1 if one has not + * been set. + * + * @return The number of bits per flag. + */ + public int getBitsPerFlag() + { + return getCOSObject().getInt(COSName.BITS_PER_FLAG, -1); + } + + /** + * Set the number of bits per flag. + * + * @param bitsPerFlag the number of bits per flag + */ + public void setBitsPerFlag(int bitsPerFlag) + { + getCOSObject().setInt(COSName.BITS_PER_FLAG, bitsPerFlag); + } + + @Override + public Paint toPaint(Matrix matrix) + { + return new Type4ShadingPaint(this, matrix); + } +} Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType5.java Tue May 5 16:15:18 2015 @@ -16,12 +16,12 @@ */ package org.apache.pdfbox.pdmodel.graphics.shading; +import java.awt.Paint; + import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.util.Matrix; -import java.awt.Paint; - /** * Resources for a shading type 5 (Lattice-Form Gouraud-Shade Triangle Mesh). */ Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType6.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType6.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType6.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType6.java Tue May 5 16:15:18 2015 @@ -1,50 +1,50 @@ -/* - * 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.pdfbox.pdmodel.graphics.shading; - -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.util.Matrix; - -import java.awt.Paint; - -/** - * Resources for a shading type 6 (Coons Patch Mesh). - */ -public class PDShadingType6 extends PDShadingType4 -{ - /** - * Constructor using the given shading dictionary. - * - * @param shadingDictionary the dictionary for this shading - */ - public PDShadingType6(COSDictionary shadingDictionary) - { - super(shadingDictionary); - } - - @Override - public int getShadingType() - { - return PDShading.SHADING_TYPE6; - } - - @Override - public Paint toPaint(Matrix matrix) - { - return new Type6ShadingPaint(this, matrix); - } -} +/* + * 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.pdfbox.pdmodel.graphics.shading; + +import java.awt.Paint; + +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.util.Matrix; + +/** + * Resources for a shading type 6 (Coons Patch Mesh). + */ +public class PDShadingType6 extends PDShadingType4 +{ + /** + * Constructor using the given shading dictionary. + * + * @param shadingDictionary the dictionary for this shading + */ + public PDShadingType6(COSDictionary shadingDictionary) + { + super(shadingDictionary); + } + + @Override + public int getShadingType() + { + return PDShading.SHADING_TYPE6; + } + + @Override + public Paint toPaint(Matrix matrix) + { + return new Type6ShadingPaint(this, matrix); + } +} Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType7.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType7.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType7.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingType7.java Tue May 5 16:15:18 2015 @@ -1,50 +1,50 @@ -/* - * 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.pdfbox.pdmodel.graphics.shading; - -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.util.Matrix; - -import java.awt.Paint; - -/** - * Resources for a shading type 7 (Tensor-Product Patch Mesh). - */ -public class PDShadingType7 extends PDShadingType6 -{ - /** - * Constructor using the given shading dictionary. - * - * @param shadingDictionary the dictionary for this shading - */ - public PDShadingType7(COSDictionary shadingDictionary) - { - super(shadingDictionary); - } - - @Override - public int getShadingType() - { - return PDShading.SHADING_TYPE7; - } - - @Override - public Paint toPaint(Matrix matrix) - { - return new Type7ShadingPaint(this, matrix); - } -} +/* + * 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.pdfbox.pdmodel.graphics.shading; + +import java.awt.Paint; + +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.util.Matrix; + +/** + * Resources for a shading type 7 (Tensor-Product Patch Mesh). + */ +public class PDShadingType7 extends PDShadingType6 +{ + /** + * Constructor using the given shading dictionary. + * + * @param shadingDictionary the dictionary for this shading + */ + public PDShadingType7(COSDictionary shadingDictionary) + { + super(shadingDictionary); + } + + @Override + public int getShadingType() + { + return PDShading.SHADING_TYPE7; + } + + @Override + public Paint toPaint(Matrix matrix) + { + return new Type7ShadingPaint(this, matrix); + } +} Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDTriangleBasedShadingType.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDTriangleBasedShadingType.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDTriangleBasedShadingType.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDTriangleBasedShadingType.java Tue May 5 16:15:18 2015 @@ -16,9 +16,9 @@ package org.apache.pdfbox.pdmodel.graphics.shading; import org.apache.pdfbox.cos.COSArray; +import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.common.PDRange; -import org.apache.pdfbox.cos.COSDictionary; /** * Common resources for shading types 4,5,6 and 7 Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java Tue May 5 16:15:18 2015 @@ -45,10 +45,11 @@ abstract class PatchMeshesShadingContext { private static final Log LOG = LogFactory.getLog(PatchMeshesShadingContext.class); - protected final PDShading patchMeshesShadingType; - protected List<Patch> patchList; // patch list - protected int bitsPerFlag; // bits per flag - + /** + * patch list + */ + private List<Patch> patchList = new ArrayList<Patch>(); + /** * Constructor creates an instance to be used for fill operations. * @@ -56,36 +57,42 @@ abstract class PatchMeshesShadingContext * @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 + * @param deviceBounds device bounds + * @param controlPoints number of control points, 12 for type 6 shading and 16 for type 7 shading * @throws IOException if something went wrong */ - protected PatchMeshesShadingContext(PDShading shading, ColorModel colorModel, - AffineTransform xform, Matrix matrix) - throws IOException + protected PatchMeshesShadingContext(PDShadingType6 shading, ColorModel colorModel, + AffineTransform xform, Matrix matrix, Rectangle deviceBounds, + int controlPoints) throws IOException { super(shading, colorModel, xform, matrix); - patchMeshesShadingType = shading; - bitsPerFlag = ((PDShadingType4) shading).getBitsPerFlag(); - patchList = new ArrayList<Patch>(); + patchList = collectPatches(shading, xform, matrix, controlPoints); + createPixelTable(deviceBounds); } /** * Create a patch list from a data stream, the returned list contains all the patches contained * in the data stream. * + * @param shadingType the shading type * @param xform transformation for user to device space * @param matrix the pattern matrix concatenated with that of the parent content stream - * @param dict dictionary object to give the image information - * @param rangeX range for coordinate x - * @param rangeY range for coordinate y - * @param colRange range for color - * @param numP number of control points, 12 for type 6 shading and 16 for type 7 shading + * @param controlPoints number of control points, 12 for type 6 shading and 16 for type 7 shading * @return the obtained patch list * @throws IOException when something went wrong */ - protected List<Patch> getPatchList(AffineTransform xform, Matrix matrix, COSDictionary dict, - PDRange rangeX, PDRange rangeY, PDRange[] colRange, int numP) - throws IOException + final List<Patch> collectPatches(PDShadingType6 shadingType, AffineTransform xform, + Matrix matrix, int controlPoints) throws IOException { + COSDictionary dict = shadingType.getCOSObject(); + int bitsPerFlag = shadingType.getBitsPerFlag(); + PDRange rangeX = shadingType.getDecodeForParameter(0); + PDRange rangeY = shadingType.getDecodeForParameter(1); + PDRange[] colRange = new PDRange[numberOfColorComponents]; + for (int i = 0; i < numberOfColorComponents; ++i) + { + colRange[i] = shadingType.getDecodeForParameter(2 + i); + } List<Patch> list = new ArrayList<Patch>(); long maxSrcCoord = (long) Math.pow(2, bitsPerCoordinate) - 1; long maxSrcColor = (long) Math.pow(2, bitsPerColorComponent) - 1; @@ -96,8 +103,7 @@ abstract class PatchMeshesShadingContext { Point2D[] implicitEdge = new Point2D[4]; float[][] implicitCornerColor = new float[2][numberOfColorComponents]; - - byte flag = (byte) 0; + byte flag = 0; try { @@ -114,7 +120,7 @@ abstract class PatchMeshesShadingContext { boolean isFree = (flag == 0); Patch current = readPatch(mciis, isFree, implicitEdge, implicitCornerColor, - maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, matrix, xform, numP); + maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, matrix, xform, controlPoints); if (current == null) { break; @@ -170,17 +176,17 @@ abstract class PatchMeshesShadingContext * @param colRange range for color * @param matrix the pattern matrix concatenated with that of the parent content stream * @param xform transformation for user to device space - * @param numP number of control points, 12 for type 6 shading and 16 for type 7 shading + * @param controlPoints number of control points, 12 for type 6 shading and 16 for type 7 shading * @return a single patch * @throws IOException when something went wrong */ protected Patch readPatch(ImageInputStream input, boolean isFree, Point2D[] implicitEdge, float[][] implicitCornerColor, long maxSrcCoord, long maxSrcColor, PDRange rangeX, PDRange rangeY, PDRange[] colRange, Matrix matrix, - AffineTransform xform, int numP) throws IOException + AffineTransform xform, int controlPoints) throws IOException { float[][] color = new float[4][numberOfColorComponents]; - Point2D[] points = new Point2D[numP]; + Point2D[] points = new Point2D[controlPoints]; int pStart = 4, cStart = 2; if (isFree) { @@ -203,7 +209,7 @@ abstract class PatchMeshesShadingContext try { - for (int i = pStart; i < numP; i++) + for (int i = pStart; i < controlPoints; i++) { long x = input.readBits(bitsPerCoordinate); long y = input.readBits(bitsPerCoordinate); 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=1677851&r1=1677850&r2=1677851&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 May 5 16:15:18 2015 @@ -17,7 +17,6 @@ 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; @@ -25,7 +24,6 @@ import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; import java.io.IOException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.cos.COSArray; @@ -70,11 +68,10 @@ 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 - * @param deviceBounds device bounds * @throws java.io.IOException if there is an error getting the color space or doing color conversion. */ public RadialShadingContext(PDShadingType3 shading, ColorModel colorModel, - AffineTransform xform, Matrix matrix, Rectangle deviceBounds) + AffineTransform xform, Matrix matrix) throws IOException { super(shading, colorModel, xform, matrix); @@ -191,15 +188,14 @@ public class RadialShadingContext extend @Override public void dispose() { - outputColorModel = null; + super.dispose(); radialShadingType = null; - shadingColorSpace = null; } @Override public ColorModel getColorModel() { - return outputColorModel; + return super.getColorModel(); } @Override @@ -234,7 +230,7 @@ public class RadialShadingContext extend float[] inputValues = calculateInputValues(currentX, currentY); if (Float.isNaN(inputValues[0]) && Float.isNaN(inputValues[1])) { - if (background == null) + if (getBackground() == null) { continue; } @@ -279,7 +275,7 @@ public class RadialShadingContext extend { inputValue = inputValues[1]; } - else if (background != null) + else if (getBackground() != null) { useBackground = true; } @@ -299,7 +295,7 @@ public class RadialShadingContext extend } else { - if (background == null) + if (getBackground() == null) { continue; } @@ -316,7 +312,7 @@ public class RadialShadingContext extend } else { - if (background == null) + if (getBackground() == null) { continue; } @@ -328,7 +324,7 @@ public class RadialShadingContext extend if (useBackground) { // use the given backgound color values - value = rgbBackground; + value = getRgbBackground(); } else { 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=1677851&r1=1677850&r2=1677851&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 May 5 16:15:18 2015 @@ -65,7 +65,7 @@ public class RadialShadingPaint implemen { try { - return new RadialShadingContext(shading, cm, xform, matrix, deviceBounds); + return new RadialShadingContext(shading, cm, xform, matrix); } catch (IOException e) { Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java Tue May 5 16:15:18 2015 @@ -15,7 +15,6 @@ */ package org.apache.pdfbox.pdmodel.graphics.shading; -import java.awt.Rectangle; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.geom.AffineTransform; @@ -40,13 +39,14 @@ public abstract class ShadingContext { private static final Log LOG = LogFactory.getLog(ShadingContext.class); - protected final PDShading shading; - protected PDColorSpace shadingColorSpace; protected PDRectangle bboxRect; protected float minBBoxX, minBBoxY, maxBBoxX, maxBBoxY; - protected ColorModel outputColorModel; - protected float[] background; - protected int rgbBackground; + + private float[] background; + private int rgbBackground; + final private PDShading shading; + private ColorModel outputColorModel; + private PDColorSpace shadingColorSpace; /** * Constructor. @@ -84,6 +84,26 @@ public abstract class ShadingContext } } + PDColorSpace getShadingColorSpace() + { + return shadingColorSpace; + } + + PDShading getShading() + { + return shading; + } + + float[] getBackground() + { + return background; + } + + int getRgbBackground() + { + return rgbBackground; + } + private void transformBBox(Matrix matrix, AffineTransform xform) { float[] bboxTab = new float[4]; @@ -115,7 +135,7 @@ public abstract class ShadingContext * @return RGB values encoded in an integer. * @throws java.io.IOException if the color conversion fails. */ - protected final int convertToRGB(float[] values) throws IOException + final int convertToRGB(float[] values) throws IOException { int normRGBValues; @@ -126,4 +146,16 @@ public abstract class ShadingContext return normRGBValues; } + + ColorModel getColorModel() + { + return outputColorModel; + } + + void dispose() + { + outputColorModel = null; + shadingColorSpace = null; + } + } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java Tue May 5 16:15:18 2015 @@ -67,7 +67,7 @@ abstract class TriangleBasedShadingConte LOG.debug("bitsPerCoordinate: " + (Math.pow(2, bitsPerCoordinate) - 1)); bitsPerColorComponent = triangleBasedShadingType.getBitsPerComponent(); LOG.debug("bitsPerColorComponent: " + bitsPerColorComponent); - numberOfColorComponents = hasFunction ? 1 : shadingColorSpace.getNumberOfComponents(); + numberOfColorComponents = hasFunction ? 1 : getShadingColorSpace().getNumberOfComponents(); LOG.debug("numberOfColorComponents: " + numberOfColorComponents); } @@ -133,7 +133,7 @@ abstract class TriangleBasedShadingConte { if (hasFunction) { - values = shading.evalFunction(values); + values = getShading().evalFunction(values); } return convertToRGB(values); } @@ -146,14 +146,13 @@ abstract class TriangleBasedShadingConte @Override public final ColorModel getColorModel() { - return outputColorModel; + return super.getColorModel(); } @Override public void dispose() { - outputColorModel = null; - shadingColorSpace = null; + super.dispose(); } @Override @@ -161,7 +160,7 @@ abstract class TriangleBasedShadingConte { WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h); int[] data = new int[w * h * 4]; - if (!isDataEmpty() || background != null) + if (!isDataEmpty() || getBackground() != null) { for (int row = 0; row < h; row++) { @@ -185,11 +184,11 @@ abstract class TriangleBasedShadingConte } else { - if (background == null) + if (getBackground() == null) { continue; } - value = rgbBackground; + value = getRgbBackground(); } int index = (row * w + col) * 4; data[index] = value & 255; Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java Tue May 5 16:15:18 2015 @@ -16,7 +16,6 @@ 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.image.ColorModel; @@ -25,6 +24,7 @@ import java.awt.image.WritableRaster; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; import org.apache.pdfbox.util.Matrix; /** @@ -47,10 +47,9 @@ class Type1ShadingContext extends Shadin * @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 - * @param deviceBounds device bounds */ Type1ShadingContext(PDShadingType1 shading, ColorModel colorModel, AffineTransform xform, - Matrix matrix, Rectangle deviceBounds) throws IOException + Matrix matrix) throws IOException { super(shading, colorModel, xform, matrix); this.type1ShadingType = shading; @@ -85,15 +84,15 @@ class Type1ShadingContext extends Shadin @Override public void dispose() { - outputColorModel = null; - shadingColorSpace = null; + super.dispose(); + type1ShadingType = null; } @Override public ColorModel getColorModel() { - return outputColorModel; + return super.getColorModel(); } @Override @@ -124,7 +123,7 @@ class Type1ShadingContext extends Shadin if (values[0] < domain[0] || values[0] > domain[1] || values[1] < domain[2] || values[1] > domain[3]) { - if (background == null) + if (getBackground() == null) { continue; } @@ -134,7 +133,7 @@ class Type1ShadingContext extends Shadin // evaluate function if (useBackground) { - values = background; + values = getBackground(); } else { @@ -149,6 +148,7 @@ class Type1ShadingContext extends Shadin } // convert color values from shading color space to RGB + PDColorSpace shadingColorSpace = getShadingColorSpace(); if (shadingColorSpace != null) { try Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java Tue May 5 16:15:18 2015 @@ -25,7 +25,6 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.ColorModel; import java.io.IOException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.util.Matrix; @@ -64,7 +63,7 @@ class Type1ShadingPaint implements Paint { try { - return new Type1ShadingContext(shading, cm, xform, matrix, deviceBounds); + return new Type1ShadingContext(shading, cm, xform, matrix); } catch (IOException e) { Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java Tue May 5 16:15:18 2015 @@ -61,14 +61,13 @@ class Type4ShadingContext extends Gourau bitsPerFlag = shading.getBitsPerFlag(); //TODO handle cases where bitperflag isn't 8 LOG.debug("bitsPerFlag: " + bitsPerFlag); - triangleList = getTriangleList(xform, matrix); + setTriangleList(collectTriangles(shading, xform, matrix)); createPixelTable(deviceBounds); } - private List<ShadedTriangle> getTriangleList(AffineTransform xform, Matrix matrix) + private List<ShadedTriangle> collectTriangles(PDShadingType4 freeTriangleShadingType, AffineTransform xform, Matrix matrix) throws IOException { - PDShadingType4 freeTriangleShadingType = (PDShadingType4) shading; COSDictionary dict = freeTriangleShadingType.getCOSObject(); PDRange rangeX = freeTriangleShadingType.getDecodeForParameter(0); PDRange rangeY = freeTriangleShadingType.getDecodeForParameter(1); Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java Tue May 5 16:15:18 2015 @@ -25,7 +25,6 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.ColorModel; import java.io.IOException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.util.Matrix; Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java Tue May 5 16:15:18 2015 @@ -59,15 +59,13 @@ class Type5ShadingContext extends Gourau LOG.debug("Type5ShadingContext"); - triangleList = getTriangleList(xform, matrix); + setTriangleList(collectTriangles(shading, xform, matrix)); createPixelTable(deviceBounds); } - private List<ShadedTriangle> getTriangleList(AffineTransform xform, Matrix matrix) - throws IOException + private List<ShadedTriangle> collectTriangles(PDShadingType5 latticeTriangleShadingType, + AffineTransform xform, Matrix matrix) throws IOException { - List<ShadedTriangle> list = new ArrayList<ShadedTriangle>(); - PDShadingType5 latticeTriangleShadingType = (PDShadingType5) shading; COSDictionary cosDictionary = latticeTriangleShadingType.getCOSObject(); PDRange rangeX = latticeTriangleShadingType.getDecodeForParameter(0); PDRange rangeY = latticeTriangleShadingType.getDecodeForParameter(1); @@ -105,9 +103,11 @@ class Type5ShadingContext extends Gourau } int sz = vlist.size(), rowNum = sz / numPerRow; Vertex[][] latticeArray = new Vertex[rowNum][numPerRow]; + List<ShadedTriangle> list = new ArrayList<ShadedTriangle>(); if (rowNum < 2) { - return triangleList; + // must have at least two rows; if not, return empty list + return list; } for (int i = 0; i < rowNum; i++) { Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java Tue May 5 16:15:18 2015 @@ -25,7 +25,6 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.ColorModel; import java.io.IOException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.util.Matrix; Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java Tue May 5 16:15:18 2015 @@ -20,9 +20,6 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.image.ColorModel; import java.io.IOException; -import java.util.List; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.pdmodel.common.PDRange; import org.apache.pdfbox.util.Matrix; /** @@ -46,24 +43,7 @@ class Type6ShadingContext extends PatchM Type6ShadingContext(PDShadingType6 shading, ColorModel colorModel, AffineTransform xform, Matrix matrix, Rectangle deviceBounds) throws IOException { - super(shading, colorModel, xform, matrix); - patchList = getCoonsPatchList(xform, matrix); - createPixelTable(deviceBounds); - } - - // get the patch list which forms the type 6 shading image from data stream - private List<Patch> getCoonsPatchList(AffineTransform xform, Matrix matrix) throws IOException - { - PDShadingType6 coonsShadingType = (PDShadingType6) patchMeshesShadingType; - COSDictionary dict = coonsShadingType.getCOSObject(); - PDRange rangeX = coonsShadingType.getDecodeForParameter(0); - PDRange rangeY = coonsShadingType.getDecodeForParameter(1); - PDRange[] colRange = new PDRange[numberOfColorComponents]; - for (int i = 0; i < numberOfColorComponents; ++i) - { - colRange[i] = coonsShadingType.getDecodeForParameter(2 + i); - } - return getPatchList(xform, matrix, dict, rangeX, rangeY, colRange, 12); + super(shading, colorModel, xform, matrix, deviceBounds, 12); } @Override Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java?rev=1677851&r1=1677850&r2=1677851&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java Tue May 5 16:15:18 2015 @@ -20,9 +20,6 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.image.ColorModel; import java.io.IOException; -import java.util.List; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.pdmodel.common.PDRange; import org.apache.pdfbox.util.Matrix; /** @@ -46,24 +43,7 @@ class Type7ShadingContext extends PatchM Type7ShadingContext(PDShadingType7 shading, ColorModel colorModel, AffineTransform xform, Matrix matrix, Rectangle deviceBounds) throws IOException { - super(shading, colorModel, xform, matrix); - patchList = getTensorPatchList(xform, matrix); - createPixelTable(deviceBounds); - } - - // get the patch list which forms the type 7 shading image from data stream - private List<Patch> getTensorPatchList(AffineTransform xform, Matrix matrix) throws IOException - { - PDShadingType7 tensorShadingType = (PDShadingType7) patchMeshesShadingType; - COSDictionary dict = tensorShadingType.getCOSObject(); - PDRange rangeX = tensorShadingType.getDecodeForParameter(0); - PDRange rangeY = tensorShadingType.getDecodeForParameter(1); - PDRange[] colRange = new PDRange[numberOfColorComponents]; - for (int i = 0; i < numberOfColorComponents; ++i) - { - colRange[i] = tensorShadingType.getDecodeForParameter(2 + i); - } - return getPatchList(xform, matrix, dict, rangeX, rangeY, colRange, 16); + super(shading, colorModel, xform, matrix, deviceBounds, 16); } @Override