A JavaFX Image always has a fixed size. Usually, this will be the
intrinsic size of the image, but it can also be any other size if the
image is created with the constructor that takes requestedWidth and
requestedHeight.
Internally, the JavaFX Image is stored with an arbitrary pixel
density. There's exactly two ways how you can end up with a pixel
density > 1:
a) use the @Nx image naming convention
b) use a variable-density image loader on a high-DPI screen

Importantly, you won't get a "dynamic" image if you do that (meaning
an image that can have different render sizes), you simply get a
normal JavaFX Image that is loaded with a higher pixel density.
This means that if you have a variable-density image loader and
canSetSourceRenderSize() is true, J2DImageLoader scales the intrinsic
size of the image (or the requested size) with the screen DPI.

A JavaFX Image is not a scene graph node, it doesn't know about where
it is used and how large it ends up on the screen.

I think what you're asking for is one of two things (or both things at once):

1. Allow multiple versions of an image loaded at the same time, and
defer selection until render time. Then choose the best version
depending on the transformed size of the rendered image. This would
work for discrete versions like you get with the @Nx naming
convention.
2. Allow an image to be dynamically rasterized from source depending
on the transformed size of the rendered image. This would work for
variable-density images.

I think that the first option would be a good enhancement. The second
option seems much harder to achieve.



On Mon, Jul 14, 2025 at 3:20 PM mkpaz <quizy...@gmail.com> wrote:
>
> Hello,
>
> I'm testing the new pluggable image API with SVG and noticed one thing.
> Since SVG is a scalable vector format, it can be rendered at an arbitrary 
> size.
> For this purpose, we need to know the frame (pane) size and scale the image 
> accordingly while rendering.
> As I understand, ImageReadParam is used to pass the frame size to the image 
> reader.
>
> public class ImageReadParam extends IIOParam {
>     /**
>      * Returns {@code true} if this reader allows the source image to be 
> rendered at an
>      * arbitrary size as part of the decoding process ...
>      */
>     public boolean canSetSourceRenderSize() {
>         return canSetSourceRenderSize;
>     }
> }
>
> But when I set canSetSourceRenderSize to true to activate this, I don't get 
> the client frame size.
> Instead, I get the actual image size, which the reader already knows since it 
> implements the getWidth() and getHeight() methods.
>
> I read the code and came across this:
> https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/java/com/sun/javafx/iio/java2d/J2DImageLoader.java#L122
>
> Why does the image loader use the reader's width and height in both branches?
> Shouldn't the loader provide the frame size when canSetSourceRenderSize 
> returns true?
> Maybe I'm looking for something that isn't supported? Yet?
>
> Best regards.

Reply via email to