public class ColorUtils
{
+ // constant borrowed from java.awt.Color
+ private static final float FACTOR = 0.7f;
+
private static final int MAX_CACHE_SIZE = 1729;
/*
* a cache for colours generated from text strings
return col;
}
+
+ /**
+ * Generates a colour that is interpolated between
+ * <code>colour.darker()</code> and <code>colour.brighter()</code> in
+ * proportion as <code>value</code> is between <code>min</code> and
+ * <code>max</code>. Note that the 'neutral point' (unchanged colour) is
+ * closer to 'brighter' than to 'darker'as this is a geometric range.
+ *
+ * @param value
+ * @param min
+ * @param max
+ * @param colour
+ * @return
+ */
+ public static Color getGraduatedColour(float value, float min, float max,
+ Color colour)
+ {
+ /*
+ * this computes the equivalent of
+ * getGraduatedColour(value, min, colour.darker(), max, colour.brighter())
+ * but avoiding object creation except for the return value
+ */
+ if (value < min)
+ {
+ value = min;
+ }
+ if (value > max)
+ {
+ value = max;
+ }
+
+ int r = colour.getRed();
+ int g = colour.getGreen();
+ int b = colour.getBlue();
+
+ /*
+ * rgb for colour.darker():
+ */
+ float minR = r * FACTOR;
+ float minG = g * FACTOR;
+ float minB = b * FACTOR;
+
+ /*
+ * rgb for colour.brighter():
+ */
+ float maxR = Math.min(255f, r / FACTOR);
+ float maxG = Math.min(255f, g / FACTOR);
+ float maxB = Math.min(255f, b / FACTOR);
+
+ /*
+ * interpolation
+ */
+ float p = (value - min) / (max - min);
+ int newR = (int) (minR + p * (maxR - minR));
+ int newG = (int) (minG + p * (maxG - minG));
+ int newB = (int) (minB + p * (maxB - minB));
+
+ return new Color(newR, newG, newB, colour.getAlpha());
+ }
}