Fast paint method implemented
authoramwaterhouse <Andrew Waterhouse>
Wed, 6 Apr 2005 11:38:59 +0000 (11:38 +0000)
committeramwaterhouse <Andrew Waterhouse>
Wed, 6 Apr 2005 11:38:59 +0000 (11:38 +0000)
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/AnnotationPanel.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/SeqCanvas.java

index 248fb3d..04b596a 100755 (executable)
@@ -280,7 +280,6 @@ public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListene
        return false;\r
       vscroll.setValue(vscroll.getValue() + 1);\r
     }\r
-\r
     return true;\r
   }\r
 \r
@@ -333,6 +332,8 @@ public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListene
 \r
   public void adjustmentValueChanged(AdjustmentEvent evt)\r
   {\r
+    int oldX = av.getStartRes();\r
+    int oldY = av.getStartSeq();\r
 \r
     if (evt.getSource() == hscroll)\r
     {\r
@@ -359,7 +360,10 @@ public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListene
     if(overviewPanel!=null)\r
       overviewPanel.setBoxPosition();\r
 \r
-    repaint();\r
+    seqPanel.seqCanvas.fastPaint(av.getStartRes()-oldX, av.getStartSeq()-oldY);\r
+    idPanel.idCanvas.fastPaint( av.getStartSeq()-oldY );\r
+    scalePanel.repaint();\r
+    annotationPanel.fastPaint(av.getStartRes()-oldX);\r
 \r
   }\r
 \r
index 2874494..c94a5a8 100755 (executable)
@@ -23,7 +23,12 @@ public class AnnotationPanel extends JPanel implements MouseListener, MouseMotio
   static Color HELIX_COLOUR = Color.red.darker();\r
   static Color SHEET_COLOUR = Color.green.darker().darker();\r
 \r
-  BufferedImage bi;\r
+\r
+  BufferedImage image;\r
+  Graphics2D gg;\r
+  FontMetrics fm;\r
+  int imgWidth=0;\r
+\r
 \r
 \r
 \r
@@ -312,27 +317,63 @@ public class AnnotationPanel extends JPanel implements MouseListener, MouseMotio
 \r
   public void paintComponent(Graphics g)\r
   {\r
-    if(bi==null\r
-       || bi.getWidth()!=ap.annotationPanel.getWidth()\r
-       || bi.getHeight()!=ap.annotationPanel.getHeight())\r
-    {\r
-      bi = new BufferedImage(ap.annotationPanel.getWidth(),\r
-                           ap.annotationPanel.getHeight(),\r
-                           BufferedImage.TYPE_INT_RGB);\r
-    }\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0,getWidth(), getHeight());\r
+\r
+    imgWidth = (av.endRes-av.startRes+1) *av.charWidth;\r
+\r
+    image = new BufferedImage(imgWidth,\r
+                                ap.annotationPanel.getHeight(),\r
+                                BufferedImage.TYPE_INT_RGB);\r
+      gg = (Graphics2D) image.getGraphics();\r
+      gg.setColor(Color.white);\r
+      gg.fillRect(0, 0, imgWidth, getHeight());\r
+      gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+                          RenderingHints.VALUE_ANTIALIAS_ON);\r
+      fm = gg.getFontMetrics();\r
+      gg.setFont(av.getFont());\r
 \r
-    drawComponent( (Graphics2D)bi.getGraphics() );\r
-    g.drawImage( bi, 0, 0, this);\r
+\r
+    drawComponent( gg, av.startRes, av.endRes+1);\r
+    g.drawImage( image, 0, 0, this);\r
   }\r
 \r
