X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fledger-line-spanner.cc;h=8aeb71aab2004dc661f4cac41278c2993299fb2d;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=42d32b496af7bb5ec7a15f1b52cdbc4ea84959c8;hpb=368ad44455b251754e273a8392fe220f3c64d61f;p=lilypond.git diff --git a/lily/ledger-line-spanner.cc b/lily/ledger-line-spanner.cc index 42d32b496a..8aeb71aab2 100644 --- a/lily/ledger-line-spanner.cc +++ b/lily/ledger-line-spanner.cc @@ -161,7 +161,9 @@ struct Ledger_request Interval max_head_extent_; int max_position_; vector heads_; - map ledger_extents_; + // The map's keys are vertical ledger line positions. The values are + // vectors of the x-extents of ledger lines. + map > ledger_extents_; Ledger_request () { max_ledger_extent_.set_empty (); @@ -211,10 +213,9 @@ Ledger_line_spanner::print (SCM smob) for (vsize i = heads.size (); i--;) { Item *h = dynamic_cast (heads[i]); - int pos = Staff_symbol_referencer::get_rounded_position (h); vector ledger_positions = - Staff_symbol::ledger_positions (staff, pos); + Staff_symbol::ledger_positions (staff, pos, h); // We work with all notes that produce ledgers and any notes that // fall outside the staff that do not produce ledgers, such as @@ -295,9 +296,7 @@ Ledger_line_spanner::print (SCM smob) // Iterate through ledger requests and the data they have about each // note head to generate the final extents for all ledger lines. - // Note heads that are different widths produce different ledger - // extents and these are merged so the widest extent prevails - // (the union of the intervals) for each ledger line. + // Note heads of different widths produce different ledger extents. for (Ledger_requests::iterator i (reqs.begin ()); i != reqs.end (); i++) { @@ -338,10 +337,25 @@ Ledger_line_spanner::print (SCM smob) natural + downstem. */ } + // When the extents of two ledgers at the same + // vertical position overlap horizontally, we merge + // them together to produce a single stencil. In rare + // cases they do not overlap and we do not merge them. + if (lr.ledger_extents_.find (lpos) == lr.ledger_extents_.end ()) - lr.ledger_extents_[lpos] = x_extent; + // Found nothing for this lpos. + lr.ledger_extents_[lpos].push_back(x_extent); else - lr.ledger_extents_[lpos].unite (x_extent); + { + vector &extents = lr.ledger_extents_.find (lpos)->second; + for (vsize e = 0; e < extents.size (); e++) + { + if (intersection (extents[e], x_extent).is_empty ()) + extents.push_back (x_extent); + else + extents[e].unite (x_extent); + } + } } } } @@ -350,36 +364,34 @@ Ledger_line_spanner::print (SCM smob) // Create the stencil for the ledger line spanner by iterating // through the ledger requests and their data on ledger extents. Stencil ledgers; - Real ledgerlinethickness - = Staff_symbol::get_ledger_line_thickness (staff); + Real thickness = Staff_symbol::get_ledger_line_thickness (staff); + Real half_thickness = thickness * 0.5; + Interval y_extent = Interval (-half_thickness, half_thickness); - for (Ledger_requests::iterator i (reqs.begin ()); - i != reqs.end (); i++) + for (Ledger_requests::iterator i (reqs.begin ()); i != reqs.end (); i++) { for (DOWN_and_UP (d)) { - map &lex = i->second[d].ledger_extents_; - for (map::iterator k = lex.begin (); + map > &lex = i->second[d].ledger_extents_; + for (map >::iterator k = lex.begin (); k != lex.end (); k++) { - Real blotdiameter = ledgerlinethickness; Real lpos = k->first; - Interval x_extent = k->second; - Interval y_extent - = Interval (-0.5 * (ledgerlinethickness), - +0.5 * (ledgerlinethickness)); - Stencil ledger_line - = Lookup::round_filled_box (Box (x_extent, y_extent), blotdiameter); - - ledger_line.translate_axis ( lpos * halfspace, Y_AXIS); - ledgers.add_stencil (ledger_line); + vector &x_extents = k->second; + + for (vsize n = 0; n < x_extents.size (); n++) + { + // thickness (ledger line thickness) is the blot diameter + Stencil line = Lookup::round_filled_box (Box (x_extents[n], y_extent), + thickness); + + line.translate_axis (lpos * halfspace, Y_AXIS); + ledgers.add_stencil (line); + } } } } - - ledgers.translate_axis (-me->relative_coordinate (common_x, X_AXIS), - X_AXIS); - + ledgers.translate_axis (-me->relative_coordinate (common_x, X_AXIS), X_AXIS); return ledgers.smobbed_copy (); }