package tim.prune.gui.colour; import java.awt.Color; import tim.prune.data.TrackInfo; /** * Abstract class to do the colouring of points, * that is holding a colour for each track point * in the current track */ public abstract class PointColourer { /** default colour */ private Color _defaultColour = Color.BLUE; /** start and end colours */ private Color _startColour = null, _endColour = null; /** max number of unique colours before wrapping */ private int _maxColours = 1; /** * Constructor * @param inStartColour start colour * @param inEndColour end colour * @param inMaxColours max number of colours */ public PointColourer(Color inStartColour, Color inEndColour, int inMaxColours) { _startColour = inStartColour; _endColour = inEndColour; _maxColours = inMaxColours; } /** * Constructor * @param inStartColour start colour * @param inEndColour end colour */ public PointColourer(Color inStartColour, Color inEndColour) { this(inStartColour, inEndColour, -1); } /** * Calculate the colours for each of the points in the given track * @param inTrackInfo track info object */ public abstract void calculateColours(TrackInfo inTrackInfo); /** * Get the colour for the given point index * @param inPointIndex index of point in track * @return colour object */ public Color getColour(int inPointIndex) { return _defaultColour; } /** * @param inColor default colour to use */ protected void setDefaultColour(Color inColour) { if (inColour != null) { _defaultColour = inColour; } } /** * @return default colour */ protected Color getDefaultColour() { return _defaultColour; } /** * @return start colour */ protected Color getStartColour() { return _startColour; } /** * @return end colour */ protected Color getEndColour() { return _endColour; } /** * @return maximum number of colours, or -1 */ protected int getMaxColours() { return _maxColours; } /** * Mix the given colours together using HSB values instead of interpolating RGB * @param inFraction between 0.0 (start) and 1.0 (end) * @return mixed colour */ protected Color mixColour(float inFraction) { if (_startColour == null && _endColour == null) return getDefaultColour(); if (_startColour == null) return _endColour; if (_endColour == null || inFraction < 0.0 || inFraction > 1.0) return _startColour; // Convert both colours to hsb, and interpolate float[] startHSB = Color.RGBtoHSB(_startColour.getRed(), _startColour.getGreen(), _startColour.getBlue(), null); float[] endHSB = Color.RGBtoHSB(_endColour.getRed(), _endColour.getGreen(), _endColour.getBlue(), null); // Note that if end hue is less than start hue, hue will go backwards rather than forwards with wrap around 0 return Color.getHSBColor(startHSB[0] + (endHSB[0]-startHSB[0]) * inFraction, startHSB[1] + (endHSB[1]-startHSB[1]) * inFraction, startHSB[2] + (endHSB[2]-startHSB[2]) * inFraction); } }