package jas2.plot;

import jas2.hist.JASHist2DHistogramStyle;
import java.awt.Color;

/**
 *
 * @author The FreeHEP team @ SLAC.
 *
 */
public class ColorMap {
    
    private JASHist2DHistogramStyle style;
    
    public ColorMap(JASHist2DHistogramStyle style) {
        this.style = style;
    }
    
    public Color getColor(double value) {
        int colorMode = style.getColorMapScheme();
        
        int Red;
        int Green;
        int Blue;
        Color tempColor;
        
        if (colorMode == 0) //warm
        {
            if (value <= 0) {
                return new Color(255, 0, 0);
            } else if (value >= 1) {
                return new Color(255, 255, 0);
            } else {
                return new Color(255, 155 + (int) (100 * value), 0);
            }
        } else if (colorMode == 1) { //cool
            if (value <= 0) {
                return new Color(0, 0, 255);
            } else if (value >= 1) {
                return new Color(0, 255, 255);
            } else {
                return new Color(0, 155 + (int) (100 * value), 255);
            }
        } else if (colorMode == 2) { //thermal
            if (value <= 0) {
                return new Color(0, 0, 0);
            } else if (value >= 1) {
                return new Color(255, 0, 0);
            } else {
                return new Color(155 + (int) (100 * value), 0, 0);
            }
        } else if (colorMode == 3) { 
            return getRainbowColor(value,1);
        } else if (colorMode == 4) { //GrayScale
            if (value <= 0) {
                return new Color(0, 0, 0);
            } else if (value >= 1) {
                return new Color(255, 255, 255);
            } else {
                return new Color(155 + (int) (100 * value), 155 + (int) (100 * value), 155 + (int) (100 * value));
            }
        } else { //User Defined
            ///////////Calculate Red Values///////////
            if (style.getStartDataColor().getRed() > style.getEndDataColor().getRed()) {
                Red = style.getStartDataColor().getRed() - (int) ((style.getStartDataColor().getRed() - style.getEndDataColor().getRed()) * value);
            } else if (style.getStartDataColor().getRed() < style.getEndDataColor().getRed()) {
                Red = style.getStartDataColor().getRed() + (int) ((style.getEndDataColor().getRed() - style.getStartDataColor().getRed()) * value);
            } else {
                Red = style.getStartDataColor().getRed();
            }
            
            ///////////Calculate Green Values///////////
            if (style.getStartDataColor().getGreen() > style.getEndDataColor().getGreen()) {
                Green = style.getStartDataColor().getGreen() - (int) ((style.getStartDataColor().getGreen() - style.getEndDataColor().getGreen()) * value);
            } else if (style.getStartDataColor().getGreen() < style.getEndDataColor().getGreen()) {
                Green = style.getStartDataColor().getGreen() + (int) ((style.getEndDataColor().getGreen() - style.getStartDataColor().getGreen()) * value);
            } else {
                Green = style.getStartDataColor().getGreen();
            }
            
            ///////////Calculate Blue Values///////////
            if (style.getStartDataColor().getBlue() > style.getEndDataColor().getBlue()) {
                Blue = style.getStartDataColor().getBlue() - (int) ((style.getStartDataColor().getBlue() - style.getEndDataColor().getBlue()) * value);
            } else if (style.getStartDataColor().getBlue() < style.getEndDataColor().getBlue()) {
                Blue = style.getStartDataColor().getBlue() + (int) ((style.getEndDataColor().getBlue() - style.getStartDataColor().getBlue()) * value);
            } else {
                Blue = style.getStartDataColor().getBlue();
            }
            
            if (value <= 0) {
                return style.getStartDataColor();
            } else if (value >= 1) {
                return style.getEndDataColor();
            } else {
                return new Color(Red, Green, Blue);
            }
        }
        //UserDefined
    }
    //getHistColor
    
    
    /** The red values. */
    
    private final static int[] red =
    { 120, 115, 111, 106, 102,  97,  93,  88,  84,  79,  75,  70,  66,  61,
      57,  52,  48,  43,  39,  34,  30,  25,  21,  16,  12,   7,   3,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   5,
      10,  14,  19,  23,  28,  32,  37,  41,  46,  50,  55,  59,  64,  68,  73,  77,
      82,  86,  91,  95, 100, 104, 109, 113, 118, 123, 127, 132, 136, 141, 145, 150,
      154, 159, 163, 168, 172, 177, 181, 186, 190, 195, 199, 204, 208, 213, 217, 222,
      226, 231, 235, 240, 244, 249, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };
    
    /** The green values. */
    private final static int[] green =
    {  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   6,  11,
       15,  20,  24,  29,  33,  38,  42,  47,  51,  56,  60,  65,  69,  74,  78,  83,
       87,  92,  96, 101, 105, 110, 114, 119, 123, 128, 132, 137, 141, 146, 150, 155,
       159, 164, 168, 173, 177, 182, 186, 191, 195, 200, 204, 209, 213, 218, 222, 227,
       231, 236, 241, 245, 250, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255, 255, 255, 255, 255, 255, 252, 248, 243, 239, 234, 230, 225, 221, 216,
       212, 207, 203, 198, 194, 189, 185, 180, 176, 171, 167, 162, 158, 153, 149, 144,
       140, 135, 131, 126, 122, 117, 113, 108, 104,  99,  95,  90,  86,  81,  77,  72,
       68,  63,  59,  54,  50,  45,  41,  36,  32,  27,  23,  18,  14,   9,   5,   0 };
    
    /** The blue values. */
    private final static int[] blue =
    { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
      255, 255, 255, 255, 255, 255, 251, 247, 242, 238, 233, 229, 224, 220, 215, 211,
      206, 202, 197, 193, 188, 184, 179, 175, 170, 166, 161, 157, 152, 148, 143, 139,
      134, 130, 125, 121, 116, 112, 107, 103,  98,  94,  89,  85,  80,  76,  71,  67,
      62,  58,  53,  49,  44,  40,  35,  31,  26,  22,  17,  13,   8,   4,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0 };
    
    
    private Color getRainbowColor(double value, float alpha) {
        if (value < 0 || value > 1) throw new IllegalArgumentException("Value must be in range [0,1]: "+value);
        int bin = (int) Math.floor(value*red.length);
        if (bin >= red.length) bin = red.length-1;
        int a = (int) (alpha*256);
        if (a < 0) a = 0;
        if (a > 255) a = 255;
        return new Color(red[bin],green[bin],blue[bin],a);
    }
    
}

 

Ads help maintain this website.