CVSROOT:        /cvsroot/lilypond
Module name:    lilypond
Branch:         
Changes by:     Han-Wen Nienhuys <[EMAIL PROTECTED]>    05/05/08 23:17:49

Modified files:
        .              : ChangeLog THANKS 
        Documentation/topdocs: NEWS.tely 
        lily           : accidental-engraver.cc align-interface.cc 
                         context.cc engraver-group-engraver.cc 
                         font-size-engraver.cc function-documentation.cc 
                         grob-info.cc output-property-engraver.cc 
                         score-engraver.cc vertical-align-engraver.cc 
        lily/include   : grob-info.hh 
        scm            : define-context-properties.scm lily.scm 
Added files:
        input/regression: alignment-order.ly 

Log message:
        * input/regression/alignment-order.ly: new file.
        
        * lily/vertical-align-engraver.cc (acknowledge_grob): read
        alignAboveContext and alignBelowContext

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?tr1=1.3565&tr2=1.3566&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/THANKS.diff?tr1=1.111&tr2=1.112&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/Documentation/topdocs/NEWS.tely.diff?tr1=1.34&tr2=1.35&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/input/regression/alignment-order.ly?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/accidental-engraver.cc.diff?tr1=1.96&tr2=1.97&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/align-interface.cc.diff?tr1=1.74&tr2=1.75&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/context.cc.diff?tr1=1.55&tr2=1.56&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/engraver-group-engraver.cc.diff?tr1=1.55&tr2=1.56&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/font-size-engraver.cc.diff?tr1=1.40&tr2=1.41&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/function-documentation.cc.diff?tr1=1.17&tr2=1.18&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/grob-info.cc.diff?tr1=1.19&tr2=1.20&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/output-property-engraver.cc.diff?tr1=1.38&tr2=1.39&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/score-engraver.cc.diff?tr1=1.143&tr2=1.144&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/vertical-align-engraver.cc.diff?tr1=1.60&tr2=1.61&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/include/grob-info.hh.diff?tr1=1.17&tr2=1.18&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/scm/define-context-properties.scm.diff?tr1=1.42&tr2=1.43&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/scm/lily.scm.diff?tr1=1.331&tr2=1.332&r1=text&r2=text

Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.3565 lilypond/ChangeLog:1.3566
--- lilypond/ChangeLog:1.3565   Sun May  8 19:12:23 2005
+++ lilypond/ChangeLog  Sun May  8 23:17:49 2005
@@ -1,3 +1,10 @@
+2005-05-09  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
+
+       * input/regression/alignment-order.ly: new file. 
+
+       * lily/vertical-align-engraver.cc (acknowledge_grob): read
+       alignAboveContext and alignBelowContext
+
 2005-05-08  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
 
        * lily/pfb.cc (LY_DEFINE): add cast.
Index: lilypond/Documentation/topdocs/NEWS.tely
diff -u lilypond/Documentation/topdocs/NEWS.tely:1.34 
lilypond/Documentation/topdocs/NEWS.tely:1.35
--- lilypond/Documentation/topdocs/NEWS.tely:1.34       Thu May  5 23:45:29 2005
+++ lilypond/Documentation/topdocs/NEWS.tely    Sun May  8 23:17:49 2005
@@ -34,6 +34,15 @@
 @itemize @bullet
 
 @item
+Newly created staves and lyric lines, can be put in any vertical order,
+by setting @code{alignBelowContext} or @code{alignAboveContext}
+properties in the newly created context. An example of the use of this
+is in @inputfileref{input/regression,alignment-order.ly}.
+
+This feature has been sponsored by Bertalan Fodor. 
+
+
[EMAIL PROTECTED]
 Staves may be stopped and started halfway a line, e.g.
 
 @lilypond[relative=2,fragment,verbatim]
Index: lilypond/THANKS
diff -u lilypond/THANKS:1.111 lilypond/THANKS:1.112
--- lilypond/THANKS:1.111       Fri May  6 00:03:43 2005
+++ lilypond/THANKS     Sun May  8 23:17:49 2005
@@ -36,6 +36,7 @@
 
 SPONSORS
 
+Bertalan Fodor
 Jonathan Walther
 Steve Doonan
 Marcus Macauley
Index: lilypond/lily/accidental-engraver.cc
diff -u lilypond/lily/accidental-engraver.cc:1.96 
lilypond/lily/accidental-engraver.cc:1.97
--- lilypond/lily/accidental-engraver.cc:1.96   Tue Apr 12 22:49:29 2005
+++ lilypond/lily/accidental-engraver.cc        Sun May  8 23:17:49 2005
@@ -492,8 +492,8 @@
 
          Accidental_entry entry;
          entry.head_ = info.grob_;
