Skip to content

Commit 080bf7f

Browse files
committed
Fix wrong usage of getImageData and Permanent ImageHandle creation
There are many places in several ImageProviders where we want to create a new ImageHandle or ImageData and use getImageData or create permanent ImageHandle to obtain just ImageData respectively. This commit replaces such usage with directly calling newImageData instead of getImageData and creating a temporary ImageHandle when calling newImageData.
1 parent 4b672dd commit 080bf7f

1 file changed

Lines changed: 24 additions & 15 deletions

File tree

  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

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

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,9 @@ public ImageData getImageData (int zoom) {
13881388
return imageHandle.getImageData();
13891389
}
13901390

1391+
if (this.imageProvider.isImageHandleRequired()) {
1392+
return imageHandleManager.getOrCreate(zoom, () -> imageProvider.newImageHandle(new ZoomContext(zoom))).getImageData();
1393+
}
13911394
return this.imageProvider.newImageData(zoom);
13921395
}
13931396

@@ -2055,6 +2058,10 @@ public Collection<Integer> getPreservedZoomLevels() {
20552058
return Collections.emptySet();
20562059
}
20572060

2061+
protected boolean isImageHandleRequired() {
2062+
return false;
2063+
}
2064+
20582065
protected abstract ElementAtZoom<ImageData> loadImageData(int zoom);
20592066

20602067
abstract ImageData newImageData(int zoom);
@@ -2076,10 +2083,7 @@ protected Optional<ImageData> loadImageDataAtExactSize(int width, int height) {
20762083
return Optional.empty(); // exact size not available
20772084
}
20782085

2079-
protected DestroyableImageHandle newImageHandle(ZoomContext zoomContext) {
2080-
ImageData resizedData = getImageData (zoomContext.targetZoom());
2081-
return newImageHandle(resizedData, zoomContext);
2082-
}
2086+
abstract DestroyableImageHandle newImageHandle(ZoomContext zoomContext);
20832087

20842088
protected final DestroyableImageHandle newImageHandle(ImageData data, ZoomContext zoomContext) {
20852089
if (type == SWT.ICON && data.getTransparencyType() != SWT.TRANSPARENCY_MASK) {
@@ -2136,6 +2140,12 @@ public Collection<Integer> getPreservedZoomLevels() {
21362140
protected ElementAtZoom<ImageData> loadImageData(int zoom) {
21372141
return getClosestAvailableImageData(zoom);
21382142
}
2143+
2144+
@Override
2145+
protected DestroyableImageHandle newImageHandle(ZoomContext zoomContext) {
2146+
ImageData resizedData = newImageData (zoomContext.targetZoom());
2147+
return newImageHandle(resizedData, zoomContext);
2148+
}
21392149
}
21402150

21412151
private abstract class ImageFromImageDataProviderWrapper extends AbstractImageProviderWrapper {
@@ -2262,7 +2272,7 @@ protected ElementAtZoom<ImageData> loadImageData(int zoom) {
22622272

22632273
@Override
22642274
protected Rectangle getBounds(int zoom) {
2265-
ImageData scaledImageData = getImageData(zoom);
2275+
ImageData scaledImageData = newImageData(zoom);
22662276
return new Rectangle(0, 0, scaledImageData.width, scaledImageData.height);
22672277
}
22682278

@@ -2319,16 +2329,13 @@ protected Rectangle getBounds(int zoom) {
23192329
return Win32DPIUtils.pointToPixel(rectangle, zoom);
23202330
}
23212331

2332+
@Override
2333+
protected boolean isImageHandleRequired() {
2334+
return imageHandleManager.isEmpty() || memGC != null;
2335+
}
2336+
23222337
@Override
23232338
ImageData newImageData(int zoom) {
2324-
if (imageHandleManager.isEmpty()) {
2325-
return imageHandleManager.getOrCreate(zoom, () -> createBaseHandle(zoom)).getImageData();
2326-
}
2327-
// if a GC is initialized with an Image (memGC != null), the image data must not be resized, because it would
2328-
// be a destructive operation. Therefor, a new handle is created for the requested zoom
2329-
if (memGC != null) {
2330-
return imageHandleManager.getOrCreate(zoom, () -> newImageHandle(new ZoomContext(zoom))).getImageData();
2331-
}
23322339
return getScaledImageData(zoom);
23332340
}
23342341

@@ -2350,7 +2357,9 @@ protected DestroyableImageHandle newImageHandle(ZoomContext zoomContext) {
23502357
currentGC.refreshFor(new DrawableWrapper(Image.this, zoomContext), imageHandle);
23512358
return imageHandle;
23522359
}
2353-
return super.newImageHandle(zoomContext);
2360+
2361+
ImageData resizedData = newImageData (targetZoom);
2362+
return newImageHandle(resizedData, zoomContext);
23542363
}
23552364
private DestroyableImageHandle createBaseHandle(int zoom) {
23562365
baseZoom = zoom;
@@ -2468,7 +2477,7 @@ private DestroyableImageHandle initializeHandleFromSource(int zoom) {
24682477

24692478
@Override
24702479
protected Rectangle getBounds(int zoom) {
2471-
ImageData imageData = getImageData(zoom);
2480+
ImageData imageData = newImageData(zoom);
24722481
return new Rectangle(0, 0, imageData.width, imageData.height);
24732482
}
24742483
}

0 commit comments

Comments
 (0)