// Copyright 2000, CERN, Geneva, Switzerland and University of Santa Cruz, California, U.S.A.
package org.freehep.graphicsio.ps;

import java.awt.Color;

/**
 *
 * @author Charles Loomis
 * @version $Id: ColorMap.java,v 1.1 2002/07/30 19:11:28 duns Exp $
 */
public class ColorMap {

    final public static int red             = 0;
    final public static int green           = 1;
    final public static int blue            = 2;
    final public static int cyan            = 3;
    final public static int magenta         = 4;
    final public static int yellow          = 5;
    final public static int orange          = 6;
    final public static int pink            = 7;
    final public static int white           = 8;
    final public static int lightGray       = 9;
    final public static int gray            = 10;
    final public static int darkGray        = 11;
    final public static int black           = 12;

    final public static int redAsGray       = 13;
    final public static int greenAsGray     = 14;
    final public static int blueAsGray      = 15;
    final public static int cyanAsGray      = 16;
    final public static int magentaAsGray   = 17;
    final public static int yellowAsGray    = 18;
    final public static int orangeAsGray    = 19;
    final public static int pinkAsGray      = 20;
    final public static int whiteAsGray     = 21;
    final public static int lightGrayAsGray = 22;
    final public static int grayAsGray      = 23;
    final public static int darkGrayAsGray  = 24;
    final public static int blackAsGray     = 25;

    final public static int redInvisible         = 26;
    final public static int greenInvisible       = 27;
    final public static int blueInvisible        = 28;
    final public static int cyanInvisible        = 29;
    final public static int magentaInvisible     = 30;
    final public static int yellowInvisible      = 31;
    final public static int orangeInvisible      = 32;
    final public static int pinkInvisible        = 33;
    final public static int whiteInvisible       = 34;
    final public static int lightGrayInvisible   = 35;
    final public static int grayInvisible        = 36;
    final public static int darkGrayInvisible    = 37;
    final public static int blackInvisible       = 38;

    final public static String[] psColorTag
	= { "Cr", "Cg", "Cb", "Cc", "Cm", "Cy", "Co", "Cp",
	    "Cw", "Cgrl", "Cgr", "Cgrd", "Ck",
	    "CGr", "CGg", "CGb", "CGc", "CGm", "CGy", "CGo", "CGp",
	    "CGw", "CGgrl", "CGgr", "CGgrd", "CGk",
	    "CIr", "CIg", "CIb", "CIc", "CIm", "CIy", "CIo", "CIp",
	    "CIw", "CIgrl", "CIgr", "CIgrd", "CIk"};

    // The "foreground" colors.  They remain true colors within the
    // display and print color maps.  In the grayscale and b&w color
    // maps these always appear as black.
    final protected static MappedColor displayRed =
	new MappedColor(255,0,0,red);
    final protected static MappedColor printRed =
	new MappedColor(255,84,84,red);
    final protected static MappedColor grayRed =
	new MappedColor(0,0,0,red);
    final protected static MappedColor bwRed =
	new MappedColor(0,0,0,red);

    final protected static MappedColor displayGreen =
	new MappedColor(0,255,0,green);
    final protected static MappedColor printGreen =
	new MappedColor(84,255,84,green);
    final protected static MappedColor grayGreen =
	new MappedColor(0,0,0,green);
    final protected static MappedColor bwGreen =
	new MappedColor(0,0,0,green);

    final protected static MappedColor displayBlue =
	new MappedColor(0,0,255,blue);
    final protected static MappedColor printBlue =
	new MappedColor(84,84,255,blue);
    final protected static MappedColor grayBlue =
	new MappedColor(0,0,0,blue);
    final protected static MappedColor bwBlue =
	new MappedColor(0,0,0,blue);

    final protected static MappedColor displayCyan =
	new MappedColor(0,255,255,cyan);
    final protected static MappedColor printCyan =
	new MappedColor(0,255,255,cyan);
    final protected static MappedColor grayCyan =
	new MappedColor(0,0,0,cyan);
    final protected static MappedColor bwCyan =
	new MappedColor(0,0,0,cyan);

