Commit a8355170 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #9369 from alalek:cpp_refactor_gtk

parents 5c325466 9e239c7a
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
#include "precomp.hpp" #include "precomp.hpp"
#include "opencv2/imgproc.hpp" #include "opencv2/imgproc.hpp"
using namespace cv;
#ifndef _WIN32 #ifndef _WIN32
#if defined (HAVE_GTK) #if defined (HAVE_GTK)
...@@ -508,12 +510,30 @@ GType cvImageWidget_get_type (void){ ...@@ -508,12 +510,30 @@ GType cvImageWidget_get_type (void){
struct CvWindow; struct CvWindow;
typedef struct CvTrackbar struct CvUIBase {
{ CvUIBase(int signature_) : signature(signature_) { }
int signature; int signature;
};
struct CvTrackbar : CvUIBase
{
CvTrackbar(const char* trackbar_name) :
CvUIBase(CV_TRACKBAR_MAGIC_VAL),
widget(NULL), name(trackbar_name),
parent(NULL), data(NULL),
pos(0), maxval(0), minval(0),
notify(NULL), notify2(NULL), userdata(NULL)
{
// nothing
}
~CvTrackbar()
{
// destroyed by parent window
}
GtkWidget* widget; GtkWidget* widget;
char* name; std::string name;
CvTrackbar* next;
CvWindow* parent; CvWindow* parent;
int* data; int* data;
int pos; int pos;
...@@ -522,19 +542,28 @@ typedef struct CvTrackbar ...@@ -522,19 +542,28 @@ typedef struct CvTrackbar
CvTrackbarCallback notify; CvTrackbarCallback notify;
CvTrackbarCallback2 notify2; CvTrackbarCallback2 notify2;
void* userdata; void* userdata;
} };
CvTrackbar;
typedef struct CvWindow struct CvWindow : CvUIBase
{ {
int signature; CvWindow(const char* window_name) :
CvUIBase(CV_WINDOW_MAGIC_VAL),
widget(NULL), frame(NULL), paned(NULL), name(window_name),
last_key(0), flags(0), status(0),
on_mouse(NULL), on_mouse_param(NULL)
#ifdef HAVE_OPENGL
,useGl(false), glDrawCallback(NULL), glDrawData(NULL)
#endif
{
// nothing
}
~CvWindow();
GtkWidget* widget; GtkWidget* widget;
GtkWidget* frame; GtkWidget* frame;
GtkWidget* paned; GtkWidget* paned;
char* name; std::string name;
CvWindow* prev;
CvWindow* next;
int last_key; int last_key;
int flags; int flags;
...@@ -543,13 +572,7 @@ typedef struct CvWindow ...@@ -543,13 +572,7 @@ typedef struct CvWindow
CvMouseCallback on_mouse; CvMouseCallback on_mouse;
void* on_mouse_param; void* on_mouse_param;
struct std::vector< Ptr<CvTrackbar> > trackbars;
{
int pos;
int rows;
CvTrackbar* first;
}
toolbar;
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
bool useGl; bool useGl;
...@@ -557,8 +580,7 @@ typedef struct CvWindow ...@@ -557,8 +580,7 @@ typedef struct CvWindow
CvOpenGlDrawCallback glDrawCallback; CvOpenGlDrawCallback glDrawCallback;
void* glDrawData; void* glDrawData;
#endif #endif
} };
CvWindow;
static gboolean icvOnClose( GtkWidget* widget, GdkEvent* event, gpointer user_data ); static gboolean icvOnClose( GtkWidget* widget, GdkEvent* event, gpointer user_data );
...@@ -569,15 +591,14 @@ static gboolean icvOnMouse( GtkWidget *widget, GdkEvent *event, gpointer user_da ...@@ -569,15 +591,14 @@ static gboolean icvOnMouse( GtkWidget *widget, GdkEvent *event, gpointer user_da
#ifdef HAVE_GTHREAD #ifdef HAVE_GTHREAD
int thread_started=0; int thread_started=0;
static gpointer icvWindowThreadLoop(); static gpointer icvWindowThreadLoop();
GMutex* last_key_mutex; GMutex* last_key_mutex = NULL;
GCond* cond_have_key; GCond* cond_have_key = NULL;
GMutex* window_mutex; GMutex* window_mutex = NULL;
GThread* window_thread; GThread* window_thread = NULL;
GtkWidget* cvTopLevelWidget = 0;
#endif #endif
static int last_key = -1; static int last_key = -1;
static CvWindow* hg_windows = 0; static std::vector< Ptr<CvWindow> > g_windows;
CV_IMPL int cvInitSystem( int argc, char** argv ) CV_IMPL int cvInitSystem( int argc, char** argv )
{ {
...@@ -586,8 +607,6 @@ CV_IMPL int cvInitSystem( int argc, char** argv ) ...@@ -586,8 +607,6 @@ CV_IMPL int cvInitSystem( int argc, char** argv )
// check initialization status // check initialization status
if( !wasInitialized ) if( !wasInitialized )
{ {
hg_windows = 0;
gtk_init( &argc, &argv ); gtk_init( &argc, &argv );
setlocale(LC_NUMERIC,"C"); setlocale(LC_NUMERIC,"C");
...@@ -635,7 +654,8 @@ CV_IMPL int cvStartWindowThread(){ ...@@ -635,7 +654,8 @@ CV_IMPL int cvStartWindowThread(){
} }
#ifdef HAVE_GTHREAD #ifdef HAVE_GTHREAD
gpointer icvWindowThreadLoop(){ gpointer icvWindowThreadLoop()
{
while(1){ while(1){
g_mutex_lock(window_mutex); g_mutex_lock(window_mutex);
gtk_main_iteration_do(FALSE); gtk_main_iteration_do(FALSE);
...@@ -649,201 +669,152 @@ gpointer icvWindowThreadLoop(){ ...@@ -649,201 +669,152 @@ gpointer icvWindowThreadLoop(){
return NULL; return NULL;
} }
#define CV_LOCK_MUTEX() \
if(thread_started && g_thread_self()!=window_thread){ g_mutex_lock( window_mutex ); } else { }
#define CV_UNLOCK_MUTEX() \ class GMutexLock {
if(thread_started && g_thread_self()!=window_thread){ g_mutex_unlock( window_mutex); } else { } GMutex* mutex_;
public:
GMutexLock(GMutex* mutex) : mutex_(mutex) { if (mutex_) g_mutex_lock(mutex_); }
~GMutexLock() { if (mutex_) g_mutex_unlock(mutex_); mutex_ = NULL; }
};
#define CV_LOCK_MUTEX() GMutexLock lock(window_mutex);
#else #else
#define CV_LOCK_MUTEX() #define CV_LOCK_MUTEX()
#define CV_UNLOCK_MUTEX()
#endif #endif
static CvWindow* icvFindWindowByName( const char* name ) static CvWindow* icvFindWindowByName( const char* name )
{ {
CvWindow* window = hg_windows; for(size_t i = 0; i < g_windows.size(); ++i)
while( window != 0 && strcmp(name, window->name) != 0 ) {
window = window->next; CvWindow* window = g_windows[i].get();
if (window->name == name)
return window; return window;
}
return NULL;
} }
static CvWindow* icvWindowByWidget( GtkWidget* widget ) static CvWindow* icvWindowByWidget( GtkWidget* widget )
{ {
CvWindow* window = hg_windows; for (size_t i = 0; i < g_windows.size(); ++i)
{
while( window != 0 && window->widget != widget && CvWindow* window = g_windows[i].get();
window->frame != widget && window->paned != widget ) if (window->widget == widget || window->frame == widget || window->paned == widget)
window = window->next;
return window; return window;
}
return NULL;
} }
double cvGetModeWindow_GTK(const char* name)//YV double cvGetModeWindow_GTK(const char* name)//YV
{ {
double result = -1; CV_Assert(name && "NULL name string");
CV_FUNCNAME( "cvGetModeWindow_GTK" );
__BEGIN__;
CvWindow* window;
if (!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name );
if (!window)
CV_ERROR( CV_StsNullPtr, "NULL window" );
CV_LOCK_MUTEX(); CV_LOCK_MUTEX();
result = window->status; CvWindow* window = icvFindWindowByName(name);
CV_UNLOCK_MUTEX(); if (!window)
CV_Error( CV_StsNullPtr, "NULL window" );
__END__; double result = window->status;
return result; return result;
} }
void cvSetModeWindow_GTK( const char* name, double prop_value)//Yannick Verdie void cvSetModeWindow_GTK( const char* name, double prop_value)//Yannick Verdie
{ {
CV_Assert(name && "NULL name string");
CV_FUNCNAME( "cvSetModeWindow_GTK" ); CV_LOCK_MUTEX();
__BEGIN__;
CvWindow* window;
if(!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if( !window ) if( !window )
CV_ERROR( CV_StsNullPtr, "NULL window" ); CV_Error( CV_StsNullPtr, "NULL window" );
if(window->flags & CV_WINDOW_AUTOSIZE)//if the flag CV_WINDOW_AUTOSIZE is set if(window->flags & CV_WINDOW_AUTOSIZE)//if the flag CV_WINDOW_AUTOSIZE is set
EXIT; return;
//so easy to do fullscreen here, Linux rocks ! //so easy to do fullscreen here, Linux rocks !
if (window->status==CV_WINDOW_FULLSCREEN && prop_value==CV_WINDOW_NORMAL) if (window->status==CV_WINDOW_FULLSCREEN && prop_value==CV_WINDOW_NORMAL)
{ {
CV_LOCK_MUTEX();
gtk_window_unfullscreen(GTK_WINDOW(window->frame)); gtk_window_unfullscreen(GTK_WINDOW(window->frame));
window->status=CV_WINDOW_NORMAL; window->status=CV_WINDOW_NORMAL;
CV_UNLOCK_MUTEX(); return;
EXIT;
} }
if (window->status==CV_WINDOW_NORMAL && prop_value==CV_WINDOW_FULLSCREEN) if (window->status==CV_WINDOW_NORMAL && prop_value==CV_WINDOW_FULLSCREEN)
{ {
CV_LOCK_MUTEX();
gtk_window_fullscreen(GTK_WINDOW(window->frame)); gtk_window_fullscreen(GTK_WINDOW(window->frame));
window->status=CV_WINDOW_FULLSCREEN; window->status=CV_WINDOW_FULLSCREEN;
CV_UNLOCK_MUTEX(); return;
EXIT;
} }
__END__;
} }
void cv::setWindowTitle(const String& winname, const String& title) void cv::setWindowTitle(const String& winname, const String& title)
{ {
CV_LOCK_MUTEX();
CvWindow* window = icvFindWindowByName(winname.c_str()); CvWindow* window = icvFindWindowByName(winname.c_str());
if (!window) if (!window)
{ {
namedWindow(winname); namedWindow(winname);
window = icvFindWindowByName(winname.c_str()); window = icvFindWindowByName(winname.c_str());
CV_Assert(window);
} }
if (!window)
CV_Error(Error::StsNullPtr, "NULL window");
CV_LOCK_MUTEX();
gtk_window_set_title(GTK_WINDOW(window->frame), title.c_str()); gtk_window_set_title(GTK_WINDOW(window->frame), title.c_str());
CV_UNLOCK_MUTEX();
} }
double cvGetPropWindowAutoSize_GTK(const char* name) double cvGetPropWindowAutoSize_GTK(const char* name)
{ {
double result = -1; CV_Assert(name && "NULL name string");
CV_FUNCNAME( "cvGetPropWindowAutoSize_GTK" );
__BEGIN__;
CvWindow* window; CV_LOCK_MUTEX();
if (!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if (!window) if (!window)
EXIT; // keep silence here return -1; // keep silence here
result = window->flags & CV_WINDOW_AUTOSIZE;
__END__;
double result = window->flags & CV_WINDOW_AUTOSIZE;
return result; return result;
} }
double cvGetRatioWindow_GTK(const char* name) double cvGetRatioWindow_GTK(const char* name)
{ {
double result = -1; CV_Assert(name && "NULL name string");
CV_FUNCNAME( "cvGetRatioWindow_GTK" ); CV_LOCK_MUTEX();
__BEGIN__;
CvWindow* window;
if (!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if (!window) if (!window)
EXIT; // keep silence here return -1; // keep silence here
#if defined (GTK_VERSION3) #if defined (GTK_VERSION3)
result = static_cast<double>( double result = static_cast<double>(
gtk_widget_get_allocated_width(window->widget)) / gtk_widget_get_allocated_height(window->widget); gtk_widget_get_allocated_width(window->widget)) / gtk_widget_get_allocated_height(window->widget);
#else #else
result = static_cast<double>(window->widget->allocation.width) / window->widget->allocation.height; double result = static_cast<double>(window->widget->allocation.width) / window->widget->allocation.height;
#endif // GTK_VERSION3 #endif // GTK_VERSION3
__END__;
return result; return result;
} }
double cvGetOpenGlProp_GTK(const char* name) double cvGetOpenGlProp_GTK(const char* name)
{ {
double result = -1;
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
CV_FUNCNAME( "cvGetOpenGlProp_GTK" ); CV_Assert(name && "NULL name string");
__BEGIN__;
CvWindow* window;
if (!name) CV_LOCK_MUTEX();
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if (!window) if (!window)
EXIT; // keep silence here return -1; // keep silence here
result = window->useGl;
__END__; double result = window->useGl;
return result;
#else #else
(void)name; (void)name;
return -1;
#endif #endif
return result;
} }
...@@ -857,35 +828,25 @@ namespace ...@@ -857,35 +828,25 @@ namespace
{ {
GdkGLConfig* glconfig; GdkGLConfig* glconfig;
CV_FUNCNAME( "createGlContext" );
__BEGIN__;
// Try double-buffered visual // Try double-buffered visual
glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE)); glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE));
if (!glconfig) if (!glconfig)
CV_ERROR( CV_OpenGlApiCallError, "Can't Create A GL Device Context" ); CV_Error( CV_OpenGlApiCallError, "Can't Create A GL Device Context" );
// Set OpenGL-capability to the widget // Set OpenGL-capability to the widget
if (!gtk_widget_set_gl_capability(window->widget, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE)) if (!gtk_widget_set_gl_capability(window->widget, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE))
CV_ERROR( CV_OpenGlApiCallError, "Can't Create A GL Device Context" ); CV_Error( CV_OpenGlApiCallError, "Can't Create A GL Device Context" );
window->useGl = true; window->useGl = true;
__END__;
} }
void drawGl(CvWindow* window) void drawGl(CvWindow* window)
{ {
CV_FUNCNAME( "drawGl" );
__BEGIN__;
GdkGLContext* glcontext = gtk_widget_get_gl_context(window->widget); GdkGLContext* glcontext = gtk_widget_get_gl_context(window->widget);
GdkGLDrawable* gldrawable = gtk_widget_get_gl_drawable(window->widget); GdkGLDrawable* gldrawable = gtk_widget_get_gl_drawable(window->widget);
if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext)) if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" ); CV_Error( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" );
glViewport(0, 0, window->widget->allocation.width, window->widget->allocation.height); glViewport(0, 0, window->widget->allocation.width, window->widget->allocation.height);
...@@ -900,8 +861,6 @@ namespace ...@@ -900,8 +861,6 @@ namespace
glFlush(); glFlush();
gdk_gl_drawable_gl_end(gldrawable); gdk_gl_drawable_gl_end(gldrawable);
__END__;
} }
} }
...@@ -1015,43 +974,21 @@ static gboolean cvImageWidget_expose(GtkWidget* widget, GdkEventExpose* event, g ...@@ -1015,43 +974,21 @@ static gboolean cvImageWidget_expose(GtkWidget* widget, GdkEventExpose* event, g
CV_IMPL int cvNamedWindow( const char* name, int flags ) CV_IMPL int cvNamedWindow( const char* name, int flags )
{ {
int result = 0; cvInitSystem(name ? 1 : 0,(char**)&name);
CV_FUNCNAME( "cvNamedWindow" ); CV_Assert(name && "NULL name string");
__BEGIN__; CV_LOCK_MUTEX();
CvWindow* window;
int len;
int b_nautosize;
cvInitSystem(1,(char**)&name);
if( !name )
CV_ERROR( CV_StsNullPtr, "NULL name string" );
// Check the name in the storage // Check the name in the storage
if( icvFindWindowByName( name ) != 0 ) if (icvFindWindowByName(name))
{ {
result = 1; return 1;
EXIT;
} }
len = strlen(name); Ptr<CvWindow> window = makePtr<CvWindow>(name);
CV_CALL( window = (CvWindow*)cvAlloc(sizeof(CvWindow) + len + 1));
memset( window, 0, sizeof(*window));
window->name = (char*)(window + 1);
memcpy( window->name, name, len + 1 );
window->flags = flags; window->flags = flags;
window->signature = CV_WINDOW_MAGIC_VAL;
window->last_key = 0;
window->on_mouse = 0;
window->on_mouse_param = 0;
memset( &window->toolbar, 0, sizeof(window->toolbar));
window->next = hg_windows;
window->prev = 0;
window->status = CV_WINDOW_NORMAL;//YV window->status = CV_WINDOW_NORMAL;//YV
CV_LOCK_MUTEX();
window->frame = gtk_window_new( GTK_WINDOW_TOPLEVEL ); window->frame = gtk_window_new( GTK_WINDOW_TOPLEVEL );
window->paned = gtk_vbox_new( FALSE, 0 ); window->paned = gtk_vbox_new( FALSE, 0 );
...@@ -1063,7 +1000,7 @@ CV_IMPL int cvNamedWindow( const char* name, int flags ) ...@@ -1063,7 +1000,7 @@ CV_IMPL int cvNamedWindow( const char* name, int flags )
#ifndef HAVE_OPENGL #ifndef HAVE_OPENGL
if (flags & CV_WINDOW_OPENGL) if (flags & CV_WINDOW_OPENGL)
CV_ERROR( CV_OpenGlNotSupported, "Library was built without OpenGL support" ); CV_Error( CV_OpenGlNotSupported, "Library was built without OpenGL support" );
#else #else
if (flags & CV_WINDOW_OPENGL) if (flags & CV_WINDOW_OPENGL)
createGlContext(window); createGlContext(window);
...@@ -1105,11 +1042,9 @@ CV_IMPL int cvNamedWindow( const char* name, int flags ) ...@@ -1105,11 +1042,9 @@ CV_IMPL int cvNamedWindow( const char* name, int flags )
gtk_widget_show( window->frame ); gtk_widget_show( window->frame );
gtk_window_set_title( GTK_WINDOW(window->frame), name ); gtk_window_set_title( GTK_WINDOW(window->frame), name );
if( hg_windows ) g_windows.push_back(window);
hg_windows->prev = window;
hg_windows = window;
b_nautosize = ((flags & CV_WINDOW_AUTOSIZE) == 0); bool b_nautosize = ((flags & CV_WINDOW_AUTOSIZE) == 0);
gtk_window_set_resizable( GTK_WINDOW(window->frame), b_nautosize ); gtk_window_set_resizable( GTK_WINDOW(window->frame), b_nautosize );
// allow window to be resized // allow window to be resized
...@@ -1121,17 +1056,12 @@ CV_IMPL int cvNamedWindow( const char* name, int flags ) ...@@ -1121,17 +1056,12 @@ CV_IMPL int cvNamedWindow( const char* name, int flags )
&geometry, (GdkWindowHints) (GDK_HINT_MIN_SIZE)); &geometry, (GdkWindowHints) (GDK_HINT_MIN_SIZE));
} }
CV_UNLOCK_MUTEX();
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
if (window->useGl) if (window->useGl)
cvSetOpenGlContext(name); cvSetOpenGlContext(name);
#endif #endif
result = 1; return 1;
__END__;
return result;
} }
...@@ -1139,110 +1069,71 @@ CV_IMPL int cvNamedWindow( const char* name, int flags ) ...@@ -1139,110 +1069,71 @@ CV_IMPL int cvNamedWindow( const char* name, int flags )
CV_IMPL void cvSetOpenGlContext(const char* name) CV_IMPL void cvSetOpenGlContext(const char* name)
{ {
CvWindow* window;
GdkGLContext* glcontext; GdkGLContext* glcontext;
GdkGLDrawable* gldrawable; GdkGLDrawable* gldrawable;
CV_FUNCNAME( "cvSetOpenGlContext" ); CV_Assert(name && "NULL name string");
__BEGIN__; CV_LOCK_MUTEX();
if(!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if (!window) if (!window)
CV_ERROR( CV_StsNullPtr, "NULL window" ); CV_Error( CV_StsNullPtr, "NULL window" );
if (!window->useGl) if (!window->useGl)
CV_ERROR( CV_OpenGlNotSupported, "Window doesn't support OpenGL" ); CV_Error( CV_OpenGlNotSupported, "Window doesn't support OpenGL" );
glcontext = gtk_widget_get_gl_context(window->widget); glcontext = gtk_widget_get_gl_context(window->widget);
gldrawable = gtk_widget_get_gl_drawable(window->widget); gldrawable = gtk_widget_get_gl_drawable(window->widget);
if (!gdk_gl_drawable_make_current(gldrawable, glcontext)) if (!gdk_gl_drawable_make_current(gldrawable, glcontext))
CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" ); CV_Error( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" );
__END__;
} }
CV_IMPL void cvUpdateWindow(const char* name) CV_IMPL void cvUpdateWindow(const char* name)
{ {
CV_FUNCNAME( "cvUpdateWindow" ); CV_Assert(name && "NULL name string");
__BEGIN__;
CvWindow* window; CV_LOCK_MUTEX();
if (!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if (!window) if (!window)
EXIT; return;
// window does not refresh without this // window does not refresh without this
gtk_widget_queue_draw( GTK_WIDGET(window->widget) ); gtk_widget_queue_draw( GTK_WIDGET(window->widget) );
__END__;
} }
CV_IMPL void cvSetOpenGlDrawCallback(const char* name, CvOpenGlDrawCallback callback, void* userdata) CV_IMPL void cvSetOpenGlDrawCallback(const char* name, CvOpenGlDrawCallback callback, void* userdata)
{ {
CvWindow* window; CV_Assert(name && "NULL name string");
CV_FUNCNAME( "cvCreateOpenGLCallback" ); CV_LOCK_MUTEX();
__BEGIN__;
if(!name)
CV_ERROR( CV_StsNullPtr, "NULL name string" );
window = icvFindWindowByName( name ); CvWindow* window = icvFindWindowByName(name);
if( !window ) if( !window )
EXIT; return;
if (!window->useGl) if (!window->useGl)
CV_ERROR( CV_OpenGlNotSupported, "Window was created without OpenGL context" ); CV_Error( CV_OpenGlNotSupported, "Window was created without OpenGL context" );
window->glDrawCallback = callback; window->glDrawCallback = callback;
window->glDrawData = userdata; window->glDrawData = userdata;
__END__;
} }
#endif // HAVE_OPENGL #endif // HAVE_OPENGL
CvWindow::~CvWindow()
static void icvDeleteWindow( CvWindow* window )
{ {
CvTrackbar* trackbar; gtk_widget_destroy(frame);
}
if( window->prev )
window->prev->next = window->next;
else
hg_windows = window->next;
if( window->next )
window->next->prev = window->prev;
window->prev = window->next = 0;
gtk_widget_destroy( window->frame );
for( trackbar = window->toolbar.first; trackbar != 0; )
{
CvTrackbar* next = trackbar->next;
cvFree( &trackbar );
trackbar = next;
}
cvFree( &window );
static void checkLastWindow()
{
// if last window... // if last window...
if( hg_windows == 0 ) if (g_windows.empty())
{ {
#ifdef HAVE_GTHREAD #ifdef HAVE_GTHREAD
if( thread_started ) if( thread_started )
...@@ -1269,32 +1160,44 @@ static void icvDeleteWindow( CvWindow* window ) ...@@ -1269,32 +1160,44 @@ static void icvDeleteWindow( CvWindow* window )
} }
} }
static void icvDeleteWindow( CvWindow* window )
CV_IMPL void cvDestroyWindow( const char* name )
{ {
CV_FUNCNAME( "cvDestroyWindow" ); bool found = false;
for (std::vector< Ptr<CvWindow> >::iterator i = g_windows.begin();
__BEGIN__; i != g_windows.end(); ++i)
{
CvWindow* window; if (i->get() == window)
{
g_windows.erase(i);
found = true;
break;
}
}
CV_Assert(found && "Can't destroy non-registered window");
if(!name) checkLastWindow();
CV_ERROR( CV_StsNullPtr, "NULL name string" ); }
window = icvFindWindowByName( name ); CV_IMPL void cvDestroyWindow( const char* name )
if( !window ) {
EXIT; CV_Assert(name && "NULL name string");
// 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(); CV_LOCK_MUTEX();
icvDeleteWindow( window ); bool found = false;
for (std::vector< Ptr<CvWindow> >::iterator i = g_windows.begin();
CV_UNLOCK_MUTEX(); i != g_windows.end(); ++i)
{
if (i->get()->name == name)
{
g_windows.erase(i);
found = true;
break;
}
}
CV_Assert(found && "Can't destroy non-registered window");
__END__; checkLastWindow();
} }
...@@ -1303,12 +1206,8 @@ cvDestroyAllWindows( void ) ...@@ -1303,12 +1206,8 @@ cvDestroyAllWindows( void )
{ {
CV_LOCK_MUTEX(); CV_LOCK_MUTEX();
while( hg_windows ) g_windows.clear();
{ checkLastWindow();
CvWindow* window = hg_windows;
icvDeleteWindow( window );
}
CV_UNLOCK_MUTEX();
} }
// CvSize icvCalcOptimalWindowSize( CvWindow * window, CvSize new_image_size){ // CvSize icvCalcOptimalWindowSize( CvWindow * window, CvSize new_image_size){
...@@ -1326,25 +1225,19 @@ cvDestroyAllWindows( void ) ...@@ -1326,25 +1225,19 @@ cvDestroyAllWindows( void )
CV_IMPL void CV_IMPL void
cvShowImage( const char* name, const CvArr* arr ) cvShowImage( const char* name, const CvArr* arr )
{ {
CV_FUNCNAME( "cvShowImage" ); CV_Assert(name && "NULL name string");
__BEGIN__;
CvWindow* window;
if( !name )
CV_ERROR( CV_StsNullPtr, "NULL name" );
CV_LOCK_MUTEX(); CV_LOCK_MUTEX();
window = icvFindWindowByName(name); CvWindow* window = icvFindWindowByName(name);
if(!window) if(!window)
{ {
cvNamedWindow(name, 1); cvNamedWindow(name, 1);
window = icvFindWindowByName(name); window = icvFindWindowByName(name);
} }
CV_Assert(window);
if( window && arr ) if (arr)
{ {
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
if (window->useGl) if (window->useGl)
...@@ -1357,81 +1250,55 @@ cvShowImage( const char* name, const CvArr* arr ) ...@@ -1357,81 +1250,55 @@ cvShowImage( const char* name, const CvArr* arr )
CvImageWidget * image_widget = CV_IMAGE_WIDGET( window->widget ); CvImageWidget * image_widget = CV_IMAGE_WIDGET( window->widget );
cvImageWidgetSetImage( image_widget, arr ); cvImageWidgetSetImage( image_widget, arr );
} }
CV_UNLOCK_MUTEX();
__END__;
} }
CV_IMPL void cvResizeWindow(const char* name, int width, int height ) CV_IMPL void cvResizeWindow(const char* name, int width, int height )
{ {
CV_FUNCNAME( "cvResizeWindow" ); CV_Assert(name && "NULL name string");
__BEGIN__;
CvWindow* window;
CvImageWidget * image_widget;
if( !name ) CV_LOCK_MUTEX();
CV_ERROR( CV_StsNullPtr, "NULL name" );
window = icvFindWindowByName(name); CvWindow* window = icvFindWindowByName(name);
if(!window) if(!window)
EXIT; return;
image_widget = CV_IMAGE_WIDGET( window->widget ); CvImageWidget* image_widget = CV_IMAGE_WIDGET( window->widget );
//if(image_widget->flags & CV_WINDOW_AUTOSIZE) //if(image_widget->flags & CV_WINDOW_AUTOSIZE)
//EXIT; //EXIT;
CV_LOCK_MUTEX();
gtk_window_set_resizable( GTK_WINDOW(window->frame), 1 ); gtk_window_set_resizable( GTK_WINDOW(window->frame), 1 );
gtk_window_resize( GTK_WINDOW(window->frame), width, height ); gtk_window_resize( GTK_WINDOW(window->frame), width, height );
// disable initial resize since presumably user wants to keep // disable initial resize since presumably user wants to keep
// this window size // this window size
image_widget->flags &= ~CV_WINDOW_NO_IMAGE; image_widget->flags &= ~CV_WINDOW_NO_IMAGE;
CV_UNLOCK_MUTEX();
__END__;
} }
CV_IMPL void cvMoveWindow( const char* name, int x, int y ) CV_IMPL void cvMoveWindow( const char* name, int x, int y )
{ {
CV_FUNCNAME( "cvMoveWindow" ); CV_Assert(name && "NULL name string");
__BEGIN__;
CvWindow* window; CV_LOCK_MUTEX();
if( !name )
CV_ERROR( CV_StsNullPtr, "NULL name" );
window = icvFindWindowByName(name); CvWindow* window = icvFindWindowByName(name);
if(!window) if(!window)
EXIT; return;
CV_LOCK_MUTEX();
gtk_window_move( GTK_WINDOW(window->frame), x, y ); gtk_window_move( GTK_WINDOW(window->frame), x, y );
CV_UNLOCK_MUTEX();
__END__;
} }
static CvTrackbar* static CvTrackbar*
icvFindTrackbarByName( const CvWindow* window, const char* name ) icvFindTrackbarByName( const CvWindow* window, const char* name )
{ {
CvTrackbar* trackbar = window->toolbar.first; for (size_t i = 0; i < window->trackbars.size(); ++i)
{
for( ; trackbar != 0 && strcmp( trackbar->name, name ) != 0; trackbar = trackbar->next ) CvTrackbar* trackbar = window->trackbars[i].get();
; if (trackbar->name == name)
return trackbar; return trackbar;
}
return NULL;
} }
static int static int
...@@ -1439,41 +1306,25 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, ...@@ -1439,41 +1306,25 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name,
int* val, int count, CvTrackbarCallback on_notify, int* val, int count, CvTrackbarCallback on_notify,
CvTrackbarCallback2 on_notify2, void* userdata ) CvTrackbarCallback2 on_notify2, void* userdata )
{ {
int result = 0; CV_Assert(window_name && "NULL window name");
CV_Assert(trackbar_name && "NULL trackbar name");
CV_FUNCNAME( "icvCreateTrackbar" );
__BEGIN__;
/*char slider_name[32];*/
CvWindow* window = 0;
CvTrackbar* trackbar = 0;
if( !window_name || !trackbar_name )
CV_ERROR( CV_StsNullPtr, "NULL window or trackbar name" );
if( count <= 0 ) if( count <= 0 )
CV_ERROR( CV_StsOutOfRange, "Bad trackbar maximal value" ); CV_Error( CV_StsOutOfRange, "Bad trackbar maximal value" );
window = icvFindWindowByName(window_name);
if( !window )
EXIT;
trackbar = icvFindTrackbarByName(window,trackbar_name);
CV_LOCK_MUTEX(); CV_LOCK_MUTEX();
if( !trackbar ) CvWindow* window = icvFindWindowByName(window_name);
if(!window)
return 0;
CvTrackbar* trackbar = icvFindTrackbarByName(window, trackbar_name);
if (!trackbar)
{ {
int len = strlen(trackbar_name); Ptr<CvTrackbar> trackbar_ = makePtr<CvTrackbar>(trackbar_name);
trackbar = (CvTrackbar*)cvAlloc(sizeof(CvTrackbar) + len + 1); trackbar = trackbar_.get();
memset( trackbar, 0, sizeof(*trackbar));
trackbar->signature = CV_TRACKBAR_MAGIC_VAL;
trackbar->name = (char*)(trackbar+1);
memcpy( trackbar->name, trackbar_name, len + 1 );
trackbar->parent = window; trackbar->parent = window;
trackbar->next = window->toolbar.first; window->trackbars.push_back(trackbar_);
window->toolbar.first = trackbar;
GtkWidget* hscale_box = gtk_hbox_new( FALSE, 10 ); GtkWidget* hscale_box = gtk_hbox_new( FALSE, 10 );
GtkWidget* hscale_label = gtk_label_new( trackbar_name ); GtkWidget* hscale_label = gtk_label_new( trackbar_name );
...@@ -1489,7 +1340,6 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, ...@@ -1489,7 +1340,6 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name,
gtk_widget_show( hscale ); gtk_widget_show( hscale );
gtk_box_pack_start( GTK_BOX(window->paned), hscale_box, FALSE, FALSE, 5 ); gtk_box_pack_start( GTK_BOX(window->paned), hscale_box, FALSE, FALSE, 5 );
gtk_widget_show( hscale_box ); gtk_widget_show( hscale_box );
} }
if( val ) if( val )
...@@ -1515,14 +1365,7 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, ...@@ -1515,14 +1365,7 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name,
// compensate for the addition of trackbars // compensate for the addition of trackbars
gtk_widget_queue_resize( GTK_WIDGET(window->widget) ); gtk_widget_queue_resize( GTK_WIDGET(window->widget) );
return 1;
CV_UNLOCK_MUTEX();
result = 1;
__END__;
return result;
} }
...@@ -1548,209 +1391,134 @@ cvCreateTrackbar2( const char* trackbar_name, const char* window_name, ...@@ -1548,209 +1391,134 @@ cvCreateTrackbar2( const char* trackbar_name, const char* window_name,
CV_IMPL void CV_IMPL void
cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param ) cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param )
{ {
CV_FUNCNAME( "cvSetMouseCallback" ); CV_Assert(window_name && "NULL window name");
__BEGIN__;
CvWindow* window = 0;
if( !window_name ) CV_LOCK_MUTEX();
CV_ERROR( CV_StsNullPtr, "NULL window name" );
window = icvFindWindowByName(window_name); CvWindow* window = icvFindWindowByName(window_name);
if( !window ) if (!window)
EXIT; return;
window->on_mouse = on_mouse; window->on_mouse = on_mouse;
window->on_mouse_param = param; window->on_mouse_param = param;
__END__;
} }
CV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name ) CV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name )
{ {
int pos = -1; CV_Assert(window_name && "NULL window name");
CV_Assert(trackbar_name && "NULL trackbar name");
CV_FUNCNAME( "cvGetTrackbarPos" );
__BEGIN__;
CvWindow* window;
CvTrackbar* trackbar = 0;
if( trackbar_name == 0 || window_name == 0 ) CV_LOCK_MUTEX();
CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" );
window = icvFindWindowByName( window_name );
if( window )
trackbar = icvFindTrackbarByName( window, trackbar_name );
if( trackbar ) CvWindow* window = icvFindWindowByName(window_name);
pos = trackbar->pos; if (!window)
return -1;
__END__; CvTrackbar* trackbar = icvFindTrackbarByName(window,trackbar_name);
if (!trackbar)
return -1;
return pos; return trackbar->pos;
} }
CV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos ) CV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos )
{ {
CV_FUNCNAME( "cvSetTrackbarPos" ); CV_Assert(window_name && "NULL window name");
CV_Assert(trackbar_name && "NULL trackbar name");
__BEGIN__;
CvWindow* window;
CvTrackbar* trackbar = 0;
if( trackbar_name == 0 || window_name == 0 ) CV_LOCK_MUTEX();
CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" );
window = icvFindWindowByName( window_name ); CvWindow* window = icvFindWindowByName(window_name);
if( window ) if(!window)
trackbar = icvFindTrackbarByName( window, trackbar_name ); return;
CvTrackbar* trackbar = icvFindTrackbarByName(window,trackbar_name);
if( trackbar ) if( trackbar )
{ {
if( pos < 0 ) if( pos < trackbar->minval )
pos = 0; pos = trackbar->minval;
if( pos > trackbar->maxval ) if( pos > trackbar->maxval )
pos = trackbar->maxval; pos = trackbar->maxval;
} }
else else
{ {
CV_ERROR( CV_StsNullPtr, "No trackbar found" ); CV_Error( CV_StsNullPtr, "No trackbar found" );
} }
CV_LOCK_MUTEX();
gtk_range_set_value( GTK_RANGE(trackbar->widget), pos ); gtk_range_set_value( GTK_RANGE(trackbar->widget), pos );
CV_UNLOCK_MUTEX();
__END__;
} }
CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval)
{ {
CV_FUNCNAME("cvSetTrackbarMax"); CV_Assert(window_name && "NULL window name");
CV_Assert(trackbar_name && "NULL trackbar name");
__BEGIN__;
if (maxval >= 0)
{
CvWindow* window = 0;
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)
{
trackbar->maxval = (trackbar->minval>maxval)?trackbar->minval:maxval;
CV_LOCK_MUTEX(); CV_LOCK_MUTEX();
gtk_range_set_range(GTK_RANGE(trackbar->widget), 0, trackbar->maxval); CvWindow* window = icvFindWindowByName(window_name);
if(!window)
return;
CV_UNLOCK_MUTEX(); CvTrackbar* trackbar = icvFindTrackbarByName(window,trackbar_name);
} if(!trackbar)
} return;
}
__END__; trackbar->maxval = maxval;
if (trackbar->maxval >= trackbar->minval)
gtk_range_set_range(GTK_RANGE(trackbar->widget), trackbar->minval, trackbar->maxval);
} }
CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval) CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval)
{ {
CV_FUNCNAME("cvSetTrackbarMin"); CV_Assert(window_name && "NULL window name");
CV_Assert(trackbar_name && "NULL trackbar name");
__BEGIN__;
if (minval >= 0)
{
CvWindow* window = 0;
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)
{
trackbar->minval = (minval<trackbar->maxval)?minval:trackbar->maxval;
CV_LOCK_MUTEX(); CV_LOCK_MUTEX();
gtk_range_set_range(GTK_RANGE(trackbar->widget), minval, trackbar->maxval); CvWindow* window = icvFindWindowByName(window_name);
if(!window)
return;
CV_UNLOCK_MUTEX(); CvTrackbar* trackbar = icvFindTrackbarByName(window,trackbar_name);
} if(!trackbar)
} return;
}
__END__; trackbar->minval = minval;
if (trackbar->maxval >= trackbar->minval)
gtk_range_set_range(GTK_RANGE(trackbar->widget), trackbar->minval, trackbar->maxval);
} }
CV_IMPL void* cvGetWindowHandle( const char* window_name ) CV_IMPL void* cvGetWindowHandle( const char* window_name )
{ {
void* widget = 0; CV_Assert(window_name && "NULL window name");
CV_FUNCNAME( "cvGetWindowHandle" );
__BEGIN__; CV_LOCK_MUTEX();
CvWindow* window;
if( window_name == 0 )
CV_ERROR( CV_StsNullPtr, "NULL window name" );
window = icvFindWindowByName( window_name );
if( window )
widget = (void*)window->widget;
__END__; CvWindow* window = icvFindWindowByName(window_name);
if(!window)
return NULL;
return widget; return (void*)window->widget;
} }
CV_IMPL const char* cvGetWindowName( void* window_handle ) CV_IMPL const char* cvGetWindowName( void* window_handle )
{ {
const char* window_name = ""; CV_Assert(window_handle && "NULL window handle");
CV_FUNCNAME( "cvGetWindowName" );
__BEGIN__;
CvWindow* window; CV_LOCK_MUTEX();
if( window_handle == 0 )
CV_ERROR( CV_StsNullPtr, "NULL window" );
window = icvWindowByWidget( (GtkWidget*)window_handle );
if( window )
window_name = window->name;
__END__; CvWindow* window = icvWindowByWidget( (GtkWidget*)window_handle );
if (window)
return window->name.c_str();
return window_name; return ""; // FIXME: NULL?
} }
static GtkFileFilter* icvMakeGtkFilter(const char* name, const char* patterns, GtkFileFilter* images) static GtkFileFilter* icvMakeGtkFilter(const char* name, const char* patterns, GtkFileFilter* images)
...@@ -1812,7 +1580,7 @@ static void icvShowSaveAsDialog(GtkWidget* widget, CvWindow* window) ...@@ -1812,7 +1580,7 @@ static void icvShowSaveAsDialog(GtkWidget* widget, CvWindow* window)
}; };
for (size_t idx = 0; idx < sizeof(file_filters)/sizeof(file_filters[0]); ++idx) for (size_t idx = 0; idx < sizeof(file_filters)/sizeof(file_filters[0]); ++idx)
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filters[idx]); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), file_filters[idx]); // filter ownership is transferred to dialog
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter_images); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter_images);
cv::String filename; cv::String filename;
...@@ -1993,9 +1761,11 @@ static gboolean icvOnMouse( GtkWidget *widget, GdkEvent *event, gpointer user_da ...@@ -1993,9 +1761,11 @@ static gboolean icvOnMouse( GtkWidget *widget, GdkEvent *event, gpointer user_da
break; break;
#endif //GTK_VERSION3_4 #endif //GTK_VERSION3_4
case GDK_SCROLL_LEFT: cv_event = CV_EVENT_MOUSEHWHEEL; case GDK_SCROLL_LEFT: cv_event = CV_EVENT_MOUSEHWHEEL;
/* FALLTHRU */
case GDK_SCROLL_UP: flags |= ~0xffff; case GDK_SCROLL_UP: flags |= ~0xffff;
break; break;
case GDK_SCROLL_RIGHT: cv_event = CV_EVENT_MOUSEHWHEEL; case GDK_SCROLL_RIGHT: cv_event = CV_EVENT_MOUSEHWHEEL;
/* FALLTHRU */
case GDK_SCROLL_DOWN: flags |= (((int)1 << 16)); case GDK_SCROLL_DOWN: flags |= (((int)1 << 16));
break; break;
default: ; default: ;
...@@ -2072,7 +1842,7 @@ CV_IMPL int cvWaitKey( int delay ) ...@@ -2072,7 +1842,7 @@ CV_IMPL int cvWaitKey( int delay )
} }
my_last_key = last_key; my_last_key = last_key;
g_mutex_unlock(last_key_mutex); g_mutex_unlock(last_key_mutex);
if(expired || hg_windows==0){ if(expired || g_windows.empty()){
return -1; return -1;
} }
return my_last_key; return my_last_key;
...@@ -2084,7 +1854,7 @@ CV_IMPL int cvWaitKey( int delay ) ...@@ -2084,7 +1854,7 @@ CV_IMPL int cvWaitKey( int delay )
if( delay > 0 ) if( delay > 0 )
timer = g_timeout_add( delay, icvAlarm, &expired ); timer = g_timeout_add( delay, icvAlarm, &expired );
last_key = -1; last_key = -1;
while( gtk_main_iteration_do(TRUE) && last_key < 0 && !expired && hg_windows != 0 ) while( gtk_main_iteration_do(TRUE) && last_key < 0 && !expired && !g_windows.empty())
; ;
if( delay > 0 && !expired ) if( delay > 0 && !expired )
......
...@@ -15,6 +15,7 @@ String winName="False color"; ...@@ -15,6 +15,7 @@ String winName="False color";
static void TrackColorMap(int x, void *r) static void TrackColorMap(int x, void *r)
{ {
std::cout << "selected: " << x << std::endl;
ParamColorMar *p = (ParamColorMar*)r; ParamColorMar *p = (ParamColorMar*)r;
Mat dst; Mat dst;
p->iColormap= x; p->iColormap= x;
...@@ -23,9 +24,8 @@ static void TrackColorMap(int x, void *r) ...@@ -23,9 +24,8 @@ static void TrackColorMap(int x, void *r)
if (!lutRND) if (!lutRND)
{ {
RNG ra; RNG ra;
Mat *palette = new Mat(256, 1, CV_8UC3); lutRND = makePtr<Mat>(256, 1, CV_8UC3);
ra.fill(*palette, RNG::UNIFORM, 0, 256); ra.fill(*lutRND, RNG::UNIFORM, 0, 256);
lutRND = Ptr<Mat>(palette);
} }
applyColorMap(p->img, dst, *lutRND.get()); applyColorMap(p->img, dst, *lutRND.get());
} }
...@@ -77,6 +77,7 @@ static void TrackColorMap(int x, void *r) ...@@ -77,6 +77,7 @@ static void TrackColorMap(int x, void *r)
colorMapName = "User colormap : random"; colorMapName = "User colormap : random";
break; break;
} }
std::cout << "> " << colorMapName << std::endl;
putText(dst, colorMapName, Point(10, 20), cv::FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 255)); putText(dst, colorMapName, Point(10, 20), cv::FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 255));
imshow(winName, dst); imshow(winName, dst);
} }
...@@ -144,7 +145,10 @@ int main(int argc, char** argv) ...@@ -144,7 +145,10 @@ int main(int argc, char** argv)
setTrackbarMax("colormap", winName, cv::COLORMAP_PARULA+1); setTrackbarMax("colormap", winName, cv::COLORMAP_PARULA+1);
setTrackbarPos("colormap", winName, -1); setTrackbarPos("colormap", winName, -1);
TrackColorMap(0,(void*)&p); TrackColorMap((int)getTrackbarPos("colormap", winName),(void*)&p);
waitKey(0); while (waitKey(0) != 27)
{
std::cout << "Press 'ESC' to exit" << std::endl;
}
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment