--- /dev/null
+/**
+ *
+ */
+package jalview.schemes;
+
+import jalview.datamodel.SequenceFeature;
+
+import java.awt.Color;
+
+/**
+ * Value and/or thresholded colour scale used for colouring by annotation and feature score
+ * @author JimP
+ *
+ */
+public class GraduatedColor
+{
+ int thresholdState = AnnotationColourGradient.NO_THRESHOLD; // or ABOVE_THRESHOLD or BELOW_THRESHOLD
+ float lr,lg,lb,dr,dg,db;
+ /**
+ * linear scaling parameters, base, minimum colour threshold, range of linear scale from lower to upper
+ */
+ float base,range,thrsh;
+ /**
+ * when true, colour from u to u-d rather than u to u+d
+ */
+ boolean tolow=false;
+ /**
+ * construct a graduatedColor object from simple parameters
+ * @param low
+ * @param high
+ * @param min
+ * @param max
+ * color low->high from min->max
+ */
+ public GraduatedColor(Color low,Color high, float min,float max)
+ {
+ thrsh = Float.NaN;
+ tolow = min>=max;
+ lr = low.getRed()/255f;
+ lg = low.getGreen()/255f;
+ lb = low.getBlue()/255f;
+ dr = (high.getRed()/255f)-lr;
+ dg = (high.getGreen()/255f)-lg;
+ db = (high.getBlue()/255f)-lb;
+ if (tolow)
+ {
+ base = max;
+ range = min-max;
+ } else {
+ base = min;
+ range = max-min;
+ }
+ }
+ public GraduatedColor(GraduatedColor oldcs)
+ {
+ lr = oldcs.lr;
+ lg = oldcs.lg;
+ lb = oldcs.lb;
+ dr = oldcs.dr;
+ dg = oldcs.dg;
+ db = oldcs.db;
+ base = oldcs.base;
+ range = oldcs.range;
+ tolow = oldcs.tolow;
+ thresholdState = oldcs.thresholdState;
+ thrsh = oldcs.thrsh;
+ }
+ /**
+ * make a new gradient from an old one with a different scale range
+ * @param oldcs
+ * @param min
+ * @param max
+ */
+ public GraduatedColor(GraduatedColor oldcs, float min, float max)
+ {
+ this(oldcs);
+ if (max<min)
+ {
+ base = max;
+ range = min-max;
+ tolow=true;
+ } else {
+ base = min;
+ range = max-min;
+ tolow=false;
+ }
+ }
+ public Color getMinColor()
+ {
+ return new Color(lr,lg,lb);
+ }
+ public Color getMaxColor()
+ {
+ return new Color(lr+dr,lg+dg,lb+db);
+ }
+ public boolean getTolow()
+ {
+ return tolow;
+ }
+ public void setTolow(boolean tolower)
+ {
+ tolow = tolower;
+ }
+ public boolean isColored(SequenceFeature feature)
+ {
+ float val = feature.getScore();
+ if (val==Float.NaN)
+ {
+ return true;
+ }
+ if (this.thresholdState==AnnotationColourGradient.NO_THRESHOLD)
+ {
+ return true;
+ }
+ if (this.thrsh==Float.NaN)
+ {
+ return true;
+ }
+ boolean rtn = thresholdState==AnnotationColourGradient.ABOVE_THRESHOLD;
+ if (val<=thrsh)
+ {
+ return !rtn; // ? !tolow : tolow;
+ } else {
+ return rtn; // ? tolow : !tolow;
+ }
+ }
+ public Color findColor(SequenceFeature feature)
+ {
+ if (range==0.0)
+ {
+ return getMaxColor();
+ }
+ float scr = feature.getScore();
+ if (scr==Float.NaN)
+ {
+ return getMinColor();
+ }
+ float scl = (scr-base)/range;
+ if (tolow) { scl = -scl; }
+ if (scl<0f) { scl = 0f; }
+ if (scl>1f) { scl = 1f; }
+ return new Color(lr+scl*dr,lg+scl*dg,lb+scl*db);
+ }
+ public void setThresh(float value)
+ {
+ thrsh = value;
+ }
+ public void setThreshType(int aboveThreshold)
+ {
+ thresholdState = aboveThreshold;
+ }
+ public int getThreshType()
+ {
+ return thresholdState;
+ }
+}