2004-09-23 Graham Percival <gperlist@shaw.ca>
- * Documentation/user/tutorial.itely: do manual style 2-space indents in examples
+ * Documentation/user/tutorial.itely: do manual style 2-space
+ indents in examples
* Documentation/user/notation.itely: more editing.
2004-09-23 Jan Nieuwenhuizen <janneke@gnu.org>
+ * lily/lyric-engraver.cc (get_current_rest): New function.
+
+ * lily/extender-engraver.cc (stop_translation_timestep): Use it:
+ stop at rest.
+
+ * lily/lyric-extender.cc (print): Fix crash (Russ Ross).
+
* lily/slur-scoring.cc (get_bezier): Fix for broken beziers.
2004-09-23 Juergen Reuter <reuter@ipd.uka.de>
/// access element
T &elem_ref (int i) const
{
- assert (i >=0&&i<size_);
+ assert (i >=0 && i < size_);
return ((T*)array_)[i];
}
/// access element
Jan Nieuwenhuizen <janneke@gnu.org>
*/
-#include "warn.hh"
-#include "lyric-extender.hh"
-#include "item.hh"
-#include "engraver.hh"
#include "context.hh"
+#include "engraver.hh"
#include "group-interface.hh"
+#include "item.hh"
+#include "lyric-extender.hh"
+#include "note-head.hh"
+#include "warn.hh"
class Extender_engraver : public Engraver
{
- Music* ev_;
- Spanner* extender_;
- Spanner * pending_extender_;
+ Music *ev_;
+ Spanner *extender_;
+ Spanner *pending_extender_;
+
public:
TRANSLATOR_DECLARATIONS (Extender_engraver);
virtual bool try_music (Music*);
virtual void stop_translation_timestep ();
virtual void process_music ();
-private:
-
};
-
-
Extender_engraver::Extender_engraver ()
{
extender_ = 0;
}
bool
-Extender_engraver::try_music (Music* r)
+Extender_engraver::try_music (Music *r)
{
- if (ev_)
- return false;
-
- ev_ = r;
- return true;
+ if (!ev_)
+ {
+ ev_ = r;
+ return true;
+ }
+ return false;
}
-
void
Extender_engraver::process_music ()
{
if (ev_)
- {
- extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
- }
+ extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
}
-
void
Extender_engraver::acknowledge_grob (Grob_info i)
{
- Item * item = dynamic_cast<Item*> (i.grob_);
+ Item *item = dynamic_cast<Item*> (i.grob_);
if (item
&& item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
Extender_engraver::stop_translation_timestep ()
{
if (pending_extender_ && pending_extender_->get_bound (RIGHT))
- {
- pending_extender_ = 0;
- }
+ pending_extender_ = 0;
if (extender_ || pending_extender_)
{
Context *voice = get_voice_to_lyrics (context ());
- Grob* h = (voice) ? get_current_note_head (voice) : 0;
+ Grob *h = voice ? get_current_note_head (voice) : 0;
+ Grob *r = voice ? get_current_rest (voice) : 0;
if (h)
{
if (pending_extender_)
Pointer_group_interface::add_grob (pending_extender_,
ly_symbol2scm ("heads"), h);
- }
-
- if (extender_)
+ }
+ else if (r && pending_extender_)
+ /* Rest: stop right here. */
+ pending_extender_->set_bound (RIGHT, h);
+
+ if (extender_ && !r)
{
pending_extender_ = extender_;
extender_ = 0;
}
void
-completize_extender (Spanner* sp)
+completize_extender (Spanner *sp)
{
if (!sp->get_bound (RIGHT))
{
SCM heads = sp->get_property ("heads");
if (ly_c_pair_p (heads))
{
- Item* it = dynamic_cast<Item*> (unsmob_grob (ly_car (heads)));
+ Item *it = dynamic_cast<Item*> (unsmob_grob (ly_car (heads)));
if (it)
sp->set_bound (RIGHT, it);
}
}
}
-
-
void
Extender_engraver::finalize ()
{
completize_extender (pending_extender_);
if (!pending_extender_->get_bound (RIGHT))
- pending_extender_->warning (_("unterminated extender"));
+ pending_extender_->warning (_ ("unterminated extender"));
pending_extender_ =0;
}
}
-
-
-
ENTER_DESCRIPTION (Extender_engraver,
/* descr */ "Create lyric extenders",
/* creats*/ "LyricExtender",
-/*
- context.hh -- declare Context
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
- */
+/*
+ context.hh -- declare Context
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
#ifndef CONTEXT_HH
#define CONTEXT_HH
SCM default_child_context_name () const;
Translator_group* implementation () const;
- Context * get_parent_context () const;
+ Context *get_parent_context () const;
Context ();
- /*
- properties:
- */
+ /* properties: */
void execute_pushpop_property (SCM prop, SCM sym, SCM val);
SCM internal_get_property (SCM name_sym) const;
SCM properties_as_alist () const;
void unset_property (SCM var_sym);
- Context *remove_context (Context*trans);
+ Context *remove_context (Context *trans);
void check_removal ();
String context_name () const;
- Global_context * get_global_context () const;
+ Global_context *get_global_context () const;
virtual Score_context * get_score_context () const;
virtual Output_def *get_output_def () const;
Context arg?
*/
-void apply_property_operations (Context*tg, SCM pre_init_ops);
-void execute_pushpop_property (Context * trg, SCM prop, SCM eltprop, SCM val);
-SCM updated_grob_properties (Context* tg, SCM sym);
-Context * find_context_below (Context * where,
+void apply_property_operations (Context *tg, SCM pre_init_ops);
+void execute_pushpop_property (Context *trg, SCM prop, SCM eltprop, SCM val);
+SCM updated_grob_properties (Context *tg, SCM sym);
+Context *find_context_below (Context *where,
SCM type_sym, String id);
-bool melisma_busy (Context*);
+bool melisma_busy (Context *);
Context *get_voice_to_lyrics (Context *lyrics);
-Grob *get_current_note_head (Context * voice);
+Grob *get_current_note_head (Context *voice);
+Grob *get_current_rest (Context *voice);
Context *unsmob_context (SCM);
-DECLARE_UNSMOB(Context,context);
+DECLARE_UNSMOB(Context, context);
#endif /* CONTEXT_HH */
Jan Nieuwenhuizen <janneke@gnu.org>
*/
+#include "context.hh"
#include "engraver.hh"
#include "event.hh"
-#include "item.hh"
-#include "context.hh"
#include "font-metric.hh"
+#include "item.hh"
+#include "multi-measure-rest.hh"
#include "note-head.hh"
+#include "rest.hh"
/**
- Generate texts for lyric syllables. We only do one lyric at a time.
+ Generate texts for lyric syllables. We only do one lyric at a time.
Multiple copies of this engraver should be used to do multiple voices.
*/
-class Lyric_engraver : public Engraver
+class Lyric_engraver : public Engraver
{
protected:
virtual void stop_translation_timestep ();
virtual bool try_music (Music *);
virtual void process_music ();
-
+
public:
TRANSLATOR_DECLARATIONS (Lyric_engraver);
+
private:
- Music * event_;
- Item* text_;
+ Music *event_;
+ Item *text_;
- Context* get_voice_context ();
+ Context *get_voice_context ();
};
Lyric_engraver::Lyric_engraver ()
bool
Lyric_engraver::try_music (Music*r)
{
- if (event_)
- return false;
- event_ =r;
- return true;
+ if (!event_)
+ {
+ event_ = r;
+ return true;
+ }
+ return false;
}
void
{
if (event_)
{
- text_= make_item ("LyricText",event_->self_scm ());
-
+ text_ = make_item ("LyricText", event_->self_scm ());
text_->set_property ("text", event_->get_property ("text"));
}
}
}
Context *parent = lyrics;
- Context *voice = 0;
+ Context *voice = 0;
while (parent && !voice)
{
voice = find_context_below (parent, ly_symbol2scm ("Voice"), nm);
return voice;
parent = lyrics;
- voice = 0;
+ voice = 0;
while (parent && !voice)
{
voice = find_context_below (parent, ly_symbol2scm ("Voice"), "");
}
Grob *
-get_current_note_head (Context * voice)
+get_current_note_head (Context *voice)
{
for (SCM s = voice->get_property ("busyGrobs");
ly_c_pair_p (s); s = ly_cdr (s))
{
- Item*g = dynamic_cast<Item*> (unsmob_grob (ly_cdar (s)));
-
+ Item *g = dynamic_cast<Item*> (unsmob_grob (ly_cdar (s)));
+
if (g && !g->get_column ()
&& Note_head::has_interface (g))
return g;
}
-
- return 0;
+
+ return 0;
+}
+
+Grob *
+get_current_rest (Context *voice)
+{
+ for (SCM s = voice->get_property ("busyGrobs"); ly_c_pair_p (s);
+ s = ly_cdr (s))
+ {
+ Item *g = dynamic_cast<Item*> (unsmob_grob (ly_cdar (s)));
+
+ if (g && !g->get_column ()
+ && (Rest::has_interface (g)
+ || Multi_measure_rest::has_interface (g)))
+ return g;
+ }
+
+ return 0;
}
void
{
if (text_)
{
- Context * voice = get_voice_to_lyrics (context ());
+ Context *voice = get_voice_to_lyrics (context ());
if (voice)
{
{
text_->set_parent (head, X_AXIS);
if (melisma_busy (voice))
- text_->set_property ("self-alignment-X", scm_int2num (LEFT));
+ text_->set_property ("self-alignment-X", scm_int2num (LEFT));
}
}
-
- text_ =0;
+
+ text_ = 0;
}
- event_ =0;
+ event_ = 0;
}
bool
Lyric_extender::is_visible (Grob *gr)
{
- Spanner*me = dynamic_cast<Spanner*> (gr);
+ Spanner *me = dynamic_cast<Spanner*> (gr);
SCM heads = me->get_property ("heads");
- int l = scm_ilength (heads);
- if (l == 0)
- return false;
-
- return true;
+ int il = scm_ilength (heads);
+ return il != 0;
}
-MAKE_SCHEME_CALLBACK (Lyric_extender,print,1)
+MAKE_SCHEME_CALLBACK (Lyric_extender, print, 1)
SCM
Lyric_extender::print (SCM smob)
{
Spanner *me = unsmob_spanner (smob);
- Item *l = me->get_bound (LEFT);
- Item *r = me->get_bound (RIGHT);
- Grob *common = l->common_refpoint (r, X_AXIS);
-
+ Item *le = me->get_bound (LEFT);
+ Item *ri = me->get_bound (RIGHT);
+ Grob *common = le->common_refpoint (ri, X_AXIS);
Real sl = me->get_paper ()->get_dimension (ly_symbol2scm ("linethickness"));
Link_array<Grob> heads (Pointer_group_interface__extract_grobs (me, (Grob*)0,
"heads"));
- if (!heads.size () && r->break_status_dir () == CENTER)
+ if (!heads.size () && ri->break_status_dir () == CENTER)
return SCM_EOL;
common = common_refpoint_of_array (heads, common, X_AXIS);
Real left_point = 0.0;
- if (l->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
- left_point = l->extent (common, X_AXIS)[RIGHT];
- else
+ if (le->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
+ left_point = le->extent (common, X_AXIS)[RIGHT];
+ else if (heads.size ())
left_point = heads[0]->extent (common, X_AXIS)[LEFT];
+ else
+ left_point = le->extent (common, X_AXIS)[RIGHT];
if (isinf (left_point))
return SCM_EOL;
- /*
- It seems that short extenders are even lengthened to go past the
- note head, but haven't found a pattern in it yet. --hwn 1/1/04
-
- */
- SCM minlen = me->get_property ("minimum-length");
+ /* It seems that short extenders are even lengthened to go past the
+ note head, but haven't found a pattern in it yet. --hwn 1/1/04 */
+ SCM minlen = me->get_property ("minimum-length");
Real right_point
- = left_point + (robust_scm2double (minlen,0));
+ = left_point + (robust_scm2double (minlen, 0));
Spanner *orig = dynamic_cast<Spanner*> (me->original_);
bool last_line = orig
&& (me->get_break_index () == orig->broken_intos_.size () - 2)
&& !Lyric_extender::is_visible (orig->broken_intos_.top ());
-
if (heads.size ())
right_point = right_point >? heads.top ()->extent (common, X_AXIS)[RIGHT];
Real h = sl * robust_scm2double (me->get_property ("thickness"), 0);
Real pad = 2* h;
- if (r->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
- right_point = right_point <? (r->extent (common, X_AXIS)[LEFT] - pad);
- else if (Note_head::has_interface (r))
+ if (ri->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
+ right_point = right_point <? (ri->extent (common, X_AXIS)[LEFT] - pad);
+ else if (Note_head::has_interface (ri))
;
else if (!last_line)
- {
- /*
- run to end of line.
- */
- right_point = right_point >? (r->extent (common, X_AXIS)[LEFT] - pad);
- }
+ /* run to end of line. */
+ right_point = right_point >? (ri->extent (common, X_AXIS)[LEFT] - pad);
if (isinf (right_point))
{
programming_error ("Right point of extender not defined?");
- right_point = r->relative_coordinate (common, X_AXIS);
+ right_point = ri->relative_coordinate (common, X_AXIS);
}
left_point += pad;
if (w < 1.5 * h)
return SCM_EOL;
- Stencil mol (Lookup::round_filled_box (Box (Interval (0,w), Interval (0,h)),
- 0.8 * h));
- mol.translate_axis (left_point - me->relative_coordinate (common, X_AXIS), X_AXIS);
+ Stencil mol (Lookup::round_filled_box (Box (Interval (0, w),
+ Interval (0, h)),
+ 0.8 * h));
+ mol.translate_axis (left_point - me->relative_coordinate (common, X_AXIS),
+ X_AXIS);
return mol.smobbed_copy ();
}
s.translate_axis ((space - s.extent (X_AXIS).length ())/2, X_AXIS);
- return s ;
+ return s;
}
else
{
Kirchenpause (?)
*/
Stencil
-Multi_measure_rest::church_rest (Grob*me, Font_metric *musfont, int measures,
+Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measures,
Real space)
{
SCM mols = SCM_EOL;
- /*
- see Wanske pp. 125
- */
+ /* See Wanske pp. 125 */
int l = measures;
int count = 0;
Real symbols_width = 0.0;
int k;
if (l >= 2)
{
- l-=2;
+ l -= 2;
k = -2;
}
else
int k;
if (l >= 4)
{
- l-=4;
+ l -= 4;
k = -2;
}
else if (l>= 2)
else
{
k = 0;
- l --;
+ l--;
}
Stencil r (musfont->find_by_name ("rests-" + to_string (k)));
}
-
- Real outer_padding_factor = 1.5; // make outer padding this much bigger.
- Real inner_padding = (space - symbols_width) / (2 * outer_padding_factor + (count-1));
+ /* Make outer padding this much bigger. */
+ Real outer_padding_factor = 1.5;
+ Real inner_padding = (space - symbols_width)
+ / (2 * outer_padding_factor + (count-1));
if (inner_padding < 0)
- {
- inner_padding = 1.0;
- }
+ inner_padding = 1.0;
Stencil mol;
for (SCM s = mols; ly_c_pair_p (s); s = ly_cdr (s))
- {
- mol.add_at_edge (X_AXIS, LEFT, *unsmob_stencil (ly_car (s)), inner_padding, 0);
- }
+ mol.add_at_edge (X_AXIS, LEFT, *unsmob_stencil (ly_car (s)),
+ inner_padding, 0);
mol.align_to (X_AXIS, LEFT);
- mol.translate_axis (outer_padding_factor * inner_padding, X_AXIS);
+ mol.translate_axis (outer_padding_factor * inner_padding, X_AXIS);
return mol;
}
void
-Multi_measure_rest::add_column (Grob*me,Item* c)
+Multi_measure_rest::add_column (Grob *me, Item *c)
{
- add_bound_item (dynamic_cast<Spanner*> (me),c);
+ add_bound_item (dynamic_cast<Spanner*> (me), c);
}
-
-MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_spacing_rods,1);
+MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_spacing_rods, 1);
SCM
Multi_measure_rest::set_spacing_rods (SCM smob)
{
- Grob*me = unsmob_grob (smob);
+ Grob *me = unsmob_grob (smob);
Spanner*sp = dynamic_cast<Spanner*> (me);
- if (! (sp->get_bound (LEFT) && sp->get_bound (RIGHT)))
+ if (!(sp->get_bound (LEFT) && sp->get_bound (RIGHT)))
{
programming_error ("Multi_measure_rest::get_rods (): I am not spanned!");
return SCM_UNSPECIFIED;
}
- Item * l = sp->get_bound (LEFT)->get_column ();
- Item * r = sp->get_bound (RIGHT)->get_column ();
- Item * lb = l->find_prebroken_piece (RIGHT);
- Item * rb = r->find_prebroken_piece (LEFT);
+ Item *li = sp->get_bound (LEFT)->get_column ();
+ Item *ri = sp->get_bound (RIGHT)->get_column ();
+ Item *lb = li->find_prebroken_piece (RIGHT);
+ Item *rb = ri->find_prebroken_piece (LEFT);
- Item* combinations[4][2] = {{l,r},
- {lb,r},
- {l,rb},
+ Item *combinations[4][2] = {{li,ri},
+ {lb,ri},
+ {li,rb},
{lb,rb}};
Real sym_width = symbol_stencil (me, 0.0).extent (X_AXIS).length ();
for (int i=0; i < 4; i++)
{
- Item *l = combinations[i][0];
- Item *r = combinations[i][1];
+ Item *li = combinations[i][0];
+ Item *ri = combinations[i][1];
- if (!l || !r)
+ if (!li || !ri)
continue;
Rod rod;
- rod.item_l_drul_[LEFT] = l;
- rod.item_l_drul_[RIGHT] = r;
+ rod.item_l_drul_[LEFT] = li;
+ rod.item_l_drul_[RIGHT] = ri;
-
- rod.distance_ = l->extent (l, X_AXIS)[BIGGER] - r->extent (r, X_AXIS)[SMALLER]
- + sym_width + 2.0; // 2.0 = magic!
+ rod.distance_ = li->extent (li, X_AXIS)[BIGGER]
+ - ri->extent (ri, X_AXIS)[SMALLER]
+ /* 2.0 = magic! */
+ + sym_width + 2.0;
- Real minlen = robust_scm2double (me->get_property ("minimum-length"), 0.0);
- rod.distance_ = max (rod.distance_,
- minlen);
+ Real minlen = robust_scm2double (me->get_property ("minimum-length"), 0);
+ rod.distance_ = max (rod.distance_, minlen);
rod.add_to_cols ();
}
return SCM_UNSPECIFIED;
}
-
-
-
ADD_INTERFACE (Multi_measure_rest,"multi-measure-rest-interface",
"A rest that spans a whole number of measures.",
"expand-limit measure-count hair-thickness thick-thickness use-breve-rest minimum-length");
(let*
((cmd (string-append "latex \\\\nonstopmode \\\\input " name)))
+ (newline (current-error-port))
(display (format #f (_ "Invoking ~S") cmd) (current-error-port))
(newline (current-error-port))
(newline (current-error-port))
(if (ly:get-option 'verbose)
- (display (format "Invoking `~a'..." cmd) (current-error-port)))
+ (display (format (_"Invoking `~a'...") cmd) (current-error-port)))
(system cmd)))