/*
* 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 java.awt.Color;
/**
* @author stephane
*/
public class HSVColorMap extends IcyColorMap
{
/**
* Creates a HSV color map with default saturation of 1 and value of 1
*/
public HSVColorMap()
{
this(1f, 1f);
}
/**
* Creates a HSV color map using a periodic variation the hue parameter, i.e. the actual RGB
* color is the same (red) at both ends of the map.<br>
* The implementation is actually similar to that of the java.awt.Color class, but this method
* is optimized to produce floating point RGB values between 0 and 1 for directly use in a
* ColorSpace.
*
* @param saturation
* the color saturation between 0 and 1 (0 = weak, 1 = strong)
* @param value
* the color value between 0 and 1 (0 = dark, 1 = light)
* @throws IllegalArgumentException
* if any of the parameters is out of range
*/
public HSVColorMap(float saturation, float value) throws IllegalArgumentException
{
super("HSV [" + saturation + "," + value + "]");
if (saturation < 0 || saturation > 1)
throw new IllegalArgumentException("HSV: Saturation must be in the range [0,1]");
if (value < 0 || value > 1)
throw new IllegalArgumentException("HSV: Value must be in the range [0,1]");
final float min = (1f - saturation) * value;
int index;
beginUpdate();
try
{
index = Math.round((MAX_INDEX / 6f) * 0f);
setRGBControlPoint(index, new Color(value, min, min));
index = Math.round((MAX_INDEX / 6f) * 1f);
setRGBControlPoint(index, new Color(value, value, min));
index = Math.round((MAX_INDEX / 6f) * 2f);
setRGBControlPoint(index, new Color(min, value, min));
index = Math.round((MAX_INDEX / 6f) * 3f);
setRGBControlPoint(index, new Color(min, value, value));
index = Math.round((MAX_INDEX / 6f) * 4f);
setRGBControlPoint(index, new Color(min, min, value));
index = Math.round((MAX_INDEX / 6f) * 5f);
setRGBControlPoint(index, new Color(value, min, value));
index = Math.round((MAX_INDEX / 6f) * 6f);
setRGBControlPoint(index, new Color(value, min, min));
}
finally
{
endUpdate();
}
}
}