@@ -1887,6 +1887,12 @@ <T> T applyUsingAnyHandle(Function<ImageHandle, T> function) {
18871887 return function .apply (zoomLevelToImageHandle .values ().iterator ().next ());
18881888}
18891889
1890+ private int getClosestAvailableZoom (int zoom ) {
1891+ TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1892+ int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1893+ return closestZoom ;
1894+ }
1895+
18901896/**
18911897 * Invokes platform specific functionality to allocate a new image.
18921898 * <p>
@@ -1939,13 +1945,14 @@ public Collection<Integer> getPreservedZoomLevels() {
19391945 return Collections .emptySet ();
19401946 }
19411947
1948+ protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
1949+
19421950 abstract ImageData newImageData (ZoomContext zoomContext );
19431951
19441952 abstract AbstractImageProviderWrapper createCopy (Image image );
19451953
19461954 ImageData getScaledImageData (int zoom ) {
1947- TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1948- int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1955+ int closestZoom = getClosestAvailableZoom (zoom );
19491956 return DPIUtil .scaleImageData (device , getImageMetadata (new ZoomContext (closestZoom )).getImageData (), zoom , closestZoom );
19501957 }
19511958
@@ -2004,12 +2011,18 @@ AbstractImageProviderWrapper createCopy(Image image) {
20042011 public Collection <Integer > getPreservedZoomLevels () {
20052012 return Collections .singleton (zoomForHandle );
20062013 }
2014+
2015+ @ Override
2016+ protected ElementAtZoom <ImageData > loadImageData (int zoom ) {
2017+ int closestZoom = getClosestAvailableZoom (zoom );
2018+ ImageData imageData = getImageMetadata (new ZoomContext (closestZoom )).getImageData ();
2019+ return new ElementAtZoom <>(imageData , closestZoom );
2020+ }
20072021}
20082022
20092023private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper {
20102024 private final Map <Integer , ImageData > cachedImageData = new HashMap <>();
20112025
2012- protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
20132026
20142027 void initImage () {
20152028 // As the init call configured some Image attributes (e.g. type)
@@ -2180,8 +2193,7 @@ protected Rectangle getBounds(int zoom) {
21802193 return Win32DPIUtils .pointToPixel (rectangle , zoom );
21812194 }
21822195
2183- @ Override
2184- ImageData newImageData (ZoomContext zoomContext ) {
2196+ private ImageData resolveBaseOrNewImage (ZoomContext zoomContext ) {
21852197 int targetZoom = zoomContext .targetZoom ();
21862198 if (zoomLevelToImageHandle .isEmpty ()) {
21872199 return createBaseHandle (targetZoom ).getImageData ();
@@ -2191,7 +2203,24 @@ ImageData newImageData(ZoomContext zoomContext) {
21912203 if (memGC != null ) {
21922204 return newImageHandle (zoomContext ).getImageData ();
21932205 }
2194- return getScaledImageData (targetZoom );
2206+
2207+ return null ;
2208+ }
2209+
2210+ @ Override
2211+ ImageData newImageData (ZoomContext zoomContext ) {
2212+ ImageData data = resolveBaseOrNewImage (zoomContext );
2213+ return data != null ? data : getScaledImageData (zoomContext .targetZoom );
2214+ }
2215+
2216+ @ Override
2217+ protected ElementAtZoom <ImageData > loadImageData (int zoom ) {
2218+ int closestZoom = getClosestAvailableZoom (zoom );
2219+ ImageData data = resolveBaseOrNewImage (new ZoomContext (zoom ));
2220+ if (data != null ) {
2221+ return new ElementAtZoom <>(data , zoom );
2222+ }
2223+ return new ElementAtZoom <>(getImageMetadata (new ZoomContext (closestZoom )).getImageData (), closestZoom );
21952224 }
21962225
21972226 @ Override
@@ -2326,7 +2355,6 @@ private ImageHandle initializeHandleFromSource(int zoom) {
23262355 return init (imageData , zoom );
23272356 }
23282357
2329- protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
23302358
23312359 @ Override
23322360 protected Rectangle getBounds (int zoom ) {
@@ -2624,6 +2652,11 @@ ImageData newImageData(ZoomContext zoomContext) {
26242652 return getImageMetadata (zoomContext ).getImageData ();
26252653 }
26262654
2655+ @ Override
2656+ protected ElementAtZoom <ImageData > loadImageData (int zoom ) {
2657+ return new ElementAtZoom <>(newImageData (new ZoomContext (zoom )), zoom );
2658+ }
2659+
26272660 @ Override
26282661 protected ImageHandle newImageHandle (ZoomContext zoomContext ) {
26292662 currentZoom = zoomContext ;
0 commit comments