another (ugly) version, compiles on 64bit platform, but doesn't fully work

git-svn-id: https://ipscan.svn.sourceforge.net/svnroot/ipscan/trunk@444 375186e5-ef17-0410-b0b6-91563547dcda
This commit is contained in:
angryziber 2009-03-19 22:15:34 +00:00
parent 2fe9478741
commit 779e594714

View File

@ -6,6 +6,9 @@
package net.azib.ipscan.platform.linux;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import net.azib.ipscan.platform.SWTHelper;
import org.eclipse.swt.SWT;
@ -15,6 +18,7 @@ import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.internal.Converter;
import org.eclipse.swt.internal.gtk.OS;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
/**
* Helper class used internally by SWTHelper to extend functionality of SWT in some ways
@ -49,42 +53,79 @@ public class GTKHelper {
return;
}
// copy-paste from Display.setImage() follows, with replaced GTK_ICON_SIZE_MENU
// copy-paste from Display.createImage() follows, with replaced GTK_ICON_SIZE_MENU
int /*long*/ style = OS.gtk_widget_get_default_style ();
byte[] buffer = Converter.wcsToMbcs (null, name, true);
int /*long*/ pixbuf = OS.gtk_icon_set_render_icon (
OS.gtk_icon_factory_lookup_default (buffer), style,
OS.GTK_TEXT_DIR_NONE, OS.GTK_STATE_NORMAL, OS.GTK_ICON_SIZE_LARGE_TOOLBAR+1 /* OS.GTK_ICON_SIZE_BUTTON */, 0, 0);
if (pixbuf == 0) return;
int width = OS.gdk_pixbuf_get_width (pixbuf);
int height = OS.gdk_pixbuf_get_height (pixbuf);
int stride = OS.gdk_pixbuf_get_rowstride (pixbuf);
boolean hasAlpha = OS.gdk_pixbuf_get_has_alpha (pixbuf);
int /*long*/ pixels = OS.gdk_pixbuf_get_pixels (pixbuf);
byte [] data = new byte [stride * height];
OS.memmove (data, pixels, data.length);
OS.g_object_unref (pixbuf);
ImageData imageData = null;
if (hasAlpha) {
PaletteData palette = new PaletteData (0xFF000000, 0xFF0000, 0xFF00);
imageData = new ImageData (width, height, 32, palette);
byte [] alpha = new byte [stride * height];
for (int y=0; y<height; y++) {
for (int x=0; x<width; x++) {
alpha [y*width+x] = data [y*stride+x*4+3];
data [y*stride+x*4+3] = 0;
}
try {
Method m = null;
int /*long*/ style = ((Number)OS.class.getMethod("gtk_widget_get_default_style").invoke(null)).intValue();
byte[] buffer = Converter.wcsToMbcs (null, name, true);
long iconFactory = ((Number)OS.class.getMethod("gtk_icon_factory_lookup_default", byte[].class).invoke(null, buffer)).longValue();
long pixbuf = 0;
try {
m = OS.class.getMethod("gtk_icon_set_render_icon", int.class, int.class, int.class, int.class, int.class, int.class, int.class);
pixbuf = ((Number)m.invoke(null, (int)iconFactory, (int)style, OS.GTK_TEXT_DIR_NONE, OS.GTK_STATE_NORMAL, OS.GTK_ICON_SIZE_LARGE_TOOLBAR+1 /* OS.GTK_ICON_SIZE_BUTTON */, 0, 0)).longValue();
}
imageData.setAlphas (0, 0, width * height, alpha, 0);
} else {
PaletteData palette = new PaletteData (0xFF0000, 0xFF00, 0xFF);
imageData = new ImageData (width, height, 24, palette);
catch (Exception e) {
m = OS.class.getMethod("gtk_icon_set_render_icon", long.class, long.class, int.class, int.class, int.class, long.class, long.class);
pixbuf = ((Number)m.invoke(null, iconFactory, style, OS.GTK_TEXT_DIR_NONE, OS.GTK_STATE_NORMAL, OS.GTK_ICON_SIZE_LARGE_TOOLBAR+1 /* OS.GTK_ICON_SIZE_BUTTON */, 0, 0)).longValue();
}
//long pixbuf = OS.gtk_icon_set_render_icon (iconFactory, style,
// OS.GTK_TEXT_DIR_NONE, OS.GTK_STATE_NORMAL, OS.GTK_ICON_SIZE_LARGE_TOOLBAR+1 /* OS.GTK_ICON_SIZE_BUTTON */, 0, 0);
if (pixbuf == 0) return;
int width = (Integer)invoke("gdk_pixbuf_get_width", pixbuf);
int height = (Integer)invoke("gdk_pixbuf_get_height", pixbuf);
int stride = (Integer)invoke("gdk_pixbuf_get_rowstride", pixbuf);
boolean hasAlpha = (Boolean)invoke("gdk_pixbuf_get_has_alpha", pixbuf);
long pixels = ((Number)invoke("gdk_pixbuf_get_pixels", pixbuf)).longValue();
byte [] data = new byte [stride * height];
try {
m = OS.class.getMethod("memmove", byte[].class, int.class, int.class);
m.invoke(null, data, (int)pixels, data.length);
}
catch (Exception e) {
m = OS.class.getMethod("memmove", byte[].class, long.class, long.class);
m.invoke(null, data, pixels, data.length);
}
invoke("g_object_unref", pixbuf);
ImageData imageData = null;
if (hasAlpha) {
PaletteData palette = new PaletteData (0xFF000000, 0xFF0000, 0xFF00);
imageData = new ImageData (width, height, 32, palette);
byte [] alpha = new byte [stride * height];
for (int y=0; y<height; y++) {
for (int x=0; x<width; x++) {
alpha [y*width+x] = data [y*stride+x*4+3];
data [y*stride+x*4+3] = 0;
}
}
imageData.setAlphas (0, 0, width * height, alpha, 0);
} else {
PaletteData palette = new PaletteData (0xFF0000, 0xFF00, 0xFF);
imageData = new ImageData (width, height, 24, palette);
}
imageData.data = data;
imageData.bytesPerLine = stride;
Image icon = new Image (button.getDisplay(), imageData);
button.setImage(icon);
}
catch (Exception e) {
e.printStackTrace();
}
}
public static Object invoke(String name, long arg) throws Exception {
Method m = null;
try {
m = OS.class.getMethod(name, int.class);
return m.invoke(null, (int)arg);
}
catch (Exception e) {
m = OS.class.getMethod(name, long.class);
return m.invoke(null, arg);
}
imageData.data = data;
imageData.bytesPerLine = stride;
Image icon = new Image (button.getDisplay(), imageData);
button.setImage(icon);
}
}