diff options
author | Sven Gothel <[email protected]> | 2014-05-21 08:53:54 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-05-21 08:53:54 +0200 |
commit | f9a00b91dcd146c72a50237b62270f33bd0da98e (patch) | |
tree | f4387da868608cea5066ce3a8cb9039a16b529de /src/nativewindow/classes/com/jogamp | |
parent | 0ffba122ea5c4b8cc247234ca9f48ccfcce833cd (diff) |
Bug 742 HiDPI: [Core API Change] Distinguish window-units and pixel-units; Add HiDPI for AWT GLCanvas w/ OSX CALayer
Core API Change:
To support HiDPI thoroughly in JOGL (NativeWindow, JOGL, NEWT)
we need to separate window- and pixel units.
NativeWindow and NativeSurface now have distinguished
access methods for window units and pixel units.
NativeWindow: Using window units
- getWindowWidth() * NEW Method *
- getWindowHeight() * NEW Method *
- getX(), getY(), ...
NativeSurface: Using pixel units
- getWidth() -> getSurfaceWidth() * RENAMED *
- getHeight() -> getSurfaceHeight() * RENAMED *
GLDrawable: Using pixel units
- getWidth() -> getSurfaceWidth() * RENAMED, aligned w/ NativeSurface *
- getHeight() -> getSurfaceHeight() * RENAMED, aligned w/ NativeSurface *
Above changes also removes API collision w/ other windowing TK,
e.g. AWT's getWidth()/getHeight() in GLCanvas
and the same method names in GLDrawable before this change.
+++
Now preliminary 'working':
- AWT GLCanvas
- AWT GLJPanel
Tested manually on OSX w/ and w/o HiDPI Retina:
java com.jogamp.opengl.test.junit.jogl.demos.es2.awt.TestGearsES2AWT -manual -noanim -time 1000000
java com.jogamp.opengl.test.junit.jogl.demos.es2.awt.TestGearsES2GLJPanelAWT -manual -noanim -time 1000000
+++
TODO:
- NEWT
- Change Window.setSize(..) to use pixel units ?
- OSX HiDPI support
- Testing ..
- API refinement
Diffstat (limited to 'src/nativewindow/classes/com/jogamp')
6 files changed, 129 insertions, 86 deletions
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookMutableSize.java b/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookMutableSize.java index c98bf5436..7ae614158 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookMutableSize.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookMutableSize.java @@ -32,7 +32,7 @@ public class DelegatedUpstreamSurfaceHookMutableSize extends UpstreamSurfaceHook @Override public String toString() { - return getClass().getSimpleName()+"[ "+ width + "x" + height + ", " + upstream + "]"; + return getClass().getSimpleName()+"[ "+ pixWidth + "x" + pixHeight + ", " + upstream + "]"; } } diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookWithSurfaceSize.java b/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookWithSurfaceSize.java index 1557f4e51..db4a979d1 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookWithSurfaceSize.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/DelegatedUpstreamSurfaceHookWithSurfaceSize.java @@ -10,7 +10,7 @@ public class DelegatedUpstreamSurfaceHookWithSurfaceSize implements UpstreamSurf /** * @param upstream optional upstream UpstreamSurfaceHook used for {@link #create(ProxySurface)} and {@link #destroy(ProxySurface)}. - * @param surface mandatory {@link NativeSurface} used for {@link #getWidth(ProxySurface)} and {@link #getHeight(ProxySurface)} + * @param surface mandatory {@link NativeSurface} used for {@link #getPixelWidth(ProxySurface)} and {@link #getPixelHeight(ProxySurface)} */ public DelegatedUpstreamSurfaceHookWithSurfaceSize(UpstreamSurfaceHook upstream, NativeSurface surface) { this.upstream = upstream; @@ -35,18 +35,18 @@ public class DelegatedUpstreamSurfaceHookWithSurfaceSize implements UpstreamSurf } @Override - public final int getWidth(ProxySurface s) { - return surface.getWidth(); + public final int getPixelWidth(ProxySurface s) { + return surface.getSurfaceWidth(); } @Override - public final int getHeight(ProxySurface s) { - return surface.getHeight(); + public final int getPixelHeight(ProxySurface s) { + return surface.getSurfaceHeight(); } @Override public String toString() { - final String us_s = null != surface ? ( surface.getClass().getName() + ": 0x" + Long.toHexString(surface.getSurfaceHandle()) + " " +surface.getWidth() + "x" + surface.getHeight() ) : "nil"; + final String us_s = null != surface ? ( surface.getClass().getName() + ": 0x" + Long.toHexString(surface.getSurfaceHandle()) + " " +surface.getSurfaceWidth() + "x" + surface.getSurfaceHeight() ) : "nil"; return getClass().getSimpleName()+"["+upstream+", "+us_s+"]"; } diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSize.java b/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSize.java index 5838c7a56..5910f5fea 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSize.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSize.java @@ -4,31 +4,31 @@ import javax.media.nativewindow.ProxySurface; import javax.media.nativewindow.UpstreamSurfaceHook; public class UpstreamSurfaceHookMutableSize implements UpstreamSurfaceHook.MutableSize { - int width, height; + int pixWidth, pixHeight; /** * @param width initial width * @param height initial height */ public UpstreamSurfaceHookMutableSize(int width, int height) { - this.width = width; - this.height = height; + this.pixWidth = width; + this.pixHeight = height; } @Override - public final void setSize(int width, int height) { - this.width = width; - this.height = height; + public final void setPixelSize(int width, int height) { + this.pixWidth = width; + this.pixHeight = height; } @Override - public final int getWidth(ProxySurface s) { - return width; + public final int getPixelWidth(ProxySurface s) { + return pixWidth; } @Override - public final int getHeight(ProxySurface s) { - return height; + public final int getPixelHeight(ProxySurface s) { + return pixHeight; } @Override public void create(ProxySurface s) { /* nop */ } @@ -38,7 +38,7 @@ public class UpstreamSurfaceHookMutableSize implements UpstreamSurfaceHook.Mutab @Override public String toString() { - return getClass().getSimpleName()+"[ "+ width + "x" + height + "]"; + return getClass().getSimpleName()+"[pixel "+ pixWidth + "x" + pixHeight + "]"; } } diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSizePos.java b/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSizePos.java deleted file mode 100644 index e6fcc049c..000000000 --- a/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamSurfaceHookMutableSizePos.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.jogamp.nativewindow; - -public class UpstreamSurfaceHookMutableSizePos extends UpstreamSurfaceHookMutableSize { - int x, y; - - /** - * @param width initial width - * @param height initial height - */ - public UpstreamSurfaceHookMutableSizePos(int x, int y, int width, int height) { - super(width, height); - this.x= x; - this.y= y; - } - - // @Override - public final void setPos(int x, int y) { - this.x= x; - this.y= y; - } - - public final int getX() { - return x; - } - - public final int getY() { - return y; - } - - @Override - public String toString() { - return getClass().getSimpleName()+"[ "+ x + "/" + y + " " + width + "x" + height + "]"; - } - -} - diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamWindowHookMutableSizePos.java b/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamWindowHookMutableSizePos.java new file mode 100644 index 000000000..f761b522a --- /dev/null +++ b/src/nativewindow/classes/com/jogamp/nativewindow/UpstreamWindowHookMutableSizePos.java @@ -0,0 +1,53 @@ +package com.jogamp.nativewindow; + +public class UpstreamWindowHookMutableSizePos extends UpstreamSurfaceHookMutableSize { + int winX, winY, winWidth, winHeight; + + /** + * @param winX initial window x-pos + * @param winY initial window y-pos + * @param winWidth initial window width + * @param winHeight initial window height + * @param pixWidth initial surface pixel width, FIXME: pixel-dim == window-dim 'for now' ? + * @param pixHeight initial surface pixel height, FIXME: pixel-dim == window-dim 'for now' ? + */ + public UpstreamWindowHookMutableSizePos(int winX, int winY, int winWidth, int winHeight, int pixWidth, int pixHeight) { + super(pixWidth, pixHeight); + this.winX= winX; + this.winY= winY; + this.winWidth = winWidth; + this.winHeight = winHeight; + } + + // @Override + public final void setWinPos(int winX, int winY) { + this.winX= winX; + this.winY= winY; + } + // @Override + public final void setWinSize(int winWidth, int winHeight) { + this.winWidth= winWidth; + this.winHeight= winHeight; + } + + public final int getX() { + return winX; + } + + public final int getY() { + return winY; + } + public final int getWindowWidth() { + return winWidth; + } + public final int getWindowHeight() { + return winHeight; + } + + @Override + public String toString() { + return getClass().getSimpleName()+"[window "+ winX + "/" + winY + " " + winWidth + "x" + winHeight + ", pixel " + pixWidth + "x" + pixHeight + "]"; + } + +} + diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java index 8d7c382ee..e35716c49 100644 --- a/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java +++ b/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java @@ -46,7 +46,6 @@ import com.jogamp.nativewindow.MutableGraphicsConfiguration; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; -import java.awt.GraphicsDevice; import java.awt.Window; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; @@ -99,7 +98,7 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, protected Rectangle bounds; protected Insets insets; private volatile long offscreenSurfaceLayer; - + private volatile int pixelScale; private long drawable_old; /** @@ -123,6 +122,7 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, invalidate(); this.isApplet = false; this.offscreenSurfaceLayer = 0; + this.pixelScale = 1; } private static String id(Object obj) { return ( null!=obj ? toHexString(obj.hashCode()) : "nil" ); } private String jawtStr() { return "JAWTWindow["+id(JAWTWindow.this)+"]"; } @@ -260,17 +260,26 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, drawable_old = 0; bounds = new Rectangle(); insets = new Insets(); + pixelScale = 1; } protected abstract void invalidateNative(); - protected final boolean updateBounds(JAWT_Rectangle jawtBounds) { + /** + * Updates bounds and pixelScale + */ + protected final boolean updateLockedData(JAWT_Rectangle jawtBounds) { final Rectangle jb = new Rectangle(jawtBounds.getX(), jawtBounds.getY(), jawtBounds.getWidth(), jawtBounds.getHeight()); - final boolean changed = !bounds.equals(jb); + final int newPixelScale; + { + final int s = JAWTUtil.getPixelScale(component); + newPixelScale = 0 < s ? s : 1; + } + final boolean changedBounds = !bounds.equals(jb); + final boolean changedPixelScale = newPixelScale != pixelScale; - if(changed) { - if(DEBUG) { + if( changedBounds ) { + if( DEBUG ) { System.err.println("JAWTWindow.updateBounds: "+bounds+" -> "+jb); - // Thread.dumpStack(); } bounds.set(jawtBounds.getX(), jawtBounds.getY(), jawtBounds.getWidth(), jawtBounds.getHeight()); @@ -279,12 +288,21 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, insets.set(contInsets.left, contInsets.right, contInsets.top, contInsets.bottom); } } - return changed; + if( changedPixelScale ) { + if( DEBUG ) { + System.err.println("JAWTWindow.updatePixelScale: "+pixelScale+" -> "+newPixelScale); + } + pixelScale = newPixelScale; + } + return changedBounds || changedPixelScale; } /** @return the JAWT_DrawingSurfaceInfo's (JAWT_Rectangle) bounds, updated with lock */ public final RectangleImmutable getBounds() { return bounds; } + /** @return the safe pixelScale value, i.e. never negative or zero. Updated with lock. */ + public final int getPixelScale() { return pixelScale; } + @Override public final InsetsImmutable getInsets() { return insets; } @@ -606,13 +624,13 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, } @Override - public final int getWidth() { - return component.getWidth(); + public final int getSurfaceWidth() { + return getWindowWidth() * getPixelScale(); } @Override - public final int getHeight() { - return component.getHeight(); + public final int getSurfaceHeight() { + return getWindowHeight() * getPixelScale(); } // @@ -620,6 +638,32 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, // @Override + public final int getWindowWidth() { + return component.getWidth(); + } + + @Override + public final int getWindowHeight() { + return component.getHeight(); + } + + @Override + public final int[] getWindowUnitXY(int[] result, final int[] pixelUnitXY) { + final int scale = getPixelScale(); + result[0] = pixelUnitXY[0] / scale; + result[1] = pixelUnitXY[1] / scale; + return result; + } + + @Override + public final int[] getPixelUnitXY(int[] result, final int[] windowUnitXY) { + final int scale = getPixelScale(); + result[0] = windowUnitXY[0] * scale; + result[1] = windowUnitXY[1] * scale; + return result; + } + + @Override public void destroy() { surfaceLock.lock(); try { @@ -751,25 +795,6 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, return component.hasFocus(); } - /** - * Returns the pixel scale factor of this {@link Component}'s {@link GraphicsDevice}, if supported. - * <p> - * If the component is not yet {@link Component#isDisplayable() displayable}, - * <code>zero</code> is returned. - * </p> - * <p> - * If the component does not support pixel scaling the default - * <code>one</code> is returned. - * </p> - * <p> - * Note: Currently only supported on OSX since 1.7.0_40 for HiDPI retina displays - * </p> - * @return the pixel scale factor - */ - protected final int getPixelScale() { - return JAWTUtil.getPixelScale(component); - } - protected StringBuilder jawt2String(StringBuilder sb) { if( null == sb ) { sb = new StringBuilder(); @@ -801,7 +826,8 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface, ", surfaceHandle "+toHexString(getSurfaceHandle())+ ", bounds "+bounds+", insets "+insets ); - sb.append(", pos "+getX()+"/"+getY()+", size "+getWidth()+"x"+getHeight()+ + sb.append(", window ["+getX()+"/"+getY()+" "+getWindowWidth()+"x"+getWindowHeight()+ + "], pixels[x"+getPixelScale()+" -> "+getSurfaceWidth()+"x"+getSurfaceHeight()+"]"+ ", visible "+component.isVisible()); sb.append(", lockedExt "+isSurfaceLockedByOtherThread()+ ",\n\tconfig "+config+ |