mirror of
https://github.com/angryip/ipscan.git
synced 2025-10-26 11:18:17 +00:00
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:
parent
2fe9478741
commit
779e594714
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user