Skip to content

Commit 199a644

Browse files
ShahzaibIbrahimakoch-yatta
authored andcommitted
[win32] Don't create a mask image when there is no mask
When setting an image for a shell, we try to convert the bitmap image into icon to set the image on the top left of the shell. However we can have icons which has no transparency. In this case we dont need to create a transparency mask at all. fixes #2638
1 parent 6779ddc commit 199a644

File tree

1 file changed

+32
-25
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets

1 file changed

+32
-25
lines changed

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,32 +1180,39 @@ static long create32bitDIB (long hBitmap, int alpha, byte [] alphaData, int tran
11801180
}
11811181

11821182
static Image createIcon (Image image, int zoom) {
1183-
Device device = image.getDevice ();
1183+
Device device = image.getDevice();
11841184
ImageData data = image.getImageData(zoom);
1185-
if (data.alpha == -1 && data.alphaData == null) {
1186-
ImageData mask = data.getTransparencyMask ();
1187-
return new Image (device, data, mask);
1188-
}
1189-
int width = data.width, height = data.height;
1190-
long hMask, hBitmap;
1191-
long hDC = device.internal_new_GC (null);
1192-
long dstHdc = OS.CreateCompatibleDC (hDC), oldDstBitmap;
1193-
hBitmap = Display.create32bitDIB (Image.win32_getHandle(image, zoom), data.alpha, data.alphaData, data.transparentPixel);
1194-
hMask = OS.CreateBitmap (width, height, 1, 1, null);
1195-
oldDstBitmap = OS.SelectObject (dstHdc, hMask);
1196-
OS.PatBlt (dstHdc, 0, 0, width, height, OS.BLACKNESS);
1197-
OS.SelectObject (dstHdc, oldDstBitmap);
1198-
OS.DeleteDC (dstHdc);
1199-
device.internal_dispose_GC (hDC, null);
1200-
ICONINFO info = new ICONINFO ();
1201-
info.fIcon = true;
1202-
info.hbmColor = hBitmap;
1203-
info.hbmMask = hMask;
1204-
long hIcon = OS.CreateIconIndirect (info);
1205-
if (hIcon == 0) SWT.error(SWT.ERROR_NO_HANDLES);
1206-
OS.DeleteObject (hBitmap);
1207-
OS.DeleteObject (hMask);
1208-
return Image.win32_new (device, SWT.ICON, hIcon, zoom);
1185+
switch (data.getTransparencyType()) {
1186+
case SWT.TRANSPARENCY_MASK:
1187+
case SWT.TRANSPARENCY_PIXEL:
1188+
ImageData mask = data.getTransparencyMask();
1189+
return new Image(device, data, mask);
1190+
case SWT.TRANSPARENCY_ALPHA:
1191+
case SWT.NONE:
1192+
default:
1193+
int width = data.width, height = data.height;
1194+
long hMask, hBitmap;
1195+
long hDC = device.internal_new_GC(null);
1196+
long dstHdc = OS.CreateCompatibleDC(hDC), oldDstBitmap;
1197+
hBitmap = Display.create32bitDIB(Image.win32_getHandle(image, zoom), data.alpha, data.alphaData,
1198+
data.transparentPixel);
1199+
hMask = OS.CreateBitmap(width, height, 1, 1, null);
1200+
oldDstBitmap = OS.SelectObject(dstHdc, hMask);
1201+
OS.PatBlt(dstHdc, 0, 0, width, height, OS.BLACKNESS);
1202+
OS.SelectObject(dstHdc, oldDstBitmap);
1203+
OS.DeleteDC(dstHdc);
1204+
device.internal_dispose_GC(hDC, null);
1205+
ICONINFO info = new ICONINFO();
1206+
info.fIcon = true;
1207+
info.hbmColor = hBitmap;
1208+
info.hbmMask = hMask;
1209+
long hIcon = OS.CreateIconIndirect(info);
1210+
if (hIcon == 0)
1211+
SWT.error(SWT.ERROR_NO_HANDLES);
1212+
OS.DeleteObject(hBitmap);
1213+
OS.DeleteObject(hMask);
1214+
return Image.win32_new(device, SWT.ICON, hIcon, zoom);
1215+
}
12091216
}
12101217

12111218
long getTextSearchIcon(int size) {

0 commit comments

Comments
 (0)