From 6ddaa0260c4749aa6c0395000381d7df0bd3feb1 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 3 Feb 2013 22:29:15 +0000 Subject: Port control performance improvements (further improvement for #879). Only request a redraw, not a full update, where appropriate. Use a raw double instead of GVariant for port control-changed signal. git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5045 a436a847-0d15-0410-975c-d299462d15a1 --- src/port.c | 90 +++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 48 insertions(+), 42 deletions(-) (limited to 'src/port.c') diff --git a/src/port.c b/src/port.c index 5780571..3bc300e 100644 --- a/src/port.c +++ b/src/port.c @@ -354,7 +354,7 @@ ganv_port_class_init(GanvPortClass* klass) NULL, NULL, NULL, G_TYPE_NONE, 1, - G_TYPE_VARIANT); + G_TYPE_DOUBLE); object_class->destroy = ganv_port_destroy; @@ -497,26 +497,6 @@ ganv_port_set_value_label(GanvPort* port, } } -void -ganv_port_set_control_is_toggle(GanvPort* port, - gboolean is_toggle) -{ - if (port->impl->control) { - port->impl->control->is_toggle = is_toggle; - ganv_port_set_control_value(port, port->impl->control->value); - } -} - -void -ganv_port_set_control_is_integer(GanvPort* port, - gboolean is_integer) -{ - if (port->impl->control) { - port->impl->control->is_integer = is_integer; - ganv_port_set_control_value(port, lrintf(port->impl->control->value)); - } -} - static void ganv_port_update_control_slider(GanvPort* port, float value) @@ -526,6 +506,7 @@ ganv_port_update_control_slider(GanvPort* port, return; } + // Clamp to toggle or integer value if applicable if (impl->control->is_toggle) { if (value != 0.0f) { value = impl->control->max; @@ -536,43 +517,51 @@ ganv_port_update_control_slider(GanvPort* port, value = lrintf(value); } + // Clamp to range if (value < impl->control->min) { - impl->control->min = value; + value = impl->control->min; } if (value > impl->control->max) { - impl->control->max = value; - } - - if (impl->control->max == impl->control->min) { - impl->control->max = impl->control->min + 1.0f; - } - - const int inf = isinf(value); - if (inf == -1) { - value = impl->control->min; - } else if (inf == 1) { value = impl->control->max; } + + if (value == impl->control->value) { + return; // No change, do nothing + } const double w = (value - impl->control->min) / (impl->control->max - impl->control->min) * ganv_box_get_width(&port->box); if (isnan(w)) { - return; + return; // Shouldn't happen, but ignore crazy values } + // Redraw port + impl->control->value = value; ganv_box_set_width(impl->control->rect, MAX(0.0, w - 1.0)); + ganv_box_request_redraw( + GANV_ITEM(port), &GANV_BOX(port)->impl->coords, FALSE); +} - if (impl->control->value != value) { - GVariant* gvar = g_variant_ref_sink(g_variant_new_double(value)); - g_signal_emit(port, port_signals[PORT_VALUE_CHANGED], 0, gvar, NULL); - g_variant_unref(gvar); +void +ganv_port_set_control_is_toggle(GanvPort* port, + gboolean is_toggle) +{ + if (port->impl->control) { + port->impl->control->is_toggle = is_toggle; + ganv_port_update_control_slider(port, port->impl->control->value); } +} - impl->control->value = value; - - ganv_item_request_update(GANV_ITEM(port)); +void +ganv_port_set_control_is_integer(GanvPort* port, + gboolean is_integer) +{ + if (port->impl->control) { + port->impl->control->is_integer = is_integer; + ganv_port_update_control_slider(port, lrintf(port->impl->control->value)); + } } void @@ -585,16 +574,30 @@ ganv_port_set_control_value(GanvPort* port, ganv_port_set_value_label( port, (const char*)((value == 0.0f) ? check_off : check_on)); } - ganv_port_update_control_slider(port, value); } +void +ganv_port_set_control_value_internal(GanvPort* port, + float value) +{ + // Update slider + ganv_port_set_control_value(port, value); + + // Fire signal to notify user value has changed + const double dvalue = value; + g_signal_emit(port, port_signals[PORT_VALUE_CHANGED], 0, dvalue, NULL); +} + void ganv_port_set_control_min(GanvPort* port, float min) { if (port->impl->control) { port->impl->control->min = min; + if (port->impl->control->max < min) { + port->impl->control->max = min; + } ganv_port_update_control_slider(port, port->impl->control->value); } } @@ -605,6 +608,9 @@ ganv_port_set_control_max(GanvPort* port, { if (port->impl->control) { port->impl->control->max = max; + if (port->impl->control->min > max) { + port->impl->control->min = max; + } ganv_port_update_control_slider(port, port->impl->control->value); } } -- cgit v1.2.1