If I call Graphics2D#drawImage(customImage, 0, 0, null) on a custom java.awt.Image subclass: the drawImage(..) method returns false and nothing renders.

Is this something I can write up as an openJDK ticket and propose a fix/PR for? (That is: is anyone with more authority willing to sponsor me if I try to approach this?)

I made a simple test case here <https://drive.google.com/file/d/1kMlRZ3SPp7FkGTsA1vdnn--tINGQRmp4/view?usp=sharing>. (about 230 lines)

I think the problem is coming from this line <https://drive.google.com/file/d/13v7jqv-XpDTIeYoC2uU0Rck4w3iI-u1I/view?usp=sharing> in SurfaceManager.java, where we cast an Image to a BufferedImage (after already ruling out the possibility that it’s a ToolkitImage).

In my case ‘img’ is not a BufferedImage, so this triggers a ClassCastException. (Which is responsibly caught and eventually translates into “the drawImage method returns false and nothing renders”).

In my case a viable solution might be to add code like this somewhere in SunGraphics2D or a supporting class:

try {
if (! (img instanceof BufferedImage || img instanceof ToolkitImage)) { img = newTempImage = Toolkit.getDefaultToolkit().createImage( img.getSource() );
    }
    paintAsUsual(img)
} finally {
    if (newTempImage != null)
        newTempImage.flush()
}

That solution could in some cases be wasteful regarding memory (if we constantly create and flush a ToolkitImage), but I’d suggest that seeing inefficient results is better than seeing no results. Thoughts?

Regards,
 - Jeremy

Reply via email to