From 69dd054a99ba910b138e84c8db62a11ee7c3ef37 Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Tue, 21 May 2013 10:52:14 +0100 Subject: [PATCH] JAL-1161 conditional parameters for controlling clipping --- src/jalview/appletgui/AnnotationPanel.java | 4 +- src/jalview/gui/AnnotationLabels.java | 54 +++++++++++++++++--- src/jalview/gui/AnnotationPanel.java | 3 ++ src/jalview/renderer/AnnotationRenderer.java | 68 +++++++++++++++++++++++++- 4 files changed, 119 insertions(+), 10 deletions(-) diff --git a/src/jalview/appletgui/AnnotationPanel.java b/src/jalview/appletgui/AnnotationPanel.java index f4b2212..f63cb76 100755 --- a/src/jalview/appletgui/AnnotationPanel.java +++ b/src/jalview/appletgui/AnnotationPanel.java @@ -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; } - } diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index dd6f190..6df2088 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -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 (yvisHeight) + { + 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) diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index 90f4595..ed7f359 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -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; } } diff --git a/src/jalview/renderer/AnnotationRenderer.java b/src/jalview/renderer/AnnotationRenderer.java index 7598f5f..fcdd77d 100644 --- a/src/jalview/renderer/AnnotationRenderer.java +++ b/src/jalview/renderer/AnnotationRenderer.java @@ -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)=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; } -- 1.7.10.2