Mega Code Archive

 
Categories / Java / SWT Jface Eclipse
 

Display an animated GIF

/*  * Image example snippet: display an animated GIF  *  * For a list of all SWT example snippets see  * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html#snippets  */ import org.eclipse.swt.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; public class Snippet141 {   static Display display;   static Shell shell;   static GC shellGC;   static Color shellBackground;   static ImageLoader loader;   static ImageData[] imageDataArray;   static Thread animateThread;   static Image image;   static final boolean useGIFBackground = false;      public static void main(String[] args) {     display = new Display();     shell = new Shell(display);     shell.setSize(300, 300);     shell.open();     shellGC = new GC(shell);     shellBackground = shell.getBackground();     FileDialog dialog = new FileDialog(shell);     dialog.setFilterExtensions(new String[] {"*.gif"});     String fileName = dialog.open();     if (fileName != null) {       loader = new ImageLoader();       try {         imageDataArray = loader.load(fileName);         if (imageDataArray.length > 1) {           animateThread = new Thread("Animation") {             public void run() {               /* Create an off-screen image to draw on, and fill it with the shell background. */               Image offScreenImage = new Image(display, loader.logicalScreenWidth, loader.logicalScreenHeight);               GC offScreenImageGC = new GC(offScreenImage);               offScreenImageGC.setBackground(shellBackground);               offScreenImageGC.fillRectangle(0, 0, loader.logicalScreenWidth, loader.logicalScreenHeight);                                try {                 /* Create the first image and draw it on the off-screen image. */                 int imageDataIndex = 0;                   ImageData imageData = imageDataArray[imageDataIndex];                 if (image != null && !image.isDisposed()) image.dispose();                 image = new Image(display, imageData);                 offScreenImageGC.drawImage(                   image,                   0,                   0,                   imageData.width,                   imageData.height,                   imageData.x,                   imageData.y,                   imageData.width,                   imageData.height);                 /* Now loop through the images, creating and drawing each one                  * on the off-screen image before drawing it on the shell. */                 int repeatCount = loader.repeatCount;                 while (loader.repeatCount == 0 || repeatCount > 0) {                   switch (imageData.disposalMethod) {                   case SWT.DM_FILL_BACKGROUND:                     /* Fill with the background color before drawing. */                     Color bgColor = null;                     if (useGIFBackground && loader.backgroundPixel != -1) {                       bgColor = new Color(display, imageData.palette.getRGB(loader.backgroundPixel));                     }                     offScreenImageGC.setBackground(bgColor != null ? bgColor : shellBackground);                     offScreenImageGC.fillRectangle(imageData.x, imageData.y, imageData.width, imageData.height);                     if (bgColor != null) bgColor.dispose();                     break;                   case SWT.DM_FILL_PREVIOUS:                     /* Restore the previous image before drawing. */                     offScreenImageGC.drawImage(                       image,                       0,                       0,                       imageData.width,                       imageData.height,                       imageData.x,                       imageData.y,                       imageData.width,                       imageData.height);                     break;                   }                                                imageDataIndex = (imageDataIndex + 1) % imageDataArray.length;                   imageData = imageDataArray[imageDataIndex];                   image.dispose();                   image = new Image(display, imageData);                   offScreenImageGC.drawImage(                     image,                     0,                     0,                     imageData.width,                     imageData.height,                     imageData.x,                     imageData.y,                     imageData.width,                     imageData.height);                                      /* Draw the off-screen image to the shell. */                   shellGC.drawImage(offScreenImage, 0, 0);                                      /* Sleep for the specified delay time (adding commonly-used slow-down fudge factors). */                   try {                     int ms = imageData.delayTime * 10;                     if (ms < 20) ms += 30;                     if (ms < 30) ms += 10;                     Thread.sleep(ms);                   } catch (InterruptedException e) {                   }                                      /* If we have just drawn the last image, decrement the repeat count and start again. */                   if (imageDataIndex == imageDataArray.length - 1) repeatCount--;                 }               } catch (SWTException ex) {                 System.out.println("There was an error animating the GIF");               } finally {                 if (offScreenImage != null && !offScreenImage.isDisposed()) offScreenImage.dispose();                 if (offScreenImageGC != null && !offScreenImageGC.isDisposed()) offScreenImageGC.dispose();                 if (image != null && !image.isDisposed()) image.dispose();               }             }           };           animateThread.setDaemon(true);           animateThread.start();         }       } catch (SWTException ex) {         System.out.println("There was an error loading the GIF");       }     }     while (!shell.isDisposed()) {       if (!display.readAndDispatch()) display.sleep();     }     display.dispose();   } }