// Copyright 2002, FreeHEP. package org.freehep.graphics2d; import java.awt.Color; import java.awt.color.ColorSpace; /** * Print color for printing and display in color, grayscale and black/white. * * @author Mark Donszelmann * @version $Id: PrintColor.java,v 1.4 2009-08-17 21:44:44 murkle Exp $ */ @SuppressWarnings("serial") public class PrintColor extends Color { public static final int COLOR = 0; public static final int GRAYSCALE = 1; public static final int BLACK_AND_WHITE = 2; final private static Color[] defaultColors = { Color.RED, Color.GREEN, Color.BLUE, Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.ORANGE, Color.PINK, Color.WHITE, Color.LIGHT_GRAY, Color.GRAY, Color.DARK_GRAY, Color.BLACK }; protected float asGray; protected boolean asBlack; private static void testColorValueRange(float asGray) { boolean rangeError = false; String badComponentString = ""; if (asGray < 0.0f || asGray > 1.0f) { rangeError = true; badComponentString = badComponentString + " asGray"; } if (rangeError == true) { throw new IllegalArgumentException( "PrintColor parameter outside of expected range:" + badComponentString); } } public PrintColor(float red, float green, float blue, float asGray, boolean asBlack) { this(red, green, blue, 1.0f, asGray, asBlack); } public PrintColor(float red, float green, float blue, float alpha, float asGray, boolean asBlack) { super(red, green, blue, alpha); this.asGray = asGray; this.asBlack = asBlack; testColorValueRange(asGray); } public PrintColor(Color color, float asGray, boolean asBlack) { super(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); this.asGray = asGray; this.asBlack = asBlack; testColorValueRange(asGray); } public float getAsGray() { return asGray; } public boolean getAsBlack() { return asBlack; } public PrintColor getColor(int mode) { // FIXME does not handle invisibility switch (mode) { case COLOR: return this; case GRAYSCALE: return new PrintColor(getAsGray(), getAsGray(), getAsGray(), getAlpha() / 255.0f, getAsGray(), getAsBlack()); case BLACK_AND_WHITE: if (getAsBlack()) { return new PrintColor(Color.black, getAsGray(), getAsBlack()); } return new PrintColor(Color.white, getAsGray(), getAsBlack()); default: throw new IllegalArgumentException( "ColorMode on PrintColor out of range: " + mode); } } public static PrintColor createPrintColor(Color color) { if (color instanceof PrintColor) { return (PrintColor) color; } // convert a awt.Color to some reasonable PrintColor. // pure white converts to black, and vice versa. float[] gray = ColorSpace.getInstance(ColorSpace.CS_GRAY) .fromRGB(color.getRGBComponents(null)); if (gray[0] == 0.0f) { gray[0] = 1.0f; } else if (gray[0] == 1.0f) { gray[0] = 0.0f; } return new PrintColor(color, gray[0], !color.equals(Color.black)); } /** * @return a color from the standard java colors */ public static Color getDefaultColor(int index) { if ((index < 0) || (index >= defaultColors.length)) { throw new IllegalArgumentException( "PrintColor.getDefaultColor index outside of expected range: " + index); } return createPrintColor(defaultColors[index]); } // FIXME, should return PrintColor public static Color mixColor(Color c1, Color c2) { int red = (c1.getRed() + c2.getRed()) / 2; int green = (c1.getGreen() + c2.getGreen()) / 2; int blue = (c1.getBlue() + c2.getBlue()) / 2; return new Color(red, green, blue); } @Override public int hashCode() { // FIXME could make something better here return super.hashCode(); } @Override public boolean equals(Object obj) { return super.equals(obj) && obj instanceof PrintColor && ((PrintColor) obj).asGray == this.asGray && ((PrintColor) obj).asBlack == this.asBlack; } @Override public String toString() { return super.toString() + ", asGray: " + asGray + ", asBlack: " + asBlack; } public static PrintColor invert(Color color) { PrintColor printColor = createPrintColor(color); return new PrintColor(new Color(printColor.getRGB() ^ 0x00808080), (printColor.getAsGray() + 0.5f) % 1.0f, !printColor.getAsBlack()); } }