-  public void drawComponent(Graphics2D g)\r
+  public void fastPaint(int horizontal)\r
+{\r
+  if(image==null || horizontal ==0)\r
   {\r
-    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
-    FontMetrics fm = g.getFontMetrics();\r
-    g.setFont(av.getFont());\r
-    g.setColor(Color.white);\r
-    g.fillRect(0,0,getWidth(),getHeight());\r
+    repaint();\r
+    return;\r
+  }\r
+\r
+  gg.copyArea( 0,0, imgWidth, getHeight(), -horizontal*av.charWidth, 0 );\r
+  int sr=av.startRes, er=av.endRes+1, transX=0;\r
 \r
+  if(horizontal>0) // scrollbar pulled right, image to the left\r
+  {\r
+    transX =  (er-sr-horizontal)*av.charWidth;\r
+    sr = er - horizontal ;\r
+  }\r
+  else if(horizontal<0)\r
+  {\r
+    er = sr-horizontal;\r
+  }\r
+\r
+\r
+  gg.translate(transX, 0);\r
+\r
+  drawComponent(gg, sr, er);\r
+\r
+  gg.translate( -transX, 0 );\r
+\r
+  getGraphics().drawImage(image, 0, 0, this);\r
+}\r
+\r
+\r
+  public void drawComponent(Graphics2D g, int startRes, int endRes)\r
+  {\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0,(endRes-startRes) *av.charWidth, getHeight());\r
     if(av.alignment.getAlignmentAnnotation()==null || av.alignment.getAlignmentAnnotation().length<1)\r
     {\r
       g.setColor(Color.black);\r
@@ -366,11 +407,11 @@ public class AnnotationPanel extends JPanel implements MouseListener, MouseMotio
       else\r
         iconOffset = 0;\r
 \r
-      for(j=av.startRes; j<av.endRes+1; j++)\r
+      for(j=startRes; j<endRes; j++)\r
       {\r
         validRes = row.annotations[j]==null?false:true;\r
 \r
-       x = (j-av.getStartRes())*av.charWidth;\r
+       x = (j-startRes)*av.charWidth;\r
 \r
 \r
        if(activeRow==i)\r
@@ -383,7 +424,7 @@ public class AnnotationPanel extends JPanel implements MouseListener, MouseMotio
            {\r
              int v = Integer.parseInt(activeRes.get(n).toString()) ;\r
              if (v == j)\r
-               g.fillRect( (j-av.getStartRes()) * av.charWidth, y, av.charWidth, row.height);\r
+               g.fillRect( (j-startRes) * av.charWidth, y, av.charWidth, row.height);\r
            }\r
        }\r
 \r
index 2aa39a7..cb7fddf 100755 (executable)
@@ -2,7 +2,7 @@ package jalview.gui;
 \r
 import java.awt.*;\r
 import java.awt.Graphics2D.*;\r
-\r
+import java.awt.image.*;\r
 import javax.swing.*;\r
 import jalview.datamodel.*;\r
 import jalview.analysis.*;\r
@@ -14,6 +14,9 @@ public class IdCanvas extends JPanel
 \r
   protected int     maxIdLength = -1;\r
   protected String  maxIdStr    = null;\r
+  BufferedImage image;\r
+  Graphics2D gg;\r
+  int imgHeight=0;\r
 \r
   public IdCanvas(AlignViewport av)\r
   {\r
@@ -22,7 +25,7 @@ public class IdCanvas extends JPanel
     PaintRefresher.Register(this);\r
   }\r
 \r
-  public void drawIdString(Graphics gg,SequenceI s,int i, int starty, int ypos) {\r
+  public void drawIdString(Graphics2D gg,SequenceI s,int i, int starty, int ypos) {\r
       int charHeight = av.getCharHeight();\r
 \r
 \r
@@ -44,39 +47,79 @@ public class IdCanvas extends JPanel
 \r
   }\r
 \r
-  public void paintComponent(Graphics g) {\r
-    Graphics2D gg = (Graphics2D)g;\r
-    gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
-    AlignmentI al         = av.alignment;\r
-    int        charHeight = av.charHeight;\r
-    Font italic = new Font(av.getFont().getName(), Font.ITALIC, av.getFont().getSize());\r
+  public void fastPaint(int vertical)\r
+  {\r
+    if(image==null)\r
+    {\r
+      repaint();\r
+      return;\r
+    }\r
+\r
+    gg.copyArea( 0,0, getWidth(), imgHeight, 0, -vertical*av.charHeight );\r
 \r
-    gg.setFont(italic);\r
+    int ss=av.startSeq, es=av.endSeq, transY = 0;\r
+     if(vertical>0)    // scroll down\r
+     {\r
+       transY = imgHeight - vertical*av.charHeight;\r
+       ss = es - vertical;\r
+     }\r
+     else if(vertical<0)\r
+     {\r
+       es = ss-vertical;\r
+     }\r
 \r
+        gg.translate(0, transY);\r
+\r
+        drawIds(ss, es);\r
+\r
+        gg.translate( 0, -transY );\r
+\r
+\r
+    getGraphics().drawImage(image, 0, 0, this);\r
+  }\r
 \r
+  public void paintComponent(Graphics g)\r
+  {\r
+    imgHeight = getHeight();\r
+    imgHeight -= imgHeight % av.charHeight;\r
+    image = new BufferedImage(getWidth(), imgHeight, BufferedImage.TYPE_INT_RGB);\r
+    gg = (Graphics2D) image.getGraphics();\r
     //Fill in the background\r
     gg.setColor(Color.white);\r
-    gg.fillRect(0,0,getWidth(),getHeight());\r
+    gg.fillRect(0, 0, getWidth(), imgHeight);\r
+    gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+                        RenderingHints.VALUE_ANTIALIAS_ON);\r
+    Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
+                           av.getFont().getSize());\r
+    gg.setFont(italic);\r
+\r
+\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0,getWidth(),getHeight());\r
+\r
+    drawIds( av.getStartSeq(), av.endSeq);\r
+\r
+    g.drawImage(image, 0, 0, this);\r
+  }\r
+\r
+  void drawIds(int starty, int endy)\r
+  {\r
 \r
     Color currentColor     = Color.white;\r
     Color currentTextColor = Color.black;\r
 \r
-    //Which ids are we printing\r
-    int starty = av.getStartSeq();\r
-    int endy   = av.endSeq;\r
-\r
     if (av.getWrapAlignment())\r
     {\r
           // Draw the rest of the panels\r
-          int chunkHeight =  (al.getHeight() + 2)*av.charHeight;\r
+          int chunkHeight =  (av.alignment.getHeight() + 2)*av.charHeight;\r
           int row = av.getStartRes() / av.chunkWidth ;\r
           for(int ypos=2*av.charHeight;\r
-              ypos <= getHeight() && row*av.chunkWidth<al.getWidth();\r
+              ypos <= getHeight() && row*av.chunkWidth<av.alignment.getWidth();\r
               ypos += chunkHeight, row++ )\r
           {\r
             for (int i = starty; i < av.alignment.getHeight(); i++)\r
             {\r
-              SequenceI s = al.getSequenceAt(i);\r
+              SequenceI s = av.alignment.getSequenceAt(i);\r
               drawIdString(gg, s, i, 0, ypos);\r
             }\r
           }\r
@@ -90,7 +133,8 @@ public class IdCanvas extends JPanel
       {\r
         // Selected sequence colours\r
 \r
-        if (av.getSelectionGroup()!= null && av.getSelectionGroup().sequences.contains(al.getSequenceAt(i)))\r
+        if (av.getSelectionGroup()!= null\r
+            && av.getSelectionGroup().sequences.contains(av.alignment.getSequenceAt(i)))\r
         {\r
        //   if(av.alignment.findGroup(al.getSequenceAt(i)).getEndRes()==\r
           currentColor = Color.lightGray;\r
@@ -98,24 +142,24 @@ public class IdCanvas extends JPanel
         }\r
         else\r
         {\r
-          currentColor = al.getSequenceAt(i).getColor();\r
+          currentColor = av.alignment.getSequenceAt(i).getColor();\r
           currentTextColor = Color.black;\r
         }\r
 \r
         gg.setColor(currentColor);\r
 \r
         gg.fillRect(0,\r
-                    AlignmentUtil.getPixelHeight(starty, i, charHeight),\r
+                    AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
                     getWidth(),\r
-                    charHeight);\r
+                    av.charHeight);\r
 \r
         gg.setColor(currentTextColor);\r
-        String string = al.getSequenceAt(i).getName();\r
+        String string = av.alignment.getSequenceAt(i).getName();\r
         if(av.getShowFullId())\r
-          string = al.getSequenceAt(i).getDisplayId();\r
+          string = av.alignment.getSequenceAt(i).getDisplayId();\r
         gg.drawString(string, 0,\r
-                      AlignmentUtil.getPixelHeight(starty, i, charHeight) +\r
-                      charHeight - (charHeight / 5));\r
+                      AlignmentUtil.getPixelHeight(starty, i, av.charHeight) +\r
+                      av.charHeight - (av.charHeight / 5));\r
       }\r
 \r
       // add a border\r
