You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2014/08/04 20:40:45 UTC
svn commit: r1615722 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading:
AxialShadingContext.java PatchMeshesShadingContext.java
RadialShadingContext.java Type1ShadingContext.java
Author: tilman
Date: Mon Aug 4 18:40:45 2014
New Revision: 1615722
URL: http://svn.apache.org/r1615722
Log:
PDFBOX-1915: fix BBox if coordinates are inverted; add BBox to shading 1,3,6,7 as suggested by Shaola Ren; drop empty BBox because of trouble with eci file
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/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/Type1ShadingContext.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=1615722&r1=1615721&r2=1615722&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 Mon Aug 4 18:40:45 2014
@@ -63,8 +63,8 @@ public class AxialShadingContext impleme
private double y1y0;
private float d1d0;
private double denom;
- private final PDRectangle bboxRect;
- private float[] bboxTab = new float[4];
+ private PDRectangle rectBBox;
+ float minBBoxX, minBBoxY, maxBBoxX, maxBBoxY;
private final double axialLength;
private final int[] colorTable;
@@ -83,19 +83,29 @@ public class AxialShadingContext impleme
this.shading = shading;
coords = this.shading.getCoords().toFloatArray();
- bboxRect = shading.getBBox();
- if (bboxRect != null)
+ rectBBox = shading.getBBox();
+ if (rectBBox != null)
{
- bboxTab[0] = bboxRect.getLowerLeftX();
- bboxTab[1] = bboxRect.getLowerLeftY();
- bboxTab[2] = bboxRect.getUpperRightX();
- bboxTab[3] = bboxRect.getUpperRightY();
+ float[] bboxTab = new float[4];
+ bboxTab[0] = rectBBox.getLowerLeftX();
+ bboxTab[1] = rectBBox.getLowerLeftY();
+ bboxTab[2] = rectBBox.getUpperRightX();
+ bboxTab[3] = rectBBox.getUpperRightY();
if (ctm != null)
{
// transform the coords using the given matrix
ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
}
xform.transform(bboxTab, 0, bboxTab, 0, 2);
+ minBBoxX = Math.min(bboxTab[0],bboxTab[2]);
+ minBBoxY = Math.min(bboxTab[1],bboxTab[3]);
+ maxBBoxX = Math.max(bboxTab[0],bboxTab[2]);
+ maxBBoxY = Math.max(bboxTab[1],bboxTab[3]);
+ if (minBBoxX == maxBBoxX || minBBoxY == maxBBoxY)
+ {
+ LOG.warn("empty BBox is ignored");
+ rectBBox = null;
+ }
}
if (ctm != null)
@@ -233,9 +243,9 @@ public class AxialShadingContext impleme
for (int j = 0; j < h; j++)
{
double currentY = y + j;
- if (bboxRect != null)
+ if (rectBBox != null)
{
- if (currentY < bboxTab[3] || currentY > bboxTab[1])
+ if (currentY < minBBoxY || currentY > maxBBoxY)
{
continue;
}
@@ -244,9 +254,9 @@ public class AxialShadingContext impleme
for (int i = 0; i < w; i++)
{
double currentX = x + i;
- if (bboxRect != null)
+ if (rectBBox != null)
{
- if (currentX < bboxTab[0] || currentX > bboxTab[2])
+ if (currentX < minBBoxX || currentX > maxBBoxX)
{
continue;
}
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=1615722&r1=1615721&r2=1615722&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 Mon Aug 4 18:40:45 2014
@@ -40,6 +40,7 @@ import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.common.PDRange;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.util.Matrix;
@@ -59,6 +60,8 @@ abstract class PatchMeshesShadingContext
protected int rgbBackground;
protected final boolean hasFunction;
protected final PDShading patchMeshesShadingType;
+ private PDRectangle rectBBox;
+ float minBBoxX, minBBoxY, maxBBoxX, maxBBoxY;
// the following fields are not intialized in this abstract class
protected ArrayList<Patch> patchList; // patch list
@@ -84,6 +87,31 @@ abstract class PatchMeshesShadingContext
hasFunction = shading.getFunction() != null;
shadingColorSpace = shading.getColorSpace();
+ rectBBox = shading.getBBox();
+ if (rectBBox != null)
+ {
+ float[] bboxTab = new float[4];
+ bboxTab[0] = rectBBox.getLowerLeftX();
+ bboxTab[1] = rectBBox.getLowerLeftY();
+ bboxTab[2] = rectBBox.getUpperRightX();
+ bboxTab[3] = rectBBox.getUpperRightY();
+ if (ctm != null)
+ {
+ // transform the coords using the given matrix
+ ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
+ }
+ xform.transform(bboxTab, 0, bboxTab, 0, 2);
+ minBBoxX = Math.min(bboxTab[0],bboxTab[2]);
+ minBBoxY = Math.min(bboxTab[1],bboxTab[3]);
+ maxBBoxX = Math.max(bboxTab[0],bboxTab[2]);
+ maxBBoxY = Math.max(bboxTab[1],bboxTab[3]);
+ if (minBBoxX == maxBBoxX || minBBoxY == maxBBoxY)
+ {
+ LOG.warn("empty BBox is ignored");
+ rectBBox = null;
+ }
+ }
+
numberOfColorComponents = hasFunction ? 1 : shadingColorSpace.getNumberOfComponents();
// create the output color model using RGB+alpha as color space
@@ -383,8 +411,25 @@ abstract class PatchMeshesShadingContext
{
for (int row = 0; row < h; row++)
{
+ double currentY = y + row;
+ if (rectBBox != null)
+ {
+ if (currentY < minBBoxY || currentY > maxBBoxY)
+ {
+ continue;
+ }
+ }
+
for (int col = 0; col < w; col++)
{
+ double currentX = x + col;
+ if (rectBBox != null)
+ {
+ if (currentX < minBBoxX || currentX > maxBBoxX)
+ {
+ continue;
+ }
+ }
Point p = new Point(x + col, y + row);
int value;
if (pixelTable.containsKey(p))
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=1615722&r1=1615721&r2=1615722&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 Mon Aug 4 18:40:45 2014
@@ -31,6 +31,7 @@ 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.PDRectangle;
import org.apache.pdfbox.pdmodel.common.function.PDFunction;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.util.Matrix;
@@ -66,7 +67,9 @@ public class RadialShadingContext implem
private float d1d0;
private double denom;
-
+ private PDRectangle rectBBox;
+ float minBBoxX, minBBoxY, maxBBoxX, maxBBoxY;
+
private final double longestDistance;
private int[] colorTable;
@@ -84,6 +87,31 @@ public class RadialShadingContext implem
this.shading = shading;
coords = this.shading.getCoords().toFloatArray();
+ rectBBox = shading.getBBox();
+ if (rectBBox != null)
+ {
+ float[] bboxTab = new float[4];
+ bboxTab[0] = rectBBox.getLowerLeftX();
+ bboxTab[1] = rectBBox.getLowerLeftY();
+ bboxTab[2] = rectBBox.getUpperRightX();
+ bboxTab[3] = rectBBox.getUpperRightY();
+ if (ctm != null)
+ {
+ // transform the coords using the given matrix
+ ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
+ }
+ xform.transform(bboxTab, 0, bboxTab, 0, 2);
+ minBBoxX = Math.min(bboxTab[0],bboxTab[2]);
+ minBBoxY = Math.min(bboxTab[1],bboxTab[3]);
+ maxBBoxX = Math.max(bboxTab[0],bboxTab[2]);
+ maxBBoxY = Math.max(bboxTab[1],bboxTab[3]);
+ if (minBBoxX == maxBBoxX || minBBoxY == maxBBoxY)
+ {
+ LOG.warn("empty BBox is ignored");
+ rectBBox = null;
+ }
+ }
+
if (ctm != null)
{
// transform the coords using the given matrix
@@ -256,8 +284,24 @@ public class RadialShadingContext implem
int[] data = new int[w * h * 4];
for (int j = 0; j < h; j++)
{
+ double currentY = y + j;
+ if (rectBBox != null)
+ {
+ if (currentY < minBBoxY || currentY > maxBBoxY)
+ {
+ continue;
+ }
+ }
for (int i = 0; i < w; i++)
{
+ double currentX = x + i;
+ if (rectBBox != null)
+ {
+ if (currentX < minBBoxX || currentX > maxBBoxX)
+ {
+ continue;
+ }
+ }
useBackground = false;
float[] inputValues = calculateInputValues(x + i, y + j);
if (Float.isNaN(inputValues[0]) && Float.isNaN(inputValues[1]))
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=1615722&r1=1615721&r2=1615722&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 Mon Aug 4 18:40:45 2014
@@ -29,6 +29,7 @@ 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.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.util.Matrix;
@@ -48,6 +49,8 @@ class Type1ShadingContext implements Pai
private float[] domain;
private Matrix matrix;
private float[] background;
+ private PDRectangle rectBBox;
+ float minBBoxX, minBBoxY, maxBBoxX, maxBBoxY;
/**
* Constructor creates an instance to be used for fill operations.
@@ -62,6 +65,31 @@ class Type1ShadingContext implements Pai
{
this.shading = shading;
+ rectBBox = shading.getBBox();
+ if (rectBBox != null)
+ {
+ float[] bboxTab = new float[4];
+ bboxTab[0] = rectBBox.getLowerLeftX();
+ bboxTab[1] = rectBBox.getLowerLeftY();
+ bboxTab[2] = rectBBox.getUpperRightX();
+ bboxTab[3] = rectBBox.getUpperRightY();
+ if (ctm != null)
+ {
+ // transform the coords using the given matrix
+ ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
+ }
+ xform.transform(bboxTab, 0, bboxTab, 0, 2);
+ minBBoxX = Math.min(bboxTab[0],bboxTab[2]);
+ minBBoxY = Math.min(bboxTab[1],bboxTab[3]);
+ maxBBoxX = Math.max(bboxTab[0],bboxTab[2]);
+ maxBBoxY = Math.max(bboxTab[1],bboxTab[3]);
+ if (minBBoxX == maxBBoxX || minBBoxY == maxBBoxY)
+ {
+ LOG.warn("empty BBox is ignored");
+ rectBBox = null;
+ }
+ }
+
// color space
shadingColorSpace = this.shading.getColorSpace();
// create the output colormodel using RGB+alpha as colorspace
@@ -134,8 +162,24 @@ class Type1ShadingContext implements Pai
int[] data = new int[w * h * 4];
for (int j = 0; j < h; j++)
{
+ double currentY = y + j;
+ if (rectBBox != null)
+ {
+ if (currentY < minBBoxY || currentY > maxBBoxY)
+ {
+ continue;
+ }
+ }
for (int i = 0; i < w; i++)
{
+ double currentX = x + i;
+ if (rectBBox != null)
+ {
+ if (currentX < minBBoxX || currentX > maxBBoxX)
+ {
+ continue;
+ }
+ }
int index = (j * w + i) * 4;
boolean useBackground = false;
float[] values = new float[]