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()); + } }