JDK-6479615 : Splash screen cause the VM to crash.
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 6
  • Priority: P2
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2006-10-09
  • Updated: 2011-02-16
  • Resolved: 2006-10-10
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
Hotspot client 1.6.0-rc-b99 mixed mode, sharing.

FULL OS VERSION :
Microsoft Windows XP Professional Version 2002  Service Pack 2

EXTRA RELEVANT SYSTEM CONFIGURATION :
  Toshiba Pentium M laptop (1.7GHz, 496Mb RAM)

A DESCRIPTION OF THE PROBLEM :
I am experimenting with the new splash screen options and was trying to manipulate BufferedImage objects when the system crashed. What I am doing very likely contains mistakes as I am manipulating classes I don't know well.

THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: Yes

THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Did not try

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Just run the program.

EXPECTED VERSUS ACTUAL BEHAVIOR :
Would like a window to display

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Attached seperatly

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.JWindow;

public class BugSplashScreen {

    private JWindow oldFashionedSplashScreen;
    private BufferedImage splashScreenImage;
    private BufferedImage overlay;
   
    BugSplashScreen(String fileName) {
        try {
            File file = new File(fileName);
            if (!file.exists()) {
                throw new IllegalArgumentException("File doesn't exist: "+file.getAbsolutePath());
            }
            this.splashScreenImage = getSplashScreenImage(file);
        } catch (IOException e) {
            throw new Error("Problem with the splash screen image",e);
        }
        int height = this.splashScreenImage.getHeight();
        int width = this.splashScreenImage.getWidth();
        this.oldFashionedSplashScreen = new JWindow();
        this.oldFashionedSplashScreen.setSize(width, height);
        this.oldFashionedSplashScreen.add(new SplashPanel(this.splashScreenImage));
        this.oldFashionedSplashScreen.setVisible(true);
    }
   
    private BufferedImage getSplashScreenImage(File file) throws IOException {
        return ImageIO.read(file);
    }
   
    /**
     * Creates a graphics context (as a {@link Graphics2D} object) for the splash
     * screen overlay image, which allows you to draw over the splash screen.
     * Note that you do not draw on the main image but on the image that is
     * displayed over the main image using alpha blending. Also note that drawing
     * on the overlay image does not necessarily update the contents of splash
     * screen window. You should call {@code update()} on the
     * <code>SplashScreen</code> when you want the splash screen to be
     * updated immediately.
     *
     * @return graphics context for the splash screen overlay surface
     * @throws IllegalStateException if the splash screen has already been closed
     */
    public Graphics2D createGraphics() throws IllegalStateException {
        return this.overlay.createGraphics();
    }

    public void close() {
        this.oldFashionedSplashScreen.setVisible(false);
        this.oldFashionedSplashScreen.dispose();
        this.oldFashionedSplashScreen = null;
    }
   
    class SplashPanel extends JPanel {
       
        BufferedImage bufferedImage;
       
        SplashPanel(BufferedImage bufferedImage) {
            this.bufferedImage = bufferedImage;
        }
       
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D componentGraphics = (Graphics2D)g;
            //componentGraphics.drawImage(this.bufferedImage, new AffineTransformOp(new AffineTransform(),null),0,0);
            componentGraphics.drawImage(this.bufferedImage, new RescaleOp(1.0f,0.0f,null),0,0);
        }
    }

    public static void main(String[] args) {
        BugSplashScreen hmss = new BugSplashScreen("PICT0112A.jpg");
        //JETSplashScreen jetSplashScreen = JETSplashScreen.getJETSplashScreen("src/images/PICT0112A.jpg");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            throw new Error("",e);
        }
        hmss.close();
        //jetSplashScreen.close();
    }
   
}
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Not yet

Comments
EVALUATION Technically, this problem is the duplicate of 4886506. However, in this particular problem the identity op is used (the RescaleOp with parameters like described here does not change the image at all). Probably, we can handle the case of the such identical ops in the special way and skip these ops completely.
11-10-2006

EVALUATION This is bug 4886506: VM crashes when using RescaleOp with certain buffered image types replacing the RescaleOp with the AffineTransformOp, everything is fine.
10-10-2006