Fix some properties

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/commons/branches/Temp_Color@1049014 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/xmlgraphics/java2d/color/ColorConverter.java b/src/java/org/apache/xmlgraphics/java2d/color/ColorConverter.java
index 24a06b5..25dc7d6 100644
--- a/src/java/org/apache/xmlgraphics/java2d/color/ColorConverter.java
+++ b/src/java/org/apache/xmlgraphics/java2d/color/ColorConverter.java
@@ -1,36 +1,36 @@
-/*

- * 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.xmlgraphics.java2d.color;

-

-import java.awt.Color;

-

-/**

- * Utility for implementing a color conversion scheme.

- */

-public interface ColorConverter {

-

-    /**

-     * @param color to convert

-    * @return converted color

-    */

-

-    Color convert(Color color);

-

-}

+/*
+ * 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.xmlgraphics.java2d.color;
+
+import java.awt.Color;
+
+/**
+ * Utility for implementing a color conversion scheme.
+ */
+public interface ColorConverter {
+
+    /**
+     * @param color to convert
+    * @return converted color
+    */
+
+    Color convert(Color color);
+
+}
diff --git a/src/java/org/apache/xmlgraphics/java2d/color/ColorUtil.java b/src/java/org/apache/xmlgraphics/java2d/color/ColorUtil.java
index 3b35006..9708d85 100644
--- a/src/java/org/apache/xmlgraphics/java2d/color/ColorUtil.java
+++ b/src/java/org/apache/xmlgraphics/java2d/color/ColorUtil.java
@@ -1,165 +1,165 @@
-/*

- * 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: ColorUtil.java 815938 2009-09-16 19:38:13Z jeremias $ */

-

-package org.apache.xmlgraphics.java2d.color;

-

-import java.awt.Color;

-

-

-/**

- * Generic Color helper class.

- * <p>

- * This class supports parsing string values into color values and creating

- * color values for strings. It provides a list of standard color names.

- */

-public final class ColorUtil {

-

-    /**

-     * Private constructor since this is an utility class.

-     */

-    private ColorUtil() {

-    }

-

-

-    /**

-     * Lightens up a color for groove, ridge, inset and outset border effects.

-     * @param col the color to lighten up

-     * @param factor factor by which to lighten up (negative values darken the color)

-     * @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 ColorWithAlternatives(cols[0], cols[1], cols[2], cols[3], null);

-    }

-

-

-

-    /**

-     * Indicates whether the color is a gray value.

-     * @param col the color

-     * @return true if it is a gray value

-     */

-    public static boolean isGray(Color col) {

-        return (col.getRed() == col.getBlue() && col.getRed() == col.getGreen());

-    }

-

-    /**

-     * Creates an uncalibrated CMYK color with the given gray value.

-     * @param black the gray component (0 - 1)

-     * @return the CMYK color

-     */

-    public static Color toCMYKGrayColor(float black) {

-        //Calculated color components

-        float[] cmyk = new float[] {0f, 0f, 0f, 1.0f - black};

-        //Create native color

-        return DeviceCMYKColorSpace.createCMYKColor(cmyk);

-    }

-

-    /**

-     * Converts an arbitrary {@link Color} to a plain sRGB color doing the conversion at the

-     * best possible conversion quality.

-     * @param col the original color

-     * @return the sRGB equivalent

-     */

-    public static Color toSRGBColor(Color col) {

-        if (col.getColorSpace().isCS_sRGB()) {

-            return col; //Don't convert if already sRGB to avoid conversion differences

-        }

-        float[] comps = col.getColorComponents(null);

-        float[] srgb = col.getColorSpace().toRGB(comps);

-        comps = col.getComponents(null);

-        float alpha = comps[comps.length - 1];

-        return new Color(srgb[0], srgb[1], srgb[2], alpha);

-    }

-

-    /**

-     * Checks if two colors are the same color. This check is much more restrictive than

-     * {@link Color#equals(Object)} in that it doesn't only check if both colors result in the

-     * same sRGB value. For example, if two colors not of the same exact class are compared,

-     * they are treated as not the same.

-     * <p>

-     * Note: At the moment, this method only supports {@link Color} and

-     * {@link ColorWithAlternatives} only. Other subclasses of {@link Color} are checked only using

-     * the {@link Color#equals(Object)} method.

-     * @param col1 the first color

-     * @param col2 the second color

-     * @return true if both colors are the same color

-     */

-    public static boolean isSameColor(Color col1, Color col2) {

-        //Check fallback sRGB values first, then go into details

-        if (!col1.equals(col2)) {

-            return false;

-        }

-

-        //Consider same-ness only between colors of the same class (not subclasses)

-        //but consider a ColorWithAlternatives without alternatives to be the same as a Color.

-        Class<?> cl1 = col1.getClass();

-        if (col1 instanceof ColorWithAlternatives

-                && !((ColorWithAlternatives) col1).hasAlternativeColors()) {

-            cl1 = Color.class;

-        }

-        Class<?> cl2 = col2.getClass();

-        if (col2 instanceof ColorWithAlternatives

-                && !((ColorWithAlternatives) col2).hasAlternativeColors()) {

-            cl2 = Color.class;

-        }

-        if (cl1 != cl2) {

-            return false;

-        }

-

-        //Check color space

-        if (!col1.getColorSpace().equals(col2.getColorSpace())) {

-            return false;

-        }

-

-        //Check native components

-        float[] comps1 = col1.getComponents(null);

-        float[] comps2 = col2.getComponents(null);

-        if (comps1.length != comps2.length) {

-            return false;

-        }

-        for (int i = 0, c = comps1.length; i < c; i++) {

-            if (comps1[i] != comps2[i]) {

-                return false;

-            }

-        }

-

-        //Compare alternative colors, order is relevant

-        if (col1 instanceof ColorWithAlternatives && col2 instanceof ColorWithAlternatives) {

-            ColorWithAlternatives ca1 = (ColorWithAlternatives) col1;

-            ColorWithAlternatives ca2 = (ColorWithAlternatives) col2;

-            return ca1.hasSameAlternativeColors(ca2);

-        }

-

-        return true;

-    }

-

-}

