RFR: 8306707: Support pluggable image loading via javax.imageio [v3]

Michael Strauß mstrauss at openjdk.org
Wed Oct 16 14:21:17 UTC 2024


On Wed, 16 Oct 2024 14:15:42 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

>> This PR is an improved version of #1093.
>> 
>> JavaFX can load BMP, GIF, PNG, and JPEG images with its built-in image loaders. It has been a long-standing request to support more image formats, most notably (but not limited to) SVG. However, adding more built-in image loaders is a significant effort not only in creating the functionality, but also in maintaining the additional dependencies.
>> 
>> This will probably not happen any time soon, so we are left with three alternatives:
>> 1. Accept the fact that JavaFX will never be able to load additional image formats.
>> 2. Create a public image loader API, and hope that developers in the JavaFX ecosystem will create image loader plugins.
>> 3. Leverage the existing Java Image I/O API.
>> 
>> From these options, I think we should simply support existing Java APIs; both because it is the shortest and most realistic path forward, but also because I don't think it is sensible to bifurcate pluggable image loading in the Java ecosystem.
>> 
>> Of course, Java Image I/O is a part of the `java.desktop` module, which as of now, all JavaFX applications require. However, it has been noted in the previous PR that we shouldn't lock JavaFX into the `java.desktop` dependency even further.
>> 
>> I've improved this PR to not permanently require the `java.desktop` dependency: if the module is present, then JavaFX will use Image I/O for image formats that it can't load with the built-in loaders; if the module is not present, only the built-in loaders are available.
>> 
>> I have prepared a small sample application that showcases how the feature can be used to load SVG images in a JavaFX application: https://github.com/mstr2/jfx-imageio-sample
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
> 
>   review changes

> Just a general comment on other code in `ImageStorage`:
> 
> ```java
>         byte[] header = new byte[getMaxSignatureLength()];
>         try {
>             ImageTools.readFully(stream, header);
>         } catch (EOFException ignored) {
>             return null;
>         }
> ```
> 
> This code will take the largest possible signature length for known registered types (ie. JPG, GIF, BMP, PNG) and load those bytes. But if one of these formats could store a tiny image that would be smaller than the largest signature, then that image can't be loaded as this code would throw EOF and not return a suitable loader...

I've created a [ticket](https://bugs.openjdk.org/browse/JDK-8342394) to track this issue.

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1593#issuecomment-2416982324


More information about the openjfx-dev mailing list