diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java index 200dd55911..44004b7a6b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java @@ -1939,14 +1939,21 @@ public Collection getPreservedZoomLevels() { return Collections.emptySet(); } + protected abstract ElementAtZoom loadImageData(int zoom); + abstract ImageData newImageData(ZoomContext zoomContext); abstract AbstractImageProviderWrapper createCopy(Image image); ImageData getScaledImageData (int zoom) { + ElementAtZoom closestAvailableImageData = getClosestAvailableImageData(zoom); + return DPIUtil.scaleImageData(device, closestAvailableImageData.element(), zoom, closestAvailableImageData.zoom()); + } + + ElementAtZoom getClosestAvailableImageData(int zoom) { TreeSet availableZooms = new TreeSet<>(zoomLevelToImageHandle.keySet()); int closestZoom = Optional.ofNullable(availableZooms.higher(zoom)).orElse(availableZooms.lower(zoom)); - return DPIUtil.scaleImageData(device, getImageMetadata(new ZoomContext(closestZoom)).getImageData(), zoom, closestZoom); + return new ElementAtZoom<>(getImageMetadata(new ZoomContext(closestZoom)).getImageData(), closestZoom); } protected ImageHandle newImageHandle(ZoomContext zoomContext) { @@ -2004,12 +2011,16 @@ AbstractImageProviderWrapper createCopy(Image image) { public Collection getPreservedZoomLevels() { return Collections.singleton(zoomForHandle); } + + @Override + protected ElementAtZoom loadImageData(int zoom) { + return getClosestAvailableImageData(zoom); + } } private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper { private final Map cachedImageData = new HashMap<>(); - protected abstract ElementAtZoom loadImageData(int zoom); void initImage() { // As the init call configured some Image attributes (e.g. type) @@ -2194,6 +2205,11 @@ ImageData newImageData(ZoomContext zoomContext) { return getScaledImageData(targetZoom); } + @Override + protected ElementAtZoom loadImageData(int zoom) { + return getClosestAvailableImageData(zoom); + } + @Override protected ImageHandle newImageHandle(ZoomContext zoomContext) { int targetZoom = zoomContext.targetZoom(); @@ -2326,7 +2342,6 @@ private ImageHandle initializeHandleFromSource(int zoom) { return init(imageData, zoom); } - protected abstract ElementAtZoom loadImageData(int zoom); @Override protected Rectangle getBounds(int zoom) { @@ -2621,7 +2636,12 @@ protected long configureGCData(GCData data) { @Override ImageData newImageData(ZoomContext zoomContext) { - return getImageMetadata(zoomContext).getImageData(); + return loadImageData(zoomContext.targetZoom).element(); + } + + @Override + protected ElementAtZoom loadImageData(int zoom) { + return new ElementAtZoom<>(getImageMetadata(new ZoomContext(zoom)).getImageData(), zoom); } @Override