JAL-3442 colour caching for Overview resize feature/JAL-3442colourCaching
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 26 Sep 2019 15:55:26 +0000 (16:55 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 26 Sep 2019 15:55:26 +0000 (16:55 +0100)
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/AlignmentI.java
src/jalview/datamodel/Sequence.java
src/jalview/datamodel/SequenceI.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignmentPanel.java
src/jalview/renderer/OverviewResColourFinder.java
test/jalview/renderer/OverviewRendererTest.java

index 7b97d49..599d3a9 100755 (executable)
@@ -2034,4 +2034,13 @@ public class Alignment implements AlignmentI
     }
   }
 
+  @Override
+  public void resetColors()
+  {
+    for (int i = getHeight(); --i >= 0;)
+    {
+      sequences.get(i).resetColors();
+    }
+  }
+
 }
index 93a2456..e8e0812 100755 (executable)
@@ -621,7 +621,13 @@ public interface AlignmentI extends AnnotatedCollectionI
    * @return new HiddenColumns for new alignment view, with insertions into
    *         profileseq marked as hidden.
    */
+
   public HiddenColumns propagateInsertions(SequenceI profileseq,
           AlignmentView input);
 
+  /**
+   * Removes all colors assigned to sequences, forcing them to be be
+   * recalculated
+   */
+  void resetColors();
 }
index 6c0e528..04638d3 100755 (executable)
@@ -118,6 +118,11 @@ public class Sequence extends ASequence implements SequenceI
    */
   private int changeCount;
 
+  /*
+   * cached rgb colours for each position of the aligned sequence (column)
+   */
+  private int[] argb;
+
   /**
    * Creates a new Sequence object.
    * 
@@ -2017,6 +2022,7 @@ public class Sequence extends ASequence implements SequenceI
   @Override
   public void sequenceChanged()
   {
+    resetColors();
     changeCount++;
   }
 
@@ -2139,4 +2145,26 @@ public class Sequence extends ASequence implements SequenceI
     return getFeatures().hasFeatures(type);
   }
 
+  @Override
+  public int getColor(int i)
+  {
+    return argb == null ? 0 : argb[i];
+  }
+
+  @Override
+  public int setColor(int i, int rgb)
+  {
+    if (argb == null)
+    {
+      argb = new int[this.sequence.length];
+    }
+    return (argb[i] = rgb);
+  }
+
+  @Override
+  public void resetColors()
+  {
+    argb = null;
+  }
+
 }
index 851ef79..7c9c418 100755 (executable)
@@ -606,5 +606,27 @@ public interface SequenceI extends ASequenceI
    */
   public boolean hasFeatures(String type);
 
+  /**
+   * Returns the rgb value of the colour at position i, or 0 if not known
+   * 
+   * @param i
+   * @return
+   */
+  public int getColor(int i);
+
+  /**
+   * Sets the rgb value of the colour at position i
+   * 
+   * @param i
+   * @param rgb
+   * @return
+   */
+  public int setColor(int i, int rgb);
+
+  /**
+   * Clears any cached colours
+   */
+  public void resetColors();
+
 }
 
index 0b84e9b..204b8c6 100644 (file)
@@ -4526,6 +4526,7 @@ public class AlignFrame extends GAlignFrame
     // abstracted
     if (enableIfNecessary)
     {
+      alignPanel.getAlignment().resetColors();
       viewport.setShowSequenceFeatures(true);
       showSeqFeatures.setSelected(true);
     }
index 2f5d83b..22bb89f 100644 (file)
@@ -834,6 +834,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
             av.isShowAutocalculatedAbove());
     sorter.sort(getAlignment().getAlignmentAnnotation(),
             av.getSortAnnotationsBy());
+    getAlignment().resetColors();
     repaint();
 
     if (updateStructures)
@@ -842,7 +843,6 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     if (updateOverview)
     {
-
       if (overviewPanel != null)
       {
         overviewPanel.updateOverviewImage();
index 7207dea..740b56c 100644 (file)
@@ -124,12 +124,19 @@ public class OverviewResColourFinder extends ResidueColourFinder
           SequenceGroup[] allGroups, final SequenceI seq, int i,
           FeatureColourFinder finder)
   {
+    int c = seq.getColor(i);
+    if (c != 0)
+    {
+      return c;
+    }
+
     int col = getResidueBoxColourInt(showBoxes, shader, allGroups, seq, i);
 
     // if there's a FeatureColourFinder we might override the residue colour
     // here with feature colouring
     col = finder == null || finder.noFeaturesDisplayed() ? col
             : finder.findFeatureColourInt(col, seq, i);
+    seq.setColor(i, col);
     return col;
   }
 
index 0a77b65..159c814 100644 (file)
@@ -82,11 +82,13 @@ public class OverviewRendererTest
     fr.findAllFeatures(true);
     av.setShowSequenceFeatures(true);
     fr.setColour("Pfam", new FeatureColour(Color.yellow));
+    seq1.resetColors();
     assertEquals(or.getColumnColourFromSequence(null, seq1, 0),
             Color.yellow.getRGB());
 
     // don't show sequence features
     av.setShowSequenceFeatures(false);
+    seq1.resetColors();
     assertEquals(or.getColumnColourFromSequence(null, seq1, 0),
             Color.magenta.getRGB());
   }