+/*
+ * 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.xmlgraphics.java2d.color;
+
+import java.awt.Color;
+
+
+/**
+ * Generic Color helper class.
+ * <p>
+ * This class supports parsing string values into color values and creating
+ * color values for strings. It provides a list of standard color names.
+ */
+public final class ColorUtil {
+
+    /**
+     * Private constructor since this is an utility class.
+     */
+    private ColorUtil() {
+    }
+
+
+    /**
+     * Lightens up a color for groove, ridge, inset and outset border effects.
+     * @param col the color to lighten up
+     * @param factor factor by which to lighten up (negative values darken the color)
+     * @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 ColorWithAlternatives(cols[0], cols[1], cols[2], cols[3], null);
+    }
+
+
+
+    /**
+     * Indicates whether the color is a gray value.
+     * @param col the color
+     * @return true if it is a gray value
+     */
+    public static boolean isGray(Color col) {
+        return (col.getRed() == col.getBlue() && col.getRed() == col.getGreen());
+    }
+
+    /**
+     * Creates an uncalibrated CMYK color with the given gray value.
+     * @param black the gray component (0 - 1)
+     * @return the CMYK color
+     */
+    public static Color toCMYKGrayColor(float black) {
+        //Calculated color components
+        float[] cmyk = new float[] {0f, 0f, 0f, 1.0f - black};
+        //Create native color
+        return DeviceCMYKColorSpace.createCMYKColor(cmyk);
+    }
+
+    /**
+     * Converts an arbitrary {@link Color} to a plain sRGB color doing the conversion at the
+     * best possible conversion quality.
+     * @param col the original color
+     * @return the sRGB equivalent
+     */
+    public static Color toSRGBColor(Color col) {
+        if (col.getColorSpace().isCS_sRGB()) {
+            return col; //Don't convert if already sRGB to avoid conversion differences
+        }
+        float[] comps = col.getColorComponents(null);
+        float[] srgb = col.getColorSpace().toRGB(comps);
+        comps = col.getComponents(null);
+        float alpha = comps[comps.length - 1];
+        return new Color(srgb[0], srgb[1], srgb[2], alpha);
+    }
+
+    /**
+     * Checks if two colors are the same color. This check is much more restrictive than
+     * {@link Color#equals(Object)} in that it doesn't only check if both colors result in the
+     * same sRGB value. For example, if two colors not of the same exact class are compared,
+     * they are treated as not the same.
+     * <p>
+     * Note: At the moment, this method only supports {@link Color} and
+     * {@link ColorWithAlternatives} only. Other subclasses of {@link Color} are checked only using
+     * the {@link Color#equals(Object)} method.
+     * @param col1 the first color
+     * @param col2 the second color
+     * @return true if both colors are the same color
+     */
+    public static boolean isSameColor(Color col1, Color col2) {
+        //Check fallback sRGB values first, then go into details
+        if (!col1.equals(col2)) {
+            return false;
+        }
+
+        //Consider same-ness only between colors of the same class (not subclasses)
+        //but consider a ColorWithAlternatives without alternatives to be the same as a Color.
+        Class<?> cl1 = col1.getClass();
+        if (col1 instanceof ColorWithAlternatives
+                && !((ColorWithAlternatives) col1).hasAlternativeColors()) {
+            cl1 = Color.class;
+        }
+        Class<?> cl2 = col2.getClass();
+        if (col2 instanceof ColorWithAlternatives
+                && !((ColorWithAlternatives) col2).hasAlternativeColors()) {
+            cl2 = Color.class;
+        }
+        if (cl1 != cl2) {
+            return false;
+        }
+
+        //Check color space
+        if (!col1.getColorSpace().equals(col2.getColorSpace())) {
+            return false;
+        }
+
+        //Check native components
+        float[] comps1 = col1.getComponents(null);
+        float[] comps2 = col2.getComponents(null);
+        if (comps1.length != comps2.length) {
+            return false;
+        }
+        for (int i = 0, c = comps1.length; i < c; i++) {
+            if (comps1[i] != comps2[i]) {
+                return false;
+            }
+        }
+
+        //Compare alternative colors, order is relevant
+        if (col1 instanceof ColorWithAlternatives && col2 instanceof ColorWithAlternatives) {
+            ColorWithAlternatives ca1 = (ColorWithAlternatives) col1;
+            ColorWithAlternatives ca2 = (ColorWithAlternatives) col2;
+            return ca1.hasSameAlternativeColors(ca2);
+        }
+
+        return true;
+    }
+
+}
diff --git a/src/java/org/apache/xmlgraphics/java2d/color/ColorWithAlternatives.java b/src/java/org/apache/xmlgraphics/java2d/color/ColorWithAlternatives.java
index ea945d5..4f4d0d1 100644
--- a/src/java/org/apache/xmlgraphics/java2d/color/ColorWithAlternatives.java
+++ b/src/java/org/apache/xmlgraphics/java2d/color/ColorWithAlternatives.java
@@ -1,212 +1,212 @@
-/*

- * 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: ColorExt.java 884117 2009-11-25 14:42:48Z jeremias $ */

