{
/**
- * Returns the combined feature colour for a given sequence and column
- * position, taking into account feature colour schemes, ordering, feature and
- * feature group visibility, and transparency. Returns null if there is no
- * visible feature at the position.
+ * Computes the feature colour for a given sequence and column position,
+ * taking into account sequence feature locations, feature colour schemes,
+ * render ordering, feature and feature group visibility, and transparency.
* <p>
- * The Graphics argument is optional and may be null if no transparency is
- * applied. With feature transparency, visible features are written to the
- * graphics context and the composite colour can be read off.
+ * The graphics argument should be provided if transparency is applied
+ * (getTransparency() < 1). With feature transparency, visible features are
+ * written to the graphics context and the composite colour may be read off
+ * from it. In this case, the returned feature colour is not the composite
+ * colour but that of the last feature drawn.
* <p>
- * This is provided for use by Structure Viewers and the Overview Window to
- * get the feature colour of the rendered sequence.
+ * If no transparency applies, then the graphics argument may be null, and the
+ * returned colour is the one that would be drawn for the feature.
+ * <p>
+ * Returns null if there is no visible feature at the position.
+ * <p>
+ * This is provided to support rendering of feature colours other than on the
+ * sequence alignment, including by structure viewers and the overview window.
+ * Note this method takes no account of whether the sequence or column is
+ * hidden.
*
* @param sequence
* @param column
package jalview.renderer.seqfeatures;
+import jalview.api.FeatureRenderer;
import jalview.api.FeaturesDisplayedI;
import jalview.datamodel.SequenceI;
import jalview.viewmodel.seqfeatures.FeatureRendererModel;
/*
* the class we delegate feature finding to
*/
- private jalview.api.FeatureRenderer featureRenderer;
+ private FeatureRenderer featureRenderer;
/*
* a 1-pixel image on which features can be drawn, for the case where
*
* @param fr
*/
- public FeatureColourFinder(jalview.api.FeatureRenderer fr)
+ public FeatureColourFinder(FeatureRenderer fr)
{
featureRenderer = fr;
offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics g = null;
/*
- * if transparency applies, get colours drawn to a 1x1 pixel
- * graphics context that has been primed with the default colour
+ * if transparency applies, provide a notional 1x1 graphics context
+ * that has been primed with the default colour
*/
if (featureRenderer.getTransparency() != 1f)
{
g = offscreenImage.getGraphics();
- offscreenImage.setRGB(0, 0, defaultColour.getRGB());
+ if (defaultColour != null)
+ {
+ offscreenImage.setRGB(0, 0, defaultColour.getRGB());
+ }
}
Color c = featureRenderer.findFeatureColour(seq, column, g);
+ if (c == null)
+ {
+ return defaultColour;
+ }
- if (c != null && g != null)
+ if (g != null)
{
c = new Color(offscreenImage.getRGB(0, 0));
}
- return c == null ? defaultColour : c;
+ return c;
}
}
Color renderedColour = null;
if (transparency == 1.0f)
{
+ /*
+ * simple case - just find the topmost rendered visible feature colour
+ */
renderedColour = findFeatureColour(seq, seq.findPosition(column));
}
else
{
+ /*
+ * transparency case - draw all visible features in render order to
+ * build up a composite colour on the graphics context
+ */
renderedColour = drawSequence(g, lastSeq, column, column, 0, true);
}
return renderedColour;
return null;
}
- // updateFeatures();
+ /*
+ * check for new feature added while processing
+ */
+ updateFeatures();
/*
* inspect features in reverse renderOrder (the last in the array is
continue;
}
+ /*
+ * check the column position is within the feature range
+ * (or is one of the two contact positions for a contact feature)
+ */
boolean featureIsAtPosition = sequenceFeature.begin <= pos
&& sequenceFeature.end >= pos;
if (sequenceFeature.isContactFeature())