summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-10-10 03:37:21 +0200
committerSven Gothel <[email protected]>2014-10-10 03:37:21 +0200
commite2d7816823039fc75be809d64b88a3d3af9cdca8 (patch)
treea541f1317419bcba2a240208baa7ad85d6d7883a /src
parent1c5758f1e006e51d7a64ed3ea35f7485419e094f (diff)
Bug 1093 - NEWT PointerIcon swizzled on X11 and OSX; WindowIcon swizzled on OSX ([R] -> [B])
Following mistakes were made in native PixelFormat for PointerIcon and WindowIcon: PointerIcon: X11: RGBA8888 -> BGRA8888 OSX: BGRA8888 -> RGBA8888 WindowIcon: OSX: BGRA8888 -> RGBA8888 Test case: TestWindowAndPointerIconNEWT (requires visual validation) +++ Summary: PointerIcon: BGRA8888: X11, Win32 RGBA8888: OSX WindowIcon: BGRA8888: X11, Win32 RGBA8888: OSX +++ Reported by 'LT' <http://forum.jogamp.org/Mac-OSX-newt-pointer-and-window-icon-displays-incorrectly-tp4033294.html>
Diffstat (limited to 'src')
-rw-r--r--src/nativewindow/classes/javax/media/nativewindow/util/PixelFormat.java7
-rw-r--r--src/newt/classes/com/jogamp/newt/Display.java8
-rw-r--r--src/newt/classes/jogamp/newt/driver/macosx/DisplayDriver.java5
-rw-r--r--src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java3
-rw-r--r--src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/newt/TestGearsES2NEWT.java49
-rw-r--r--src/test/com/jogamp/opengl/test/junit/newt/TestWindowAndPointerIconNEWT.java142
6 files changed, 197 insertions, 17 deletions
diff --git a/src/nativewindow/classes/javax/media/nativewindow/util/PixelFormat.java b/src/nativewindow/classes/javax/media/nativewindow/util/PixelFormat.java
index fd3c31f7f..e5901f584 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/util/PixelFormat.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/util/PixelFormat.java
@@ -119,7 +119,8 @@ public enum PixelFormat {
* <ul>
* <li>OpenGL: data-format GL_RGBA, data-type GL_UNSIGNED_BYTE</li>
* <li>AWT: <i>None</i></li>
- * <li>PointerIcon: X11 (XCURSOR)</li>
+ * <li>PointerIcon: OSX (NSBitmapImageRep)</li>
+ * <li>Window Icon: OSX (NSBitmapImageRep)</li>
* <li>PNGJ: Scanlines</li>
* </ul>
* </p>
@@ -175,8 +176,8 @@ public enum PixelFormat {
* <ul>
* <li>OpenGL: data-format GL_BGRA, data-type GL_UNSIGNED_BYTE</li>
* <li>AWT: {@link java.awt.image.BufferedImage#TYPE_INT_ARGB TYPE_INT_ARGB}</li>
- * <li>PointerIcon: Win32, OSX (NSBitmapImageRep), AWT</li>
- * <li>Window Icon: X11, Win32, OSX (NSBitmapImageRep)</li>
+ * <li>PointerIcon: X11 (XCURSOR), Win32, AWT</li>
+ * <li>Window Icon: X11, Win32</li>
* </ul>
* </p>
*/
diff --git a/src/newt/classes/com/jogamp/newt/Display.java b/src/newt/classes/com/jogamp/newt/Display.java
index 7ab2794eb..c4b919951 100644
--- a/src/newt/classes/com/jogamp/newt/Display.java
+++ b/src/newt/classes/com/jogamp/newt/Display.java
@@ -168,6 +168,14 @@ public abstract class Display {
* <p>
* Using this value will avoid conversion within {@link #createPointerIcon(PixelRectangle, int, int)}.
* </p>
+ * <p>
+ * Known native pixel formats are:
+ * <ul>
+ * <li>X11: {@link PixelFormat#BGRA8888}</li>
+ * <li>Windows: {@link PixelFormat#BGRA8888}</li>
+ * <li>OSX: {@link PixelFormat#RGBA8888}</li>
+ * </ul>
+ * </p>
*/
public abstract PixelFormat getNativePointerIconPixelFormat();
diff --git a/src/newt/classes/jogamp/newt/driver/macosx/DisplayDriver.java b/src/newt/classes/jogamp/newt/driver/macosx/DisplayDriver.java
index 4ecc2fdcf..051294dce 100644
--- a/src/newt/classes/jogamp/newt/driver/macosx/DisplayDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/macosx/DisplayDriver.java
@@ -70,7 +70,7 @@ public class DisplayDriver extends DisplayImpl {
// NOTE: MUST BE DIRECT BUFFER, since NSBitmapImageRep uses buffer directly!
final IOUtil.ClassResources iconRes = NewtFactory.getWindowIcons();
final URLConnection urlConn = iconRes.resolve(iconRes.resourceCount()-1);
- image = PNGPixelRect.read(urlConn.getInputStream(), PixelFormat.BGRA8888, true /* directBuffer */, 0 /* destMinStrideInBytes */, false /* destIsGLOriented */);
+ image = PNGPixelRect.read(urlConn.getInputStream(), PixelFormat.RGBA8888, true /* directBuffer */, 0 /* destMinStrideInBytes */, false /* destIsGLOriented */);
} catch (final Exception e) {
e.printStackTrace();
}
@@ -97,6 +97,9 @@ public class DisplayDriver extends DisplayImpl {
}
@Override
+ public PixelFormat getNativePointerIconPixelFormat() { return PixelFormat.RGBA8888; }
+
+ @Override
protected void dispatchMessagesNative() {
// nop
}
diff --git a/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java b/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java
index 759c27450..e2b9a65d1 100644
--- a/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/x11/DisplayDriver.java
@@ -125,9 +125,6 @@ public class DisplayDriver extends DisplayImpl {
protected Boolean isXineramaEnabled() { return isNativeValid() ? Boolean.valueOf(((X11GraphicsDevice)aDevice).isXineramaEnabled()) : null; }
@Override
- public final PixelFormat getNativePointerIconPixelFormat() { return PixelFormat.RGBA8888; }
-
- @Override
protected final long createPointerIconImpl(final PixelFormat pixelformat, final int width, final int height, final ByteBuffer pixels, final int hotX, final int hotY) {
return createPointerIcon(getHandle(), pixels, width, height, hotX, hotY);
}
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/newt/TestGearsES2NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/newt/TestGearsES2NEWT.java
index 29c5aac70..eb2536639 100644
--- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/newt/TestGearsES2NEWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/newt/TestGearsES2NEWT.java
@@ -33,6 +33,7 @@ import java.lang.reflect.InvocationTargetException;
import java.net.URLConnection;
import com.jogamp.common.util.IOUtil;
+import com.jogamp.junit.util.JunitTracer;
import com.jogamp.newt.Display;
import com.jogamp.newt.Display.PointerIcon;
import com.jogamp.newt.NewtFactory;
@@ -161,7 +162,7 @@ public class TestGearsES2NEWT extends UITestCase {
public void display(final GLAutoDrawable drawable) {
final GLAnimatorControl actrl = drawable.getAnimator();
if(waitForKey && actrl.getTotalFPSFrames() == 60*3) {
- UITestCase.waitForKey("3s mark");
+ JunitTracer.waitForKey("3s mark");
actrl.resetFPSCounter();
waitForKey = false;
}
@@ -194,46 +195,74 @@ public class TestGearsES2NEWT extends UITestCase {
}
});
- final PointerIcon[] pointerIcons = { null, null, null };
+ final PointerIcon[] pointerIcons = { null, null, null, null, null };
{
final Display disp = glWindow.getScreen().getDisplay();
disp.createNative();
+ int idx = 0;
{
PointerIcon _pointerIcon = null;
final IOUtil.ClassResources res = new IOUtil.ClassResources(glWindow.getClass(), new String[] { "newt/data/cross-grey-alpha-16x16.png" } );
try {
_pointerIcon = disp.createPointerIcon(res, 8, 8);
- System.err.println("Create PointerIcon #01: "+_pointerIcon);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, _pointerIcon.toString());
} catch (final Exception e) {
e.printStackTrace();
}
- pointerIcons[0] = _pointerIcon;
+ pointerIcons[idx] = _pointerIcon;
}
+ idx++;
{
PointerIcon _pointerIcon = null;
final IOUtil.ClassResources res = new IOUtil.ClassResources(glWindow.getClass(), new String[] { "newt/data/pointer-grey-alpha-16x24.png" } );
try {
_pointerIcon = disp.createPointerIcon(res, 0, 0);
- System.err.println("Create PointerIcon #02: "+_pointerIcon);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, _pointerIcon.toString());
} catch (final Exception e) {
e.printStackTrace();
}
- pointerIcons[1] = _pointerIcon;
+ pointerIcons[idx] = _pointerIcon;
}
+ idx++;
+ {
+ PointerIcon _pointerIcon = null;
+ final IOUtil.ClassResources res = new IOUtil.ClassResources(glWindow.getClass(), new String[] { "arrow-red-alpha-64x64.png" } );
+ try {
+ _pointerIcon = disp.createPointerIcon(res, 0, 0);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, _pointerIcon.toString());
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ pointerIcons[idx] = _pointerIcon;
+ }
+ idx++;
+ {
+ PointerIcon _pointerIcon = null;
+ final IOUtil.ClassResources res = new IOUtil.ClassResources(glWindow.getClass(), new String[] { "arrow-blue-alpha-64x64.png" } );
+ try {
+ _pointerIcon = disp.createPointerIcon(res, 0, 0);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, _pointerIcon.toString());
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ pointerIcons[idx] = _pointerIcon;
+ }
+ idx++;
if( PNGIcon.isAvailable() ) {
PointerIcon _pointerIcon = null;
final IOUtil.ClassResources res = new IOUtil.ClassResources(glWindow.getClass(), new String[] { "jogamp-pointer-64x64.png" } );
try {
final URLConnection urlConn = res.resolve(0);
final PNGPixelRect image = PNGPixelRect.read(urlConn.getInputStream(), null, false /* directBuffer */, 0 /* destMinStrideInBytes */, false /* destIsGLOriented */);
- System.err.println("Create PointerIcon #03: "+image);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, image.toString());
_pointerIcon = disp.createPointerIcon(image, 32, 0);
- System.err.println("Create PointerIcon #03: "+_pointerIcon);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, _pointerIcon.toString());
} catch (final Exception e) {
e.printStackTrace();
}
- pointerIcons[2] = _pointerIcon;
+ pointerIcons[idx] = _pointerIcon;
}
+ idx++;
}
if( setPointerIcon ) {
glWindow.setPointerIcon(pointerIcons[0]);
@@ -697,7 +726,7 @@ public class TestGearsES2NEWT extends UITestCase {
System.err.println("mappedBuffers "+useMappedBuffers);
if(waitForKey) {
- UITestCase.waitForKey("Start");
+ JunitTracer.waitForKey("Start");
}
org.junit.runner.JUnitCore.main(TestGearsES2NEWT.class.getName());
}
diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestWindowAndPointerIconNEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestWindowAndPointerIconNEWT.java
new file mode 100644
index 000000000..75e63f7a7
--- /dev/null
+++ b/src/test/com/jogamp/opengl/test/junit/newt/TestWindowAndPointerIconNEWT.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.opengl.test.junit.newt;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.media.nativewindow.NativeWindowFactory;
+import javax.media.opengl.GLCapabilities;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import com.jogamp.common.util.IOUtil;
+import com.jogamp.junit.util.SingletonJunitCase;
+import com.jogamp.newt.Display;
+import com.jogamp.newt.Display.PointerIcon;
+import com.jogamp.newt.opengl.GLWindow;
+import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2;
+import com.jogamp.opengl.test.junit.util.AWTRobotUtil;
+import com.jogamp.opengl.test.junit.util.MiscUtils;
+import com.jogamp.opengl.test.junit.util.QuitAdapter;
+import com.jogamp.opengl.util.Animator;
+import com.jogamp.opengl.util.AnimatorBase;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class TestWindowAndPointerIconNEWT extends SingletonJunitCase {
+
+ static long duration = 1000; // ms
+
+ // As early as possible
+ static {
+ setPointerIcons();
+ }
+
+ static void setPointerIcons() {
+ final Properties sysp = System.getProperties();
+ sysp.put("jnlp.newt.window.icons", "red-16x16.png red-32x32.png");
+ }
+
+ @AfterClass
+ public static void unsetPointerIcons() {
+ final Properties sysp = System.getProperties();
+ sysp.remove("jnlp.newt.window.icons");
+ }
+
+ @Test
+ public void test() throws InterruptedException {
+ final GLWindow glWindow = GLWindow.create(new GLCapabilities(null));
+ Assert.assertNotNull(glWindow);
+
+ glWindow.setSize(800, 600);
+
+ final GearsES2 demo = new GearsES2(1);
+ glWindow.addGLEventListener(demo);
+
+ final QuitAdapter quitAdapter = new QuitAdapter();
+ glWindow.addKeyListener(quitAdapter);
+ glWindow.addWindowListener(quitAdapter);
+
+ final PointerIcon pointerIcon;
+ {
+ final Display disp = glWindow.getScreen().getDisplay();
+ disp.createNative();
+ final int idx = 0;
+ {
+ PointerIcon _pointerIcon = null;
+ final IOUtil.ClassResources res = new IOUtil.ClassResources(glWindow.getClass(), new String[] { "arrow-red-alpha-64x64.png" } );
+ try {
+ _pointerIcon = disp.createPointerIcon(res, 0, 0);
+ System.err.printf("Create PointerIcon #%02d: %s%n", idx, _pointerIcon.toString());
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ pointerIcon = _pointerIcon;
+ }
+ }
+ glWindow.setPointerIcon(pointerIcon);
+ System.err.println("Set PointerIcon: "+glWindow.getPointerIcon());
+
+ final Animator animator = new Animator();
+ animator.setModeBits(false, AnimatorBase.MODE_EXPECT_AWT_RENDERING_THREAD);
+ animator.add(glWindow);
+ animator.start();
+
+ glWindow.setVisible(true);
+ glWindow.warpPointer(3*glWindow.getSurfaceWidth()/4, 3*glWindow.getSurfaceHeight()/4);
+
+ final long t0 = System.currentTimeMillis();
+ long t1 = t0;
+ while(!quitAdapter.shouldQuit() && t1-t0<duration) {
+ Thread.sleep(100);
+ t1 = System.currentTimeMillis();
+ }
+
+ animator.stop();
+
+ glWindow.destroy();
+ if( NativeWindowFactory.isAWTAvailable() ) {
+ Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, false));
+ }
+ }
+
+ public static void main(final String args[]) throws IOException {
+ for(int i=0; i<args.length; i++) {
+ if(args[i].equals("-time")) {
+ i++;
+ duration = MiscUtils.atol(args[i], duration);
+ }
+ }
+ org.junit.runner.JUnitCore.main(TestWindowAndPointerIconNEWT.class.getName());
+ }
+}