gcstat*.scm
lily-[0-9a-f][0-9a-f][0-9a-f]*
out-scons
+out-cov
tags
test-output-distance
$(MAKE) -C input/regression/ out=test clean
test:
-## no aa-scaling, no PDF
- $(MAKE) -C input/regression/ out=test LILYPOND_BOOK_LILYPOND_FLAGS="--backend=eps --formats=ps,png $(LILYPOND_JOBS) -dinclude-eps-fonts -dgs-load-fonts --header=texidoc -I $(top-src-dir)/input/manual -ddump-profile -dcheck-internal-types -ddump-signatures -danti-alias-factor=1" LILYPOND_BOOK_VERBOSE= out-test/collated-files.html
+ $(MAKE) -C input/regression/ out=test LILYPOND_BOOK_LILYPOND_FLAGS="--backend=eps --formats=ps $(LILYPOND_JOBS) -dinclude-eps-fonts -dgs-load-fonts --header=texidoc -I $(top-src-dir)/input/manual -ddump-profile -dcheck-internal-types -ddump-signatures -danti-alias-factor=1" LILYPOND_BOOK_VERBOSE= out-test/collated-files.html
@find input ly -name '*.ly' -print |grep -v 'out.*/' | xargs grep '\\version' -L | grep -v "standard input" |sed 's/^/**** Missing version: /g'
-
-
RESULT_DIR=$(top-build-dir)/out/test-results/
local-check: test
rm -rf $(RESULT_DIR)
mkdir -p $(RESULT_DIR)
- $(PYTHON) $(buildscript-dir)/output-distance.py --output-dir $(RESULT_DIR) $(CHECK_SOURCE) input/regression/out-test/
+ $(PYTHON) $(buildscript-dir)/output-distance.py --create-images --output-dir $(RESULT_DIR) $(CHECK_SOURCE) input/regression/out-test/
#!/bin/sh
-./configure --enable-config=cov --disable-optimising
-make conf=cov -j2 clean
-perl -i~ -pe 's/-pipe /-fprofile-arcs -ftest-coverage -pipe /g' config-cov.make
-perl -i~ -pe 's/ -ldl / -lgcov -ldl /g' config-cov.make
+
+if test "$1" == "--fresh"; then
+ fresh=yes
+fi
+
+if test ! -f config-cov.make; then
+ fresh=yes
+fi
+
+if test "$fresh" = "yes";
+then
+ ./configure --enable-config=cov --disable-optimising
+ make conf=cov -j2 clean
+ perl -i~ -pe 's/-pipe /-fprofile-arcs -ftest-coverage -pipe /g' config-cov.make
+ perl -i~ -pe 's/ -ldl / -lgcov -ldl /g' config-cov.make
+else
+ find -name '*.gcda' -exec rm '{}' ';'
+fi
+
+
make conf=cov -j2
make conf=cov test-clean LILYPOND_JOBS=
make conf=cov test LILYPOND_JOBS= >& out-cov/test-run.log
+rm -rf out-cov
+mkdir out-cov
+
cd out-cov
ln ../lily/* .
ln ../lily/out-cov/*[ch] .
do
gcov -o ../lily/out-cov/ -p $a > $a.gcov-summary
done
+
+python buildscripts/coverage.py
results.sort ()
results.reverse()
+
+print 'files sorted by number of untested lines (decreasing)'
+print
+print '%5s (%6s): %s' % ('cov %', 'lines', 'file')
+print '----------------------------------------------'
+
for (pain, d) in results:
print '%(cov)5.2f (%(lines)6d): %(file)s' % d
self.add_system_link (link, system_index[0])
+
+ def create_images (self, old_dir, new_dir, dest_dir):
+
+ files_created = [[], []]
+ for oldnew in (0, 1):
+ pat = self.base_names[oldnew] + '.eps'
+
+ for f in glob.glob (pat):
+ infile = f
+ outfile = (dest_dir + '/' + f).replace ('.eps', '.png')
+
+ mkdir (os.path.split (outfile)[0])
+ cmd = ('gs -sDEVICE=png16m -dGraphicsAlphaBits=4 -dTextAlphaBits=4 '
+ ' -r101 '
+ ' -sOutputFile=%(outfile)s -dNOSAFER -dEPSCrop -q -dNOPAUSE '
+ ' %(infile)s -c quit ' % locals ())
+
+ files_created[oldnew].append (outfile)
+ system (cmd)
+
+ return files_created
+
def link_files_for_html (self, old_dir, new_dir, dest_dir):
- png_linked = [[], []]
- for ext in ('.png', '.ly', '-page*png'):
-
+ to_compare = [[], []]
+
+ exts = ['.ly']
+ if options.create_images:
+ to_compare = self.create_images (old_dir, new_dir, dest_dir)
+ else:
+ exts += ['.png', '-page*png']
+
+ for ext in exts:
for oldnew in (0,1):
for f in glob.glob (self.base_names[oldnew] + ext):
dst = dest_dir + '/' + f
link_file (f, dst)
if f.endswith ('.png'):
- png_linked[oldnew].append (f)
+ to_compare[oldnew].append (f)
if options.compare_images:
- for (old,new) in zip (png_linked[0], png_linked[1]):
+ for (old, new) in zip (to_compare[0], to_compare[1]):
compare_png_images (old, new, dest_dir)
+
def html_record_string (self, old_dir, new_dir):
def img_cell (ly, img, name):
</font>
</td>
''' % locals ()
-
def multi_img_cell (ly, imgs, name):
if not name:
name = 'source'
def test_compare_trees ():
system ('rm -rf dir1 dir2')
system ('mkdir dir1 dir2')
- system ('cp 20{-*.signature,.ly,.png} dir1')
- system ('cp 20{-*.signature,.ly,.png} dir2')
- system ('cp 20expr{-*.signature,.ly,.png} dir1')
- system ('cp 19{-*.signature,.ly,.png} dir2/')
- system ('cp 19{-*.signature,.ly,.png} dir1/')
+ system ('cp 20{-*.signature,.ly,.png,.eps} dir1')
+ system ('cp 20{-*.signature,.ly,.png,.eps} dir2')
+ system ('cp 20expr{-*.signature,.ly,.png,.eps} dir1')
+ system ('cp 19{-*.signature,.ly,.png,.eps} dir2/')
+ system ('cp 19{-*.signature,.ly,.png,.eps} dir1/')
system ('cp 19-1.signature 19-sub-1.signature')
system ('cp 19.ly 19-sub.ly')
system ('cp 19.png 19-sub.png')
+ system ('cp 19.eps 19-sub.eps')
system ('cp 20multipage* dir1')
system ('cp 20multipage* dir2')
system ('mkdir -p dir1/subdir/ dir2/subdir/')
- system ('cp 19-sub{-*.signature,.ly,.png} dir1/subdir/')
- system ('cp 19-sub{-*.signature,.ly,.png} dir2/subdir/')
- system ('cp 20grob{-*.signature,.ly,.png} dir2/')
- system ('cp 20grob{-*.signature,.ly,.png} dir1/')
+ system ('cp 19-sub{-*.signature,.ly,.png,.eps} dir1/subdir/')
+ system ('cp 19-sub{-*.signature,.ly,.png,.eps} dir2/subdir/')
+ system ('cp 20grob{-*.signature,.ly,.png,.eps} dir2/')
+ system ('cp 20grob{-*.signature,.ly,.png,.eps} dir1/')
## introduce differences
system ('cp 19-1.signature dir2/20-1.signature')
action="store_false",
help="Don't run graphical comparisons")
+ p.add_option ('--create-images',
+ dest="create_images",
+ default=False,
+ action="store_true",
+ help="Create PNGs from EPSes")
+
p.add_option ('-o', '--output-dir',
dest="output_dir",
default=None,
--- /dev/null
+
+\version "2.10.7"
+\header {
+ texidoc = "Clusters behave well across line breaks."
+}
+
+\layout { ragged-right = ##t }
+
+fragment = \relative c' {
+ \time 2/4
+ <e d'>4
+ <g a>4 | \break
+ <e a>
+ <f a>
+}
+
+<< \new Staff \makeClusters \fragment
+ \new Staff \fragment
+>>
+
+
--- /dev/null
+
+
+\version "2.10.7"
+\header {
+ texidoc = "Clusters behave well across line breaks."
+}
+
+\layout { ragged-right = ##t }
+
+fragment = \relative c' {
+ <e d'>4
+ <g a>4
+ <e a>4
+}
+
+<<
+ \time 2/4
+ \new Staff {
+ \override ClusterSpanner #'style = #'ramp
+ \makeClusters \fragment
+ r4
+ \override ClusterSpanner #'style = #'leftsided-stairs
+ \makeClusters \fragment
+ r4
+ \override ClusterSpanner #'style = #'rightsided-stairs
+ \makeClusters \fragment
+ r4
+ \override ClusterSpanner #'style = #'centered-stairs
+ \makeClusters \fragment
+ }
+
+>>
+
+
<<
\new Staff \fragment
- \new Staff \applyMusic #notes-to-clusters \fragment
+ \new Staff \makeClusters \fragment
>>
--- /dev/null
+\header
+{
+ texidoc = "Extender engraver also notices the lack of note heads.
+Here the extender ends on the 2nd quarter note, despite the grace note
+without a lyric attached."
+
+}
+
+\version "2.10.7"
+
+\layout {
+ ragged-right = ##t
+}
+
+\relative c'' {
+ \time 3/4
+ d4~ d4 r4
+ \grace es8
+
+ d4
+
+}
+\addlyrics { x __ x }
+
\version "2.10.0"
+\layout {
+ ragged-right = ##t
+}
%% TODO: should have 2/4 + 5/8 time sig style.
-\context Staff
+\context Staff \with {
+ \consists "Measure_grouping_engraver"
+ }
+
\relative c' {
#(set-time-signature 2 4)
c8 a'4 a8~
#(set-time-signature 5 8 '(3 2))
g8 a4 g a4.->
}
-\layout {
- ragged-right = ##t
- \context {
- \Staff
- \consists "Measure_grouping_engraver"
- }
-}
--- /dev/null
+\header {
+
+ texidoc = "Width of marks does not affect spacing."
+
+}
+
+\version "2.10.7"
+
+\paper {
+ ragged-right = ##t
+}
+
+\relative c''
+{
+ \override Score.RehearsalMark #'break-visibility = #begin-of-line-invisible
+ c1
+ \mark "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
+}
ragged-right = ##t
}
+
+makamGlyphs = #'((1 . "accidentals.doublesharp")
+ (8/9 . "accidentals.sharp.slashslashslash.stemstem")
+ (5/9 . "accidentals.sharp.slashslashslash.stem")
+ (4/9 . "accidentals.sharp")
+ (1/9 . "accidentals.sharp.slashslash.stem")
+ (0 . "accidentals.natural")
+ (-1/9 . "accidentals.mirroredflat")
+ (-4/9 . "accidentals.flat.slash")
+ (-5/9 . "accidentals.flat")
+ (-8/9 . "accidentals.flat.slashslash")
+ (-1 . "accidentals.flatflat")
+ )
+
\relative {
%{ define alteration <-> symbol mapping. The following glyphs are available.
%}
+ \override Accidental #'glyph-name-alist = \makamGlyphs
- \override Accidental #'glyph-name-alist = #'((1 . "accidentals.doublesharp")
- (8/9 . "accidentals.sharp.slashslashslash.stemstem")
- (5/9 . "accidentals.sharp.slashslashslash.stem")
- (4/9 . "accidentals.sharp")
- (1/9 . "accidentals.sharp.slashslash.stem")
- (0 . "accidentals.natural")
- (-1/9 . "accidentals.mirroredflat")
- (-4/9 . "accidentals.flat.slash")
- (-5/9 . "accidentals.flat")
- (-8/9 . "accidentals.flat.slashslash")
- (-1 . "accidentals.flatflat")
- )
-
-
+ \override Staff.KeySignature #'glyph-name-alist = \makamGlyphs
+ \set Staff.keySignature = #'(
+ (3 . 4/9)
+ (6 . -1/9))
c cc db fk gbm gfc gfb efk dfbm
}
/*
Across a line break we anticipate on the next pitches.
*/
- if (spanner->original ())
+ if (Spanner *next = spanner->broken_neighbor (RIGHT))
{
- Spanner *orig = dynamic_cast<Spanner *> (spanner->original ());
-
- if (spanner->get_break_index () < orig->broken_intos_.size () - 1)
+ extract_grob_set (next, "columns", next_cols);
+ if (next_cols.size () > 0)
{
- Spanner *next = orig->broken_intos_[spanner->get_break_index () + 1];
- vector<Grob*> const &next_cols = extract_grob_array (next, "columns");
- if (next_cols.size () > 0)
- {
- Grob *next_commony = common_refpoint_of_array (next_cols, next, Y_AXIS);
- Grob *col = next_cols[0];
-
- Interval v = col->extent (next_commony, Y_AXIS);
- Real x = right_bound->relative_coordinate (commonx, X_AXIS) - left_coord;
-
- bottom_points.insert (bottom_points.begin (),
- Offset (x, v[DOWN]));
- top_points.insert (top_points.begin (), Offset (x, v[UP]));
- }
+ Grob *next_commony = common_refpoint_of_array (next_cols, next, Y_AXIS);
+ Grob *col = next_cols[0];
+
+ Interval v = col->extent (next_commony, Y_AXIS);
+ Real x = right_bound->relative_coordinate (commonx, X_AXIS) - left_coord;
+
+ bottom_points.push_back (Offset (x, v[DOWN]));
+ top_points.push_back (Offset (x, v[UP]));
}
}
- reverse (bottom_points);
- reverse (top_points);
-
Stencil out = brew_cluster_piece (me, bottom_points, top_points);
out.translate_axis (- me->relative_coordinate (commony, Y_AXIS), Y_AXIS);
return out.smobbed_copy ();
ly_symbol2scm ("heads"), h);
}
}
-
+ else
+ {
+ if (pending_extender_)
+ {
+ completize_extender (pending_extender_);
+ pending_extender_ = 0;
+ }
+
+ }
if (extender_)
{
pending_extender_ = extender_;
#include "engraver.hh"
+#include "grob-array.hh"
#include "context.hh"
#include "item.hh"
#include "pointer-group-interface.hh"
{
if (last_spacing_
&& last_spacing_parent_context_
- && last_spacing_parent_context_ == context ()->get_parent_context ())
+ && last_spacing_parent_context_ == context ()->get_parent_context ()
+ && !unsmob_grob_array (last_spacing_->get_object ("right-items")))
{
SCM ccol = get_property ("currentCommandColumn");
Grob *column = unsmob_grob (ccol);
addquote =
#(define-music-function (parser location name music) (string? ly:music?)
- "Add a piece of music to be quoted "
+ (_i "Add a piece of music to be quoted ")
(add-quotable parser name music)
(make-music 'SequentialMusic 'void #t))
-
afterGraceFraction =
#(cons 6 8)
clef =
#(define-music-function (parser location type)
(string?)
-
- "Set the current clef."
+ (_i "Set the current clef.")
(make-clef-set type))
featherDurations=
#(define-music-function (parser location factor argument) (ly:moment? ly:music?)
-
- "Rearrange durations in ARGUMENT so there is an
-acceleration/deceleration. "
+ (_i "Rearrange durations in ARGUMENT so there is an
+acceleration/deceleration. ")
(let*
((orig-duration (ly:music-length argument))
(string? symbol? scheme?)
- "Set @var{property} to @var{value} in all grobs named @var{name}.
+ (_i "Set @var{property} to @var{value} in all grobs named @var{name}.
The @var{name} argument is a string of the form @code{\"Context.GrobName\"}
-or @code{\"GrobName\"}"
+or @code{\"GrobName\"}")
(let*
((name-components (string-split name #\.))
octave =
#(define-music-function (parser location pitch-note) (ly:music?)
- "octave check"
+ (_i "octave check")
(make-music 'RelativeOctaveCheck
'origin location
parenthesize =
#(define-music-function (parser loc arg) (ly:music?)
- "Tag @var{arg} to be parenthesized."
+ (_i "Tag @var{arg} to be parenthesized.")
(set! (ly:music-property arg 'parenthesize) #t)
arg)
parallelMusic =
#(define-music-function (parser location voice-ids music) (list? ly:music?)
- "Define parallel music sequences, separated by '|' (bar check signs),
+ (_i "Define parallel music sequences, separated by '|' (bar check signs),
and assign them to the identifiers provided in @var{voice-ids}.
@var{voice-ids}: a list of music identifiers (symbols containing only letters)
B = { d d | e e | }
C = { e e | f f | }
@end verbatim
-"
+")
(let* ((voices (apply circular-list (make-list (length voice-ids) (list))))
(current-voices voices)
(current-sequence (list)))
#(define-music-function
(parser location reference-note)
(ly:music?)
- "Set the octave inside a \\relative section."
+ (_i "Set the octave inside a \\relative section.")
(let*
((notes (ly:music-property reference-note 'elements))
shiftDurations =
#(define-music-function (parser location dur dots arg) (integer? integer? ly:music?)
- ""
-
+ (_i "")
(music-map
(lambda (x)
spacingTweaks =
#(define-music-function (parser location parameters) (list?)
- "Set the system stretch, by reading the 'system-stretch property of
- the `parameters' assoc list."
+ (_i "Set the system stretch, by reading the 'system-stretch property of
+the `parameters' assoc list.")
#{
\overrideProperty #"Score.NonMusicalPaperColumn"
#'line-break-system-details
includePageLayoutFile =
#(define-music-function (parser location) ()
- "If page breaks and tweak dump is not asked, and the file
- <basename>-page-layout.ly exists, include it."
+ (_i "If page breaks and tweak dump is not asked, and the file
+<basename>-page-layout.ly exists, include it.")
(if (not (ly:get-option 'dump-tweaks))
(let ((tweak-filename (format #f "~a-page-layout.ly"
(ly:parser-output-name parser))))
rightHandFinger =
#(define-music-function (parser location finger) (number-or-string?)
- "Define a StrokeFingerEvent"
+ (_i "Define a StrokeFingerEvent")
(apply make-music
(append
scoreTweak =
#(define-music-function (parser location name) (string?)
- "Include the score tweak, if exists."
+ (_i "Include the score tweak, if exists.")
(if (and page-layout-parser (not (ly:get-option 'dump-tweaks)))
(let ((tweak-music (ly:parser-lookup page-layout-parser
(string->symbol name))))
(parser location what dir pitch-note main-music)
(string? ly:dir? ly:music? ly:music?)
- "Insert notes from the part @var{what} into a voice called @code{cue},
+ (_i "Insert notes from the part @var{what} into a voice called @code{cue},
using the transposition defined by @var{pitch-note}. This happens
simultaneously with @var{main-music}, which is usually a rest. The
argument @var{dir} determines whether the cue notes should be notated
-as a first or second voice."
+as a first or second voice.")
(make-music 'QuoteMusic
'element main-music
transposition =
#(define-music-function (parser location pitch-note) (ly:music?)
- "Set instrument transposition"
+ (_i "Set instrument transposition")
(context-spec-music
(make-property-set 'instrumentTransposition
tweak = #(define-music-function (parser location sym val arg)
(symbol? scheme? ly:music?)
- "Add @code{sym . val} to the @code{tweaks} property of @var{arg}."
-
+ (_i "Add @code{sym . val} to the @code{tweaks} property of @var{arg}.")
(set!
(ly:music-property arg 'tweaks)
tag = #(define-music-function (parser location tag arg)
(symbol? ly:music?)
- "Add @var{tag} to the @code{tags} property of @var{arg}."
+ (_i "Add @var{tag} to the @code{tags} property of @var{arg}.")
(set!
(ly:music-property arg 'tags)
withMusicProperty =
#(define-music-function (parser location sym val music) (symbol? scheme? ly:music?)
- "Set @var{sym} to @var{val} in @var{music}."
+ (_i "Set @var{sym} to @var{val} in @var{music}.")
(set! (ly:music-property music sym) val)
music)
$(outdir)/lilypond.html: $(outdir)/lilypond.nexi
-$(MAKEINFO) -I$(outdir) --output=$@ --css-include=$(top-src-dir)/Documentation/texinfo.css --html --no-split --no-headers $<
-local-WWW: png-ln $(outdir)/lilypond.html $(outdir)/lilypond/index.html deep-ln lang-merge
+local-WWW: $(outdir)/lilypond.html $(outdir)/lilypond/index.html lang-merge
lang-merge:
$(foreach i, $(shell find $(outdir) -name '*.html' | xargs grep -L --label="" 'UNTRANSLATED NODE: IGNORE ME'), ln -f $(i) $(i:$(outdir)/%.html=$(depth)/Documentation/user/$(outdir)/%.$(ISOLANG).html) &&) true
-png-ln:
- mkdir -p $(outdir)/lilypond
- # makeinfo is broken, it MUST have PNGs in output dir
- # symlinking PNGs...
-
-## cmd too long FIXME / JUNKME.
-## $(foreach i, $(shell find $(depth)/Documentation/user/$(outdir) -maxdepth 1 -name '*.png'), ln -sf ../$(i) $(i:$(depth)/Documentation/user/$(outdir)/%.png=$(outdir)/%.png) &&) true
-## $(foreach i, $(shell find $(depth)/Documentation/user/$(outdir)/lilypond -name '*.png'), ln -sf ../../$(i) $(i:$(depth)/Documentation/user/$(outdir)/%.png=$(outdir)/%.png) &&) true
-
-# Links referred to by Documentation index
-# BROKEN: the following makes broken symlinks
-#LILYPOND_LINKS = Reference-Manual.html Tutorial.html Ly2dvi.html Midi2ly.html
-
-
-deep-ln:
- mkdir -p $(outdir)/lilypond
- cd $(outdir)/lilypond && $(foreach i, $(LILYPOND_LINKS),\
- rm -f $(i) && ln -s lilypond.html $(i) &&) true
-
local-WWW-clean: deep-WWW-clean
deep-WWW-clean:
(let* ((completed (completize-formats formats))
(base (string-regexp-substitute "\\.[a-z]+$" "" filename))
(intermediate (remove (lambda (x) (member x formats)) completed)))
+
(for-each (lambda (f)
((eval (string->symbol (format "convert-to-~a" f))
module) paper-book filename)) completed)
;;;; (c) 1998--2006 Jan Nieuwenhuizen <janneke@gnu.org>
;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
+;; Internationalisation: (_i "to be translated") gets an entry in the
+;; POT file (gettext ) must be invoked explicitely to do the actual
+;; "translation".
+;;(define-macro (_i x) x)
+;;(define-macro-public _i (x) x)
+;;(define-public-macro _i (x) x)
+;; Abbrv-PWR!
+(defmacro-public _i (x) x)
(define (define-scheme-options)
(for-each (lambda (x)
(stats (gc-stats)))
(list
- (- (+ (tms:utime t)
- (tms:stime t))
+ (- (tms:utime t)
(ly:assoc-get 'gc-time-taken stats))
;; difficult to put memory amount stats into here.
be_verbose=global_options.verbose,
progress_p=1)
- if global_options.format in (HTML, TEXINFO):
+ if global_options.format in (HTML, TEXINFO) and '--formats' not in cmd:
cmd += ' --formats=png '
- if global_options.format in (DOCBOOK):
+ elif global_options.format in (DOCBOOK) and '--formats' not in cmd:
cmd += ' --formats=png,pdf '
+
+
# UGH
# the --process=CMD switch is a bad idea
# it is too generic for lilypond-book.