-#include "math.h" // rint
-
-/*
- This function is a patched and hopefully much more understandable
- rewrite of Note_head::ledger_line (). It still has some
- bugs/limitations:
- *
- (1) The term thick/2 probably should be thick*2 (probably a bug,
- see the code below).
- *
- (2) The minimal width of the resulting ledger line equals the width
- of the noteheads-ledgerending symbol (a limitation):
- *
- (---- left ledger ending
- ----) right ledger ending
- (---) resulting ledger line (just ok)
- *
- If x_extent ("xwid" in Note_head) is less than the width of the
- ledger ending, the width of the total ledger line is even *greater*
- than the width of a ledger ending (I would call this a bug). In
- the below code, the condition "if (x_extent.length () >
- slice_x_extent.length ())" avoids outputting the left ending in such
- cases (rather a silly workaround, but better than nothing).
- *
- (---- left ledger ending
- ----) right ledger ending
- (-) desired ledger line
- ------- resulting ledger line (too long)
- ----) resulting ledger line with additional "if" (still too long)
- *
- The algorithm works properly only for a desired ledger line width
- greater than the width of the ledger ending:
- *
- (---- left ledger ending
- ----) right ledger ending
- (------) desired ledger line
- (------) resulting ledger line (ok)
- *
- * (3) The thickness of the ledger line is fixed (limitation).
- */
-Molecule
-Custos::create_ledger_line (Interval x_extent, Grob *me)
-{
- Molecule line;
- Molecule slice = Font_interface::get_default_font (me)->find_by_name ("noteheads-ledgerending");
- Interval slice_x_extent = slice.extent (X_AXIS);
- Interval slice_y_extent = slice.extent (Y_AXIS);
-
- // Create left ending of ledger line.
- Molecule left_ending = slice;
- left_ending.translate_axis (x_extent[LEFT] - slice_x_extent[LEFT], X_AXIS);
- if (x_extent.length () > slice_x_extent.length ())
- line.add_molecule (left_ending);
-
- // Create right ending of ledger line.
- Molecule right_ending = slice;
- right_ending.translate_axis (x_extent[RIGHT] - slice_x_extent[RIGHT],
- X_AXIS);
- line.add_molecule (right_ending);
-
- // Fill out space between left and right ending of ledger line by
- // lining up a series of slices in a row between them.
- Molecule fill_out_slice = left_ending;
- Real thick = slice_y_extent.length ();
- Real delta_x = slice_x_extent.length () - thick;
- Real xpos = x_extent [LEFT] + 2*delta_x + thick/2; // TODO: check: thick*2?
- while (xpos <= x_extent[RIGHT])
- {
- fill_out_slice.translate_axis (delta_x, X_AXIS);
- line.add_molecule (fill_out_slice);
- xpos += delta_x;
- }
-
- return line;
-}