Skip to content

Commit 79e74c7

Browse files
arunjose696HeikoKlare
authored andcommitted
Cache the last created temporary handles at a requested size
Cache the most recently created temporary handle. When a handle of a different size is requested, dispose of the previous one and replace it with the new handle. The last cached handle is also destroyed when the image is disposed.
1 parent 84f0345 commit 79e74c7

File tree

1 file changed

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

1 file changed

+37
-12
lines changed

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

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,34 @@ public final class Image extends Resource implements Drawable {
141141

142142
private List<Consumer<Image>> onDisposeListeners;
143143

144+
private record CachedHandle(ImageHandle handleContainer, int requestedWidth, int requestedHeight) {
145+
146+
public void destroy() {
147+
if (handleContainer != null) {
148+
handleContainer.destroy();
149+
}
150+
}
151+
152+
public boolean isReusable(int height, int width) {
153+
if(handleContainer == null) {
154+
return false;
155+
}
156+
return (requestedHeight == height && requestedWidth == width)
157+
|| (handleContainer.height == height && handleContainer.width == width);
158+
159+
}
160+
161+
public long getHandle() {
162+
if (handleContainer != null) {
163+
return handleContainer.handle;
164+
}
165+
return -1;
166+
}
167+
};
168+
169+
// Initialize lastRequestedHandle with -1 for size-related fields to indicate uninitialized values
170+
CachedHandle lastRequestedHandle = new CachedHandle(null, -1, -1);
171+
144172
private Image (Device device, int type, long handle, int nativeZoom) {
145173
super(device);
146174
this.type = type;
@@ -826,19 +854,15 @@ interface HandleAtSizeConsumer {
826854
}
827855

828856
void executeOnImageHandleAtSize(HandleAtSizeConsumer handleAtSizeConsumer, int widthHint, int heightHint) {
829-
ImageData imageData;
830-
imageData = this.imageProvider.loadImageDataAtSize(widthHint, heightHint);
831-
executeOnImageHandle(handleAtSizeConsumer, imageData);
832-
}
833-
834-
private void executeOnImageHandle(HandleAtSizeConsumer handleAtSizeConsumer, ImageData imageData) {
835-
ImageHandle handleContainer = init(imageData, -1);
836-
long tempHandle = handleContainer.handle;
837-
try {
838-
handleAtSizeConsumer.accept(tempHandle, new Point(imageData.width, imageData.height));
839-
} finally {
840-
handleContainer.destroy();
857+
if (!lastRequestedHandle.isReusable(heightHint, widthHint)) {
858+
ImageData imageData;
859+
imageData = this.imageProvider.loadImageDataAtSize(widthHint, heightHint);
860+
lastRequestedHandle.destroy();
861+
ImageHandle handleContainer = init(imageData, -1);
862+
lastRequestedHandle = new CachedHandle(handleContainer, widthHint, heightHint);
841863
}
864+
handleAtSizeConsumer.accept(lastRequestedHandle.getHandle(),
865+
new Point(lastRequestedHandle.handleContainer().width, lastRequestedHandle.handleContainer().height));
842866
}
843867

844868
/**
@@ -1073,6 +1097,7 @@ void destroy () {
10731097

10741098
private void destroyHandles() {
10751099
destroyHandles(__ -> true);
1100+
lastRequestedHandle.destroy();
10761101
}
10771102

10781103
@Override

0 commit comments

Comments
 (0)