aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2013-09-24 23:13:16 +0200
committerSven Gothel <[email protected]>2013-09-24 23:13:16 +0200
commit4b5435c68c3f12d62dadb395957362eceacfb25c (patch)
tree367ffa26e9a1119ac0ca5fe74eb8a96b367f6d68
parent2f09d266f75dfb4ab0d4504dd0a7699757bc40b3 (diff)
Bug 816: Fix OSX CALayer 'quirks' for AWT 1.7.0_40 - See JAWTUtil JAWT_OSX_CALAYER_QUIRK_SIZE and JAWT_OSX_CALAYER_QUIRK_POSITION.
- Provide quirk bits for OSX CALayer depending on used JVM/AWT and act accordingly. - TestBug816OSXCALayerPosAWT: Add resize by frame
-rw-r--r--src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m76
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java76
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java14
-rw-r--r--src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java26
-rw-r--r--src/nativewindow/native/macosx/NativeWindowProtocols.h21
-rw-r--r--src/nativewindow/native/macosx/OSXmisc.m143
-rw-r--r--src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java5
-rw-r--r--src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java7
-rw-r--r--src/test/com/jogamp/opengl/test/junit/jogl/awt/TestBug816OSXCALayerPosAWT.java120
9 files changed, 355 insertions, 133 deletions
diff --git a/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m b/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m
index 046171efc..d15c8e038 100644
--- a/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m
+++ b/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m
@@ -150,7 +150,7 @@ extern GLboolean glIsVertexArray (GLuint array);
@end
-@interface MyNSOpenGLLayer: NSOpenGLLayer <NWDedicatedSize>
+@interface MyNSOpenGLLayer: NSOpenGLLayer <NWDedicatedFrame>
{
@private
GLfloat gl_texCoords[8];
@@ -166,8 +166,8 @@ extern GLboolean glIsVertexArray (GLuint array);
NSOpenGLPixelFormat* parentPixelFmt;
int texWidth;
int texHeight;
- volatile int dedicatedWidth;
- volatile int dedicatedHeight;
+ volatile Bool dedicatedFrameSet;
+ volatile CGRect dedicatedFrame;
volatile NSOpenGLPixelBuffer* pbuffer;
volatile GLuint textureID;
volatile NSOpenGLPixelBuffer* newPBuffer;
@@ -206,14 +206,14 @@ extern GLboolean glIsVertexArray (GLuint array);
- (Bool)isGLSourceValid;
- (void) setGLEnabled: (Bool) enable;
-- (Bool) validateTexSizeWithDedicatedSize;
+- (Bool) validateTexSize: (CGRect) lRect;
- (void) setTextureID: (int) _texID;
- (Bool) isSamePBuffer: (NSOpenGLPixelBuffer*) p;
- (void) setNewPBuffer: (NSOpenGLPixelBuffer*)p;
- (void) applyNewPBuffer;
-- (void)setDedicatedSize:(CGSize)size; // @NWDedicatedSize
+- (void)setDedicatedFrame:(CGRect)frame quirks:(int)quirks; // @NWDedicatedFrame
- (void) setFrame:(CGRect) frame;
- (id<CAAction>)actionForKey:(NSString *)key ;
- (NSOpenGLPixelFormat *)openGLPixelFormatForDisplayMask:(uint32_t)mask;
@@ -300,9 +300,9 @@ static const GLfloat gl_verts[] = {
timespec_now(&lastWaitTime);
shallDraw = NO;
isGLEnabled = YES;
- dedicatedWidth = _texWidth;
- dedicatedHeight = _texHeight;
- [self validateTexSizeWithDedicatedSize];
+ dedicatedFrameSet = NO;
+ dedicatedFrame = CGRectMake(0, 0, _texWidth, _texHeight);
+ [self validateTexSize: dedicatedFrame];
[self setTextureID: texID];
newPBuffer = NULL;
@@ -383,11 +383,16 @@ static const GLfloat gl_verts[] = {
isGLEnabled = enable;
}
-- (Bool) validateTexSizeWithDedicatedSize
+- (Bool) validateTexSize: (CGRect) lRect
{
- if( dedicatedHeight != texHeight || dedicatedWidth != texWidth ) {
- texWidth = dedicatedWidth;
- texHeight = dedicatedHeight;
+ const int lRectW = (int) (lRect.size.width + 0.5f);
+ const int lRectH = (int) (lRect.size.height + 0.5f);
+ Bool changed;
+
+ if( lRectH != texHeight || lRectW != texWidth ) {
+ texWidth = lRectW;
+ texHeight = lRectH;
+ changed = YES;
GLfloat texCoordWidth, texCoordHeight;
if(NULL != pbuffer) {
@@ -409,16 +414,16 @@ static const GLfloat gl_verts[] = {
gl_texCoords[5] = texCoordHeight;
gl_texCoords[4] = texCoordWidth;
gl_texCoords[6] = texCoordWidth;
-#ifdef VERBOSE_ON
- CGRect lRect = [self bounds];
- DBG_PRINT("MyNSOpenGLLayer::validateTexSize %p -> tex %dx%d, bounds: %lf/%lf %lfx%lf\n",
+ #ifdef VERBOSE_ON
+ DBG_PRINT("MyNSOpenGLLayer::validateTexSize %p -> tex %dx%d, bounds: %lf/%lf %lfx%lf (%dx%d), dedicatedFrame set:%d %lf/%lf %lfx%lf\n",
self, texWidth, texHeight,
- lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height);
-#endif
- return YES;
+ lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, lRectW, lRectH,
+ dedicatedFrameSet, dedicatedFrame.origin.x, dedicatedFrame.origin.y, dedicatedFrame.size.width, dedicatedFrame.size.height);
+ #endif
} else {
- return NO;
+ changed = NO;
}
+ return changed;
}
- (void) setTextureID: (int) _texID
@@ -560,21 +565,30 @@ static const GLfloat gl_verts[] = {
return NULL != pbuffer || NULL != newPBuffer || 0 != textureID ;
}
-// @NWDedicatedSize
-- (void)setDedicatedSize:(CGSize)size {
- DBG_PRINT("MyNSOpenGLLayer::setDedicatedSize: %p, texSize %dx%d <- %lfx%lf\n",
- self, texWidth, texHeight, size.width, size.height);
-
- dedicatedWidth = size.width;
- dedicatedHeight = size.height;
+// @NWDedicatedFrame
+- (void)setDedicatedFrame:(CGRect)dFrame quirks:(int)quirks {
+ CGRect lRect = [self frame];
+ Bool dedicatedFramePosSet = 0 != ( NW_DEDICATEDFRAME_QUIRK_POSITION & quirks );
+ Bool dedicatedFrameSizeSet = 0 != ( NW_DEDICATEDFRAME_QUIRK_SIZE & quirks );
+ dedicatedFrameSet = dedicatedFramePosSet || dedicatedFrameSizeSet;
+ dedicatedFrame = dFrame;
- CGRect rect = CGRectMake(0, 0, dedicatedWidth, dedicatedHeight);
- [super setFrame: rect];
+ DBG_PRINT("MyNSOpenGLLayer::setDedicatedFrame: Quirks [%d, pos %d, size %d], %p, texSize %dx%d, %lf/%lf %lfx%lf -> %lf/%lf %lfx%lf\n",
+ quirks, dedicatedFramePosSet, dedicatedFrameSizeSet, self, texWidth, texHeight,
+ lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height,
+ dFrame.origin.x, dFrame.origin.y, dFrame.size.width, dFrame.size.height);
+
+ if( dedicatedFrameSet ) {
+ [super setFrame: dedicatedFrame];
+ }
}
- (void) setFrame:(CGRect) frame {
- CGRect rect = CGRectMake(0, 0, dedicatedWidth, dedicatedHeight);
- [super setFrame: rect];
+ if( dedicatedFrameSet ) {
+ [super setFrame: dedicatedFrame];
+ } else {
+ [super setFrame: frame];
+ }
}
- (id<CAAction>)actionForKey:(NSString *)key
@@ -622,7 +636,7 @@ static const GLfloat gl_verts[] = {
GLenum textureTarget;
- Bool texSizeChanged = [self validateTexSizeWithDedicatedSize];
+ Bool texSizeChanged = [self validateTexSize: ( dedicatedFrameSet ? dedicatedFrame : [self bounds] ) ];
if( texSizeChanged ) {
[context update];
}
diff --git a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
index 1f5d33746..b663f90b7 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java
@@ -68,7 +68,7 @@ public class JAWTUtil {
public static final VersionNumber JAWT_MacOSXCALayerMinVersion = new VersionNumber(10,6,4);
/** OSX JAWT CALayer required with Java >= 1.7.0 (implies OS X >= 10.7 */
- public static final VersionNumber JAWT_MacOSXCALayerRequiredForJavaVersion = new VersionNumber(1,7,0);
+ public static final VersionNumber JAWT_MacOSXCALayerRequiredForJavaVersion = Platform.Version17;
// See whether we're running in headless mode
private static final boolean headlessMode;
@@ -98,18 +98,84 @@ public class JAWTUtil {
* Returns true if this platform's JAWT implementation supports offscreen layer.
*/
public static boolean isOffscreenLayerSupported() {
- return Platform.OS_TYPE == Platform.OSType.MACOS &&
- Platform.OS_VERSION_NUMBER.compareTo(JAWTUtil.JAWT_MacOSXCALayerMinVersion) >= 0;
+ return Platform.OS_TYPE == Platform.OSType.MACOS &&
+ Platform.OS_VERSION_NUMBER.compareTo(JAWTUtil.JAWT_MacOSXCALayerMinVersion) >= 0;
}
/**
* Returns true if this platform's JAWT implementation requires using offscreen layer.
*/
public static boolean isOffscreenLayerRequired() {
- return Platform.OS_TYPE == Platform.OSType.MACOS &&
- Platform.JAVA_VERSION_NUMBER.compareTo(JAWT_MacOSXCALayerRequiredForJavaVersion)>=0;
+ return Platform.OS_TYPE == Platform.OSType.MACOS &&
+ Platform.JAVA_VERSION_NUMBER.compareTo(JAWT_MacOSXCALayerRequiredForJavaVersion)>=0;
}
+ /**
+ * CALayer size needs to be set using the AWT component size.
+ * <p>
+ * As of today, we have to overwrite the CALayer size
+ * w/ the AWT component one since programmatic resize leads to differences.
+ * </p>
+ * <p>
+ * Hence this flag is always enabled.
+ * </p>
+ * <p>
+ * Sync w/ NativeWindowProtocols.h
+ * </p>
+ */
+ public static final int JAWT_OSX_CALAYER_QUIRK_SIZE = 1 << 0;
+
+ /**
+ * CALayer position needs to be set to zero.
+ * <p>
+ * Normally we have to set the root-calayer's position to 0/0
+ * and leave client-calayer's position in it's desired place.
+ * With pre AWT 1.7.0_40, the client-calayer's position has to
+ * be set to zero as well.
+ * </p>
+ * <p>
+ * Further more a re-layout seems to be required in this case,
+ * i.e. a programmatic forced resize +1 and it's inverted resize -1.
+ * </p>
+ * <p>
+ * Hence this flag is enabled w/ AWT < 1.7.0_40.
+ * </p>
+ * <p>
+ * Sync w/ NativeWindowProtocols.h
+ * </p>
+ */
+ public static final int JAWT_OSX_CALAYER_QUIRK_POSITION = 1 << 1;
+
+ /**
+ * Returns bitfield of required JAWT OSX CALayer quirks to mediate AWT impl. bugs.
+ * <p>
+ * Returns zero, if platform is not {@link Platform.OSType#MACOS}
+ * or not supporting CALayer, i.e. OSX < 10.6.4.
+ * </p>
+ * <p>
+ * Otherwise includes
+ * <ul>
+ * <li>{@link #JAWT_OSX_CALAYER_QUIRK_SIZE} (always)</li>
+ * <li>{@link #JAWT_OSX_CALAYER_QUIRK_POSITION} if JVM < 1.7.0_40</li>
+ * </ul>
+ * </p>
+ */
+ public static int getOSXCALayerQuirks() {
+ int res = 0;
+ if( Platform.OS_TYPE == Platform.OSType.MACOS &&
+ Platform.OS_VERSION_NUMBER.compareTo(JAWTUtil.JAWT_MacOSXCALayerMinVersion) >= 0 ) {
+
+ /** Knowing impl. all expose the SIZE bug */
+ res |= JAWT_OSX_CALAYER_QUIRK_SIZE;
+
+ final int c = Platform.JAVA_VERSION_NUMBER.compareTo(Platform.Version17);
+ if( c < 0 || c == 0 && Platform.JAVA_VERSION_UPDATE < 40 ) {
+ res |= JAWT_OSX_CALAYER_QUIRK_POSITION;
+ }
+ }
+ return res;
+ }
+
/**
* @param useOffscreenLayerIfAvailable
* @return
diff --git a/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java b/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java
index 080504a5c..666f895f4 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/jawt/macosx/MacOSXJAWTWindow.java
@@ -49,6 +49,7 @@ import javax.media.nativewindow.Capabilities;
import javax.media.nativewindow.NativeWindow;
import javax.media.nativewindow.NativeWindowException;
import javax.media.nativewindow.MutableSurface;
+import javax.media.nativewindow.NativeWindowFactory;
import javax.media.nativewindow.util.Point;
import com.jogamp.nativewindow.awt.JAWTWindow;
@@ -105,16 +106,19 @@ public class MacOSXJAWTWindow extends JAWTWindow implements MutableSurface {
protected void attachSurfaceLayerImpl(final long layerHandle) {
OSXUtil.RunOnMainThread(false, new Runnable() {
public void run() {
- OSXUtil.AddCASublayer(rootSurfaceLayer, layerHandle, getWidth(), getHeight());
+ OSXUtil.AddCASublayer(rootSurfaceLayer, layerHandle, getWidth(), getHeight(), JAWTUtil.getOSXCALayerQuirks());
} } );
}
@Override
protected void layoutSurfaceLayerImpl(long layerHandle, int width, int height) {
- if(DEBUG) {
- System.err.println("JAWTWindow.layoutSurfaceLayerImpl: "+toHexString(layerHandle) + ", "+width+"x"+height+"; "+this);
+ final int caLayerQuirks = JAWTUtil.getOSXCALayerQuirks();
+ if( 0 != caLayerQuirks ) {
+ if(DEBUG) {
+ System.err.println("JAWTWindow.layoutSurfaceLayerImpl: "+toHexString(layerHandle) + ", "+width+"x"+height+", caLayerQuirks "+caLayerQuirks+"; "+this);
+ }
+ OSXUtil.FixCALayerLayout(rootSurfaceLayer, layerHandle, width, height, caLayerQuirks);
}
- OSXUtil.FixCALayerLayout(rootSurfaceLayer, layerHandle, width, height);
}
@Override
@@ -240,7 +244,7 @@ public class MacOSXJAWTWindow extends JAWTWindow implements MutableSurface {
public void run() {
String errMsg = null;
if(0 == rootSurfaceLayer && 0 != jawtSurfaceLayersHandle) {
- rootSurfaceLayer = OSXUtil.CreateCALayer(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight());
+ rootSurfaceLayer = OSXUtil.CreateCALayer(bounds.getWidth(), bounds.getHeight());
if(0 == rootSurfaceLayer) {
errMsg = "Could not create root CALayer";
} else {
diff --git a/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java b/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java
index 1a90c095d..de24a76db 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/macosx/OSXUtil.java
@@ -141,8 +141,8 @@ public class OSXUtil implements ToolkitProperties {
* @see #DestroyCALayer(long)
* @see #AddCASublayer(long, long)
*/
- public static long CreateCALayer(final int x, final int y, final int width, final int height) {
- final long l = CreateCALayer0(x, y, width, height);
+ public static long CreateCALayer(final int width, final int height) {
+ final long l = CreateCALayer0(width, height);
if(DEBUG) {
System.err.println("OSXUtil.CreateCALayer: 0x"+Long.toHexString(l)+" - "+Thread.currentThread().getName());
}
@@ -159,17 +159,18 @@ public class OSXUtil implements ToolkitProperties {
* Hence it is important that related resources are not locked <i>if</i>
* they will be used for creation.
* </p>
- * @see #CreateCALayer(int, int, int, int)
+ * @param caLayerQuirks TODO
+ * @see #CreateCALayer(int, int)
* @see #RemoveCASublayer(long, long, boolean)
*/
- public static void AddCASublayer(final long rootCALayer, final long subCALayer, final int width, final int height) {
+ public static void AddCASublayer(final long rootCALayer, final long subCALayer, final int width, final int height, final int caLayerQuirks) {
if(0==rootCALayer || 0==subCALayer) {
throw new IllegalArgumentException("rootCALayer 0x"+Long.toHexString(rootCALayer)+", subCALayer 0x"+Long.toHexString(subCALayer));
}
if(DEBUG) {
- System.err.println("OSXUtil.AttachCALayer: 0x"+Long.toHexString(subCALayer)+" - "+Thread.currentThread().getName());
+ System.err.println("OSXUtil.AttachCALayer: caLayerQuirks "+caLayerQuirks+", 0x"+Long.toHexString(subCALayer)+" - "+Thread.currentThread().getName());
}
- AddCASublayer0(rootCALayer, subCALayer, width, height);
+ AddCASublayer0(rootCALayer, subCALayer, width, height, caLayerQuirks);
}
/**
@@ -187,12 +188,13 @@ public class OSXUtil implements ToolkitProperties {
* @param subCALayer the client surface layer, maybe null.
* @param width the expected width
* @param height the expected height
+ * @param caLayerQuirks TODO
*/
- public static void FixCALayerLayout(final long rootCALayer, final long subCALayer, final int width, final int height) {
+ public static void FixCALayerLayout(final long rootCALayer, final long subCALayer, final int width, final int height, final int caLayerQuirks) {
if( 0==rootCALayer && 0==subCALayer ) {
return;
}
- FixCALayerLayout0(rootCALayer, subCALayer, width, height);
+ FixCALayerLayout0(rootCALayer, subCALayer, width, height, caLayerQuirks);
}
/**
@@ -210,7 +212,7 @@ public class OSXUtil implements ToolkitProperties {
/**
* Destroy a CALayer.
- * @see #CreateCALayer(int, int, int, int)
+ * @see #CreateCALayer(int, int)
*/
public static void DestroyCALayer(final long caLayer) {
if(0==caLayer) {
@@ -354,9 +356,9 @@ public class OSXUtil implements ToolkitProperties {
private static native void DestroyNSWindow0(long nsWindow);
private static native long GetNSView0(long nsWindow);
private static native long GetNSWindow0(long nsView);
- private static native long CreateCALayer0(int x, int y, int width, int height);
- private static native void AddCASublayer0(long rootCALayer, long subCALayer, int width, int height);
- private static native void FixCALayerLayout0(long rootCALayer, long subCALayer, int width, int height);
+ private static native long CreateCALayer0(int width, int height);
+ private static native void AddCASublayer0(long rootCALayer, long subCALayer, int width, int height, int caLayerQuirks);
+ private static native void FixCALayerLayout0(long rootCALayer, long subCALayer, int width, int height, int caLayerQuirks);
private static native void RemoveCASublayer0(long rootCALayer, long subCALayer);
private static native void DestroyCALayer0(long caLayer);
private static native void RunOnMainThread0(Runnable runnable);
diff --git a/src/nativewindow/native/macosx/NativeWindowProtocols.h b/src/nativewindow/native/macosx/NativeWindowProtocols.h
index b91a50dfd..73c8e65c5 100644
--- a/src/nativewindow/native/macosx/NativeWindowProtocols.h
+++ b/src/nativewindow/native/macosx/NativeWindowProtocols.h
@@ -25,10 +25,27 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of JogAmp Community.
*/
+
+#ifndef NATIVEWINDOWPROTOCOLS_H
+#define NATIVEWINDOWPROTOCOLS_H 1
+/**
+ * CALayer size needs to be set using the AWT component size.
+ * See detailed description in JAWTUtil.java and sync w/ changed.
+ */
+#define NW_DEDICATEDFRAME_QUIRK_SIZE ( 1 << 0 )
+
+/**
+ * CALayer position needs to be set to zero.
+ * See detailed description in JAWTUtil.java and sync w/ changed.
+ */
+#define NW_DEDICATEDFRAME_QUIRK_POSITION ( 1 << 1 )
+
#import <Foundation/NSGeometry.h>
-@protocol NWDedicatedSize
-- (void)setDedicatedSize:(CGSize)size;
+@protocol NWDedicatedFrame
+- (void)setDedicatedFrame:(CGRect)dFrame quirks:(int)quirks;
@end
+#endif /* NATIVEWINDOWPROTOCOLS_H_ */
+
diff --git a/src/nativewindow/native/macosx/OSXmisc.m b/src/nativewindow/native/macosx/OSXmisc.m
index 688ef79b8..afe3b3868 100644
--- a/src/nativewindow/native/macosx/OSXmisc.m
+++ b/src/nativewindow/native/macosx/OSXmisc.m
@@ -395,23 +395,23 @@ JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_GetNSWindow0
/*
* Class: Java_jogamp_nativewindow_macosx_OSXUtil
* Method: CreateCALayer0
- * Signature: (IIII)J
+ * Signature: (II)J
*/
JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_CreateCALayer0
- (JNIEnv *env, jclass unused, jint x, jint y, jint width, jint height)
+ (JNIEnv *env, jclass unused, jint width, jint height)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
MyCALayer* layer = [[MyCALayer alloc] init];
- DBG_PRINT("CALayer::CreateCALayer.0: root %p %d/%d %dx%d (refcnt %d)\n", layer, (int)x, (int)y, (int)width, (int)height, (int)[layer retainCount]);
+ DBG_PRINT("CALayer::CreateCALayer.0: root %p 0/0 %dx%d (refcnt %d)\n", layer, (int)width, (int)height, (int)[layer retainCount]);
// avoid zero size
if(0 == width) { width = 32; }
if(0 == height) { height = 32; }
// initial dummy size !
CGRect lRect = [layer frame];
- lRect.origin.x = x;
- lRect.origin.y = y;
+ lRect.origin.x = 0;
+ lRect.origin.y = 0;
lRect.size.width = width;
lRect.size.height = height;
[layer setFrame: lRect];
@@ -428,45 +428,79 @@ JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_CreateCALayer0
return (jlong) ((intptr_t) layer);
}
-static void FixCALayerLayout0(MyCALayer* rootLayer, CALayer* subLayer, jint width, jint height) {
+static void FixCALayerLayout0(MyCALayer* rootLayer, CALayer* subLayer, jint width, jint height, jint caLayerQuirks, jboolean force) {
if( NULL != rootLayer ) {
CGRect lRect = [rootLayer frame];
- if(lRect.origin.x!=0 || lRect.origin.y!=0 || lRect.size.width!=width || lRect.size.height!=height) {
- DBG_PRINT("CALayer::FixCALayerLayout0.0: Root %p frame %lf/%lf %lfx%lf -> 0/0 %dx%d\n",
- rootLayer, lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, (int)width, (int)height);
- lRect.origin.x = 0;
- lRect.origin.y = 0;
- lRect.size.width = width;
- lRect.size.height = height;
+ int posQuirk = 0 != ( NW_DEDICATEDFRAME_QUIRK_POSITION & caLayerQuirks ) && ( lRect.origin.x!=0 || lRect.origin.y!=0 );
+ int sizeQuirk = 0 != ( NW_DEDICATEDFRAME_QUIRK_SIZE & caLayerQuirks ) && ( lRect.size.width!=width || lRect.size.height!=height );
+ CGFloat _x, _y, _w, _h;
+ // force root -> 0/0
+ _x = 0;
+ _y = 0;
+ posQuirk |= 8;
+ if( sizeQuirk ) {
+ _w = width;
+ _h = height;
+ } else {
+ _w = lRect.size.width;
+ _h = lRect.size.height;
+ }
+ DBG_PRINT("CALayer::FixCALayerLayout0.0: Quirks [%d, pos %d, size %d], Root %p frame %lf/%lf %lfx%lf, usr %dx%d -> %lf/%lf %lfx%lf\n",
+ caLayerQuirks, posQuirk, sizeQuirk, rootLayer, lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height,
+ width, height, _x, _y, _w, _h);
+ if( posQuirk || sizeQuirk ) {
+ lRect.origin.x = _x;
+ lRect.origin.y = _y;
+ lRect.size.width = _w;
+ lRect.size.height = _h;
[rootLayer setFrame: lRect];
}
}
if( NULL != subLayer ) {
CGRect lRect = [subLayer frame];
- if(lRect.origin.x!=0 || lRect.origin.y!=0 || lRect.size.width!=width || lRect.size.height!=height) {
- DBG_PRINT("CALayer::FixCALayerLayout0.0: SubL %p frame %lf/%lf %lfx%lf -> 0/0 %dx%d\n",
- subLayer, lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, (int)width, (int)height);
- lRect.origin.x = 0;
- lRect.origin.y = 0;
- lRect.size.width = width;
- lRect.size.height = height;
- if( [subLayer conformsToProtocol:@protocol(NWDedicatedSize)] ) {
- CALayer <NWDedicatedSize> * subLayerDS = (CALayer <NWDedicatedSize> *) subLayer;
- [subLayerDS setDedicatedSize: lRect.size];
+ int sizeQuirk = 0 != ( NW_DEDICATEDFRAME_QUIRK_SIZE & caLayerQuirks ) && ( lRect.size.width!=width || lRect.size.height!=height );
+ CGFloat _x, _y, _w, _h;
+ int posQuirk = 0 != ( NW_DEDICATEDFRAME_QUIRK_POSITION & caLayerQuirks ) && ( lRect.origin.x!=0 || lRect.origin.y!=0 );
+ if( posQuirk ) {
+ _x = 0;
+ _y = 0;
+ } else {
+ // sub always rel to root
+ _x = lRect.origin.x;
+ _y = lRect.origin.y;
+ }
+ if( sizeQuirk ) {
+ _w = width;
+ _h = height;
+ } else {
+ _w = lRect.size.width;
+ _h = lRect.size.height;
+ }
+ DBG_PRINT("CALayer::FixCALayerLayout1.0: Quirks [%d, pos %d, size %d], SubL %p frame %lf/%lf %lfx%lf, usr %dx%d -> %lf/%lf %lfx%lf\n",
+ caLayerQuirks, posQuirk, sizeQuirk, subLayer, lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height,
+ width, height, _x, _y, _w, _h);
+ if( force || posQuirk || sizeQuirk ) {
+ lRect.origin.x = _x;
+ lRect.origin.y = _y;
+ lRect.size.width = _w;
+ lRect.size.height = _h;
+ if( [subLayer conformsToProtocol:@protocol(NWDedicatedFrame)] ) {
+ CALayer <NWDedicatedFrame> * subLayerDS = (CALayer <NWDedicatedFrame> *) subLayer;
+ [subLayerDS setDedicatedFrame: lRect quirks: caLayerQuirks];
} else {
[subLayer setFrame: lRect];
}
- }
+ }
}
}
/*
* Class: Java_jogamp_nativewindow_macosx_OSXUtil
* Method: AddCASublayer0
- * Signature: (JJII)V
+ * Signature: (JJIIIII)V
*/
JNIEXPORT void JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_AddCASublayer0
- (JNIEnv *env, jclass unused, jlong rootCALayer, jlong subCALayer, jint width, jint height)
+ (JNIEnv *env, jclass unused, jlong rootCALayer, jlong subCALayer, jint width, jint height, jint caLayerQuirks)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
MyCALayer* rootLayer = (MyCALayer*) ((intptr_t) rootCALayer);
@@ -479,20 +513,23 @@ JNIEXPORT void JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_AddCASublayer0
[subLayer retain]; // Pairs w/ RemoveCASublayer
CGRect lRectRoot = [rootLayer frame];
- DBG_PRINT("CALayer::AddCASublayer0.0: Origin %p frame0: %lf/%lf %lfx%lf\n",
- rootLayer, lRectRoot.origin.x, lRectRoot.origin.y, lRectRoot.size.width, lRectRoot.size.height);
- if(lRectRoot.origin.x!=0 || lRectRoot.origin.y!=0) {
- lRectRoot.origin.x = 0;
- lRectRoot.origin.y = 0;
- [rootLayer setFrame: lRectRoot];
- DBG_PRINT("CALayer::AddCASublayer0.1: Origin %p frame*: %lf/%lf %lfx%lf\n",
- rootLayer, lRectRoot.origin.x, lRectRoot.origin.y, lRectRoot.size.width, lRectRoot.size.height);
+ int posQuirk = 0 != ( NW_DEDICATEDFRAME_QUIRK_POSITION & caLayerQuirks );
+ int sizeQuirk = 0 != ( NW_DEDICATEDFRAME_QUIRK_SIZE & caLayerQuirks );
+
+ DBG_PRINT("CALayer::AddCASublayer0.0: Quirks [%d, pos %d, size %d], Root %p (refcnt %d), Sub %p (refcnt %d), frame0: %lf/%lf %lfx%lf\n",
+ caLayerQuirks, posQuirk, sizeQuirk, rootLayer, (int)[rootLayer retainCount], subLayer, (int)[subLayer retainCount],
+ lRectRoot.origin.x, lRectRoot.origin.y, lRectRoot.size.width, lRectRoot.size.height);
+
+ CGPoint origin = lRectRoot.origin; // save
+ // force root to 0/0
+ lRectRoot.origin.x = 0;
+ lRectRoot.origin.y = 0;
+ [rootLayer setFrame: lRectRoot];
+
+ // simple 1:1 layout rel. to root-layer !
+ if( !posQuirk ) {
+ lRectRoot.origin = origin;
}
- DBG_PRINT("CALayer::AddCASublayer0.2: root %p (refcnt %d) .sub %p %lf/%lf %lfx%lf (refcnt %d)\n",
- rootLayer, (int)[rootLayer retainCount],
- subLayer, lRectRoot.origin.x, lRectRoot.origin.y, lRectRoot.size.width, lRectRoot.size.height, (int)[subLayer retainCount]);
-
- // simple 1:1 layout !
[subLayer setFrame:lRectRoot];
[rootLayer addSublayer:subLayer];
@@ -507,7 +544,9 @@ JNIEXPORT void JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_AddCASublayer0
[subLayer setAutoresizingMask: (kCALayerWidthSizable|kCALayerHeightSizable)];
[subLayer setNeedsDisplayOnBoundsChange: YES];
- FixCALayerLayout0(rootLayer, subLayer, width, height);
+ if( 0 != caLayerQuirks ) {
+ FixCALayerLayout0(rootLayer, subLayer, width, height, caLayerQuirks, JNI_TRUE);
+ }
[CATransaction commit];
@@ -519,23 +558,25 @@ JNIEXPORT void JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_AddCASublayer0
/*
* Class: Java_jogamp_nativewindow_macosx_OSXUtil
* Method: FixCALayerLayout0
- * Signature: (JJII)V
+ * Signature: (JJIIIII)V
*/
JNIEXPORT void JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_FixCALayerLayout0
- (JNIEnv *env, jclass unused, jlong rootCALayer, jlong subCALayer, jint width, jint height)
+ (JNIEnv *env, jclass unused, jlong rootCALayer, jlong subCALayer, jint width, jint height, int caLayerQuirks)
{
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
- MyCALayer* rootLayer = (MyCALayer*) ((intptr_t) rootCALayer);
- CALayer* subLayer = (CALayer*) ((intptr_t) subCALayer);
+ if( 0 != caLayerQuirks ) {
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+ MyCALayer* rootLayer = (MyCALayer*) ((intptr_t) rootCALayer);
+ CALayer* subLayer = (CALayer*) ((intptr_t) subCALayer);
- [CATransaction begin];
- [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
+ [CATransaction begin];
+ [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
- FixCALayerLayout0(rootLayer, subLayer, width, height);
+ FixCALayerLayout0(rootLayer, subLayer, width, height, caLayerQuirks, JNI_FALSE);
- [CATransaction commit];
+ [CATransaction commit];
- [pool release];
+ [pool release];
+ }
}
/*
@@ -807,7 +848,7 @@ JNIEXPORT void JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_RunLater0
/*
* Class: Java_jogamp_nativewindow_macosx_OSXUtil
* Method: IsMainThread0
- * Signature: (V)V
+ * Signature: (V)Z
*/
JNIEXPORT jboolean JNICALL Java_jogamp_nativewindow_macosx_OSXUtil_IsMainThread0
(JNIEnv *env, jclass unused)
diff --git a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
index 374a80325..eadb69ec2 100644
--- a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
+++ b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
@@ -56,6 +56,7 @@ import javax.media.opengl.GLDrawableFactory;
import javax.swing.MenuSelectionManager;
import jogamp.nativewindow.awt.AWTMisc;
+import jogamp.nativewindow.jawt.JAWTUtil;
import jogamp.newt.Debug;
import jogamp.newt.WindowImpl;
import jogamp.newt.awt.NewtFactoryAWT;
@@ -63,7 +64,6 @@ import jogamp.newt.awt.event.AWTParentWindowAdapter;
import jogamp.newt.driver.DriverClearFocus;
import jogamp.opengl.awt.AWTTilePainter;
-import com.jogamp.common.os.Platform;
import com.jogamp.common.util.awt.AWTEDTExecutor;
import com.jogamp.nativewindow.awt.AWTPrintLifecycle;
import com.jogamp.nativewindow.awt.AWTWindowClosingProtocol;
@@ -741,7 +741,8 @@ public class NewtCanvasAWT extends java.awt.Canvas implements WindowClosingProto
newtChild.setSize(w, h);
newtChild.reparentWindow(jawtWindow);
newtChild.addSurfaceUpdatedListener(jawtWindow);
- if( Platform.OSType.MACOS == Platform.getOSType() && jawtWindow.isOffscreenLayerSurfaceEnabled() ) {
+ if( jawtWindow.isOffscreenLayerSurfaceEnabled() &&
+ 0 != ( JAWTUtil.JAWT_OSX_CALAYER_QUIRK_POSITION & JAWTUtil.getOSXCALayerQuirks() ) ) {
AWTEDTExecutor.singleton.invoke(false, forceRelayout);
}
newtChild.setVisible(true);
diff --git a/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java b/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java
index e8cd71514..83a129455 100644
--- a/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java
+++ b/src/newt/classes/com/jogamp/newt/awt/applet/JOGLNewtApplet1Run.java
@@ -42,7 +42,8 @@ import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
-import com.jogamp.common.os.Platform;
+import jogamp.nativewindow.jawt.JAWTUtil;
+
import com.jogamp.newt.awt.NewtCanvasAWT;
import com.jogamp.newt.opengl.GLWindow;
@@ -251,7 +252,9 @@ public class JOGLNewtApplet1Run extends Applet {
System.err.println("GLWindow: "+glWindow);
}
base.start();
- if( null != newtCanvasAWT && Platform.OSType.MACOS == Platform.getOSType() && newtCanvasAWT.isOffscreenLayerSurfaceEnabled() ) {
+ if( null != newtCanvasAWT &&
+ newtCanvasAWT.isOffscreenLayerSurfaceEnabled() &&
+ 0 != ( JAWTUtil.JAWT_OSX_CALAYER_QUIRK_POSITION & JAWTUtil.getOSXCALayerQuirks() ) ) {
// force relayout
final int cW = newtCanvasAWT.getWidth();
final int cH = newtCanvasAWT.getHeight();
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/awt/TestBug816OSXCALayerPosAWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/awt/TestBug816OSXCALayerPosAWT.java
index f929b4d14..48340aa75 100644
--- a/src/test/com/jogamp/opengl/test/junit/jogl/awt/TestBug816OSXCALayerPosAWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/jogl/awt/TestBug816OSXCALayerPosAWT.java
@@ -36,6 +36,7 @@ import javax.media.opengl.awt.GLCanvas;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
+import com.jogamp.common.util.awt.AWTEDTExecutor;
import com.jogamp.newt.event.awt.AWTWindowAdapter;
import com.jogamp.newt.event.TraceWindowAdapter;
import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2;
@@ -71,7 +72,7 @@ import org.junit.runners.MethodSorters;
public class TestBug816OSXCALayerPosAWT extends UITestCase {
public enum FrameLayout { None, Flow, DoubleBorderCenterSurrounded, Box };
- static long duration = 500; // ms
+ static long duration = 1600; // ms
static int width, height;
static boolean forceES2 = false;
@@ -102,7 +103,7 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
static void setComponentSize(final Frame frame, final Component comp1, final java.awt.Dimension new_sz1, final Component comp2, final java.awt.Dimension new_sz2) {
try {
- javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
+ AWTEDTExecutor.singleton.invoke(true /* wait */, new Runnable() {
public void run() {
comp1.setMinimumSize(new_sz1);
comp1.setPreferredSize(new_sz1);
@@ -121,9 +122,23 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
Assume.assumeNoException( throwable );
}
}
+ static void setFrameSize(final Frame frame, final boolean frameLayout, final java.awt.Dimension new_sz) {
+ try {
+ AWTEDTExecutor.singleton.invoke(true /* wait */, new Runnable() {
+ public void run() {
+ frame.setSize(new_sz);
+ if( frameLayout ) {
+ frame.validate();
+ }
+ } } );
+ } catch( Throwable throwable ) {
+ throwable.printStackTrace();
+ Assume.assumeNoException( throwable );
+ }
+ }
- protected void runTestGL(GLCapabilities caps, FrameLayout frameLayout, final boolean twoCanvas) throws InterruptedException, InvocationTargetException {
- final JFrame frame = new JFrame("Bug861 AWT Test");
+ protected void runTestGL(GLCapabilities caps, FrameLayout frameLayout, final boolean twoCanvas, final boolean resizeByComp) throws InterruptedException, InvocationTargetException {
+ final JFrame frame = new JFrame("Bug861: "+this.getTestMethodName());
Assert.assertNotNull(frame);
final Container framePane = frame.getContentPane();
@@ -138,6 +153,7 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
}
final Dimension glcDim = new Dimension(width/2, height);
+ final Dimension frameDim = new Dimension(twoCanvas ? width + 64: width/2 + 64, height + 64);
setComponentSize(null, glCanvas1, glcDim, glCanvas2, glcDim);
@@ -148,7 +164,7 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
break;
case Flow: {
final Container c = new Container();
- c.setLayout(new FlowLayout());
+ c.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
c.add(glCanvas1);
if( twoCanvas ) {
c.add(glCanvas2);
@@ -209,8 +225,12 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
- frame.pack();
- frame.setVisible(true);
+ if( resizeByComp ) {
+ frame.pack();
+ } else {
+ setFrameSize(frame, true, frameDim);
+ }
+ frame.setVisible(true);
}});
Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame, true));
Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glCanvas1, true));
@@ -229,8 +249,13 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
}
Thread.sleep(Math.max(1000, duration/2));
- final Dimension rwsizeHalf = new Dimension(rwsize.width/2, rwsize.height);
- setComponentSize(frame, glCanvas1, rwsizeHalf, glCanvas2, rwsizeHalf);
+ final Dimension compRSizeHalf = new Dimension(rwsize.width/2, rwsize.height);
+ final Dimension frameRSizeHalf = new Dimension(twoCanvas ? rwsize.width + 64: rwsize.width/2 + 64, rwsize.height + 64);
+ if( resizeByComp ) {
+ setComponentSize(frame, glCanvas1, compRSizeHalf, glCanvas2, compRSizeHalf);
+ } else {
+ setFrameSize(frame, true, frameRSizeHalf);
+ }
System.err.println("resize canvas1 pos/siz: "+glCanvas1.getX()+"/"+glCanvas1.getY()+" "+glCanvas1.getWidth()+"x"+glCanvas1.getHeight());
if( twoCanvas ) {
System.err.println("resize canvas2 pos/siz: "+glCanvas2.getX()+"/"+glCanvas2.getY()+" "+glCanvas2.getWidth()+"x"+glCanvas2.getHeight());
@@ -276,52 +301,101 @@ public class TestBug816OSXCALayerPosAWT extends UITestCase {
}
@Test
- public void test00_None_One() throws InterruptedException, InvocationTargetException {
+ public void test00_Compo_None_One() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 0 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.None, false);
+ runTestGL(caps, FrameLayout.None, false /* twoCanvas */, true /* resizeByComp */);
}
@Test
- public void test01_Flow_One() throws InterruptedException, InvocationTargetException {
+ public void test01_Compo_Flow_One() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 1 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.Flow, false);
+ runTestGL(caps, FrameLayout.Flow, false /* twoCanvas */, true /* resizeByComp */);
}
@Test
- public void test02_DblBrd_One() throws InterruptedException, InvocationTargetException {
+ public void test02_Compo_DblBrd_One() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 2 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.DoubleBorderCenterSurrounded, false);
+ runTestGL(caps, FrameLayout.DoubleBorderCenterSurrounded, false /* twoCanvas */, true /* resizeByComp */);
}
@Test
- public void test03_Box_One() throws InterruptedException, InvocationTargetException {
+ public void test03_Compo_Box_One() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 3 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.Box, false);
+ runTestGL(caps, FrameLayout.Box, false /* twoCanvas */, true /* resizeByComp */);
}
@Test
- public void test04_Flow_Two() throws InterruptedException, InvocationTargetException {
+ public void test04_Compo_Flow_Two() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 4 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.Flow, true);
+ runTestGL(caps, FrameLayout.Flow, true/* twoCanvas */, true /* resizeByComp */);
}
@Test
- public void test05_DblBrd_Two() throws InterruptedException, InvocationTargetException {
+ public void test05_Compo_DblBrd_Two() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 5 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.DoubleBorderCenterSurrounded, true);
+ runTestGL(caps, FrameLayout.DoubleBorderCenterSurrounded, true/* twoCanvas */, true /* resizeByComp */);
}
@Test
- public void test06_Box_Two() throws InterruptedException, InvocationTargetException {
+ public void test06_Compo_Box_Two() throws InterruptedException, InvocationTargetException {
if( testNum != -1 && testNum != 6 ) { return ; }
final GLCapabilities caps = new GLCapabilities(getGLP());
- runTestGL(caps, FrameLayout.Box, true);
+ runTestGL(caps, FrameLayout.Box, true/* twoCanvas */, true /* resizeByComp */);
+ }
+
+ @Test
+ public void test10_Frame_None_One() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 10 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.None, false /* twoCanvas */, false /* resizeByComp */);
+ }
+
+ @Test
+ public void test11_Frame_Flow_One() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 11 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.Flow, false /* twoCanvas */, false /* resizeByComp */);
+ }
+
+ @Test
+ public void test12_Frame_DblBrd_One() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 12 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.DoubleBorderCenterSurrounded, false /* twoCanvas */, false /* resizeByComp */);
+ }
+
+ @Test
+ public void test13_Frame_Box_One() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 13 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.Box, false /* twoCanvas */, false /* resizeByComp */);
+ }
+
+ @Test
+ public void test14_Frame_Flow_Two() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 14 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.Flow, true/* twoCanvas */, false /* resizeByComp */);
+ }
+
+ @Test
+ public void test15_Frame_DblBrd_Two() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 15 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.DoubleBorderCenterSurrounded, true/* twoCanvas */, false /* resizeByComp */);
+ }
+
+ @Test
+ public void test16_Frame_Box_Two() throws InterruptedException, InvocationTargetException {
+ if( testNum != -1 && testNum != 16 ) { return ; }
+ final GLCapabilities caps = new GLCapabilities(getGLP());
+ runTestGL(caps, FrameLayout.Box, true/* twoCanvas */, false /* resizeByComp */);
}
static int testNum = -1;