X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbreak-alignment-interface.cc;h=a1d7606445353ece111cbf221a4bc9eda9257f53;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=a471a7ba9fab543184b0108fe5e05abd23b0a03c;hpb=4bb29573149a0ffa1f881c5e38a0fe68e9e76b67;p=lilypond.git diff --git a/lily/break-alignment-interface.cc b/lily/break-alignment-interface.cc index a471a7ba9f..a1d7606445 100644 --- a/lily/break-alignment-interface.cc +++ b/lily/break-alignment-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ #include "output-def.hh" #include "paper-column.hh" #include "pointer-group-interface.hh" -#include "self-alignment-interface.hh" #include "side-position-interface.hh" #include "warn.hh" @@ -59,7 +58,7 @@ Break_alignment_interface::ordered_elements (Grob *grob) SCM order = break_align_order (me); - if (order == SCM_BOOL_F) + if (scm_is_false (order)) return elts; vector writable_elts (elts); @@ -74,7 +73,7 @@ Break_alignment_interface::ordered_elements (Grob *grob) for (vsize i = writable_elts.size (); i--;) { Grob *g = writable_elts[i]; - if (g && sym == g->get_property ("break-align-symbol")) + if (g && scm_is_eq (sym, g->get_property ("break-align-symbol"))) { new_elts.push_back (g); writable_elts.erase (writable_elts.begin () + i); @@ -95,7 +94,7 @@ MAKE_SCHEME_CALLBACK (Break_alignment_interface, calc_positioning_done, 1) SCM Break_alignment_interface::calc_positioning_done (SCM smob) { - Grob *grob = unsmob_grob (smob); + Grob *grob = unsmob (smob); Item *me = dynamic_cast (grob); me->set_property ("positioning-done", SCM_BOOL_T); @@ -103,13 +102,10 @@ Break_alignment_interface::calc_positioning_done (SCM smob) vector elems = ordered_elements (me); vector extents; - int last_nonempty = -1; for (vsize i = 0; i < elems.size (); i++) { Interval y = elems[i]->extent (elems[i], X_AXIS); extents.push_back (y); - if (!y.is_empty ()) - last_nonempty = i; } vsize idx = 0; @@ -148,8 +144,8 @@ Break_alignment_interface::calc_positioning_done (SCM smob) Grob *elt = elts[i]; if (edge_idx == VPOS - && (elt->get_property ("break-align-symbol") - == ly_symbol2scm ("left-edge"))) + && scm_is_eq (elt->get_property ("break-align-symbol"), + ly_symbol2scm ("left-edge"))) edge_idx = idx; SCM l = elt->get_property ("space-alist"); @@ -178,7 +174,7 @@ Break_alignment_interface::calc_positioning_done (SCM smob) } } - if (rsym == ly_symbol2scm ("left-edge")) + if (scm_is_eq (rsym, ly_symbol2scm ("left-edge"))) edge_idx = next_idx; SCM entry = SCM_EOL; @@ -193,12 +189,12 @@ Break_alignment_interface::calc_positioning_done (SCM smob) sym_string = ly_symbol2string (rsym); string orig_string; - if (unsmob_grob (l->get_property ("cause"))) - orig_string = unsmob_grob (l->get_property ("cause"))->name (); + if (unsmob (l->get_property ("cause"))) + orig_string = unsmob (l->get_property ("cause"))->name (); - programming_error (_f ("No spacing entry from %s to `%s'", - orig_string.c_str (), - sym_string.c_str ())); + programming_error (to_string ("No spacing entry from %s to `%s'", + orig_string.c_str (), + sym_string.c_str ())); } Real distance = 1.0; @@ -214,11 +210,11 @@ Break_alignment_interface::calc_positioning_done (SCM smob) if (r) { - if (type == ly_symbol2scm ("extra-space")) + if (scm_is_eq (type, ly_symbol2scm ("extra-space"))) offsets[next_idx] = extents[idx][RIGHT] + distance - extents[next_idx][LEFT]; /* should probably junk minimum-space */ - else if (type == ly_symbol2scm ("minimum-space")) + else if (scm_is_eq (type, ly_symbol2scm ("minimum-space"))) offsets[next_idx] = max (extents[idx][RIGHT], distance); } else @@ -265,9 +261,9 @@ MAKE_SCHEME_CALLBACK (Break_alignable_interface, self_align_callback, 1) SCM Break_alignable_interface::self_align_callback (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Item *alignment = dynamic_cast (me->get_parent (X_AXIS)); - if (!Break_alignment_interface::has_interface (alignment)) + if (!has_interface (alignment)) return scm_from_int (0); SCM symbol_list = me->get_property ("break-align-symbols"); @@ -281,9 +277,10 @@ Break_alignable_interface::self_align_callback (SCM grob) SCM sym = scm_car (symbol_list); for (vsize i = 0; i < elements.size (); i++) { - if (elements[i]->get_property ("break-align-symbol") == sym) + if (scm_is_eq (sym, elements[i]->get_property ("break-align-symbol"))) { if (Item::break_visible (elements[i]) + // TODO SCM: simplify syntax? && !elements[i]->extent (elements[i], X_AXIS).is_empty ()) { break_aligned_grob = i; @@ -312,7 +309,7 @@ MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_average_anchor, 1) SCM Break_aligned_interface::calc_average_anchor (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Real avg = 0.0; int count = 0; @@ -335,7 +332,7 @@ MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_extent_aligned_anchor, 1) SCM Break_aligned_interface::calc_extent_aligned_anchor (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real alignment = robust_scm2double (me->get_property ("break-align-anchor-alignment"), 0.0); Interval iv = me->extent (me, X_AXIS); @@ -350,7 +347,7 @@ SCM Break_aligned_interface::calc_break_visibility (SCM smob) { /* a BreakAlignGroup is break-visible if it has one element that is break-visible */ - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM ret = scm_c_make_vector (3, SCM_EOL); extract_grob_set (me, "elements", elts); for (int dir = 0; dir <= 2; dir++) @@ -367,6 +364,42 @@ Break_aligned_interface::calc_break_visibility (SCM smob) return ret; } +ADD_INTERFACE (Break_alignment_interface, + "The object that performs break alignment.\n" + "\n" + "Three interfaces deal specifically with break alignment:\n" + "@enumerate\n" + "@item break-alignment-interface (this one),\n" + "@item @ref{break-alignable-interface}, and\n" + "@item @ref{break-aligned-interface}.\n" + "@end enumerate\n" + "\n" + " Each of these interfaces supports grob properties that use" + " @w{@emph{break-align symbols}}, which are Scheme symbols that" + " are used to specify the alignment, ordering, and spacing of" + " certain notational elements (@q{breakable}@tie{}items)." + "\n" + "@subsubheading Available break-align symbols:\n" + "\n" + "@example\n" + "ambitus\n" + "breathing-sign\n" + "clef\n" + "cue-clef\n" + "cue-end-clef\n" + "custos\n" + "key-cancellation\n" + "key-signature\n" + "left-edge\n" + "staff-bar\n" + "time-signature\n" + "@end example", + + /* properties */ + "positioning-done " + "break-align-orders " + ); + ADD_INTERFACE (Break_alignable_interface, "Object that is aligned on a break alignment.", @@ -376,31 +409,7 @@ ADD_INTERFACE (Break_alignable_interface, ); ADD_INTERFACE (Break_aligned_interface, - "Items that are aligned in prefatory matter.\n" - "\n" - "The spacing of these items is controlled by the" - " @code{space-alist} property. It contains a list" - " @code{break-align-symbol}s with a specification of the" - " associated space. The space specification can be\n" - "\n" - "@table @code\n" - "@item (minimum-space . @var{spc}))\n" - "Pad space until the distance is @var{spc}.\n" - "@item (fixed-space . @var{spc})\n" - "Set a fixed space.\n" - "@item (semi-fixed-space . @var{spc})\n" - "Set a space. Half of it is fixed and half is stretchable." - " (does not work at start of line. fixme)\n" - "@item (extra-space . @var{spc})\n" - "Add @var{spc} amount of space.\n" - "@end table\n" - "\n" - "Special keys for the alist are @code{first-note} and" - " @code{next-note}, signifying the first note on a line, and" - " the next note halfway a line.\n" - "\n" - "Rules for this spacing are much more complicated than this." - " See [Wanske] page 126--134, [Ross] page 143--147.", + "Breakable items.", /* properties */ "break-align-anchor " @@ -408,12 +417,3 @@ ADD_INTERFACE (Break_aligned_interface, "break-align-symbol " "space-alist " ); - -ADD_INTERFACE (Break_alignment_interface, - "The object that performs break alignment. See" - " @ref{break-aligned-interface}.", - - /* properties */ - "positioning-done " - "break-align-orders " - );