    final protected static MappedColor displayMagenta =
	new MappedColor(255,0,255,magenta);
    final protected static MappedColor printMagenta =
	new MappedColor(255,0,255,magenta);
    final protected static MappedColor grayMagenta =
	new MappedColor(0,0,0,magenta);
    final protected static MappedColor bwMagenta =
	new MappedColor(0,0,0,magenta);

    final protected static MappedColor displayYellow =
	new MappedColor(255,255,0,yellow);
    final protected static MappedColor printYellow =
	new MappedColor(255,255,0,yellow);
    final protected static MappedColor grayYellow =
	new MappedColor(0,0,0,yellow);
    final protected static MappedColor bwYellow =
	new MappedColor(0,0,0,yellow);

    final protected static MappedColor displayOrange =
	new MappedColor(255,200,0,orange);
    final protected static MappedColor printOrange =
	new MappedColor(255,200,0,orange);
    final protected static MappedColor grayOrange =
	new MappedColor(0,0,0,orange);
    final protected static MappedColor bwOrange =
	new MappedColor(0,0,0,orange);

    final protected static MappedColor displayPink =
	new MappedColor(255,175,175,pink);
    final protected static MappedColor printPink =
	new MappedColor(255,175,175,pink);
    final protected static MappedColor grayPink =
	new MappedColor(0,0,0,pink);
    final protected static MappedColor bwPink =
	new MappedColor(0,0,0,pink);

    final protected static MappedColor displayWhite =
	new MappedColor(255,255,255,white);
    final protected static MappedColor printWhite =
	new MappedColor(255,255,255,white);
    final protected static MappedColor grayWhite =
	new MappedColor(0,0,0,white);
    final protected static MappedColor bwWhite =
	new MappedColor(0,0,0,white);

    final protected static MappedColor displayLightGray =
	new MappedColor(192,192,192,lightGray);
    final protected static MappedColor printLightGray =
	new MappedColor(192,192,192,lightGray);
    final protected static MappedColor grayLightGray =
	new MappedColor(0,0,0,lightGray);
    final protected static MappedColor bwLightGray =
	new MappedColor(0,0,0,lightGray);

    final protected static MappedColor displayGray =
	new MappedColor(128,128,128,gray);
    final protected static MappedColor printGray =
	new MappedColor(128,128,128,gray);
    final protected static MappedColor grayGray =
	new MappedColor(0,0,0,gray);
    final protected static MappedColor bwGray =
	new MappedColor(0,0,0,gray);

    final protected static MappedColor displayDarkGray =
	new MappedColor(64,64,64,darkGray);
    final protected static MappedColor printDarkGray =
	new MappedColor(64,64,64,darkGray);
    final protected static MappedColor grayDarkGray =
	new MappedColor(0,0,0,darkGray);
    final protected static MappedColor bwDarkGray =
	new MappedColor(0,0,0,darkGray);

    final protected static MappedColor displayBlack =
	new MappedColor(0,0,0,black);
    final protected static MappedColor printBlack =
	new MappedColor(0,0,0,black);
    final protected static MappedColor grayBlack =
	new MappedColor(0,0,0,black);
    final protected static MappedColor bwBlack =
	new MappedColor(0,0,0,black);

    // The "fill" colors.  These retain their colors under the display
    // and print color maps.  Under the grayscale color map, these
    // become light shades of gray.  These become white under the b&w
    // color map.
    final protected static MappedColor displayRedAsGray =
	new MappedColor(255,0,0,redAsGray);
    final protected static MappedColor printRedAsGray =
	new MappedColor(255,84,84,redAsGray);
    final protected static MappedColor grayRedAsGray =
	new MappedColor(192,192,192,redAsGray);
    final protected static MappedColor bwRedAsGray =
	new MappedColor(255,255,255,redAsGray);

    final protected static MappedColor displayGreenAsGray =
	new MappedColor(0,255,0,greenAsGray);
    final protected static MappedColor printGreenAsGray =
	new MappedColor(84,255,84,greenAsGray);
    final protected static MappedColor grayGreenAsGray =
	new MappedColor(255,255,255,greenAsGray);
    final protected static MappedColor bwGreenAsGray =
	new MappedColor(255,255,255,greenAsGray);

