LEFT | RIGHT |
(no file at all) | |
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 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 System *sys = dynamic_cast<System *> (sys_span); | 398 System *sys = dynamic_cast<System *> (sys_span); |
398 Interval_t<int> sri = sys->spanned_rank_interval (); | 399 Interval_t<int> sri = sys->spanned_rank_interval (); |
399 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]); |
400 vector_sort (footnote_grobs, grob_2D_less); | 401 vector_sort (footnote_grobs, grob_2D_less); |
401 | 402 |
402 SCM grobs_scm = Grob_array::make_array (); | 403 SCM grobs_scm = Grob_array::make_array (); |
403 unsmob_grob_array (grobs_scm)->set_array (footnote_grobs); | 404 unsmob_grob_array (grobs_scm)->set_array (footnote_grobs); |
404 return grobs_scm; | 405 return grobs_scm; |
405 } | 406 } |
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); |
| 436 return grobs_scm; |
| 437 } |
| 438 |
407 void | 439 void |
408 System::break_into_pieces (vector<Column_x_positions> const &breaking) | 440 System::break_into_pieces (vector<Column_x_positions> const &breaking) |
409 { | 441 { |
410 for (vsize i = 0; i < breaking.size (); i++) | 442 for (vsize i = 0; i < breaking.size (); i++) |
411 { | 443 { |
412 System *system = dynamic_cast<System *> (clone ()); | 444 System *system = dynamic_cast<System *> (clone ()); |
413 system->rank_ = broken_intos_.size (); | 445 system->rank_ = broken_intos_.size (); |
414 | 446 |
415 vector<Grob *> c (breaking[i].cols_); | 447 vector<Grob *> c (breaking[i].cols_); |
416 pscore_->typeset_system (system); | 448 pscore_->typeset_system (system); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 pl->set_property ("vertical-skylines", this->get_property ("vertical-skylines"
)); | 647 pl->set_property ("vertical-skylines", this->get_property ("vertical-skylines"
)); |
616 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")); |
617 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")); |
618 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")); |
619 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")); |
620 | 652 |
621 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)) |
622 pl->set_property ("last-in-score", SCM_BOOL_T); | 654 pl->set_property ("last-in-score", SCM_BOOL_T); |
623 | 655 |
624 Interval staff_refpoints; | 656 Interval staff_refpoints; |
625 if (Grob *align = get_vertical_alignment ()) | 657 if (Grob *align = unsmob_grob (get_object ("vertical-alignment"))) |
626 { | 658 { |
627 extract_grob_set (align, "elements", staves); | 659 extract_grob_set (align, "elements", staves); |
628 for (vsize i = 0; i < staves.size (); i++) | 660 for (vsize i = 0; i < staves.size (); i++) |
629 if (staves[i]->is_live () | 661 if (staves[i]->is_live () |
630 && Page_layout_problem::is_spaceable (staves[i])) | 662 && Page_layout_problem::is_spaceable (staves[i])) |
631 staff_refpoints.add_point (staves[i]->relative_coordinate (this, | 663 staff_refpoints.add_point (staves[i]->relative_coordinate (this, |
632 Y_AXIS)); | 664 Y_AXIS)); |
633 } | 665 } |
634 | 666 |
635 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... |
716 get_root_system (Grob *me) | 748 get_root_system (Grob *me) |
717 { | 749 { |
718 Grob *system_grob = me; | 750 Grob *system_grob = me; |
719 | 751 |
720 while (system_grob->get_parent (Y_AXIS)) | 752 while (system_grob->get_parent (Y_AXIS)) |
721 system_grob = system_grob->get_parent (Y_AXIS); | 753 system_grob = system_grob->get_parent (Y_AXIS); |
722 | 754 |
723 return dynamic_cast<System *> (system_grob); | 755 return dynamic_cast<System *> (system_grob); |
724 } | 756 } |
725 | 757 |
726 Grob * | 758 MAKE_SCHEME_CALLBACK (System, get_vertical_alignment, 1); |
727 System::get_vertical_alignment () | 759 SCM |
728 { | 760 System::get_vertical_alignment (SCM smob) |
729 extract_grob_set (this, "elements", elts); | 761 { |
| 762 Grob *me = unsmob_grob (smob); |
| 763 extract_grob_set (me, "elements", elts); |
730 Grob *ret = 0; | 764 Grob *ret = 0; |
731 for (vsize i = 0; i < elts.size (); i++) | 765 for (vsize i = 0; i < elts.size (); i++) |
732 if (Align_interface::has_interface (elts[i])) | 766 if (Align_interface::has_interface (elts[i])) |
733 { | 767 { |
734 if (ret) | 768 if (ret) |
735 programming_error ("found multiple vertical alignments in this system"
); | 769 me->programming_error ("found multiple vertical alignments in this sys
tem"); |
736 ret = elts[i]; | 770 ret = elts[i]; |
737 } | 771 } |
738 | 772 |
739 if (!ret) | 773 if (!ret) |
740 programming_error ("didn't find a vertical alignment in this system"); | 774 { |
741 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 (); |
742 } | 779 } |
743 | 780 |
744 // Finds the furthest staff in the given direction whose x-extent | 781 // Finds the furthest staff in the given direction whose x-extent |
745 // overlaps with the given interval. | 782 // overlaps with the given interval. |
746 Grob * | 783 Grob * |
747 System::get_extremal_staff (Direction dir, Interval const &iv) | 784 System::get_extremal_staff (Direction dir, Interval const &iv) |
748 { | 785 { |
749 Grob *align = get_vertical_alignment (); | 786 Grob *align = unsmob_grob (get_object ("vertical-alignment")); |
750 if (!align) | 787 if (!align) |
751 return 0; | 788 return 0; |
752 | 789 |
753 extract_grob_set (align, "elements", elts); | 790 extract_grob_set (align, "elements", elts); |
754 vsize start = (dir == UP) ? 0 : elts.size () - 1; | 791 vsize start = (dir == UP) ? 0 : elts.size () - 1; |
755 vsize end = (dir == UP) ? elts.size () : VPOS; | 792 vsize end = (dir == UP) ? elts.size () : VPOS; |
756 for (vsize i = start; i != end; i += dir) | 793 for (vsize i = start; i != end; i += dir) |
757 { | 794 { |
758 if (Hara_kiri_group_spanner::has_interface (elts[i])) | 795 if (Hara_kiri_group_spanner::has_interface (elts[i])) |
759 Hara_kiri_group_spanner::consider_suicide (elts[i]); | 796 Hara_kiri_group_spanner::consider_suicide (elts[i]); |
760 | 797 |
761 Interval intersection = elts[i]->extent (this, X_AXIS); | 798 Interval intersection = elts[i]->extent (this, X_AXIS); |
762 intersection.intersect (iv); | 799 intersection.intersect (iv); |
763 if (elts[i]->is_live () && !intersection.is_empty ()) | 800 if (elts[i]->is_live () && !intersection.is_empty ()) |
764 return elts[i]; | 801 return elts[i]; |
765 } | 802 } |
766 return 0; | 803 return 0; |
767 } | 804 } |
768 | 805 |
769 // Finds the neighboring staff in the given direction over bounds | 806 // Finds the neighboring staff in the given direction over bounds |
770 Grob * | 807 Grob * |
771 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) |
772 { | 809 { |
773 Grob *align = get_vertical_alignment (); | 810 Grob *align = unsmob_grob (get_object ("vertical-alignment")); |
774 if (!align) | 811 if (!align) |
775 return 0; | 812 return 0; |
776 | 813 |
777 extract_grob_set (align, "elements", elts); | 814 extract_grob_set (align, "elements", elts); |
778 vsize start = (dir == UP) ? 0 : elts.size () - 1; | 815 vsize start = (dir == UP) ? 0 : elts.size () - 1; |
779 vsize end = (dir == UP) ? elts.size () : VPOS; | 816 vsize end = (dir == UP) ? elts.size () : VPOS; |
780 | 817 |
781 Grob *out = 0; | 818 Grob *out = 0; |
782 | 819 |
783 for (vsize i = start; i != end; i += dir) | 820 for (vsize i = start; i != end; i += dir) |
784 { | 821 { |
785 if (elts[i] == vertical_axis_group) | 822 if (elts[i] == vertical_axis_group) |
786 return out; | 823 return out; |
787 | 824 |
788 if (Hara_kiri_group_spanner::has_interface (elts[i])) | 825 if (Hara_kiri_group_spanner::has_interface (elts[i])) |
789 Hara_kiri_group_spanner::consider_suicide (elts[i]); | 826 Hara_kiri_group_spanner::consider_suicide (elts[i]); |
790 | 827 |
791 bounds.intersect (elts[i]->spanned_rank_interval ()); | 828 bounds.intersect (elts[i]->spanned_rank_interval ()); |
792 if (elts[i]->is_live () && !bounds.is_empty ()) | 829 if (elts[i]->is_live () && !bounds.is_empty ()) |
793 out = elts[i]; | 830 out = elts[i]; |
794 } | 831 } |
795 | 832 |
796 return 0; | 833 return 0; |
797 } | 834 } |
798 | 835 |
799 Interval | 836 Interval |
800 System::pure_refpoint_extent (vsize start, vsize end) | 837 System::pure_refpoint_extent (vsize start, vsize end) |
801 { | 838 { |
802 Interval ret; | 839 Interval ret; |
803 Grob *alignment = get_vertical_alignment (); | 840 Grob *alignment = unsmob_grob (get_object ("vertical-alignment")); |
804 if (!alignment) | 841 if (!alignment) |
805 return Interval (); | 842 return Interval (); |
806 | 843 |
807 extract_grob_set (alignment, "elements", staves); | 844 extract_grob_set (alignment, "elements", staves); |
808 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); |
809 | 846 |
810 for (vsize i = 0; i < offsets.size (); ++i) | 847 for (vsize i = 0; i < offsets.size (); ++i) |
811 if (Page_layout_problem::is_spaceable (staves[i])) | 848 if (Page_layout_problem::is_spaceable (staves[i])) |
812 { | 849 { |
813 ret[UP] = offsets[i]; | 850 ret[UP] = offsets[i]; |
814 break; | 851 break; |
815 } | 852 } |
816 | 853 |
817 for (vsize i = offsets.size (); i--;) | 854 for (vsize i = offsets.size (); i--;) |
818 if (Page_layout_problem::is_spaceable (staves[i])) | 855 if (Page_layout_problem::is_spaceable (staves[i])) |
819 { | 856 { |
820 ret[DOWN] = offsets[i]; | 857 ret[DOWN] = offsets[i]; |
821 break; | 858 break; |
822 } | 859 } |
823 | 860 |
824 return ret; | 861 return ret; |
825 } | 862 } |
826 | 863 |
827 Interval | 864 Interval |
828 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) |
829 { | 866 { |
830 Grob *alignment = get_vertical_alignment (); | 867 Grob *alignment = unsmob_grob (get_object ("vertical-alignment")); |
831 if (!alignment) | 868 if (!alignment) |
832 return Interval (); | 869 return Interval (); |
833 | 870 |
834 extract_grob_set (alignment, "elements", staves); | 871 extract_grob_set (alignment, "elements", staves); |
835 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); |
836 | 873 |
837 Interval ret; | 874 Interval ret; |
838 for (vsize i = 0; i < staves.size (); ++i) | 875 for (vsize i = 0; i < staves.size (); ++i) |
839 { | 876 { |
840 Interval iv = begin | 877 Interval iv = begin |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 { | 990 { |
954 SPACEABLE_STAVES, | 991 SPACEABLE_STAVES, |
955 NONSPACEABLE_STAVES, | 992 NONSPACEABLE_STAVES, |
956 ALL_STAVES | 993 ALL_STAVES |
957 }; | 994 }; |
958 | 995 |
959 static SCM | 996 static SCM |
960 get_maybe_spaceable_staves (SCM smob, int filter) | 997 get_maybe_spaceable_staves (SCM smob, int filter) |
961 { | 998 { |
962 System *me = dynamic_cast<System *> (unsmob_grob (smob)); | 999 System *me = dynamic_cast<System *> (unsmob_grob (smob)); |
963 Grob *align = me->get_vertical_alignment (); | 1000 Grob *align = unsmob_grob (me->get_object ("vertical_alignment")); |
964 SCM ret = SCM_EOL; | 1001 SCM ret = SCM_EOL; |
965 | 1002 |
966 if (align) | 1003 if (align) |
967 { | 1004 { |
968 SCM *tail = &ret; | 1005 SCM *tail = &ret; |
969 extract_grob_set (align, "elements", staves); | 1006 extract_grob_set (align, "elements", staves); |
970 | 1007 |
971 for (vsize i = 0; i < staves.size (); ++i) | 1008 for (vsize i = 0; i < staves.size (); ++i) |
972 { | 1009 { |
973 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... |
1015 "all-elements " | 1052 "all-elements " |
1016 "columns " | 1053 "columns " |
1017 "footnote-stencil " | 1054 "footnote-stencil " |
1018 "footnotes-before-line-breaking " | 1055 "footnotes-before-line-breaking " |
1019 "footnotes-after-line-breaking " | 1056 "footnotes-after-line-breaking " |
1020 "in-note-direction " | 1057 "in-note-direction " |
1021 "in-note-padding " | 1058 "in-note-padding " |
1022 "in-note-stencil " | 1059 "in-note-stencil " |
1023 "labels " | 1060 "labels " |
1024 "pure-Y-extent " | 1061 "pure-Y-extent " |
1025 "skyline-horizontal-padding " | 1062 "vertical-alignment " |
1026 ); | 1063 ); |
LEFT | RIGHT |