/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.extra;
import java.awt.Color;
import java.util.Random;
import org.diirt.vtype.Display;
import org.diirt.vtype.ValueUtil;
/**
*
* @author carcassi
*/
public abstract class ColorScheme {
/**
* Calculate the color for the value according to the ranges and puts it
* into the colors buffer.
*
* @param value the value to color
* @param ranges the display ranges
* @return the RGB color
*/
public abstract int color(double value, Display ranges);
/**
* A simple color scheme that uses only one gradient for the whole
* display range.
*
* @param minValueColor color for the minimum value in the display range
* @param maxValueColor color for the maximum value in the display range
* @return a new color scheme
*/
public static ColorScheme singleRangeGradient(final Color minValueColor, final Color maxValueColor) {
return singleRangeGradient(minValueColor, maxValueColor, Color.BLACK);
}
public static ColorScheme singleRangeGradient(final Color minValueColor, final Color maxValueColor, final Color nanColor) {
return new ColorScheme() {
Random rand = new Random();
@Override
public int color(double value, Display ranges) {
if (Double.isNaN(value))
return nanColor.getRGB();
double normalValue = ValueUtil.normalize(value, ranges);
normalValue = Math.min(normalValue, 1.0);
normalValue = Math.max(normalValue, 0.0);
int alpha = 255;
int red = (int) (minValueColor.getRed() + (maxValueColor.getRed() - minValueColor.getRed()) * normalValue);
int green = (int) (minValueColor.getGreen() + (maxValueColor.getGreen() - minValueColor.getGreen()) * normalValue);
int blue = (int) (minValueColor.getBlue() + (maxValueColor.getBlue() - minValueColor.getBlue()) * normalValue);
return (alpha << 24) | (red << 16) | (green << 8) | blue;
}
};
}
public static ColorScheme multipleRangeGradient(final Color lowerDisplayColor,
final Color lowerAlarmColor, final Color lowerWarningColor,
final Color upperWarningColor, final Color upperAlarmColor,
final Color upperDisplayColor) {
return new ColorScheme() {
Random rand = new Random();
@Override
public int color(double value, Display ranges) {
if (Double.isNaN(value))
return 0;
double normalValue = 0.0;
Color minValueColor = null;
Color maxValueColor = null;
// Determine in which range the value is.
// The equals are put so that if the value is at the limit,
// the range closer to the center wins
if (value < ranges.getLowerDisplayLimit()) {
return lowerDisplayColor.getRGB();
} else if (value < ranges.getLowerAlarmLimit()) {
normalValue = ValueUtil.normalize(value, ranges.getLowerDisplayLimit(), ranges.getLowerAlarmLimit());
minValueColor = lowerDisplayColor;
maxValueColor = lowerAlarmColor;
} else if (value < ranges.getLowerWarningLimit()) {
normalValue = ValueUtil.normalize(value, ranges.getLowerAlarmLimit(), ranges.getLowerWarningLimit());
minValueColor = lowerAlarmColor;
maxValueColor = lowerWarningColor;
} else if (value <= ranges.getUpperWarningLimit()) {
normalValue = ValueUtil.normalize(value, ranges.getLowerWarningLimit(), ranges.getUpperWarningLimit());
minValueColor = lowerWarningColor;
maxValueColor = upperWarningColor;
} else if (value <= ranges.getUpperAlarmLimit()) {
normalValue = ValueUtil.normalize(value, ranges.getUpperWarningLimit(), ranges.getUpperAlarmLimit());
minValueColor = upperWarningColor;
maxValueColor = upperAlarmColor;
} else {
return upperDisplayColor.getRGB();
}
int alpha = 255;
int red = (int) (minValueColor.getRed() + (maxValueColor.getRed() - minValueColor.getRed()) * normalValue);
int green = (int) (minValueColor.getGreen() + (maxValueColor.getGreen() - minValueColor.getGreen()) * normalValue);
int blue = (int) (minValueColor.getBlue() + (maxValueColor.getBlue() - minValueColor.getBlue()) * normalValue);
return (alpha << 24) | (red << 16) | (green << 8) | blue;
}
};
}
}