summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt
diff options
context:
space:
mode:
authorFelipe Heidrich <fheidric>2005-04-29 21:10:25 +0000
committerFelipe Heidrich <fheidric>2005-04-29 21:10:25 +0000
commit5236a124cc38f3baca05186b49e2911dfbd4ad27 (patch)
treee7f0c67552f57f3d1579a0fbe17d93a618868d40 /bundles/org.eclipse.swt
parent93fc2f9583c0679730fc2c5e8b77194a0019d64d (diff)
downloadeclipse.platform.swt-5236a124cc38f3baca05186b49e2911dfbd4ad27.tar.gz
eclipse.platform.swt-5236a124cc38f3baca05186b49e2911dfbd4ad27.tar.xz
eclipse.platform.swt-5236a124cc38f3baca05186b49e2911dfbd4ad27.zip
35040
Diffstat (limited to 'bundles/org.eclipse.swt')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java11
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java11
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Button.java12
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Label.java12
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Label.java104
5 files changed, 137 insertions, 13 deletions
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