]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/ledger-line-engraver.cc (acknowledge_staff_symbol): be more
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 28 May 2006 18:55:37 +0000 (18:55 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 28 May 2006 18:55:37 +0000 (18:55 +0000)
careful with generating new LedgerLineSpanners.

* lily/ledger-line-spanner.cc (set_spacing_rods): suicide if no staff.

* buildscripts/output-distance.py (SystemLink.distance): new
file. Compare signatures.

ChangeLog
buildscripts/output-distance.py
lily/ledger-line-engraver.cc
lily/ledger-line-spanner.cc

index 144493cd3c58838d36ee202db4c37c707c6d1813..dcd9f4b29205e9d117a98467be9d7e015bd53944 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2006-05-28  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
+       * lily/ledger-line-engraver.cc (acknowledge_staff_symbol): be more
+       careful with generating new LedgerLineSpanners.
+
+       * lily/ledger-line-spanner.cc (set_spacing_rods): suicide if no staff.
+
        * ly/engraver-init.ly: remove Ledger_line_engraver from Voice
        context. This fixes double ledger lines in output. 
 
index c534d8cb2b8bba1b03ba31e5ec104276cae0c37e..236b497eced275ab7346f9471dce87e99173c78a 100644 (file)
@@ -1,9 +1,10 @@
 #!@TARGET_PYTHON@
 import sys
+import optparse
 
-sys.path.insert (0, 'python')
 import safeeval
 
+
 X_AXIS = 0
 Y_AXIS = 1
 INFTY = 1e6
@@ -158,12 +159,17 @@ class SystemLink:
 
         for (g1,g2s) in self.link_list_dict.items ():
             if len (g2s) != 1:
-                print g1, g2s 
                 d += ORPHAN_GROB_PENALTY
 
         return d
-        
+
+################################################################
+# Files/directories
+
+import glob
+
 def read_signature_file (name):
+    print 'reading', name
     exp_str = ("[%s]" % open (name).read ())
     entries = safeeval.safe_eval (exp_str)
 
@@ -172,29 +178,113 @@ def read_signature_file (name):
     return sig
 
 
+def compare_signature_files (f1, f2):
+    s1 = read_signature_file (f1)
+    s2 = read_signature_file (f2)
+    
+    return SystemLink (s1, s2).distance ()
+    
+    
 
+def paired_files (dir1, dir2, pattern):
+    """
+    Search DIR1 and DIR2 for PATTERN.
 
-def compare_directories (dir1, dir2):
+    Return (PAIRED, MISSING-FROM-2, MISSING-FROM-1)
 
-    pass
+    """
+    
+    files1 = dict ((os.path.split (f)[1], 1) for f in glob.glob (dir1 + '/' + pattern))
+    files2 = dict ((os.path.split (f)[1], 1) for f in glob.glob (dir2 + '/' + pattern))
 
+    pairs = []
+    missing = []
+    for f in files1.keys ():
+        try:
+            files2.pop (f)
+            pairs.append (f)
+        except KeyError:
+            missing.append (f)
 
-################################################################
-# TESTING
+    return (pairs, files2.keys (), missing)
+    
+class ComparisonData:
+    def __init__ (self):
+        self.result_dict = {}
+        self.missing = []
+        self.added = []
+        
+    def compare_trees (self, dir1, dir2):
+        self.compare_directories (dir1, dir2)
+        
+        (root, files, dirs) = os.walk (dir1).next ()
+        for d in dirs:
+            d1 = os.path.join (dir1, d)
+            d2 = os.path.join (dir2, d)
+            
+            if os.path.isdir (d2):
+                self.compare_trees (d1, d2)
+    
+    def compare_directories (self, dir1, dir2):
+        
+        (paired, m1, m2) = paired_files (dir1, dir2, '*.signature')
+
+        self.missing += [(dir1, m) for m in m1] 
+        self.added += [(dir2, m) for m in m2] 
 
-def test ():
-    def system (x):
-        print 'invoking', x
-        stat = os.system (x)
-        assert stat == 0
+        for p in paired:
+            f = dir1 +  '/' +p
+            d = compare_signature_files (f, dir2 +  '/' +p)
+            self.result_dict[f] = d
+        
+    
+    def print_results (self):
+        results = [(score, file) for (file, score) in self.result_dict.items ()]  
+        results.sort ()
+        results.reverse ()
+
+        for (s, f) in results:
+            print '%30s %6f' % (f,s)
+
+        for (dir, file) in self.missing:
+            print '%-20s %s' % ('missing',os.path.join (dir, file))
+        for (dir, file) in self.added:
+            print '%10s%-10s %s' % ('','added', os.path.join (dir, file))
         
-    import os
-    dir = 'output-distance-test'
 
-    print 'test results in dir'
-    system ('rm -rf ' + dir)
-    os.mkdir (dir)
-    os.chdir (dir)
+def compare_trees (dir1, dir2):
+    data =  ComparisonData ()
+    data.compare_trees (dir1, dir2)
+    data.print_results ()
+    
+################################################################
+# TESTING
+
+import os
+def system (x):
+    
+    print 'invoking', x
+    stat = os.system (x)
+    assert stat == 0
+
+def test_paired_files ():
+    print paired_files (os.environ["HOME"] + "/src/lilypond/scripts/",
+                        os.environ["HOME"] + "/src/lilypond-stable/buildscripts/", '*.py')
+                  
+    
+def test_compare_trees ():
+    system ('rm -rf dir1 dir2')
+    system ('mkdir dir1 dir2')
+    system ('cp 20-0.signature dir1')
+    system ('cp 20expr-0.signature dir1')
+    system ('cp 19-0.signature dir2/20-0.signature')
+    system ('cp 19-0.signature dir2/')
+    system ('cp 19-0.signature dir1/')
+    system ('cp 20grob-0.signature dir2/')
+
+    compare_trees ('dir1', 'dir2')
+    
+def test_basic_compare ():
     ly_template = r"""#(set! toplevel-score-handler print-score-with-defaults)
 #(set! toplevel-music-handler
  (lambda (p m)
@@ -256,18 +346,47 @@ def test ():
     assert combinations['20-20expr'] > 50.0
     assert combinations['20-19'] < 10.0
 
-
 def test_sigs (a,b):
     sa = read_signature_file (a)
     sb = read_signature_file (b)
     link = SystemLink (sa, sb)
     print link.distance()
 
-if __name__ == '__main__':
-    if sys.argv[1:]:
-        test_sigs (sys.argv[1],
-                    sys.argv[2])
-    else:
-        test ()
 
+def run_tests ():
+    dir = 'output-distance-test'
+
+    print 'test results in ', dir
+    system ('rm -rf ' + dir)
+    system ('mkdir ' + dir)
+    os.chdir (dir)
+
+    test_compare_trees ()
+    test_basic_compare ()
+    
+################################################################
+#
+
+def main ():
+    p = optparse.OptionParser ("output-distance - compare LilyPond formatting runs")
+    p.usage ('output-distance.py [options] tree1 tree2')
+    
+    p.add_option ('', '--test',
+                  dest="run_test",
+                  help='run test method')
+
+    (o,a) = p.parse_args ()
+
+    if len (a) != 2:
+        p.usage()
+        sys.exit (2)
+
+    if o.run_test:
+        run_tests ()
+        sys.exit (0)
+
+    compare_trees (a[0], a[1])
+
+if __name__ == '__main__':
+    main()
 
index 770eb02e14bc52de884a5a7c969c3d1702dc5d24..550dc5a014ed95ec97da52e2ac4a6a96b7965050 100644 (file)
@@ -46,6 +46,9 @@ Ledger_line_engraver::start_spanner ()
 void
 Ledger_line_engraver::process_music ()
 {
+  /*
+    Need to do this, otherwise the first note might miss ledgers. 
+  */
   if (!span_)
     start_spanner ();
 }
@@ -73,7 +76,8 @@ Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s)
   Spanner *sym = dynamic_cast<Spanner *> (s.grob ());
 
   if (!span_
-      || span_->get_bound (LEFT) != sym->get_bound (LEFT))
+      || (span_->get_bound (LEFT) != sym->get_bound (LEFT)
+         && sym->get_bound (LEFT)))
     {
       stop_spanner ();
       start_spanner ();
index 907c95985f7f015c331ada15718d21f5fb771c4c..bf7444dea0ec73b0a08b9841ffbe691c825c2128 100644 (file)
@@ -119,7 +119,10 @@ Ledger_line_spanner::set_spacing_rods (SCM smob)
   // find size of note heads.
   Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
   if (!staff)
-    return SCM_EOL;
+    {
+      me->suicide ();
+      return SCM_EOL;
+    }
 
   Real min_length_fraction
     = robust_scm2double (me->get_property ("minimum-length-fraction"), 0.15);