From 5a5663e814e0af0dbe6061a257fb4fb1baebd4e3 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Wed, 15 Mar 2017 09:19:06 +0000 Subject: [PATCH] JAL-2438 clarify code and javadoc, reinstate updateFeatures() check --- src/jalview/api/FeatureRenderer.java | 26 +++++++++++++------- .../renderer/seqfeatures/FeatureColourFinder.java | 22 +++++++++++------ .../renderer/seqfeatures/FeatureRenderer.java | 16 +++++++++++- 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/jalview/api/FeatureRenderer.java b/src/jalview/api/FeatureRenderer.java index 839119d..7123b8c 100644 --- a/src/jalview/api/FeatureRenderer.java +++ b/src/jalview/api/FeatureRenderer.java @@ -38,17 +38,25 @@ public interface FeatureRenderer { /** - * 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. *

- * 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. *

- * 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. + *

+ * Returns null if there is no visible feature at the position. + *

+ * 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 diff --git a/src/jalview/renderer/seqfeatures/FeatureColourFinder.java b/src/jalview/renderer/seqfeatures/FeatureColourFinder.java index 9a1ecf9..0c18d39 100644 --- a/src/jalview/renderer/seqfeatures/FeatureColourFinder.java +++ b/src/jalview/renderer/seqfeatures/FeatureColourFinder.java @@ -1,5 +1,6 @@ package jalview.renderer.seqfeatures; +import jalview.api.FeatureRenderer; import jalview.api.FeaturesDisplayedI; import jalview.datamodel.SequenceI; import jalview.viewmodel.seqfeatures.FeatureRendererModel; @@ -19,7 +20,7 @@ public class FeatureColourFinder /* * 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 @@ -32,7 +33,7 @@ public class FeatureColourFinder * * @param fr */ - public FeatureColourFinder(jalview.api.FeatureRenderer fr) + public FeatureColourFinder(FeatureRenderer fr) { featureRenderer = fr; offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); @@ -70,21 +71,28 @@ public class FeatureColourFinder 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; } } diff --git a/src/jalview/renderer/seqfeatures/FeatureRenderer.java b/src/jalview/renderer/seqfeatures/FeatureRenderer.java index 49b98a5..02cfd05 100644 --- a/src/jalview/renderer/seqfeatures/FeatureRenderer.java +++ b/src/jalview/renderer/seqfeatures/FeatureRenderer.java @@ -255,10 +255,17 @@ public class FeatureRenderer extends FeatureRendererModel 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; @@ -464,7 +471,10 @@ public class FeatureRenderer extends FeatureRendererModel return null; } - // updateFeatures(); + /* + * check for new feature added while processing + */ + updateFeatures(); /* * inspect features in reverse renderOrder (the last in the array is @@ -491,6 +501,10 @@ public class FeatureRenderer extends FeatureRendererModel 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()) -- 1.7.10.2