Merge branch 'feature/2588' into merge/develop_feature/2588_JAL-2588
[jalview.git] / src / jalview / renderer / OverviewRenderer.java
index 913c870..2e2bc37 100644 (file)
@@ -23,7 +23,9 @@ package jalview.renderer;
 import jalview.api.AlignmentColsCollectionI;
 import jalview.api.AlignmentRowsCollectionI;
 import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.renderer.seqfeatures.FeatureColourFinder;
 import jalview.renderer.seqfeatures.FeatureRenderer;
@@ -37,8 +39,6 @@ public class OverviewRenderer
 {
   private FeatureColourFinder finder;
 
-  private jalview.api.SequenceRenderer sr;
-
   // image to render on
   private BufferedImage miniMe;
 
@@ -49,13 +49,24 @@ public class OverviewRenderer
   private float pixelsPerSeq;
 
   // flag to indicate whether to halt drawing
-  private boolean redraw = false;
+  private volatile boolean redraw = false;
+
+  // reference to alignment, needed to get sequence groups
+  private AlignmentI al;
+
+  private ResidueShaderI shader;
 
-  public OverviewRenderer(jalview.api.SequenceRenderer seqRenderer,
-          FeatureRenderer fr, OverviewDimensions od)
+  private ResidueColourFinder resColFinder;
+
+  public OverviewRenderer(FeatureRenderer fr, OverviewDimensions od,
+          AlignmentI alignment,
+          ResidueShaderI resshader)
   {
-    sr = seqRenderer;
     finder = new FeatureColourFinder(fr);
+    resColFinder = new OverviewResColourFinder();
+
+    al = alignment;
+    shader = resshader;
 
     pixelsPerCol = od.getPixelsPerCol();
     pixelsPerSeq = od.getPixelsPerSeq();
@@ -89,6 +100,8 @@ public class OverviewRenderer
       // get details of this alignment row
       boolean hidden = rows.isHidden(alignmentRow);
       SequenceI seq = rows.getSequence(alignmentRow);
+      // rate limiting step when rendering overview for lots of groups
+      SequenceGroup[] allGroups = al.findAllGroups(seq);
 
       // calculate where this row extends to in pixels
       int endRow = Math.min(Math.round((seqIndex + 1) * pixelsPerSeq) - 1,
@@ -104,8 +117,7 @@ public class OverviewRenderer
         }
 
         // calculate where this column extends to in pixels
-        int endCol = Math.min(
-                Math.round((colIndex + 1) * pixelsPerCol) - 1,
+        int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
                 miniMe.getWidth() - 1);
 
         // don't do expensive colour determination if we're not going to use it
@@ -114,7 +126,7 @@ public class OverviewRenderer
         if (pixelCol <= endCol)
         {
           // determine the colour based on the sequence and column position
-          rgbcolor = getColumnColourFromSequence(seq,
+          rgbcolor = getColumnColourFromSequence(allGroups, seq,
                   hidden || cols.isHidden(alignmentCol), alignmentCol,
                   finder);
 
@@ -140,14 +152,17 @@ public class OverviewRenderer
   /*
    * Find the colour of a sequence at a specified column position
    */
-  private int getColumnColourFromSequence(jalview.datamodel.SequenceI seq,
+  private int getColumnColourFromSequence(SequenceGroup[] allGroups,
+          jalview.datamodel.SequenceI seq,
           boolean isHidden, int lastcol, FeatureColourFinder fcfinder)
   {
     Color color = Color.white;
 
     if ((seq != null) && (seq.getLength() > lastcol))
     {
-      color = sr.getResidueColour(seq, lastcol, fcfinder);
+      color = resColFinder.getResidueColour(true, shader, allGroups, seq,
+              lastcol,
+              fcfinder);
     }
 
     if (isHidden)
@@ -194,8 +209,7 @@ public class OverviewRenderer
       }
       else
       {
-        int endCol = Math.min(
-                Math.round((colIndex + 1) * pixelsPerCol) - 1,
+        int endCol = Math.min(Math.round((colIndex + 1) * pixelsPerCol) - 1,
                 miniMe.getWidth() - 1);
 
         if (annotations[alignmentCol] != null)
@@ -209,7 +223,8 @@ public class OverviewRenderer
             g.setColor(annotations[alignmentCol].colour);
           }
 
-          height = (int) ((annotations[alignmentCol].value / anno.graphMax) * y);
+          height = (int) ((annotations[alignmentCol].value / anno.graphMax)
+                  * y);
           if (height > y)
           {
             height = y;