]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'lilypond/translation' into staging
authorFrancisco Vila <francisco.vila@hispalinux.es>
Mon, 23 Jan 2012 16:53:22 +0000 (17:53 +0100)
committerFrancisco Vila <francisco.vila@hispalinux.es>
Mon, 23 Jan 2012 16:53:22 +0000 (17:53 +0100)
51 files changed:
Documentation/contributor/source-code.itexi
Documentation/notation/input.itely
Documentation/notation/rhythms.itely
Documentation/usage/running.itely
Documentation/web/news-front.itexi
Documentation/web/news.itexi
GNUmakefile.in
input/regression/backend-excercise.ly
input/regression/dot-column-note-collision.ly
input/regression/dot-column-vertical-positioning.ly [new file with mode: 0644]
input/regression/dot-up-voice-collision.ly
input/regression/markup-scheme.ly
input/regression/mozart-hrn3-rondo.ily
input/regression/multi-measure-rest-text.ly
input/regression/nested-fill-lines.ly
input/regression/page-label.ly
input/regression/rest-polyphonic-2.ly
input/regression/spacing-short-notes.ly
input/regression/tie-single.ly
lily/column-description.cc [deleted file]
lily/constrained-breaking.cc
lily/dot-column.cc
lily/dot-formatting-problem.cc
lily/include/column-description.hh [deleted file]
lily/include/item.hh
lily/include/paper-column.hh
lily/include/simple-spacer.hh
lily/include/staff-symbol-referencer.hh
lily/include/stream-event.hh
lily/include/system.hh
lily/item.cc
lily/music.cc
lily/note-collision.cc
lily/paper-column.cc
lily/quote-iterator.cc
lily/simple-spacer.cc
lily/span-bar-engraver.cc
lily/staff-symbol-referencer.cc
lily/stream-event.cc
lily/system.cc
lily/tuplet-bracket.cc
ly/engraver-init.ly
make/lilypond-book-vars.make
make/midi-rules.make
python/auxiliar/postprocess_html.py
python/convertrules.py
scripts/build/output-distance.py
scripts/build/website_post.py
scripts/build/www_post.py
scripts/convert-ly.py
stepmake/stepmake/texinfo-rules.make

index ea8fc8775c59007ed7831b1b3c07260edc1e9887..75363f4d40be7d54eb615b0c66f1fd2e837d8d14 100644 (file)
@@ -111,6 +111,7 @@ multiple projects concurrently.
 
 @menu
 * Setting up::
+* Git for the impatient::
 * Downloading remote branches::
 @end menu
 
@@ -206,6 +207,19 @@ change the default editor to @command{nano}, enter:
 git config --global core.editor @var{nano}
 @end example
 
+Finally, and in some ways most importantly, let's make sure that
+we know what branch we're on.  If you're not using lilydev, add
+this to your @file{~/.bashrc}:
+
+@verbatim
+export PS1="\u@\h \w\$(__git_ps1)$ "
+@end verbatim
+
+If you are not using lilydev, you may need to install the
+additional @code{git-completion} package, but it is definitely
+worth it.
+
+
 @subsubheading Technical details
 
 Git stores the information entered with
@@ -245,6 +259,269 @@ setting any now.  Specific recommendations will be mentioned later
 in this manual.
 
 
+@node Git for the impatient
+@subsection Git for the impatient
+
+@advanced{The intent of this subsection is to get you working on lilypond as
+soon as possible.  If you want to learn about git, go read
+@ref{Other Git documentation}.
+@*
+Also, these instructions are designed to eliminate the most common
+problems we have found in using git.  If you already know git and
+have a different way of working, great!  Feel free to ignore the
+advice in this subsection.}
+
+
+Ok, so you've been using @command{lily-git.tcl} for a while, but
+it's time to take the next step.  Since our review process delays
+patches by 60-120 hours, and you want to be able to work on other
+stuff while your previous work is getting reviewed, you're going
+to use @strong{branches}.
+
+You can think of a branch as being a separate copy of the source
+code.  But don't worry about it.
+
+@subsubheading Start work: make a new branch
+
+Let's pretend you want to add a section to the Contributor's Guide
+about using branches.
+
+Start by updating the repository, then making a new branch.  Call
+the branch anything you want as long as the name starts with
+@code{dev/}.  Branch names that don't begin with @code{dev/} are
+reserved for special things in lilypond.
+
+@example
+git checkout master
+git pull -r origin master
+git branch dev/cg
+@end example
+
+@subsubheading Switch to that branch
+
+Nothing has happened to the files yet.  Let's change into the new
+branch.  You can think of this as @qq{loading a file}, although in
+this case it's really @qq{loading a directory and subdirectories
+full of files}.
+
+@example
+git checkout dev/cg
+@end example
+
+Your prompt now shows you that you're on the other branch:
+
+@example
+gperciva@@lilydev:~/lilypond-git (dev/cg)$ 
+@end example
+
+To be able to manage multiple lilypond issues at once, you'll need to switch
+branches.  You should have each lilypond issue on a separate branch.
+Switching branches is easy:
+
+@example
+git checkout master
+git checkout origin/staging
+git checkout origin/release/unstable
+git checkout dev/cg
+@end example
+
+Branches that begin with @code{origin/} are part of the remote repository,
+rather than your local repository, so when you check them out you get a 
+temporary local branch.  You should never make changes directly on a
+branch beginning with @code{origin/}.  You get changes into the remote
+repository by making them in local branches, and then pushing them to
+@code{origin/staging} as described below. 
+
+@subsubheading Make your changes
+
+Edit files, then commit them.
+
+@example
+git commit -a
+@end example
+
+
+Remember how I said that switching to a branch was like
+@qq{loading a directory}?  Well, you've just @qq{saved a
+directory}, so that you can @qq{load} it later.
+
+@advanced{If you have used @command{cvs} or @command{svn}, you may
+be very confused: those programs use @qq{commit} to mean
+@qq{upload my changes to the shared source repository}.
+Unfortunately, just to be different, @w{@command{git commit}}
+means @qq{save my changes to the files}.}
+
+When you create a new file, you need to add it to git, then commit it:
+
+@example
+git add input/regression/avoid-crash-on-condition.ly
+git commit -a
+@end example
+
+
+Edit more files.  Commit them again.  Edit yet more files, commit
+them again.  Go eat dinner.  Switch to @code{master} so you can
+play with the latest changes from other developers.  Switch back
+to your branch and edit some more.  Commit those changes.
+
+At this stage, don't worry about how many commits you have.
+
+
+@subsubheading Save commits to external files
+
+Branches are nerve-wracking until you get used to them.  You can
+save your hard work as individual @file{.patch} files.  Be sure to
+commit your chages first.
+
+@example
+git commit -a
+git format-patch master
+@end example
+
+I personally have between 4 and 20 of those files saved in a
+special folder at any point in time.  Git experts might laugh as
+that behavior, but I feel a @emph{lot} better knowing that I've
+got those backups.
+
+
+@subsubheading Prepare your branch for review
+
+After committing, you can update your branch with the latest master:
+
+@example
+git commit -a
+git checkout master
+git pull -r origin master
+git checkout dev/cg
+git rebase master
+@end example
+
+
+Due to the speed of lilypond development, sometimes
+@code{master} has changed so much that your branch can no
+longer be applied to it.  In that happens, you will have a merge
+conflict.  Stop for a moment to either cry or have a stiff drink,
+then proceed to @ref{Merge conflicts}.
+
+
+@subsubheading Upload your branch
+
+Finally, you're finished your changes.  Time to upload for review.
+Make sure that you're on your branch, then upload:
+
+@example
+git checkout dev/cg
+git-cl upload master
+@end example
+
+
+@subsubheading Wait for reviews
+
+While you're waiting for a countdown and reviews, go back to
+master, make a @code{dev/doc-beams} branch, and start adding doc
+suggestions from issue 12345 from the tracker.  Or make a
+@code{dev/page-breaks} and fix bug in page breaking.  Or whatever.
+Don't worry, your @code{dev/cg} is safe.
+
+
+@subsubheading Combining commits (optional unless you have broken commits)
+
+Does the history of your branch look good?
+
+@example
+gitk
+@end example
+
+If you have a lot of commits on your branch, you might want to
+combine some of them.  Alternately, you may like your commits, but
+want to edit the commit messages.
+
+@example
+git rebase -i master
+@end example
+
+Follow instructions on the screen.
+
+@warning{This step gives you the power to completely lose your
+work.  Make a backup of your commits by saving them to
+@file{.patch} files before playing with this.  If you do lose
+your work, don't despair.  You can get it back by using @code{git reflog}.
+The use of @code{git reflog} is not covered here.}
+
+@warning{If any of the commits on your branch represent partial work that will
+not pass @var{make && make doc}, you @strong{must} squash these 
+commits into a working commit.  Otherwise, your push will break staging
+and will not be able to be merged to master.  In general, you will
+be safer to have one commit per push.}
+
+
+@subsubheading Push to staging
+
+When you've got the coveted @code{Patch-push} status, time to
+prepare your upload:
+
+@example
+git fetch
+git rebase origin/staging dev/cg~0
+gitk HEAD 
+@end example
+
+@warning{Do not skip the @command{gitk} step; a quick 5-second
+check of the visual history can save a great deal of frustration
+later on.  You should see a set of your commits that are ahead of
+@code{origin/staging}, with no label for the top commit -- only a
+SHA1 id.}
+
+@warning{If @code{origin/staging} and @code{origin/master} are the
+same commit, your branch (@code{dev/cg} in the example) will also
+be at the top of the @code{gitk} tree.  This is normal.}
+
+If everything looks good, push it:
+
+@example
+git push origin HEAD:staging
+@end example
+
+Then change back to your working branch:
+
+@example
+git checkout dev/cg
+@end example
+
+@warning{It is a best practice to avoid rebasing any of your branches
+to @code{origin/staging}.  If @code{origin/staging} is broken, it
+will be deleted and rebuilt.  If you have rebased one of your branches
+to @code{origin/staging}, the broken commits can end up in your branch.
+The commands given above do the rebase on a temporary branch, and avoid
+changing your working branch.}
+
+
+@subsubheading Delete your branch (safe)
+
+After a few hours, if there's nothing wrong with your branch, it
+should be automatically moved to @code{origin/master}.  Update,
+then try removing your branch:
+
+@example
+git checkout master
+git pull -r origin master
+git branch -d dev/cg
+@end example
+
+The last command will fail if the contents of @code{dev/cg} are
+not present in @code{origin/master}.
+
+
+@subsubheading Delete your branch (UNSAFE)
+
+@c don't give explicit commands here -- this is too dangerous to copy and paste
+Sometimes everything goes wrong.  If you want to remove a branch even though 
+it will cause your work to be lost (that is, if the contents of @code{dev/cg}
+are @strong{not} present in master), follow the instructions in @qq{Delete
+your branch (safe)}, but replace the @code{-d} on the final line with 
+a @code{-D}.
+
+
 @node Downloading remote branches
 @subsection Downloading remote branches
 
