From 5236a124cc38f3baca05186b49e2911dfbd4ad27 Mon Sep 17 00:00:00 2001 From: Felipe Heidrich Date: Fri, 29 Apr 2005 21:10:25 +0000 Subject: 35040 --- .../gtk/org/eclipse/swt/widgets/Button.java | 11 ++- .../gtk/org/eclipse/swt/widgets/Label.java | 11 ++- .../motif/org/eclipse/swt/widgets/Button.java | 12 ++- .../motif/org/eclipse/swt/widgets/Label.java | 12 ++- .../win32/org/eclipse/swt/widgets/Label.java | 104 ++++++++++++++++++++- 5 files changed, 137 insertions(+), 13 deletions(-) (limited to 'bundles/org.eclipse.swt') diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java index cb80bb030d..95dbacff35 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java @@ -43,6 +43,7 @@ import org.eclipse.swt.events.*; public class Button extends Control { int /*long*/ boxHandle, labelHandle, imageHandle, arrowHandle, groupHandle; boolean selected; + ImageList imageList; Image image; String text; @@ -457,6 +458,8 @@ void releaseWidget () { super.releaseWidget (); if (groupHandle != 0) OS.g_object_unref (groupHandle); groupHandle = 0; + if (imageList != null) imageList.dispose (); + imageList = null; image = null; text = null; } @@ -628,11 +631,15 @@ public void setImage (Image image) { if ((style & SWT.ARROW) != 0) return; if (image != null) { if (image.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT); - OS.gtk_image_set_from_pixmap (imageHandle, image.pixmap, image.mask); + if (imageList == null) imageList = imageList = new ImageList (); + int imageIndex = imageList.indexOf (image); + if (imageIndex == -1) imageIndex = imageList.add (image); + int /*long*/ pixbuf = imageList.getPixbuf (imageIndex); + OS.gtk_image_set_from_pixbuf (imageHandle, pixbuf); OS.gtk_widget_hide (labelHandle); OS.gtk_widget_show (imageHandle); } else { - OS.gtk_image_set_from_pixmap (imageHandle, 0, 0); + OS.gtk_image_set_from_pixbuf (imageHandle, 0); OS.gtk_widget_show (labelHandle); OS.gtk_widget_hide (imageHandle); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java index c50ed1f7e4..d0005a6016 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java @@ -40,6 +40,7 @@ import org.eclipse.swt.graphics.*; */ public class Label extends Control { int /*long*/ frameHandle, labelHandle, imageHandle; + ImageList imageList; Image image; String text; @@ -313,6 +314,8 @@ void releaseHandle () { void releaseWidget () { super.releaseWidget (); + if (imageList != null) imageList.dispose (); + imageList = null; image = null; text = null; } @@ -450,11 +453,15 @@ public void setImage (Image image) { if ((style & SWT.SEPARATOR) != 0) return; this.image = image; if (image != null) { - OS.gtk_image_set_from_pixmap (imageHandle, image.pixmap, image.mask); + if (imageList == null) imageList = imageList = new ImageList (); + int imageIndex = imageList.indexOf (image); + if (imageIndex == -1) imageIndex = imageList.add (image); + int /*long*/ pixbuf = imageList.getPixbuf (imageIndex); + OS.gtk_image_set_from_pixbuf (imageHandle, pixbuf); OS.gtk_widget_hide (labelHandle); OS.gtk_widget_show (imageHandle); } else { - OS.gtk_image_set_from_pixmap (imageHandle, 0, 0); + OS.gtk_image_set_from_pixbuf (imageHandle, 0); OS.gtk_widget_show (labelHandle); OS.gtk_widget_hide (imageHandle); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Button.java index 18e05cae56..212587577f 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Button.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Button.java @@ -568,10 +568,14 @@ void setBitmap (Image image) { if (image.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); switch (image.type) { case SWT.BITMAP: - labelPixmap = image.pixmap; - disabled = new Image (display, image, SWT.IMAGE_DISABLE); - labelInsensitivePixmap = disabled.pixmap; - break; + ImageData data = image.getImageData (); + if (data.alpha == -1 && data.alphaData == null && data.transparentPixel == -1) { + labelPixmap = image.pixmap; + disabled = new Image (display, image, SWT.IMAGE_DISABLE); + labelInsensitivePixmap = disabled.pixmap; + break; + } + //FALL THROUGH case SWT.ICON: Rectangle rect = image.getBounds (); bitmap = new Image (display, rect.width, rect.height); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Label.java index 75460018db..02879beeea 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Label.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Label.java @@ -470,10 +470,14 @@ void setBitmap (Image image) { if (image.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); switch (image.type) { case SWT.BITMAP: - labelPixmap = image.pixmap; - disabled = new Image (display, image, SWT.IMAGE_DISABLE); - labelInsensitivePixmap = disabled.pixmap; - break; + ImageData data = image.getImageData (); + if (data.alpha == -1 && data.alphaData == null && data.transparentPixel == -1) { + labelPixmap = image.pixmap; + disabled = new Image (display, image, SWT.IMAGE_DISABLE); + labelInsensitivePixmap = disabled.pixmap; + break; + } + //FALL THROUGH case SWT.ICON: Rectangle rect = image.getBounds (); bitmap = new Image (display, rect.width, rect.height); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java index e32cea2a5e..5c76e45ee1 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java @@ -172,6 +172,106 @@ public Point computeSize (int wHint, int hHint, boolean changed) { return new Point (width, height); } +int createAlphaFromMask (Image image) { + if (OS.COMCTL32_MAJOR < 6) return image.handle; + ImageData data = image.getImageData (); + int alpha = data.alpha; + byte [] alphaData = data.alphaData; + int transparentPixel = data.transparentPixel; + if (alpha != -1 || alphaData != null || transparentPixel != -1) { + BITMAP bm = new BITMAP (); + OS.GetObject (image.handle, BITMAP.sizeof, bm); + int imgWidth = bm.bmWidth; + int imgHeight = bm.bmHeight; + int hDC = display.internal_new_GC (null); + int srcHdc = OS.CreateCompatibleDC (hDC); + int oldSrcBitmap = OS.SelectObject (srcHdc, image.handle); + int memHdc = OS.CreateCompatibleDC (hDC); + BITMAPINFOHEADER bmiHeader = new BITMAPINFOHEADER (); + bmiHeader.biSize = BITMAPINFOHEADER.sizeof; + bmiHeader.biWidth = imgWidth; + bmiHeader.biHeight = -imgHeight; + bmiHeader.biPlanes = 1; + bmiHeader.biBitCount = (short)32; + bmiHeader.biCompression = OS.BI_RGB; + byte [] bmi = new byte [BITMAPINFOHEADER.sizeof]; + OS.MoveMemory (bmi, bmiHeader, BITMAPINFOHEADER.sizeof); + int [] pBits = new int [1]; + int memDib = OS.CreateDIBSection (0, bmi, OS.DIB_RGB_COLORS, pBits, 0, 0); + if (memDib == 0) SWT.error (SWT.ERROR_NO_HANDLES); + int oldMemBitmap = OS.SelectObject (memHdc, memDib); + BITMAP dibBM = new BITMAP (); + OS.GetObject (memDib, BITMAP.sizeof, dibBM); + int sizeInBytes = dibBM.bmWidthBytes * dibBM.bmHeight; + OS.BitBlt (memHdc, 0, 0, imgWidth, imgHeight, srcHdc, 0, 0, OS.SRCCOPY); + byte red = 0, green = 0, blue = 0; + if (transparentPixel != -1) { + if (bm.bmBitsPixel <= 8) { + byte [] color = new byte [4]; + OS.GetDIBColorTable (srcHdc, transparentPixel, 1, color); + blue = color [0]; + green = color [1]; + red = color [2]; + } else { + switch (bm.bmBitsPixel) { + case 16: + blue = (byte)((transparentPixel & 0x1F) << 3); + green = (byte)((transparentPixel & 0x3E0) >> 2); + red = (byte)((transparentPixel & 0x7C00) >> 7); + break; + case 24: + blue = (byte)((transparentPixel & 0xFF0000) >> 16); + green = (byte)((transparentPixel & 0xFF00) >> 8); + red = (byte)(transparentPixel & 0xFF); + break; + case 32: + blue = (byte)((transparentPixel & 0xFF000000) >>> 24); + green = (byte)((transparentPixel & 0xFF0000) >> 16); + red = (byte)((transparentPixel & 0xFF00) >> 8); + break; + } + } + } + OS.SelectObject (srcHdc, oldSrcBitmap); + OS.SelectObject (memHdc, oldMemBitmap); + OS.DeleteObject (srcHdc); + OS.DeleteObject (memHdc); + display.internal_dispose_GC (hDC, null); + + byte [] srcData = new byte [sizeInBytes]; + OS.MoveMemory (srcData, pBits [0], sizeInBytes); + if (alpha != -1) { + for (int y = 0, dp = 0; y < imgHeight; ++y) { + for (int x = 0; x < imgWidth; ++x) { + srcData [dp + 3] = (byte)alpha; + dp += 4; + } + } + } else if (alphaData != null) { + for (int y = 0, dp = 0, ap = 0; y < imgHeight; ++y) { + for (int x = 0; x < imgWidth; ++x) { + srcData [dp + 3] = alphaData [ap++]; + dp += 4; + } + } + } else if (transparentPixel != -1) { + for (int y = 0, dp = 0; y < imgHeight; ++y) { + for (int x = 0; x < imgWidth; ++x) { + if (srcData [dp] == blue && srcData [dp + 1] == green && srcData [dp + 2] == red) { + srcData [dp + 3] = (byte)0; + } else { + srcData [dp + 3] = (byte)0xFF; + } + dp += 4; + } + } + } + OS.MoveMemory (pBits [0], srcData, sizeInBytes); + return memDib; + } + return image.handle; +} + /** * Returns a value which describes the position of the * text or image in the receiver. The value will be one of @@ -335,13 +435,14 @@ public void setImage (Image image) { int hImage = 0, imageBits = 0, fImageType = 0; if (image != null) { if (image.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); - hImage = image.handle; switch (image.type) { case SWT.BITMAP: + hImage = createAlphaFromMask (image); imageBits = OS.SS_BITMAP; fImageType = OS.IMAGE_BITMAP; break; case SWT.ICON: + hImage = image.handle; imageBits = OS.SS_ICON; fImageType = OS.IMAGE_ICON; break; @@ -360,6 +461,7 @@ public void setImage (Image image) { OS.SetWindowLong (handle, OS.GWL_STYLE, newBits); } OS.SendMessage (handle, OS.STM_SETIMAGE, fImageType, hImage); + if (image != null && image.handle != hImage) OS.DeleteObject (hImage); /* * Feature in Windows. When STM_SETIMAGE is used to set the * image for a static control, Windows either streches the image -- cgit