X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-spanner.cc;h=b17a053a559f0528c3b8ee11b82222ad8eb2bcec;hb=89bf299597169eeaa5ed7a215b6e808fa849c8cd;hp=1669899c181c4a3b88cd20234f2ca845a89c8939;hpb=ee513a2f7d18fc8d43e1c291350ed81856b0192d;p=lilypond.git diff --git a/lily/tuplet-spanner.cc b/lily/tuplet-spanner.cc index 1669899c18..b17a053a55 100644 --- a/lily/tuplet-spanner.cc +++ b/lily/tuplet-spanner.cc @@ -10,38 +10,43 @@ #include "beam.hh" #include "box.hh" #include "debug.hh" -#include "lookup.hh" +#include "font-interface.hh" #include "molecule.hh" #include "paper-column.hh" #include "paper-def.hh" +#include "text-item.hh" #include "tuplet-spanner.hh" #include "stem.hh" #include "note-column.hh" #include "dimensions.hh" #include "group-interface.hh" #include "directional-element-interface.hh" +#include "spanner.hh" - -Tuplet_spanner::Tuplet_spanner () +void +Tuplet_spanner::set_interface (Grob*me) { - set_elt_property ("beams", SCM_EOL); - set_elt_property ("columns", SCM_EOL); + me->set_interface (ly_symbol2scm ("tuplet-bracket")); } /* TODO. */ -Molecule -Tuplet_spanner::do_brew_molecule () const + +MAKE_SCHEME_CALLBACK(Tuplet_spanner,brew_molecule,1); + +SCM +Tuplet_spanner::brew_molecule (SCM smob) { + Grob *me= unsmob_grob (smob); Molecule mol; // Default behaviour: number always, bracket when no beam! - bool par_beam = to_boolean (get_elt_property ("parallel-beam")); + bool par_beam = to_boolean (me->get_grob_property ("parallel-beam")); bool bracket_visibility = !par_beam; bool number_visibility = true; - SCM bracket = get_elt_property ("tuplet-bracket-visibility"); + SCM bracket = me->get_grob_property ("tuplet-bracket-visibility"); if (gh_boolean_p (bracket)) { bracket_visibility = gh_scm2bool (bracket); @@ -49,7 +54,7 @@ Tuplet_spanner::do_brew_molecule () const else if (bracket == ly_symbol2scm ("if-no-beam")) bracket_visibility = !par_beam; - SCM numb = get_elt_property ("tuplet-number-visibility"); + SCM numb = me->get_grob_property ("tuplet-number-visibility"); if (gh_boolean_p (numb)) { number_visibility = gh_scm2bool (numb); @@ -57,24 +62,22 @@ Tuplet_spanner::do_brew_molecule () const else if (bracket == ly_symbol2scm ("if-no-beam")) number_visibility = !par_beam; - if (gh_pair_p (get_elt_property ("columns"))) + if (gh_pair_p (me->get_grob_property ("columns"))) { - Link_array column_arr= - Group_interface__extract_elements (this, (Note_column*)0, "columns"); + Link_array column_arr= + Pointer_group_interface__extract_elements (me, (Grob*)0, "columns"); - Real ncw = column_arr.top ()->extent(X_AXIS).length (); - Real w = spanner_length () + ncw; + Real ncw = column_arr.top ()->extent(column_arr.top (), X_AXIS).length (); + Real w = dynamic_cast(me)->spanner_length () + ncw; - - Real staff_space = paper_l ()->get_var ("interline"); - Direction dir = directional_element (this).get (); - Real dy = gh_scm2double (get_elt_property ("delta-y")); - SCM number = get_elt_property ("text"); + Real staff_space = 1.0; + Direction dir = Directional_element_interface::get (me); + Real dy = gh_scm2double (me->get_grob_property ("delta-y")); + SCM number = me->get_grob_property ("text"); if (gh_string_p (number) && number_visibility) { - Molecule - num (lookup_l ()->text ("italic", - ly_scm2string (number), paper_l ())); + SCM properties = Font_interface::font_alist_chain (me); + Molecule num = Text_item::text2molecule (me, number, properties); num.align_to (X_AXIS, CENTER); num.translate_axis (w/2, X_AXIS); num.align_to (Y_AXIS, CENTER); @@ -85,87 +88,83 @@ Tuplet_spanner::do_brew_molecule () const mol.add_molecule (num); } - Real thick = paper_l ()->get_var ("tuplet_thick"); if (bracket_visibility) { - Real gap = paper_l () -> get_var ("tuplet_spanner_gap"); - Real height = staff_space; + Real lt = me->paper_l ()->get_var ("stafflinethickness"); + + SCM thick = me->get_grob_property ("thick"); + SCM gap = me->get_grob_property ("number-gap"); + SCM at =gh_list(ly_symbol2scm ("tuplet"), - gh_double2scm (height), - gh_double2scm (gap), - gh_double2scm (w), - gh_double2scm (dy), - gh_double2scm (thick), - gh_int2scm (dir), - SCM_UNDEFINED); + gh_double2scm (1.0), + gap, + gh_double2scm (w), + gh_double2scm (dy), + gh_double2scm (gh_scm2double (thick)* lt), + gh_int2scm (dir), + SCM_UNDEFINED); Box b; mol.add_molecule (Molecule (b, at)); } - - mol.translate_axis (dir * staff_space, Y_AXIS); - } - return mol; -} - -void -Tuplet_spanner::do_add_processing () -{ - if (gh_pair_p (get_elt_property ("columns"))) - { - Link_array column_arr= - Group_interface__extract_elements (this, (Note_column*)0, "columns"); - - set_bound (LEFT, column_arr[0]); - set_bound (RIGHT, column_arr.top ()); } + return mol.smobbed_copy (); } + /* use first -> last note for slope, and then correct for disturbing notes in between. */ void -Tuplet_spanner::calc_position_and_height (Real *offset, Real * dy) const +Tuplet_spanner::calc_position_and_height (Grob*me,Real *offset, Real * dy) { - Link_array column_arr= - Group_interface__extract_elements (this, (Note_column*)0, "columns"); + Link_array column_arr= + Pointer_group_interface__extract_elements (me, (Grob*)0, "columns"); + - - Direction d = directional_element (this).get (); + Grob * commony = me->common_refpoint (me->get_grob_property ("columns"), Y_AXIS); + Grob * commonx = me->common_refpoint (me->get_grob_property ("columns"), X_AXIS); + + Direction d = Directional_element_interface::get (me); /* Use outer non-rest columns to determine slope */ int l = 0; - while (l rest_b()) + while (l = l && column_arr[r]->rest_b()) + while (r >= l && Note_column::rest_b(column_arr[r])) r--; if (l < r) { - *dy = column_arr[r]->extent (Y_AXIS) [d] - - column_arr[l]->extent (Y_AXIS) [d]; + *dy = column_arr[r]->extent (commony, Y_AXIS) [d] + - column_arr[l]->extent (commony, Y_AXIS) [d] ; } else * dy = 0; *offset = - d * infinity_f; + + if (!column_arr.size ()) + return; - Real x0 = column_arr[0]->relative_coordinate (0, X_AXIS); - Real x1 = column_arr.top ()->relative_coordinate (0, X_AXIS); + Real x0 = column_arr[0]->relative_coordinate (commonx, X_AXIS); + Real x1 = column_arr.top ()->relative_coordinate (commonx, X_AXIS); Real factor = column_arr.size () > 1 ? 1/(x1 - x0) : 1.0; for (int i = 0; i < column_arr.size (); i++) { - Real notey = column_arr[i]->extent (Y_AXIS)[d]; - Real x = column_arr[i]->relative_coordinate (0, X_AXIS) - x0; + Real notey = column_arr[i]->extent (commony, Y_AXIS)[d] + - me->relative_coordinate (commony, Y_AXIS); + + Real x = column_arr[i]->relative_coordinate (commonx, X_AXIS) - x0; Real tuplety = *dy * x * factor; if (notey * d > (*offset + tuplety) * d) @@ -177,64 +176,69 @@ Tuplet_spanner::calc_position_and_height (Real *offset, Real * dy) const use first -> last note for slope, */ void -Tuplet_spanner::calc_dy (Real * dy) const +Tuplet_spanner::calc_dy (Grob*me,Real * dy) { - Link_array column_arr= - Group_interface__extract_elements (this, (Note_column*)0, "columns"); + Link_array column_arr= + Pointer_group_interface__extract_elements (me, (Grob*)0, "columns"); - - Direction d = directional_element (this).get (); - *dy = column_arr.top ()->extent (Y_AXIS) [d] - - column_arr[0]->extent (Y_AXIS) [d]; + /* + ugh. refps. + */ + Direction d = Directional_element_interface::get (me); + *dy = column_arr.top ()->extent (column_arr.top (), Y_AXIS) [d] + - column_arr[0]->extent (column_arr[0], Y_AXIS) [d]; } +MAKE_SCHEME_CALLBACK(Tuplet_spanner,after_line_breaking,1); -void -Tuplet_spanner::after_line_breaking () +SCM +Tuplet_spanner::after_line_breaking (SCM smob) { + Grob * me = unsmob_grob (smob); Link_array column_arr= - Group_interface__extract_elements (this, (Note_column*)0, "columns"); + Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns"); + Spanner *sp = dynamic_cast (me); + if (!column_arr.size ()) { - set_elt_property ("transparent", SCM_BOOL_T); - set_empty (X_AXIS); - set_empty (Y_AXIS); + me->suicide (); + return SCM_UNSPECIFIED; } - Direction d = directional_element (this).get (); + Direction d = Directional_element_interface::get (me); if (!d) { - d = get_default_dir (); - directional_element (this).set (d); + d = Tuplet_spanner::get_default_dir (me); + Directional_element_interface::set (me, d); } Real dy, offset; -calc_position_and_height (&offset,&dy); - // calc_position (&offset, dy); + calc_position_and_height (me,&offset,&dy); - set_elt_property ("delta-y", gh_double2scm (dy)); + me->set_grob_property ("delta-y", gh_double2scm (dy)); - translate_axis (offset, Y_AXIS); + me->translate_axis (offset, Y_AXIS); - if (scm_ilength (get_elt_property ("beams")) == 1) + if (scm_ilength (me->get_grob_property ("beams")) == 1) { - SCM bs = get_elt_property ("beams"); - Score_element *b = unsmob_element (gh_car (bs)); - Beam * beam_l = dynamic_cast (b); - if (!broken_b () - && get_bound (LEFT)->column_l () == beam_l->get_bound (LEFT)->column_l () - && get_bound (RIGHT)->column_l () == beam_l->get_bound (RIGHT)->column_l ()) - set_elt_property ("parallel-beam", SCM_BOOL_T); + SCM bs = me->get_grob_property ("beams"); + Grob *b = unsmob_grob (gh_car (bs)); + Spanner * beam_l = dynamic_cast (b); + if (!sp->broken_b () + && sp->get_bound (LEFT)->column_l () == beam_l->get_bound (LEFT)->column_l () + && sp->get_bound (RIGHT)->column_l () == beam_l->get_bound (RIGHT)->column_l ()) + me->set_grob_property ("parallel-beam", SCM_BOOL_T); } + return SCM_UNSPECIFIED; } Direction -Tuplet_spanner::get_default_dir () const +Tuplet_spanner::get_default_dir (Grob*me) { Direction d = UP; - SCM dir_sym =get_elt_property ("dir-forced"); + SCM dir_sym =me->get_grob_property ("dir-forced"); if (isdir_b (dir_sym)) { d= to_dir (dir_sym); @@ -243,11 +247,10 @@ Tuplet_spanner::get_default_dir () const } d = UP ; - for (SCM s = get_elt_property ("columns"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = me->get_grob_property ("columns"); gh_pair_p (s); s = gh_cdr (s)) { - Score_element * sc = unsmob_element (gh_car (s)); - Note_column * nc = dynamic_cast (sc); - if (nc->dir () < 0) + Grob * nc = unsmob_grob (gh_car (s)); + if (Note_column::dir (nc) < 0) { d = DOWN; break; @@ -258,20 +261,19 @@ Tuplet_spanner::get_default_dir () const } void -Tuplet_spanner::add_beam (Beam *b) +Tuplet_spanner::add_beam (Grob*me, Grob *b) { - add_dependency (b); - Group_interface gi (this, "beams"); - gi.add_element (b); + me->add_dependency (b); + Pointer_group_interface::add_element (me, "beams",b); } void -Tuplet_spanner::add_column (Note_column*n) +Tuplet_spanner::add_column (Grob*me, Item*n) { - Group_interface gi (this, "columns"); - gi.add_element (n); + Pointer_group_interface::add_element (me, "columns",n); + me->add_dependency (n); - add_dependency (n); + add_bound_item (dynamic_cast (me), n); }