]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix segfault from orphaned lines code
authorKeith OHara <k-ohara5a5a@oco.net>
Mon, 28 Feb 2011 07:15:19 +0000 (23:15 -0800)
committerKeith OHara <k-ohara5a5a@oco.net>
Thu, 10 Mar 2011 10:15:57 +0000 (02:15 -0800)
input/regression/markup-lines.ly
lily/paper-book.cc

index 03500ebfd1f96727c5b63f5487cc0456829e4f72..82606f037fa5bd032220adf50295d27cbcde1826 100644 (file)
@@ -1,38 +1,50 @@
-\version "2.12.0"
+\version "2.13.54"
 
 \header {
+  tagline = ##f
   texidoc = "Text that can spread over pages is entered with the
-@code{\\markuplines} command."
+@code{\\markuplines} command.  Widowed and orphaned lines are avoided
+at the begininng and end of a @code{\\markuplines} containing more
+than one line."
 }
 
-#(set-default-paper-size "a6")
+#(set-default-paper-size "a7")
 
 #(define-markup-list-command (paragraph layout props args) (markup-list?)
   (interpret-markup-list layout props 
    (make-justified-lines-markup-list (cons (make-hspace-markup 2) args))))
-
-%% Candide, Voltaire
-\markuplines \override-lines #'(baseline-skip . 2.5) {
-  \paragraph {
-    Il y avait en Westphalie, dans le château de M. le baron de
-    Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné
-    les mœurs les plus douces.  Sa physionomie annonçait son âme.
-    Il avait le jugement assez droit, avec l'esprit le plus simple ;
-    c'est, je crois, pour cette raison qu'on le nommait Candide.  Les
-    anciens domestiques de la maison soupçonnaient qu'il était fils
-    de la sœur de monsieur le baron et d'un bon et honnête
-    gentilhomme du voisinage, que cette demoiselle ne voulut jamais
-    épouser parce qu'il n'avait pu prouver que soixante et onze
-    quartiers, et que le reste de son arbre généalogique avait été
-    perdu par l'injure du temps.
+\book {
+  \markuplines {} % Empty list is handled gracefully
+  %% Candide, Voltaire
+  \markuplines \override-lines #'(baseline-skip . 3.0) {
+    \paragraph { % The final two lines are placed on page 2.
+      Il y avait en Westphalie, dans le château de M. le baron de
+      Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné
+      les mœurs les plus douces.  Sa physionomie annonçait son âme.
+      Il avait le jugement assez droit, avec l'esprit le plus simple ;
+      c'est, je crois, pour cette raison qu'on le nommait Candide.  Les
+      anciens domestiques de la maison soupçonnaient qu'il était fils
+      de la sœur de monsieur le baron et d'un bon et honnête
+      gentilhomme du voisinage, que cette demoiselle ne voulut jamais
+      épouser parce qu'il n'avait pu prouver que soixante et onze
+      quartiers, et que le reste de son arbre généalogique avait été
+      perdu par l'injure du temps. (not orphaned)
+    }
+  }
+  \markuplines \override-lines #'(baseline-skip . 3.9) {
+    \paragraph {
+      Monsieur le baron était un des plus puissants seigneurs de la
+      Westphalie, car son château avait une porte et des fenêtres.  Sa
+      grande salle même était ornée d'une tapisserie.  Tous les chiens
+      de ses basses-cours composaient une meute dans le besoin ; ses
+      palefreniers étaient ses piqueurs; le vicaire du village était
+      son grand-aumônier.  Ils l'appelaient tous monseigneur, et ils
+      riaient quand il faisait des contes.
+    }
   }
-  \paragraph {
-    Monsieur le baron était un des plus puissants seigneurs de la
-    Westphalie, car son château avait une porte et des fenêtres.  Sa
-    grande salle même était ornée d'une tapisserie.  Tous les chiens
-    de ses basses-cours composaient une meute dans le besoin ; ses
-    palefreniers étaient ses piqueurs; le vicaire du village était
-    son grand-aumônier.  Ils l'appelaient tous monseigneur, et ils
-    riaient quand il faisait des contes.
+  \markuplines {
+    \paragraph { % A single-line paragraph may be orphaned
+      Madame la ... (may be orphaned)
+    }
   }
 }
index 7a13120c6464d0f426e8d63fad05cf1d8ef56d1a..9907e56d95a16b94d1f90d0e4c040c96e9c86d2a 100644 (file)
@@ -516,31 +516,34 @@ Paper_book::get_system_specs ()
                                  paper_->self_scm (),
                                  page_properties,
                                  scm_car (s));
-         Prob *ps;
-         SCM list;
-         for (list = texts ; scm_is_pair (list) ; list = scm_cdr (list))
+         Prob *first = 0;
+         Prob *last = 0;
+         for (SCM list = texts; scm_is_pair (list); list = scm_cdr (list))
            {
              SCM t = scm_car (list);
              // TODO: init props
-             ps = make_paper_system (SCM_EOL);
+             Prob *ps = make_paper_system (SCM_EOL);
              ps->set_property ("page-break-permission",
                                ly_symbol2scm ("allow"));
              ps->set_property ("page-turn-permission",
                                ly_symbol2scm ("allow"));
              ps->set_property ("last-markup-line",  SCM_BOOL_F);
-             ps->set_property ("first-markup-line",
-                         list == texts? SCM_BOOL_T : SCM_BOOL_F);
+             ps->set_property ("first-markup-line", SCM_BOOL_F);
 
              paper_system_set_stencil (ps, *unsmob_stencil (t));
              
              SCM footnotes = get_footnotes (unsmob_stencil (t)->expr ());
              ps->set_property ("footnotes", footnotes);
              ps->set_property ("is-title", SCM_BOOL_T);
-             if (list != texts)
-               /* For each markup other than the first, place it as closely as
-                  possible to the previous markup and don't allow stretching. */
-               ps->set_property ("tight-spacing", SCM_BOOL_T);
-
+             if (list == texts)
+               first = ps;
+             else
+               {
+                 // last line so far, in a multi-line paragraph
+                 last = ps;
+                 //Place closely to previous line, no stretching.
+                 ps->set_property ("tight-spacing", SCM_BOOL_T);
+               }
              system_specs = scm_cons (ps->self_scm (), system_specs);
              ps->unprotect ();
 
@@ -552,17 +555,13 @@ Paper_book::get_system_specs ()
              // FIXME: figure out penalty.
              //set_system_penalty (ps, scores_[i].header_);
            }
-         // We may want to place a check here, for whether the line is too short
-         if (list == texts)
-           {
-             // if there is only one line in the paragraph,
-             // do not try to avoid orphans
-             ps->set_property ("last-markup-line", SCM_BOOL_F);
-             ps->set_property ("first-markup-line", SCM_BOOL_F);
-           }
-         else
-           {
-             ps->set_property ("last-markup-line", SCM_BOOL_T);
+         /* Set properties to avoid widowed/orphaned lines.
+            Single-line markup_lists are excluded, but in future
+            we may want to add the case of a very short, single line. */
+         if (first && last)
+           {
+             last->set_property ("last-markup-line", SCM_BOOL_T);
+             first->set_property ("first-markup-line", SCM_BOOL_T);
            }
        }
       else