@@ -1099,6 +1376,7 @@ several Git branches of LilyPond source code is presented.
 
 
 @menu
+* Merge conflicts::
 * Advanced Git concepts::
 * Resolving conflicts::
 * Reverting all local changes::
@@ -1112,6 +1390,13 @@ several Git branches of LilyPond source code is presented.
 @end menu
 
 
+@node Merge conflicts
+@subsection Merge conflicts
+
+To be filled in later, and/or moved to a different section.  I
+just wanted to make sure that I had a stub ready somewhere.
+
+
 @node Advanced Git concepts
 @subsection Advanced Git concepts
 
@@ -2101,5 +2386,10 @@ More in-depth tutorials: @uref{http://git-scm.com/documentation}
 
 @item
 Book about git: @uref{http://progit.org/,Pro Git}
+
+@item
+Github help: @uref{http://help.github.com/}
+(very highly recommended by Graham)
+
 @end itemize
 
index 9ec2b19b793c80a9079ae4e24dda8da1cf991723..baf48047bf394d68a1b1f6cbd4d6d14a93dcaf0e 100644 (file)
@@ -1040,18 +1040,13 @@ indicator and so footnotes are created during compilation.
 @node Automatic footnotes
 @unnumberedsubsubsec Automatic footnotes
 
-Of the two commands used to create automatic footnotes, use
-@code{\footnoteGrob} for individual grobs (i.e. note heads, stems,
-slurs, dynamics and @code{\markup} when using @code{TextScripts});
-and @code{\footnote} for annotating chorded notes.
-
-Both commands take three arguments; the @var{Layout Object} to be
+Automatic footnotes take three arguments; the @var{Layout Object} to be
 annotated, the @var{(x . y)} position of the indicator and a
 @code{\markup} that will appear in the footnote at the bottom of the
 page.
 
-The command @code{\footnoteGrob} must come @emph{before} the grob
-that the footnote is being attached to:
+The command @code{\footnote} must come @emph{before} the grob that the
+footnote is being attached to:
 
 @lilypond[verbatim,quote,ragged-right,papersize=a8]
 \book {
@@ -1067,9 +1062,8 @@ that the footnote is being attached to:
 }
 @end lilypond
 
-To annotate chorded notes, the @code{\footnote} must come
-@emph{after} the note to which the footnote is being attached as a
-@code{TextScript}:
+To annotate chorded notes, the @code{\footnote} must come @emph{after}
+he note to which the footnote is being attached as a @code{TextScript}:
 
 @lilypond[verbatim,quote,ragged-right,papersize=a8]
 \book {
@@ -1088,8 +1082,8 @@ To annotate chorded notes, the @code{\footnote} must come
 are printed in order of descendancy; the higher the footnote, the
 higher up in the list.}
 
-Here are some examples of automatically footnoted grobs, also showing
-the relative position of the footnotes to the tagline and copyright.
+Here are some more examples of footnoted grobs, also showing the
+relative position of the footnotes to the tagline and copyright.
 
 @lilypond[verbatim,quote,ragged-right,papersize=a8]
 \book {
@@ -1137,22 +1131,16 @@ required:
 @node Manual footnotes
 @unnumberedsubsubsec Manual footnotes
 
-@funindex \footnote
-@funindex \footnoteGrob
 @cindex footnotes, manual
 
-There are two commands used to create manual footnotes; @code{\footnote}
-for top-level @code{\markup} and chorded notes; and @code{\footnoteGrob}
-for individual grobs (and @code{\markup} when using @code{TextScripts}).
-
-When annotating grobs, the @code{\footnote} command takes four
-arguments; the @var{Layout Object} to be annotated, the @var{(x . y)}
-position of the indicator and two @code{\markup} commands; the first is
-the indicator attached to the note or grob and the second is the
-footnote at the bottom of the page.
+Manual footnotes takes four arguments; the @var{Layout Object} to be
+annotated, the @var{(x . y)} position of the indicator and two
+@code{\markup} commands; the first is the indicator attached to the note
+or grob and the second is the footnote at the bottom of the page.
 
-The command @code{\footnoteGrob} must come @emph{after} the grob that
-the footnote is annotating and attached as a @code{TextScript}:
+Like automatic footnotes, manual @code{\footnote} commands must come
+@emph{after} the grob that the footnote is annotating and attached as a
+@code{TextScript}:
 
 @lilypond[verbatim,quote,ragged-right,papersize=a8]
 \book {
@@ -1169,9 +1157,7 @@ the footnote is annotating and attached as a @code{TextScript}:
 }
 @end lilypond
 
-To annotate chorded notes, the @code{\footnote} must come @emph{after}
-the note that the footnote is annotating and attached as a
-@code{TextScript}:
+To annotate chorded notes with manual footnotes:
 
 @lilypond[verbatim,quote,ragged-right,papersize=a8]
 \book {
@@ -1218,7 +1204,8 @@ the relative position of the footnotes to the tagline and copyright
     c4
 
     \footnote
-      \markup \concat \teeny { "sharp (v)" } #'(0 . 0.5) #'AccidentalCautionary
+      \markup \concat \teeny { "sharp (v)" }
+          #'(0 . 0.5) #'AccidentalCautionary
       \markup \italic { v. A cautionary accidental }
 
     \footnote
@@ -1228,7 +1215,8 @@ the relative position of the footnotes to the tagline and copyright
 
     \breathe
     \footnote
-      \markup { \teeny \musicglyph #"rests.4" } #'(1.5 . -0.25) #'BreathingSign
+      \markup { \teeny \musicglyph #"rests.4" }
+          #'(1.5 . -0.25) #'BreathingSign
       \markup { \null }
   }
 }
index 6b86eb6a3c9e8697009ef182226e4872a413d0a9..624ebacdf10ce9811d440162b5f9e3045aabe04e 100644 (file)
@@ -525,7 +525,7 @@ c2 ~ c
 
 Dash pattern definitions for ties have the same structure as dash
 pattern definitions for slurs. For more information about complex dash
-patterns, see @rlsr{slurs}.
+patterns, see @ref{Slurs}.
 
 Override @var{whiteout} and @var{layer} layout properties for ties that
 collide with other objects in a staff.
@@ -572,7 +572,7 @@ Notation Reference:
 @ref{Automatic note splitting}.
 
 Snippets:
-@rlsr{slurs},
+@rlsr{Expressive marks},
 @rlsr{Rhythms}.
 
 Internals Reference:
index 1a6c59dc41d6c7946eab37e5e28bfefb8bdc1c0d..82d804c839f48019cf0898e0f9580df16975ec94 100644 (file)
@@ -278,7 +278,7 @@ an output file containing the titles and the first system of music.  If
 @code{\bookpart} blocks are used, the titles and first system of every
 @code{\bookpart} will appear in the output.
 
-An additional file in the form @code{myFile.preview.extensio} is
+An additional file in the form @code{myFile.preview.extension} is
 generated, to avoid this use the additional @option{-dprint-pages} or
 @option{-dno-print-pages} options according to your requirements.
 
@@ -298,7 +298,7 @@ useful in combination with @option{-dpreview}.
 @end table
 
 @cindex Scheme, expression evaluation
-@cindex expression evalusation, Scheme
+@cindex expression evaluation, Scheme
 
 @item -e,--evaluate=@var{expr}
 Evaluate the Scheme @var{expr} before parsing any @file{.ly} files.
@@ -396,22 +396,21 @@ be a single directory writable by this user, which should be passed in
 LilyPond needs to read a number of files while running.  All these files
 are to be copied into the jail, under the same path they appear in the
 real root filesystem.  The entire content of the LilyPond installation
-(e.g., @file{/usr/share/lilypond})
-should be copied.
+(e.g., @file{/usr/share/lilypond}) should be copied.
 
 If problems arise, the simplest way to trace them down is to run
 LilyPond using @command{strace}, which will allow you to determine which
 files are missing.
 
 @item Running LilyPond
-In a jail mounted with @code{noexec} it is impossible to execute any external
-program.  Therefore LilyPond must be run with a backend that does not
-require any such program.  As we already mentioned, it must be also run
-with superuser privileges (which, of course, it will lose immediately),
-possibly using @command{sudo}.  It is a good idea to limit the number of
-seconds of CPU time LilyPond can use (e.g., using @command{ulimit
--t}), and, if your operating system supports it, the amount of memory
-that can be allocated.
+In a jail mounted with @code{noexec} it is impossible to execute any
+external program.  Therefore LilyPond must be run with a backend that
+does not require any such program.  As we already mentioned, it must be
+also run with superuser privileges (which, of course, it will lose
+immediately), possibly using @command{sudo}.  It is a good idea to limit
+the number of seconds of CPU time LilyPond can use (e.g., using
+@command{ulimit@tie{}-t}), and, if your operating system supports it,
+the amount of memory that can be allocated.
 
 @end table
 
@@ -542,8 +541,8 @@ adduser lily
 @end example
 
 @noindent
-This will create a new group for the @code{lily} user as well, and a home folder,
-@code{/home/lily}
+This will create a new group for the @code{lily} user as well, and a
+home folder, @code{/home/lily}
 
 @item In the home folder of the @code{lily} user create a file to use as a
 separate filesystem:
@@ -691,9 +690,8 @@ send a bug-report.
 @end table
 
 @cindex errors, message format
-If warnings and errors can
-be linked to some part of the input file, then error messages have the
-following form
+If warnings and errors can be linked to some part of the input file,
+then error messages have the following form
 
 @example
 @var{filename}:@var{lineno}:@var{columnno}: @var{message}
index 31e2329b3398b626823f14729f4352cc3a9e0167..a8efd6672c0bf23e444a6e21f1061d33e5cd2028 100644 (file)
 @c This file is part of lilypond-web.texi and community.itexi
 
 @c when you add a new item, consider moving the lowest item(s)
-@c into news-old.itexi.
+@c into news.itexi.
 
 @c keep two blank lines between news entries
 
 @c used for news about the upcoming release; see CG 10.2
 
-@newsItem
-@subsubheading LilyPond 2.15.26 released!  @emph{Jan 16, 2012}
-
-We are happy to announce the release of LilyPond 2.15.26.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-The 2.15.25 has been skipped due to build problems.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.24 released!  @emph{Jan 07, 2012}
-
-We are happy to announce the release of LilyPond 2.15.24.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
 
 @newsItem
-@subsubheading LilyPond 2.15.23 released!  @emph{Dec 21, 2011}
+@subsubheading The LilyPond Report #23. @emph{Jan 20, 2012}
 
-We are happy to announce the release of LilyPond 2.15.23.  This
-release contains the usual number of bugfixes.
+The @emph{LilyPond Report} is back, with developer
+David Kastrup as a new editor!  This issue features
+an exposé on some of the new, handy commands
+recently added to LilyPond, as well as an interview
+with LilyPond contributor and composer Mike Solomon.
 
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
+Come
+@uref{http://news.lilynet.net/?The-LilyPond-Report-23, read
+LilyPond Report 23} now; comments and contributions are
++warmly encouraged!
 
 @newsEnd
 
 
 @newsItem
-@subsubheading LilyPond 2.15.22 released!  @emph{Dec 15, 2011}
-
-We are happy to announce the release of LilyPond 2.15.22.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.21 released!  @emph{Dec 6, 2011}
-
-We are happy to announce the release of LilyPond 2.15.21.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.20 released!  @emph{Nov 24, 2011}
-
-We are happy to announce the release of LilyPond 2.15.20.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.19 released!  @emph{Nov 18, 2011}
-
-We are happy to announce the release of LilyPond 2.15.19.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.18 released!  @emph{Nov 12, 2011}
-
-We are happy to announce the release of LilyPond 2.15.18.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.17 released!  @emph{Nov 10, 2011}
-
-We are happy to announce the release of LilyPond 2.15.17.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.16 released!  @emph{October 28, 2011}
+@subsubheading LilyPond 2.15.26 released!  @emph{Jan 16, 2012}
 
-We are happy to announce the release of LilyPond 2.15.16.  This
+We are happy to announce the release of LilyPond 2.15.26.  This
 release contains the usual number of bugfixes.
 
 It is strongly recommended that normal users do @strong{not} use
@@ -147,27 +37,15 @@ this release, and instead use the stable 2.14 version.  Please
 note that due to a few Critical bugs, this is not the next release
 candidate.
 
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.15 released!  @emph{October 24, 2011}
-
-We are happy to announce the release of LilyPond 2.15.15.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
+The 2.15.25 has been skipped due to build problems.
 
 @newsEnd
 
 
 @newsItem
-@subsubheading LilyPond 2.15.14 released!  @emph{October 7, 2011}
+@subsubheading LilyPond 2.15.24 released!  @emph{Jan 07, 2012}
 
-We are happy to announce the release of LilyPond 2.15.14.  This
+We are happy to announce the release of LilyPond 2.15.24.  This
 release contains the usual number of bugfixes.
 
 It is strongly recommended that normal users do @strong{not} use
@@ -179,9 +57,9 @@ candidate.
 
 
 @newsItem
-@subsubheading LilyPond 2.15.13 released!  @emph{September 27, 2011}
+@subsubheading LilyPond 2.15.23 released!  @emph{Dec 21, 2011}
 
-We are happy to announce the release of LilyPond 2.15.13.  This
+We are happy to announce the release of LilyPond 2.15.23.  This
 release contains the usual number of bugfixes.
 
 It is strongly recommended that normal users do @strong{not} use
@@ -192,44 +70,4 @@ candidate.
 @newsEnd
 
 
-@newsItem
-@subsubheading Release candidate 2 cancelled @emph{Sep 23, 2011}
-
-The release countdown is cancelled due to the discovery of a
-Critical regression.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading Release candidate 2 of 2.16 - LilyPond 2.15.12 released!  @emph{Sep 20, 2011}
-
-LilyPond 2.15.12 is out; this is the second release candidate of
-the upcoming 2.16 stable release.  All users are invited to
-experiment with this version.  New features since 2.14.2 are
-listed in the @qq{Changes} manual on the website section about
-@ref{Development}.
-
-There are no known Critical issues with this release.  If no
-Critical bugs are found, then the official 2.16.0 release will be
-on 27 Sep 2011.  If you discover any problems, please send us
-@ref{Bug reports}.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond 2.15.11 released!  @emph{September 11, 2011}
-
-We are happy to announce the release of LilyPond 2.15.11.  This
-release contains the usual number of bugfixes.
-
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version.  Please
-note that due to the possibility of a few Critical bugs, this is
-not the next release candidate.
-
-@newsEnd
-
-
 
index dd8e3a5bd90a52ad4e3e885ad1d24fa133228c09..11555cdb451ad3d7fc81c1e518e381aac74c33bc 100644 (file)
@@ -26,6 +26,187 @@ NOTE:
   * don't duplicate entries from news-front.itexi
 @end ignore
 
+
+@newsItem
+@subsubheading LilyPond 2.15.22 released!  @emph{Dec 15, 2011}
+
+We are happy to announce the release of LilyPond 2.15.22.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.21 released!  @emph{Dec 6, 2011}
+
+We are happy to announce the release of LilyPond 2.15.21.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.20 released!  @emph{Nov 24, 2011}
+
+We are happy to announce the release of LilyPond 2.15.20.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.19 released!  @emph{Nov 18, 2011}
+
+We are happy to announce the release of LilyPond 2.15.19.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.18 released!  @emph{Nov 12, 2011}
+
+We are happy to announce the release of LilyPond 2.15.18.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.17 released!  @emph{Nov 10, 2011}
+
+We are happy to announce the release of LilyPond 2.15.17.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.16 released!  @emph{October 28, 2011}
+
+We are happy to announce the release of LilyPond 2.15.16.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.15 released!  @emph{October 24, 2011}
+
+We are happy to announce the release of LilyPond 2.15.15.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.14 released!  @emph{October 7, 2011}
+
+We are happy to announce the release of LilyPond 2.15.14.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.13 released!  @emph{September 27, 2011}
+
+We are happy to announce the release of LilyPond 2.15.13.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading Release candidate 2 cancelled @emph{Sep 23, 2011}
+
+The release countdown is cancelled due to the discovery of a
+Critical regression.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading Release candidate 2 of 2.16 - LilyPond 2.15.12 released!  @emph{Sep 20, 2011}
+
+LilyPond 2.15.12 is out; this is the second release candidate of
+the upcoming 2.16 stable release.  All users are invited to
+experiment with this version.  New features since 2.14.2 are
+listed in the @qq{Changes} manual on the website section about
+@ref{Development}.
+
+There are no known Critical issues with this release.  If no
+Critical bugs are found, then the official 2.16.0 release will be
+on 27 Sep 2011.  If you discover any problems, please send us
+@ref{Bug reports}.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond 2.15.11 released!  @emph{September 11, 2011}
+
+We are happy to announce the release of LilyPond 2.15.11.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to the possibility of a few Critical bugs, this is
+not the next release candidate.
+
+@newsEnd
+
+
 @newsItem
 @subsubheading LilyPond 2.15.10 released!  @emph{September 6, 2011}
 
index 45e5bf7311457cd98bd64cdbef15f3ff07b60d57..2cd9723edc0191ab2f90c469be18b1c1d8148f8f 100644 (file)
@@ -118,17 +118,20 @@ uninstall-WWW:
 # For both online and offline docs, issue `make doc WEB_TARGETS="offline online"'
 WEB_TARGETS = offline
 
+WEB_ROOT_FILES = $(WEB_TARGETS:%=$(outdir)/%-root/index.html)
+
 WEB_EXAMPLE_FILES = $(wildcard input/$(outdir)/*.ly) \
                     $(wildcard input/*/$(outdir)/*.ly) \
                     $(wildcard input/*/*/$(outdir)/*.ly)
 
-WEB_TRACKED_FILES = $(wildcard $(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
-                    $(wildcard input/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
-                    $(wildcard input/*/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
-                    $(wildcard Documentation/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}) \
-                    $(wildcard Documentation/$(outdir)/*/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php})
+WEB_TRACKED_FILES = $(filter-out $(outdir)/index.html, \
+                    $(shell bash -O nullglob -c "echo $(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}")) \
+                    $(shell bash -O nullglob -c "echo input/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
+                    $(shell bash -O nullglob -c "echo input/*/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
+                    $(shell bash -O nullglob -c "echo Documentation/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
+                    $(shell bash -O nullglob -c "echo Documentation/$(outdir)/*/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}")
 
-WWW-post: $(top-build-dir)/.htaccess $(outdir)/examples.html $(outdir)/offline-root/index.html
+WWW-post: $(top-build-dir)/.htaccess $(outdir)/examples.html $(WEB_ROOT_FILES)
 
 # need UTF8 setting in case this is hosted on a website.
 $(top-build-dir)/.htaccess:
@@ -138,8 +141,11 @@ $(outdir)/examples.html: $(WEB_EXAMPLE_FILES)
        $(buildscript-dir)/mutopia-index -o $(outdir)/examples.html input/
 
 $(outdir)/offline-root/index.html: $(WEB_TRACKED_FILES)
-       $(buildscript-dir)/www_post $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) "$(WEB_TARGETS)"
+       $(buildscript-dir)/www_post $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) offline
        find $(outdir)/offline-root -type l | xargs rm -f
+
+$(outdir)/online-root/index.html: $(WEB_TRACKED_FILES)
+       $(buildscript-dir)/www_post $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) online
 endif # ifeq ($(out),www)
 
 # For those who cannot for the life in them remember to type
index 06120020d9ba0aa5a5193f281b517bd060b18063..ba4af1182a69b668e23e751bd061c7371ebe6bee 100644 (file)
@@ -1,5 +1,5 @@
 \header {
-  texidoc = "Excercise all output functions"
+  texidoc = "Exercise all output functions"
 }
 
 \version "2.14.0"
index 7e9650565aafe74c72eb3f4f7ce3f69228d9b985..cefb5777af35c5893cb17de767f4e622853af9a1 100644 (file)
@@ -6,4 +6,5 @@
 
 {
   <f' g'>4. s8 \small <f' g'>4. s8 <g' a'>4. s8 <a' b'>4. s8
+  <<<f' g'>4 \\ <b' c''>4. >> s8 <<<f' g'>4 \\ b'4. >> s8
 }
diff --git a/input/regression/dot-column-vertical-positioning.ly b/input/regression/dot-column-vertical-positioning.ly
new file mode 100644 (file)
index 0000000..bf89013
--- /dev/null
@@ -0,0 +1,13 @@
+\version "2.15.27"
+
+\header {
+  texidoc = "Dot columns should not trigger vertical spacing before
+line breaking.  If the regtest issues a programming_error saying that
+vertical spacing has been called before line breaking, it has failed.
+"
+}
+
+\context Staff <<
+  \new Voice { \voiceOne f''8.[ e''16] }
+  \new Voice { \voiceThree r8. a'16}
+>>
index 72eb56cc59427aaa2dc890dc1edd22d5c0c32c06..329f5bbcf8112246d52ebe6bdc1a688a3e1b3a9b 100644 (file)
@@ -1,7 +1,7 @@
 \header {
 
-  texidoc = "in collisions, the stems of outer voice are added to the
-  dot support of the inner voices."
+  texidoc = "in collisions, the dots of outer voices avoid
+  stems and flags of the inner voices."
 
 }
 
@@ -13,6 +13,6 @@
   \key e \major \time 3/4
   \relative c'' {
     << { dis4.  } \\
-       { fis,4 } \\ { b4 } >>
+       { fis,4 } \\ { b8 } >>
   }
 }
index fa7168624436bf731d5d7edca49c7a55f647eb4e..5dea41d01c20c06d2816c1d30be9955675ae8986 100644 (file)
@@ -10,7 +10,7 @@
 
 %{
 
-For maintenance reasons, we don't excercise the entire markup command set.
+For maintenance reasons, we don't exercise the entire markup command set.
 
 %}
 
index aeeb211fee862e0e90bd7dbffe6e72311ae651c6..8e45355a8bf5cabfde700b1deaef13deef0a35e6 100644 (file)
@@ -130,7 +130,7 @@ rondo = \relative c' {
   fis[ g gis]
   a[ bes b]\!
 
-  %% EB does the slur in the Rondo differently from the 1st adn 2nd time.
+  %% EB does the slur in the Rondo differently from the 1st and 2nd time.
   %% why. Should check with MS.
   <<
     \rondotheme
index 2e2d4324daa366e141397bb3e352c6d2bb8b4edb..73e1218813a98bceb9acc6d07162b5320d6eb5bb 100644 (file)
@@ -6,7 +6,7 @@
 Texts may be added to the multi-measure rests.
 
 By setting the appropriate @code{spacing-procedure}, we can make
-measures stretch to accomodate wide texts.
+measures stretch to accommodate wide texts.
 
 "
 
index f4236ea699fbc369fd11f5007de897d40ba2daa3..011cc904edb693385d874a1a32dd3d20d150192a 100644 (file)
@@ -4,7 +4,7 @@
 {
 
   texidoc = "
-Nested fill-lines should work properly.  In this example, both occurences
+Nested fill-lines should work properly.  In this example, both occurrences
 of FOO should be centered.
 
 "
index 143d685a781bb6cdbd931934cd18b95e0ec00f3e..a36964079c464fca6b8f1ea919a67fa4d7252e18 100644 (file)
@@ -2,7 +2,7 @@
 
 \header {
   texidoc = "Page labels may be placed inside music or at top-level,
-and refered to in markups."
+and referred to in markups."
 }
 
 #(set-default-paper-size "a6")
index 23af88ff41b725d51e5b617d1ef12ae4ab317883..e009dcf9460ee06b252a81ccd5d5ac28333f58da 100644 (file)
@@ -3,7 +3,7 @@
   texidoc = "Rests avoid notes.  Each rest is moved in the direction
 of the stems in its voice.  Rests may overlap other rests in voices
 with the same stem direction, in which case a warning is given, but
-is supressed if the rest has a pitch."
+is suppressed if the rest has a pitch."
 
 }
 
index d05ef1dd7cb37faf33dedeb14b2285c17e956ee0..47786b0d34bbb7d8adb614087435bd18f6f5c51a 100644 (file)
@@ -4,7 +4,7 @@
   
   texidoc = "Notes that are shorter than the common shortest note get a
 space (i.e. without the space needed for the note) proportional to
-their duration. So, the 16th notes get 1/2 of the space of an eigth note.
+their duration. So, the 16th notes get 1/2 of the space of an eighth note.
 The total distance for a 16th (which includes note head) is 3/4 of the
 eighth note. "
 
index 899c927b4cfc00ac40ec490aece3150a8a2ac820..f7b96fe5a9fe46d6cfeafe674d80bb94b3516db2 100644 (file)
@@ -11,7 +11,7 @@
 @item short ties are vertically centered in the space, as well those
 that otherwise don't fit in a space
 
-@item extremely short ties are put over the noteheads, instead of inbetween.
+@item extremely short ties are put over the noteheads, instead of between.
  
 @end itemize
 "
diff --git a/lily/column-description.cc b/lily/column-description.cc
deleted file mode 100644 (file)
index 20ecc75..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-  This file is part of LilyPond, the GNU music typesetter.
-
-  Copyright (C) 2011--2012 Mike Solomon <mike@apollinemike.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 <cstdio>
-
-#include "column-description.hh"
-#include "paper-column.hh"
-#include "simple-spacer.hh"
-#include "spaceable-grob.hh"
-#include "spring.hh"
-
-static Grob *
-next_spaceable_column (vector<Grob *> const &list, vsize starting)
-{
-  for (vsize i = starting + 1; i < list.size (); i++)
-    if (!Paper_column::is_loose (list[i]))
-      return list[i];
-  return 0;
-}
-
-Column_description
-Column_description::get_column_description (vector<Grob *> const &cols, vsize col_index, bool line_starter)
-{
-  Grob *col = cols[col_index];
-  if (line_starter)
-    col = Item::maybe_find_prebroken_piece (dynamic_cast<Item *> (col), RIGHT);
-
-  Column_description description;
-  Grob *next_col = next_spaceable_column (cols, col_index);
-  if (next_col)
-    description.spring_ = Spaceable_grob::get_spring (col, next_col);
-
-  Grob *end_col = dynamic_cast<Item *> (cols[col_index + 1])->find_prebroken_piece (LEFT);
-  if (end_col)
-    description.end_spring_ = Spaceable_grob::get_spring (col, end_col);
-
-  for (SCM s = Spaceable_grob::get_minimum_distances (col);
-       scm_is_pair (s); s = scm_cdr (s))
-    {
-      Grob *other = unsmob_grob (scm_caar (s));
-      vsize j = binary_search (cols, other, Paper_column::less_than, col_index);
-      if (j != VPOS)
-        {
-          if (cols[j] == other)
-            description.rods_.push_back (Rod_description (j, scm_to_double (scm_cdar (s))));
-          else /* it must end at the LEFT prebroken_piece */
-            description.end_rods_.push_back (Rod_description (j, scm_to_double (scm_cdar (s))));
-        }
-    }
-
-  if (!line_starter && to_boolean (col->get_property ("keep-inside-line")))
-    description.keep_inside_line_ = col->extent (col, X_AXIS);
-
-  description.break_permission_ = col->get_property ("line-break-permission");
-  return description;
-}
\ No newline at end of file
index b3236a518c4a7c65d0dfaaa300bffe93936539a1..c8b7fc1d748bc06ae2074d33d436d77ab1bdd2e5 100644 (file)
@@ -436,10 +436,10 @@ Constrained_breaking::initialize ()
   breaks_ = pscore_->get_break_indices ();
   all_ = pscore_->root_system ()->used_columns ();
   lines_.resize (breaks_.size (), breaks_.size (), Line_details ());
-  vector<Simple_spacer> spacers
-    = pscore_->root_system ()->get_simple_spacers (other_lines.length (),
-                                                   other_lines.length () - first_line.length (),
-                                                   ragged_right_);
+  vector<Real> forces = get_line_forces (all_,
+                                         other_lines.length (),
+                                         other_lines.length () - first_line.length (),
+                                         ragged_right_);
   for (vsize i = 0; i + 1 < breaks_.size (); i++)
     {
       for (vsize j = i + 1; j < breaks_.size (); j++)
@@ -448,18 +448,9 @@ Constrained_breaking::initialize ()
           bool ragged = ragged_right_ || (last && ragged_last_);
           Line_details &line = lines_.at (j, i);
 
-          line.force_ = spacers[i * breaks_.size () + j].force_penalty (ragged_right_);
-          if (!spacers[i * breaks_.size () + j].fits ())
-            {
-              if (spacers[i * breaks_.size () + j].minimal_)
-                line.force_ = -200000;
-              else
-                line.force_ = infinity_f;
-            }
+          line.force_ = forces[i * breaks_.size () + j];
           if (ragged && last && !isinf (line.force_))
             line.force_ = (line.force_ < 0 && j > i + 1) ? infinity_f : 0;
-          if (!line.force_ && !spacers[i * breaks_.size () + j].line_len ())
-            line.force_ = infinity_f;
           if (isinf (line.force_))
             break;
 
index 2292d2fe0999b295623f8f9a064d7b96d90f1560..1aa0b728c0657618f6839be6818691cee898848a 100644 (file)
@@ -109,16 +109,17 @@ Dot_column::calc_positioning_done (SCM smob)
 
           y.add_point (y1);
           y.add_point (y2);
+
+          stems.insert (s);
         }
       else if (Note_head::has_interface (s))
-        y = Interval (-11);
+        y = Interval (-1.1, 1.1);
       else
         {
           programming_error ("unknown grob in dot col support");
           continue;
         }
 
-      y *= 2 / ss;
       y += Staff_symbol_referencer::get_position (s);
 
       Box b (s->extent (commonx, X_AXIS), y);
@@ -143,7 +144,14 @@ Dot_column::calc_positioning_done (SCM smob)
         }
     }
 
-  vector_sort (dots, position_less);
+  /*
+    The use of pure_position_less and pure_get_rounded_position below
+    are due to the fact that this callback is called before line breaking
+    occurs.  Because dots' actual Y posiitons may be linked to that of
+    beams (dots are attached to rests, which are shifted to avoid beams),
+    we instead must use their pure Y positions.
+  */
+  vector_sort (dots, pure_position_less);
   for (vsize i = dots.size (); i--;)
     {
       if (!dots[i]->is_live ())
@@ -170,7 +178,7 @@ Dot_column::calc_positioning_done (SCM smob)
           dp.x_extent_ = note->extent (commonx, X_AXIS);
         }
 
-      int p = Staff_symbol_referencer::get_rounded_position (dp.dot_);
+      int p = Staff_symbol_referencer::pure_get_rounded_position (dp.dot_);
 
       /* icky, since this should go via a Staff_symbol_referencer
          offset callback but adding a dot overwrites Y-offset. */
@@ -191,7 +199,7 @@ Dot_column::calc_positioning_done (SCM smob)
       /*
         Junkme?
        */
-      Staff_symbol_referencer::set_position (i->second.dot_, i->first);
+      Staff_symbol_referencer::pure_set_position (i->second.dot_, i->first);
     }
 
   me->translate_axis (cfg.x_offset () - me->relative_coordinate (commonx, X_AXIS),
index 4428b158daf194fda3663c523923ccfeccb99071..be375b540d96db2eee758c7b77b0b72560add285 100644 (file)
@@ -45,7 +45,7 @@ Dot_formatting_problem::best () const
 
 Dot_formatting_problem::Dot_formatting_problem (vector<Box> const &boxes,
                                                 Interval base_x)
-  : head_skyline_ (boxes, 0.0, Y_AXIS, RIGHT)
+  : head_skyline_ (boxes, 0.2, Y_AXIS, RIGHT)
 {
   best_ = 0;
   head_skyline_.set_minimum_height (base_x[RIGHT]);
diff --git a/lily/include/column-description.hh b/lily/include/column-description.hh
deleted file mode 100644 (file)
index 96d6a35..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-  This file is part of LilyPond, the GNU music typesetter.
-
-  Copyright (C) 2011--2012 Mike Solomon <mike@apollinemike.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/>.
-*/
-
-#ifndef COLUMN_DESCRIPTION_HH
-#define COLUMN_DESCRIPTION_HH
-
-#include "lily-proto.hh"
-#include "smobs.hh"
-#include "spring.hh"
-
-struct Rod_description
-{
-  vsize r_;
-  Real dist_;
-
-  bool operator < (const Rod_description r)
-  {
-    return r_ < r.r_;
-  }
-
-  Rod_description ()
-  {
-    r_ = 0;
-    dist_ = 0;
-  }
-
-  Rod_description (vsize r, Real d)
-  {
-    r_ = r;
-    dist_ = d;
-  }
-};
-
-struct Column_description
-{
-  vector<Rod_description> rods_;
-  vector<Rod_description> end_rods_;   /* use these if they end at the last column of the line */
-  Spring spring_;
-  Spring end_spring_;
-
-  SCM break_permission_;
-  Interval keep_inside_line_;
-
-  Column_description ()
-  {
-    break_permission_ = SCM_EOL;
-  }
-  static Column_description get_column_description (vector<Grob *> const &cols, vsize col_index, bool line_starter);
-};
-
-#endif /* COLUMN_DESCRIPTION_HH */
index d38897fc80fba9620012319112e6b065855ed5f7..c67b160636b5afa894975abb83dd50694a8ac85d 100644 (file)
@@ -40,7 +40,7 @@ public:
 
   static bool is_non_musical (Grob *);
   static bool break_visible (Grob *);
-  static Item *maybe_find_prebroken_piece (Item *g, Direction d);
+
   bool is_broken () const;
   virtual bool pure_is_visible (int start, int end) const;
 
index f7baf1010e286f359dd406779875087b5ba9bdb6..01a84d50dfd9a7085dfb7bbb1d13059e208ba507 100644 (file)
@@ -52,7 +52,6 @@ public:
 
   DECLARE_GROB_INTERFACE ();
   static int get_rank (Grob const *);
-  static bool is_loose (Grob *);
   static bool is_musical (Grob *);
   static Moment when_mom (Grob *);
   static bool is_used (Grob *);
index 64b59363f2975df2358fda9127ba8b7de9fb9ca2..675e3baf543882362218e19348f15822a99d3fd7 100644 (file)
@@ -30,8 +30,6 @@ class Simple_spacer
 public:
   Simple_spacer ();
 
-  bool minimal_;
-
   void solve (Real line_len, bool ragged);
   void add_rod (int l, int r, Real dist);
   void add_spring (Spring const &);
@@ -42,14 +40,12 @@ public:
 
   void set_force (Real force);
   Real force () const;
-  Real line_len () const;
   Real force_penalty (bool ragged) const;
   bool fits () const;
 
   DECLARE_SIMPLE_SMOBS (Simple_spacer);
 
 private:
-
   Real expand_line ();
   Real compress_line ();
   Real rod_force (int l, int r, Real dist);
@@ -61,6 +57,12 @@ private:
   bool fits_;
 };
 
+/* returns a vector of dimensions breaks.size () * breaks.size () */
+vector<Real> get_line_forces (vector<Grob *> const &columns,
+                              Real line_len,
+                              Real indent,
+                              bool ragged);
+
 Column_x_positions get_line_configuration (vector<Grob *> const &columns,
                                            Real line_len,
                                            Real indent,
index a3dd915c9ab85a96aed0986850f2091fdfbda3bb..179bae828f6905339b16ffa2757e67b9fb87fa12 100644 (file)
@@ -33,6 +33,7 @@ public:
   DECLARE_GROB_INTERFACE ();
   static bool ugly_hack (Grob *);
   static void set_position (Grob *, Real);
+  static void pure_set_position (Grob *, Real);
   DECLARE_SCHEME_CALLBACK (callback, (SCM element));
 
   /**
@@ -46,12 +47,19 @@ public:
   static bool on_staff_line (Grob *, int);
   static int line_count (Grob *);
   static Real get_position (Grob *);
+  static Real pure_get_position (Grob *);
   static Real staff_radius (Grob *);
   static int get_rounded_position (Grob *);
+  static int pure_get_rounded_position (Grob *);
   static Interval extent_in_staff (Grob *);
+
+private:
+  static void internal_set_position (Grob *, Real, bool);
+  static Real internal_get_position (Grob *, bool);
 };
 
 int compare_position (Grob *const &, Grob *const &);
 bool position_less (Grob *const &, Grob *const &);
+bool pure_position_less (Grob *const &, Grob *const &);
 #endif /* STAFF_SYMBOL_REFERENCER_HH */
 
index 613b9294fbacdbad6b731d8e8287118de749d8a1..f255ab53531d4833cb3ca24e6d31d2bdfbeb2f1e 100644 (file)
@@ -30,12 +30,13 @@ public:
   Stream_event ();
   VIRTUAL_COPY_CONSTRUCTOR (Stream_event, Stream_event);
 
-  Stream_event (SCM event_class, SCM mutable_props = SCM_EOL);
+  Stream_event (SCM event_class, SCM immutable_props = SCM_EOL);
   Stream_event (SCM class_name, Input *);
 
   Input *origin () const;
   void set_spot (Input *i);
   bool internal_in_event_class (SCM class_name);
+  void make_transposable ();
 
   virtual SCM copy_mutable_properties () const;
 
index c374c03cd97bc4cc26bdbf69ed964413090f0e9a..b1189769cd0703c4fa13978e64d2ca05871d087a 100644 (file)
@@ -32,7 +32,6 @@
 class System : public Spanner
 {
   int rank_;
-  vector<Simple_spacer> simple_spacers_;
   Grob_array *all_elements_;
   void init_elements ();
   friend class Paper_score;     // ugh.
@@ -46,8 +45,6 @@ public:
   Grob *get_pure_bound (Direction dir, int start, int end);
   Grob *get_maybe_pure_bound (Direction dir, bool pure, int start, int end);
   int get_rank () const;
-  vector<Simple_spacer> get_simple_spacers (Real line_len, Real indent, bool ragged);
-  void gen_simple_spacers (Real line_len, Real indent, bool ragged);
   vector<Real> get_footnote_heights_in_range (vsize st, vsize end);
   vector<Real> get_in_note_heights_in_range (vsize st, vsize end);
   vector<Real> internal_get_note_heights_in_range (vsize st, vsize end, bool foot);
index ff77f5feacc5995286bdb154c6a929ef471c871d..6ea5643a5445e7d791a119479e73d54a5fe7aead 100644 (file)
@@ -127,15 +127,6 @@ Item::find_broken_piece (System *l) const
   return 0;
 }
 
-Item *
-Item::maybe_find_prebroken_piece (Item *g, Direction d)
-{
-  Item *ret = g->find_prebroken_piece (d);
-  if (ret)
-    return ret;
-  return g;
-}
-
 Item *
 Item::find_prebroken_piece (Direction d) const
 {
index d8609ace96e2e6b56af077898edc1b0e7284a859..02dbe41499e644d184c356254933e4c1397fddfa 100644 (file)
@@ -290,8 +290,7 @@ Music::to_event () const
       for (; scm_is_pair (art_mus); art_mus = scm_cdr (art_mus))
         {
           Music *m = unsmob_music (scm_car (art_mus));
-          SCM ev = m ? m->to_event ()->unprotect () : scm_car (art_mus);
-          art_ev = scm_cons (ev, art_ev);
+          art_ev = scm_cons (m->to_event ()->unprotect (), art_ev);
         }
       e->set_property ("articulations", scm_reverse_x (art_ev, SCM_EOL));
     }
index f65a9992b9738bfab303dc64701c7005708da073..3d14a3649bef67db281fdf53475171e59561aa5f 100644 (file)
@@ -306,32 +306,55 @@ check_meshing_chords (Grob *me,
         shift_amount *= 0.75;
     }
 
-  /* If the dotted notes ended up on the left, and there are collisions,
-     tell the Dot_Columnn to avoid the notes on the right.
+  /* If any dotted notes ended up on the left,
+     tell the Dot_Columnn to avoid the note heads on the right.
    */
-  if (full_collide || close_half_collide || distant_half_collide)
+  if (shift_amount < -1e-6
+      && Rhythmic_head::dot_count (head_up))
     {
-      if (shift_amount < -1e-6
-          && Rhythmic_head::dot_count (head_up)
-          && !Rhythmic_head::dot_count (head_down))
+      Grob *d = unsmob_grob (head_up->get_object ("dot"));
+      Grob *parent = d->get_parent (X_AXIS);
+      if (Dot_column::has_interface (parent))
+        Side_position_interface::add_support (parent, head_down);
+    }
+  else if (Rhythmic_head::dot_count (head_down))
+    {
+      Grob *d = unsmob_grob (head_down->get_object ("dot"));
+      Grob *parent = d->get_parent (X_AXIS);
+      if (Dot_column::has_interface (parent))
         {
-          Grob *d = unsmob_grob (head_up->get_object ("dot"));
-          Grob *parent = d->get_parent (X_AXIS);
-          if (Dot_column::has_interface (parent))
-            Side_position_interface::add_support (parent, head_down);
+          Grob *stem = unsmob_grob (head_up->get_object ("stem"));
+          // Loop over all heads on an up-pointing-stem to see if dots
+          // need to clear any heads suspended on its right side.
+          extract_grob_set (stem, "note-heads", heads);
+          for (vsize i = 0; i < heads.size (); i++)
+            Side_position_interface::add_support (parent, heads[i]);
         }
-      else if (Rhythmic_head::dot_count (head_down)
-               && !Rhythmic_head::dot_count (head_up))
+    }
+
+  // In meshed chords with dots on the left, adjust dot direction
+  if (shift_amount > 1e-6
+      && Rhythmic_head::dot_count (head_down))
+    {
+      Grob *dot_down = unsmob_grob (head_down->get_object ("dot"));
+      Grob *col_down = dot_down->get_parent (X_AXIS);
+      Direction dir = UP;
+      if (Rhythmic_head::dot_count (head_up))
         {
-          Grob *d = unsmob_grob (head_down->get_object ("dot"));
-          Grob *parent = d->get_parent (X_AXIS);
-          if (Dot_column::has_interface (parent))
-            {
-              Grob *stem = unsmob_grob (head_up->get_object ("stem"));
-              extract_grob_set (stem, "note-heads", heads);
-              for (vsize i = 0; i < heads.size (); i++)
-                Side_position_interface::add_support (parent, heads[i]);
-            }
+          Grob *dot_up = unsmob_grob (head_up->get_object ("dot"));
+          Grob *col_up = dot_up->get_parent (X_AXIS);
+          if (col_up == col_down) // let the common DotColumn arrange dots
+            dir = CENTER;
+          else // conform to the dot direction on the up-stem chord
+            dir = robust_scm2dir (dot_up->get_property ("direction"), UP);
+        }
+      if (dir != CENTER)
+        {
+          Grob *stem = unsmob_grob (head_down->get_object ("stem"));
+          extract_grob_set (stem, "note-heads", heads);
+          for (vsize i = 0; i < heads.size (); i++)
+            unsmob_grob (heads[i]->get_object ("dot"))
+              ->set_property ("direction", scm_from_int (dir));
         }
     }
 
index 0c7b3f387fa807779cd606436981e7b0b61e054c..a8c5e0eea8d7ed1d1d163606ba91f327f4907912 100644 (file)
@@ -123,12 +123,6 @@ Paper_column::when_mom (Grob *me)
   return Moment (0);
 }
 
-bool
-Paper_column::is_loose (Grob *g)
-{
-  return (scm_is_pair (g->get_object ("between-cols")));
-}
-
 bool
 Paper_column::is_musical (Grob *me)
 {
index 9c5ea78e229639937026a4303872bee0d205ffca..efb9c132e876b2dad09d6c3d4078d35c447cbb95 100644 (file)
@@ -265,6 +265,7 @@ Quote_iterator::process (Moment m)
 
                   Pitch diff = pitch_interval (qp, mp);
                   ev = ev->clone ();
+                 ev->make_transposable ();
 
                   transpose_mutable (ev->get_property_alist (true), diff);
                   transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_);
index 39f9cfa195c27af5fbb4a851f7e02286bbfc0fb3..fd8c6798c4026290804a49d570d18ff8b22a2c91 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <cstdio>
 
-#include "column-description.hh"
 #include "column-x-positions.hh"
 #include "dimensions.hh"
 #include "international.hh"
@@ -83,12 +82,6 @@ Simple_spacer::force () const
   return force_;
 }
 
-Real
-Simple_spacer::line_len () const
-{
-  return line_len_;
-}
-
 bool
 Simple_spacer::fits () const
 {
@@ -302,6 +295,179 @@ Simple_spacer::force_penalty (bool ragged) const
 
 /****************************************************************/
 
+struct Rod_description
+{
+  vsize r_;
+  Real dist_;
+
+  bool operator < (const Rod_description r)
+  {
+    return r_ < r.r_;
+  }
+
+  Rod_description ()
+  {
+    r_ = 0;
+    dist_ = 0;
+  }
+
+  Rod_description (vsize r, Real d)
+  {
+    r_ = r;
+    dist_ = d;
+  }
+};
+
+struct Column_description
+{
+  vector<Rod_description> rods_;
+  vector<Rod_description> end_rods_;   /* use these if they end at the last column of the line */
+  Spring spring_;
+  Spring end_spring_;
+
+  SCM break_permission_;
+  Interval keep_inside_line_;
+
+  Column_description ()
+  {
+    break_permission_ = SCM_EOL;
+  }
+};
+
+static bool
+is_loose (Grob *g)
+{
+  return (scm_is_pair (g->get_object ("between-cols")));
+}
+
+static Grob *
+maybe_find_prebroken_piece (Grob *g, Direction d)
+{
+  Grob *ret = dynamic_cast<Item *> (g)->find_prebroken_piece (d);
+  if (ret)
+    return ret;
+  return g;
+}
+
+static Grob *
+next_spaceable_column (vector<Grob *> const &list, vsize starting)
+{
+  for (vsize i = starting + 1; i < list.size (); i++)
+    if (!is_loose (list[i]))
+      return list[i];
+  return 0;
+}
+
+static Column_description
+get_column_description (vector<Grob *> const &cols, vsize col_index, bool line_starter)
+{
+  Grob *col = cols[col_index];
+  if (line_starter)
+    col = maybe_find_prebroken_piece (col, RIGHT);
+
+  Column_description description;
+  Grob *next_col = next_spaceable_column (cols, col_index);
+  if (next_col)
+    description.spring_ = Spaceable_grob::get_spring (col, next_col);
+
+  Grob *end_col = dynamic_cast<Item *> (cols[col_index + 1])->find_prebroken_piece (LEFT);
+  if (end_col)
+    description.end_spring_ = Spaceable_grob::get_spring (col, end_col);
+
+  for (SCM s = Spaceable_grob::get_minimum_distances (col);
+       scm_is_pair (s); s = scm_cdr (s))
+    {
+      Grob *other = unsmob_grob (scm_caar (s));
+      vsize j = binary_search (cols, other, Paper_column::less_than, col_index);
+      if (j != VPOS)
+        {
+          if (cols[j] == other)
+            description.rods_.push_back (Rod_description (j, scm_to_double (scm_cdar (s))));
+          else /* it must end at the LEFT prebroken_piece */
+            description.end_rods_.push_back (Rod_description (j, scm_to_double (scm_cdar (s))));
+        }
+    }
+
+  if (!line_starter && to_boolean (col->get_property ("keep-inside-line")))
+    description.keep_inside_line_ = col->extent (col, X_AXIS);
+
+  description.break_permission_ = col->get_property ("line-break-permission");
+  return description;
+}
+
+vector<Real>
+get_line_forces (vector<Grob *> const &columns,
+                 Real line_len, Real indent, bool ragged)
+{
+  vector<vsize> breaks;
+  vector<Real> force;
+  vector<Grob *> non_loose;
+  vector<Column_description> cols;
+  SCM force_break = ly_symbol2scm ("force");
+
+  for (vsize i = 0; i < columns.size (); i++)
+    if (!is_loose (columns[i]) || Paper_column::is_breakable (columns[i]))
+      non_loose.push_back (columns[i]);
+
+  breaks.clear ();
+  breaks.push_back (0);
+  cols.push_back (Column_description ());
+  for (vsize i = 1; i + 1 < non_loose.size (); i++)
+    {
+      if (Paper_column::is_breakable (non_loose[i]))
+        breaks.push_back (cols.size ());
+
+      cols.push_back (get_column_description (non_loose, i, false));
+    }
+  breaks.push_back (cols.size ());
+  force.resize (breaks.size () * breaks.size (), infinity_f);
+
+  for (vsize b = 0; b + 1 < breaks.size (); b++)
+    {
+      cols[breaks[b]] = get_column_description (non_loose, breaks[b], true);
+      vsize st = breaks[b];
+
+      for (vsize c = b + 1; c < breaks.size (); c++)
+        {
+          vsize end = breaks[c];
+          Simple_spacer spacer;
+
+          for (vsize i = breaks[b]; i < end - 1; i++)
+            spacer.add_spring (cols[i].spring_);
+          spacer.add_spring (cols[end - 1].end_spring_);
+
+          for (vsize i = breaks[b]; i < end; i++)
+            {
+              for (vsize r = 0; r < cols[i].rods_.size (); r++)
+                if (cols[i].rods_[r].r_ < end)
+                  spacer.add_rod (i - st, cols[i].rods_[r].r_ - st, cols[i].rods_[r].dist_);
+              for (vsize r = 0; r < cols[i].end_rods_.size (); r++)
+                if (cols[i].end_rods_[r].r_ == end)
+                  spacer.add_rod (i - st, end - st, cols[i].end_rods_[r].dist_);
+              if (!cols[i].keep_inside_line_.is_empty ())
+                {
+                  spacer.add_rod (i - st, end - st, cols[i].keep_inside_line_[RIGHT]);
+                  spacer.add_rod (0, i - st, -cols[i].keep_inside_line_[LEFT]);
+                }
+            }
+          spacer.solve ((b == 0) ? line_len - indent : line_len, ragged);
+          force[b * breaks.size () + c] = spacer.force_penalty (ragged);
+
+          if (!spacer.fits ())
+            {
+              if (c == b + 1)
+                force[b * breaks.size () + c] = -200000;
+              else
+                force[b * breaks.size () + c] = infinity_f;
+              break;
+            }
+          if (end < cols.size () && cols[end].break_permission_ == force_break)
+            break;
+        }
+    }
+  return force;
+}
+
 Column_x_positions
 get_line_configuration (vector<Grob *> const &columns,
                         Real line_len,
@@ -315,7 +481,7 @@ get_line_configuration (vector<Grob *> const &columns,
   ret.cols_.push_back (dynamic_cast<Item *> (columns[0])->find_prebroken_piece (RIGHT));
   for (vsize i = 1; i + 1 < columns.size (); i++)
     {
-      if (Paper_column::is_loose (columns[i]))
+      if (is_loose (columns[i]))
         ret.loose_cols_.push_back (columns[i]);
       else
         ret.cols_.push_back (columns[i]);
@@ -326,7 +492,7 @@ get_line_configuration (vector<Grob *> const &columns,
      the end_XXX_ fields of our column_description */
   for (vsize i = 0; i + 1 < ret.cols_.size (); i++)
     {
-      cols.push_back (Column_description::get_column_description (ret.cols_, i, i == 0));
+      cols.push_back (get_column_description (ret.cols_, i, i == 0));
       spacer.add_spring (cols[i].spring_);
     }
   for (vsize i = 0; i < cols.size (); i++)
@@ -363,6 +529,7 @@ get_line_configuration (vector<Grob *> const &columns,
   return ret;
 }
 
+
 #include "ly-smobs.icc"
 
 IMPLEMENT_SIMPLE_SMOBS (Simple_spacer);
index bf82ac636fce0e1ff60d54aa7c8e8695cebca00b..dc22f904844af91e488aea7eacb03e7ed558abf2 100644 (file)
@@ -69,9 +69,6 @@ Span_bar_engraver::process_acknowledged ()
 {
   if (make_spanbar_)
     {
-      Grob *vag = Grob::get_root_vertical_alignment (bars_[0]);
-      if (vag)
-        vector_sort (bars_, Grob::pure_vertical_less);
       spanbar_ = make_item ("SpanBar", SCM_EOL);
 
       spanbar_->set_parent (bars_[0], X_AXIS);
index 1cda85f2a755d6eef8eede44a65653e1825708f2..74c2c448c61c2407bb14778050b62c354f91b3ab 100644 (file)
@@ -74,13 +74,27 @@ Staff_symbol_referencer::line_thickness (Grob *me)
 
 Real
 Staff_symbol_referencer::get_position (Grob *me)
+{
+  return internal_get_position (me, false);
+}
+
+Real
+Staff_symbol_referencer::pure_get_position (Grob *me)
+{
+  return internal_get_position (me, true);
+}
+
+Real
+Staff_symbol_referencer::internal_get_position (Grob *me, bool pure)
 {
   Real p = 0.0;
   Grob *st = get_staff_symbol (me);
   Grob *c = st ? me->common_refpoint (st, Y_AXIS) : 0;
   if (st && c)
     {
-      Real y = me->relative_coordinate (c, Y_AXIS)
+      Real y = (pure
+                ? me->pure_relative_y_coordinate (c, 0, INT_MAX)
+                : me->relative_coordinate (c, Y_AXIS))
                - st->relative_coordinate (c, Y_AXIS);
       Real space = Staff_symbol::staff_space (st);
       p = (space == 0) ? 0 : 2.0 * y / space;
@@ -113,6 +127,12 @@ Staff_symbol_referencer::get_rounded_position (Grob *me)
   return int (rint (get_position (me)));
 }
 
+int
+Staff_symbol_referencer::pure_get_rounded_position (Grob *me)
+{
+  return int (rint (pure_get_position (me)));
+}
+
 MAKE_SCHEME_CALLBACK (Staff_symbol_referencer, callback, 1);
 SCM
 Staff_symbol_referencer::callback (SCM smob)
@@ -144,12 +164,24 @@ will be extracted from staff-position */
 
 void
 Staff_symbol_referencer::set_position (Grob *me, Real p)
+{
+  internal_set_position (me, p, false);
+}
+
+void
+Staff_symbol_referencer::pure_set_position (Grob *me, Real p)
+{
+  internal_set_position (me, p, true);
+}
+
+void
+Staff_symbol_referencer::internal_set_position (Grob *me, Real p, bool pure)
 {
   Grob *st = get_staff_symbol (me);
   Real oldpos = 0.0;
   if (st && me->common_refpoint (st, Y_AXIS))
     {
-      oldpos = get_position (me);
+      oldpos = pure ? pure_get_position (me) : get_position (me);
     }
 
   Real ss = Staff_symbol_referencer::staff_space (me);
@@ -177,6 +209,13 @@ position_less (Grob *const &a, Grob *const &b)
          < Staff_symbol_referencer::get_position (b);
 }
 
+bool
+pure_position_less (Grob *const &a, Grob *const &b)
+{
+  return Staff_symbol_referencer::pure_get_position (a)
+         < Staff_symbol_referencer::pure_get_position (b);
+}
+
 ADD_INTERFACE (Staff_symbol_referencer,
                "An object whose Y@tie{}position is meant relative to a staff"
                " symbol.  These usually"
index 4b8ff7fa1e03114075c8884edd184fedf1ab5078..117559b87c52871bca8d5739b22f1dcf122265c6 100644 (file)
@@ -22,7 +22,8 @@
 #include "ly-smobs.icc"
 #include "context.hh"
 #include "input.hh"
-#include "input.hh"
+#include "music.hh"
+#include "pitch.hh"
 
 /* TODO: Rename Stream_event -> Event */
 
@@ -31,11 +32,10 @@ Stream_event::Stream_event ()
 {
 }
 
-Stream_event::Stream_event (SCM event_class, SCM mutable_props)
+Stream_event::Stream_event (SCM event_class, SCM immutable_props)
   : Prob (ly_symbol2scm ("Stream_event"),
-          scm_list_1 (scm_cons (ly_symbol2scm ("class"), event_class)))
+          scm_acons (ly_symbol2scm ("class"), event_class, immutable_props))
 {
-  mutable_property_alist_ = mutable_props;
 }
 
 Stream_event::Stream_event (SCM class_name, Input *origin)
@@ -76,6 +76,29 @@ Stream_event::internal_in_event_class (SCM class_name)
 MAKE_SCHEME_CALLBACK (Stream_event, undump, 1);
 MAKE_SCHEME_CALLBACK (Stream_event, dump, 1);
 
+void
+Stream_event::make_transposable ()
+{
+  /* This is in preparation for transposing stuff
+     that may be defined in the immutable part */
+
+  for (SCM s = immutable_property_alist_; scm_is_pair (s); s = scm_cdr (s))
+    {
+      SCM entry = scm_car (s);
+      SCM prop = scm_car (entry);
+      SCM val = scm_cdr (entry);
+
+      if ((unsmob_pitch (val)
+          || (prop == ly_symbol2scm ("element") && unsmob_music (val))
+          || (prop == ly_symbol2scm ("elements") && scm_is_pair (val))
+          || (prop == ly_symbol2scm ("pitch-alist") && scm_is_pair (val)))
+         && scm_is_false (scm_assq (prop, mutable_property_alist_)))
+       mutable_property_alist_ =
+         scm_acons (prop, ly_music_deep_copy (val), mutable_property_alist_);
+    }
+}
+
+
 SCM
 Stream_event::dump (SCM self)
 {
index 2645892ef8680f5ff6f1bd0467f315cd9b548457..bc59dede88787e7d9e517d80473ae66c7164cd79 100644 (file)
@@ -23,7 +23,6 @@
 #include "all-font-metrics.hh"
 #include "axis-group-interface.hh"
 #include "break-align-interface.hh"
-#include "column-description.hh"
 #include "grob-array.hh"
 #include "hara-kiri-group-spanner.hh"
 #include "international.hh"
@@ -783,82 +782,6 @@ System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interva
   return 0;
 }
 
-vector<Simple_spacer>
-System::get_simple_spacers (Real line_len, Real indent, bool ragged)
-{
-  if (!simple_spacers_.size ())
-    gen_simple_spacers (line_len, indent, ragged);
-
-  return simple_spacers_;
-}
-
-void
-System::gen_simple_spacers (Real line_len, Real indent, bool ragged)
-{
-  vector<vsize> breaks;
-  vector<Grob *> non_loose;
-  vector<Column_description> cols;
-  SCM force_break = ly_symbol2scm ("force");
-  vector<Grob *> columns = used_columns ();
-
-  for (vsize i = 0; i < columns.size (); i++)
-    if (!Paper_column::is_loose (columns[i])
-        || Paper_column::is_breakable (columns[i]))
-      non_loose.push_back (columns[i]);
-
-  breaks.clear ();
-  breaks.push_back (0);
-  cols.push_back (Column_description ());
-  for (vsize i = 1; i + 1 < non_loose.size (); i++)
-    {
-      if (Paper_column::is_breakable (non_loose[i]))
-        breaks.push_back (cols.size ());
-
-      cols.push_back (Column_description::get_column_description (non_loose, i, false));
-    }
-  breaks.push_back (cols.size ());
-  simple_spacers_.resize (breaks.size () * breaks.size (), Simple_spacer ());
-
-  for (vsize b = 0; b + 1 < breaks.size (); b++)
-    {
-      cols[breaks[b]] = Column_description::get_column_description (non_loose, breaks[b], true);
-      vsize st = breaks[b];
-
-      for (vsize c = b + 1; c < breaks.size (); c++)
-        {
-          vsize end = breaks[c];
-          Simple_spacer spacer;
-
-          for (vsize i = breaks[b]; i < end - 1; i++)
-            spacer.add_spring (cols[i].spring_);
-          spacer.add_spring (cols[end - 1].end_spring_);
-
-          for (vsize i = breaks[b]; i < end; i++)
-            {
-              for (vsize r = 0; r < cols[i].rods_.size (); r++)
-                if (cols[i].rods_[r].r_ < end)
-                  spacer.add_rod (i - st, cols[i].rods_[r].r_ - st, cols[i].rods_[r].dist_);
-              for (vsize r = 0; r < cols[i].end_rods_.size (); r++)
-                if (cols[i].end_rods_[r].r_ == end)
-                  spacer.add_rod (i - st, end - st, cols[i].end_rods_[r].dist_);
-              if (!cols[i].keep_inside_line_.is_empty ())
-                {
-                  spacer.add_rod (i - st, end - st, cols[i].keep_inside_line_[RIGHT]);
-                  spacer.add_rod (0, i - st, -cols[i].keep_inside_line_[LEFT]);
-                }
-            }
-          spacer.solve ((b == 0) ? line_len - indent : line_len, ragged);
-          spacer.minimal_ = c == b + 1;
-          simple_spacers_[b * breaks.size () + c] = spacer;
-
-          if (!spacer.fits ()
-              || (end < cols.size ()
-                  && cols[end].break_permission_ == force_break))
-            break;
-        }
-    }
-}
-
 Interval
 System::pure_refpoint_extent (vsize start, vsize end)
 {
index 5ccf2bad6866fdb74f9fbcfbfd459f5404443eb9..dbbd782cfbe7a219a09d7ec6d41a14330ace36b0 100644 (file)
@@ -655,13 +655,16 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
                                   number->extent (commony, Y_AXIS)[dir]));
     }
 
-  if (to_boolean (me->get_property ("avoid-scripts")))
+  if (to_boolean (me->get_property ("avoid-scripts"))
+      && !scm_is_number (me->get_property ("outside-staff-priority")))
     {
       extract_grob_set (me, "scripts", scripts);
       for (vsize i = 0; i < scripts.size (); i++)
         {
           if (!scripts[i]->is_live ())
             continue;
+          if (scm_is_number (scripts[i]->get_property ("outside-staff-priority")))
+            continue;
 
           Interval script_x (scripts[i]->extent (commonx, X_AXIS));
           Interval script_y (scripts[i]->extent (commony, Y_AXIS));
index 47dfba728c05d06b48f50b34a0327bfa1d1f30cd..31c0edbc848417c399ae74fbec903ae46bcb1f11 100644 (file)
@@ -60,7 +60,6 @@
 
   \consists "Font_size_engraver"
   \consists "Separating_line_group_engraver"
-  \consists "Dot_column_engraver"
   \consists "Staff_collecting_engraver"
 
  %% perhaps move to Voice context?
@@ -226,6 +225,7 @@ multiple voices on the same staff."
   \consists "Breathing_sign_engraver"
   \consists "Note_heads_engraver"
   \consists "Dots_engraver"
+  \consists "Dot_column_engraver"
   \consists "Rest_engraver"
   \consists "Tweak_engraver"
   \consists "Footnote_engraver"
index 3627b5005497d92fc55795c68bd7968707f524a6..910cadc1200f6c3ab663dd0faf3ae4ab0911253e 100644 (file)
@@ -18,7 +18,7 @@ TELY_FILES = $(call src-wildcard,*.tely)
 DOCBOOK_FILES = $(call src-wildcard,*.lyxml)
 
 OUT_HTML_FILES = ${HTML_FILES:%.html=$(outdir)/%.html}
-OUT_HTMLY_FILES = ${HTML_FILES:%.htmly=$(outdir)/%.html}
+OUT_HTMLY_FILES = ${HTMLY_FILES:%.htmly=$(outdir)/%.html}
 OUT_XML_FILES = ${XML_FILES:%.xml=$(outdir)/%.html}
 # If we have pdflatex, create the pdf, otherwise only the .tex file!
 ifeq (,$(findstring dblatex,$(MISSING_OPTIONAL)))
index 219eb262cea6ef91e8c88160e9eab6f2b6f9f2cd..a5cee58b96a226dd70e3eb9b13bdfae9895bac4e 100644 (file)
@@ -6,6 +6,7 @@ $(outdir)/%.ly:  %.midi
 $(outdir)/%.midi: %.ly $(LILYPOND_BINARY)
        touch $(foreach f, $(HEADER_FIELDS), $(outdir)/$*.$f)
        $(LILYPOND_BINARY) $(HEADER_FIELDS:%=-H %) -o $(outdir) $<
+       cp $< $(outdir)
 
 $(outdir)/%-midi.ly: $(outdir)/%.midi $(MIDI2LY)
        (echo '\header {'; for f in $(HEADER_FIELDS); do echo -n $$f'="'; cat $(outdir)/$*.$$f; echo '"'; done; echo '}') > $(outdir)/$*.header
index ba6d43e09f075bc033a5fa017f93d19878fa9c39..42ccdbe54114d6febe319ab73366434f2ed137ef 100644 (file)
@@ -381,5 +381,5 @@ def process_html_files (package_name = '',
                     out_f.write (page_flavors[k][1])
                     out_f.close()
         # if the page is translated, a .en.html symlink is necessary for content negotiation
-        if target == 'online' and ext_list != ['']:
+        if target == 'online' and ext_list != [''] and not os.path.lexists (name_filter (prefix + '.en.html')):
             os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html'))
index 32cb5a502424e86a0560dd45bf16bba8d966da68..b7d845f765bc3162c75696d127a780e511f8654f 100644 (file)
@@ -392,7 +392,7 @@ def conv (str):
     return str
 
 
-@rule ((1, 3, 93), _ ('change property definiton case (eg. onevoice -> oneVoice)'))
+@rule ((1, 3, 93), _ ('change property definition case (eg. onevoice -> oneVoice)'))
 def conv (str):
     # Ugh, but meaning of \stemup changed too
     # maybe we should do \stemup -> \stemUp\slurUp\tieUp ?
index 767e253fa2afe94c29ef10ec5b307481f44b2228..734b366f6b7ed91a0232ac36dae090ab7b7675b5 100755 (executable)
@@ -505,7 +505,7 @@ class TextFileCompareLink (FileCompareLink):
         str = ''
         if oldnew == 1:
             str = '\n'.join ([d.replace ('\n','') for d in self.diff_lines])
-        str = '<font size="-2"><pre>%s</pre></font>' % str
+        str = '<font size="-2"><pre>%s</pre></font>' % cgi.escape (str)
         return str
 
 class LogFileCompareLink (TextFileCompareLink):
@@ -528,7 +528,7 @@ class ProfileFileLink (FileCompareLink):
                 str += '%-8s: %8d (%5.3f)\n' % (k, int (self.results[oldnew][k]),
                                                 self.get_ratio (k))
 
-        return '<pre>%s</pre>' % str
+        return '<pre>%s</pre>' % cgi.escape (str)
 
     def get_ratio (self, key):
         (v1,v2) = (self.results[0].get (key, -1),
@@ -827,7 +827,7 @@ class ComparisonData:
                 re.sub (r'\\sourcefilename "([^"]+)"',
                         note_original, open (sf).read ())
             else:
-                print 'no source for', val
+                print 'no source for', val.file_names[1]
 
     def compare_trees (self, dir1, dir2):
         self.compare_directories (dir1, dir2)
@@ -842,6 +842,10 @@ class ComparisonData:
             sys.exit(1)
 
         for d in dirs:
+            # don't walk the share folders
+            if d.startswith("share"):
+                continue
+
             d1 = os.path.join (dir1, d)
             d2 = os.path.join (dir2, d)
 
@@ -887,14 +891,18 @@ class ComparisonData:
                 self.compare_general_files (klasses[ext], f1, f2)
 
     def compare_general_files (self, klass, f1, f2):
+        prefix = os.path.commonprefix ([f1, f2])
         name = os.path.split (f1)[1]
+        name = os.path.join (prefix, name)
 
         file_link = klass (f1, f2)
         self.file_links[name] = file_link
 
     def compare_signature_files (self, f1, f2):
+        prefix = os.path.commonprefix ([f1, f2])
         name = os.path.split (f1)[1]
         name = re.sub ('-[0-9]+.signature', '', name)
+        name = os.path.join (prefix, name)
 
         file_link = None
         try:
@@ -947,13 +955,10 @@ class ComparisonData:
         out.write ('%d below threshold\n' % len (below))
         out.write ('%d unchanged\n' % len (unchanged))
 
-    def create_text_result_page (self, dir1, dir2, dest_dir, threshold):
+    def create_text_result_page (self, dest_dir, threshold):
         self.write_text_result_page (dest_dir + '/index.txt', threshold)
 
-    def create_html_result_page (self, dir1, dir2, dest_dir, threshold):
-        dir1 = dir1.replace ('//', '/')
-        dir2 = dir2.replace ('//', '/')
-
+    def create_html_result_page (self, dest_dir, threshold):
         (changed, below, unchanged) = self.thresholded_results (threshold)
 
         header_row = '''
@@ -1049,8 +1054,8 @@ def compare_tree_pairs (tree_pairs, dest_dir, threshold):
         system ('rm -rf %s '% dest_dir)
 
     data.write_changed (dest_dir, threshold)
-    data.create_html_result_page (dir1, dir2, dest_dir, threshold)
-    data.create_text_result_page (dir1, dir2, dest_dir, threshold)
+    data.create_html_result_page (dest_dir, threshold)
+    data.create_text_result_page (dest_dir, threshold)
 
 ################################################################
 # TESTING
index 7e8ffefbd624a59510fbf0d5cc49d8c5df52105f..129c1217d325ecfc148eafac80f20e3590fdb9e6 100644 (file)
@@ -153,7 +153,7 @@ for file in html_files:
         lang = ''
         # possibly necessary for automatic language selection
         file_symlink = file.replace(".html", ".en.html")
-        if (not (os.path.exists(file_symlink))):
+        if not os.path.lexists (file_symlink):
             os.symlink (file, file_symlink)
     elif (len(file_split) == 3):
         # it's a translation
index 7ec91dd80bc27bb2bff6c41c90aba3247af916a5..784a978f20dafc9ffbaa22488caaf1b7451fbf2f 100644 (file)
@@ -82,7 +82,7 @@ for t in targets:
     for l in symlinks:
         p = mirrortree.new_link_path (os.path.normpath (os.readlink (l)), os.path.dirname (l), strip_re)
         dest = strip_file_name[t] (l)
-        if not os.path.exists (dest):
+        if not os.path.lexists (dest):
             os.symlink (p, dest)
 
 
index 9bf72876bf58327ebd67ffaede6dcd57906e399c..2772acc7382c144590cb73ca2da6c3db58603059 100644 (file)
@@ -39,6 +39,8 @@ import convertrules
 lilypond_version_re_str = '\\\\version *\"([0-9.]+)"'
 lilypond_version_re = re.compile (lilypond_version_re_str)
 
+lilypond_version_strict_re_str = '\\\\version *\"([0-9]+[.][0-9]+[.][0-9]+)"'
+lilypond_version_strict_re = re.compile (lilypond_version_strict_re_str)
 
 help_summary = (
 _ ('''Update LilyPond input to newer version.  By default, update from the
@@ -206,9 +208,12 @@ string."""
 
 
 def guess_lilypond_version (input):
-    m = lilypond_version_re.search (input)
+    m = lilypond_version_strict_re.search (input)
     if m:
         return m.group (1)
+    m = lilypond_version_re.search (input)
+    if m:
+        raise InvalidVersion (m.group (1))
     else:
         return ''
 
index 28e3db0308b3eb177dacb5537457b72cba2370d9..a3133d6aeae0e10522058c5accab51c641650f38 100644 (file)
@@ -24,11 +24,11 @@ endif
        touch $@
 
 # Copy files while tracking their dependencies.
-$(outdir)/%.texi: $(src-dir)/%.texi
+$(outdir)/%.texi: %.texi
        mkdir -p $(dir $@)
        $(DO_TEXI_DEP) cp -f $< $@
 
-$(outdir)/%.itexi: $(src-dir)/%.itexi
+$(outdir)/%.itexi: %.itexi
        mkdir -p $(dir $@)
        $(DO_TEXI_DEP) cp -f $< $@