index d3e5d6d..de421ed 100755 (executable)
@@ -53,6 +53,57 @@ public class SeqCanvas extends JPanel
   }\r
 \r
 \r
+public void fastPaint(int horizontal, int vertical)\r
+{\r
+    if(horizontal==0 && vertical==0)\r
+   {\r
+     return;\r
+   }\r
+\r
+\r
+   if (img==null || paintFlag)\r
+   {\r
+      repaint();\r
+      return;\r
+   }\r
+\r
+    gg.copyArea( 0,0, imgWidth, imgHeight, -horizontal*av.charWidth, -vertical*av.charHeight );\r
+\r
+ int sr=av.startRes, er=av.endRes+1, ss = av.startSeq, es = av.endSeq, transX=0, transY = 0;\r
+ if(horizontal>0) // scrollbar pulled right, image to the left\r
+ {\r
+   transX = (er-sr-horizontal)*av.charWidth;\r
+   sr = er - horizontal ;\r
+ }\r
+ else if(horizontal<0)\r
+ {\r
+   er = sr-horizontal;\r
+ }\r
+\r
+\r
+\r
+\r
+ if(vertical>0)    // scroll down\r
+ {\r
+   transY = imgHeight - vertical*av.charHeight;\r
+   ss = es - vertical;\r
+ }\r
+ else if(vertical<0)\r
+ {\r
+\r
+     es = ss-vertical;\r
+\r
+ }\r
+\r
+    gg.translate(transX, transY);\r
+\r
+    drawPanel(gg, sr,er,ss,es,sr,ss,0);\r
+\r
+    gg.translate( -transX, -transY );\r
+    getGraphics().drawImage(img,0,0,this);\r
+\r
+}\r
+\r
 /**\r
  * Definitions of startx and endx (hopefully):\r
  * SMJS This is what I'm working towards!\r
@@ -66,17 +117,20 @@ public class SeqCanvas extends JPanel
 \r
   public void paintComponent(Graphics g)\r
   {\r
+    // this draws the whole of the alignment\r
 \r
-    if (img==null ||  imgWidth!=getWidth() || imgHeight!=getHeight() || paintFlag)\r
-    {\r
       imgWidth  = getWidth();\r
       imgHeight = getHeight();\r
+\r
+      imgWidth -= imgWidth%av.charWidth;\r
+      imgHeight-= imgHeight%av.charHeight;\r
+\r
       img = createImage(imgWidth,imgHeight);\r
       gg  = (Graphics2D)img.getGraphics();\r
       gg.setFont(av.getFont());\r
       gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
+      gg.setClip(0,0,imgWidth, imgHeight);\r
       paintFlag = false;\r
-    }\r
 \r
 \r
     chunkWidth  =   getWidth()/av.charWidth;\r
@@ -85,8 +139,8 @@ public class SeqCanvas extends JPanel
     av.setChunkHeight(chunkHeight);\r
     av.setChunkWidth(chunkWidth);\r
 \r
-    gg.setColor(Color.WHITE);\r
-    gg.fillRect(0,0,imgWidth,imgHeight);\r
+    g.setColor(Color.WHITE);\r
+    g.fillRect(0,0,getWidth(), getHeight());\r
 \r
     if (av.getWrapAlignment())\r
       drawWrappedPanel(gg, getWidth(), getHeight(), av.startRes);\r
@@ -217,7 +271,7 @@ public class SeqCanvas extends JPanel
               inGroup = true;\r
               if (group == av.getSelectionGroup())\r
               {\r
-                g.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 3f, new float[]{5f,2f,2f}, 0f ));\r
+            //    g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 3f, new float[]{5f,2f,2f}, 0f ));\r
                 g.setColor(Color.RED);\r
               }\r
               else\r