Skip to content

Commit 13f7cc0

Browse files
akoch-yattaHeikoKlare
authored andcommitted
[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 44f0d56 commit 13f7cc0

File tree

2 files changed

+87
-56
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics
  • examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets

2 files changed

+87
-56
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

examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet382.java

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*******************************************************************************/
1414
package org.eclipse.swt.snippets;
1515

16+
import java.util.function.*;
17+
1618
import org.eclipse.swt.*;
1719
import org.eclipse.swt.graphics.*;
1820
import org.eclipse.swt.layout.*;
@@ -65,8 +67,8 @@ public static void main (String [] args) {
6567
final Display display = new Display ();
6668

6769
final Image imageWithFileNameProvider = new Image (display, filenameProvider);
68-
final Image disabledImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_DISABLE);
69-
final Image greyImageWithFileNameProvider = new Image (display,imageWithFileNameProvider, SWT.IMAGE_GRAY);
70+
final Supplier<Image> disabledImageWithFileNameProvider = () -> new Image (display,imageWithFileNameProvider, SWT.IMAGE_DISABLE);
71+
final Supplier<Image> greyImageWithFileNameProvider = () -> new Image (display,imageWithFileNameProvider, SWT.IMAGE_GRAY);
7072

7173
final Image imageWithDataProvider = new Image (display, imageDataProvider);
7274
final Image disabledImageWithDataProvider = new Image (display,imageWithDataProvider, SWT.IMAGE_DISABLE);
@@ -76,6 +78,10 @@ public static void main (String [] args) {
7678
final Image disabledImageWithData = new Image (display,imageWithData, SWT.IMAGE_DISABLE);
7779
final Image greyImageWithData = new Image (display,imageWithData, SWT.IMAGE_GRAY);
7880

81+
final Supplier<Image> imageWithDataCopy = () -> new Image (display, imageWithDataProvider, SWT.IMAGE_COPY);
82+
final Supplier<Image> disabledImageWithDataCopy = () -> new Image (display,disabledImageWithDataProvider, SWT.IMAGE_COPY);
83+
final Supplier<Image> greyImageWithDataCopy = () -> new Image (display,greyImageWithDataProvider, SWT.IMAGE_COPY);
84+
7985
final ImageGcDrawer imageGcDrawer = (gc, width, height) -> {
8086
gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
8187
gc.fillRectangle(0, 0, width, height);
@@ -111,42 +117,53 @@ public void handleEvent(Event e) {
111117
if (e.type == SWT.Paint) {
112118
GC mainGC = e.gc;
113119
GCData gcData = mainGC.getGCData();
114-
120+
gcData.nativeZoom = 100;
115121

116122
try {
123+
mainGC.drawText("--ImageFileNameProvider--", 20, 20);
117124
drawImages(mainGC, gcData, "Normal",40, imageWithFileNameProvider);
118-
drawImages(mainGC, gcData, "Disabled",80, disabledImageWithFileNameProvider);
119-
drawImages(mainGC, gcData, "Greyed",120, greyImageWithFileNameProvider);
120-
121-
drawImages(mainGC, gcData, "Normal",160, imageWithDataProvider);
122-
drawImages(mainGC, gcData, "Disabled",200, disabledImageWithDataProvider);
123-
drawImages(mainGC, gcData, "Greyed",240, greyImageWithDataProvider);
124-
125-
drawImages(mainGC, gcData, "Normal",280, imageWithDataProvider);
126-
drawImages(mainGC, gcData, "Disabled",320, disabledImageWithData);
127-
drawImages(mainGC, gcData, "Greyed",360, greyImageWithData);
128-
129-
drawImages(mainGC, gcData, "Normal", 400, imageWithGcDrawer);
130-
drawImages(mainGC, gcData, "Disabled", 440, disabledImageWithGcDrawer);
131-
drawImages(mainGC, gcData, "Greyed", 480, greyImageWithGcDrawer);
132-
133-
drawImages(mainGC, gcData, "Normal", 520, imageWithTransparentGcDrawer);
134-
drawImages(mainGC, gcData, "Disabled", 560, disabledImageWithTransparentGcDrawer);
135-
drawImages(mainGC, gcData, "Greyed", 600, greyImageWithTransparentGcDrawer);
125+
drawImages(mainGC, gcData, "Disabled",80, disabledImageWithFileNameProvider.get());
126+
drawImages(mainGC, gcData, "Greyed",120, greyImageWithFileNameProvider.get());
127+
128+
mainGC.drawText("--ImageDataProvider--", 20, 150);
129+
drawImages(mainGC, gcData, "Normal",180, imageWithDataProvider);
130+
drawImages(mainGC, gcData, "Disabled",220, disabledImageWithDataProvider);
131+
drawImages(mainGC, gcData, "Greyed",260, greyImageWithDataProvider);
132+
133+
mainGC.drawText("--Image with ImageData--", 20, 290);
134+
drawImages(mainGC, gcData, "Normal",320, imageWithData);
135+
drawImages(mainGC, gcData, "Disabled",360, disabledImageWithData);
136+
drawImages(mainGC, gcData, "Greyed",400, greyImageWithData);
137+
138+
mainGC.drawText("--ImageDataProvider Copy--", 20, 430);
139+
drawImages(mainGC, gcData, "Normal",460, imageWithDataCopy.get());
140+
drawImages(mainGC, gcData, "Disabled",500, disabledImageWithDataCopy.get());
141+
drawImages(mainGC, gcData, "Greyed",540, greyImageWithDataCopy.get());
142+
143+
mainGC.drawText("--ImageGcDrawer--", 20, 570);
144+
drawImages(mainGC, gcData, "Normal", 600, imageWithGcDrawer);
145+
drawImages(mainGC, gcData, "Disabled", 640, disabledImageWithGcDrawer);
146+
drawImages(mainGC, gcData, "Greyed", 680, greyImageWithGcDrawer);
147+
148+
mainGC.drawText("--Transparent ImageGcDrawer--", 20, 710);
149+
drawImages(mainGC, gcData, "Normal", 740, imageWithTransparentGcDrawer);
150+
drawImages(mainGC, gcData, "Disabled", 780, disabledImageWithTransparentGcDrawer);
151+
drawImages(mainGC, gcData, "Greyed", 820, greyImageWithTransparentGcDrawer);
136152
} finally {
137153
mainGC.dispose ();
138154
}
139155
}
140156
}
141157

142-
private void drawImages(GC mainGC, GCData gcData, String text, int y, final Image imageWithFileNameProvider) {
158+
private void drawImages(GC mainGC, GCData gcData, String text, int y, final Image image) {
143159
gcData.nativeZoom = 100;
144160
mainGC.drawText(text, 0, y);
145-
mainGC.drawImage(imageWithFileNameProvider, 50, y);
161+
mainGC.drawImage(image, 50, y);
146162
gcData.nativeZoom = 150;
147-
mainGC.drawImage(imageWithFileNameProvider, 100, (int) (y/1.5));
163+
mainGC.drawImage(image, 100, (int) (y/1.5));
148164
gcData.nativeZoom = 200;
149-
mainGC.drawImage(imageWithFileNameProvider, 150, y/2);
165+
mainGC.drawImage(image, 150, y/2);
166+
gcData.nativeZoom = 100;
150167
}
151168
};
152169
shell.addListener(SWT.Paint, l);

0 commit comments

Comments
 (0)