X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftempo_lines.cc;h=4c46389b1058ec5b530be023bc94834827fabdb7;hb=b52d8e515163509ec5d05ca3be7fbe1535852bf1;hp=083b7a5cca8b4db2049dc4b784d6acf490cea4b0;hpb=e5888d398350b26ba2cdc634cc9791e90b4fc6b6;p=ardour.git diff --git a/gtk2_ardour/tempo_lines.cc b/gtk2_ardour/tempo_lines.cc index 083b7a5cca..4c46389b10 100644 --- a/gtk2_ardour/tempo_lines.cc +++ b/gtk2_ardour/tempo_lines.cc @@ -17,52 +17,46 @@ */ -#include "canvas/line.h" +#include "pbd/compose.h" + #include "canvas/canvas.h" #include "canvas/debug.h" + #include "tempo_lines.h" #include "ardour_ui.h" +#include "public_editor.h" using namespace std; -TempoLines::TempoLines (ArdourCanvas::Canvas& canvas, ArdourCanvas::Group* group, double h) - : _canvas (canvas) - , _group (group) - , _height (h) +TempoLines::TempoLines (ArdourCanvas::Container* group, double) + : lines (group, ArdourCanvas::LineSet::Vertical) { + lines.set_extent (ArdourCanvas::COORD_MAX); } void TempoLines::tempo_map_changed() { - /* remove all lines from the group, put them in the cache (to avoid - * unnecessary object destruction+construction later), and clear _lines - */ - - _group->clear (); - _cache.insert (_cache.end(), _lines.begin(), _lines.end()); - _lines.clear (); + lines.clear (); } void TempoLines::show () { - _group->show (); + lines.show (); } void TempoLines::hide () { - _group->hide (); + lines.hide (); } void TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin, - const ARDOUR::TempoMap::BBTPointList::const_iterator& end, - double samples_per_pixel) + const ARDOUR::TempoMap::BBTPointList::const_iterator& end) { ARDOUR::TempoMap::BBTPointList::const_iterator i; - ArdourCanvas::Rect const visible = _canvas.visible_area (); double beat_density; uint32_t beats = 0; @@ -76,51 +70,30 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin, bars = (*i).bar - (*begin).bar; beats = distance (begin, end) - bars; - beat_density = (beats * 10.0f) / visible.width (); + beat_density = (beats * 10.0f) / lines.canvas()->width(); if (beat_density > 4.0f) { /* if the lines are too close together, they become useless */ - tempo_map_changed(); + lines.clear (); return; } - tempo_map_changed (); + lines.clear (); for (i = begin; i != end; ++i) { if ((*i).is_bar()) { - color = ARDOUR_UI::config()->get_canvasvar_MeasureLineBar(); + color = ARDOUR_UI::config()->get_MeasureLineBar(); } else { - if (beat_density > 2.0) { + if (beat_density > 0.3) { continue; /* only draw beat lines if the gaps between beats are large. */ } - color = ARDOUR_UI::config()->get_canvasvar_MeasureLineBeat(); - } - - ArdourCanvas::Coord xpos = rint(((framepos_t)(*i).frame) / (double)samples_per_pixel); - - ArdourCanvas::Line* line; - - if (!_cache.empty()) { - line = _cache.back (); - _cache.pop_back (); - line->reparent (_group); - } else { - line = new ArdourCanvas::Line (_group); - CANVAS_DEBUG_NAME (line, "tempo measure line"); - line->set_ignore_events (true); + color = ARDOUR_UI::config()->get_MeasureLineBeat(); } - /* move to 0.5 offset to ensure single pixel lines (see Cairo - * FAQ for info on why we do this). - */ + ArdourCanvas::Coord xpos = PublicEditor::instance().sample_to_pixel_unrounded ((*i).frame); - line->set_x0 (xpos + 0.5); - line->set_x1 (xpos + 0.5); - line->set_y0 (0.0); - line->set_y1 (_height); - line->set_outline_color (color); - line->show (); + lines.add (xpos, 1.0, color); } }