@@ -596,6 +596,89 @@ void cvSetPropTopmost_W32(const char* name, const bool topmost)
596
596
}
597
597
}
598
598
599
+ double cvGetPropVsync_W32 (const char * name)
600
+ {
601
+ #ifndef HAVE_OPENGL
602
+ CV_UNUSED (name);
603
+ CV_Error (Error::OpenGlNotSupported, " Library was built without OpenGL support" );
604
+ #else
605
+ if (!name)
606
+ CV_Error (Error::StsNullPtr, " 'name' argument must not be NULL" );
607
+
608
+ CvWindow* window = icvFindWindowByName (name);
609
+ if (!window)
610
+ CV_Error_ (Error::StsBadArg, (" there is no window named '%s'" , name));
611
+
612
+ // https://www.khronos.org/opengl/wiki/Swap_Interval
613
+ // https://www.khronos.org/registry/OpenGL/extensions/EXT/WGL_EXT_extensions_string.txt
614
+ // https://www.khronos.org/registry/OpenGL/extensions/EXT/WGL_EXT_swap_control.txt
615
+
616
+ if (!wglMakeCurrent (window->dc , window->hGLRC ))
617
+ CV_Error (Error::OpenGlApiCallError, " Can't Activate The GL Rendering Context" );
618
+
619
+ typedef const char * (APIENTRY* PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void );
620
+ PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsString = NULL ;
621
+ wglGetExtensionsString = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress (" wglGetExtensionsStringEXT" );
622
+ if (wglGetExtensionsString == NULL )
623
+ return -1 ; // wglGetProcAddress failed to get wglGetExtensionsStringEXT
624
+
625
+ const char * wgl_extensions = wglGetExtensionsString ();
626
+ if (wgl_extensions == NULL )
627
+ return -1 ; // Can't get WGL extensions string
628
+
629
+ if (strstr (wgl_extensions, " WGL_EXT_swap_control" ) == NULL )
630
+ return -1 ; // WGL extensions don't contain WGL_EXT_swap_control
631
+
632
+ typedef int (APIENTRY* PFNWGLGETSWAPINTERVALPROC)(void );
633
+ PFNWGLGETSWAPINTERVALPROC wglGetSwapInterval = 0 ;
634
+ wglGetSwapInterval = (PFNWGLGETSWAPINTERVALPROC)wglGetProcAddress (" wglGetSwapIntervalEXT" );
635
+ if (wglGetSwapInterval == NULL )
636
+ return -1 ; // wglGetProcAddress failed to get wglGetSwapIntervalEXT
637
+
638
+ return wglGetSwapInterval ();
639
+ #endif
640
+ }
641
+
642
+ void cvSetPropVsync_W32 (const char * name, const bool enable_vsync)
643
+ {
644
+ #ifndef HAVE_OPENGL
645
+ CV_UNUSED (name);
646
+ CV_UNUSED (enable_vsync);
647
+ CV_Error (Error::OpenGlNotSupported, " Library was built without OpenGL support" );
648
+ #else
649
+ if (!name)
650
+ CV_Error (Error::StsNullPtr, " 'name' argument must not be NULL" );
651
+
652
+ CvWindow* window = icvFindWindowByName (name);
653
+ if (!window)
654
+ CV_Error_ (Error::StsBadArg, (" there is no window named '%s'" , name));
655
+
656
+ if (!wglMakeCurrent (window->dc , window->hGLRC ))
657
+ CV_Error (Error::OpenGlApiCallError, " Can't Activate The GL Rendering Context" );
658
+
659
+ typedef const char * (APIENTRY* PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void );
660
+ PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsString = NULL ;
661
+ wglGetExtensionsString = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress (" wglGetExtensionsStringEXT" );
662
+ if (wglGetExtensionsString == NULL )
663
+ CV_Error (Error::OpenGlApiCallError, " wglGetProcAddress failed to get wglGetExtensionsStringEXT" );
664
+
665
+ const char * wgl_extensions = wglGetExtensionsString ();
666
+ if (wgl_extensions == NULL )
667
+ CV_Error (Error::OpenGlApiCallError, " Can't get WGL extensions string" );
668
+
669
+ if (strstr (wgl_extensions, " WGL_EXT_swap_control" ) == NULL )
670
+ CV_Error (Error::OpenGlApiCallError, " WGL extensions don't contain WGL_EXT_swap_control" );
671
+
672
+ typedef BOOL (APIENTRY* PFNWGLSWAPINTERVALPROC)(int );
673
+ PFNWGLSWAPINTERVALPROC wglSwapInterval = 0 ;
674
+ wglSwapInterval = (PFNWGLSWAPINTERVALPROC)wglGetProcAddress (" wglSwapIntervalEXT" );
675
+ if (wglSwapInterval == NULL )
676
+ CV_Error (Error::OpenGlApiCallError, " wglGetProcAddress failed to get wglSwapIntervalEXT" );
677
+
678
+ wglSwapInterval (enable_vsync);
679
+ #endif
680
+ }
681
+
599
682
void cv::setWindowTitle (const String& winname, const String& title)
600
683
{
601
684
CvWindow* window = icvFindWindowByName (winname.c_str ());
0 commit comments