-         entry.origin_trans_ = dynamic_cast<Engraver *> (info.origin_trans_);
-         entry.origin_ = info.origin_trans_->context ();
+         entry.origin_trans_ = dynamic_cast<Engraver *> 
(info.origin_translator ());
+         entry.origin_ = entry.origin_trans_->context ();
          entry.melodic_ = note;
 
          accidentals_.push (entry);
Index: lilypond/lily/align-interface.cc
diff -u lilypond/lily/align-interface.cc:1.74 
lilypond/lily/align-interface.cc:1.75
--- lilypond/lily/align-interface.cc:1.74       Sat Apr 30 23:43:03 2005
+++ lilypond/lily/align-interface.cc    Sun May  8 23:17:49 2005
@@ -225,10 +225,10 @@
 }
 
 void
-Align_interface::add_element (Grob *me, Grob *s, SCM cb)
+Align_interface::add_element (Grob *me, Grob *element, SCM call_back)
 {
-  s->add_offset_callback (cb, Align_interface::axis (me));
-  Axis_group_interface::add_element (me, s);
+  element->add_offset_callback (call_back, Align_interface::axis (me));
+  Axis_group_interface::add_element (me, element);
 }
 
 void
Index: lilypond/lily/context.cc
diff -u lilypond/lily/context.cc:1.55 lilypond/lily/context.cc:1.56
--- lilypond/lily/context.cc:1.55       Tue May  3 12:13:28 2005
+++ lilypond/lily/context.cc    Sun May  8 23:17:49 2005
@@ -221,14 +221,14 @@
 {
   String type = ly_symbol2string (cdef->get_context_name ());
   Object_key const *key = get_context_key (type, id);
-  Context *new_group
+  Context *new_context
     = cdef->instantiate (ops, key);
 
-  new_group->id_string_ = id;
-  add_context (new_group);
-  apply_property_operations (new_group, ops);
+  new_context->id_string_ = id;
+  add_context (new_context);
+  apply_property_operations (new_context, ops);
 
-  return new_group;
+  return new_context;
 }
 
 Object_key const *
Index: lilypond/lily/engraver-group-engraver.cc
diff -u lilypond/lily/engraver-group-engraver.cc:1.55 
lilypond/lily/engraver-group-engraver.cc:1.56
--- lilypond/lily/engraver-group-engraver.cc:1.55       Wed Mar 16 19:19:15 2005
+++ lilypond/lily/engraver-group-engraver.cc    Sun May  8 23:17:49 2005
@@ -67,7 +67,7 @@
        {
          Translator *t = unsmob_translator (scm_car (p));
          Engraver *eng = dynamic_cast<Engraver *> (t);
-         if (eng && eng != info.origin_trans_)
+         if (eng && eng != info.origin_translator ())
            eng->acknowledge_grob (info);
        }
     }
Index: lilypond/lily/font-size-engraver.cc
diff -u lilypond/lily/font-size-engraver.cc:1.40 
lilypond/lily/font-size-engraver.cc:1.41
--- lilypond/lily/font-size-engraver.cc:1.40    Wed Mar 16 19:19:15 2005
+++ lilypond/lily/font-size-engraver.cc Sun May  8 23:17:49 2005
@@ -30,7 +30,7 @@
   /*
     We only want to process a grob once.
   */
-  if (gi.origin_trans_->context () != context ())
+  if (gi.context () != context ())
     return;
 
   if (scm_is_number (sz) && scm_to_double (sz))
Index: lilypond/lily/function-documentation.cc
diff -u lilypond/lily/function-documentation.cc:1.17 
lilypond/lily/function-documentation.cc:1.18
--- lilypond/lily/function-documentation.cc:1.17        Thu Mar 10 14:36:13 2005
+++ lilypond/lily/function-documentation.cc     Sun May  8 23:17:49 2005
@@ -22,7 +22,7 @@
     return;
 
   if (!scm_is_vector (doc_hash_table))
-    doc_hash_table = scm_make_vector (scm_int2num (59), SCM_EOL);
+    doc_hash_table = scm_c_make_hash_table (59);
 
   String s = String (" - ") + "LilyPond procedure: " + fname + " " + varlist
     + "\n" + doc;
