1 package jalview.datamodel.annotations;
4 import java.util.AbstractMap;
5 import java.util.ArrayList;
6 import java.util.Collections;
7 import java.util.HashMap;
11 public class AnnotationColouringRanges extends AnnotationColouring
13 private static List<Color> colours = new ArrayList<Color>();
15 private static List<Float> values = new ArrayList<Float>();
17 protected static void addValColour(float v, Color c)
23 protected static void addFirstColour(Color c)
31 // addFirstColour(Color.black); -infty..25 = black
32 // addValColour(25,Color.darkGray); 25..50 = darkGray
33 // addValColour(50,Color.gray); 50..75 = gray
34 // addValColour(75,Color.lightGray); 75..100 = lightGray
35 // addValColour(100,Color.white); 100..infty = white
39 public Color valueToColour(float val)
43 for (int i = 0; i < values.size(); i++)
45 float compareVal = values.get(i);
46 if (colours.size() > i)
56 if (!set && colours.size() > values.size())
58 col = colours.get(values.size());
64 public List<Map.Entry<Float, Color>> rangeColours(float val1, float val2)
66 String cacheKey = cacheKey(val1, val2);
67 if (!valColorsCache.containsKey(cacheKey))
69 List<Map.Entry<Float, Color>> valCols = new ArrayList<>();
70 float v1 = val1 <= val2 ? val1 : val2;
71 float v2 = val1 <= val2 ? val2 : val1;
72 boolean reversed = val1 > val2;
77 while (i < values.size() && (!set1 || !set2))
79 float compareVal = values.get(i);
80 if (colours.size() > i)
85 if (!set1 && v1 < compareVal)
87 // add the initial checkpoint
88 valCols.add(valCol(reversed ? 1f : 0f, col));
92 if (!set2 && v2 < compareVal)
94 // add the final checkpoint
95 valCols.add(valCol(reversed ? 0f : 1f, col));
100 if (set1) // && !set2
102 // add an intermediate checkpoint
103 float v = (compareVal - v1) / (v2 - v1);
104 valCols.add(valCol(reversed ? 1f - v : v, col));
109 if (colours.size() > i)
111 col = colours.get(i);
113 // add above the final checkpoint colour(s) if not set
116 valCols.add(valCol(reversed ? 1f : 0f, col));
121 // add the final checkpoint
122 valCols.add(valCol(reversed ? 0f : 1f, col));
127 Collections.reverse(valCols);
130 valColorsCache.put(cacheKey, valCols);
133 return getFromCache(cacheKey);
136 private Map.Entry<Float, Color> valCol(Float v, Color c)
138 return new AbstractMap.SimpleEntry<Float, Color>(v, c);
141 private Map<String, List<Map.Entry<Float, Color>>> valColorsCache = new HashMap<String, List<Map.Entry<Float, Color>>>();
143 private List<Map.Entry<Float, Color>> getFromCache(String key)
145 // return a copy of the list in case of element order manipulation (e.g.
146 // valCols.remove(0))
147 return new ArrayList<Map.Entry<Float, Color>>(valColorsCache.get(key));
150 private static String cacheKey(float f1, float f2)
152 return new StringBuilder().append(Float.hashCode(f1)).append(' ')
153 .append(Float.hashCode(f2)).toString();