#include "main.hh"
#include "kpath.hh"
#include "lily-version.hh"
+#include "warn.hh"
-
-char *
+String
ly_find_afm (char const * name)
{
#if (KPATHSEA && HAVE_KPSE_FIND_FILE)
- return kpse_find_file (name, kpse_afm_format, true);
+ char * name_ptr = kpse_find_file (name, kpse_afm_format, true);
+
+ if(!name_ptr)
+ {
+ /*
+ don't mutter about afms, since we try to find them first, and lots of
+ TFMs don't have AFMs.
+ */
+ // warning (_f("kpathsea couldn't find AFM file `%s'", name));
+ }
+ else
+ return name_ptr;
+
#endif
- return 0;
+ return "";
}
String
return p;
#if (KPATHSEA && HAVE_KPSE_FIND_FILE)
- return kpse_find_file (name, kpse_tfm_format, true);
+ char * name_ptr = kpse_find_file (name, kpse_tfm_format, true);
+ if(!name_ptr)
+ {
+ warning (_f("Kpathsea couldn't find TFM file `%s'", name));
+ }
+ else
+ return name_ptr;
+
#endif
return "";
}
void
New_spacing_spanner::do_measure (Grob*me, Link_array<Grob> *cols)
{
- Moment shortest;
- Moment mean_shortest;
+ Moment shortest_in_measure;
/*
space as if this duration is present.
*/
Moment base_shortest_duration = *unsmob_moment (me->get_grob_property ("maximum-duration-for-spacing"));
- shortest.set_infinite (1);
+ shortest_in_measure.set_infinite (1);
for (int i = cols->size(); i--;)
{
SCM st = cols->elem (i)->get_grob_property ("shortest-starter-duration");
Moment this_shortest = *unsmob_moment (st);
- shortest = shortest <? this_shortest;
- if (!mean_shortest.main_part_.infty_b ())
- {
- n++;
- mean_shortest += this_shortest;
- }
+ shortest_in_measure = shortest_in_measure <? this_shortest;
}
}
continue ;
}
- Real note_space = note_spacing (me,lc, rc, shortest <? base_shortest_duration);
+ Real note_space = note_spacing (me,lc, rc, shortest_in_measure <? base_shortest_duration);
Real hinterfleisch = note_space;
Real headwid = gh_scm2double (me->get_grob_property ("arithmetic-multiplier"));
+
+ SCM seq = lc->get_grob_property ("spacing-sequence");
+
+ Moment dt = Paper_column::when_mom (r) - Paper_column::when_mom (l);
- for (SCM s = lc->get_grob_property ("spacing-sequence"); gh_pair_p (s); s = gh_cdr (s))
+ /*
+ hinterfleisch = hind-meat = amount of space following a note.
+
+
+ We adjust the space following a note only if the next note
+ happens after the current note (this is set in the grob
+ property SPACING-SEQUENCE. */
+
+ Real stretch_distance = note_space;
+ if (shortest_in_measure <= dt)
{
- Grob *lm = unsmob_grob (gh_caar (s));
- Grob *rm = unsmob_grob (gh_cdar (s));
+ /*
+ currently SPACING-SEQUENCE is set in
+ Separating_group_spanner::find_musical_sequences (), which
+ works neatly for one-voice-per staff, however,
- // TODO; configgable.
- hinterfleisch += -headwid + Separation_item::my_width (lm)[RIGHT] -
- 0.5 * Separation_item::my_width (rm)[LEFT];
+ it can't find out the actual duration of the notes on a
+ staff, so when putting tuplets and normal patterns it gets
+ confused, (ie. believes that < { c8 c8 } { d8 d8 d8 }*2/3
+ > contains 1/12 notes. ).
+ here we kludge, by checking if the distance we're spacing
+ for is less than the shortest note.
+
+ TODO:
+
+ Move SPACING-SEQUENCE detection into a voice
+ level-engraver --or-- make sure that every column has
+ access to the note head.
- /*
- UGH: KLUDGE!
*/
-
- // if (delta_t > Moment (Rational (1,32)))
- hinterfleisch += stem_dir_correction (me, l, r);
- }
+ for (SCM s = seq; gh_pair_p (s); s = gh_cdr (s))
+ {
+ Grob *lm = unsmob_grob (gh_caar (s));
+ Grob *rm = unsmob_grob (gh_cdar (s));
+
+ // TODO; configgable.
+ hinterfleisch += -headwid + Separation_item::my_width (lm)[RIGHT] -
+ 0.5 * Separation_item::my_width (rm)[LEFT];
- Real stretch_distance = note_space - headwid;
+
+ hinterfleisch += stem_dir_correction (me, l, r);
+ }
+
+ // ? why.
+ if (gh_pair_p (seq))
+ stretch_distance -= headwid;
+ }
Spring s;
s.distance_f_ = hinterfleisch;
s.strength_f_ = 1 / stretch_distance;
*/
Real
New_spacing_spanner::default_bar_spacing (Grob*me, Grob *lc, Grob *rc,
- Moment shortest)
+ Moment shortest)
{
Real symbol_distance = lc->extent (lc,X_AXIS)[RIGHT] ;
Real durational_distance = 0;
Moment shortest_playing_len = 0;
SCM s = lc->get_grob_property ("shortest-playing-duration");
- // SCM s = lc->get_grob_property ("mean-playing-duration");
+
if (unsmob_moment (s))
shortest_playing_len = *unsmob_moment (s);