Index: lilypond/lily/grob-info.cc
diff -u lilypond/lily/grob-info.cc:1.19 lilypond/lily/grob-info.cc:1.20
--- lilypond/lily/grob-info.cc:1.19     Thu Mar 10 14:36:13 2005
+++ lilypond/lily/grob-info.cc  Sun May  8 23:17:49 2005
@@ -7,12 +7,18 @@
 */
 
 #include "grob-info.hh"
-
 #include "grob.hh"
 #include "music.hh"
 #include "translator-group.hh"
 #include "context.hh"
 
+
+Grob_info::Grob_info (Translator *t, Grob *g)
+{
+  origin_trans_ = t;
+  grob_ = g;
+}
+
 Grob_info::Grob_info ()
 {
   grob_ = 0;
@@ -41,3 +47,10 @@
   return r;
 }
 
+
+Context*
+Grob_info::context () const
+{
+  return origin_trans_->context ();
+}
+
Index: lilypond/lily/include/grob-info.hh
diff -u lilypond/lily/include/grob-info.hh:1.17 
lilypond/lily/include/grob-info.hh:1.18
--- lilypond/lily/include/grob-info.hh:1.17     Thu Mar 10 14:36:12 2005
+++ lilypond/lily/include/grob-info.hh  Sun May  8 23:17:49 2005
@@ -16,16 +16,18 @@
 /*
   Data container for broadcasts.
 */
-struct Grob_info
+class Grob_info
 {
   Translator *origin_trans_;
   friend class Engraver;
 
-  Grob *grob_;
-
 public:
+  Grob *grob_;
+  Context *context () const; 
+  Translator *origin_translator () const { return origin_trans_; } 
   Music *music_cause ();
   Link_array<Context> origin_contexts (Translator *) const;
+  Grob_info (Translator *, Grob *);
   Grob_info ();
 };
 
Index: lilypond/lily/output-property-engraver.cc
diff -u lilypond/lily/output-property-engraver.cc:1.38 
lilypond/lily/output-property-engraver.cc:1.39
--- lilypond/lily/output-property-engraver.cc:1.38      Tue Mar  8 13:02:05 2005
+++ lilypond/lily/output-property-engraver.cc   Sun May  8 23:17:49 2005
@@ -59,12 +59,7 @@
        }
       else
        {
-         Context * d =
-           dynamic_cast<Context *> (inf.origin_trans_);
-
-         if (!d)
-           d = dynamic_cast<Context *> (inf.origin_trans_->context ());
-         
+         Context * d = inf.context ();
          SCM proc = o->get_property ("procedure");
          scm_call_3 (proc,
                      inf.grob_->self_scm (),
Index: lilypond/lily/score-engraver.cc
diff -u lilypond/lily/score-engraver.cc:1.143 
lilypond/lily/score-engraver.cc:1.144
--- lilypond/lily/score-engraver.cc:1.143       Mon Apr 18 00:36:45 2005
+++ lilypond/lily/score-engraver.cc     Sun May  8 23:17:49 2005
@@ -53,16 +53,10 @@
       Object_key const *key2 = context ()->get_grob_key ("PaperColumn");
       set_columns (new Paper_column (nmp, key1), new Paper_column (pc, key2));
 
-      Grob_info i1;
-      i1.grob_ = command_column_;
-      i1.origin_trans_ = this;
-
+      Grob_info i1 (this, command_column_);
       announce_grob (i1);
 
-      Grob_info i2;
-      i2.grob_ = musical_column_;
-      i2.origin_trans_ = this;
-
+      Grob_info i2 (this, musical_column_);
       announce_grob (i2);
     }
 }
Index: lilypond/lily/vertical-align-engraver.cc
diff -u lilypond/lily/vertical-align-engraver.cc:1.60 
lilypond/lily/vertical-align-engraver.cc:1.61
--- lilypond/lily/vertical-align-engraver.cc:1.60       Sat May  7 14:49:37 2005
+++ lilypond/lily/vertical-align-engraver.cc    Sun May  8 23:17:49 2005
@@ -18,22 +18,50 @@
 {
   Spanner *valign_;
   bool qualifies (Grob_info) const;
-
+  SCM id_to_group_hashtab_;  
+  
 public:
   TRANSLATOR_DECLARATIONS (Vertical_align_engraver);
 
 protected:
+  virtual void derived_mark () const;
   virtual void acknowledge_grob (Grob_info);
   virtual void process_music ();
   virtual void finalize ();
+  virtual void initialize ();
 };
 
