diff options
author | Sven Gothel <[email protected]> | 2014-10-10 03:37:21 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-10-10 03:37:21 +0200 |
commit | e2d7816823039fc75be809d64b88a3d3af9cdca8 (patch) | |
tree | a541f1317419bcba2a240208baa7ad85d6d7883a /src | |
parent | 1c5758f1e006e51d7a64ed3ea35f7485419e094f (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')
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()); + } +} |