@@ -1887,6 +1887,11 @@ <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+ return Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1893+ }
1894+
18901895/**
18911896 * Invokes platform specific functionality to allocate a new image.
18921897 * <p>
@@ -1939,14 +1944,19 @@ public Collection<Integer> getPreservedZoomLevels() {
19391944 return Collections .emptySet ();
19401945 }
19411946
1947+ protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
1948+
19421949 abstract ImageData newImageData (ZoomContext zoomContext );
19431950
19441951 abstract AbstractImageProviderWrapper createCopy (Image image );
19451952
19461953 ImageData getScaledImageData (int zoom ) {
1947- TreeSet <Integer > availableZooms = new TreeSet <>(zoomLevelToImageHandle .keySet ());
1948- int closestZoom = Optional .ofNullable (availableZooms .higher (zoom )).orElse (availableZooms .lower (zoom ));
1949- return DPIUtil .scaleImageData (device , getImageMetadata (new ZoomContext (closestZoom )).getImageData (), zoom , closestZoom );
1954+ return DPIUtil .scaleImageData (device , getClosestAvailableImageData (zoom ).element (), zoom , getClosestAvailableImageData (zoom ).zoom ());
1955+ }
1956+
1957+ ElementAtZoom <ImageData > getClosestAvailableImageData (int zoom ) {
1958+ int closestZoom = getClosestAvailableZoom (zoom );
1959+ return new ElementAtZoom <>(getImageMetadata (new ZoomContext (closestZoom )).getImageData (), closestZoom );
19501960 }
19511961
19521962 protected ImageHandle newImageHandle (ZoomContext zoomContext ) {
@@ -2004,12 +2014,16 @@ AbstractImageProviderWrapper createCopy(Image image) {
20042014 public Collection <Integer > getPreservedZoomLevels () {
20052015 return Collections .singleton (zoomForHandle );
20062016 }
2017+
2018+ @ Override
2019+ protected ElementAtZoom <ImageData > loadImageData (int zoom ) {
2020+ return getClosestAvailableImageData (zoom );
2021+ }
20072022}
20082023
20092024private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper {
20102025 private final Map <Integer , ImageData > cachedImageData = new HashMap <>();
20112026
2012- protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
20132027
20142028 void initImage () {
20152029 // As the init call configured some Image attributes (e.g. type)
@@ -2194,6 +2208,11 @@ ImageData newImageData(ZoomContext zoomContext) {
21942208 return getScaledImageData (targetZoom );
21952209 }
21962210
2211+ @ Override
2212+ protected ElementAtZoom <ImageData > loadImageData (int zoom ) {
2213+ return getClosestAvailableImageData (zoom );
2214+ }
2215+
21972216 @ Override
21982217 protected ImageHandle newImageHandle (ZoomContext zoomContext ) {
21992218 int targetZoom = zoomContext .targetZoom ();
@@ -2326,7 +2345,6 @@ private ImageHandle initializeHandleFromSource(int zoom) {
23262345 return init (imageData , zoom );
23272346 }
23282347
2329- protected abstract ElementAtZoom <ImageData > loadImageData (int zoom );
23302348
23312349 @ Override
23322350 protected Rectangle getBounds (int zoom ) {
@@ -2624,6 +2642,11 @@ ImageData newImageData(ZoomContext zoomContext) {
26242642 return getImageMetadata (zoomContext ).getImageData ();
26252643 }
26262644
2645+ @ Override
2646+ protected ElementAtZoom <ImageData > loadImageData (int zoom ) {
2647+ return new ElementAtZoom <>(newImageData (new ZoomContext (zoom )), zoom );
2648+ }
2649+
26272650 @ Override
26282651 protected ImageHandle newImageHandle (ZoomContext zoomContext ) {
26292652 currentZoom = zoomContext ;
0 commit comments