    final protected static MappedColor displayBlueAsGray =
	new MappedColor(0,0,255,blueAsGray);
    final protected static MappedColor printBlueAsGray =
	new MappedColor(84,84,255,blueAsGray);
    final protected static MappedColor grayBlueAsGray =
	new MappedColor(128,128,128,blueAsGray);
    final protected static MappedColor bwBlueAsGray =
	new MappedColor(255,255,255,blueAsGray);

    final protected static MappedColor displayCyanAsGray =
	new MappedColor(0,255,255,cyanAsGray);
    final protected static MappedColor printCyanAsGray =
	new MappedColor(0,255,255,cyanAsGray);
    final protected static MappedColor grayCyanAsGray =
	new MappedColor(192,192,192,cyanAsGray);
    final protected static MappedColor bwCyanAsGray =
	new MappedColor(255,255,255,cyanAsGray);

    final protected static MappedColor displayMagentaAsGray =
	new MappedColor(255,0,255,magentaAsGray);
    final protected static MappedColor printMagentaAsGray =
	new MappedColor(255,0,255,magentaAsGray);
    final protected static MappedColor grayMagentaAsGray =
	new MappedColor(128,128,128,magentaAsGray);
    final protected static MappedColor bwMagentaAsGray =
	new MappedColor(255,255,255,magentaAsGray);

    final protected static MappedColor displayYellowAsGray =
	new MappedColor(255,255,0,yellowAsGray);
    final protected static MappedColor printYellowAsGray =
	new MappedColor(255,255,0,yellowAsGray);
    final protected static MappedColor grayYellowAsGray =
	new MappedColor(255,255,255,yellowAsGray);
    final protected static MappedColor bwYellowAsGray =
	new MappedColor(255,255,255,yellowAsGray);

    final protected static MappedColor displayOrangeAsGray =
	new MappedColor(255,200,0,orangeAsGray);
    final protected static MappedColor printOrangeAsGray =
	new MappedColor(255,200,0,orangeAsGray);
    final protected static MappedColor grayOrangeAsGray =
	new MappedColor(192,192,192,orangeAsGray);
    final protected static MappedColor bwOrangeAsGray =
	new MappedColor(255,255,255,orangeAsGray);

    final protected static MappedColor displayPinkAsGray =
	new MappedColor(255,175,175,pinkAsGray);
    final protected static MappedColor printPinkAsGray =
	new MappedColor(255,175,175,pinkAsGray);
    final protected static MappedColor grayPinkAsGray =
	new MappedColor(255,255,255,pinkAsGray);
    final protected static MappedColor bwPinkAsGray =
	new MappedColor(255,255,255,pinkAsGray);

    final protected static MappedColor displayWhiteAsGray =
	new MappedColor(255,255,255,whiteAsGray);
    final protected static MappedColor printWhiteAsGray =
	new MappedColor(255,255,255,whiteAsGray);
    final protected static MappedColor grayWhiteAsGray =
	new MappedColor(0,0,0,whiteAsGray);
    final protected static MappedColor bwWhiteAsGray =
	new MappedColor(0,0,0,whiteAsGray);

    final protected static MappedColor displayLightGrayAsGray =
	new MappedColor(192,192,192,lightGrayAsGray);
    final protected static MappedColor printLightGrayAsGray =
	new MappedColor(192,192,192,lightGrayAsGray);
    final protected static MappedColor grayLightGrayAsGray =
	new MappedColor(64,64,64,lightGrayAsGray);
    final protected static MappedColor bwLightGrayAsGray =
	new MappedColor(255,255,255,lightGrayAsGray);

    final protected static MappedColor displayGrayAsGray =
	new MappedColor(128,128,128,grayAsGray);
    final protected static MappedColor printGrayAsGray =
	new MappedColor(128,128,128,grayAsGray);
    final protected static MappedColor grayGrayAsGray =
	new MappedColor(128,128,128,grayAsGray);
    final protected static MappedColor bwGrayAsGray =
	new MappedColor(255,255,255,grayAsGray);

