Skip to content

Commit 65ffcb0

Browse files
akoch-yattafedejeanne
authored andcommitted
[win32] Delegate handle destruction to ImageHandle
This commit move the cleanup of OS handle of images from Image to the subclass Image#ImageHandle.
1 parent bc76588 commit 65ffcb0

File tree

1 file changed

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

1 file changed

+28
-28
lines changed

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

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.*;
2020
import java.util.*;
21+
import java.util.Map.*;
2122
import java.util.function.*;
2223

2324
import org.eclipse.swt.*;
@@ -1005,40 +1006,30 @@ void destroy () {
10051006
device.deregisterResourceWithZoomSupport(this);
10061007
if (memGC != null) memGC.dispose();
10071008
this.isDestroyed = true;
1008-
destroyHandle();
1009+
destroyHandles();
10091010
memGC = null;
10101011
}
10111012

1012-
private void destroyHandle () {
1013-
for (ImageHandle imageMetadata : zoomLevelToImageHandle.values()) {
1014-
destroyHandle(imageMetadata.handle);
1015-
}
1016-
zoomLevelToImageHandle.clear();
1013+
private void destroyHandles() {
1014+
destroyHandles(__ -> true);
10171015
}
10181016

10191017
@Override
10201018
void destroyHandlesExcept(Set<Integer> zoomLevels) {
1021-
zoomLevelToImageHandle.entrySet().removeIf(entry -> {
1022-
final Integer zoom = entry.getKey();
1023-
if (!zoomLevels.contains(zoom) && zoom != DPIUtil.getZoomForAutoscaleProperty(initialNativeZoom)) {
1024-
destroyHandle(entry.getValue().handle);
1025-
return true;
1026-
}
1027-
return false;
1019+
destroyHandles(zoom -> {
1020+
return !zoomLevels.contains(zoom) && zoom != DPIUtil.getZoomForAutoscaleProperty(initialNativeZoom);
10281021
});
10291022
}
1030-
private void destroyHandleForZoom(int zoom) {
1031-
ImageHandle imageHandle = zoomLevelToImageHandle.remove(zoom);
1032-
if (imageHandle != null) {
1033-
destroyHandle(imageHandle.handle);
1034-
}
1035-
}
10361023

1037-
private void destroyHandle(long handle) {
1038-
if (type == SWT.ICON) {
1039-
OS.DestroyIcon (handle);
1040-
} else {
1041-
OS.DeleteObject (handle);
1024+
private void destroyHandles(Predicate<Integer> filter) {
1025+
Iterator<Entry<Integer, ImageHandle>> it = zoomLevelToImageHandle.entrySet().iterator();
1026+
while (it.hasNext()) {
1027+
Entry<Integer, ImageHandle> zoomToHandle = it.next();
1028+
if (filter.test(zoomToHandle.getKey())) {
1029+
ImageHandle imageHandle = zoomToHandle.getValue();
1030+
it.remove();
1031+
imageHandle.destroy();
1032+
}
10421033
}
10431034
}
10441035

@@ -1940,7 +1931,7 @@ ImageData newImageData(int zoom) {
19401931
Function<Integer, ImageData> imageDataRetrieval = zoomToRetrieve -> {
19411932
ImageHandle handle = initializeHandleFromSource(zoomToRetrieve);
19421933
ImageData data = handle.getImageData();
1943-
destroyHandleForZoom(zoomToRetrieve);
1934+
handle.destroy();
19441935
return data;
19451936
};
19461937
return cachedImageData.computeIfAbsent(zoom, imageDataRetrieval);
@@ -2174,7 +2165,7 @@ ImageData newImageData(int zoom) {
21742165
Function<Integer, ImageData> imageDataRetrival = zoomToRetrieve -> {
21752166
ImageHandle handle = initializeHandleFromSource(zoomToRetrieve);
21762167
ImageData data = handle.getImageData();
2177-
destroyHandleForZoom(zoomToRetrieve);
2168+
handle.destroy();
21782169
return data;
21792170
};
21802171
return cachedImageData.computeIfAbsent(zoom, imageDataRetrival);
@@ -2236,7 +2227,7 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
22362227
imageDataAtZoom = ImageDataLoader.load(fileForZoom.element(), fileForZoom.zoom(), zoom);
22372228
} else {
22382229
imageDataAtZoom = new ElementAtZoom<>(nativeInitializedImage.getImageData(), fileForZoom.zoom());
2239-
destroyHandleForZoom(fileForZoom.zoom());
2230+
nativeInitializedImage.destroy();
22402231
}
22412232
return imageDataAtZoom;
22422233
}
@@ -2525,7 +2516,7 @@ public boolean equals(Object otherProvider) {
25252516
}
25262517

25272518
private class ImageHandle {
2528-
private final long handle;
2519+
private long handle;
25292520
private final int zoom;
25302521
private int height;
25312522
private int width;
@@ -2871,5 +2862,14 @@ private boolean isDisposed() {
28712862
return this.handle == 0;
28722863
}
28732864

2865+
private void destroy() {
2866+
zoomLevelToImageHandle.remove(zoom, this);
2867+
if (type == SWT.ICON) {
2868+
OS.DestroyIcon (handle);
2869+
} else {
2870+
OS.DeleteObject (handle);
2871+
}
2872+
handle = 0;
2873+
}
28742874
}
28752875
}

0 commit comments

Comments
 (0)