-

-package org.apache.xmlgraphics.java2d.color;

-

-import java.awt.Color;

-import java.awt.color.ColorSpace;

-

-/**

- * Extended {@link Color} class allowing to specify a prioritized list of alternative colors.

- * The alternative colors shall be the ones that are preferred if an output format supports them.

- * This is normally used for passing device-specific colors through to the output format.

- * <p>

- * This class only adds a single reference to a color array which should not increase memory

- * consumption by much if no alternative colors are specified.

- * <p>

- * <b>Important:</b> Due to a flaw in {@link Color#equals(Object)}, the <code>equals()</code>

- * method should not be used to compare two colors, especially when used to update the current

- * color for some output format. {@link Color} only takes the sRGB values into account but not

- * more the advanced facets of this class. Use {@link ColorUtil#isSameColor(Color, Color)} for

- * such a check.

- */

-public class ColorWithAlternatives extends Color {

-

-    private static final long serialVersionUID = -6125884937776779150L;

-

-    private Color[] alternativeColors;

-

-    /**

-     * Constructor for RGBA colors.

-     * @param r the red component

-     * @param g the green component

-     * @param b the blue component

-     * @param a the alpha component

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(float, float, float, float)

-     */

-    public ColorWithAlternatives(float r, float g, float b, float a, Color[] alternativeColors) {

-        super(r, g, b, a);

-        initAlternativeColors(alternativeColors);

-    }

-

-    /**

-     * Constructor for RGB colors.

-     * @param r the red component

-     * @param g the green component

-     * @param b the blue component

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(float, float, float)

-     */

-    public ColorWithAlternatives(float r, float g, float b, Color[] alternativeColors) {

-        super(r, g, b);

-        initAlternativeColors(alternativeColors);

-    }

-

-    /**

-     * Constructor for RGBA colors.

-     * @param rgba the combined RGBA value

-     * @param hasalpha true if the alpha bits are valid, false otherwise

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(int, boolean)

-     */

-    public ColorWithAlternatives(int rgba, boolean hasalpha, Color[] alternativeColors) {

-        super(rgba, hasalpha);

-        initAlternativeColors(alternativeColors);

-    }

-

-    /**

-     * Constructor for RGBA colors.

-     * @param r the red component

-     * @param g the green component

-     * @param b the blue component

-     * @param a the alpha component

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(int, int, int, int)

-     */

-    public ColorWithAlternatives(int r, int g, int b, int a, Color[] alternativeColors) {

-        super(r, g, b, a);

-        initAlternativeColors(alternativeColors);

-    }

-

-    /**

-     * Constructor for RGB colors.

-     * @param r the red component

-     * @param g the green component

-     * @param b the blue component

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(int, int, int)

-     */

-    public ColorWithAlternatives(int r, int g, int b, Color[] alternativeColors) {

-        super(r, g, b);

-        initAlternativeColors(alternativeColors);

-    }

-

-    /**

-     * Constructor for RGB colors.

-     * @param rgb the combined RGB components

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(int)

-     */

-    public ColorWithAlternatives(int rgb, Color[] alternativeColors) {

-        super(rgb);

-        initAlternativeColors(alternativeColors);

-    }

-

-    /**

-     * Constructor for colors with an arbitrary color space.

-     * @param cspace the color space

-     * @param components the color components

-     * @param alpha the alpha component

-     * @param alternativeColors the prioritized list of alternative colors.

-     * @see Color#Color(ColorSpace, float[], float)

-     */

-    public ColorWithAlternatives(ColorSpace cspace, float[] components, float alpha,

-            Color[] alternativeColors) {

-        super(cspace, components, alpha);

-        initAlternativeColors(alternativeColors);

-    }

-

-    private void initAlternativeColors(Color[] colors) {

-        if (colors != null) {

-            //Colors are immutable but array are not, so copy

-            this.alternativeColors = new Color[colors.length];

-            System.arraycopy(colors, 0, this.alternativeColors, 0, colors.length);

-        }

-    }

-

-    /**

-     * Returns the list of alternative colors. An empty array will be returned if no alternative

-     * colors are available.

-     * @return the list of alternative colors

-     */

-    public Color[] getAlternativeColors() {

-        if (this.alternativeColors != null) {

-            Color[] cols = new Color[this.alternativeColors.length];

-            System.arraycopy(this.alternativeColors, 0, cols, 0, this.alternativeColors.length);

-            return cols;

-        } else {

-            return new Color[0];

-        }

-    }

-

-    /**

-     * Indicates whether alternative colors are available.

-     * @return true if alternative colors are available.

-     */

-    public boolean hasAlternativeColors() {

-        return this.alternativeColors != null && this.alternativeColors.length > 0;

-    }

-

-    /**

-     * Indicates whether another instance has the same alternative colors.

-     * @param col the color to compare the alternatives to

-     * @return true if the same alternative colors are present

-     */

-    public boolean hasSameAlternativeColors(ColorWithAlternatives col) {

-        if (!hasAlternativeColors()) {

-            return !col.hasAlternativeColors();

-        }

-        // this.hasAlternativeColors()

-        if (!col.hasAlternativeColors()) {

-            return false;

-        }

-        // this.hasAlternativeColors() && col.hasAlternativeColors()

-        Color[] alt1 = getAlternativeColors();

-        Color[] alt2 = col.getAlternativeColors();

-        if (alt1.length != alt2.length) {

-            return false;

-        }

-        for (int i = 0, c = alt1.length; i < c; i++) {

-            Color c1 = alt1[i];

-            Color c2 = alt2[i];

-            if (!ColorUtil.isSameColor(c1, c2)) {

-                return false;

-            }

-        }

-        return true;

-    }

-

-    /**

-     * Returns the first alternative color found with the given color space type.

-     * @param colorSpaceType the color space type ({@link ColorSpace}.TYPE_*).

-     * @return the requested alternative color or null, if no match was found

-     */

-    public Color getFirstAlternativeOfType(int colorSpaceType) {

-        if (hasAlternativeColors()) {

-            for (int i = 0, c = this.alternativeColors.length; i < c; i++) {

-                if (this.alternativeColors[i].getColorSpace().getType() == colorSpaceType) {

-                    return this.alternativeColors[i];

-                }

-            }

-        }

-        return null;

-    }

-

-}

