LEFT | RIGHT |
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 1996--2012 Han-Wen Nienhuys <hanwen@xs4all.nl> | 4 Copyright (C) 1996--2012 Han-Wen Nienhuys <hanwen@xs4all.nl> |
5 | 5 |
6 LilyPond is free software: you can redistribute it and/or modify | 6 LilyPond is free software: you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation, either version 3 of the License, or | 8 the Free Software Foundation, either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "lookup.hh" | 29 #include "lookup.hh" |
30 #include "main.hh" | 30 #include "main.hh" |
31 #include "output-def.hh" | 31 #include "output-def.hh" |
32 #include "page-layout-problem.hh" | 32 #include "page-layout-problem.hh" |
33 #include "paper-column.hh" | 33 #include "paper-column.hh" |
34 #include "paper-score.hh" | 34 #include "paper-score.hh" |
35 #include "paper-system.hh" | 35 #include "paper-system.hh" |
36 #include "pointer-group-interface.hh" | 36 #include "pointer-group-interface.hh" |
37 #include "skyline-pair.hh" | 37 #include "skyline-pair.hh" |
38 #include "staff-symbol-referencer.hh" | 38 #include "staff-symbol-referencer.hh" |
| 39 #include "system-start-delimiter.hh" |
39 #include "text-interface.hh" | 40 #include "text-interface.hh" |
40 #include "warn.hh" | 41 #include "warn.hh" |
41 #include "unpure-pure-container.hh" | 42 #include "unpure-pure-container.hh" |
42 | 43 |
43 System::System (System const &src) | 44 System::System (System const &src) |
44 : Spanner (src) | 45 : Spanner (src) |
45 { | 46 { |
46 all_elements_ = 0; | 47 all_elements_ = 0; |
47 pscore_ = 0; | 48 pscore_ = 0; |
48 rank_ = 0; | 49 rank_ = 0; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 | 200 |
200 debug_output (_f ("Element count %d", count + element_count ()) + "\n"); | 201 debug_output (_f ("Element count %d", count + element_count ()) + "\n"); |
201 } | 202 } |
202 | 203 |
203 SCM | 204 SCM |
204 System::get_broken_system_grobs () | 205 System::get_broken_system_grobs () |
205 { | 206 { |
206 SCM ret = SCM_EOL; | 207 SCM ret = SCM_EOL; |
207 for (vsize i = 0; i < broken_intos_.size (); i++) | 208 for (vsize i = 0; i < broken_intos_.size (); i++) |
208 ret = scm_cons (broken_intos_[i]->self_scm (), ret); | 209 ret = scm_cons (broken_intos_[i]->self_scm (), ret); |
209 return scm_reverse (ret); | 210 return scm_reverse_x (ret, SCM_EOL); |
210 } | 211 } |
211 | 212 |
212 SCM | 213 SCM |
213 System::get_paper_systems () | 214 System::get_paper_systems () |
214 { | 215 { |
215 SCM lines = scm_c_make_vector (broken_intos_.size (), SCM_EOL); | 216 SCM lines = scm_c_make_vector (broken_intos_.size (), SCM_EOL); |
216 for (vsize i = 0; i < broken_intos_.size (); i++) | 217 for (vsize i = 0; i < broken_intos_.size (); i++) |
217 { | 218 { |
218 debug_output ("[", false); | 219 debug_output ("[", false); |
219 | 220 |
(...skipping 27 matching lines...) Expand all Loading... |
247 if (s->original ()) | 248 if (s->original ()) |
248 { | 249 { |
249 Spanner *orig = dynamic_cast<Spanner *>(s->original ()); | 250 Spanner *orig = dynamic_cast<Spanner *>(s->original ()); |
250 at_bat = spanner_placement == LEFT ? orig->broken_intos_[0] : orig
->broken_intos_.back (); | 251 at_bat = spanner_placement == LEFT ? orig->broken_intos_[0] : orig
->broken_intos_.back (); |
251 pos = at_bat->spanned_rank_interval ()[RIGHT]; | 252 pos = at_bat->spanned_rank_interval ()[RIGHT]; |
252 } | 253 } |
253 } | 254 } |
254 | 255 |
255 if (Item *item = dynamic_cast<Item *>(at_bat)) | 256 if (Item *item = dynamic_cast<Item *>(at_bat)) |
256 { | 257 { |
| 258 /* |
| 259 We use this to weed out grobs that fall at the end |
| 260 of the line when we want grobs at the beginning. |
| 261 */ |
| 262 end_of_line_visible = item->break_status_dir () == LEFT; |
| 263 |
257 if (!Item::break_visible (item)) | 264 if (!Item::break_visible (item)) |
258 continue; | 265 continue; |
259 // safeguard to bring down the column rank so that end of line footnot
es show up on the correct line | 266 // safeguard to bring down the column rank so that end of line footnot
es show up on the correct line |
260 if (pos == int (start) && item->break_status_dir () != RIGHT) | 267 if (pos == int (start) && item->break_status_dir () != RIGHT) |
261 continue; | 268 continue; |
262 if (pos == int (end) && item->break_status_dir () != LEFT) | 269 if (pos == int (end) && item->break_status_dir () != LEFT) |
263 continue; | 270 continue; |
264 if (pos != int (end) && pos != int (start) && item->break_status_dir (
) != CENTER) | 271 if (pos != int (end) && pos != int (start) && item->break_status_dir (
) != CENTER) |
265 continue; | 272 continue; |
266 } | 273 } |
267 | 274 |
268 if (pos < int (start)) | 275 if (pos < int (start)) |
269 continue; | 276 continue; |
270 if (pos > int (end)) | 277 if (pos > int (end)) |
271 continue; | 278 continue; |
272 if (pos == int (start) && end_of_line_visible) | 279 if (pos == int (start) && end_of_line_visible) |
273 continue; | 280 continue; |
274 if (pos == int (end) && !end_of_line_visible) | 281 if (pos == int (end) && !end_of_line_visible) |
275 continue; | 282 continue; |
276 if (!at_bat->is_live ()) | 283 if (!at_bat->is_live ()) |
| 284 continue; |
| 285 /* |
| 286 TODO |
| 287 Sometimes, there are duplicate entries in the all_elements_ |
| 288 list. In a separate patch, this practice should be squashed |
| 289 so that the check below can be eliminated. |
| 290 */ |
| 291 if (find (out.begin (), out.end (), at_bat) != out.end ()) |
277 continue; | 292 continue; |
278 | 293 |
279 out.push_back (at_bat); | 294 out.push_back (at_bat); |
280 } | 295 } |
281 return out; | 296 return out; |
282 } | 297 } |
283 | 298 |
284 vector<Real> | 299 vector<Real> |
285 System::get_footnote_heights_in_range (vsize start, vsize end) | 300 System::get_footnote_heights_in_range (vsize start, vsize end) |
286 { | 301 { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 System::footnotes_after_line_breaking (SCM smob) | 395 System::footnotes_after_line_breaking (SCM smob) |
381 { | 396 { |
382 Spanner *sys_span = unsmob_spanner (smob); | 397 Spanner *sys_span = unsmob_spanner (smob); |
383 System *sys = dynamic_cast<System *> (sys_span); | 398 System *sys = dynamic_cast<System *> (sys_span); |
384 Interval_t<int> sri = sys->spanned_rank_interval (); | 399 Interval_t<int> sri = sys->spanned_rank_interval (); |
385 vector<Grob *> footnote_grobs = sys->get_footnote_grobs_in_range (sri[LEFT], s
ri[RIGHT]); | 400 vector<Grob *> footnote_grobs = sys->get_footnote_grobs_in_range (sri[LEFT], s
ri[RIGHT]); |
386 vector_sort (footnote_grobs, grob_2D_less); | 401 vector_sort (footnote_grobs, grob_2D_less); |
387 | 402 |
388 SCM grobs_scm = Grob_array::make_array (); | 403 SCM grobs_scm = Grob_array::make_array (); |
389 unsmob_grob_array (grobs_scm)->set_array (footnote_grobs); | 404 unsmob_grob_array (grobs_scm)->set_array (footnote_grobs); |
| 405 return grobs_scm; |
| 406 } |
| 407 |
| 408 MAKE_SCHEME_CALLBACK (System, vertical_skyline_elements, 1); |
| 409 SCM |
| 410 System::vertical_skyline_elements (SCM smob) |
| 411 { |
| 412 Grob *me_grob = unsmob_grob (smob); |
| 413 vector<Grob *> vertical_skyline_grobs; |
| 414 extract_grob_set (me_grob, "elements", my_elts); |
| 415 for (vsize i = 0; i < my_elts.size (); i++) |
| 416 if (System_start_delimiter::has_interface (my_elts[i])) |
| 417 vertical_skyline_grobs.push_back (my_elts[i]); |
| 418 |
| 419 System *me = dynamic_cast<System *> (me_grob); |
| 420 Grob *align = unsmob_grob (me->get_object ("vertical-alignment")); |
| 421 if (!align) |
| 422 { |
| 423 SCM grobs_scm = Grob_array::make_array (); |
| 424 unsmob_grob_array (grobs_scm)->set_array (vertical_skyline_grobs); |
| 425 return grobs_scm; |
| 426 } |
| 427 |
| 428 extract_grob_set (align, "elements", elts); |
| 429 |
| 430 for (vsize i = 0; i < elts.size (); i++) |
| 431 if (Hara_kiri_group_spanner::has_interface (elts[i])) |
| 432 vertical_skyline_grobs.push_back (elts[i]); |
| 433 |
| 434 SCM grobs_scm = Grob_array::make_array (); |
| 435 unsmob_grob_array (grobs_scm)->set_array (vertical_skyline_grobs); |
390 return grobs_scm; | 436 return grobs_scm; |
391 } | 437 } |
392 | 438 |
393 void | 439 void |
394 System::break_into_pieces (vector<Column_x_positions> const &breaking) | 440 System::break_into_pieces (vector<Column_x_positions> const &breaking) |
395 { | 441 { |
396 for (vsize i = 0; i < breaking.size (); i++) | 442 for (vsize i = 0; i < breaking.size (); i++) |
397 { | 443 { |
398 System *system = dynamic_cast<System *> (clone ()); | 444 System *system = dynamic_cast<System *> (clone ()); |
399 system->rank_ = broken_intos_.size (); | 445 system->rank_ = broken_intos_.size (); |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 pl->set_property ("vertical-skylines", this->get_property ("vertical-skylines"
)); | 647 pl->set_property ("vertical-skylines", this->get_property ("vertical-skylines"
)); |
602 pl->set_property ("page-break-permission", right_bound->get_property ("page-br
eak-permission")); | 648 pl->set_property ("page-break-permission", right_bound->get_property ("page-br
eak-permission")); |
603 pl->set_property ("page-turn-permission", right_bound->get_property ("page-tur
n-permission")); | 649 pl->set_property ("page-turn-permission", right_bound->get_property ("page-tur
n-permission")); |
604 pl->set_property ("page-break-penalty", right_bound->get_property ("page-break
-penalty")); | 650 pl->set_property ("page-break-penalty", right_bound->get_property ("page-break
-penalty")); |
605 pl->set_property ("page-turn-penalty", right_bound->get_property ("page-turn-p
enalty")); | 651 pl->set_property ("page-turn-penalty", right_bound->get_property ("page-turn-p
enalty")); |
606 | 652 |
607 if (right_bound->original () == dynamic_cast<System *> (original ())->get_boun
d (RIGHT)) | 653 if (right_bound->original () == dynamic_cast<System *> (original ())->get_boun
d (RIGHT)) |
608 pl->set_property ("last-in-score", SCM_BOOL_T); | 654 pl->set_property ("last-in-score", SCM_BOOL_T); |
609 | 655 |
610 Interval staff_refpoints; | 656 Interval staff_refpoints; |
611 if (Grob *align = get_vertical_alignment ()) | 657 if (Grob *align = unsmob_grob (get_object ("vertical-alignment"))) |
612 { | 658 { |
613 extract_grob_set (align, "elements", staves); | 659 extract_grob_set (align, "elements", staves); |
614 for (vsize i = 0; i < staves.size (); i++) | 660 for (vsize i = 0; i < staves.size (); i++) |
615 if (staves[i]->is_live () | 661 if (staves[i]->is_live () |
616 && Page_layout_problem::is_spaceable (staves[i])) | 662 && Page_layout_problem::is_spaceable (staves[i])) |
617 staff_refpoints.add_point (staves[i]->relative_coordinate (this, | 663 staff_refpoints.add_point (staves[i]->relative_coordinate (this, |
618 Y_AXIS)); | 664 Y_AXIS)); |
619 } | 665 } |
620 | 666 |
621 pl->set_property ("staff-refpoint-extent", ly_interval2scm (staff_refpoints)); | 667 pl->set_property ("staff-refpoint-extent", ly_interval2scm (staff_refpoints)); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 get_root_system (Grob *me) | 748 get_root_system (Grob *me) |
703 { | 749 { |
704 Grob *system_grob = me; | 750 Grob *system_grob = me; |
705 | 751 |
706 while (system_grob->get_parent (Y_AXIS)) | 752 while (system_grob->get_parent (Y_AXIS)) |
707 system_grob = system_grob->get_parent (Y_AXIS); | 753 system_grob = system_grob->get_parent (Y_AXIS); |
708 | 754 |
709 return dynamic_cast<System *> (system_grob); | 755 return dynamic_cast<System *> (system_grob); |
710 } | 756 } |
711 | 757 |
712 Grob * | 758 MAKE_SCHEME_CALLBACK (System, get_vertical_alignment, 1); |
713 System::get_vertical_alignment () | 759 SCM |
714 { | 760 System::get_vertical_alignment (SCM smob) |
715 extract_grob_set (this, "elements", elts); | 761 { |
| 762 Grob *me = unsmob_grob (smob); |
| 763 extract_grob_set (me, "elements", elts); |
716 Grob *ret = 0; | 764 Grob *ret = 0; |
717 for (vsize i = 0; i < elts.size (); i++) | 765 for (vsize i = 0; i < elts.size (); i++) |
718 if (Align_interface::has_interface (elts[i])) | 766 if (Align_interface::has_interface (elts[i])) |
719 { | 767 { |
720 if (ret) | 768 if (ret) |
721 programming_error ("found multiple vertical alignments in this system"
); | 769 me->programming_error ("found multiple vertical alignments in this sys
tem"); |
722 ret = elts[i]; | 770 ret = elts[i]; |
723 } | 771 } |
724 | 772 |
725 if (!ret) | 773 if (!ret) |
726 programming_error ("didn't find a vertical alignment in this system"); | 774 { |
727 return ret; | 775 me->programming_error ("didn't find a vertical alignment in this system"); |
| 776 return SCM_EOL; |
| 777 } |
| 778 return ret->self_scm (); |
728 } | 779 } |
729 | 780 |
730 // Finds the furthest staff in the given direction whose x-extent | 781 // Finds the furthest staff in the given direction whose x-extent |
731 // overlaps with the given interval. | 782 // overlaps with the given interval. |
732 Grob * | 783 Grob * |
733 System::get_extremal_staff (Direction dir, Interval const &iv) | 784 System::get_extremal_staff (Direction dir, Interval const &iv) |
734 { | 785 { |
735 Grob *align = get_vertical_alignment (); | 786 Grob *align = unsmob_grob (get_object ("vertical-alignment")); |
736 if (!align) | 787 if (!align) |
737 return 0; | 788 return 0; |
738 | 789 |
739 extract_grob_set (align, "elements", elts); | 790 extract_grob_set (align, "elements", elts); |
740 vsize start = (dir == UP) ? 0 : elts.size () - 1; | 791 vsize start = (dir == UP) ? 0 : elts.size () - 1; |
741 vsize end = (dir == UP) ? elts.size () : VPOS; | 792 vsize end = (dir == UP) ? elts.size () : VPOS; |
742 for (vsize i = start; i != end; i += dir) | 793 for (vsize i = start; i != end; i += dir) |
743 { | 794 { |
744 if (Hara_kiri_group_spanner::has_interface (elts[i])) | 795 if (Hara_kiri_group_spanner::has_interface (elts[i])) |
745 Hara_kiri_group_spanner::consider_suicide (elts[i]); | 796 Hara_kiri_group_spanner::consider_suicide (elts[i]); |
746 | 797 |
747 Interval intersection = elts[i]->extent (this, X_AXIS); | 798 Interval intersection = elts[i]->extent (this, X_AXIS); |
748 intersection.intersect (iv); | 799 intersection.intersect (iv); |
749 if (elts[i]->is_live () && !intersection.is_empty ()) | 800 if (elts[i]->is_live () && !intersection.is_empty ()) |
750 return elts[i]; | 801 return elts[i]; |
751 } | 802 } |
752 return 0; | 803 return 0; |
753 } | 804 } |
754 | 805 |
755 // Finds the neighboring staff in the given direction over bounds | 806 // Finds the neighboring staff in the given direction over bounds |
756 Grob * | 807 Grob * |
757 System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interva
l_t<int> bounds) | 808 System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interva
l_t<int> bounds) |
758 { | 809 { |
759 Grob *align = get_vertical_alignment (); | 810 Grob *align = unsmob_grob (get_object ("vertical-alignment")); |
760 if (!align) | 811 if (!align) |
761 return 0; | 812 return 0; |
762 | 813 |
763 extract_grob_set (align, "elements", elts); | 814 extract_grob_set (align, "elements", elts); |
764 vsize start = (dir == UP) ? 0 : elts.size () - 1; | 815 vsize start = (dir == UP) ? 0 : elts.size () - 1; |
765 vsize end = (dir == UP) ? elts.size () : VPOS; | 816 vsize end = (dir == UP) ? elts.size () : VPOS; |
766 | 817 |
767 Grob *out = 0; | 818 Grob *out = 0; |
768 | 819 |
769 for (vsize i = start; i != end; i += dir) | 820 for (vsize i = start; i != end; i += dir) |
770 { | 821 { |
771 if (elts[i] == vertical_axis_group) | 822 if (elts[i] == vertical_axis_group) |
772 return out; | 823 return out; |
773 | 824 |
774 if (Hara_kiri_group_spanner::has_interface (elts[i])) | 825 if (Hara_kiri_group_spanner::has_interface (elts[i])) |
775 Hara_kiri_group_spanner::consider_suicide (elts[i]); | 826 Hara_kiri_group_spanner::consider_suicide (elts[i]); |
776 | 827 |
777 bounds.intersect (elts[i]->spanned_rank_interval ()); | 828 bounds.intersect (elts[i]->spanned_rank_interval ()); |
778 if (elts[i]->is_live () && !bounds.is_empty ()) | 829 if (elts[i]->is_live () && !bounds.is_empty ()) |
779 out = elts[i]; | 830 out = elts[i]; |
780 } | 831 } |
781 | 832 |
782 return 0; | 833 return 0; |
783 } | 834 } |
784 | 835 |
785 Interval | 836 Interval |
786 System::pure_refpoint_extent (vsize start, vsize end) | 837 System::pure_refpoint_extent (vsize start, vsize end) |
787 { | 838 { |
788 Interval ret; | 839 Interval ret; |
789 Grob *alignment = get_vertical_alignment (); | 840 Grob *alignment = unsmob_grob (get_object ("vertical-alignment")); |
790 if (!alignment) | 841 if (!alignment) |
791 return Interval (); | 842 return Interval (); |
792 | 843 |
793 extract_grob_set (alignment, "elements", staves); | 844 extract_grob_set (alignment, "elements", staves); |
794 vector<Real> offsets = Align_interface::get_pure_minimum_translations (alignme
nt, staves, Y_AXIS, start, end); | 845 vector<Real> offsets = Align_interface::get_pure_minimum_translations (alignme
nt, staves, Y_AXIS, start, end); |
795 | 846 |
796 for (vsize i = 0; i < offsets.size (); ++i) | 847 for (vsize i = 0; i < offsets.size (); ++i) |
797 if (Page_layout_problem::is_spaceable (staves[i])) | 848 if (Page_layout_problem::is_spaceable (staves[i])) |
798 { | 849 { |
799 ret[UP] = offsets[i]; | 850 ret[UP] = offsets[i]; |
800 break; | 851 break; |
801 } | 852 } |
802 | 853 |
803 for (vsize i = offsets.size (); i--;) | 854 for (vsize i = offsets.size (); i--;) |
804 if (Page_layout_problem::is_spaceable (staves[i])) | 855 if (Page_layout_problem::is_spaceable (staves[i])) |
805 { | 856 { |
806 ret[DOWN] = offsets[i]; | 857 ret[DOWN] = offsets[i]; |
807 break; | 858 break; |
808 } | 859 } |
809 | 860 |
810 return ret; | 861 return ret; |
811 } | 862 } |
812 | 863 |
813 Interval | 864 Interval |
814 System::part_of_line_pure_height (vsize start, vsize end, bool begin) | 865 System::part_of_line_pure_height (vsize start, vsize end, bool begin) |
815 { | 866 { |
816 Grob *alignment = get_vertical_alignment (); | 867 Grob *alignment = unsmob_grob (get_object ("vertical-alignment")); |
817 if (!alignment) | 868 if (!alignment) |
818 return Interval (); | 869 return Interval (); |
819 | 870 |
820 extract_grob_set (alignment, "elements", staves); | 871 extract_grob_set (alignment, "elements", staves); |
821 vector<Real> offsets = Align_interface::get_pure_minimum_translations (alignme
nt, staves, Y_AXIS, start, end); | 872 vector<Real> offsets = Align_interface::get_pure_minimum_translations (alignme
nt, staves, Y_AXIS, start, end); |
822 | 873 |
823 Interval ret; | 874 Interval ret; |
824 for (vsize i = 0; i < staves.size (); ++i) | 875 for (vsize i = 0; i < staves.size (); ++i) |
825 { | 876 { |
826 Interval iv = begin | 877 Interval iv = begin |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 | 918 |
868 for (vsize i = 0; i < elts.size (); ++i) | 919 for (vsize i = 0; i < elts.size (); ++i) |
869 { | 920 { |
870 if (!Axis_group_interface::has_interface (elts[i])) | 921 if (!Axis_group_interface::has_interface (elts[i])) |
871 { | 922 { |
872 if (to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SC
M_EOL))) | 923 if (to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SC
M_EOL))) |
873 relevant_grobs.push_back (elts[i]); | 924 relevant_grobs.push_back (elts[i]); |
874 | 925 |
875 if (Item *it = dynamic_cast<Item *> (elts[i])) | 926 if (Item *it = dynamic_cast<Item *> (elts[i])) |
876 { | 927 { |
877 Direction d = LEFT; | 928 for (LEFT_and_RIGHT (d)) |
878 do | |
879 { | 929 { |
880 Item *piece = it->find_prebroken_piece (d); | 930 Item *piece = it->find_prebroken_piece (d); |
881 if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->
self_scm (), SCM_EOL))) | 931 if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->
self_scm (), SCM_EOL))) |
882 relevant_grobs.push_back (piece); | 932 relevant_grobs.push_back (piece); |
883 } | 933 } |
884 while (flip (&d) != LEFT); | |
885 } | 934 } |
886 } | 935 } |
887 } | 936 } |
888 | 937 |
889 SCM grobs_scm = Grob_array::make_array (); | 938 SCM grobs_scm = Grob_array::make_array (); |
890 | 939 |
891 unsmob_grob_array (grobs_scm)->set_array (relevant_grobs); | 940 unsmob_grob_array (grobs_scm)->set_array (relevant_grobs); |
892 return grobs_scm; | 941 return grobs_scm; |
893 } | 942 } |
894 | 943 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 { | 990 { |
942 SPACEABLE_STAVES, | 991 SPACEABLE_STAVES, |
943 NONSPACEABLE_STAVES, | 992 NONSPACEABLE_STAVES, |
944 ALL_STAVES | 993 ALL_STAVES |
945 }; | 994 }; |
946 | 995 |
947 static SCM | 996 static SCM |
948 get_maybe_spaceable_staves (SCM smob, int filter) | 997 get_maybe_spaceable_staves (SCM smob, int filter) |
949 { | 998 { |
950 System *me = dynamic_cast<System *> (unsmob_grob (smob)); | 999 System *me = dynamic_cast<System *> (unsmob_grob (smob)); |
951 Grob *align = me->get_vertical_alignment (); | 1000 Grob *align = unsmob_grob (me->get_object ("vertical_alignment")); |
952 SCM ret = SCM_EOL; | 1001 SCM ret = SCM_EOL; |
953 | 1002 |
954 if (align) | 1003 if (align) |
955 { | 1004 { |
956 SCM *tail = &ret; | 1005 SCM *tail = &ret; |
957 extract_grob_set (align, "elements", staves); | 1006 extract_grob_set (align, "elements", staves); |
958 | 1007 |
959 for (vsize i = 0; i < staves.size (); ++i) | 1008 for (vsize i = 0; i < staves.size (); ++i) |
960 { | 1009 { |
961 bool spaceable = Page_layout_problem::is_spaceable (staves[i]); | 1010 bool spaceable = Page_layout_problem::is_spaceable (staves[i]); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 "all-elements " | 1052 "all-elements " |
1004 "columns " | 1053 "columns " |
1005 "footnote-stencil " | 1054 "footnote-stencil " |
1006 "footnotes-before-line-breaking " | 1055 "footnotes-before-line-breaking " |
1007 "footnotes-after-line-breaking " | 1056 "footnotes-after-line-breaking " |
1008 "in-note-direction " | 1057 "in-note-direction " |
1009 "in-note-padding " | 1058 "in-note-padding " |
1010 "in-note-stencil " | 1059 "in-note-stencil " |
1011 "labels " | 1060 "labels " |
1012 "pure-Y-extent " | 1061 "pure-Y-extent " |
| 1062 "vertical-alignment " |
1013 ); | 1063 ); |
LEFT | RIGHT |