-config.hh
*-midi.ly
*-systems.tex
*-systems.texi
.htaccess
/.sconf_temp
/.sconsign.dblite
+/GNUmakefile
/scons.cache
+/x
?.*
AUTHORS.txt
-/GNUmakefile
INSTALL.txt
TAGS
\#*
a.out
aclocal.m4
autom4te.cache
+config.hh
config.log
config.make
config.status
config.status.lineno
configure
gcstat*.scm
-lily-[0-9][0-9][0-9]*
+lily-[0-9a-f][0-9a-f][0-9a-f]*
out-scons
tags
+test-output-distance
these forms
@example
-\context \applyOutput #'Score #@var{function}
-\context \applyOutput #'Staff #@var{function}
+\applyOutput #'Score #@var{function}
+\applyOutput #'Staff #@var{function}
@end example
@end itemize
package = packagepython.Package (srcdir)
version = packagepython.version_tuple_to_str (package.version)
-ENV = { 'PATH' : os.environ['PATH'] }
-for key in ['LD_LIBRARY_PATH', 'GUILE_LOAD_PATH', 'PKG_CONFIG_PATH', 'TEXMF']:
+ENV = { 'PYTHONPATH': '' }
+for key in ['GUILE_LOAD_PATH', 'LD_LIBRARY_PATH', 'PATH', 'PKG_CONFIG_PATH',
+ 'PYTHONPATH', 'TEXMF']:
if os.environ.has_key (key):
ENV[key] = os.environ[key]
+ENV['PYTHONPATH'] = os.path.join (srcdir, 'python') + ':' + ENV['PYTHONPATH']
+
env = Environment (
ENV = ENV,
BYTEORDER = sys.byteorder.upper (),
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=11
-PATCH_LEVEL=2
+PATCH_LEVEL=3
MY_PATCH_LEVEL=
################################################################
# different systems of a .ly file.
+def read_pipe (c):
+ print 'pipe' , c
+ return os.popen (c).read ()
+
+def system (c):
+ print 'system' , c
+ s = os.system (c)
+ if s :
+ raise Exception ("failed")
+ return
+
+def compare_png_images (old, new, dir):
+ def png_dims (f):
+ m = re.search ('([0-9]+) x ([0-9]+)', read_pipe ('file %s' % f))
+
+ return tuple (map (int, m.groups ()))
+
+ dims1 = png_dims (old)
+ dims2 = png_dims (new)
+
+ dims = (min (dims1[0], dims2[0]),
+ min (dims1[1], dims2[1]))
+
+ system ('convert -crop %dx%d+0+0 %s crop1.png' % (dims + (old,)))
+ system ('convert -crop %dx%d+0+0 %s crop2.png' % (dims + (new,)))
+
+ system ('compare crop1.png crop2.png diff.png')
+
+ system ("convert diff.png -border 2 -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity' matte.png")
+
+ dest = os.path.join (dir, new.replace ('.png', '.compare.png'))
+ system ("composite matte.png %(new)s %(dest)s" % locals ())
class FileLink:
def __init__ (self):
self.add_system_link (link, system_index[0])
def link_files_for_html (self, old_dir, new_dir, dest_dir):
+ png_linked = [[], []]
for ext in ('.png', '.ly', '-page*png'):
+
for oldnew in (0,1):
for f in glob.glob (self.base_names[oldnew] + ext):
- print f
- link_file (f, dest_dir + '/' + f)
+ dst = dest_dir + '/' + f
+ link_file (f, dst)
+
+ if f.endswith ('.png'):
+ png_linked[oldnew].append (f)
+
+ for (old,new) in zip (png_linked[0], png_linked[1]):
+ compare_png_images (old, new, dest_dir)
def html_record_string (self, old_dir, new_dir):
def img_cell (ly, img, name):
def cell (base, name):
- pages = glob.glob (base + '-page*.png')
-
+ pat = base + '-page*.png'
+ pages = glob.glob (pat)
+
if pages:
return multi_img_cell (base + '.ly', sorted (pages), name)
else:
</tr>
''' % (self.distance (), html_2,
cell (self.base_names[0], name),
- cell (self.base_names[1], name))
+ cell (self.base_names[1], name).replace ('.png', '.compare.png'))
return html_entry
link.link_files_for_html (dir1, dir2, dest_dir)
link.write_html_system_details (dir1, dir2, dest_dir)
+
html += link.html_record_string (dir1, dir2)
## introduce differences
system ('cp 19-1.signature dir2/20-1.signature')
+ system ('cp 19.png dir2/20.png')
+ system ('cp 19multipage-page1.png dir2/20multipage-page1.png')
system ('cp 20-1.signature dir2/subdir/19-sub-1.signature')
+ system ('cp 20.png dir2/subdir/19-sub.png')
## radical diffs.
system ('cp 19-1.signature dir2/20grob-1.signature')
def run_tests ():
- dir = 'output-distance-test'
+ dir = 'test-output-distance'
do_clean = not os.path.exists (dir)
MergeKern($2)
-#
-# NCSB is broken as shipped by Fedora Core 6
-# it contains bogus ligatures TM and No in the AFM file.
+# The AFM files of `New Century Schoolbook' family as distributed within the
+# urw-fonts-1.0.7pre41.tar.bz2 archive contain a bunch of ligatures which
+# shouldn't be active by default:
#
-# Remove the TM glyph - for want of better FF fix.
-err = SelectIf("trademark");
-if ( err > 0 )
- Cut();
-elseif ( err == 0 )
- Print("Could not find \"trademark\" glyph");
-elseif ( err < 0 )
- Print("An error occurred while searching for the \"trademark\" glyph");
-endif
-
+# T + M -> trademark
+# N + o -> afii61352
+# i + j -> ij
+# I + J -> IJ
+#
+# This font bundle is shipped by Fedora Core 6 and other GNU/Linux
+# distributions; we simply remove those ligatures.
-# Remove the No. glyph - for want of better FF fix.
-err = SelectIf("afii61352");
-if ( err > 0 )
- Cut();
-elseif ( err == 0 )
- Print("Could not find \"numero\" glyph");
-elseif ( err < 0 )
- Print("An error occurred while searching for the \"numero\" glyph");
-endif
+SelectIf("trademark", "trademark", \
+ "afii61352", "afii61352", \
+ "ij", "ij", \
+ "IJ", "IJ");
+RemoveATT("Ligature", "*", "*");
Generate($3 + $fontname + ".otf");
+# EOF
--- /dev/null
+\header {
+
+ texidoc = "In 'modern accidental style, the last note should
+have an accidental sign. "
+
+}
+\version "2.10.3"
+
+\score {
+ \new Staff {
+ \relative c' {
+ #(set-accidental-style 'modern)
+ d4 dis'4 d,2^"this should have accidental"
+ }
+ }
+}
--- /dev/null
+\header
+{
+
+texidoc = "Even in case of incorrect contexts (eg. shortlived
+ contexts) that break linking of columns through spacing wishes,
+ @code{strict-note-spacing} defaults to a robust solution."
+
+}
+
+\version "2.11.2"
+
+
+%% \new Staff cause shortlived, disconnected Voice contexts
+%% breaking spacing-wishes links.
+\new Staff {
+ \override Score.SpacingSpanner #'strict-note-spacing = ##t
+ \afterGrace c'4 {c'32 c'32 }
+ c'4
+}
\header {
texidoc = "System separators maybe defined as markups in the
-@code{systemSeparator} field of the bookpaper block. They are centered
+@code{systemSeparator} field of the paper block. They are centered
between the boundary staffs of each system. "
}
/* Huh. Don't understand what this is good for. --hwn. */
- SCM val;
- while (trans && trans->where_defined (ly_symbol2scm ("localKeySignature"), &val))
+ while (trans)
{
trans->set_property ("localKeySignature", ly_deep_copy (last_keysig_));
trans = trans->get_parent_context ();
SCM entry = scm_car (s);
if (scm_is_pair (scm_car (entry))
&& scm_cdar (entry) == scm_from_int (n))
- from_other_octaves = scm_cdr (entry);
+ {
+ from_other_octaves = scm_cdr (entry);
+ break;
+ }
}
- if (from_same_octave != SCM_BOOL_F
+ if (!ignore_octave
+ && from_same_octave != SCM_BOOL_F
&& recent_enough (bar_number, from_same_octave, laziness))
previous_alteration = from_same_octave;
else if (ignore_octave
if (Note_column::has_rests (i.grob ()) || i.grob ()->get_parent (X_AXIS))
return;
+ if (to_boolean (i.grob ()->get_property ("ignore-collision")))
+ return;
+
note_columns_.push_back (i.grob ());
}
}
"The file is looked up using the search path. ")
{
SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG1, __FUNCTION__, "string");
- int sz = -1;
+ int sz = INT_MAX;
if (size != SCM_UNDEFINED)
{
SCM_ASSERT_TYPE (scm_is_number (size), size, SCM_ARG2, __FUNCTION__, "number");
TODO: prune to public interface.
*/
class Spacing_spanner
+
{
public:
+ static void set_distances_for_loose_col (Grob *me, Grob *c, Drul_array<Item *> next_door, Spacing_options const *);
static void generate_pair_spacing (Grob *me,
Paper_column *l, Paper_column *r,
Paper_column *nextr,
/** This complicated routine moves note columns around horizontally to
ensure that notes don't clash.
- This should be put into Scheme.
*/
SCM
Note_collision_interface::automatic_shift (Grob *me,
"@code{force-hshift} and @code{horizontal-shift}.",
/* properties */
+ "ignore-collision "
"merge-differently-dotted "
"merge-differently-headed "
"positioning-done ");
vector<Grob*> const &
internal_extract_grob_array (Grob const *elt, SCM symbol)
{
- return ly_scm2link_array (elt->internal_get_object (symbol));
+ return elt
+ ? ly_scm2link_array (elt->internal_get_object (symbol))
+ : empty_array;
}
vector<Item*>
if (!to_boolean (col->get_property ("allow-loose-spacing")))
return false;
+
if ((options->float_nonmusical_columns_
||options->float_grace_columns_)
&& Paper_column::when_mom (col).grace_part_)
- return true;
+ {
+ return true;
+ }
+
if (Paper_column::is_musical (col)
|| Paper_column::is_breakable (col))
return false;
- extract_grob_set (col, "right-neighbors", rns);
- extract_grob_set (col, "left-neighbors", lns);
-
/*
If this column doesn't have a proper neighbor, we should really
make it loose, but spacing it correctly is more than we can
such a borderline case.)
*/
+
+ extract_grob_set (col, "right-neighbors", rns);
+ extract_grob_set (col, "left-neighbors", lns);
+
if (lns.empty () || rns.empty ())
return false;
+
Item *l_neighbor = dynamic_cast<Item *> (lns[0]);
Item *r_neighbor = dynamic_cast<Item *> (rns[0]);
return true;
}
+void
+Spacing_spanner::set_distances_for_loose_col (Grob *me, Grob *c,
+ Drul_array<Item *> next_door,
+ Spacing_options const *options)
+{
+ Direction d = LEFT;
+ Drul_array<Real> dists (0, 0);
+
+ do
+ {
+ Item *lc = dynamic_cast<Item *> ((d == LEFT) ? next_door[LEFT] : c);
+ Item *rc = dynamic_cast<Item *> (d == LEFT ? c : next_door[RIGHT]);
+
+ extract_grob_set (lc, "spacing-wishes", wishes);
+ for (vsize k = wishes.size (); k--;)
+ {
+ Grob *sp = wishes[k];
+ if (Note_spacing::left_column (sp) != lc
+ || Note_spacing::right_column (sp) != rc)
+ continue;
+
+ if (Note_spacing::has_interface (sp))
+ {
+ /*
+ The note spacing should be taken from the musical
+ columns.
+ */
+ Real space = 0.0;
+ Real fixed = 0.0;
+ bool dummy = false;
+
+ Real base = note_spacing (me, lc, rc, options, &dummy);
+ Note_spacing::get_spacing (sp, rc, base, options->increment_,
+ &space, &fixed);
+
+ space -= options->increment_;
+
+ dists[d] = max (dists[d], space);
+ }
+ else if (Staff_spacing::has_interface (sp))
+ {
+ Real space = 0;
+ Real fixed_space = 0;
+ Staff_spacing::get_spacing_params (sp,
+ &space, &fixed_space);
+
+ dists[d] = max (dists[d], fixed_space);
+ }
+ else
+ programming_error ("Subversive spacing wish");
+ }
+ }
+ while (flip (&d) != LEFT);
+
+ Rod r;
+ r.distance_ = dists[LEFT] + dists[RIGHT];
+ r.item_drul_ = next_door;
+
+ r.add_to_cols ();
+}
+
+
/*
Remove columns that are not tightly fitting from COLS. In the
removed columns, set 'between-cols to the columns where it is in
*/
extract_grob_set (unsmob_grob (rns), "right-items", right_items);
- c->set_object ("between-cols", scm_cons (lns,
- right_items[0]->self_scm ()));
-
- /*
- Set distance constraints for loose columns
- */
- Drul_array<Grob *> next_door (cols->at (i - 1),
- cols->at (i + 1));
- Direction d = LEFT;
- Drul_array<Real> dists (0, 0);
-
- do
+ if (right_items.size () == 0 || !unsmob_grob (lns))
{
- Item *lc = dynamic_cast<Item *> ((d == LEFT) ? next_door[LEFT] : c);
- Item *rc = dynamic_cast<Item *> (d == LEFT ? c : next_door[RIGHT]);
-
- extract_grob_set (lc, "spacing-wishes", wishes);
- for (vsize k = wishes.size (); k--;)
- {
- Grob *sp = wishes[k];
- if (Note_spacing::left_column (sp) != lc
- || Note_spacing::right_column (sp) != rc)
- continue;
-
- if (Note_spacing::has_interface (sp))
- {
- /*
- The note spacing should be taken from the musical
- columns.
- */
- Real space = 0.0;
- Real fixed = 0.0;
- bool dummy = false;
-
- Real base = note_spacing (me, lc, rc, options, &dummy);
- Note_spacing::get_spacing (sp, rc, base, options->increment_,
- &space, &fixed);
-
- space -= options->increment_;
-
- dists[d] = max (dists[d], space);
- }
- else if (Staff_spacing::has_interface (sp))
- {
- Real space = 0;
- Real fixed_space = 0;
- Staff_spacing::get_spacing_params (sp,
- &space, &fixed_space);
-
- dists[d] = max (dists[d], fixed_space);
- }
- else
- programming_error ("Subversive spacing wish");
- }
+ c->programming_error ("Can't determine neighbors for floating column. ");
+ c->set_object ("between-cols", scm_cons (cols->at (i-1)->self_scm (),
+ cols->at (i+1)->self_scm ()));
}
- while (flip (&d) != LEFT);
+ else
+ {
+ c->set_object ("between-cols", scm_cons (lns,
+ right_items[0]->self_scm ()));
- Rod r;
- r.distance_ = dists[LEFT] + dists[RIGHT];
- r.item_drul_[LEFT] = dynamic_cast<Item *> (cols->at (i - 1));
- r.item_drul_[RIGHT] = dynamic_cast<Item *> (cols->at (i + 1));
+ /*
+ Set distance constraints for loose columns
+ */
+ Drul_array<Item *> next_door (dynamic_cast<Item*> (cols->at (i - 1)),
+ dynamic_cast<Item*> (cols->at (i + 1)));
- r.add_to_cols ();
+ set_distances_for_loose_col (me, c, next_door, options);
+ }
}
- else
+
+ if (!loose)
newcols.push_back (c);
}
using namespace std;
void
-Tie_column::add_tie (Grob *me, Grob *tie)
+Tie_column::add_tie (Grob *tc, Grob *tie)
{
+ Spanner *me = dynamic_cast<Spanner *> (tc);
+
if (tie->get_parent (Y_AXIS)
&& Tie_column::has_interface (tie->get_parent (Y_AXIS)))
return;
- if (!Pointer_group_interface::count (me, ly_symbol2scm ("ties")))
+ if (!me->get_bound (LEFT)
+ || (Paper_column::get_rank (me->get_bound (LEFT)->get_column ())
+ > Paper_column::get_rank (dynamic_cast<Spanner*> (tie)->get_bound (LEFT)->get_column ())))
{
- dynamic_cast<Spanner *> (me)->set_bound (LEFT, Tie::head (tie, LEFT));
- dynamic_cast<Spanner *> (me)->set_bound (RIGHT, Tie::head (tie, RIGHT));
+ me->set_bound (LEFT, Tie::head (tie, LEFT));
+ me->set_bound (RIGHT, Tie::head (tie, RIGHT));
}
-
+
tie->set_parent (me, Y_AXIS);
Pointer_group_interface::add_grob (me, ly_symbol2scm ("ties"), tie);
}
(ly:message (_ "Converting to `~a'...") pdf-name)
(ly:progress "\n")
- (ly:system cmd)
- ))
+ (ly:system cmd)))
(use-modules (scm ps-to-png))
;; GS produces PNG files like BASE-page%d.png.
;;(ly:message (_ "Converting to `~a'...")
;; (string-append (basename name ".ps") "-page1.png" )))
- (let ((verbose (ly:get-option 'verbose))
- (rename-page-1 #f))
-
+ (let* ((verbose (ly:get-option 'verbose))
+ (rename-page-1 #f))
(ly:message (_ "Converting to ~a...") "PNG")
-
(make-ps-images name
#:resolution resolution
- #:page-width paper-width
+ #:page-width paper-width
#:page-height paper-height
#:rename-page-1 rename-page-1
#:be-verbose verbose
#:anti-alias-factor (ly:get-option 'anti-alias-factor)
- #:pixmap-format (ly:get-option 'pixmap-format)
- )
-
+ #:pixmap-format (ly:get-option 'pixmap-format))
(ly:progress "\n")))
(define-public (postprocess-output paper-book module filename formats)
- (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)
-
+ (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)
(if (ly:get-option 'delete-intermediate-files)
- (for-each
- (lambda (f)
- (delete-file (string-append base "." f)))
- intermediate))
- ))
+ (for-each (lambda (f)
+ (delete-file (string-append base "." f))) intermediate))))
(define-public (completize-formats formats)
(define new-fmts '())
-
(if (member "png" formats)
(set! formats (cons "ps" formats)))
(if (member "pdf" formats)
(set! formats (cons "ps" formats)))
-
- (for-each
- (lambda (x)
- (if (member x formats) (set! new-fmts (cons x new-fmts))))
- '("tex" "dvi" "ps" "pdf" "png"))
-
+ (for-each (lambda (x)
+ (if (member x formats) (set! new-fmts (cons x new-fmts))))
+ '("tex" "dvi" "ps" "pdf" "png"))
(uniq-list (reverse new-fmts)))
(define (header-to-file file-name key value)
(avoid-slur ,symbol? "Method of handling slur collisions.
Choices are @code{around}, @code{inside}, @code{outside}. If unset, script
and slur ignore eachother.")
+ (ignore-collision ,boolean? "If set, don't do note collision resolution on this NoteColumn.")
(inspect-quants ,number-pair? "If debugging is set,
set beam/slur quant to this position, and print the respective scores.")
(inspect-index ,integer? "If debugging is set,
(apply unpure args)
(let ((pure (assq unpure pure-conversions-alist)))
(if pure
- (apply (cdr pure) (append (list (car args) start end) (cdr args)))))))))
+ (apply (cdr pure)
+ (append
+ (list (car args) start end)
+ (cdr args)))))))))
(read-string!/partial str port 0 max-length)
str))
-(define (gulp-file nm len)
-
- ;; string routines barf when strlen() != string-length,.
- ;; which may happen as side effect of read-string!/partial.
-
- ; (gulp-port (open-file nm "r") len))
- (ly:gulp-file nm len))
-
+(define-public (gulp-file file-name . max-size)
+ (ly:gulp-file file-name (if (pair? max-size) (car max-size))))
(define BOUNDING-BOX-RE
"^%%BoundingBox: (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+)")
-(define (get-bbox file-name)
+(define (unused-found-broken-get-bbox file-name)
(let* ((bbox (string-append file-name ".bbox"))
;; -sOutputFile does not work with bbox?
(cmd (format #t "gs\
-c quit 2>~S"
file-name bbox))
(status (system cmd))
- (s (gulp-file d bbox 10240))
+ (s (gulp-file bbox 10240))
(m (string-match BOUNDING_BOX_RE s)))
(if m
(begin
(format (current-error-port) (_ "Invoking `~a'...") cmd)
(newline (current-error-port))))
-
-
(set! status (system cmd))
-
(if (not (= status 0))
(begin
(format (current-error-port)
(format #f (_ "~a exited with status: ~S") "GS" status))
- (if exit-on-error
- (exit 1))))
-
+ (if exit-on-error (exit 1))))
status)
(define (scale-down-image be-verbose factor file)
(let* ((status 0)
- (percentage (* 100 (/ 1.0 factor)))
(old (string-append file ".old")))
(rename-file file old)
- (my-system be-verbose
- #t
- (format #f "convert -scale \"~a%\" -depth 8 ~a ~a" percentage old file))
- (delete-file old)
- ))
+ (my-system
+ be-verbose #t
+ (format #f
+ "pngtopnm ~a | pnmscale -reduce ~a 2>/dev/null | pnmtopng -compression 9 2>/dev/null > ~a"
+ old factor file))
+ (delete-file old)))
(define-public (ps-page-count ps-name)
- (let*
- ((byte-count 10240)
- (header (gulp-file ps-name byte-count))
- (first-null (string-index header #\nul))
- (match (string-match "%%Pages: ([0-9]+)"
- (if (number? first-null)
- (substring header 0 first-null)
- header))))
-
- (if match
- (string->number (match:substring match 1))
- 0)))
+ (let* ((byte-count 10240)
+ (header (gulp-file ps-name byte-count))
+ (first-null (string-index header #\nul))
+ (match (string-match "%%Pages: ([0-9]+)"
+ (if (number? first-null)
+ (substring header 0 first-null)
+ header))))
+ (if match (string->number (match:substring match 1)) 0)))
(define-public (make-ps-images ps-name . rest)
(let-keywords*
rest #f
- ((resolution 90)
- (page-width 100)
- (page-height 100)
- (rename-page-1 #f)
- (be-verbose #f)
- (pixmap-format 'png16m)
- (anti-alias-factor 1))
-
- (let* (
- (format-str (format "~a" pixmap-format))
+ ((resolution 90)
+ (page-width 100)
+ (page-height 100)
+ (rename-page-1 #f)
+ (be-verbose #f)
+ (pixmap-format 'png16m)
+ (anti-alias-factor 1))
+
+ (let* ((format-str (format "~a" pixmap-format))
(extension (cond
((string-contains format-str "png") "png")
((string-contains format-str "jpg") "jpeg")
(gs-variable-options
(if multi-page?
- (format #f "-dDEVICEWIDTHPOINTS=~,2f -dDEVICEHEIGHTPOINTS=~,2f" page-width page-height)
+ (format #f "-dDEVICEWIDTHPOINTS=~,2f -dDEVICEHEIGHTPOINTS=~,2f"
+ page-width page-height)
"-dEPSCrop"))
-
(cmd (format #f "~a\
~a\
~a\
))
(if (not (= 1 anti-alias-factor))
- (for-each (lambda (f) (scale-down-image be-verbose anti-alias-factor f))
- files))
-
+ (for-each
+ (lambda (f) (scale-down-image be-verbose anti-alias-factor f)) files))
files)))
if (global_options.format in (TEXINFO, LATEX)
and global_options.create_pdf):
- global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts "
-
-
+ global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts "
if global_options.verbose:
global_options.process_cmd += " --verbose "
else:
page = page + languages
+ if content_negotiation and language_menu:
+ os.symlink (file_name, os.path.splitext (file_name)[0] + '.en.html')
+
return page
for f in files: