JAL-2438 clarify code and javadoc, reinstate updateFeatures() check
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 15 Mar 2017 09:19:06 +0000 (09:19 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 15 Mar 2017 09:19:06 +0000 (09:19 +0000)
src/jalview/api/FeatureRenderer.java
src/jalview/renderer/seqfeatures/FeatureColourFinder.java
src/jalview/renderer/seqfeatures/FeatureRenderer.java

index 839119d..7123b8c 100644 (file)
@@ -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.
    * <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
index 9a1ecf9..0c18d39 100644 (file)
@@ -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;
   }
 }
index 49b98a5..02cfd05 100644 (file)
@@ -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())