+
+ADD_TRANSLATOR (Vertical_align_engraver,
+               "Catch groups (staffs, lyrics lines, etc.) and stack "
+               "them vertically.",
+               /* creats*/ "VerticalAlignment",
+               /* accepts */ "",
+               /* acks  */ "axis-group-interface",
+               /* reads */ "",
+               /* write */ "");
+
+
 Vertical_align_engraver::Vertical_align_engraver ()
 {
   valign_ = 0;
+  id_to_group_hashtab_ = SCM_EOL;
+}
+
+void
+Vertical_align_engraver::derived_mark () const
+{
+  scm_gc_mark (id_to_group_hashtab_); 
 }
 
 void
+Vertical_align_engraver::initialize ()
+{
+  id_to_group_hashtab_ = scm_c_make_hash_table (11);
+}
+
+
+void
 Vertical_align_engraver::process_music ()
 {
   if (!valign_)
@@ -67,14 +95,46 @@
 {
   if (qualifies (i))
     {
-      Align_interface::add_element (valign_, i.grob_, get_property 
("verticalAlignmentChildCallback"));
+      String id = i.context ()->id_string ();
+
+      scm_hash_set_x (id_to_group_hashtab_, scm_makfrom0str (id.to_str0 ()),
+                     i.grob_->self_scm ());
+
+
+      SCM before_id = i.context ()->get_property ("alignAboveContext");
+      SCM after_id = i.context ()->get_property ("alignBelowContext");
+      
+      SCM before = scm_hash_ref (id_to_group_hashtab_,  before_id, SCM_BOOL_F);
+      SCM after = scm_hash_ref (id_to_group_hashtab_,  after_id, SCM_BOOL_F);
+
+
+      Align_interface::add_element (valign_, i.grob_,
+                                   get_property 
("verticalAlignmentChildCallback"));
+
+      if (unsmob_grob (before) || unsmob_grob (after))
+       {
+         SCM elts = valign_->get_property ("elements");
+         SCM new_order = scm_cdr (elts);
+         SCM *current = &new_order;
+
+         for (SCM s = new_order;  scm_is_pair (s); s = scm_cdr (s))
+           {
+             if (scm_car (s) == after)
+               {
+                 *current = scm_cons (i.grob_->self_scm(), s);
+                 break;
+               }
+             else if (scm_car (s) == before)
+               {
+                 scm_set_cdr_x (s, scm_cons (i.grob_->self_scm (),
+                                             scm_cdr (s)));
+                 break;
+               }
+
+             current = SCM_CDRLOC (s);
+           }
+
+         valign_->set_property ("elements", new_order);
+       }
     }
 }
-
-ADD_TRANSLATOR (Vertical_align_engraver,
-               /* descr */ "Catch Vertical axis groups and stack them.",
-               /* creats*/ "VerticalAlignment",
-               /* accepts */ "",
-               /* acks  */ "axis-group-interface",
-               /* reads */ "",
-               /* write */ "");
Index: lilypond/scm/define-context-properties.scm
diff -u lilypond/scm/define-context-properties.scm:1.42 
lilypond/scm/define-context-properties.scm:1.43
--- lilypond/scm/define-context-properties.scm:1.42     Thu May  5 23:45:30 2005
+++ lilypond/scm/define-context-properties.scm  Sun May  8 23:17:49 2005
@@ -23,6 +23,8 @@
      (apply translator-property-description x))
    `(
      (aDueText ,string? "Text to print at a unisono passage.")
+     (alignBelowContext ,string? "Where to insert newly created context in 
vertiical alignment.")
+     (alignAboveContext ,string? "Where to insert newly created context in 
vertiical alignment.")
      (alignBassFigureAccidentals ,boolean?
                                 "If true, then the accidentals are aligned in 
bass figure context.")
 
Index: lilypond/scm/lily.scm
diff -u lilypond/scm/lily.scm:1.331 lilypond/scm/lily.scm:1.332
--- lilypond/scm/lily.scm:1.331 Tue May  3 11:31:51 2005
+++ lilypond/scm/lily.scm       Sun May  8 23:17:49 2005
@@ -36,8 +36,6 @@
       (debug-enable 'backtrace)
       (read-enable 'positions)))
 
-
-
 ;; initialize defaults. 
 (ly:set-option 'command-line-settings
               '((resolution . 90)


_______________________________________________
Lilypond-cvs mailing list
Lilypond-cvs@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-cvs

Reply via email to