JAL-1161 conditional parameters for controlling clipping
authorJim Procter <jprocter@compbio.dundee.ac.uk>
Tue, 21 May 2013 09:52:14 +0000 (10:52 +0100)
committerJim Procter <jprocter@compbio.dundee.ac.uk>
Fri, 24 May 2013 14:10:54 +0000 (15:10 +0100)
src/jalview/appletgui/AnnotationPanel.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/AnnotationPanel.java
src/jalview/renderer/AnnotationRenderer.java

index f4b2212..f63cb76 100755 (executable)
@@ -657,10 +657,12 @@ public class AnnotationPanel extends Panel implements AwtRenderPanelI,
   @Override
   public int[] getVisibleVRange()
   {
+    if (ap!=null && ap.alabels!=null)
+    {
     int sOffset=-ap.alabels.scrollOffset;
     int visHeight = sOffset+ap.annotationPanelHolder.getHeight();
     bounds[0] = sOffset; bounds[1]=visHeight;
     return bounds;
+    } else return null;
   }
-
 }
index dd6f190..6df2088 100755 (executable)
@@ -816,18 +816,30 @@ public class AnnotationLabels extends JPanel implements MouseListener,
               RenderingHints.VALUE_ANTIALIAS_ON);
     }
 
-    drawComponent(g2, width);
+    drawComponent(g2, true, width);
 
   }
 
   /**
-   * DOCUMENT ME!
+   * Draw the full set of annotation Labels for the alignment at the given cursor
    * 
-   * @param g
-   *          DOCUMENT ME!
+   * @param g Graphics2D instance (needed for font scaling)
+   * @param width Width for scaling labels
+   *          
    */
   public void drawComponent(Graphics g, int width)
   {
+    drawComponent(g, false, width);
+  }
+  /**
+   * Draw the full set of annotation Labels for the alignment at the given cursor
+   * 
+   * @param g Graphics2D instance (needed for font scaling)
+   * @param clip - true indicates that only current visible area needs to be rendered
+   * @param width Width for scaling labels         
+   */
+  public void drawComponent(Graphics g, boolean clip, int width)
+  {
     if (av.getFont().getSize() < 10)
     {
       g.setFont(font);
@@ -843,7 +855,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
 
     g.translate(0, scrollOffset);
     g.setColor(Color.black);
-
+    
     AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
     int fontHeight = g.getFont().getSize();
     int y = 0;
@@ -853,10 +865,18 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     Font baseFont = g.getFont();
     FontMetrics baseMetrics = fm;
     int ofontH = fontHeight;
-    boolean visible = true;
+    int sOffset=0;
+    int visHeight = 0;
+    int[] visr = (ap!=null && ap.annotationPanel!=null) ? ap.annotationPanel.getVisibleVRange() : null;
+    if (clip && visr!=null){ 
+      sOffset = visr[0]; 
+      visHeight = visr[1];
+    }
+    boolean visible = true,before=false,after=false;
     if (aa != null)
     {
       hasHiddenRows = false;
+      int olY=0;
       for (int i = 0; i < aa.length; i++)
       {
         visible = true;
@@ -867,9 +887,29 @@ public class AnnotationLabels extends JPanel implements MouseListener,
           hasHiddenRows = true;
           continue;
         }
-
+        olY=y;
         y += aa[i].height;
+        if (clip) {if (y<sOffset)
+        {
+          if (!before)
+          {
+          System.out.println("before vis: "+i);
+          before=true;
+          }
+          // don't draw what isn't visible
+          continue;
+        }
+        if (olY>visHeight)
+        {
 
+          if (!after)
+          {
+          System.out.println("Scroll offset: "+sOffset+" after vis: "+i);
+          after=true;
+          }
+          // don't draw what isn't visible
+          continue;
+        }}
         offset = -aa[i].height / 2;
 
         if (aa[i].hasText)
index 90f4595..ed7f359 100755 (executable)
@@ -954,9 +954,12 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   @Override
   public int[] getVisibleVRange()
   {
+    if (ap!=null && ap.alabels!=null)
+    {
     int sOffset=-ap.alabels.scrollOffset;
     int visHeight = sOffset+ap.annotationSpaceFillerHolder.getHeight();
     bounds[0] = sOffset; bounds[1]=visHeight;
     return bounds;
+    } else return null;
   }
 }
index 7598f5f..fcdd77d 100644 (file)
@@ -142,7 +142,22 @@ public class AnnotationRenderer
    * width of image to render in panel
    */
   private int imgWidth;
-
+  /**
+   * offset to beginning of visible area
+   */
+  private int sOffset;
+  /**
+   * offset to end of visible area
+   */
+  private int visHeight;
+  /**
+   * indicate if the renderer should only render the visible portion of the annotation given the current view settings
+   */
+  private boolean useClip=false;
+  /**
+   * master flag indicating if renderer should ever try to clip. not enabled for jalview 2.8.1 
+   */
+  private boolean canClip=false;
   // public void updateFromAnnotationPanel(FontMetrics annotFM, AlignViewportI
   // av)
   public void updateFromAwtRenderPanel(AwtRenderPanelI annotPanel,
@@ -152,6 +167,22 @@ public class AnnotationRenderer
     annotationPanel = annotPanel;
     fadedImage = annotPanel.getFadedImage();
     imgWidth = annotPanel.getFadedImageWidth();
+    // visible area for rendering
+    int[] bounds=annotPanel.getVisibleVRange();
+    if (bounds!=null)
+    {
+      sOffset = bounds[0];
+      visHeight = bounds[1];
+      if (visHeight==0)
+      {
+        useClip=false;
+      } else {
+        useClip=canClip;
+      }
+    } else {
+      useClip=false;
+    }
+
     updateFromAlignViewport(av);
   }
 
@@ -280,6 +311,9 @@ public class AnnotationRenderer
     // column.
     Font ofont = g.getFont();
     // \u03B2 \u03B1
+    // debug ints
+    int yfrom=0,f_i=0,yto=0,f_to=0;
+    boolean clipst=false,clipend=false;
     for (int i = 0; i < aa.length; i++)
     {
       AlignmentAnnotation row = aa[i];
@@ -293,6 +327,17 @@ public class AnnotationRenderer
       scaleColLabel = row.scaleColLabel;
       lastSS = ' ';
       lastSSX = 0;
+      
+      if (!useClip || ((y-charHeight)<visHeight && (y+row.height+charHeight*2)>=sOffset)) 
+      {// if_in_visible_region
+        if (!clipst)
+        {
+          clipst=true;
+          yfrom=y;
+          f_i=i;
+        }
+        yto = y;
+        f_to=i;
       if (row.graph > 0)
       {
         if (row.graphGroup > -1 && graphGroupDrawn.get(row.graphGroup)) {
@@ -617,7 +662,12 @@ public class AnnotationRenderer
                   row.graphMin, row.graphMax, y);
         }
       }
-
+    } else {
+      if (clipst && !clipend)
+      {
+        clipend = true;
+      }
+    }// end if_in_visible_region
       if (row.graph > 0 && row.hasText)
       {
         y += charHeight;
@@ -628,6 +678,20 @@ public class AnnotationRenderer
         y += aa[i].height;
       }
     }
+    if (canClip)
+    {
+      if (clipst)
+      {
+        System.err.println("Start clip at : " + yfrom + " (index " + f_i
+                + ")");
+      }
+      if (clipend)
+      {
+        System.err
+                .println("End clip at : " + yto + " (index " + f_to + ")");
+      }
+    }
+    ;
     return !usedFaded;
   }