Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
a8355170
Commit
a8355170
authored
Aug 17, 2017
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9369 from alalek:cpp_refactor_gtk
parents
5c325466
9e239c7a
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
274 additions
and
500 deletions
+274
-500
window_gtk.cpp
modules/highgui/src/window_gtk.cpp
+265
-495
falsecolor.cpp
samples/cpp/falsecolor.cpp
+9
-5
No files found.
modules/highgui/src/window_gtk.cpp
View file @
a8355170
...
@@ -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_E
RROR
(
CV_StsNullPtr
,
"NULL window"
);
CV_E
rror
(
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_E
RROR
(
CV_OpenGlApiCallError
,
"Can't Create A GL Device Context"
);
CV_E
rror
(
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_E
RROR
(
CV_OpenGlApiCallError
,
"Can't Create A GL Device Context"
);
CV_E
rror
(
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_E
RROR
(
CV_OpenGlApiCallError
,
"Can't Activate The GL Rendering Context"
);
CV_E
rror
(
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_E
RROR
(
CV_OpenGlNotSupported
,
"Library was built without OpenGL support"
);
CV_E
rror
(
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
);
b
ool
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_E
RROR
(
CV_StsNullPtr
,
"NULL window"
);
CV_E
rror
(
CV_StsNullPtr
,
"NULL window"
);
if
(
!
window
->
useGl
)
if
(
!
window
->
useGl
)
CV_E
RROR
(
CV_OpenGlNotSupported
,
"Window doesn't support OpenGL"
);
CV_E
rror
(
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
)
{
{
C
vWindow
*
window
;
C
V_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_E
RROR
(
CV_OpenGlNotSupported
,
"Window was created without OpenGL context"
);
CV_E
rror
(
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_E
RROR
(
CV_StsNullPtr
,
"No trackbar found"
);
CV_E
rror
(
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
)
...
...
samples/cpp/falsecolor.cpp
View file @
a8355170
...
@@ -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
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment