]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-turn-engraver.cc
Metronome-mark: Neil's comments[2]; more cleanups.
[lilypond.git] / lily / page-turn-engraver.cc
index a00c5922ad26131f163b499d630d89d7549312f7..deda4cc6b463bcc965b08e9d128af8d04c6e7754 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  page-turn-engraver.cc -- implement Page_turn_engraver
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 2006--2010 Joe Neeman <joeneeman@gmail.com>
 
-  (c) 2006 Joe Neeman <joeneeman@gmail.com>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "engraver.hh"
@@ -12,7 +23,6 @@
 #include "duration.hh"
 #include "grob.hh"
 #include "international.hh"
-#include "moment.hh"
 #include "paper-column.hh"
 #include "stream-event.hh"
 #include "warn.hh"
@@ -134,12 +144,14 @@ Page_turn_engraver::penalty (Rational rest_len)
 void
 Page_turn_engraver::acknowledge_note_head (Grob_info gi)
 {
-  SCM dur_log_scm = gi.grob ()->get_property ("duration-log");
-  if (!scm_is_number (dur_log_scm))
-    return;
+  Stream_event *cause = gi.event_cause ();
 
-  int dur_log = scm_to_int (dur_log_scm);
-  int dot_count = robust_scm2int (gi.grob ()->get_property ("dot-count"), 0);
+  Duration *dur_ptr = cause
+    ? unsmob_duration (cause->get_property ("duration"))
+    : 0;
+  
+  if (!dur_ptr)
+    return;
 
   if (rest_begin_ < now_mom ())
     {
@@ -152,7 +164,7 @@ Page_turn_engraver::acknowledge_note_head (Grob_info gi)
 
   if (rest_begin_ <= repeat_begin_)
     repeat_begin_rest_length_ = (now_mom () - repeat_begin_).main_part_;
-  note_end_ = now_mom () + Moment (Duration (dur_log, dot_count).get_length ());
+  note_end_ = now_mom () + dur_ptr->get_length ();
 }
 
 IMPLEMENT_TRANSLATOR_LISTENER (Page_turn_engraver, break);
@@ -286,7 +298,7 @@ Page_turn_engraver::finalize ()
 
          /* it's possible that the last of my newly-split events overlaps the next repeat_penalty,
             in which case we need to refilter that event */
-         if (rep_index < repeat_penalties_.size () - 1
+         if (rep_index + 1 < repeat_penalties_.size ()
              && split.size ()
              && split.back ().duration_[RIGHT] > repeat_penalties_[rep_index+1].duration_[LEFT])
            {
@@ -312,6 +324,9 @@ Page_turn_engraver::finalize ()
        }
     }
 
+  /* unless a manual break overrides it, allow a page turn at the end of the piece */
+  breakable_columns_.back ()->set_property ("page-turn-permission", ly_symbol2scm ("allow"));
+
   /* apply the manual breaks */
   for (vsize i = 0; i < forced_breaks_.size (); i++)
     {
@@ -326,12 +341,18 @@ Page_turn_engraver::finalize ()
 }
 
 ADD_ACKNOWLEDGER (Page_turn_engraver, note_head);
+
 ADD_TRANSLATOR (Page_turn_engraver,
-                /* doc */ "Decide where page turns are allowed to go",
-                /* create */ "",
-                /* accept */ "",
+                /* doc */
+                "Decide where page turns are allowed to go.",
+
+                /* create */
+                "",
+
                 /* read */
                "minimumPageTurnLength "
                "minimumRepeatLengthForPageTurn ",
-                /* write */ ""
+
+                /* write */
+                ""
                );