Skip to content

Commit 592917e

Browse files
Create handles for ImageDataProvider and ImageFilenameProvider on demand
1 parent 7f381e8 commit 592917e

File tree

1 file changed

+43
-14
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+43
-14
lines changed

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,6 @@ public Image(Device device, ImageFileNameProvider imageFileNameProvider) {
556556
super(device);
557557
this.imageProvider = new ImageFileNameProviderWrapper(imageFileNameProvider);
558558
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
559-
imageProvider.getImageMetadata(getZoom());
560559
init();
561560
this.device.registerResourceWithZoomSupport(this);
562561
}
@@ -594,7 +593,6 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
594593
super(device);
595594
this.imageProvider = new ImageDataProviderWrapper(imageDataProvider);
596595
initialNativeZoom = DPIUtil.getNativeDeviceZoom();
597-
imageProvider.getImageMetadata(getZoom());
598596
init();
599597
this.device.registerResourceWithZoomSupport(this);
600598
}
@@ -2081,6 +2079,13 @@ public static Image win32_new(Device device, int type, long handle, int nativeZo
20812079
return image;
20822080
}
20832081

2082+
private void destroyHandle(int zoom) {
2083+
ImageHandle imageHandle = zoomLevelToImageHandle.remove(zoom);
2084+
if (imageHandle != null) {
2085+
destroyHandle(imageHandle.handle);
2086+
}
2087+
}
2088+
20842089
private abstract class AbstractImageProviderWrapper {
20852090
abstract Object getProvider();
20862091
protected abstract Rectangle getBounds(int zoom);
@@ -2115,17 +2120,24 @@ private class ImageFileNameProviderWrapper extends AbstractImageProviderWrapper
21152120
* ImageFileNameProvider to provide file names at various Zoom levels
21162121
*/
21172122
private final ImageFileNameProvider provider;
2123+
private boolean isDestroyed;
2124+
private int width;
2125+
private int height;
2126+
private final static int BASE_ZOOM = 100;
21182127

21192128
ImageFileNameProviderWrapper(ImageFileNameProvider provider) {
21202129
checkProvider(provider, ImageFileNameProvider.class);
21212130
this.provider = provider;
2131+
ImageHandle handleAt100 = getImageMetadata(BASE_ZOOM);
2132+
width = handleAt100.width;
2133+
height = handleAt100.height;
2134+
destroyHandle(BASE_ZOOM);
21222135
}
21232136

21242137
@Override
21252138
protected Rectangle getBounds(int zoom) {
2126-
ImageHandle imageHandle = zoomLevelToImageHandle.values().iterator().next();
2127-
Rectangle rectangle = new Rectangle(0, 0, imageHandle.width, imageHandle.height);
2128-
return DPIUtil.scaleBounds(rectangle, zoom, imageHandle.zoom);
2139+
Rectangle rectangle = new Rectangle(0, 0, width, height);
2140+
return DPIUtil.scaleBounds(rectangle, zoom, BASE_ZOOM);
21292141
}
21302142

21312143
@Override
@@ -2154,11 +2166,6 @@ ImageHandle getImageMetadata(int zoom) {
21542166
return zoomLevelToImageHandle.get(zoom);
21552167
}
21562168

2157-
@Override
2158-
boolean isDisposed() {
2159-
return zoomLevelToImageHandle.isEmpty();
2160-
}
2161-
21622169
@Override
21632170
Object getProvider() {
21642171
return provider;
@@ -2173,6 +2180,16 @@ public int hashCode() {
21732180
ImageFileNameProviderWrapper createCopy(Image image) {
21742181
return image.new ImageFileNameProviderWrapper(provider);
21752182
}
2183+
2184+
@Override
2185+
boolean isDisposed() {
2186+
return this.isDestroyed;
2187+
}
2188+
2189+
@Override
2190+
protected void destroy() {
2191+
this.isDestroyed = true;
2192+
}
21762193
}
21772194

21782195
private class ImageDataProviderWrapper extends AbstractImageProviderWrapper {
@@ -2181,17 +2198,24 @@ private class ImageDataProviderWrapper extends AbstractImageProviderWrapper {
21812198
* ImageDataProvider to provide ImageData at various Zoom levels
21822199
*/
21832200
private final ImageDataProvider provider;
2201+
private int width;
2202+
private int height;
2203+
private boolean isDestroyed;
2204+
private final static int BASE_ZOOM = 100;
21842205

21852206
ImageDataProviderWrapper(ImageDataProvider provider) {
21862207
checkProvider(provider, ImageDataProvider.class);
21872208
this.provider = provider;
2209+
ImageHandle handleAt100 = getImageMetadata(BASE_ZOOM);
2210+
width = handleAt100.width;
2211+
height = handleAt100.height;
2212+
destroyHandle(BASE_ZOOM);
21882213
}
21892214

21902215
@Override
21912216
protected Rectangle getBounds(int zoom) {
2192-
ImageHandle imageHandle = zoomLevelToImageHandle.values().iterator().next();
2193-
Rectangle rectangle = new Rectangle(0, 0, imageHandle.width, imageHandle.height);
2194-
return DPIUtil.scaleBounds(rectangle, zoom, imageHandle.zoom);
2217+
Rectangle rectangle = new Rectangle(0, 0, width, height);
2218+
return DPIUtil.scaleBounds(rectangle, zoom, BASE_ZOOM);
21952219
}
21962220

21972221
@Override
@@ -2211,7 +2235,12 @@ ImageHandle getImageMetadata(int zoom) {
22112235

22122236
@Override
22132237
boolean isDisposed() {
2214-
return zoomLevelToImageHandle.isEmpty();
2238+
return this.isDestroyed;
2239+
}
2240+
2241+
@Override
2242+
protected void destroy() {
2243+
this.isDestroyed = true;
22152244
}
22162245

22172246
@Override

0 commit comments

Comments
 (0)