aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChris Bowditch <cbowditch@apache.org>2010-01-08 14:52:19 +0000
committerChris Bowditch <cbowditch@apache.org>2010-01-08 14:52:19 +0000
commit27166d6f10d109d339a120e0625073b43c1bf01b (patch)
tree8c306c76df446d0a589ca77970def6b55dcc86e0 /src
parent6001e940eef4e6e3ded00baef6e323d1e269041a (diff)
downloadxmlgraphics-fop-27166d6f10d109d339a120e0625073b43c1bf01b.tar.gz
xmlgraphics-fop-27166d6f10d109d339a120e0625073b43c1bf01b.zip
Bugzilla #48237:
AFP Renderer does not respect image color settings for svg Submitted by: Peter Hancock <peter.hancock.at.gmail.com> git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@897221 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r--src/java/org/apache/fop/afp/AFPDataObjectFactory.java3
-rw-r--r--src/java/org/apache/fop/afp/AFPPaintingState.java140
-rw-r--r--src/java/org/apache/fop/afp/goca/GraphicsSetProcessColor.java27
-rw-r--r--src/java/org/apache/fop/afp/modca/GraphicsObject.java20
-rw-r--r--src/java/org/apache/fop/pdf/PDFColor.java6
-rw-r--r--src/java/org/apache/fop/svg/PDFGraphics2D.java2
-rw-r--r--src/java/org/apache/fop/util/CMYKColorSpace.java81
-rw-r--r--src/java/org/apache/fop/util/ColorExt.java249
-rw-r--r--src/java/org/apache/fop/util/ColorUtil.java27
9 files changed, 136 insertions, 419 deletions
diff --git a/src/java/org/apache/fop/afp/AFPDataObjectFactory.java b/src/java/org/apache/fop/afp/AFPDataObjectFactory.java
index 792909b9e..58321e546 100644
--- a/src/java/org/apache/fop/afp/AFPDataObjectFactory.java
+++ b/src/java/org/apache/fop/afp/AFPDataObjectFactory.java
@@ -165,6 +165,9 @@ public class AFPDataObjectFactory {
AFPGraphics2D g2d = graphicsObjectInfo.getGraphics2D();
g2d.setGraphicsObject(graphicsObj);
+ //set color converter (i.e. an rgb to grayscale converter)
+ graphicsObj.setColorConverter(g2d.getPaintingState().getColorConverter());
+
// paint to graphics object
Graphics2DImagePainter painter = graphicsObjectInfo.getPainter();
Rectangle2D area = graphicsObjectInfo.getArea();
diff --git a/src/java/org/apache/fop/afp/AFPPaintingState.java b/src/java/org/apache/fop/afp/AFPPaintingState.java
index 643dcb702..a19874183 100644
--- a/src/java/org/apache/fop/afp/AFPPaintingState.java
+++ b/src/java/org/apache/fop/afp/AFPPaintingState.java
@@ -24,14 +24,19 @@ import java.awt.Point;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.xmlgraphics.java2d.ColorConverter;
+import org.apache.xmlgraphics.java2d.DefaultColorConverter;
+import org.apache.xmlgraphics.java2d.GrayScaleColorConverter;
+
import org.apache.fop.afp.fonts.AFPPageFonts;
import org.apache.fop.util.AbstractPaintingState;
/**
- * This keeps information about the current painting state when writing to an AFP datastream.
+ * This keeps information about the current painting state when writing to an
+ * AFP datastream.
*/
-public class AFPPaintingState extends org.apache.fop.util.AbstractPaintingState
-implements Cloneable {
+public class AFPPaintingState extends org.apache.fop.util.AbstractPaintingState implements
+ Cloneable {
private static final long serialVersionUID = 8206711712452344473L;
@@ -46,9 +51,18 @@ implements Cloneable {
/** color image support */
private boolean colorImages = false;
- /** true if certain image formats may be embedded unchanged in their native format. */
+ /** color image handler */
+ private ColorConverter colorConverter = GrayScaleColorConverter.getInstance();
+
+ /**
+ * true if certain image formats may be embedded unchanged in their native
+ * format.
+ */
private boolean nativeImagesSupported = false;
- /** true if CMYK images (requires IOCA FS45 suppport on the target platform) may be generated */
+ /**
+ * true if CMYK images (requires IOCA FS45 suppport on the target platform)
+ * may be generated
+ */
private boolean cmykImagesSupported;
/** default value for image depth */
@@ -60,13 +74,12 @@ implements Cloneable {
/** the current page */
private transient AFPPagePaintingState pagePaintingState = new AFPPagePaintingState();
-// /** reference orientation */
-// private int orientation = 0;
+ // /** reference orientation */
+ // private int orientation = 0;
/** a unit converter */
private final transient AFPUnitConverter unitConv = new AFPUnitConverter(this);
-
/**
* Sets the rotation to be used for portrait pages, valid values are 0
* (default), 90, 180, 270.
@@ -75,13 +88,11 @@ implements Cloneable {
* The rotation in degrees.
*/
public void setPortraitRotation(int rotation) {
- if (rotation == 0 || rotation == 90 || rotation == 180
- || rotation == 270) {
+ if (rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270) {
portraitRotation = rotation;
} else {
- throw new IllegalArgumentException(
- "The portrait rotation must be one"
- + " of the values 0, 90, 180, 270");
+ throw new IllegalArgumentException("The portrait rotation must be one"
+ + " of the values 0, 90, 180, 270");
}
}
@@ -103,13 +114,11 @@ implements Cloneable {
* The rotation in degrees.
*/
public void setLandscapeRotation(int rotation) {
- if (rotation == 0 || rotation == 90 || rotation == 180
- || rotation == 270) {
+ if (rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270) {
landscapeRotation = rotation;
} else {
- throw new IllegalArgumentException(
- "The landscape rotation must be one"
- + " of the values 0, 90, 180, 270");
+ throw new IllegalArgumentException("The landscape rotation must be one"
+ + " of the values 0, 90, 180, 270");
}
}
@@ -152,13 +161,18 @@ implements Cloneable {
}
/**
- * Sets whether images are color or not
+ * Sets whether images are color or not and instantiates a ColorHandler
*
* @param colorImages
* color image output
*/
public void setColorImages(boolean colorImages) {
this.colorImages = colorImages;
+
+ if (colorImages) {
+ this.colorConverter = DefaultColorConverter.getInstance();
+ }
+
}
/**
@@ -171,9 +185,19 @@ implements Cloneable {
}
/**
+ * Used to convert color in respect of the colorImages flag
+ *
+ * @return the color converter
+ */
+ public ColorConverter getColorConverter() {
+ return this.colorConverter;
+ }
+
+ /**
* Sets whether images are natively supported or not in the AFP environment
*
- * @param nativeImagesSupported true if images are natively supported in this AFP environment
+ * @param nativeImagesSupported
+ * true if images are natively supported in this AFP environment
*/
public void setNativeImagesSupported(boolean nativeImagesSupported) {
this.nativeImagesSupported = nativeImagesSupported;
@@ -189,10 +213,12 @@ implements Cloneable {
}
/**
- * Controls whether CMYK images (IOCA FS45) are enabled. By default, support is disabled
- * for wider compatibility. When disabled, any CMYK image is converted to the selected
- * color format.
- * @param value true to enabled CMYK images
+ * Controls whether CMYK images (IOCA FS45) are enabled. By default, support
+ * is disabled for wider compatibility. When disabled, any CMYK image is
+ * converted to the selected color format.
+ *
+ * @param value
+ * true to enabled CMYK images
*/
public void setCMYKImagesSupported(boolean value) {
this.cmykImagesSupported = value;
@@ -200,6 +226,7 @@ implements Cloneable {
/**
* Indicates whether CMYK images (IOCA FS45) are enabled.
+ *
* @return true if IOCA FS45 is enabled
*/
public boolean isCMYKImagesSupported() {
@@ -259,7 +286,8 @@ implements Cloneable {
/**
* Sets the page width
*
- * @param pageWidth the page width
+ * @param pageWidth
+ * the page width
*/
public void setPageWidth(int pageWidth) {
pagePaintingState.setWidth(pageWidth);
@@ -277,7 +305,8 @@ implements Cloneable {
/**
* Sets the page height
*
- * @param pageHeight the page height
+ * @param pageHeight
+ * the page height
*/
public void setPageHeight(int pageHeight) {
pagePaintingState.setHeight(pageHeight);
@@ -304,10 +333,11 @@ implements Cloneable {
/**
* Sets the uri of the current image
*
- * @param uri the uri of the current image
+ * @param uri
+ * the uri of the current image
*/
public void setImageUri(String uri) {
- ((AFPData)getData()).imageUri = uri;
+ ((AFPData) getData()).imageUri = uri;
}
/**
@@ -316,7 +346,7 @@ implements Cloneable {
* @return the uri of the current image
*/
public String getImageUri() {
- return ((AFPData)getData()).imageUri;
+ return ((AFPData) getData()).imageUri;
}
/**
@@ -338,10 +368,13 @@ implements Cloneable {
}
/**
- * Returns a point on the current page, taking the current painting state into account.
+ * Returns a point on the current page, taking the current painting state
+ * into account.
*
- * @param x the X-coordinate
- * @param y the Y-coordinate
+ * @param x
+ * the X-coordinate
+ * @param y
+ * the Y-coordinate
* @return a point on the current page
*/
public Point getPoint(int x, int y) {
@@ -370,12 +403,13 @@ implements Cloneable {
/** {@inheritDoc} */
public Object clone() {
- AFPPaintingState paintingState = (AFPPaintingState)super.clone();
- paintingState.pagePaintingState = (AFPPagePaintingState)this.pagePaintingState.clone();
+ AFPPaintingState paintingState = (AFPPaintingState) super.clone();
+ paintingState.pagePaintingState = (AFPPagePaintingState) this.pagePaintingState.clone();
paintingState.portraitRotation = this.portraitRotation;
paintingState.landscapeRotation = this.landscapeRotation;
paintingState.bitsPerPixel = this.bitsPerPixel;
paintingState.colorImages = this.colorImages;
+ paintingState.colorConverter = this.colorConverter;
paintingState.resolution = this.resolution;
return paintingState;
}
@@ -383,13 +417,9 @@ implements Cloneable {
/** {@inheritDoc} */
public String toString() {
return "AFPPaintingState{" + "portraitRotation=" + portraitRotation
- + ", landscapeRotation=" + landscapeRotation
- + ", colorImages=" + colorImages
- + ", bitsPerPixel=" + bitsPerPixel
- + ", resolution=" + resolution
- + ", pageState=" + pagePaintingState
- + super.toString()
- + "}";
+ + ", landscapeRotation=" + landscapeRotation + ", colorImages=" + colorImages
+ + ", bitsPerPixel=" + bitsPerPixel + ", resolution=" + resolution + ", pageState="
+ + pagePaintingState + super.toString() + "}";
}
/**
@@ -423,7 +453,8 @@ implements Cloneable {
/**
* Sets the page width
*
- * @param width the page width
+ * @param width
+ * the page width
*/
protected void setWidth(int width) {
this.width = width;
@@ -441,7 +472,8 @@ implements Cloneable {
/**
* Sets the page height
*
- * @param height the page height
+ * @param height
+ * the page height
*/
protected void setHeight(int height) {
this.height = height;
@@ -459,7 +491,8 @@ implements Cloneable {
/**
* Sets the current page fonts
*
- * @param fonts the current page fonts
+ * @param fonts
+ * the current page fonts
*/
protected void setFonts(AFPPageFonts fonts) {
this.fonts = fonts;
@@ -486,7 +519,8 @@ implements Cloneable {
/**
* Sets the current page orientation
*
- * @param orientation the current page orientation
+ * @param orientation
+ * the current page orientation
*/
protected void setOrientation(int orientation) {
this.orientation = orientation;
@@ -505,12 +539,8 @@ implements Cloneable {
/** {@inheritDoc} */
public String toString() {
- return "AFPPagePaintingState{width=" + width
- + ", height=" + height
- + ", orientation=" + orientation
- + ", fonts=" + fonts
- + ", fontCount=" + fontCount
- + "}";
+ return "AFPPagePaintingState{width=" + width + ", height=" + height + ", orientation="
+ + orientation + ", fonts=" + fonts + ", fontCount=" + fontCount + "}";
}
}
@@ -527,7 +557,7 @@ implements Cloneable {
/** {@inheritDoc} */
public Object clone() {
- AFPData obj = (AFPData)super.clone();
+ AFPData obj = (AFPData) super.clone();
obj.filled = this.filled;
obj.imageUri = this.imageUri;
return obj;
@@ -535,10 +565,8 @@ implements Cloneable {
/** {@inheritDoc} */
public String toString() {
- return "AFPData{" + super.toString()
- + ", filled=" + filled
- + ", imageUri=" + imageUri
- + "}";
+ return "AFPData{" + super.toString() + ", filled=" + filled + ", imageUri=" + imageUri
+ + "}";
}
/** {@inheritDoc} */
diff --git a/src/java/org/apache/fop/afp/goca/GraphicsSetProcessColor.java b/src/java/org/apache/fop/afp/goca/GraphicsSetProcessColor.java
index f0c4aa321..4d45b22cb 100644
--- a/src/java/org/apache/fop/afp/goca/GraphicsSetProcessColor.java
+++ b/src/java/org/apache/fop/afp/goca/GraphicsSetProcessColor.java
@@ -29,6 +29,16 @@ import java.io.OutputStream;
*/
public class GraphicsSetProcessColor extends AbstractGraphicsDrawingOrder {
+ /*
+ * GOCA Color space support:
+ * X'01' RGB
+ * X'04' CMYK
+ * X'06' Highlight color space
+ * X'08' CIELAB
+ * X'40' Standard OCA color space
+ */
+ private static final byte RGB = 0x01, CMYK = 0x04;
+
private final Color color;
private final float[] colorComponents;
@@ -36,7 +46,8 @@ public class GraphicsSetProcessColor extends AbstractGraphicsDrawingOrder {
/**
* Main constructor
*
- * @param color the color to set
+ * @param color
+ * the color to set
*/
public GraphicsSetProcessColor(Color color) {
this.color = color;
@@ -50,7 +61,7 @@ public class GraphicsSetProcessColor extends AbstractGraphicsDrawingOrder {
/** {@inheritDoc} */
byte getOrderCode() {
- return (byte)0xB2;
+ return (byte) 0xB2;
}
/** {@inheritDoc} */
@@ -60,24 +71,24 @@ public class GraphicsSetProcessColor extends AbstractGraphicsDrawingOrder {
byte colspace;
int colSpaceType = color.getColorSpace().getType();
if (colSpaceType == ColorSpace.TYPE_CMYK) {
- colspace = 0x04;
+ colspace = CMYK;
} else if (colSpaceType == ColorSpace.TYPE_RGB) {
- colspace = 0x01;
+ colspace = RGB;
} else {
log.error("unsupported colorspace " + colSpaceType);
- colspace = 0x01;
+ colspace = RGB;
}
// COLSIZE(S)
byte[] colsizes = new byte[] {0x00, 0x00, 0x00, 0x00};
for (int i = 0; i < colorComponents.length; i++) {
- colsizes[i] = (byte)8;
+ colsizes[i] = (byte) 8;
}
int len = getDataLength();
byte[] data = new byte[len];
data[0] = getOrderCode(); // GSPCOL order code
- data[1] = (byte)(len - 2); // LEN
+ data[1] = (byte) (len - 2); // LEN
data[2] = 0x00; // reserved; must be zero
data[3] = colspace; // COLSPCE
data[4] = 0x00; // reserved; must be zero
@@ -91,7 +102,7 @@ public class GraphicsSetProcessColor extends AbstractGraphicsDrawingOrder {
// COLVALUE(S)
for (int i = 0; i < colorComponents.length; i++) {
- data[i + 12] = (byte)(colorComponents[i] * 255);
+ data[i + 12] = (byte) (colorComponents[i] * 255);
}
os.write(data);
diff --git a/src/java/org/apache/fop/afp/modca/GraphicsObject.java b/src/java/org/apache/fop/afp/modca/GraphicsObject.java
index a18ee1f07..cdc0a44bc 100644
--- a/src/java/org/apache/fop/afp/modca/GraphicsObject.java
+++ b/src/java/org/apache/fop/afp/modca/GraphicsObject.java
@@ -25,6 +25,8 @@ import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
+import org.apache.xmlgraphics.java2d.ColorConverter;
+
import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPObjectAreaInfo;
import org.apache.fop.afp.Completable;
@@ -65,6 +67,10 @@ public class GraphicsObject extends AbstractDataObject {
/** the graphics state */
private final GraphicsState graphicsState = new GraphicsState();
+
+ /** color converter */
+ private ColorConverter colorConverter = null;
+
/**
* Default constructor
*
@@ -140,11 +146,23 @@ public class GraphicsObject extends AbstractDataObject {
*/
public void setColor(Color color) {
if (!color.equals(graphicsState.color)) {
- addObject(new GraphicsSetProcessColor(color));
+ addObject(new GraphicsSetProcessColor(colorConverter.convert(color)));
graphicsState.color = color;
}
}
+
+ /**
+ * Sets the color converter
+ *
+ * @param colorConverter ColorConverter to filter the color
+ * when creating a GraphicsSetProcessColor.
+ */
+ public void setColorConverter(ColorConverter colorConverter) {
+ this.colorConverter = colorConverter;
+ }
+
+
/**
* Sets the current position
*
diff --git a/src/java/org/apache/fop/pdf/PDFColor.java b/src/java/org/apache/fop/pdf/PDFColor.java
index f2ae2da33..c4a8e5be6 100644
--- a/src/java/org/apache/fop/pdf/PDFColor.java
+++ b/src/java/org/apache/fop/pdf/PDFColor.java
@@ -23,11 +23,11 @@ import java.awt.Color;
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.io.IOException;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
-import org.apache.fop.util.CMYKColorSpace;
-import org.apache.fop.util.ColorExt;
+import org.apache.xmlgraphics.java2d.CMYKColorSpace;
+import org.apache.xmlgraphics.java2d.ColorExt;
/**
* PDF Color object.
diff --git a/src/java/org/apache/fop/svg/PDFGraphics2D.java b/src/java/org/apache/fop/svg/PDFGraphics2D.java
index c5da8af6f..e25fbbdbe 100644
--- a/src/java/org/apache/fop/svg/PDFGraphics2D.java
+++ b/src/java/org/apache/fop/svg/PDFGraphics2D.java
@@ -66,6 +66,7 @@ import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
import org.apache.xmlgraphics.java2d.AbstractGraphics2D;
+import org.apache.xmlgraphics.java2d.ColorExt;
import org.apache.xmlgraphics.java2d.GraphicContext;
import org.apache.fop.fonts.Font;
@@ -91,7 +92,6 @@ import org.apache.fop.pdf.PDFXObject;
import org.apache.fop.render.pdf.ImageRawCCITTFaxAdapter;
import org.apache.fop.render.pdf.ImageRawJPEGAdapter;
import org.apache.fop.render.pdf.ImageRenderedAdapter;
-import org.apache.fop.util.ColorExt;
/**
* PDF Graphics 2D.
diff --git a/src/java/org/apache/fop/util/CMYKColorSpace.java b/src/java/org/apache/fop/util/CMYKColorSpace.java
deleted file mode 100644
index 593c65cea..000000000
--- a/src/java/org/apache/fop/util/CMYKColorSpace.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.
- */
-
-/* $Id$ */
-
-package org.apache.fop.util;
-
-import java.awt.color.ColorSpace;
-
-/**
- * This class represents an uncalibrated CMYK color space. It is used by
- * the JpegImage class.
- */
-public class CMYKColorSpace extends ColorSpace {
-
- private static CMYKColorSpace instance;
-
- /**
- * @see java.awt.color.ColorSpace#ColorSpace(int, int)
- */
- protected CMYKColorSpace(int type, int numcomponents) {
- super(type, numcomponents);
- }
-
- /**
- * Returns an instance of an uncalibrated CMYK color space.
- * @return CMYKColorSpace the requested color space object
- */
- public static CMYKColorSpace getInstance() {
- if (instance == null) {
- instance = new CMYKColorSpace(TYPE_CMYK, 4);
- }
- return instance;
- }
-
- /**
- * {@inheritDoc}
- */
- public float[] toRGB(float[] colorvalue) {
- return new float [] {
- (1 - colorvalue[0]) * (1 - colorvalue[3]),
- (1 - colorvalue[1]) * (1 - colorvalue[3]),
- (1 - colorvalue[2]) * (1 - colorvalue[3])};
- }
-
- /**
- * {@inheritDoc}
- */
- public float[] fromRGB(float[] rgbvalue) {
- throw new UnsupportedOperationException("NYI");
- }
-
- /**
- * {@inheritDoc}
- */
- public float[] toCIEXYZ(float[] colorvalue) {
- throw new UnsupportedOperationException("NYI");
- }
-
- /**
- * {@inheritDoc}
- */
- public float[] fromCIEXYZ(float[] colorvalue) {
- throw new UnsupportedOperationException("NYI");
- }
-
-}
diff --git a/src/java/org/apache/fop/util/ColorExt.java b/src/java/org/apache/fop/util/ColorExt.java
deleted file mode 100644
index e8f929ad1..000000000
--- a/src/java/org/apache/fop/util/ColorExt.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * 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.
- */
-
-/* $Id$ */
-
-package org.apache.fop.util;
-
-import java.awt.Color;
-import java.awt.color.ColorSpace;
-import java.util.Arrays;
-
-/**
- * Color helper class.
- * <p>
- * This class extends java.awt.Color class keeping track of the original color
- * property values specified by the fo user in a rgb-icc call.
- */
-public final class ColorExt extends Color {
- //
- private static final long serialVersionUID = 1L;
-
- // Values of fop-rgb-icc arguments
- private float rgbReplacementRed;
- private float rgbReplacementGreen;
- private float rgbReplacementBlue;
-
- private String iccProfileName;
- private String iccProfileSrc;
- private ColorSpace colorSpace;
-
- private float[] colorValues;
-
- /*
- * Helper for createFromFoRgbIcc
- */
- private ColorExt(ColorSpace colorSpace, float[] colorValues, float opacity) {
- super(colorSpace, colorValues, opacity);
- }
-
- /*
- * Helper for createFromSvgIccColor
- */
- private ColorExt(float red, float green, float blue, float opacity) {
- super(red, green, blue, opacity);
- }
-
- /**
- * Create ColorExt object backup up FO's rgb-icc color function
- *
- * @param redReplacement
- * Red part of RGB replacement color that will be used when ICC
- * profile can not be loaded
- * @param greenReplacement
- * Green part of RGB replacement color that will be used when ICC
- * profile can not be loaded
- * @param blueReplacement
- * Blue part of RGB replacement color that will be used when ICC
- * profile can not be loaded
- * @param profileName
- * Name of ICC profile
- * @param profileSrc
- * Source of ICC profile
- * @param colorSpace
- * ICC ColorSpace for the ICC profile
- * @param iccValues
- * color values
- * @return the requested color object
- */
- public static ColorExt createFromFoRgbIcc(float redReplacement,
- float greenReplacement, float blueReplacement, String profileName,
- String profileSrc, ColorSpace colorSpace, float[] iccValues) {
- ColorExt ce = new ColorExt(colorSpace, iccValues, 1.0f);
- ce.rgbReplacementRed = redReplacement;
- ce.rgbReplacementGreen = greenReplacement;
- ce.rgbReplacementBlue = blueReplacement;
- ce.iccProfileName = profileName;
- ce.iccProfileSrc = profileSrc;
- ce.colorSpace = colorSpace;
- ce.colorValues = iccValues;
- return ce;
- }
-
- /**
- * Create ColorExt object backing up SVG's icc-color function.
- *
- * @param red
- * Red value resulting from the conversion from the user provided
- * (icc) color values to the batik (rgb) color space
- * @param green
- * Green value resulting from the conversion from the user
- * provided (icc) color values to the batik (rgb) color space
- * @param blue
- * Blue value resulting from the conversion from the user
- * provided (icc) color values to the batik (rgb) color space
- * @param opacity
- * Opacity
- * @param profileName
- * ICC profile name
- * @param profileHref
- * the URI to the color profile
- * @param profileCS
- * ICC ColorSpace profile
- * @param colorValues
- * ICC color values
- * @return the requested color object
- */
- public static ColorExt createFromSvgIccColor(float red, float green,
- float blue, float opacity, String profileName, String profileHref,
- ColorSpace profileCS, float[] colorValues) {
- //TODO this method is not referenced by FOP, can it be deleted?
- ColorExt ce = new ColorExt(red, green, blue, opacity);
- ce.rgbReplacementRed = -1;
- ce.rgbReplacementGreen = -1;
- ce.rgbReplacementBlue = -1;
- ce.iccProfileName = profileName;
- ce.iccProfileSrc = profileHref;
- ce.colorSpace = profileCS;
- ce.colorValues = colorValues;
- return ce;
-
- }
-
- /** {@inheritDoc} */
- public int hashCode() {
- //implementation from the superclass should be good enough for our purposes
- return super.hashCode();
- }
-
- /** {@inheritDoc} */
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- ColorExt other = (ColorExt)obj;
- //TODO maybe use super.getColorComponents() instead
- if (!Arrays.equals(colorValues, other.colorValues)) {
- return false;
- }
- if (iccProfileName == null) {
- if (other.iccProfileName != null) {
- return false;
- }
- } else if (!iccProfileName.equals(other.iccProfileName)) {
- return false;
- }
- if (iccProfileSrc == null) {
- if (other.iccProfileSrc != null) {
- return false;
- }
- } else if (!iccProfileSrc.equals(other.iccProfileSrc)) {
- return false;
- }
- if (Float.floatToIntBits(rgbReplacementBlue)
- != Float.floatToIntBits(other.rgbReplacementBlue)) {
- return false;
- }
- if (Float.floatToIntBits(rgbReplacementGreen)
- != Float.floatToIntBits(other.rgbReplacementGreen)) {
- return false;
- }
- if (Float.floatToIntBits(rgbReplacementRed)
- != Float.floatToIntBits(other.rgbReplacementRed)) {
- return false;
- }
- return true;
- }
-
- /**
- * Get ICC profile name
- *
- * @return ICC profile name
- */
- public String getIccProfileName() {
- return this.iccProfileName;
- }
-
- /**
- * Get ICC profile source
- *
- * @return ICC profile source
- */
- public String getIccProfileSrc() {
- return this.iccProfileSrc;
- }
-
- /**
- * @return the original ColorSpace
- */
- public ColorSpace getOrigColorSpace() {
- //TODO this method is probably unnecessary due to super.cs and getColorSpace()
- return this.colorSpace;
- }
-
- /**
- * Returns the original color values.
- * @return the original color values
- */
- public float[] getOriginalColorComponents() {
- //TODO this method is probably unnecessary due to super.fvalue and getColorComponents()
- float[] copy = new float[this.colorValues.length];
- System.arraycopy(this.colorValues, 0, copy, 0, copy.length);
- return copy;
- }
-
- /**
- * Create string representation of fop-rgb-icc function call to map this
- * ColorExt settings
- * @return the string representing the internal fop-rgb-icc() function call
- */
- public String toFunctionCall() {
- StringBuffer sb = new StringBuffer(40);
- sb.append("fop-rgb-icc(");
- sb.append(this.rgbReplacementRed + ",");
- sb.append(this.rgbReplacementGreen + ",");
- sb.append(this.rgbReplacementBlue + ",");
- sb.append(this.iccProfileName + ",");
- if (this.iccProfileSrc != null) {
- sb.append("\"" + this.iccProfileSrc + "\"");
- }
- float[] colorComponents = this.getColorComponents(null);
- for (int ix = 0; ix < colorComponents.length; ix++) {
- sb.append(",");
- sb.append(colorComponents[ix]);
- }
- sb.append(")");
- return sb.toString();
- }
-
-}
diff --git a/src/java/org/apache/fop/util/ColorUtil.java b/src/java/org/apache/fop/util/ColorUtil.java
index 8100aef96..4ec858ca6 100644
--- a/src/java/org/apache/fop/util/ColorUtil.java
+++ b/src/java/org/apache/fop/util/ColorUtil.java
@@ -27,6 +27,9 @@ import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.xmlgraphics.java2d.CMYKColorSpace;
+import org.apache.xmlgraphics.java2d.ColorExt;
+
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fo.expr.PropertyException;
@@ -679,20 +682,7 @@ public final class ColorUtil {
* @return the modified color
*/
public static Color lightenColor(Color col, float factor) {
- // TODO: This function converts the color into the sRGB namespace.
- // This should be avoided if possible.
- float[] cols = new float[4];
- cols = col.getRGBComponents(cols);
- if (factor > 0) {
- cols[0] += (1.0 - cols[0]) * factor;
- cols[1] += (1.0 - cols[1]) * factor;
- cols[2] += (1.0 - cols[2]) * factor;
- } else {
- cols[0] -= cols[0] * -factor;
- cols[1] -= cols[1] * -factor;
- cols[2] -= cols[2] * -factor;
- }
- return new Color(cols[0], cols[1], cols[2], cols[3]);
+ return org.apache.xmlgraphics.java2d.ColorUtil.lightenColor(col, factor);
}
/**
@@ -711,7 +701,7 @@ public final class ColorUtil {
* @return true if it is a gray value
*/
public static boolean isGray(Color col) {
- return (col.getRed() == col.getBlue() && col.getRed() == col.getGreen());
+ return org.apache.xmlgraphics.java2d.ColorUtil.isGray(col);
}
/**
@@ -720,10 +710,7 @@ public final class ColorUtil {
* @return the CMYK color
*/
public static Color toCMYKGrayColor(float black) {
- float[] cmyk = new float[] {0f, 0f, 0f, 1.0f - black};
- CMYKColorSpace cmykCs = CMYKColorSpace.getInstance();
- float[] rgb = cmykCs.toRGB(cmyk);
- return ColorExt.createFromFoRgbIcc(rgb[0], rgb[1], rgb[2],
- CMYK_PSEUDO_PROFILE, null, cmykCs, cmyk);
+
+ return org.apache.xmlgraphics.java2d.ColorUtil.toCMYKGrayColor(black);
}
}