package ca.vektor.swttests; import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.custom.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.*; public class Bug87577 { public boolean rescale = true; public float scale = 2.0f; public int numTiles = 40; public static void main (String [] args) { /* if (args.length < 1) { System.err.println("Usage: java gov.nasa.jpl.maestro.core.common.view.snippetsImageCanvasSnippet "); return; }*/ Bug87577 snippet = new Bug87577("c:\\testimage.jpg"); //Bug87577 snippet = new Bug87577("/tmp/testimage.jpg"); } public Bug87577(String imageFilename) { Display display = new Display (); Shell shell = new Shell (display); shell.setLayout(new FillLayout()); ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL); Image imageFromFile = new Image(display, imageFilename); MyImageCanvas canvas = new Bug87577.MyImageCanvas(imageFromFile, scrolledComposite, /*SWT.NO_BACKGROUND*/SWT.NONE); scrolledComposite.setContent(canvas); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); scrolledComposite.setMinWidth((int)((rescale ? scale : 1.0f) * imageFromFile.getBounds().width * numTiles)); scrolledComposite.setMinHeight((int)((rescale ? scale : 1.0f) * imageFromFile.getBounds().height * numTiles)); final ScrollBar hBar = scrolledComposite.getHorizontalBar(); final ScrollBar vBar = scrolledComposite.getVerticalBar(); hBar.setPageIncrement(1024); vBar.setPageIncrement(1024); shell.setSize(1024, 768); shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); } public class MyImageCanvas extends Canvas { Image image; /** * @param parent * @param style */ public MyImageCanvas(Image image, Composite parent, int style) { super(parent, style); this.image = image; addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { MyImageCanvas.this.paintCanvas(e); } }); addControlListener(new ControlListener() { public void controlMoved(ControlEvent e) { redraw(); } public void controlResized(ControlEvent e) { redraw(); } }); } public void paintCanvas(PaintEvent e) { GC gc = e.gc; Rectangle clipping = gc.getClipping(); int width = image.getBounds().width, height = image.getBounds().height; for (int i = 0; i < numTiles; i++) { for (int j = 0; j < numTiles; j++) { Rectangle cur = new Rectangle((int)(i * width * scale), (int)(j*height*scale), (int)(width*scale), (int)(height*scale)); if(!cur.intersects(clipping)) continue; if (rescale) { long before = System.currentTimeMillis(); gc.drawImage(image, 0, 0, width, height, (int)(i*width*scale), (int)(j*height*scale), (int)(width*scale), (int)(height*scale)); System.out.println("ms to paint an image: "+(System.currentTimeMillis()-before)); } else { long before = System.currentTimeMillis(); gc.drawImage(image, i*width, j*height); System.out.println("ms to paint an image: "+(System.currentTimeMillis()-before)); } } } } } }