CVSROOT: /cvsroot/lilypond
Module name: lilypond
Branch:
Changes by: Han-Wen Nienhuys <[EMAIL PROTECTED]> 05/10/07 11:57:34
Modified files:
. : ChangeLog
lily : new-figured-bass-engraver.cc
Added files:
input/regression: figured-bass-continuation-center.ly
Log message:
new file.
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?tr1=1.4162&tr2=1.4163&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/input/regression/figured-bass-continuation-center.ly?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/new-figured-bass-engraver.cc.diff?tr1=1.4&tr2=1.5&r1=text&r2=text
Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.4162 lilypond/ChangeLog:1.4163
--- lilypond/ChangeLog:1.4162 Fri Oct 7 10:46:31 2005
+++ lilypond/ChangeLog Fri Oct 7 11:57:33 2005
@@ -1,5 +1,7 @@
2005-10-07 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+ * input/regression/figured-bass-continuation-center.ly: new file.
+
* input/regression/beam-outside-beamlets.ly: new file.
* lily/beam.cc (set_beaming): don't clip edges.
Index: lilypond/lily/new-figured-bass-engraver.cc
diff -u lilypond/lily/new-figured-bass-engraver.cc:1.4
lilypond/lily/new-figured-bass-engraver.cc:1.5
--- lilypond/lily/new-figured-bass-engraver.cc:1.4 Fri Oct 7 09:12:03 2005
+++ lilypond/lily/new-figured-bass-engraver.cc Fri Oct 7 11:57:34 2005
@@ -17,6 +17,8 @@
#include "align-interface.hh"
#include "pointer-group-interface.hh"
#include "text-interface.hh"
+#include "grob-array.hh"
+
#include "translator.icc"
@@ -56,6 +58,9 @@
void clear_spanners();
void add_brackets ();
void create_grobs ();
+
+ void center_continuations (Link_array<Spanner> const &consecutive_lines);
+ void center_repeated_continuations ();
protected:
Array<Figure_group> groups_;
Spanner *alignment_;
@@ -155,12 +160,57 @@
}
void
+New_figured_bass_engraver::center_continuations (Link_array<Spanner> const
&consecutive_lines)
+{
+ if (consecutive_lines.size () == 2)
+ {
+ Link_array<Grob> left_figs;
+ for (int j = consecutive_lines.size(); j--;)
+ left_figs.push (consecutive_lines[j]->get_bound (LEFT));
+
+ SCM ga = Grob_array::make_array ();
+ unsmob_grob_array (ga)->set_array (left_figs);
+
+ for (int j = consecutive_lines.size(); j--;)
+ consecutive_lines[j]->set_object ("figures",
+ unsmob_grob_array (ga)->smobbed_copy
());
+ }
+}
+
+void
+New_figured_bass_engraver::center_repeated_continuations ()
+{
+ Link_array<Spanner> consecutive_lines;
+ for (int i = 0; i <= groups_.size(); i++)
+ {
+ if (i < groups_.size ()
+ && groups_[i].continuation_line_
+ && (consecutive_lines.is_empty ()
+ || (consecutive_lines[0]->get_bound(LEFT)->get_column ()
+ == groups_[i].continuation_line_->get_bound
(LEFT)->get_column ()
+ && consecutive_lines[0]->get_bound(RIGHT)->get_column ()
+ == groups_[i].continuation_line_->get_bound
(RIGHT)->get_column ())))
+ {
+ consecutive_lines.push (groups_[i].continuation_line_);
+ }
+ else
+ {
+ center_continuations (consecutive_lines);
+ consecutive_lines.clear ();
+ }
+ }
+}
+
+void
New_figured_bass_engraver::clear_spanners ()
{
if (!alignment_)
return;
alignment_ = 0;
+ center_repeated_continuations();
+
+
groups_.clear ();
}
@@ -224,6 +274,7 @@
bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
if (!use_extenders)
{
+ center_repeated_continuations ();
alignment_ = 0;
for (int i = 0; i < groups_.size (); i++)
{
@@ -266,31 +317,54 @@
}
if (use_extenders)
-
- for (int i = 0; i < groups_.size(); i++)
- {
- if (groups_[i].is_continuation ())
- {
- if (!groups_[i].continuation_line_)
- {
- Spanner * line = make_spanner ("BassFigureContinuation",
SCM_EOL);
- Item * item = groups_[i].figure_item_;
- groups_[i].continuation_line_ = line;
- line->set_bound (LEFT, item);
-
- /*
- Don't add as child. This will cache the wrong
- (pre-break) stencil when callbacks are triggered.
- */
- line->set_parent (groups_[i].group_, Y_AXIS);
- Pointer_group_interface::add_grob (line, ly_symbol2scm
("figures"), item);
+ {
+ Array<int> junk_continuations;
+ for (int i = 0; i < groups_.size(); i++)
+ {
+ if (groups_[i].is_continuation ())
+ {
+ if (!groups_[i].continuation_line_)
+ {
+ Spanner * line = make_spanner ("BassFigureContinuation",
SCM_EOL);
+ Item * item = groups_[i].figure_item_;
+ groups_[i].continuation_line_ = line;
+ line->set_bound (LEFT, item);
+
+ /*
+ Don't add as child. This will cache the wrong
+ (pre-break) stencil when callbacks are triggered.
+ */
+ line->set_parent (groups_[i].group_, Y_AXIS);
+ Pointer_group_interface::add_grob (line, ly_symbol2scm
("figures"), item);
- groups_[i].figure_item_ = 0;
- }
- }
- else
- groups_[i].continuation_line_ = 0;
- }
+ groups_[i].figure_item_ = 0;
+ }
+ }
+ else if (groups_[i].continuation_line_)
+ junk_continuations.push (i);
+ }
+
+ /*
+ Ugh, repeated code.
+ */
+ Link_array<Spanner> consecutive;
+ for (int i = 0; i <= junk_continuations.size (); i++)
+ {
+ if (i < junk_continuations.size()
+ && (i == 0 || junk_continuations[i-1] == junk_continuations[i] -
1))
+ consecutive.push
(groups_[junk_continuations[i]].continuation_line_);
+ else
+ {
+ center_continuations (consecutive);
+ consecutive.clear ();
+ if (i < junk_continuations.size ())
+ consecutive.push
(groups_[junk_continuations[i]].continuation_line_);
+ }
+ }
+ for (int i = 0; i < junk_continuations.size (); i++)
+ groups_[junk_continuations[i]].continuation_line_ = 0;
+ }
+
create_grobs ();
add_brackets ();
}
_______________________________________________
Lilypond-cvs mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-cvs