MultiResolutionImageSupport optimizations:

- ProducerMultiResolutionImage: avoid creation of base image to get image width and height, because if screen is scaled then the base image would be never painted, but consumes memory and takes time to create it
- MappedMultiResolutionImage: delegate getting width/height/source/property to original image, to defer/avoid creation of mapped image
This commit is contained in:
Karl Tauber
2023-09-04 13:08:21 +02:00
parent 03f9115fbf
commit 9efb9761c6

View File

@@ -20,6 +20,8 @@ import java.awt.Dimension;
import java.awt.Image; import java.awt.Image;
import java.awt.image.AbstractMultiResolutionImage; import java.awt.image.AbstractMultiResolutionImage;
import java.awt.image.BaseMultiResolutionImage; import java.awt.image.BaseMultiResolutionImage;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.awt.image.MultiResolutionImage; import java.awt.image.MultiResolutionImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -117,6 +119,26 @@ public class MultiResolutionImageSupport
return mapAndCacheImage( mrImage ); return mapAndCacheImage( mrImage );
} }
@Override
public int getWidth( ImageObserver observer ) {
return mrImage.getWidth( observer );
}
@Override
public int getHeight( ImageObserver observer ) {
return mrImage.getHeight( observer );
}
@Override
public ImageProducer getSource() {
return mrImage.getSource();
}
@Override
public Object getProperty( String name, ImageObserver observer ) {
return mrImage.getProperty( name, observer );
}
private Image mapAndCacheImage( Image image ) { private Image mapAndCacheImage( Image image ) {
return cache.computeIfAbsent( image, img -> { return cache.computeIfAbsent( image, img -> {
// using ImageIcon here makes sure that the image is loaded // using ImageIcon here makes sure that the image is loaded
@@ -160,6 +182,16 @@ public class MultiResolutionImageSupport
return produceAndCacheImage( dimensions[0] ); return produceAndCacheImage( dimensions[0] );
} }
@Override
public int getWidth( ImageObserver observer ) {
return dimensions[0].width;
}
@Override
public int getHeight( ImageObserver observer ) {
return dimensions[0].height;
}
private Image produceAndCacheImage( Dimension size ) { private Image produceAndCacheImage( Dimension size ) {
return cache.computeIfAbsent( size, size2 -> { return cache.computeIfAbsent( size, size2 -> {
// using ImageIcon here makes sure that the image is loaded // using ImageIcon here makes sure that the image is loaded