+/*
+ * 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.xmlgraphics.java2d.color;
+
+import java.awt.Color;
+import java.awt.color.ColorSpace;
+
+/**
+ * Extended {@link Color} class allowing to specify a prioritized list of alternative colors.
+ * The alternative colors shall be the ones that are preferred if an output format supports them.
+ * This is normally used for passing device-specific colors through to the output format.
+ * <p>
+ * This class only adds a single reference to a color array which should not increase memory
+ * consumption by much if no alternative colors are specified.
+ * <p>
+ * <b>Important:</b> Due to a flaw in {@link Color#equals(Object)}, the <code>equals()</code>
+ * method should not be used to compare two colors, especially when used to update the current
+ * color for some output format. {@link Color} only takes the sRGB values into account but not
+ * more the advanced facets of this class. Use {@link ColorUtil#isSameColor(Color, Color)} for
+ * such a check.
+ */
+public class ColorWithAlternatives extends Color {
+
+    private static final long serialVersionUID = -6125884937776779150L;
+
+    private Color[] alternativeColors;
+
+    /**
+     * Constructor for RGBA colors.
+     * @param r the red component
+     * @param g the green component
+     * @param b the blue component
+     * @param a the alpha component
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(float, float, float, float)
+     */
+    public ColorWithAlternatives(float r, float g, float b, float a, Color[] alternativeColors) {
+        super(r, g, b, a);
+        initAlternativeColors(alternativeColors);
+    }
+
+    /**
+     * Constructor for RGB colors.
+     * @param r the red component
+     * @param g the green component
+     * @param b the blue component
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(float, float, float)
+     */
+    public ColorWithAlternatives(float r, float g, float b, Color[] alternativeColors) {
+        super(r, g, b);
+        initAlternativeColors(alternativeColors);
+    }
+
+    /**
+     * Constructor for RGBA colors.
+     * @param rgba the combined RGBA value
+     * @param hasalpha true if the alpha bits are valid, false otherwise
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(int, boolean)
+     */
+    public ColorWithAlternatives(int rgba, boolean hasalpha, Color[] alternativeColors) {
+        super(rgba, hasalpha);
+        initAlternativeColors(alternativeColors);
+    }
+
+    /**
+     * Constructor for RGBA colors.
+     * @param r the red component
+     * @param g the green component
+     * @param b the blue component
+     * @param a the alpha component
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(int, int, int, int)
+     */
+    public ColorWithAlternatives(int r, int g, int b, int a, Color[] alternativeColors) {
+        super(r, g, b, a);
+        initAlternativeColors(alternativeColors);
+    }
+
+    /**
+     * Constructor for RGB colors.
+     * @param r the red component
+     * @param g the green component
+     * @param b the blue component
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(int, int, int)
+     */
+    public ColorWithAlternatives(int r, int g, int b, Color[] alternativeColors) {
+        super(r, g, b);
+        initAlternativeColors(alternativeColors);
+    }
+
+    /**
+     * Constructor for RGB colors.
+     * @param rgb the combined RGB components
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(int)
+     */
+    public ColorWithAlternatives(int rgb, Color[] alternativeColors) {
+        super(rgb);
+        initAlternativeColors(alternativeColors);
+    }
+
+    /**
+     * Constructor for colors with an arbitrary color space.
+     * @param cspace the color space
+     * @param components the color components
+     * @param alpha the alpha component
+     * @param alternativeColors the prioritized list of alternative colors.
+     * @see Color#Color(ColorSpace, float[], float)
+     */
+    public ColorWithAlternatives(ColorSpace cspace, float[] components, float alpha,
+            Color[] alternativeColors) {
+        super(cspace, components, alpha);
+        initAlternativeColors(alternativeColors);
+    }
+
+    private void initAlternativeColors(Color[] colors) {
+        if (colors != null) {
+            //Colors are immutable but array are not, so copy
+            this.alternativeColors = new Color[colors.length];
+            System.arraycopy(colors, 0, this.alternativeColors, 0, colors.length);
+        }
+    }
+
+    /**
+     * Returns the list of alternative colors. An empty array will be returned if no alternative
+     * colors are available.
+     * @return the list of alternative colors
+     */
+    public Color[] getAlternativeColors() {
+        if (this.alternativeColors != null) {
+            Color[] cols = new Color[this.alternativeColors.length];
+            System.arraycopy(this.alternativeColors, 0, cols, 0, this.alternativeColors.length);
+            return cols;
+        } else {
+            return new Color[0];
+        }
+    }
+
+    /**
+     * Indicates whether alternative colors are available.
+     * @return true if alternative colors are available.
+     */
+    public boolean hasAlternativeColors() {
+        return this.alternativeColors != null && this.alternativeColors.length > 0;
+    }
+
+    /**
+     * Indicates whether another instance has the same alternative colors.
+     * @param col the color to compare the alternatives to
+     * @return true if the same alternative colors are present
+     */
+    public boolean hasSameAlternativeColors(ColorWithAlternatives col) {
+        if (!hasAlternativeColors()) {
+            return !col.hasAlternativeColors();
+        }
+        // this.hasAlternativeColors()
+        if (!col.hasAlternativeColors()) {
+            return false;
+        }
+        // this.hasAlternativeColors() && col.hasAlternativeColors()
+        Color[] alt1 = getAlternativeColors();
+        Color[] alt2 = col.getAlternativeColors();
+        if (alt1.length != alt2.length) {
+            return false;
+        }
+        for (int i = 0, c = alt1.length; i < c; i++) {
+            Color c1 = alt1[i];
+            Color c2 = alt2[i];
+            if (!ColorUtil.isSameColor(c1, c2)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Returns the first alternative color found with the given color space type.
+     * @param colorSpaceType the color space type ({@link ColorSpace}.TYPE_*).
+     * @return the requested alternative color or null, if no match was found
+     */
+    public Color getFirstAlternativeOfType(int colorSpaceType) {
+        if (hasAlternativeColors()) {
+            for (int i = 0, c = this.alternativeColors.length; i < c; i++) {
+                if (this.alternativeColors[i].getColorSpace().getType() == colorSpaceType) {
+                    return this.alternativeColors[i];
+                }
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/test/java/org/apache/xmlgraphics/xmp/XMPPropertyTest.java b/test/java/org/apache/xmlgraphics/xmp/XMPPropertyTest.java
index 8c87546..27bfa78 100644
--- a/test/java/org/apache/xmlgraphics/xmp/XMPPropertyTest.java
+++ b/test/java/org/apache/xmlgraphics/xmp/XMPPropertyTest.java
@@ -1,186 +1,186 @@
-/*

- * 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.xmlgraphics.xmp;

-

-import java.io.StringWriter;

-import java.util.Arrays;

-import java.util.Calendar;

-import java.util.Date;

-import java.util.Locale;

-import java.util.Set;

-import java.util.TimeZone;

-

-import javax.xml.transform.stream.StreamResult;

-import javax.xml.transform.stream.StreamSource;

-

-import junit.framework.TestCase;

-

-import org.apache.xmlgraphics.util.QName;

-import org.apache.xmlgraphics.xmp.schemas.DublinCoreAdapter;

-import org.apache.xmlgraphics.xmp.schemas.DublinCoreSchema;

-import org.apache.xmlgraphics.xmp.schemas.XMPBasicAdapter;

-import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema;

-

-/**

- * Tests property access methods.

- */

-public class XMPPropertyTest extends TestCase {

-

-    public void testPropertyAccess() throws Exception {

-        Metadata xmp = new Metadata();

-        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);

-        assertNull(dc.getContributors());

-

-        dc.addContributor("Contributor1");

-        assertEquals(1, dc.getContributors().length);

-        assertEquals("Contributor1", dc.getContributors()[0]);

-        dc.removeContributor("Contributor1");

-        assertNull(dc.getContributors());

-

-        dc.addContributor("Contributor1");

-        assertEquals(1, dc.getContributors().length);

-        dc.addContributor("Contributor2");

-        assertEquals(2, dc.getContributors().length);

-        assertFalse(dc.removeContributor("DoesNotExist"));

-        assertTrue(dc.removeContributor("Contributor1"));

-        assertEquals(1, dc.getContributors().length);

-        assertTrue(dc.removeContributor("Contributor2"));

-        assertFalse(dc.removeContributor("Contributor2"));

-        assertNull(dc.getContributors());

-    }

-

-    public void testPropertyRemovalLangAlt() throws Exception {

-        Metadata xmp = new Metadata();

-        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);

-

-        //dc:title is a "Lang Alt"

-        dc.setTitle("en", "The title");

-        String title = dc.removeTitle("en");

-        assertEquals("The title", title);

-        dc.setTitle("en", "The title");

-        dc.setTitle("de", "Der Titel");

-        title = dc.removeTitle("en");

-        assertEquals("The title", title);

-        title = dc.removeTitle("en");

-        assertNull(title);

-

-        title = dc.removeTitle("de");

-        assertEquals("Der Titel", title);

-        title = dc.removeTitle("de");

-        assertNull(title);

-    }

-

-    public void testReplaceLangAlt() throws Exception {

-        Metadata xmp = new Metadata();

-        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);

-        dc.setTitle("Default title");

-        StringWriter writer = new StringWriter();

-        XMPSerializer.writeXML(xmp, new StreamResult(writer));

-        String xmpString = writer.toString();

-        xmp = XMPParser.parseXMP(new StreamSource(new java.io.StringReader(xmpString)));

-        dc = DublinCoreSchema.getAdapter(xmp);

-        assertEquals("Default title", dc.getTitle());

-        dc.setTitle("Updated title");

-        XMPProperty prop = xmp.getProperty(new QName(DublinCoreSchema.NAMESPACE, "title"));

-        XMPArray array = prop.getArrayValue();

-        assertNotNull(array);

-        //Check that only one title is present. There used to be a bug that didn't set the

-        //non-qualified value equal to the value qualified with "x-default".

-        assertEquals(1, array.getSize());

-        assertEquals("Updated title", array.getValue(0));

-    }

-

-    public void testPropertyValues() throws Exception {

-        Metadata xmp = new Metadata();

-        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);

-

-        String format = dc.getFormat();

-        assertNull(format);

-

-        dc.setFormat("application/pdf");

-        format = dc.getFormat();

-        assertEquals("application/pdf", format);

-

-        dc.setFormat("image/jpeg");

-        format = dc.getFormat();

-        assertEquals("image/jpeg", format);

-

-        dc.setFormat(null);

-        format = dc.getFormat();

-        assertNull(format);

-

-        dc.setFormat(""); //Empty string same as null value

-        format = dc.getFormat();

-        assertNull(format);

-

-        dc.setTitle("title");

-        String title = dc.getTitle();

-        assertEquals("title", title);

-

-        dc.setTitle("Titel");

-        title = dc.getTitle();

-        assertEquals("Titel", title);

-

-        dc.setTitle(null);

-        title = dc.getTitle();

-        assertNull(title);

-

-        dc.setTitle("");

-        title = dc.getTitle();

-        assertNull(title);

-    }

-

-    public void testDates() throws Exception {

-        Metadata xmp = new Metadata();

-        XMPBasicAdapter basic = XMPBasicSchema.getAdapter(xmp);

-

-        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.ENGLISH);

-        cal.set(2008, Calendar.FEBRUARY, 07, 15, 11, 07);

-        cal.set(Calendar.MILLISECOND, 0);

-        Date dt = cal.getTime();

-

-        assertNull(basic.getCreateDate());

-        basic.setCreateDate(dt);

-        Date dt2 = basic.getCreateDate();

-        assertEquals(dt2, dt);

-    }

-

-    public void testQualifiers() throws Exception {

-        Metadata xmp = new Metadata();

-        XMPBasicAdapter basic = XMPBasicSchema.getAdapter(xmp);

-

-        basic.addIdentifier("x123");

-        basic.setIdentifier("id1", "system1");

-        basic.setIdentifier("12345", "system2");

-

-        String[] ids = basic.getIdentifiers();

-        assertEquals(3, ids.length);

-        Set set = new java.util.HashSet(Arrays.asList(ids));

-        assertTrue(set.contains("x123"));

-        assertTrue(set.contains("id1"));

-        assertTrue(set.contains("12345"));

-

-        assertEquals("id1", basic.getIdentifier("system1"));

-        basic.setIdentifier("id2", "system1");

-        assertEquals("id2", basic.getIdentifier("system1"));

-        assertEquals(3, basic.getIdentifiers().length);

-    }

-

-}

+/*
+ * 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.xmlgraphics.xmp;
+
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Set;
+import java.util.TimeZone;
+
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.apache.xmlgraphics.util.QName;
+import org.apache.xmlgraphics.xmp.schemas.DublinCoreAdapter;
+import org.apache.xmlgraphics.xmp.schemas.DublinCoreSchema;
+import org.apache.xmlgraphics.xmp.schemas.XMPBasicAdapter;
+import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema;
+
+/**
+ * Tests property access methods.
+ */
+public class XMPPropertyTest extends TestCase {
+
+    public void testPropertyAccess() throws Exception {
+        Metadata xmp = new Metadata();
+        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);
+        assertNull(dc.getContributors());
+
+        dc.addContributor("Contributor1");
+        assertEquals(1, dc.getContributors().length);
+        assertEquals("Contributor1", dc.getContributors()[0]);
+        dc.removeContributor("Contributor1");
+        assertNull(dc.getContributors());
+
+        dc.addContributor("Contributor1");
+        assertEquals(1, dc.getContributors().length);
+        dc.addContributor("Contributor2");
+        assertEquals(2, dc.getContributors().length);
+        assertFalse(dc.removeContributor("DoesNotExist"));
+        assertTrue(dc.removeContributor("Contributor1"));
+        assertEquals(1, dc.getContributors().length);
+        assertTrue(dc.removeContributor("Contributor2"));
+        assertFalse(dc.removeContributor("Contributor2"));
+        assertNull(dc.getContributors());
+    }
+
+    public void testPropertyRemovalLangAlt() throws Exception {
+        Metadata xmp = new Metadata();
+        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);
+
+        //dc:title is a "Lang Alt"
+        dc.setTitle("en", "The title");
+        String title = dc.removeTitle("en");
+        assertEquals("The title", title);
+        dc.setTitle("en", "The title");
+        dc.setTitle("de", "Der Titel");
+        title = dc.removeTitle("en");
+        assertEquals("The title", title);
+        title = dc.removeTitle("en");
+        assertNull(title);
+
+        title = dc.removeTitle("de");
+        assertEquals("Der Titel", title);
+        title = dc.removeTitle("de");
+        assertNull(title);
+    }
+
+    public void testReplaceLangAlt() throws Exception {
+        Metadata xmp = new Metadata();
+        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);
+        dc.setTitle("Default title");
+        StringWriter writer = new StringWriter();
+        XMPSerializer.writeXML(xmp, new StreamResult(writer));
+        String xmpString = writer.toString();
+        xmp = XMPParser.parseXMP(new StreamSource(new java.io.StringReader(xmpString)));
+        dc = DublinCoreSchema.getAdapter(xmp);
+        assertEquals("Default title", dc.getTitle());
+        dc.setTitle("Updated title");
+        XMPProperty prop = xmp.getProperty(new QName(DublinCoreSchema.NAMESPACE, "title"));
+        XMPArray array = prop.getArrayValue();
+        assertNotNull(array);
+        //Check that only one title is present. There used to be a bug that didn't set the
+        //non-qualified value equal to the value qualified with "x-default".
+        assertEquals(1, array.getSize());
+        assertEquals("Updated title", array.getValue(0));
+    }
+
+    public void testPropertyValues() throws Exception {
+        Metadata xmp = new Metadata();
+        DublinCoreAdapter dc = DublinCoreSchema.getAdapter(xmp);
+
+        String format = dc.getFormat();
+        assertNull(format);
+
+        dc.setFormat("application/pdf");
+        format = dc.getFormat();
+        assertEquals("application/pdf", format);
+
+        dc.setFormat("image/jpeg");
+        format = dc.getFormat();
+        assertEquals("image/jpeg", format);
+
+        dc.setFormat(null);
+        format = dc.getFormat();
+        assertNull(format);
+
+        dc.setFormat(""); //Empty string same as null value
+        format = dc.getFormat();
+        assertNull(format);
+
+        dc.setTitle("title");
+        String title = dc.getTitle();
+        assertEquals("title", title);
+
+        dc.setTitle("Titel");
+        title = dc.getTitle();
+        assertEquals("Titel", title);
+
+        dc.setTitle(null);
+        title = dc.getTitle();
+        assertNull(title);
+
+        dc.setTitle("");
+        title = dc.getTitle();
+        assertNull(title);
+    }
+
+    public void testDates() throws Exception {
+        Metadata xmp = new Metadata();
+        XMPBasicAdapter basic = XMPBasicSchema.getAdapter(xmp);
+
+        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.ENGLISH);
+        cal.set(2008, Calendar.FEBRUARY, 07, 15, 11, 07);
+        cal.set(Calendar.MILLISECOND, 0);
+        Date dt = cal.getTime();
+
+        assertNull(basic.getCreateDate());
+        basic.setCreateDate(dt);
+        Date dt2 = basic.getCreateDate();
+        assertEquals(dt2, dt);
+    }
+
+    public void testQualifiers() throws Exception {
+        Metadata xmp = new Metadata();
+        XMPBasicAdapter basic = XMPBasicSchema.getAdapter(xmp);
+
+        basic.addIdentifier("x123");
+        basic.setIdentifier("id1", "system1");
+        basic.setIdentifier("12345", "system2");
+
+        String[] ids = basic.getIdentifiers();
+        assertEquals(3, ids.length);
+        Set set = new java.util.HashSet(Arrays.asList(ids));
+        assertTrue(set.contains("x123"));
+        assertTrue(set.contains("id1"));
+        assertTrue(set.contains("12345"));
+
+        assertEquals("id1", basic.getIdentifier("system1"));
+        basic.setIdentifier("id2", "system1");
+        assertEquals("id2", basic.getIdentifier("system1"));
+        assertEquals(3, basic.getIdentifiers().length);
+    }
+
+}