X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FColorUtils.java;h=16ff25927b4e0dafa19e35be927cd774e6393d4a;hb=37651a9d177de05ff938276071c16ba95ac44c73;hp=60129fb8d634c459f83f152176f03bd7ee8c9caf;hpb=e33dce78f446dd3ba3d83d82731e42c70c0d2cb5;p=jalview.git
diff --git a/src/jalview/util/ColorUtils.java b/src/jalview/util/ColorUtils.java
index 60129fb..16ff259 100644
--- a/src/jalview/util/ColorUtils.java
+++ b/src/jalview/util/ColorUtils.java
@@ -31,6 +31,9 @@ import java.util.Random;
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
@@ -372,4 +375,63 @@ public class ColorUtils
return col;
}
+
+ /**
+ * Generates a colour that is interpolated between
+ * colour.darker()
and colour.brighter()
in
+ * proportion as value
is between min
and
+ * max
. 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());
+ }
}