From 2f66d527007afdf640fa541062c957d5469805ba Mon Sep 17 00:00:00 2001 From: gmungoc Date: Mon, 29 Jul 2019 11:18:54 +0100 Subject: [PATCH] JAL-3364 export split frame image including annotations and/or wrapped --- src/jalview/gui/AlignmentPanel.java | 40 ++++++++++++++++---------- src/jalview/gui/SeqCanvas.java | 33 +++++++++++++++------ src/jalview/io/HtmlSvgOutput.java | 3 +- src/jalview/renderer/AnnotationRenderer.java | 5 +++- 4 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index d387540..15bcfc1 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -876,19 +876,18 @@ public class AlignmentPanel extends GAlignmentPanel implements } /** - * DOCUMENT ME! + * Provides the implementation of Printable.print * * @param pg - * DOCUMENT ME! + * DOCUMENT ME! * @param pf - * DOCUMENT ME! + * DOCUMENT ME! * @param pi - * DOCUMENT ME! + * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws PrinterException - * DOCUMENT ME! */ @Override public int print(Graphics pg, PageFormat pf, int pi) @@ -901,7 +900,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getWrapAlignment()) { - return printWrappedAlignment(pwidth, pheight, pi, pg); + return printWrappedAlignment(pwidth, pheight, pi, pg, true); } else { @@ -1048,19 +1047,25 @@ public class AlignmentPanel extends GAlignmentPanel implements * Prints one page of an alignment in wrapped mode. Returns * Printable.PAGE_EXISTS (0) if a page was drawn, or Printable.NO_SUCH_PAGE if * no page could be drawn (page number out of range). + *

+ * The method is to write the whole alignment, but set a clip region such that + * only the specified page is written. This allows specified page(s) to be + * printed from the print dialog. The whole image may be written simply by + * making the page size match the image size. In this case, parameter + * {@code clipToPage} should be set to {@code false}, so that more output (for + * example the second panel of a split frame) can be written if wanted. * * @param pageWidth * @param pageHeight * @param pageNumber - * (0, 1, ...) + * (0, 1, ...) * @param g + * @param clipToPage * * @return - * - * @throws PrinterException */ public int printWrappedAlignment(int pageWidth, int pageHeight, int pageNumber, - Graphics g) throws PrinterException + Graphics g, boolean clipToPage) { int annotationHeight = 0; if (av.isShowAnnotation()) @@ -1099,7 +1104,10 @@ public class AlignmentPanel extends GAlignmentPanel implements */ g.translate(0, -pageNumber * pageHeight); - g.setClip(0, pageNumber * pageHeight, pageWidth, pageHeight); + if (clipToPage) + { + g.setClip(0, pageNumber * pageHeight, pageWidth, pageHeight); + } /* * draw sequence ids and annotation labels (if shown) @@ -1108,9 +1116,9 @@ public class AlignmentPanel extends GAlignmentPanel implements idCanvas.drawIdsWrapped((Graphics2D) g, av, 0, totalHeight); g.translate(idWidth, 0); - getSeqPanel().seqCanvas.drawWrappedPanelForPrinting(g, pageWidth - idWidth, totalHeight, 0); + g.translate(-idWidth, 0); if ((pageNumber * pageHeight) < totalHeight) { @@ -1221,7 +1229,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getWrapAlignment()) { printWrappedAlignment(dim1.width, dim1.height + borderBottomOffset, - 0, graphics); + 0, graphics, false); } else { @@ -1233,10 +1241,12 @@ public class AlignmentPanel extends GAlignmentPanel implements /* * append coding complement image */ - graphics.translate(0, dim1.height); boolean test = true; if (test) { + /* + * debug location of next write to Graphics + */ graphics.setColor(Color.red); graphics.drawString("Hello world", 0, 0); graphics.setColor(Color.black); @@ -1244,7 +1254,7 @@ public class AlignmentPanel extends GAlignmentPanel implements if (av.getCodingComplement().getWrapAlignment()) { comp.printWrappedAlignment(dim2.width, - dim2.height + borderBottomOffset, 0, graphics); + dim2.height + borderBottomOffset, 0, graphics, false); } else { diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index b3fcc54..49ae375 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -464,7 +464,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI public void drawWrappedPanelForPrinting(Graphics g, int canvasWidth, int canvasHeight, int startRes) { - drawWrappedPanel(g, canvasWidth, canvasHeight, startRes); + int heightDrawn = drawWrappedPanel(g, canvasWidth, canvasHeight, + startRes); SequenceGroup group = av.getSelectionGroup(); if (group != null) @@ -472,6 +473,11 @@ public class SeqCanvas extends JComponent implements ViewportListenerI drawWrappedSelection((Graphics2D) g, group, canvasWidth, canvasHeight, startRes); } + + /* + * shift graphics (0, 0) to below the region drawn + */ + g.translate(0, heightDrawn); } /** @@ -536,18 +542,20 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } /** - * Draws as many widths of a wrapped alignment as can fit in the visible - * window + * Draws as many widths of a wrapped alignment as can fit in the visible window, + * and returns the height drawn in pixels * * @param g * @param canvasWidth - * available width in pixels + * available width in pixels * @param canvasHeight - * available height in pixels + * available height in pixels * @param startColumn - * the first column (0...) of the alignment to draw + * the first column (0...) of the alignment to draw + * + * @return */ - public void drawWrappedPanel(Graphics g, int canvasWidth, + public int drawWrappedPanel(Graphics g, int canvasWidth, int canvasHeight, final int startColumn) { int wrappedWidthInResidues = calculateWrappedGeometry(canvasWidth, @@ -583,6 +591,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI } drawWrappedDecorators(g, startColumn); + + return ypos; } /** @@ -696,7 +706,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI if (clip == null) { - g.setClip(0, 0, viewportWidth * charWidth, canvasHeight); + // g.setClip(0, 0, viewportWidth * charWidth, canvasHeight); } else { @@ -730,7 +740,12 @@ public class SeqCanvas extends JComponent implements ViewportListenerI startColumn, endx + 1); g.translate(0, -yShift); } - g.setClip(clip); + + if (clip != null) + { + g.setClip(clip); + } + g.translate(-xOffset, 0); } diff --git a/src/jalview/io/HtmlSvgOutput.java b/src/jalview/io/HtmlSvgOutput.java index 1325c10..ac2526c 100644 --- a/src/jalview/io/HtmlSvgOutput.java +++ b/src/jalview/io/HtmlSvgOutput.java @@ -79,9 +79,8 @@ public class HtmlSvgOutput extends HTMLOutput } public int printWrapped(int pwidth, int pheight, int pi, Graphics... pg) - throws PrinterException { - return ap.printWrappedAlignment(pwidth, pheight, pi, pg[0]); + return ap.printWrappedAlignment(pwidth, pheight, pi, pg[0], false); } private String getHtml(String titleSvg, String alignmentSvg, diff --git a/src/jalview/renderer/AnnotationRenderer.java b/src/jalview/renderer/AnnotationRenderer.java index adca17e..0a4c2d5 100644 --- a/src/jalview/renderer/AnnotationRenderer.java +++ b/src/jalview/renderer/AnnotationRenderer.java @@ -1093,7 +1093,10 @@ public class AnnotationRenderer System.err.println("Annotation Rendering time:" + (System.currentTimeMillis() - stime)); } - ; + if (!av.getWrapAlignment()) + { + g.translate(0, y); + } return !usedFaded; } -- 1.7.10.2