static int init_test_window(/*out*/window_t * win, /*out*/EGLContext * eglcontext, display_t * disp, window_evh_t * evhandler) { gconfig_t gconf = gconfig_FREE; int32_t surfattr[] = { gconfig_BITS_BUFFER, 32, gconfig_BITS_ALPHA, 1, gconfig_TYPE, gconfig_value_TYPE_WINDOW_BIT, gconfig_NONE }; windowconfig_t winattr[] = { windowconfig_INIT_POS(WINPOS_INIT_X, WINPOS_INIT_Y), windowconfig_INIT_SIZE(100, 100), windowconfig_INIT_FRAME, windowconfig_INIT_NONE }; TEST(0 == init_gconfig(&gconf, disp, surfattr)); TEST(0 == init_window(win, disp, defaultscreennr_display(disp), evhandler, &gconf, winattr)); *eglcontext = eglCreateContext(gl_display(disp), gl_gconfig(&gconf), EGL_NO_CONTEXT, (EGLint[]){EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}); TEST(EGL_NO_CONTEXT != *eglcontext); TEST(EGL_TRUE == eglMakeCurrent(gl_display(disp), (void*)gl_window(win), (void*)gl_window(win), *eglcontext)); return 0; ONERR: (void) free_gconfig(&gconf); return EINVAL; }
int main() { GlWindow gl_window("depthgl", 320, 240); Camera camera; camera.frame_received.connect( [&](cv::Mat image){ gl_window.update_image(image); }); std::thread gl_window_thread(&GlWindow::run, &gl_window); std::thread camera_thread(&Camera::run, &camera); gl_window_thread.join(); camera_thread.join(); return 0; }
int free_window(window_t * win) { int err; int err2; if (0 != display_window(win)) { err = FREE_GLWINDOW(&gl_window(win), display_window(win)); (void) PROCESS_testerrortimer(&s_window_errtimer, &err); err2 = FREE_OSWINDOW(os_window(win)); (void) PROCESS_testerrortimer(&s_window_errtimer, &err2); if (err2) err = err2; if (err) goto ONERR; } return 0; ONERR: TRACEEXITFREE_ERRLOG(err); return err; }
int init_window( /*out*/window_t * win, display_t * disp, uint32_t screennr, const struct window_evh_t * eventhandler, gconfig_t * gconf, struct windowconfig_t * winattr) { int err; int isinit = 0; int32_t visualid; static_assert(win == (void*)&win->oswindow, "window_t is subtype of oswindow type"); if (! PROCESS_testerrortimer(&s_window_errtimer, &err)) { err = visualid_gconfig(gconf, disp, &visualid); } if (err) goto ONERR; err = INIT_OSWINDOW(os_window(win), disp, screennr, eventhandler, visualid, winattr); if (err) goto ONERR; ++ isinit; if (! PROCESS_testerrortimer(&s_window_errtimer, &err)) { err = INIT_GLWINDOW(&gl_window(win), disp, gconf, os_window(win)); } if (err) goto ONERR; return 0; ONERR: if (isinit) { FREE_OSWINDOW(&win->oswindow); } return err; }
static int test_initfree(display_t * disp) { window_t win = window_FREE; gconfig_t gconf = gconfig_FREE; int32_t surfattr[4][7] = { { gconfig_TYPE, gconfig_value_TYPE_WINDOW_BIT, gconfig_BITS_RED, 8, gconfig_NONE }, { gconfig_TYPE, gconfig_value_TYPE_WINDOW_BIT, gconfig_BITS_ALPHA, 1, gconfig_BITS_STENCIL, 1, gconfig_NONE }, { gconfig_TYPE, gconfig_value_TYPE_WINDOW_BIT, gconfig_BITS_BUFFER, 24, gconfig_BITS_DEPTH, 1, gconfig_NONE }, { gconfig_TYPE, gconfig_value_TYPE_WINDOW_BIT, gconfig_CONFORMANT, gconfig_value_CONFORMANT_ES2_BIT|gconfig_value_CONFORMANT_OPENGL_BIT, gconfig_NONE }, }; windowconfig_t winattr[] = { windowconfig_INIT_FRAME, windowconfig_INIT_TRANSPARENCY(255), windowconfig_INIT_TITLE("name"), windowconfig_INIT_MINSIZE(10,10), windowconfig_INIT_MAXSIZE(1000,1000), windowconfig_INIT_SIZE(1000,1000), windowconfig_INIT_POS(333,444), windowconfig_INIT_NONE }; // TEST window_FREE TEST(1 == isfree_helper(&win)); TEST(1 == ISFREE_OSWINDOW(&win.oswindow)); for (unsigned i = 0; i < lengthof(surfattr); ++i) { TEST(0 == init_gconfig(&gconf, disp, surfattr[i])); // TEST init_window TEST(0 == init_window(&win, disp, defaultscreennr_display(disp), 0, &gconf, winattr)); TEST(0 != gl_window(&win)); // TEST free_window TEST(0 == free_window(&win)); TEST(1 == isfree_helper(&win)); TEST(1 == ISFREE_OSWINDOW(&win.oswindow)); TEST(0 == free_window(&win)); TEST(1 == isfree_helper(&win)); TEST(1 == ISFREE_OSWINDOW(&win.oswindow)); TEST(0 == free_gconfig(&gconf)); } // prepare TEST(0 == init_gconfig(&gconf, disp, surfattr[0])); // TEST init_window: E2BIG windowconfig_t winattr2big[3*windowconfig__NROF+2]; for (unsigned i = 0; i < lengthof(winattr2big)-1; ++i) { winattr2big[i] = (windowconfig_t)windowconfig_INIT_FRAME; } winattr2big[lengthof(winattr2big)-1] = (windowconfig_t) windowconfig_INIT_NONE; TEST(E2BIG == init_window(&win, disp, defaultscreennr_display(disp), 0, &gconf, winattr2big)); TEST(0 == free_window(&win)); TEST(1 == isfree_helper(&win)); // TEST init_window: ERROR for (unsigned i = 1; i <= 2; ++i) { init_testerrortimer(&s_window_errtimer, i, ENOMEM); TEST(ENOMEM == init_window(&win, disp, defaultscreennr_display(disp), 0, &gconf, winattr)); TEST(0 == free_window(&win)); TEST(1 == isfree_helper(&win)); } // TEST free_window: ERROR for (unsigned i = 1; i <= 2; ++i) { TEST(0 == init_window(&win, disp, defaultscreennr_display(disp), 0, &gconf, winattr)); init_testerrortimer(&s_window_errtimer, i, ENOMEM); TEST(ENOMEM == free_window(&win)); TEST(0 == free_window(&win)); TEST(1 == isfree_helper(&win)); } // unprepare TEST(0 == free_gconfig(&gconf)); return 0; ONERR: (void) free_gconfig(&gconf); (void) free_window(&win); return EINVAL; }
static int test_transparentalpha(display_t * disp) { int32_t surfattr[] = { gconfig_TRANSPARENT_ALPHA, 1, gconfig_BITS_BUFFER, 32, gconfig_NONE }; windowconfig_t winattr[] = { windowconfig_INIT_TITLE("test-graphic-window"), windowconfig_INIT_SIZE(100, 100), windowconfig_INIT_POS(50, 100), windowconfig_INIT_NONE }; window_t top = window_FREE; window_t bottom = window_FREE; gconfig_t gconf = gconfig_FREE; uint32_t snr = defaultscreennr_display(disp); EGLContext eglcontext = EGL_NO_CONTEXT; // prepare TEST(0 == init_gconfig(&gconf, disp, surfattr)); eglcontext = eglCreateContext(gl_display(disp), gl_gconfig(&gconf), EGL_NO_CONTEXT, 0); TEST(EGL_NO_CONTEXT != eglcontext); // TEST init_window: gconfig_TRANSPARENT_ALPHA: draw overlay on top of bottom TEST(0 == init_window(&top, disp, snr, 0, &gconf, winattr)); TEST(0 == init_window(&bottom, disp, snr, 0, &gconf, winattr)); // TEST swapbuffer_window: bottom window opaque color TEST(0 == show_x11window(os_window(&bottom))); WAITFOR(disp, os_window(&bottom)->state == x11window_state_SHOWN); TEST(EGL_TRUE == eglMakeCurrent(gl_display(disp), (void*)gl_window(&bottom), (void*)gl_window(&bottom), eglcontext)); glClearColor(1, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); TEST(0 == swapbuffer_window(&bottom, disp)); eglWaitGL(); // red color TEST(0 == compare_color(os_window(&bottom), 100, 100, 1, 0, 0)); // TEST swapbuffer_window: top window with transparent value TEST(0 == show_x11window(os_window(&top))); WAITFOR(disp, os_window(&top)->state == x11window_state_SHOWN); TEST(EGL_TRUE == eglMakeCurrent(gl_display(disp), (void*)gl_window(&top), (void*)gl_window(&top), eglcontext)); glClearColor(0, 0, 1, 0); // transparent blue glClear(GL_COLOR_BUFFER_BIT); TEST(0 == swapbuffer_window(&top, disp)); eglWaitGL(); // resulting color is the combination of red and blue TEST(0 == compare_color(os_window(&bottom), 100, 100, 1, 0, 1)); // unprepare TEST(EGL_TRUE == eglMakeCurrent(gl_display(disp), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); TEST(EGL_TRUE == eglDestroyContext(gl_display(disp), eglcontext)); TEST(0 == free_gconfig(&gconf)); TEST(0 == free_window(&bottom)); TEST(0 == free_window(&top)); WAITFOR(disp, false); eglReleaseThread(); return 0; ONERR: eglMakeCurrent(gl_display(disp), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (eglcontext != EGL_NO_CONTEXT) eglDestroyContext(gl_display(disp), eglcontext); (void) free_gconfig(&gconf); (void) free_window(&top); (void) free_window(&bottom); return EINVAL; }