mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-04 12:45:45 +01:00
various work waveview amplitude mgmt; fix playhead cursor drag from timebar click
This commit is contained in:
parent
9727a23111
commit
ec102f94e1
13 changed files with 95 additions and 55 deletions
|
|
@ -72,6 +72,18 @@ Canvas::render (Rect const & area, Cairo::RefPtr<Cairo::Context> const & context
|
|||
|
||||
context->save ();
|
||||
|
||||
#ifdef CANVAS_DEBUG
|
||||
if (getenv ("ARDOUR_REDRAW_CANVAS")) {
|
||||
/* light up the canvas to show redraws */
|
||||
context->set_source_rgba (random()%255 / 255.0,
|
||||
random()%255 / 255.0,
|
||||
random()%255 / 255.0,
|
||||
255);
|
||||
context->rectangle (area.x0, area.y0, area.width(), area.height());
|
||||
context->stroke ();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* clip to the requested area */
|
||||
context->rectangle (area.x0, area.y0, area.width(), area.height());
|
||||
context->clip ();
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@ public:
|
|||
void set_y0 (Coord);
|
||||
void set_x1 (Coord);
|
||||
void set_y1 (Coord);
|
||||
void set_x (Coord, Coord);
|
||||
|
||||
Coord x0 () const {
|
||||
return _points[0].x;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,17 +65,17 @@ public:
|
|||
void set_outline_color (Color);
|
||||
|
||||
void region_resized ();
|
||||
void gain_changed ();
|
||||
|
||||
void set_show_zero_line (bool);
|
||||
bool show_zero_line() const { return _show_zero; }
|
||||
void set_zero_color (Color);
|
||||
void set_clip_color (Color);
|
||||
void set_amplitude (double);
|
||||
void set_logscaled (bool);
|
||||
void set_gradient_depth (double);
|
||||
double gradient_depth() const { return _gradient_depth; }
|
||||
void set_shape (Shape);
|
||||
double amplitude() const { return _amplitude; }
|
||||
|
||||
|
||||
/* currently missing because we don't need them (yet):
|
||||
set_shape_independent();
|
||||
|
|
@ -90,6 +90,9 @@ public:
|
|||
static bool global_logscaled() { return _global_logscaled; }
|
||||
static Shape global_shape() { return _global_shape; }
|
||||
|
||||
void set_amplitude_above_axis (double v);
|
||||
double amplitude_above_axis () const { return _amplitude_above_axis; }
|
||||
|
||||
#ifdef CANVAS_COMPATIBILITY
|
||||
void*& property_gain_src () {
|
||||
return _foo_void;
|
||||
|
|
@ -97,15 +100,9 @@ public:
|
|||
void*& property_gain_function () {
|
||||
return _foo_void;
|
||||
}
|
||||
double& property_amplitude_above_axis () {
|
||||
return _foo_double;
|
||||
}
|
||||
private:
|
||||
void* _foo_void;
|
||||
bool _foo_bool;
|
||||
int _foo_int;
|
||||
Color _foo_uint;
|
||||
double _foo_double;
|
||||
|
||||
#endif
|
||||
|
||||
class CacheEntry
|
||||
|
|
@ -157,10 +154,10 @@ private:
|
|||
bool _logscaled;
|
||||
Shape _shape;
|
||||
double _gradient_depth;
|
||||
double _amplitude;
|
||||
bool _shape_independent;
|
||||
bool _logscaled_independent;
|
||||
bool _gradient_depth_independent;
|
||||
double _amplitude_above_axis;
|
||||
|
||||
/** The `start' value to use for the region; we can't use the region's
|
||||
* value as the crossfade editor needs to alter it.
|
||||
|
|
|
|||
|
|
@ -75,6 +75,20 @@ Line::set (Duple a, Duple b)
|
|||
DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: line change\n");
|
||||
}
|
||||
|
||||
void
|
||||
Line::set_x (Coord x0, Coord x1)
|
||||
{
|
||||
begin_change ();
|
||||
|
||||
_points[0].x = x0;
|
||||
_points[1].x = x1;
|
||||
|
||||
_bounding_box_dirty = true;
|
||||
end_change ();
|
||||
|
||||
DEBUG_TRACE (PBD::DEBUG::CanvasItemsDirtied, "canvas item dirty: line change\n");
|
||||
}
|
||||
|
||||
void
|
||||
Line::set_x0 (Coord x0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -61,10 +61,10 @@ WaveView::WaveView (Group* parent, boost::shared_ptr<ARDOUR::AudioRegion> region
|
|||
, _logscaled (_global_logscaled)
|
||||
, _shape (_global_shape)
|
||||
, _gradient_depth (_global_gradient_depth)
|
||||
, _amplitude (1.0)
|
||||
, _shape_independent (false)
|
||||
, _logscaled_independent (false)
|
||||
, _gradient_depth_independent (false)
|
||||
, _amplitude_above_axis (1.0)
|
||||
, _region_start (0)
|
||||
{
|
||||
VisualPropertiesChanged.connect_same_thread (invalidation_connection, boost::bind (&WaveView::handle_visual_property_change, this));
|
||||
|
|
@ -252,21 +252,26 @@ WaveView::set_channel (int channel)
|
|||
void
|
||||
WaveView::invalidate_whole_cache ()
|
||||
{
|
||||
begin_visual_change ();
|
||||
for (list<CacheEntry*>::iterator i = _cache.begin(); i != _cache.end(); ++i) {
|
||||
delete *i;
|
||||
}
|
||||
|
||||
_cache.clear ();
|
||||
_canvas->item_visual_property_changed (this);
|
||||
|
||||
end_visual_change ();
|
||||
}
|
||||
|
||||
void
|
||||
WaveView::invalidate_image_cache ()
|
||||
{
|
||||
begin_visual_change ();
|
||||
|
||||
for (list<CacheEntry*>::iterator i = _cache.begin(); i != _cache.end(); ++i) {
|
||||
(*i)->clear_image ();
|
||||
}
|
||||
_canvas->item_visual_property_changed (this);
|
||||
|
||||
end_visual_change ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -285,12 +290,9 @@ WaveView::set_logscaled (bool yn)
|
|||
}
|
||||
|
||||
void
|
||||
WaveView::set_amplitude (double a)
|
||||
WaveView::gain_changed ()
|
||||
{
|
||||
if (_amplitude != a) {
|
||||
_amplitude = a;
|
||||
invalidate_image_cache ();
|
||||
}
|
||||
invalidate_whole_cache ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -329,6 +331,15 @@ WaveView::set_shape (Shape s)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
WaveView::set_amplitude_above_axis (double a)
|
||||
{
|
||||
if (_amplitude_above_axis != a) {
|
||||
_amplitude_above_axis = a;
|
||||
invalidate_image_cache ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
WaveView::set_global_shape (Shape s)
|
||||
{
|
||||
|
|
@ -410,7 +421,6 @@ WaveView::CacheEntry::image ()
|
|||
|
||||
context->begin_new_path();
|
||||
|
||||
|
||||
if (_wave_view->_shape == WaveView::Rectified) {
|
||||
|
||||
/* top edge of waveform is based on max (fabs (peak_min, peak_max))
|
||||
|
|
@ -418,13 +428,12 @@ WaveView::CacheEntry::image ()
|
|||
|
||||
if (_wave_view->_logscaled) {
|
||||
for (int i = 0; i < _n_peaks; ++i) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() *
|
||||
alt_log_meter (fast_coefficient_to_dB (
|
||||
context->line_to (i + 0.5, position (alt_log_meter (fast_coefficient_to_dB (
|
||||
max (fabs (_peaks[i].max), fabs (_peaks[i].min))))));
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < _n_peaks; ++i) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * max (fabs (_peaks[i].max), fabs (_peaks[i].min))));
|
||||
context->line_to (i + 0.5, position (max (fabs (_peaks[i].max), fabs (_peaks[i].min))));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -433,16 +442,16 @@ WaveView::CacheEntry::image ()
|
|||
for (int i = 0; i < _n_peaks; ++i) {
|
||||
Coord y = _peaks[i].max;
|
||||
if (y > 0.0) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * alt_log_meter (fast_coefficient_to_dB (y))));
|
||||
context->line_to (i + 0.5, position (alt_log_meter (fast_coefficient_to_dB (y))));
|
||||
} else if (y < 0.0) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * -alt_log_meter (fast_coefficient_to_dB (-y))));
|
||||
context->line_to (i + 0.5, position (alt_log_meter (fast_coefficient_to_dB (-y))));
|
||||
} else {
|
||||
context->line_to (i + 0.5, position (0.0));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < _n_peaks; ++i) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * _peaks[i].max));
|
||||
context->line_to (i + 0.5, position (_peaks[i].max));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -469,16 +478,16 @@ WaveView::CacheEntry::image ()
|
|||
for (int i = _n_peaks-1; i >= 0; --i) {
|
||||
Coord y = _peaks[i].min;
|
||||
if (y > 0.0) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * alt_log_meter (fast_coefficient_to_dB (y))));
|
||||
context->line_to (i + 0.5, position (alt_log_meter (fast_coefficient_to_dB (y))));
|
||||
} else if (y < 0.0) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * -alt_log_meter (fast_coefficient_to_dB (-y))));
|
||||
context->line_to (i + 0.5, position (-alt_log_meter (fast_coefficient_to_dB (-y))));
|
||||
} else {
|
||||
context->line_to (i + 0.5, position (0.0));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int i = _n_peaks-1; i >= 0; --i) {
|
||||
context->line_to (i + 0.5, position (_wave_view->amplitude() * _peaks[i].min));
|
||||
context->line_to (i + 0.5, position (_peaks[i].min));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue