|
|
|
@ -47,6 +47,7 @@ |
|
|
|
|
|
|
|
|
|
#include "gtk/gtk.h" |
|
|
|
|
#include "gdk/gdkkeysyms.h" |
|
|
|
|
#include <gdk-pixbuf/gdk-pixbuf.h> |
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_OPENGL |
|
|
|
@ -88,14 +89,14 @@ GtkWidget* cvImageWidgetNew (int flags); |
|
|
|
|
void cvImageWidgetSetImage(CvImageWidget * widget, const CvArr *arr); |
|
|
|
|
|
|
|
|
|
// standard GTK object macros
|
|
|
|
|
#define CV_IMAGE_WIDGET(obj) GTK_CHECK_CAST (obj, cvImageWidget_get_type (), CvImageWidget) |
|
|
|
|
#define CV_IMAGE_WIDGET(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, cvImageWidget_get_type (), CvImageWidget) |
|
|
|
|
#define CV_IMAGE_WIDGET_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, cvImageWidget_get_type (), CvImageWidgetClass) |
|
|
|
|
#define CV_IS_IMAGE_WIDGET(obj) GTK_CHECK_TYPE (obj, cvImageWidget_get_type ()) |
|
|
|
|
#define CV_IS_IMAGE_WIDGET(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, cvImageWidget_get_type ()) |
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Private API ////////////////////////////////////////////////////////
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
GtkType cvImageWidget_get_type (void); |
|
|
|
|
GType cvImageWidget_get_type (void); |
|
|
|
|
|
|
|
|
|
static GtkWidgetClass * parent_class = NULL; |
|
|
|
|
|
|
|
|
@ -135,7 +136,7 @@ cvImageWidgetNew (int flags) |
|
|
|
|
{ |
|
|
|
|
CvImageWidget *image_widget; |
|
|
|
|
|
|
|
|
|
image_widget = CV_IMAGE_WIDGET( gtk_type_new (cvImageWidget_get_type ()) ); |
|
|
|
|
image_widget = CV_IMAGE_WIDGET( gtk_widget_new (cvImageWidget_get_type (), NULL) ); |
|
|
|
|
image_widget->original_image = 0; |
|
|
|
|
image_widget->scaled_image = 0; |
|
|
|
|
image_widget->flags = flags | CV_WINDOW_NO_IMAGE; |
|
|
|
@ -153,7 +154,7 @@ cvImageWidget_realize (GtkWidget *widget) |
|
|
|
|
g_return_if_fail (widget != NULL); |
|
|
|
|
g_return_if_fail (CV_IS_IMAGE_WIDGET (widget)); |
|
|
|
|
|
|
|
|
|
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); |
|
|
|
|
gtk_widget_set_realized(widget, TRUE); |
|
|
|
|
|
|
|
|
|
attributes.x = widget->allocation.x; |
|
|
|
|
attributes.y = widget->allocation.y; |
|
|
|
@ -270,7 +271,7 @@ cvImageWidget_size_allocate (GtkWidget *widget, |
|
|
|
|
cvResize( image_widget->original_image, image_widget->scaled_image, CV_INTER_AREA ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (GTK_WIDGET_REALIZED (widget)) |
|
|
|
|
if (gtk_widget_get_realized (widget)) |
|
|
|
|
{ |
|
|
|
|
image_widget = CV_IMAGE_WIDGET (widget); |
|
|
|
|
|
|
|
|
@ -321,7 +322,7 @@ static void cvImageWidget_class_init (CvImageWidgetClass * klass) |
|
|
|
|
object_class = (GtkObjectClass*) klass; |
|
|
|
|
widget_class = (GtkWidgetClass*) klass; |
|
|
|
|
|
|
|
|
|
parent_class = GTK_WIDGET_CLASS( gtk_type_class (gtk_widget_get_type ()) ); |
|
|
|
|
parent_class = GTK_WIDGET_CLASS( g_type_class_peek (gtk_widget_get_type ()) ); |
|
|
|
|
|
|
|
|
|
object_class->destroy = cvImageWidget_destroy; |
|
|
|
|
|
|
|
|
@ -341,24 +342,18 @@ cvImageWidget_init (CvImageWidget *image_widget) |
|
|
|
|
image_widget->flags=0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GtkType cvImageWidget_get_type (void){ |
|
|
|
|
static GtkType image_type = 0; |
|
|
|
|
GType cvImageWidget_get_type (void){ |
|
|
|
|
static GType image_type = 0; |
|
|
|
|
|
|
|
|
|
if (!image_type) |
|
|
|
|
{ |
|
|
|
|
static const GtkTypeInfo image_info = |
|
|
|
|
{ |
|
|
|
|
(gchar*)"CvImageWidget", |
|
|
|
|
sizeof (CvImageWidget), |
|
|
|
|
sizeof (CvImageWidgetClass), |
|
|
|
|
(GtkClassInitFunc) cvImageWidget_class_init, |
|
|
|
|
(GtkObjectInitFunc) cvImageWidget_init, |
|
|
|
|
/* reserved_1 */ NULL, |
|
|
|
|
/* reserved_1 */ NULL, |
|
|
|
|
(GtkClassInitFunc) NULL |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
image_type = gtk_type_unique (GTK_TYPE_WIDGET, &image_info); |
|
|
|
|
image_type = g_type_register_static_simple( GTK_TYPE_WIDGET, |
|
|
|
|
(gchar*) "CvImageWidget", |
|
|
|
|
sizeof(CvImageWidgetClass), |
|
|
|
|
(GClassInitFunc) cvImageWidget_class_init, |
|
|
|
|
sizeof(CvImageWidget), |
|
|
|
|
(GInstanceInitFunc) cvImageWidget_init, |
|
|
|
|
(GTypeFlags)NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return image_type; |
|
|
|
@ -758,7 +753,9 @@ static gboolean cvImageWidget_expose(GtkWidget* widget, GdkEventExpose* event, g |
|
|
|
|
(void)data; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
CvImageWidget *image_widget; |
|
|
|
|
CvImageWidget *image_widget = NULL; |
|
|
|
|
cairo_t *cr = NULL; |
|
|
|
|
GdkPixbuf *pixbuf = NULL; |
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (widget != NULL, FALSE); |
|
|
|
|
g_return_val_if_fail (CV_IS_IMAGE_WIDGET (widget), FALSE); |
|
|
|
@ -767,29 +764,30 @@ static gboolean cvImageWidget_expose(GtkWidget* widget, GdkEventExpose* event, g |
|
|
|
|
if (event->count > 0) |
|
|
|
|
return FALSE; |
|
|
|
|
|
|
|
|
|
cr = gdk_cairo_create(widget->window); |
|
|
|
|
image_widget = CV_IMAGE_WIDGET (widget); |
|
|
|
|
|
|
|
|
|
gdk_window_clear_area (widget->window, |
|
|
|
|
0, 0, |
|
|
|
|
widget->allocation.width, |
|
|
|
|
widget->allocation.height); |
|
|
|
|
if( image_widget->scaled_image ){ |
|
|
|
|
// center image in available region
|
|
|
|
|
int x0 = (widget->allocation.width - image_widget->scaled_image->cols)/2; |
|
|
|
|
int y0 = (widget->allocation.height - image_widget->scaled_image->rows)/2; |
|
|
|
|
|
|
|
|
|
gdk_draw_rgb_image( widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], |
|
|
|
|
x0, y0, MIN(image_widget->scaled_image->cols, widget->allocation.width), |
|
|
|
|
pixbuf = gdk_pixbuf_new_from_data(image_widget->scaled_image->data.ptr, GDK_COLORSPACE_RGB, false, |
|
|
|
|
8, MIN(image_widget->scaled_image->cols, widget->allocation.width), |
|
|
|
|
MIN(image_widget->scaled_image->rows, widget->allocation.height), |
|
|
|
|
GDK_RGB_DITHER_MAX, image_widget->scaled_image->data.ptr, image_widget->scaled_image->step ); |
|
|
|
|
image_widget->scaled_image->step, NULL, NULL); |
|
|
|
|
gdk_cairo_set_source_pixbuf(cr, pixbuf, x0, y0); |
|
|
|
|
} |
|
|
|
|
else if( image_widget->original_image ){ |
|
|
|
|
gdk_draw_rgb_image( widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], |
|
|
|
|
0, 0, |
|
|
|
|
MIN(image_widget->original_image->cols, widget->allocation.width), |
|
|
|
|
MIN(image_widget->original_image->rows, widget->allocation.height), |
|
|
|
|
GDK_RGB_DITHER_MAX, image_widget->original_image->data.ptr, image_widget->original_image->step ); |
|
|
|
|
pixbuf = gdk_pixbuf_new_from_data(image_widget->original_image->data.ptr, GDK_COLORSPACE_RGB, false, |
|
|
|
|
8, MIN(image_widget->original_image->cols, widget->allocation.width), |
|
|
|
|
MIN(image_widget->original_image->rows, widget->allocation.height), |
|
|
|
|
image_widget->original_image->step, NULL, NULL); |
|
|
|
|
gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cairo_paint(cr); |
|
|
|
|
cairo_destroy(cr); |
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -854,18 +852,18 @@ CV_IMPL int cvNamedWindow( const char* name, int flags ) |
|
|
|
|
//
|
|
|
|
|
// configure event handlers
|
|
|
|
|
// TODO -- move this to CvImageWidget ?
|
|
|
|
|
gtk_signal_connect( GTK_OBJECT(window->frame), "key-press-event", |
|
|
|
|
GTK_SIGNAL_FUNC(icvOnKeyPress), window ); |
|
|
|
|
gtk_signal_connect( GTK_OBJECT(window->widget), "button-press-event", |
|
|
|
|
GTK_SIGNAL_FUNC(icvOnMouse), window ); |
|
|
|
|
gtk_signal_connect( GTK_OBJECT(window->widget), "button-release-event", |
|
|
|
|
GTK_SIGNAL_FUNC(icvOnMouse), window ); |
|
|
|
|
gtk_signal_connect( GTK_OBJECT(window->widget), "motion-notify-event", |
|
|
|
|
GTK_SIGNAL_FUNC(icvOnMouse), window ); |
|
|
|
|
gtk_signal_connect( GTK_OBJECT(window->frame), "delete-event", |
|
|
|
|
GTK_SIGNAL_FUNC(icvOnClose), window ); |
|
|
|
|
gtk_signal_connect( GTK_OBJECT(window->widget), "expose-event", |
|
|
|
|
GTK_SIGNAL_FUNC(cvImageWidget_expose), window ); |
|
|
|
|
g_signal_connect( window->frame, "key-press-event", |
|
|
|
|
G_CALLBACK(icvOnKeyPress), window ); |
|
|
|
|
g_signal_connect( window->widget, "button-press-event", |
|
|
|
|
G_CALLBACK(icvOnMouse), window ); |
|
|
|
|
g_signal_connect( window->widget, "button-release-event", |
|
|
|
|
G_CALLBACK(icvOnMouse), window ); |
|
|
|
|
g_signal_connect( window->widget, "motion-notify-event", |
|
|
|
|
G_CALLBACK(icvOnMouse), window ); |
|
|
|
|
g_signal_connect( window->frame, "delete-event", |
|
|
|
|
G_CALLBACK(icvOnClose), window ); |
|
|
|
|
g_signal_connect( window->widget, "expose-event", |
|
|
|
|
G_CALLBACK(cvImageWidget_expose), window ); |
|
|
|
|
|
|
|
|
|
gtk_widget_add_events (window->widget, GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK) ; |
|
|
|
|
|
|
|
|
@ -1225,7 +1223,6 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, |
|
|
|
|
GtkWidget* hscale_box = gtk_hbox_new( FALSE, 10 ); |
|
|
|
|
GtkWidget* hscale_label = gtk_label_new( trackbar_name ); |
|
|
|
|
GtkWidget* hscale = gtk_hscale_new_with_range( 0, count, 1 ); |
|
|
|
|
gtk_range_set_update_policy( GTK_RANGE(hscale), GTK_UPDATE_CONTINUOUS ); |
|
|
|
|
gtk_scale_set_digits( GTK_SCALE(hscale), 0 ); |
|
|
|
|
//gtk_scale_set_value_pos( hscale, GTK_POS_TOP );
|
|
|
|
|
gtk_scale_set_draw_value( GTK_SCALE(hscale), TRUE ); |
|
|
|
@ -1256,8 +1253,8 @@ icvCreateTrackbar( const char* trackbar_name, const char* window_name, |
|
|
|
|
trackbar->notify = on_notify; |
|
|
|
|
trackbar->notify2 = on_notify2; |
|
|
|
|
trackbar->userdata = userdata; |
|
|
|
|
gtk_signal_connect( GTK_OBJECT(trackbar->widget), "value-changed", |
|
|
|
|
GTK_SIGNAL_FUNC(icvOnTrackbar), trackbar ); |
|
|
|
|
g_signal_connect( trackbar->widget, "value-changed", |
|
|
|
|
G_CALLBACK(icvOnTrackbar), trackbar ); |
|
|
|
|
|
|
|
|
|
// queue a widget resize to trigger a window resize to
|
|
|
|
|
// compensate for the addition of trackbars
|
|
|
|
|