    final protected static MappedColor displayDarkGrayAsGray =
	new MappedColor(64,64,64,darkGrayAsGray);
    final protected static MappedColor printDarkGrayAsGray =
	new MappedColor(64,64,64,darkGrayAsGray);
    final protected static MappedColor grayDarkGrayAsGray =
	new MappedColor(192,192,192,darkGrayAsGray);
    final protected static MappedColor bwDarkGrayAsGray =
	new MappedColor(255,255,255,darkGrayAsGray);

    final protected static MappedColor displayBlackAsGray =
	new MappedColor(0,0,0,blackAsGray);
    final protected static MappedColor printBlackAsGray =
	new MappedColor(0,0,0,blackAsGray);
    final protected static MappedColor grayBlackAsGray =
	new MappedColor(255,255,255,blackAsGray);
    final protected static MappedColor bwBlackAsGray =
	new MappedColor(255,255,255,blackAsGray);

    // The "background" colors.  These retain their colors under the
    // display and print color maps.  Under the grayscale color map
    // and the b&w color map these are white.
    final protected static MappedColor displayRedInvisible =
	new MappedColor(255,0,0,redInvisible);
    final protected static MappedColor printRedInvisible =
	new MappedColor(255,84,84,redInvisible);
    final protected static MappedColor grayRedInvisible =
	new MappedColor(255,255,255,redInvisible);
    final protected static MappedColor bwRedInvisible =
	new MappedColor(255,255,255,redInvisible);

    final protected static MappedColor displayGreenInvisible =
	new MappedColor(0,255,0,greenInvisible);
    final protected static MappedColor printGreenInvisible =
	new MappedColor(84,255,84,greenInvisible);
    final protected static MappedColor grayGreenInvisible =
	new MappedColor(255,255,255,greenInvisible);
    final protected static MappedColor bwGreenInvisible =
	new MappedColor(255,255,255,greenInvisible);

    final protected static MappedColor displayBlueInvisible =
	new MappedColor(0,0,255,blueInvisible);
    final protected static MappedColor printBlueInvisible =
	new MappedColor(84,84,255,blueInvisible);
    final protected static MappedColor grayBlueInvisible =
	new MappedColor(255,255,255,blueInvisible);
    final protected static MappedColor bwBlueInvisible =
	new MappedColor(255,255,255,blueInvisible);

    final protected static MappedColor displayCyanInvisible =
	new MappedColor(0,255,255,cyanInvisible);
    final protected static MappedColor printCyanInvisible =
	new MappedColor(0,255,255,cyanInvisible);
    final protected static MappedColor grayCyanInvisible =
	new MappedColor(255,255,255,cyanInvisible);
    final protected static MappedColor bwCyanInvisible =
	new MappedColor(255,255,255,cyanInvisible);

    final protected static MappedColor displayMagentaInvisible =
	new MappedColor(255,0,255,magentaInvisible);
    final protected static MappedColor printMagentaInvisible =
	new MappedColor(255,0,255,magentaInvisible);
    final protected static MappedColor grayMagentaInvisible =
	new MappedColor(255,255,255,magentaInvisible);
    final protected static MappedColor bwMagentaInvisible =
	new MappedColor(255,255,255,magentaInvisible);

    final protected static MappedColor displayYellowInvisible =
	new MappedColor(255,255,0,yellowInvisible);
    final protected static MappedColor printYellowInvisible =
	new MappedColor(255,255,0,yellowInvisible);
    final protected static MappedColor grayYellowInvisible =
	new MappedColor(255,255,255,yellowInvisible);
    final protected static MappedColor bwYellowInvisible =
	new MappedColor(255,255,255,yellowInvisible);

    final protected static MappedColor displayOrangeInvisible =
	new MappedColor(255,200,0,orangeInvisible);
    final protected static MappedColor printOrangeInvisible =
	new MappedColor(255,200,0,orangeInvisible);
    final protected static MappedColor grayOrangeInvisible =
	new MappedColor(255,255,255,orangeInvisible);
    final protected static MappedColor bwOrangeInvisible =
	new MappedColor(255,255,255,orangeInvisible);

    final protected static MappedColor displayPinkInvisible =
	new MappedColor(255,175,175,pinkInvisible);
    final protected static MappedColor printPinkInvisible =
	new MappedColor(255,175,175,pinkInvisible);
    final protected static MappedColor grayPinkInvisible =
	new MappedColor(255,255,255,pinkInvisible);
    final protected static MappedColor bwPinkInvisible =
	new MappedColor(255,255,255,pinkInvisible);

    final protected static MappedColor displayWhiteInvisible =
	new MappedColor(255,255,255,whiteInvisible);
    final protected static MappedColor printWhiteInvisible =
	new MappedColor(255,255,255,whiteInvisible);
    final protected static MappedColor grayWhiteInvisible =
	new MappedColor(255,255,255,whiteInvisible);
    final protected static MappedColor bwWhiteInvisible =
	new MappedColor(255,255,255,whiteInvisible);

    final protected static MappedColor displayLightGrayInvisible =
	new MappedColor(192,192,192,lightGrayInvisible);
    final protected static MappedColor printLightGrayInvisible =
	new MappedColor(192,192,192,lightGrayInvisible);
    final protected static MappedColor grayLightGrayInvisible =
	new MappedColor(255,255,255,lightGrayInvisible);
    final protected static MappedColor bwLightGrayInvisible =
	new MappedColor(255,255,255,lightGrayInvisible);

    final protected static MappedColor displayGrayInvisible =
	new MappedColor(128,128,128,grayInvisible);
    final protected static MappedColor printGrayInvisible =
	new MappedColor(128,128,128,grayInvisible);
    final protected static MappedColor grayGrayInvisible =
	new MappedColor(255,255,255,grayInvisible);
    final protected static MappedColor bwGrayInvisible =
	new MappedColor(255,255,255,grayInvisible);

    final protected static MappedColor displayDarkGrayInvisible =
	new MappedColor(64,64,64,darkGrayInvisible);
    final protected static MappedColor printDarkGrayInvisible =
	new MappedColor(64,64,64,darkGrayInvisible);
    final protected static MappedColor grayDarkGrayInvisible =
	new MappedColor(255,255,255,darkGrayInvisible);
    final protected static MappedColor bwDarkGrayInvisible =
	new MappedColor(255,255,255,darkGrayInvisible);

    final protected static MappedColor displayBlackInvisible =
	new MappedColor(0,0,0,blackInvisible);
    final protected static MappedColor printBlackInvisible =
	new MappedColor(0,0,0,blackInvisible);
    final protected static MappedColor grayBlackInvisible =
	new MappedColor(255,255,255,blackInvisible);
    final protected static MappedColor bwBlackInvisible =
	new MappedColor(255,255,255,blackInvisible);


    // Now define the display color map.
    final protected static MappedColor[] displayMap =
    {displayRed, displayGreen, displayBlue,
     displayCyan, displayMagenta, displayYellow,
     displayOrange, displayPink,
     displayWhite, displayLightGray, displayGray,
     displayDarkGray, displayBlack,
     displayRedAsGray, displayGreenAsGray, displayBlueAsGray,
     displayCyanAsGray, displayMagentaAsGray, displayYellowAsGray,
     displayOrangeAsGray, displayPinkAsGray,
     displayWhiteAsGray, displayLightGrayAsGray, displayGrayAsGray,
     displayDarkGrayAsGray, displayBlackAsGray,
     displayRedInvisible, displayGreenInvisible, displayBlueInvisible,
     displayCyanInvisible, displayMagentaInvisible, displayYellowInvisible,
     displayOrangeInvisible, displayPinkInvisible,
     displayWhiteInvisible, displayLightGrayInvisible, displayGrayInvisible,
     displayDarkGrayInvisible, displayBlackInvisible};

