diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Application.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Application.java index 6038106c94..5a8dd6452d 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Application.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Application.java @@ -622,6 +622,7 @@ public final MenuItem createMenuItem(String title, MenuItem.Callback callback, } public abstract Pixels createPixels(int width, int height, ByteBuffer data); + public abstract Pixels createPixels(int width, int height, ByteBuffer data, float scalex, float scaley); public abstract Pixels createPixels(int width, int height, IntBuffer data); public abstract Pixels createPixels(int width, int height, IntBuffer data, float scalex, float scaley); protected abstract int staticPixels_getNativeFormat(); diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Pixels.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Pixels.java index 01163387f8..84653f2c53 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Pixels.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/Pixels.java @@ -98,6 +98,20 @@ protected Pixels(final int width, final int height, final ByteBuffer pixels) { this.scaley = 1.0f; } + protected Pixels(final int width, final int height, final ByteBuffer pixels, float scalex, float scaley) { + this.width = width; + this.height = height; + this.bytesPerComponent = 1; + this.bytes = pixels.slice(); + if ((this.width <= 0) || (this.height <= 0) || ((this.width * this.height * 4) > this.bytes.capacity())) { + throw new IllegalArgumentException("Too small byte buffer size "+this.width+"x"+this.height+" ["+(this.width*this.height*4)+"] > "+this.bytes.capacity()); + } + + this.ints = null; + this.scalex = scalex; + this.scaley = scaley; + } + protected Pixels(final int width, final int height, IntBuffer pixels) { this.width = width; this.height = height; diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java index b5a7cecb9d..f0c9718751 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java @@ -411,6 +411,11 @@ public Pixels createPixels(int width, int height, ByteBuffer data) { return new GtkPixels(width, height, data); } + @Override + public Pixels createPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + return new GtkPixels(width, height, data, scalex, scaley); + } + @Override public Pixels createPixels(int width, int height, IntBuffer data) { return new GtkPixels(width, height, data); diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkPixels.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkPixels.java index 0608cd2adc..9d22680e7d 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkPixels.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkPixels.java @@ -35,6 +35,10 @@ public GtkPixels(int width, int height, ByteBuffer data) { super(width, height, data); } + public GtkPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + super(width, height, data, scalex, scaley); + } + public GtkPixels(int width, int height, IntBuffer data) { super(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosApplication.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosApplication.java index a517e95d5e..c18231445b 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosApplication.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosApplication.java @@ -120,6 +120,11 @@ public Pixels createPixels(int width, int height, ByteBuffer data) { return new IosPixels(width, height, data); } + @Override + public Pixels createPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + return new IosPixels(width, height, data, scalex, scaley); + } + /** * @inheritDoc */ diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosPixels.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosPixels.java index 5c04452bcd..be4918f921 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosPixels.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/ios/IosPixels.java @@ -38,6 +38,10 @@ protected IosPixels(int width, int height, ByteBuffer data) { super(width, height, data); } + protected IosPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + super(width, height, data, scalex, scaley); + } + protected IosPixels(int width, int height, IntBuffer data) { super(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacApplication.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacApplication.java index 91fdde2663..91d98f5c11 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacApplication.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacApplication.java @@ -271,6 +271,10 @@ public Menu getAppleMenu() { return new MacPixels(width, height, data); } + @Override public Pixels createPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + return new MacPixels(width, height, data, scalex, scaley); + } + @Override public Pixels createPixels(int width, int height, IntBuffer data) { return new MacPixels(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacPixels.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacPixels.java index 00e2bab7d9..32a14b69a2 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacPixels.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacPixels.java @@ -53,6 +53,10 @@ protected MacPixels(int width, int height, ByteBuffer data) { super(width, height, data); } + protected MacPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + super(width, height, data, scalex, scaley); + } + protected MacPixels(int width, int height, IntBuffer data) { super(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonocleApplication.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonocleApplication.java index b085682c19..3dff9b0243 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonocleApplication.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonocleApplication.java @@ -187,15 +187,18 @@ public Pixels createPixels(int width, int height, ByteBuffer data) { return new MonoclePixels(width, height, data); } + @Override + public Pixels createPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + return new MonoclePixels(width, height, data, scalex, scaley); + } + @Override public Pixels createPixels(int width, int height, IntBuffer data) { return new MonoclePixels(width, height, data); } @Override - public Pixels createPixels(int width, int height, IntBuffer data, - float scalex, float scaley) - { + public Pixels createPixels(int width, int height, IntBuffer data, float scalex, float scaley) { return new MonoclePixels(width, height, data, scalex, scaley); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonoclePixels.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonoclePixels.java index bbb17ce1d7..5c4fee04b7 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonoclePixels.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonoclePixels.java @@ -37,6 +37,10 @@ final class MonoclePixels extends Pixels { super(width, height, data); } + MonoclePixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + super(width, height, data, scalex, scaley); + } + MonoclePixels(int width, int height, IntBuffer data) { super(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinApplication.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinApplication.java index 73b9d8c95d..bdb5dc4ea0 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinApplication.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinApplication.java @@ -253,6 +253,11 @@ protected void runLoop(final Runnable launchable) { return new WinPixels(width, height, data); } + @Override + public Pixels createPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + return new WinPixels(width, height, data, scalex, scaley); + } + @Override public Pixels createPixels(int width, int height, IntBuffer data) { return new WinPixels(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinPixels.java b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinPixels.java index 3c3497632d..fc313d939c 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinPixels.java +++ b/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinPixels.java @@ -46,6 +46,10 @@ protected WinPixels(int width, int height, ByteBuffer data) { super(width, height, data); } + protected WinPixels(int width, int height, ByteBuffer data, float scalex, float scaley) { + super(width, height, data, scalex, scaley); + } + protected WinPixels(int width, int height, IntBuffer data) { super(width, height, data); } diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/PixelUtils.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/PixelUtils.java index 9f2be5591d..6c8f987e34 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/PixelUtils.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/PixelUtils.java @@ -96,7 +96,10 @@ public static Pixels imageToPixels(Image image) { throw new IllegalArgumentException("non-RGB image format"); } pixels = app.createPixels(image.getWidth(), - image.getHeight(), bytes); + image.getHeight(), + bytes, + image.getPixelScale(), + image.getPixelScale()); return pixels; } else if (pixelType == PixelFormat.DataType.INT) { if (ByteOrder.nativeOrder() != ByteOrder.LITTLE_ENDIAN) { @@ -109,7 +112,10 @@ public static Pixels imageToPixels(Image image) { */ IntBuffer ints = (IntBuffer)image.getPixelBuffer(); pixels = app.createPixels(image.getWidth(), - image.getHeight(), ints); + image.getHeight(), + ints, + image.getPixelScale(), + image.getPixelScale()); return pixels; } else { throw new IllegalArgumentException("unhandled image type: " + pixelType); diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassMenu.m b/modules/javafx.graphics/src/main/native-glass/mac/GlassMenu.m index d26bca3792..776ca0f113 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassMenu.m +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassMenu.m @@ -45,6 +45,10 @@ static jmethodID jMenuClosedMethod = 0; static jmethodID jMenuValidateMethod = 0; static jfieldID jDelegateMenuField = 0; +static jfieldID jPixelsWidthField = 0; +static jfieldID jPixelsHeightField = 0; +static jfieldID jPixelsScaleXField = 0; +static jfieldID jPixelsScaleYField = 0; @interface NSMenuItem (SPI) @@ -262,6 +266,21 @@ - (void)_setPixels:(jobject)pixels (*env)->CallVoidMethod(env, pixels, jPixelsAttachData, ptr_to_jlong(&image)); if (image != NULL) { + if (jPixelsWidthField + && jPixelsHeightField + && jPixelsScaleXField + && jPixelsScaleYField + ) { + jint width = (*env)->GetIntField(env, pixels, jPixelsWidthField); + jint height = (*env)->GetIntField(env, pixels, jPixelsHeightField); + jfloat scalex = (*env)->GetFloatField(env, pixels, jPixelsScaleXField); + jfloat scaley = (*env)->GetFloatField(env, pixels, jPixelsScaleYField); + + if ((scalex > 1) && (scaley > 1) && (width > 0) && (height > 0)) { + NSSize imgSize = {width / scalex, height / scaley}; + [image setSize: imgSize]; + } + } [self->item setImage: image]; [image release]; } @@ -375,7 +394,6 @@ - (void)_setPixels:(jobject)pixels if (!jMenuClass) { return; } - jMenuActionMethod = (*env)->GetMethodID(env, jCallbackClass, "action", "()V"); if ((*env)->ExceptionCheck(env)) return; jMenuValidateMethod = (*env)->GetMethodID(env, jCallbackClass, "validate", "()V"); @@ -385,6 +403,19 @@ - (void)_setPixels:(jobject)pixels jMenuClosedMethod = (*env)->GetMethodID(env, jMenuClass, "notifyMenuClosed", "()V"); if ((*env)->ExceptionCheck(env)) return; jDelegateMenuField = (*env)->GetFieldID(env, jMenuDelegateClass, "menu", "Lcom/sun/glass/ui/Menu;"); + if ((*env)->ExceptionCheck(env)) return; + + jclass pixelsClass = [GlassHelper ClassForName:"com.sun.glass.ui.mac.MacPixels" withEnv: env]; + if (!pixelsClass) { + return; + } + jPixelsWidthField = (*env)->GetFieldID(env, pixelsClass, "width", "I"); + if ((*env)->ExceptionCheck(env)) return; + jPixelsHeightField = (*env)->GetFieldID(env, pixelsClass, "height", "I"); + if ((*env)->ExceptionCheck(env)) return; + jPixelsScaleXField = (*env)->GetFieldID(env, pixelsClass, "scalex", "F"); + if ((*env)->ExceptionCheck(env)) return; + jPixelsScaleYField = (*env)->GetFieldID(env, pixelsClass, "scaley", "F"); } /*