Merge branch 'releases/Release_2_10_2b1_Branch' into develop
[jalview.git] / src / jalview / gui / SeqCanvas.java
index 8004cac..4e896a0 100755 (executable)
@@ -283,7 +283,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
    */
   public void fastPaint(int horizontal, int vertical)
   {
-    if (fastpainting || gg == null)
+    if (fastpainting || gg == null || img == null)
     {
       return;
     }
@@ -429,12 +429,16 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
   public void drawPanelForPrinting(Graphics g1, int startRes, int endRes,
           int startSeq, int endSeq)
   {
+    drawPanel(g1, startRes, endRes, startSeq, endSeq, 0);
+
     BufferedImage selectImage = drawSelectionGroup(startRes, endRes,
             startSeq, endSeq);
-    drawPanel(g1, startRes, endRes, startSeq, endSeq, 0);
-    ((Graphics2D) g1).setComposite(
-            AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
-    g1.drawImage(selectImage, 0, 0, this);
+    if (selectImage != null)
+    {
+      ((Graphics2D) g1).setComposite(AlphaComposite
+              .getInstance(AlphaComposite.SRC_OVER));
+      g1.drawImage(selectImage, 0, 0, this);
+    }
   }
 
   /**
@@ -453,18 +457,34 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
           int canvasHeight, int startRes)
   {
     SequenceGroup group = av.getSelectionGroup();
-    BufferedImage selectImage = new BufferedImage(canvasWidth, canvasHeight,
-            BufferedImage.TYPE_INT_ARGB); // ARGB so alpha compositing works
+
+    drawWrappedPanel(g, canvasWidth, canvasHeight, startRes);
 
     if (group != null)
     {
-      Graphics2D g2 = selectImage.createGraphics();
-      setupSelectionGroup(g2, selectImage);
-      drawWrappedSelection(g2, group, canvasWidth, canvasHeight, startRes);
-      drawWrappedPanel(g, canvasWidth, canvasHeight, startRes);
-      g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
-      g.drawImage(selectImage, 0, 0, this);
-      g2.dispose();
+      BufferedImage selectImage = null;
+      try
+      {
+        selectImage = new BufferedImage(canvasWidth, canvasHeight,
+                BufferedImage.TYPE_INT_ARGB); // ARGB so alpha compositing works
+      } catch (OutOfMemoryError er)
+      {
+        System.gc();
+        System.err.println("Print image OutOfMemory Error.\n" + er);
+        new OOMWarning("Creating wrapped alignment image for printing", er);
+      }
+      if (selectImage != null)
+      {
+        Graphics2D g2 = selectImage.createGraphics();
+        setupSelectionGroup(g2, selectImage);
+        drawWrappedSelection(g2, group, canvasWidth, canvasHeight,
+                startRes);
+
+        g2.setComposite(
+                AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
+        g.drawImage(selectImage, 0, 0, this);
+        g2.dispose();
+      }
     }
   }
 
@@ -807,7 +827,6 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
     return annotations.adjustPanelHeight();
   }
 
-
   /**
    * Draws the visible region of the alignment on the graphics context. If there
    * are hidden column markers in the visible region, then each sub-region
@@ -827,9 +846,8 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
    * @param yOffset
    *          vertical offset at which to draw (for wrapped alignments)
    */
-  private void drawPanel(Graphics g1, int startRes, int endRes,
-          int startSeq, int endSeq, int yOffset)
-
+  public void drawPanel(Graphics g1, final int startRes, final int endRes,
+          final int startSeq, final int endSeq, final int yOffset)
   {
     updateViewport();
     if (!av.hasHiddenColumns())
@@ -903,7 +921,6 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
 
   }
 
-
   /**
    * Draws a region of the visible alignment
    * 
@@ -1010,7 +1027,7 @@ public class SeqCanvas extends JComponent implements ViewportListenerI
       {
         drawPartialGroupOutline(g, group, startRes, endRes, startSeq,
                 endSeq, offset);
-        
+
         groupIndex++;
 
         g.setStroke(new BasicStroke());