    // Now define the print color map.
    final protected static MappedColor[] printMap =
    {printRed, printGreen, printBlue,
     printCyan, printMagenta, printYellow,
     printOrange, printPink,
     printWhite, printLightGray, printGray,
     printDarkGray, printBlack,
     printRedAsGray, printGreenAsGray, printBlueAsGray,
     printCyanAsGray, printMagentaAsGray, printYellowAsGray,
     printOrangeAsGray, printPinkAsGray,
     printWhiteAsGray, printLightGrayAsGray, printGrayAsGray,
     printDarkGrayAsGray, printBlackAsGray,
     printRedInvisible, printGreenInvisible, printBlueInvisible,
     printCyanInvisible, printMagentaInvisible, printYellowInvisible,
     printOrangeInvisible, printPinkInvisible,
     printWhiteInvisible, printLightGrayInvisible, printGrayInvisible,
     printDarkGrayInvisible, printBlackInvisible};

    // Now define the grayscale color map.
    final protected static MappedColor[] grayMap =
    {grayRed, grayGreen, grayBlue,
     grayCyan, grayMagenta, grayYellow,
     grayOrange, grayPink,
     grayWhite, grayLightGray, grayGray,
     grayDarkGray, grayBlack,
     grayRedAsGray, grayGreenAsGray, grayBlueAsGray,
     grayCyanAsGray, grayMagentaAsGray, grayYellowAsGray,
     grayOrangeAsGray, grayPinkAsGray,
     grayWhiteAsGray, grayLightGrayAsGray, grayGrayAsGray,
     grayDarkGrayAsGray, grayBlackAsGray,
     grayRedInvisible, grayGreenInvisible, grayBlueInvisible,
     grayCyanInvisible, grayMagentaInvisible, grayYellowInvisible,
     grayOrangeInvisible, grayPinkInvisible,
     grayWhiteInvisible, grayLightGrayInvisible, grayGrayInvisible,
     grayDarkGrayInvisible, grayBlackInvisible};

    // Now define the black&white color map.
    final protected static MappedColor[] bwMap =
    {bwRed, bwGreen, bwBlue,
     bwCyan, bwMagenta, bwYellow,
     bwOrange, bwPink,
     bwWhite, bwLightGray, bwGray,
     bwDarkGray, bwBlack,
     bwRedAsGray, bwGreenAsGray, bwBlueAsGray,
     bwCyanAsGray, bwMagentaAsGray, bwYellowAsGray,
     bwOrangeAsGray, bwPinkAsGray,
     bwWhiteAsGray, bwLightGrayAsGray, bwGrayAsGray,
     bwDarkGrayAsGray, bwBlackAsGray,
     bwRedInvisible, bwGreenInvisible, bwBlueInvisible,
     bwCyanInvisible, bwMagentaInvisible, bwYellowInvisible,
     bwOrangeInvisible, bwPinkInvisible,
     bwWhiteInvisible, bwLightGrayInvisible, bwGrayInvisible,
     bwDarkGrayInvisible, bwBlackInvisible};

    // The current map references one of the above color maps.
    protected MappedColor[] currentColorMap;

    /**
     * Constructor takes no arguments.  The display color map is the
     * default. */
    public ColorMap() {
	currentColorMap = displayMap;
    }

    /**
     * Change to the display color map. */
    public void useDisplayColorMap() {
	currentColorMap = displayMap;
    }

    /**
     * Change to the print color map. */
    public void usePrintColorMap() {
	currentColorMap = printMap;
    }

    /**
     * Change to the grayscale color map. */
    public void useGrayscaleColorMap() {
	currentColorMap = grayMap;
    }

    /**
     * Change to the black&white color map. */
    public void useBlackAndWhiteColorMap() {
	currentColorMap = bwMap;
    }

    /**
     * Retrieve a mapped color from the color map. */
    public MappedColor getMappedColor(int colorIndex) {
	if (colorIndex<0 && colorIndex>38) {
	    return null;
	} else {
	    return currentColorMap[colorIndex];
	}
    }

    /**
     * Retrieve a mapped color as a Java Color from the color map. */
    public Color getColor(int colorIndex) {
	if (colorIndex<0 && colorIndex>38) {
	    return null;
	} else {
	    return (Color) currentColorMap[colorIndex];
	}
    }

    /**
     * Get a terse tag which describes which color a particular color
     * index represents. */
    public static String getTag(int colorIndex) {
	if (colorIndex<0 && colorIndex>38) {
	    return null;
	} else {
	    return psColorTag[colorIndex];
	}
    }

}
