JOGL v2.6.0-rc-20250706
JOGL, High-Performance Graphics Binding for Java™ (public API).
TestParenting01NEWT.java
Go to the documentation of this file.
1/**
2 * Copyright 2010 JogAmp Community. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification, are
5 * permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * The views and conclusions contained in the software and documentation are those of the
25 * authors and should not be interpreted as representing official policies, either expressed
26 * or implied, of JogAmp Community.
27 */
28
29package com.jogamp.opengl.test.junit.newt.parenting;
30
31
32import org.junit.Assert;
33import org.junit.BeforeClass;
34import org.junit.Test;
35import org.junit.FixMethodOrder;
36import org.junit.runners.MethodSorters;
37
38import com.jogamp.opengl.*;
39
40import com.jogamp.opengl.util.Animator;
41import com.jogamp.newt.*;
42import com.jogamp.newt.opengl.*;
43
44import java.io.IOException;
45
46import com.jogamp.opengl.test.junit.util.*;
47import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2;
48import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2;
49
50@FixMethodOrder(MethodSorters.NAME_ASCENDING)
51public class TestParenting01NEWT extends UITestCase {
52 static int width, height;
53 static long durationPerTest = 600;
54 static boolean manual = false;
55 static int loopVisibleToggle = 10;
56 static GLCapabilities glCaps;
57
58 @BeforeClass
59 public static void initClass() {
60 width = 640;
61 height = 480;
62 glCaps = new GLCapabilities(null);
63 }
64
65 private static void waitForFrames(final String waitFor, final int prefixIdx,
66 final GLWindow glWindow1, final GLWindow glWindow2,
67 final long TO, final boolean doAssert) {
68 final long t0 = System.currentTimeMillis();
69 int a, b;
70 long t1;
71 do {
72 try { Thread.sleep(16); } catch (final InterruptedException e) { }
73 if( null != glWindow1 ) {
74 a = glWindow1.getTotalFPSFrames();
75 } else {
76 a = -1;
77 }
78 if( null != glWindow2 ) {
79 b = glWindow2.getTotalFPSFrames();
80 } else {
81 b = -1;
82 }
83 t1 = System.currentTimeMillis();
84 } while ( ( 0 == a || 0 == b ) && TO > ( t1 - t0 ) );
85 System.err.println("Frames for "+waitFor+": A"+prefixIdx+": "+a+", B"+prefixIdx+": "+b);
86 if( doAssert ) {
87 if( null != glWindow1 ) {
88 Assert.assertTrue("No frames."+prefixIdx+" displayed on window1 during "+TO+"ms", 0 < a);
89 }
90 if( null != glWindow2 ) {
91 Assert.assertTrue("No frames."+prefixIdx+" displayed on window2 during "+TO+"ms", 0 < b);
92 }
93 }
94 }
95
96 @Test
97 public void test01CreateVisibleDestroy() throws InterruptedException {
98 Assert.assertEquals(0,Display.getActiveDisplayNumber());
99 Display display = null;
100 Screen screen = null;
101
102 final GLWindow glWindow1 = GLWindow.create(glCaps);
103 Assert.assertNotNull(glWindow1);
104 Assert.assertEquals(false, glWindow1.isVisible());
105 Assert.assertEquals(false, glWindow1.isNativeValid());
106 Assert.assertNull(glWindow1.getParent());
107 screen = glWindow1.getScreen();
108 display = screen.getDisplay();
109 Assert.assertEquals(0,display.getReferenceCount());
110 Assert.assertEquals(false,display.isNativeValid());
111 Assert.assertNotNull(display.getEDTUtil());
112 Assert.assertEquals(false,display.getEDTUtil().isRunning());
113 Assert.assertEquals(0,screen.getReferenceCount());
114 Assert.assertEquals(false,screen.isNativeValid());
115 Assert.assertEquals(0,Display.getActiveDisplayNumber());
116
117 glWindow1.setTitle("test01CreateVisibleDestroy");
118 glWindow1.setSize(640, 480);
119 final GLEventListener demo1 = new RedSquareES2();
120 setDemoFields(demo1, glWindow1, false);
121 glWindow1.addGLEventListener(demo1);
122
123 final GLWindow glWindow2 = GLWindow.create(glWindow1, glCaps);
124 Assert.assertNotNull(glWindow2);
125 Assert.assertEquals(false, glWindow2.isVisible());
126 Assert.assertEquals(false, glWindow2.isNativeValid());
127 Assert.assertSame(glWindow1,glWindow2.getParent());
128 Assert.assertSame(screen,glWindow2.getScreen());
129 Assert.assertSame(display,glWindow2.getScreen().getDisplay());
130 glWindow2.setSize(320, 240);
131 final GLEventListener demo2 = new GearsES2();
132 setDemoFields(demo2, glWindow2, false);
133 glWindow2.addGLEventListener(demo2);
134
135 Assert.assertEquals(0,display.getReferenceCount());
136 Assert.assertEquals(false,display.isNativeValid());
137 Assert.assertNotNull(display.getEDTUtil());
138 Assert.assertEquals(true,display.getEDTUtil().isRunning()); // GLWindow -> invoke ..
139 Assert.assertEquals(0,screen.getReferenceCount());
140 Assert.assertEquals(false,screen.isNativeValid());
141 Assert.assertEquals(0,Display.getActiveDisplayNumber());
142
143 // visible test
144 for(int i=1; i<=loopVisibleToggle; i++) {
145 Assert.assertEquals(0, glWindow1.getTotalFPSFrames());
146 Assert.assertEquals(0, glWindow2.getTotalFPSFrames());
147 System.err.println("XXX VISIBLE."+i+" -> TRUE");
148 glWindow1.setVisible(true);
149 Assert.assertEquals(true, glWindow1.isVisible());
150 Assert.assertEquals(true, glWindow1.isNativeValid());
151 Assert.assertEquals(true, glWindow2.isVisible());
152 Assert.assertEquals(true, glWindow2.isNativeValid());
153 Assert.assertEquals(1,display.getReferenceCount());
154 Assert.assertEquals(true,display.isNativeValid());
155 Assert.assertNotNull(display.getEDTUtil());
156 Assert.assertEquals(true,display.getEDTUtil().isRunning());
157 Assert.assertEquals(2,screen.getReferenceCount());
158 Assert.assertEquals(true,screen.isNativeValid());
159 Assert.assertEquals(1,Display.getActiveDisplayNumber());
160 waitForFrames("window1.setVisible(true)", 1, glWindow1, glWindow2, 2000, true);
161
162 System.err.println("XXX VISIBLE."+i+" -> FALSE");
163 glWindow1.setVisible(false);
164 Assert.assertEquals(false, glWindow1.isVisible());
165 Assert.assertEquals(true, glWindow1.isNativeValid());
166 Assert.assertEquals(false, glWindow2.isVisible());
167 Assert.assertEquals(true, glWindow2.isNativeValid());
168
169 glWindow1.resetFPSCounter();
170 glWindow2.resetFPSCounter();
171 }
172 Assert.assertEquals(0, glWindow1.getTotalFPSFrames());
173 Assert.assertEquals(0, glWindow2.getTotalFPSFrames());
174 System.err.println("XXX VISIBLE.3 -> TRUE");
175 glWindow1.setVisible(true);
176 Assert.assertEquals(true, glWindow1.isVisible());
177 Assert.assertEquals(true, glWindow1.isNativeValid());
178 Assert.assertEquals(true, glWindow2.isVisible());
179 Assert.assertEquals(true, glWindow2.isNativeValid());
180 waitForFrames("window1.setVisible(true)", 2, glWindow1, glWindow2, 2000, true);
181
182 glWindow1.resetFPSCounter();
183 glWindow2.resetFPSCounter();
184 final Animator animator1 = new Animator(glWindow1);
185 animator1.setUpdateFPSFrames(1, null);
186 animator1.start();
187 Assert.assertEquals(true, animator1.isAnimating());
188 Assert.assertEquals(false, animator1.isPaused());
189 Assert.assertNotNull(animator1.getThread());
190 final Animator animator2 = new Animator(glWindow2);
191 animator2.setUpdateFPSFrames(1, null);
192 animator2.start();
193 Assert.assertEquals(true, animator2.isAnimating());
194 Assert.assertEquals(false, animator2.isPaused());
195 Assert.assertNotNull(animator2.getThread());
196 while(animator1.isAnimating() && animator1.getTotalFPSDuration()<durationPerTest) {
197 Thread.sleep(100);
198 }
199 waitForFrames("animator.start()", 3, glWindow1, glWindow2, 2000, true);
200
201 Assert.assertEquals(true, animator1.pause());
202 Assert.assertEquals(false, animator1.isAnimating());
203 Assert.assertEquals(true, animator1.isPaused());
204 Assert.assertNotNull(animator1.getThread());
205 Assert.assertEquals(true, animator2.pause());
206 Assert.assertEquals(false, animator2.isAnimating());
207 Assert.assertEquals(true, animator2.isPaused());
208 Assert.assertNotNull(animator2.getThread());
209
210 glWindow1.resetFPSCounter();
211 glWindow2.resetFPSCounter();
212 Assert.assertEquals(true, animator1.resume());
213 Assert.assertEquals(true, animator1.isAnimating());
214 Assert.assertEquals(false, animator1.isPaused());
215 Assert.assertNotNull(animator1.getThread());
216 Assert.assertEquals(true, animator2.resume());
217 Assert.assertEquals(true, animator2.isAnimating());
218 Assert.assertEquals(false, animator2.isPaused());
219 Assert.assertNotNull(animator2.getThread());
220 waitForFrames("animator.resume()", 4, glWindow1, glWindow2, 2000, true);
221
222 animator1.stop();
223 Assert.assertEquals(false, animator1.isAnimating());
224 Assert.assertEquals(false, animator1.isPaused());
225 Assert.assertEquals(null, animator1.getThread());
226 animator2.stop();
227 Assert.assertEquals(false, animator2.isAnimating());
228 Assert.assertEquals(false, animator2.isPaused());
229 Assert.assertEquals(null, animator2.getThread());
230
231 Assert.assertEquals(1,display.getReferenceCount());
232 Assert.assertEquals(true,display.isNativeValid());
233 Assert.assertNotNull(display.getEDTUtil());
234 Assert.assertEquals(true,display.getEDTUtil().isRunning());
235 Assert.assertEquals(2,screen.getReferenceCount());
236 Assert.assertEquals(true,screen.isNativeValid());
237 Assert.assertEquals(1,Display.getActiveDisplayNumber());
238
239 glWindow2.destroy(); // can be recreated, refs are hold
240 Assert.assertEquals(true, glWindow1.isVisible());
241 Assert.assertEquals(true, glWindow1.isNativeValid());
242 Assert.assertEquals(false, glWindow2.isVisible());
243 Assert.assertEquals(false, glWindow2.isNativeValid());
244
245 Assert.assertEquals(1,display.getReferenceCount());
246 Assert.assertEquals(true,display.isNativeValid());
247 Assert.assertNotNull(display.getEDTUtil());
248 Assert.assertEquals(true,display.getEDTUtil().isRunning());
249 Assert.assertEquals(1,screen.getReferenceCount());
250 Assert.assertEquals(true,screen.isNativeValid());
251 Assert.assertEquals(1,Display.getActiveDisplayNumber());
252
253 glWindow1.destroy(); // can be recreated, refs are hold
254 Assert.assertEquals(false, glWindow1.isVisible());
255 Assert.assertEquals(false, glWindow1.isNativeValid());
256 Assert.assertEquals(false, glWindow2.isVisible());
257 Assert.assertEquals(false, glWindow2.isNativeValid());
258
259 Assert.assertEquals(0,display.getReferenceCount());
260 Assert.assertEquals(false,display.isNativeValid());
261 Assert.assertNotNull(display.getEDTUtil());
262 Assert.assertEquals(false,display.getEDTUtil().isRunning());
263 Assert.assertEquals(0,screen.getReferenceCount());
264 Assert.assertEquals(false,screen.isNativeValid());
265 Assert.assertEquals(0,Display.getActiveDisplayNumber());
266
267 // recreation ..
268 glWindow1.resetFPSCounter();
269 glWindow2.resetFPSCounter();
270 Assert.assertEquals(0, glWindow1.getTotalFPSFrames());
271 Assert.assertEquals(0, glWindow2.getTotalFPSFrames());
272 System.err.println("XXX VISIBLE.4 -> TRUE");
273 glWindow1.setVisible(true);
274 Assert.assertEquals(true, glWindow1.isVisible());
275 Assert.assertEquals(true, glWindow1.isNativeValid());
276 Assert.assertEquals(true, glWindow2.isVisible());
277 Assert.assertEquals(true, glWindow2.isNativeValid());
278 waitForFrames("window1.setVisible(true) recreate", 5, glWindow1, glWindow2, 2000, true);
279
280 Assert.assertEquals(1,display.getReferenceCount());
281 Assert.assertEquals(true,display.isNativeValid());
282 Assert.assertNotNull(display.getEDTUtil());
283 Assert.assertEquals(true,display.getEDTUtil().isRunning());
284 Assert.assertEquals(2,screen.getReferenceCount());
285 Assert.assertEquals(true,screen.isNativeValid());
286 Assert.assertEquals(1,Display.getActiveDisplayNumber());
287
288 // chain glwindow1 -> glwindow2 ; can be recreated ..
289 glWindow1.destroy();
290 Assert.assertEquals(false, glWindow1.isNativeValid());
291 Assert.assertEquals(false, glWindow2.isNativeValid());
292 Assert.assertEquals(0,display.getReferenceCount());
293 Assert.assertEquals(false,display.isNativeValid());
294 Assert.assertNotNull(display.getEDTUtil());
295 Assert.assertEquals(false,display.getEDTUtil().isRunning());
296 Assert.assertEquals(0,screen.getReferenceCount());
297 Assert.assertEquals(false,screen.isNativeValid());
298 Assert.assertEquals(0,Display.getActiveDisplayNumber());
299
300 // test double destroy/invalidate ..
301 glWindow2.destroy();
302
303 Assert.assertEquals(0,display.getReferenceCount());
304 Assert.assertEquals(false,display.isNativeValid());
305 Assert.assertNotNull(display.getEDTUtil());
306 Assert.assertEquals(false,display.getEDTUtil().isRunning());
307 Assert.assertEquals(0,screen.getReferenceCount());
308 Assert.assertEquals(false,screen.isNativeValid());
309 Assert.assertEquals(0,Display.getActiveDisplayNumber());
310 }
311
312 @Test
313 public void test02aReparentTop2WinReparentRecreate() throws InterruptedException {
314 if( manual ) {
315 return;
316 }
317 test02ReparentTop2WinImpl(true);
318 }
319
320 @Test
321 public void test02bReparentTop2WinReparentNative() throws InterruptedException {
322 if( manual ) {
323 return;
324 }
325 test02ReparentTop2WinImpl(false);
326 }
327
328 /**
329 * @param reparentRecreate true, if the followup reparent should utilize destroy/create, instead of native reparenting
330 */
331 protected void test02ReparentTop2WinImpl(final boolean reparentRecreate) throws InterruptedException {
332 final int reparentHints = reparentRecreate ? Window.REPARENT_HINT_FORCE_RECREATION : 0;
333
334 Assert.assertEquals(0,Display.getActiveDisplayNumber());
335 Display display1 = null;
336 Screen screen1 = null;
337
338 final GLWindow glWindow1 = GLWindow.create(glCaps);
339 glWindow1.setTitle("test02ReparentTop2Win");
340 glWindow1.setSize(640, 480);
341 final GLEventListener demo1 = new RedSquareES2();
342 setDemoFields(demo1, glWindow1, false);
343 glWindow1.addGLEventListener(demo1);
344 screen1 = glWindow1.getScreen();
345 display1 = screen1.getDisplay();
346
347 Assert.assertEquals(0,display1.getReferenceCount());
348 Assert.assertEquals(false,display1.isNativeValid());
349 Assert.assertNotNull(display1.getEDTUtil());
350 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
351 Assert.assertEquals(0,screen1.getReferenceCount());
352 Assert.assertEquals(false,screen1.isNativeValid());
353 Assert.assertEquals(0,Display.getActiveDisplayNumber());
354
355 final GLWindow glWindow2 = GLWindow.create(glCaps);
356 glWindow2.setSize(320, 240);
357 final GLEventListener demo2 = new GearsES2();
358 setDemoFields(demo2, glWindow2, false);
359 glWindow2.addGLEventListener(demo2);
360 Assert.assertSame(screen1, glWindow2.getScreen());
361 Assert.assertSame(display1, glWindow2.getScreen().getDisplay());
362
363 Assert.assertEquals(0,display1.getReferenceCount());
364 Assert.assertEquals(false,display1.isNativeValid());
365 Assert.assertNotNull(display1.getEDTUtil());
366 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
367 Assert.assertEquals(0,screen1.getReferenceCount());
368 Assert.assertEquals(false,screen1.isNativeValid());
369 Assert.assertEquals(0,Display.getActiveDisplayNumber());
370
371 Assert.assertEquals(0, glWindow1.getTotalFPSFrames());
372 glWindow1.setVisible(true);
373 Assert.assertEquals(1,display1.getReferenceCount());
374 Assert.assertEquals(true,display1.isNativeValid());
375 Assert.assertNotNull(display1.getEDTUtil());
376 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
377 Assert.assertEquals(1,screen1.getReferenceCount());
378 Assert.assertEquals(true,screen1.isNativeValid());
379 Assert.assertEquals(1,Display.getActiveDisplayNumber());
380 Assert.assertEquals(true, glWindow1.isVisible());
381 waitForFrames("window1.setVisible(true)", 1, glWindow1, null, 2000, true);
382 Assert.assertEquals(0, glWindow2.getTotalFPSFrames());
383
384 glWindow2.setVisible(true);
385 Assert.assertEquals(1,display1.getReferenceCount());
386 Assert.assertEquals(true,display1.isNativeValid());
387 Assert.assertNotNull(display1.getEDTUtil());
388 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
389 Assert.assertEquals(2,screen1.getReferenceCount());
390 Assert.assertEquals(true,screen1.isNativeValid());
391 Assert.assertEquals(1,Display.getActiveDisplayNumber());
392 Assert.assertEquals(true, glWindow2.isVisible());
393 waitForFrames("window2.setVisible(true)", 2, glWindow1, glWindow2, 2000, true);
394
395 final Animator animator1 = new Animator(glWindow1);
396 animator1.setUpdateFPSFrames(1, null);
397 animator1.start();
398 final Animator animator2 = new Animator(glWindow2);
399 animator2.setUpdateFPSFrames(1, null);
400 animator2.start();
401
402 int state = 0;
403 Window.ReparentOperation reparentAction;
404 while(animator1.isAnimating() && animator1.getTotalFPSDuration()<7*durationPerTest) {
405 Thread.sleep(durationPerTest);
406 switch(state) {
407 case 0:
408 // top-level glWindow2 hide
409 Assert.assertEquals(true, glWindow1.isVisible());
410 Assert.assertEquals(true, glWindow2.isVisible());
411 glWindow2.setVisible(false);
412 Assert.assertEquals(false, glWindow2.isVisible());
413 Assert.assertEquals(true, glWindow1.isVisible());
414 break;
415
416 case 1:
417 // top-level glWindow2 show
418 Assert.assertEquals(true, glWindow1.isVisible());
419 Assert.assertEquals(false, glWindow2.isVisible());
420 glWindow2.setVisible(true);
421 Assert.assertEquals(true, glWindow2.isVisible());
422 Assert.assertEquals(true, glWindow1.isVisible());
423 break;
424
425 case 2:
426 // glWindow2 -- child --> glWindow1: compatible
427 Assert.assertEquals(true, glWindow2.isVisible());
428 System.err.println("Frames(1) "+glWindow2.getTotalFPSFrames());
429 reparentAction = glWindow2.reparentWindow(glWindow1, -1, -1, reparentHints);
430 System.err.println("Frames(2) "+glWindow2.getTotalFPSFrames());
431 Assert.assertTrue(Window.ReparentOperation.ACTION_INVALID != reparentAction);
432 Assert.assertEquals(true, glWindow2.isVisible());
433 Assert.assertEquals(true, glWindow2.isNativeValid());
434 Assert.assertSame(glWindow1,glWindow2.getParent());
435 waitForFrames("reparentWindow.child(parent, "+reparentRecreate+"), "+reparentAction, 10, glWindow1, glWindow2, 2000, true);
436
437 Assert.assertEquals(1,display1.getReferenceCount());
438 Assert.assertEquals(true,display1.isNativeValid());
439 Assert.assertNotNull(display1.getEDTUtil());
440 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
441 Assert.assertEquals(true,screen1.isNativeValid());
442 Assert.assertSame(screen1,glWindow2.getScreen());
443 Assert.assertSame(display1,glWindow2.getScreen().getDisplay());
444 Assert.assertEquals(2,screen1.getReferenceCount());
445 Assert.assertEquals(1,Display.getActiveDisplayNumber());
446
447 break;
448
449 case 3:
450 // child glWindow2 hide
451 Assert.assertEquals(true, glWindow1.isVisible());
452 Assert.assertEquals(true, glWindow2.isVisible());
453 glWindow2.setVisible(false);
454 Assert.assertEquals(false, glWindow2.isVisible());
455 Assert.assertEquals(true, glWindow1.isVisible());
456 break;
457
458 case 4:
459 // child glWindow2 show
460 Assert.assertEquals(true, glWindow1.isVisible());
461 Assert.assertEquals(false, glWindow2.isVisible());
462 glWindow2.setVisible(true);
463 Assert.assertEquals(true, glWindow2.isVisible());
464 Assert.assertEquals(true, glWindow1.isVisible());
465 break;
466
467 case 5:
468 // glWindow2 --> top
469 Assert.assertEquals(true, glWindow2.isVisible());
470
471 reparentAction = glWindow2.reparentWindow(null, -1, -1, reparentHints);
472 Assert.assertTrue(Window.ReparentOperation.ACTION_INVALID != reparentAction);
473 Assert.assertEquals(true, glWindow2.isVisible());
474 Assert.assertEquals(true, glWindow2.isNativeValid());
475 Assert.assertNull(glWindow2.getParent());
476 waitForFrames("reparentWindow.top(parent, "+reparentRecreate+"), "+reparentAction, 11, glWindow1, glWindow2, 2000, true);
477
478 Assert.assertEquals(1,display1.getReferenceCount());
479 Assert.assertEquals(true,display1.isNativeValid());
480 Assert.assertNotNull(display1.getEDTUtil());
481 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
482 Assert.assertEquals(true,screen1.isNativeValid());
483 Assert.assertSame(screen1,glWindow2.getScreen());
484 Assert.assertSame(display1,glWindow2.getScreen().getDisplay());
485 Assert.assertEquals(2,screen1.getReferenceCount());
486 Assert.assertEquals(1,Display.getActiveDisplayNumber());
487
488 break;
489 }
490 state++;
491 }
492 //
493 // both windows are now top level
494 //
495
496 animator1.stop();
497 Assert.assertEquals(false, animator1.isAnimating());
498 Assert.assertEquals(false, animator1.isPaused());
499 Assert.assertEquals(null, animator1.getThread());
500 animator2.stop();
501 Assert.assertEquals(false, animator2.isAnimating());
502 Assert.assertEquals(false, animator2.isPaused());
503 Assert.assertEquals(null, animator2.getThread());
504
505 // pre-destroy check (both valid and running)
506 Assert.assertEquals(1,display1.getReferenceCount());
507 Assert.assertEquals(true,display1.isNativeValid());
508 Assert.assertNotNull(display1.getEDTUtil());
509 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
510 Assert.assertEquals(2,screen1.getReferenceCount());
511 Assert.assertEquals(true,screen1.isNativeValid());
512 Assert.assertEquals(1,Display.getActiveDisplayNumber());
513
514 // destroy glWindow2
515 glWindow2.destroy();
516 Assert.assertEquals(true, glWindow1.isNativeValid());
517 Assert.assertEquals(true, glWindow1.isVisible());
518 Assert.assertEquals(false, glWindow2.isNativeValid());
519 Assert.assertEquals(false, glWindow2.isVisible());
520
521 Assert.assertEquals(1,display1.getReferenceCount());
522 Assert.assertEquals(true,display1.isNativeValid());
523 Assert.assertNotNull(display1.getEDTUtil());
524 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
525 Assert.assertEquals(1,screen1.getReferenceCount());
526 Assert.assertEquals(true,screen1.isNativeValid());
527
528 Assert.assertEquals(1,Display.getActiveDisplayNumber());
529
530 // destroy glWindow1
531 glWindow1.destroy();
532 Assert.assertEquals(false, glWindow1.isNativeValid());
533 Assert.assertEquals(false, glWindow1.isVisible());
534 Assert.assertEquals(false, glWindow2.isNativeValid());
535 Assert.assertEquals(false, glWindow2.isVisible());
536
537 Assert.assertEquals(0,display1.getReferenceCount());
538 Assert.assertEquals(false,display1.isNativeValid());
539 Assert.assertNotNull(display1.getEDTUtil());
540 Assert.assertEquals(false,display1.getEDTUtil().isRunning());
541 Assert.assertEquals(0,screen1.getReferenceCount());
542 Assert.assertEquals(false,screen1.isNativeValid());
543
544 Assert.assertEquals(0,Display.getActiveDisplayNumber());
545 }
546
547 @Test
548 public void test03aReparentWin2TopReparentRecreate() throws InterruptedException {
549 if( manual ) {
550 return;
551 }
552 test03ReparentWin2TopImpl(true);
553 }
554
555 @Test
556 public void test03bReparentWin2TopReparentNative() throws InterruptedException {
557 if( manual ) {
558 return;
559 }
560 test03ReparentWin2TopImpl(false);
561 }
562
563 protected void test03ReparentWin2TopImpl(final boolean reparentRecreate) throws InterruptedException {
564 final int reparentHints = reparentRecreate ? Window.REPARENT_HINT_FORCE_RECREATION : 0;
565
566 Assert.assertEquals(0,Display.getActiveDisplayNumber());
567 Display display1 = null;
568 Screen screen1 = null;
569 Display display2 = null;
570 Screen screen2 = null;
571
572 final GLWindow glWindow1 = GLWindow.create(glCaps);
573 screen1 = glWindow1.getScreen();
574 display1 = screen1.getDisplay();
575 glWindow1.setTitle("test03ReparentWin2Top");
576 glWindow1.setSize(640, 480);
577 final GLEventListener demo1 = new RedSquareES2();
578 setDemoFields(demo1, glWindow1, false);
579 glWindow1.addGLEventListener(demo1);
580
581 Assert.assertEquals(0,display1.getReferenceCount());
582 Assert.assertEquals(false,display1.isNativeValid());
583 Assert.assertNotNull(display1.getEDTUtil());
584 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
585 Assert.assertEquals(0,screen1.getReferenceCount());
586 Assert.assertEquals(false,screen1.isNativeValid());
587 Assert.assertEquals(0,Display.getActiveDisplayNumber());
588
589 final GLWindow glWindow2 = GLWindow.create(glWindow1, glCaps);
590 screen2 = glWindow2.getScreen();
591 display2 = screen2.getDisplay();
592 glWindow2.setSize(320, 240);
593 final GLEventListener demo2 = new GearsES2();
594 setDemoFields(demo2, glWindow2, false);
595 glWindow2.addGLEventListener(demo2);
596
597 Assert.assertEquals(0,display2.getReferenceCount());
598 Assert.assertEquals(false,display2.isNativeValid());
599 Assert.assertNotNull(display2.getEDTUtil());
600 Assert.assertEquals(true,display2.getEDTUtil().isRunning());
601 Assert.assertEquals(0,screen2.getReferenceCount());
602 Assert.assertEquals(false,screen2.isNativeValid());
603 Assert.assertEquals(0,Display.getActiveDisplayNumber());
604
605 Assert.assertSame(screen1,glWindow2.getScreen());
606 Assert.assertSame(display1,glWindow2.getScreen().getDisplay());
607
608 Assert.assertEquals(0, glWindow1.getTotalFPSFrames());
609 Assert.assertEquals(0, glWindow2.getTotalFPSFrames());
610 glWindow1.setVisible(true);
611 Assert.assertEquals(1,display1.getReferenceCount());
612 Assert.assertEquals(true,display1.isNativeValid());
613 Assert.assertNotNull(display1.getEDTUtil());
614 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
615 Assert.assertEquals(2,screen1.getReferenceCount());
616 Assert.assertEquals(true,screen1.isNativeValid());
617 Assert.assertSame(glWindow1,glWindow2.getParent());
618 Assert.assertSame(screen1,glWindow2.getScreen());
619 Assert.assertEquals(1,Display.getActiveDisplayNumber());
620 waitForFrames("window1.setVisible(true)", 1, glWindow1, glWindow2, 2000, true);
621
622 final Animator animator1 = new Animator(glWindow1);
623 animator1.setUpdateFPSFrames(1, null);
624 animator1.start();
625 final Animator animator2 = new Animator(glWindow2);
626 animator2.setUpdateFPSFrames(1, null);
627 animator2.start();
628
629 int state = 0;
630 Window.ReparentOperation reparentAction;
631 while(animator1.isAnimating() && animator1.getTotalFPSDuration()<7*durationPerTest) {
632 Thread.sleep(durationPerTest);
633 switch(state) {
634 case 0:
635 // child glWindow2 hide
636 Assert.assertEquals(true, glWindow1.isVisible());
637 Assert.assertEquals(true, glWindow2.isVisible());
638 glWindow2.setVisible(false);
639 Assert.assertEquals(false, glWindow2.isVisible());
640 Assert.assertEquals(true, glWindow1.isVisible());
641 break;
642
643 case 1:
644 // child glWindow2 show
645 Assert.assertEquals(true, glWindow1.isVisible());
646 Assert.assertEquals(false, glWindow2.isVisible());
647 glWindow2.setVisible(true);
648 Assert.assertEquals(true, glWindow2.isVisible());
649 Assert.assertEquals(true, glWindow1.isVisible());
650 break;
651
652 case 2:
653 // glWindow2 --> top
654 Assert.assertEquals(true, glWindow2.isVisible());
655 reparentAction = glWindow2.reparentWindow(null, -1, -1, reparentHints);
656 Assert.assertTrue(Window.ReparentOperation.ACTION_INVALID != reparentAction);
657 Assert.assertEquals(true, glWindow2.isVisible());
658 Assert.assertEquals(true, glWindow2.isNativeValid());
659 waitForFrames("reparentWindow.top(parent, "+reparentRecreate+"), "+reparentAction, 10, glWindow1, glWindow2, 2000, true);
660
661 Assert.assertNull(glWindow2.getParent());
662 Assert.assertSame(screen1,glWindow2.getScreen());
663 Assert.assertSame(display1,glWindow2.getScreen().getDisplay());
664 Assert.assertEquals(1,Display.getActiveDisplayNumber());
665 break;
666
667 case 3:
668 // top-level glWindow2 hide
669 Assert.assertEquals(true, glWindow1.isVisible());
670 Assert.assertEquals(true, glWindow2.isVisible());
671 glWindow2.setVisible(false);
672 Assert.assertEquals(false, glWindow2.isVisible());
673 Assert.assertEquals(true, glWindow1.isVisible());
674 break;
675
676 case 4:
677 // top-level glWindow2 show
678 Assert.assertEquals(true, glWindow1.isVisible());
679 Assert.assertEquals(false, glWindow2.isVisible());
680 glWindow2.setVisible(true);
681 Assert.assertEquals(true, glWindow2.isVisible());
682 Assert.assertEquals(true, glWindow1.isVisible());
683 break;
684
685 case 5:
686 // glWindow2 -- child --> glWindow1: compatible
687 Assert.assertEquals(true, glWindow2.isVisible());
688 reparentAction = glWindow2.reparentWindow(glWindow1, -1, -1, reparentHints);
689 Assert.assertTrue(Window.ReparentOperation.ACTION_INVALID != reparentAction);
690 Assert.assertEquals(true, glWindow2.isVisible());
691 Assert.assertEquals(true, glWindow2.isNativeValid());
692 waitForFrames("reparentWindow.child(parent, "+reparentRecreate+"), "+reparentAction, 11, glWindow1, glWindow2, 2000, true);
693
694 Assert.assertSame(glWindow1,glWindow2.getParent());
695 Assert.assertSame(screen1,glWindow2.getScreen());
696 Assert.assertSame(display1,glWindow2.getScreen().getDisplay());
697 Assert.assertEquals(1,Display.getActiveDisplayNumber());
698 break;
699 }
700 state++;
701 }
702 //
703 // glwindow2 is child of glwindow1
704 //
705
706 animator1.stop();
707 Assert.assertEquals(false, animator1.isAnimating());
708 Assert.assertEquals(false, animator1.isPaused());
709 Assert.assertEquals(null, animator1.getThread());
710 animator2.stop();
711 Assert.assertEquals(false, animator2.isAnimating());
712 Assert.assertEquals(false, animator2.isPaused());
713 Assert.assertEquals(null, animator2.getThread());
714
715 Assert.assertEquals(1,display1.getReferenceCount());
716 Assert.assertEquals(true,display1.isNativeValid());
717 Assert.assertNotNull(display1.getEDTUtil());
718 Assert.assertEquals(true,display1.getEDTUtil().isRunning());
719 Assert.assertEquals(2,screen1.getReferenceCount());
720 Assert.assertEquals(true,screen1.isNativeValid());
721 Assert.assertSame(glWindow1,glWindow2.getParent());
722 Assert.assertSame(screen1,glWindow2.getScreen());
723
724 Assert.assertEquals(1,Display.getActiveDisplayNumber());
725
726 glWindow1.destroy(); // should destroy both windows, actually, since glWindow2 is a child
727 Assert.assertEquals(false, glWindow1.isNativeValid());
728 Assert.assertEquals(false, glWindow1.isVisible());
729 Assert.assertEquals(false, glWindow2.isNativeValid());
730 Assert.assertEquals(false, glWindow2.isVisible());
731
732 Assert.assertEquals(0,display1.getReferenceCount());
733 Assert.assertEquals(false,display1.isNativeValid());
734 Assert.assertNotNull(display1.getEDTUtil());
735 Assert.assertEquals(false,display1.getEDTUtil().isRunning());
736 Assert.assertEquals(0,screen1.getReferenceCount());
737 Assert.assertEquals(false,screen1.isNativeValid());
738
739 Assert.assertEquals(0,display2.getReferenceCount());
740 Assert.assertEquals(false,display2.isNativeValid());
741 Assert.assertNotNull(display2.getEDTUtil());
742 Assert.assertEquals(false,display2.getEDTUtil().isRunning());
743 Assert.assertEquals(0,screen2.getReferenceCount());
744 Assert.assertEquals(false,screen2.isNativeValid());
745
746 Assert.assertEquals(0,Display.getActiveDisplayNumber());
747
748 glWindow2.destroy(); // dbl destroy check ..
749 Assert.assertEquals(false, glWindow1.isNativeValid());
750 Assert.assertEquals(false, glWindow2.isNativeValid());
751
752 glWindow1.destroy(); // parent -> child
753 Assert.assertEquals(false, glWindow1.isNativeValid());
754 Assert.assertEquals(false, glWindow2.isNativeValid());
755
756 Assert.assertEquals(0,Display.getActiveDisplayNumber());
757 }
758
759 public static void setDemoFields(final GLEventListener demo, final GLWindow glWindow, final boolean debug) {
760 Assert.assertNotNull(demo);
761 Assert.assertNotNull(glWindow);
762 if(debug) {
763 MiscUtils.setFieldIfExists(demo, "glDebug", true);
764 MiscUtils.setFieldIfExists(demo, "glTrace", true);
765 }
766 if(!MiscUtils.setFieldIfExists(demo, "window", glWindow.getDelegatedWindow())) {
767 MiscUtils.setFieldIfExists(demo, "glWindow", glWindow);
768 }
769 }
770
771 static int atoi(final String a) {
772 int i=0;
773 try {
774 i = Integer.parseInt(a);
775 } catch (final Exception ex) { ex.printStackTrace(); }
776 return i;
777 }
778
779 public static void main(final String args[]) throws IOException {
780 boolean asMain = false;
781 for(int i=0; i<args.length; i++) {
782 if(args[i].equals("-time")) {
783 durationPerTest = atoi(args[++i]);
784 } else if(args[i].equals("-loopvt")) {
785 loopVisibleToggle = atoi(args[++i]);
786 } else if(args[i].equals("-manual")) {
787 manual = true;
788 } else if(args[i].equals("-asMain")) {
789 asMain = true;
790 }
791 }
792 System.err.println("durationPerTest: "+durationPerTest);
793 if( asMain ) {
794 try {
799 } catch (final Throwable t ) {
800 t.printStackTrace();
801 }
802 } else {
803 final String tstname = TestParenting01NEWT.class.getName();
804 org.junit.runner.JUnitCore.main(tstname);
805 }
806 }
807
808}
809
static int getActiveDisplayNumber()
Definition: Display.java:452
A screen may span multiple MonitorDevices representing their combined virtual size.
Definition: Screen.java:58
abstract Display getDisplay()
abstract int getReferenceCount()
abstract boolean isNativeValid()
An implementation of GLAutoDrawable and Window interface, using a delegated Window instance,...
Definition: GLWindow.java:121
final NativeWindow getParent()
Definition: GLWindow.java:282
final ReparentOperation reparentWindow(final NativeWindow newParent, final int x, final int y, final int hints)
Change this window's parent window.
Definition: GLWindow.java:582
final void setTitle(final String title)
Definition: GLWindow.java:297
final void setSize(final int width, final int height)
Sets the size of the window's client area in window units, excluding decorations.
Definition: GLWindow.java:625
final void setVisible(final boolean visible)
Calls setVisible(true, visible), i.e.
Definition: GLWindow.java:615
final void destroy()
Destroys all resources associated with this GLAutoDrawable, inclusive the GLContext.
Definition: GLWindow.java:605
final Window getDelegatedWindow()
If the implementation uses delegation, return the delegated Window instance, otherwise return this in...
Definition: GLWindow.java:277
static GLWindow create(final GLCapabilitiesImmutable caps)
Creates a new GLWindow attaching a new Window referencing a new default Screen and default Display wi...
Definition: GLWindow.java:169
Specifies a set of OpenGL capabilities.
static void setDemoFields(final GLEventListener demo, final GLWindow glWindow, final boolean debug)
static boolean setFieldIfExists(final Object instance, final String fieldName, final Object value)
Definition: MiscUtils.java:193
final synchronized Thread getThread()
final void setUpdateFPSFrames(final int frames, final PrintStream out)
final synchronized boolean pause()
Pauses this animator.
Definition: Animator.java:382
final synchronized boolean resume()
Resumes animation if paused.
Definition: Animator.java:397
final synchronized boolean start()
Starts this animator, if not running.
Definition: Animator.java:344
final synchronized boolean isPaused()
Indicates whether this animator is started and either manually paused or paused automatically due to ...
Definition: Animator.java:326
final synchronized boolean stop()
Stops this animator.
Definition: Animator.java:368
Reparenting operation types.
Definition: Window.java:894
ACTION_INVALID
No native reparenting valid.
Definition: Window.java:896
Specifying NEWT's Window functionality:
Definition: Window.java:115
void resetFPSCounter()
Reset all performance counter (startTime, currentTime, frame number)
void addGLEventListener(GLEventListener listener)
Adds the given listener to the end of this drawable queue.
Declares events which client code can use to manage OpenGL rendering into a GLAutoDrawable.