FOP-2562: Fix gradients
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/branches/Temp_PDFBox2@1739053 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java b/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java
index 28bdace..10705fa 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java
@@ -35,6 +35,7 @@
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
@@ -51,12 +52,11 @@
import org.apache.pdfbox.pdmodel.common.function.PDFunctionType0;
import org.apache.pdfbox.pdmodel.common.function.PDFunctionType2;
import org.apache.pdfbox.pdmodel.common.function.PDFunctionType3;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.pdmodel.graphics.shading.AxialShadingContext;
import org.apache.pdfbox.pdmodel.graphics.shading.AxialShadingPaint;
import org.apache.pdfbox.pdmodel.graphics.shading.RadialShadingContext;
import org.apache.pdfbox.pdmodel.graphics.shading.RadialShadingPaint;
-
+import org.apache.pdfbox.util.Matrix;
import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageSize;
@@ -109,12 +109,12 @@
if (paint instanceof AxialShadingPaint || paint instanceof RadialShadingPaint) {
PaintContext paintContext = paint.createContext(null, new Rectangle(), null, new AffineTransform(),
getRenderingHints());
- PDColorSpace pdcs;
int deviceColorSpace = PDFDeviceColorSpace.DEVICE_RGB;
if (paint instanceof AxialShadingPaint) {
try {
AxialShadingContext asc = (AxialShadingContext) paintContext;
float[] fCoords = asc.getCoords();
+ transformCoords(fCoords, paint, true);
PDFunction function = asc.getFunction();
Function targetFT = getFunction(function);
if (targetFT != null) {
@@ -135,6 +135,7 @@
try {
RadialShadingContext rsc = (RadialShadingContext) paintContext;
float[] fCoords = rsc.getCoords();
+ transformCoords(fCoords, paint, false);
PDFunction function = rsc.getFunction();
Function targetFT3 = getFunction(function);
List<Double> dCoords = floatArrayToDoubleList(fCoords);
@@ -149,6 +150,28 @@
}
}
+ private void transformCoords(float[] coords, Paint paint, boolean axialShading) {
+ try {
+ Field f = paint.getClass().getDeclaredField("matrix");
+ f.setAccessible(true);
+ Matrix ctm = (Matrix) f.get(paint);
+ AffineTransform at = ctm.createAffineTransform();
+ if (axialShading) {
+ at.transform(coords, 0, coords, 0, 2);
+ } else {
+ at.transform(coords, 0, coords, 0, 1);
+ at.transform(coords, 3, coords, 3, 1);
+ coords[2] *= ctm.getScalingFactorX();
+ coords[5] *= ctm.getScalingFactorX();
+ }
+
+ } catch (NoSuchFieldException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
private static Function getFunction(PDFunction f) throws IOException {
if (f instanceof PDFunctionType3) {
PDFunctionType3 sourceFT3 = (PDFunctionType3) f;