X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FOverviewRenderer.java;h=992a1b2ce7d2d08a23e21fb330407fccb360d3d9;hb=fc8a59878075498420187716fde697dfc81ff490;hp=709816c0ec598c83f93d39891ed52d641292bb33;hpb=3edb041e2b9593c08bfcb75d9411cb6db5362546;p=jalview.git diff --git a/src/jalview/renderer/OverviewRenderer.java b/src/jalview/renderer/OverviewRenderer.java index 709816c..992a1b2 100644 --- a/src/jalview/renderer/OverviewRenderer.java +++ b/src/jalview/renderer/OverviewRenderer.java @@ -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; @@ -40,9 +42,9 @@ public class OverviewRenderer // transparency of hidden cols/seqs overlay private final float TRANSPARENCY = 0.5f; - private FeatureColourFinder finder; + private final Color HIDDEN_COLOUR = Color.DARK_GRAY.darker(); - private jalview.api.SequenceRenderer sr; + private FeatureColourFinder finder; // image to render on private BufferedImage miniMe; @@ -56,11 +58,22 @@ public class OverviewRenderer // flag to indicate whether to halt drawing private volatile boolean redraw = false; - public OverviewRenderer(jalview.api.SequenceRenderer seqRenderer, - FeatureRenderer fr, OverviewDimensions od) + // reference to alignment, needed to get sequence groups + private AlignmentI al; + + private ResidueShaderI shader; + + private OverviewResColourFinder resColFinder; + + public OverviewRenderer(FeatureRenderer fr, OverviewDimensions od, + AlignmentI alignment, + ResidueShaderI resshader, OverviewResColourFinder colFinder) { - sr = seqRenderer; finder = new FeatureColourFinder(fr); + resColFinder = colFinder; + + al = alignment; + shader = resshader; pixelsPerCol = od.getPixelsPerCol(); pixelsPerSeq = od.getPixelsPerSeq(); @@ -84,9 +97,6 @@ public class OverviewRenderer int seqIndex = 0; int pixelRow = 0; - BufferedImage hiddenImage = buildHiddenImage(rows, cols, - miniMe.getWidth(), miniMe.getHeight()); - for (int alignmentRow : rows) { if (redraw) @@ -96,7 +106,10 @@ public class OverviewRenderer // get details of this alignment row 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, miniMe.getHeight() - 1); @@ -111,8 +124,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 @@ -120,9 +132,8 @@ public class OverviewRenderer // panel if (pixelCol <= endCol) { - rgbcolor = getColumnColourFromSequence(seq, - alignmentCol, - finder); + rgbcolor = getColumnColourFromSequence(allGroups, seq, + alignmentCol, finder); // fill in the appropriate number of pixels for (int row = pixelRow; row <= endRow; ++row) @@ -141,42 +152,73 @@ public class OverviewRenderer seqIndex++; } - return applyMask(hiddenImage, miniMe); + overlayHiddenRegions(rows, cols); + return miniMe; } - /* + /** * Find the colour of a sequence at a specified column position + * + * @param seq + * sequence to get colour for + * @param lastcol + * column position to get colour for + * @param fcfinder + * FeatureColourFinder to use + * @return colour of sequence at this position, as RGB */ - private int getColumnColourFromSequence(jalview.datamodel.SequenceI seq, + private int getColumnColourFromSequence(SequenceGroup[] allGroups, + jalview.datamodel.SequenceI seq, 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); } return color.getRGB(); } - /* - * Overlay a buffered image (mask) onto another image (image) where mask - * has some transparency so image shows through from below + /** + * Overlay the hidden regions on the overview image + * + * @param rows + * collection of rows the overview is built over + * @param cols + * collection of columns the overview is built over */ - private BufferedImage applyMask(BufferedImage mask, BufferedImage image) + private void overlayHiddenRegions(AlignmentRowsCollectionI rows, + AlignmentColsCollectionI cols) { - Graphics2D g = (Graphics2D) image.getGraphics(); - g.setComposite( - AlphaComposite.getInstance(AlphaComposite.SRC_OVER, - TRANSPARENCY)); - g.drawImage(mask, 0, 0, image.getWidth(), image.getHeight(), null); - return image; + if (cols.hasHidden() || rows.hasHidden()) + { + BufferedImage mask = buildHiddenImage(rows, cols, miniMe.getWidth(), + miniMe.getHeight()); + + Graphics2D g = (Graphics2D) miniMe.getGraphics(); + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, + TRANSPARENCY)); + g.drawImage(mask, 0, 0, miniMe.getWidth(), miniMe.getHeight(), null); + } } - /* - * Build a masking image of hidden columns and rows to be applied on top - * of the main overview image. + /** + * Build a masking image of hidden columns and rows to be applied on top of + * the main overview image. + * + * @param rows + * collection of rows the overview is built over + * @param cols + * collection of columns the overview is built over + * @param width + * width of overview in pixels + * @param height + * height of overview in pixels + * @return BufferedImage containing mask of hidden regions */ private BufferedImage buildHiddenImage(AlignmentRowsCollectionI rows, AlignmentColsCollectionI cols, int width, int height) @@ -188,7 +230,7 @@ public class OverviewRenderer int colIndex = 0; int pixelCol = 0; - Color hidden = Color.DARK_GRAY.darker(); + Color hidden = resColFinder.getHiddenColour(); Graphics2D g2d = (Graphics2D) hiddenImage.getGraphics(); @@ -287,8 +329,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) @@ -302,7 +343,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; @@ -316,6 +358,13 @@ public class OverviewRenderer } } + /** + * Allows redraw flag to be set + * + * @param b + * value to set redraw to: true = redraw is occurring, false = no + * redraw + */ public void setRedraw(boolean b) { synchronized (this)