/*
 * Copyright 2010-2015 Institut Pasteur.
 * 
 * This file is part of Icy.
 * 
 * Icy is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Icy is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Icy. If not, see <http://www.gnu.org/licenses/>.
 */
package icy.image.colormap;

import icy.util.ColorUtil;

import java.awt.Color;

/**
 * @author stephane
 */
public class LinearColorMap extends IcyColorMap
{
    /**
     * A built-in 'black-to-black' linear color map
     */
    public static final LinearColorMap black_ = new LinearColorMap("Black", Color.black, IcyColorMapType.GRAY);

    /**
     * A built-in 'black-to-white' linear color map
     */
    public static final LinearColorMap gray_ = new LinearColorMap("Gray", Color.white, IcyColorMapType.GRAY);
    public static final LinearColorMap white_ = gray_;

    /**
     * A built-in 'white-to-black' linear color map
     */
    public static final LinearColorMap gray_inv_ = new LinearColorMap("Gray inverse", Color.white, Color.black,
            IcyColorMapType.GRAY);
    public static final LinearColorMap white_inv_ = gray_inv_;

    /**
     * A built-in 'black-to-red' linear color map
     */
    public static final LinearColorMap red_ = new LinearColorMap("Red", Color.red);

    /**
     * A built-in 'black-to-blue' linear color map
     */
    public static final LinearColorMap blue_ = new LinearColorMap("Blue", Color.blue);

    /**
     * A built-in 'black-to-pink' linear color map
     */
    public static final LinearColorMap pink_ = new LinearColorMap("Pink", Color.pink);

    /**
     * A built-in 'black-to-cyan' linear color map
     */
    public static final LinearColorMap cyan_ = new LinearColorMap("Cyan", Color.cyan);

    /**
     * A built-in 'black-to-orange' linear color map
     */
    public static final LinearColorMap orange_ = new LinearColorMap("Orange", Color.orange);

    /**
     * A built-in 'black-to-yellow' linear color map
     */
    public static final LinearColorMap yellow_ = new LinearColorMap("Yellow", Color.yellow);

    /**
     * A built-in 'black-to-green' linear color map
     */
    public static final LinearColorMap green_ = new LinearColorMap("Green", Color.green);

    /**
     * A built-in 'black-to-magenta' linear color map
     */
    public static final LinearColorMap magenta_ = new LinearColorMap("Magenta", Color.magenta);

    /**
     * A built-in 'transparent-to-opaque' linear color map
     */
    public static final LinearColorMap alpha_ = new LinearColorMap("Alpha", new Color(0f, 0f, 0f, 0f), new Color(0f,
            0f, 0f, 1f), IcyColorMapType.ALPHA);

    /**
     * Creates a simple color map using a linear gradient of the given Color.
     */
    public LinearColorMap(String mapName, Color color)
    {
        this(mapName, Color.black, color, IcyColorMapType.RGB);
    }

    /**
     * Creates a simple color map using a linear gradient of the given Color.
     */
    public LinearColorMap(String mapName, Color color, IcyColorMapType type)
    {
        this(mapName, Color.black, color, type);
    }

    /**
     * Creates a simple color map using a linear gradient from 'colorFrom' to 'colorTo'.
     */
    public LinearColorMap(String mapName, Color colorFrom, Color colorTo)
    {
        this(mapName, colorFrom, colorTo, IcyColorMapType.RGB);
    }

    /**
     * Creates a simple color map using a linear gradient from 'colorFrom' to 'colorTo'.
     */
    public LinearColorMap(String mapName, Color colorFrom, Color colorTo, IcyColorMapType type)
    {
        super(mapName, type);

        beginUpdate();
        try
        {
            red.setControlPoint(0, colorFrom.getRed());
            green.setControlPoint(0, colorFrom.getGreen());
            blue.setControlPoint(0, colorFrom.getBlue());
            gray.setControlPoint(0, ColorUtil.getGrayMix(colorFrom));
            alpha.setControlPoint(0, colorFrom.getAlpha());

            red.setControlPoint(MAX_INDEX, colorTo.getRed());
            green.setControlPoint(MAX_INDEX, colorTo.getGreen());
            blue.setControlPoint(MAX_INDEX, colorTo.getBlue());
            gray.setControlPoint(MAX_INDEX, ColorUtil.getGrayMix(colorTo));
            alpha.setControlPoint(MAX_INDEX, colorTo.getAlpha());
        }
        finally
        {
            endUpdate();
        }
    }

}