CV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos ) { CV_FUNCNAME( "cvSetTrackbarPos" ); __BEGIN__; CvWindow* window; CvTrackbar* trackbar = 0; if( trackbar_name == 0 || window_name == 0 ) CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" ); window = icvFindWindowByName( window_name ); if( window ) trackbar = icvFindTrackbarByName( window, trackbar_name ); if( trackbar ) { if( pos < 0 ) pos = 0; if( pos > trackbar->maxval ) pos = trackbar->maxval; } CV_LOCK_MUTEX(); gtk_range_set_value( GTK_RANGE(trackbar->widget), pos ); CV_UNLOCK_MUTEX(); __END__; }
CV_IMPL void cvResizeWindow(const char* name, int width, int height ) { CV_FUNCNAME( "cvResizeWindow" ); __BEGIN__; CvWindow* window; CvImageWidget * image_widget; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; image_widget = CV_IMAGE_WIDGET( window->widget ); if(image_widget->flags & CV_WINDOW_AUTOSIZE) EXIT; CV_LOCK_MUTEX(); gtk_window_set_resizable( GTK_WINDOW(window->frame), 1 ); gtk_window_resize( GTK_WINDOW(window->frame), width, height ); // disable initial resize since presumably user wants to keep // this window size image_widget->flags &= ~CV_WINDOW_NO_IMAGE; CV_UNLOCK_MUTEX(); __END__; }
CV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name ) { int pos = -1; CV_FUNCNAME( "cvGetTrackbarPos" ); __BEGIN__; CvWindow* window; CvTrackbar* trackbar = 0; if( trackbar_name == 0 || window_name == 0 ) CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" ); window = icvFindWindowByName( window_name ); if( window ) trackbar = icvFindTrackbarByName( window, trackbar_name ); if( trackbar ) pos = trackbar->pos; __END__; return pos; }
CV_IMPL void cvDestroyWindow( const char* name ) { CV_FUNCNAME( "cvDestroyWindow" ); __BEGIN__; CvWindow* window; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if( !window ) EXIT; // note that it is possible for the update thread to run this function // if there is a call to cvShowImage in a mouse callback // (this would produce a deadlock on window_mutex) CV_LOCK_MUTEX(); icvDeleteWindow( window ); CV_UNLOCK_MUTEX(); __END__; }
CV_IMPL void cvShowImage( const char* name, const CvArr* arr ) { CV_FUNCNAME( "cvShowImage" ); __BEGIN__; CvWindow* window; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); CV_LOCK_MUTEX(); window = icvFindWindowByName(name); if(!window) { cvNamedWindow(name, 1); window = icvFindWindowByName(name); } if( window && arr ) { #ifdef HAVE_OPENGL if (window->useGl) { CvMat stub; CvMat* mat = cvGetMat(arr, &stub); cv::Mat im(mat); cv::imshow(name, im); return; } #endif CvImageWidget * image_widget = CV_IMAGE_WIDGET( window->widget ); cvImageWidgetSetImage( image_widget, arr ); } CV_UNLOCK_MUTEX(); __END__; }
void cvSetModeWindow_CARBON( const char* name, double prop_value)//Yannick Verdie { OSStatus err = noErr; CV_FUNCNAME( "cvSetModeWindow_QT" ); __BEGIN__; CvWindow* window; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if( !window ) CV_ERROR( CV_StsNullPtr, "NULL window" ); if(window->flags & CV_WINDOW_AUTOSIZE)//if the flag CV_WINDOW_AUTOSIZE is set EXIT; if (window->status==CV_WINDOW_FULLSCREEN && prop_value==CV_WINDOW_NORMAL) { err = EndFullScreen(window->restoreState,0); if (err != noErr) fprintf(stdout,"Error EndFullScreen\n"); window->window = window->oldwindow; ShowWindow( window->window ); window->status=CV_WINDOW_NORMAL; EXIT; } if (window->status==CV_WINDOW_NORMAL && prop_value==CV_WINDOW_FULLSCREEN) { GDHandle device; err = GetWindowGreatestAreaDevice(window->window, kWindowTitleBarRgn, &device, NULL); if (err != noErr) fprintf(stdout,"Error GetWindowGreatestAreaDevice\n"); HideWindow(window->window); window->oldwindow = window->window; err = BeginFullScreen(&(window->restoreState), device, 0, 0, &window->window, 0, fullScreenAllowEvents | fullScreenDontSwitchMonitorResolution); if (err != noErr) fprintf(stdout,"Error BeginFullScreen\n"); window->status=CV_WINDOW_FULLSCREEN; EXIT; } __END__; }
CV_IMPL void cvSetMouseCallback( const char* name, CvMouseCallback function, void* info) { CvWindow* window = icvFindWindowByName( name ); if (window != NULL) { window->on_mouse = function; window->on_mouse_param = info; } else { fprintf(stdout,"Error with cvSetMouseCallback. Window not found : %s\n",name); } }
CV_IMPL void cvSetMouseCallback( const char* name, CvMouseCallback function, void* info) { CvWindow* window = icvFindWindowByName( name ); if (window != NULL) { window->on_mouse = function; window->on_mouse_param = info; } else { fprintf(stdout,"Une erreur lors de cvSetMouseCallback, window nom trouvee : %s",name); } }
CV_IMPL void cvShowImage( const char* name, const CvArr* arr) { CV_FUNCNAME( "cvShowImage" ); __BEGIN__; CvWindow* window; int origin = 0; int resize = 0; CvMat stub, *image; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if( !window || !arr ) EXIT; // keep silence here. if( CV_IS_IMAGE_HDR( arr )) origin = ((IplImage*)arr)->origin; CV_CALL( image = cvGetMat( arr, &stub )); /* if( !window->image ) cvResizeWindow( name, image->cols, image->rows ); */ if( window->image && !CV_ARE_SIZES_EQ(window->image, image) ) { if ( ! (window->flags & CV_WINDOW_AUTOSIZE) )//FD resize = 1; cvReleaseMat( &window->image ); } if( !window->image ) { resize = 1;//FD window->image = cvCreateMat( image->rows, image->cols, CV_8UC3 ); } cvConvertImage( image, window->image, (origin != 0 ? CV_CVTIMG_FLIP : 0) + CV_CVTIMG_SWAP_RB ); icvPutImage( window ); if ( resize )//FD icvUpdateWindowSize( window ); __END__; }
CV_IMPL void cvDestroyWindow( const char* name ) { CV_FUNCNAME( "cvDestroyWindow" ); __BEGIN__; CvWindow* window; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName(name); if( !window ) EXIT; __END__; }
CV_IMPL void* cvGetWindowHandle( const char* name ) { WindowRef result = 0; __BEGIN__; CvWindow* window; window = icvFindWindowByName( name ); if (window != NULL) result = window->window; else result = NULL; __END__; return result; }
CV_IMPL void cvResizeWindow(const char* name, int width, int height ) { CV_FUNCNAME( "cvResizeWindow" ); __BEGIN__; CvWindow* window; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; // TODO: implement appropriate logic here __END__; }
CV_IMPL void cvUpdateWindow(const char* name) { CV_FUNCNAME( "cvUpdateWindow" ); __BEGIN__; CvWindow* window; if (!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if (!window) EXIT; // window does not refresh without this gtk_widget_queue_draw( GTK_WIDGET(window->widget) ); __END__; }
CV_IMPL void cvMoveWindow( const char* name, int x, int y) { CV_FUNCNAME( "cvMoveWindow" ); __BEGIN__; CvWindow* window; //CvTrackbar* trackbar; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; MoveWindow(window->window, x, y, true); __END__; }
CV_IMPL void cvResizeWindow( const char* name, int width, int height) { CV_FUNCNAME( "cvResizeWindow" ); __BEGIN__; CvWindow* window; //CvTrackbar* trackbar; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; SizeWindow(window->window, width, height, true); __END__; }
CV_IMPL void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param ) { CV_FUNCNAME( "cvSetMouseCallback" ); __BEGIN__; CvWindow* window = 0; if( !window_name ) CV_ERROR( CV_StsNullPtr, "NULL window name" ); window = icvFindWindowByName(window_name); if( !window ) EXIT; // TODO: implement appropriate logic here __END__; }
void cvChangeMode_GTK( const char* name, double prop_value)//Yannick Verdie { CV_FUNCNAME( "cvChangeMode_GTK" ); __BEGIN__; CvWindow* window; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if( !window ) CV_ERROR( CV_StsNullPtr, "NULL window" ); if(window->flags & CV_WINDOW_AUTOSIZE)//if the flag CV_WINDOW_AUTOSIZE is set EXIT; //so easy to do fullscreen here, Linux rocks ! if (window->status==CV_WINDOW_FULLSCREEN && prop_value==CV_WINDOW_NORMAL) { CV_LOCK_MUTEX(); gtk_window_unfullscreen(GTK_WINDOW(window->frame)); window->status=CV_WINDOW_NORMAL; CV_UNLOCK_MUTEX(); EXIT; } if (window->status==CV_WINDOW_NORMAL && prop_value==CV_WINDOW_FULLSCREEN) { CV_LOCK_MUTEX(); gtk_window_fullscreen(GTK_WINDOW(window->frame)); window->status=CV_WINDOW_FULLSCREEN; CV_UNLOCK_MUTEX(); EXIT; } __END__; }
CV_IMPL void cvMoveWindow( const char* name, int x, int y ) { CV_FUNCNAME( "cvMoveWindow" ); __BEGIN__; CvWindow* window; RECT rect; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; GetWindowRect( window->frame, &rect ); MoveWindow( window->frame, x, y, rect.right - rect.left, rect.bottom - rect.top, TRUE); __END__; }
CV_IMPL void* cvGetWindowHandle( const char* window_name ) { void* hwnd = 0; CV_FUNCNAME( "cvGetWindowHandle" ); __BEGIN__; CvWindow* window; if( window_name == 0 ) CV_ERROR( CV_StsNullPtr, "NULL window name" ); window = icvFindWindowByName( window_name ); if( window ) hwnd = (void*)window->hwnd; __END__; return hwnd; }
CV_IMPL void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param ) { CV_FUNCNAME( "cvSetMouseCallback" ); __BEGIN__; CvWindow* window = 0; if( !window_name ) CV_ERROR( CV_StsNullPtr, "NULL window name" ); window = icvFindWindowByName(window_name); if( !window ) EXIT; window->on_mouse = on_mouse; window->on_mouse_param = param; __END__; }
double cvGetModeWindow_W32(const char* name)//YV { double result = -1; CV_FUNCNAME( "cvGetModeWindow_W32" ); __BEGIN__; CvWindow* window; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if( !window ) CV_ERROR( CV_StsNullPtr, "NULL window" ); result = window->status; __END__; return result; }
CV_IMPL void cvResizeWindow(const char* name, int width, int height ) { CV_FUNCNAME( "cvResizeWindow" ); __BEGIN__; int i; CvWindow* window; RECT rmw, rw, rect; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; // Repeat two times because after the first resizing of the mainhWnd window // toolbar may resize too for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++) { rw = icvCalcWindowRect(window); MoveWindow(window->hwnd, rw.left, rw.top, rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE); GetClientRect(window->hwnd, &rw); GetWindowRect(window->frame, &rmw); // Resize the mainhWnd window in order to make the bitmap fit into the child window MoveWindow(window->frame, rmw.left, rmw.top, rmw.right - rmw.left + width - rw.right + rw.left, rmw.bottom - rmw.top + height - rw.bottom + rw.top, TRUE); } rect = icvCalcWindowRect(window); MoveWindow(window->hwnd, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); __END__; }
double cvGetRatioWindow_GTK(const char* name) { double result = -1; CV_FUNCNAME( "cvGetRatioWindow_GTK" ); __BEGIN__; CvWindow* window; if (!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if (!window) EXIT; // keep silence here result = static_cast<double>(window->widget->allocation.width) / window->widget->allocation.height; __END__; return result; }
CV_IMPL void cvMoveWindow( const char* name, int x, int y ) { CV_FUNCNAME( "cvMoveWindow" ); __BEGIN__; CvWindow* window; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) EXIT; CV_LOCK_MUTEX(); gtk_window_move( GTK_WINDOW(window->frame), x, y ); CV_UNLOCK_MUTEX(); __END__; }
CV_IMPL void cvSetOpenGlDrawCallback(const char* name, CvOpenGlDrawCallback callback, void* userdata) { CvWindow* window; CV_FUNCNAME( "cvCreateOpenGLCallback" ); __BEGIN__; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if( !window ) EXIT; if (!window->useGl) CV_ERROR( CV_OpenGlNotSupported, "Window was created without OpenGL context" ); window->glDrawCallback = callback; window->glDrawData = userdata; __END__; }
double cvGetPropWindowAutoSize_GTK(const char* name) { double result = -1; CV_FUNCNAME( "cvGetPropWindowAutoSize_GTK" ); __BEGIN__; CvWindow* window; if (!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if (!window) EXIT; // keep silence here result = window->flags & CV_WINDOW_AUTOSIZE; __END__; return result; }
CV_IMPL void cvDestroyWindow( const char* name ) { CV_FUNCNAME( "cvDestroyWindow" ); __BEGIN__; CvWindow* window; HWND mainhWnd; if(!name) CV_ERROR( CV_StsNullPtr, "NULL name string" ); window = icvFindWindowByName( name ); if( !window ) EXIT; mainhWnd = window->frame; SendMessage(window->hwnd, WM_CLOSE, 0, 0); SendMessage( mainhWnd, WM_CLOSE, 0, 0); // Do NOT call _remove_window -- CvWindow list will be updated automatically ... __END__; }
CV_IMPL void cvShowImage( const char* name, const CvArr* arr ) { CV_FUNCNAME( "cvShowImage" ); __BEGIN__; CvWindow* window; if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); CV_LOCK_MUTEX(); window = icvFindWindowByName(name); if( window && arr ){ CvImageWidget * image_widget = CV_IMAGE_WIDGET( window->widget ); cvImageWidgetSetImage( image_widget, arr ); } CV_UNLOCK_MUTEX(); __END__; }
CV_IMPL void cvShowImage( const char* name, const CvArr* arr ) { CV_FUNCNAME( "cvShowImage" ); __BEGIN__; CvWindow* window; SIZE size = { 0, 0 }; int channels = 0; void* dst_ptr = 0; const int channels0 = 3; int origin = 0; CvMat stub, dst, *image; bool changed_size = false; // philipg if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name" ); window = icvFindWindowByName(name); if(!window) { cvNamedWindow(name, 1); window = icvFindWindowByName(name); } if( !window || !arr ) EXIT; // keep silence here. if( CV_IS_IMAGE_HDR( arr )) origin = ((IplImage*)arr)->origin; CV_CALL( image = cvGetMat( arr, &stub )); if (window->image) // if there is something wrong with these system calls, we cannot display image... if (icvGetBitmapData( window, &size, &channels, &dst_ptr )) return; if( size.cx != image->width || size.cy != image->height || channels != channels0 ) { changed_size = true; uchar buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)]; BITMAPINFO* binfo = (BITMAPINFO*)buffer; DeleteObject( SelectObject( window->dc, window->image )); window->image = 0; size.cx = image->width; size.cy = image->height; channels = channels0; FillBitmapInfo( binfo, size.cx, size.cy, channels*8, 1 ); window->image = SelectObject( window->dc, CreateDIBSection(window->dc, binfo, DIB_RGB_COLORS, &dst_ptr, 0, 0)); } cvInitMatHeader( &dst, size.cy, size.cx, CV_8UC3, dst_ptr, (size.cx * channels + 3) & -4 ); cvConvertImage( image, &dst, origin == 0 ? CV_CVTIMG_FLIP : 0 ); // ony resize window if needed if (changed_size) icvUpdateWindowPos(window); InvalidateRect(window->hwnd, 0, 0); // philipg: this is not needed and just slows things down // UpdateWindow(window->hwnd); __END__; }
CV_IMPL int cvNamedWindow( const char* name, int flags ) { int result = 0; CV_FUNCNAME( "cvNamedWindow" ); __BEGIN__; HWND hWnd, mainhWnd; CvWindow* window; DWORD defStyle = WS_VISIBLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU; int len; CvRect rect; cvInitSystem(0,0); if( !name ) CV_ERROR( CV_StsNullPtr, "NULL name string" ); // Check the name in the storage if( icvFindWindowByName( name ) != 0 ) { result = 1; EXIT; } if( !(flags & CV_WINDOW_AUTOSIZE))//YV add border in order to resize the window defStyle |= WS_SIZEBOX; icvLoadWindowPos( name, rect ); mainhWnd = CreateWindow( "Main HighGUI class", name, defStyle | WS_OVERLAPPED, rect.x, rect.y, rect.width, rect.height, 0, 0, hg_hinstance, 0 ); if( !mainhWnd ) CV_ERROR( CV_StsError, "Frame window can not be created" ); ShowWindow(mainhWnd, SW_SHOW); //YV- remove one border by changing the style hWnd = CreateWindow("HighGUI class", "", (defStyle & ~WS_SIZEBOX) | WS_CHILD, CW_USEDEFAULT, 0, rect.width, rect.height, mainhWnd, 0, hg_hinstance, 0); if( !hWnd ) CV_ERROR( CV_StsError, "Frame window can not be created" ); ShowWindow(hWnd, SW_SHOW); len = (int)strlen(name); CV_CALL( window = (CvWindow*)cvAlloc(sizeof(CvWindow) + len + 1)); window->signature = CV_WINDOW_MAGIC_VAL; window->hwnd = hWnd; window->frame = mainhWnd; window->name = (char*)(window + 1); memcpy( window->name, name, len + 1 ); window->flags = flags; window->image = 0; window->dc = CreateCompatibleDC(0); window->last_key = 0; window->status = CV_WINDOW_NORMAL;//YV window->on_mouse = 0; window->on_mouse_param = 0; memset( &window->toolbar, 0, sizeof(window->toolbar)); window->next = hg_windows; window->prev = 0; if( hg_windows ) hg_windows->prev = window; hg_windows = window; icvSetWindowLongPtr( hWnd, CV_USERDATA, window ); icvSetWindowLongPtr( mainhWnd, CV_USERDATA, window ); // Recalculate window position icvUpdateWindowPos( window ); result = 1; __END__; return result; }