Skip to content

Commit 908104f

Browse files
committed
[win32] Adapt/copy all handles on Image copy
This commit adapts and copies all handles in the copy constructor in Image. As each image now manages possibly more than one OS handles at the same time in the windows implementation, it is important to apply the operation on all of them.
1 parent 48a2524 commit 908104f

File tree

1 file changed

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

1 file changed

+45
-31
lines changed

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

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -244,57 +244,67 @@ public Image(Device device, Image srcImage, int flag) {
244244
if (srcImage == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
245245
if (srcImage.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT);
246246
initialNativeZoom = srcImage.initialNativeZoom;
247-
Rectangle rect = srcImage.getBounds(getZoom());
248247
this.type = srcImage.type;
249248
this.imageProvider = srcImage.imageProvider.createCopy(this);
250249
this.styleFlag = srcImage.styleFlag | flag;
251-
long srcImageHandle = win32_getHandle(srcImage, getZoom());
252250
switch (flag) {
253251
case SWT.IMAGE_COPY: {
254252
switch (type) {
255253
case SWT.BITMAP:
256-
/* Get the HDC for the device */
257-
long hDC = device.internal_new_GC(null);
258-
259-
/* Copy the bitmap */
260-
long hdcSource = OS.CreateCompatibleDC(hDC);
261-
long hdcDest = OS.CreateCompatibleDC(hDC);
262-
long hOldSrc = OS.SelectObject(hdcSource, srcImageHandle);
263-
BITMAP bm = new BITMAP();
264-
OS.GetObject(srcImageHandle, BITMAP.sizeof, bm);
265-
imageMetadata = new ImageHandle(OS.CreateCompatibleBitmap(hdcSource, rect.width, bm.bmBits != 0 ? -rect.height : rect.height), getZoom());
266-
if (imageMetadata.handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
267-
long hOldDest = OS.SelectObject(hdcDest, imageMetadata.handle);
268-
OS.BitBlt(hdcDest, 0, 0, rect.width, rect.height, hdcSource, 0, 0, OS.SRCCOPY);
269-
OS.SelectObject(hdcSource, hOldSrc);
270-
OS.SelectObject(hdcDest, hOldDest);
271-
OS.DeleteDC(hdcSource);
272-
OS.DeleteDC(hdcDest);
273-
274-
/* Release the HDC for the device */
275-
device.internal_dispose_GC(hDC, null);
276-
254+
for (ImageHandle imageHandle : srcImage.zoomLevelToImageHandle.values()) {
255+
Rectangle rect = imageHandle.getBounds();
256+
long srcImageHandle = imageHandle.handle;
257+
/* Get the HDC for the device */
258+
long hDC = device.internal_new_GC(null);
259+
260+
/* Copy the bitmap */
261+
long hdcSource = OS.CreateCompatibleDC(hDC);
262+
long hdcDest = OS.CreateCompatibleDC(hDC);
263+
long hOldSrc = OS.SelectObject(hdcSource, srcImageHandle);
264+
BITMAP bm = new BITMAP();
265+
OS.GetObject(srcImageHandle, BITMAP.sizeof, bm);
266+
imageMetadata = new ImageHandle(OS.CreateCompatibleBitmap(hdcSource, rect.width, bm.bmBits != 0 ? -rect.height : rect.height), imageHandle.zoom);
267+
if (imageMetadata.handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
268+
long hOldDest = OS.SelectObject(hdcDest, imageMetadata.handle);
269+
OS.BitBlt(hdcDest, 0, 0, rect.width, rect.height, hdcSource, 0, 0, OS.SRCCOPY);
270+
OS.SelectObject(hdcSource, hOldSrc);
271+
OS.SelectObject(hdcDest, hOldDest);
272+
OS.DeleteDC(hdcSource);
273+
OS.DeleteDC(hdcDest);
274+
275+
/* Release the HDC for the device */
276+
device.internal_dispose_GC(hDC, null);
277+
}
277278
transparentPixel = srcImage.transparentPixel;
278279
break;
279280
case SWT.ICON:
280-
imageMetadata = new ImageHandle(OS.CopyImage(srcImageHandle, OS.IMAGE_ICON, rect.width, rect.height, 0), getZoom());
281-
if (imageMetadata.handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
281+
for (ImageHandle imageHandle : srcImage.zoomLevelToImageHandle.values()) {
282+
Rectangle rect = imageHandle.getBounds();
283+
imageMetadata = new ImageHandle(OS.CopyImage(imageHandle.handle, OS.IMAGE_ICON, rect.width, rect.height, 0), imageHandle.zoom);
284+
if (imageMetadata.handle == 0) SWT.error(SWT.ERROR_NO_HANDLES);
285+
}
282286
break;
283287
default:
284288
SWT.error(SWT.ERROR_INVALID_IMAGE);
285289
}
286290
break;
287291
}
288292
case SWT.IMAGE_DISABLE: {
289-
ImageData data = srcImage.getImageData(srcImage.getZoom());
290-
ImageData newData = applyDisableImageData(data, rect.height, rect.width);
291-
init (newData, getZoom());
293+
for (ImageHandle imageHandle : srcImage.zoomLevelToImageHandle.values()) {
294+
Rectangle rect = imageHandle.getBounds();
295+
ImageData data = srcImage.getImageData(imageHandle.zoom);
296+
ImageData newData = applyDisableImageData(data, rect.height, rect.width);
297+
init (newData, imageHandle.zoom);
298+
}
292299
break;
293300
}
294301
case SWT.IMAGE_GRAY: {
295-
ImageData data = srcImage.getImageData(srcImage.getZoom());
296-
ImageData newData = applyGrayImageData(data, rect.height, rect.width);
297-
init (newData, getZoom());
302+
for (ImageHandle imageHandle : srcImage.zoomLevelToImageHandle.values()) {
303+
Rectangle rect = imageHandle.getBounds();
304+
ImageData data = srcImage.getImageData(imageHandle.zoom);
305+
ImageData newData = applyGrayImageData(data, rect.height, rect.width);
306+
init (newData, imageHandle.zoom);
307+
}
298308
break;
299309
}
300310
default:
@@ -2558,6 +2568,10 @@ public ImageHandle(long handle, int zoom) {
25582568
setImageMetadataForHandle(this, zoom);
25592569
}
25602570

2571+
public Rectangle getBounds() {
2572+
return new Rectangle(0, 0, width, height);
2573+
}
2574+
25612575
private void setBackground(RGB color) {
25622576
if (transparentPixel == -1) return;
25632577

0 commit comments

Comments
 (0)