*/
#include "chord-name.hh"
-#include "musical-request.hh"
-#include "warn.hh"
-#include "debug.hh"
#include "molecule.hh"
#include "paper-def.hh"
#include "lookup.hh"
-#include "staff-symbol-referencer.hh"
-
+#include "score-element.hh"
+#include "paper-column.hh"
+#include "line-of-score.hh"
/*
TODO: move text lookup out of Chord_name
*/
/*
- word is roman text or styled text:
+ word is roman text or property-styled text:
"text"
- ("style" . "text")
+ ("text" . property-alist)
*/
+
Molecule
-Chord_name::ly_word2molecule (SCM word) const
+Chord_name::ly_word2molecule (Score_element * me, SCM word, Real* x)
{
- Dictionary<SCM> option_dict;
+ *x = 0;
+
+ SCM options_alist = SCM_EOL;
if (gh_pair_p (word))
{
- SCM options = gh_cdr (word);
+ options_alist = gh_cdr (word);
word = gh_car (word);
- while (gh_pair_p (options))
- {
- SCM option = gh_car (options);
- if (option != SCM_UNDEFINED && option != SCM_BOOL_F
- && gh_pair_p (option))
- {
- SCM key = gh_car (option);
- SCM val = gh_cdr (option);
- String k;
- if (gh_symbol_p (key))
- k = ly_symbol2string (key);
- else if (gh_string_p (key))
- k = ly_scm2string (key);
- else
- continue;
- option_dict[k] = val;
- }
- options = gh_cdr (options);
- }
}
- Real ex = lookup_l ()->text ("", "x", paper_l ()).extent
- ()[Y_AXIS].length ();
+
if (gh_string_p (word))
{
- String w = ly_scm2string (word);
- Molecule mol;
- Offset offset;
+ /*
+ UGH. Should read from font metric structure.
+ */
+ Real ex = me->lookup_l ()->text ("", "x",
+ me->paper_l ()).extent (Y_AXIS).length ();
+ Real em = me->lookup_l ()->text ("", "m",
+ me->paper_l ()).extent (X_AXIS).length ();
- int size = 0;
- if (option_dict.elem_b ("size"))
- size = gh_scm2int (option_dict["size"]);
+ String w = ly_scm2string (word);
String style;
- if (option_dict.elem_b ("style"))
- style = ly_scm2string (option_dict["style"]);
+ SCM s = scm_assoc (ly_symbol2scm ("style"), options_alist);
+ if (s != SCM_BOOL_F)
+ {
+ style = ly_scm2string (gh_cdr (s));
+ }
- if (option_dict.elem_b ("type")
- && ly_scm2string (option_dict["type"]) == "super")
+ Offset offset;
+ int size = 0;
+ /*
+ urg, `type'
+ */
+ s = scm_assoc (ly_symbol2scm ("type"), options_alist);
+ if (s != SCM_BOOL_F && ly_scm2string (gh_cdr (s)) == "super")
{
Real super_y = ex / 2;
- //super_y += -acc.extent ()[Y_AXIS][MIN];
offset = Offset (0, super_y);
if (!size)
size = -2;
}
- if (option_dict.elem_b ("offset"))
+
+ s = scm_assoc (ly_symbol2scm ("size"), options_alist);
+ if (s != SCM_BOOL_F)
+ {
+ size = gh_scm2int (gh_cdr (s));
+ }
+
+ s = scm_assoc (ly_symbol2scm ("offset"), options_alist);
+ if (s != SCM_BOOL_F)
{
// hmm
- SCM s = option_dict["offset"];
- if (gh_pair_p (s))
- offset = Offset (gh_scm2double (gh_car (s)),
- gh_scm2double (gh_cdr (s))) * ex;
+ SCM o = gh_cdr (s);
+ if (gh_pair_p (o))
+ offset = Offset (0, gh_scm2double (gh_cdr (o))) * ex;
+ *x = gh_scm2double (gh_car (o)) * em;
}
- if (option_dict.elem_b ("font")
- && ly_scm2string (option_dict["font"]) == "feta")
- mol = paper_l ()->lookup_l (size)->afm_find (w);
+
+ Molecule mol;
+ s = scm_assoc (ly_symbol2scm ("font"), options_alist);
+ if (s != SCM_BOOL_F && ly_scm2string (gh_cdr (s)) == "feta")
+ mol = me->paper_l ()->lookup_l (size)->afm_find (w);
else
- mol = paper_l ()->lookup_l (size)->text (style, w, paper_l ());
+ mol = me->paper_l ()->lookup_l (size)->text (style, w, me->paper_l ());
mol.translate (offset);
return mol;
;; property: align, kern, font (?), size
*/
Molecule
-Chord_name::ly_text2molecule (SCM text) const
+Chord_name::ly_text2molecule (Score_element * me, SCM text)
{
Molecule mol;
if (gh_list_p (text))
{
while (gh_cdr (text) != SCM_EOL)
{
- Molecule m = ly_word2molecule (gh_car (text));
+ Real x;
+ Molecule m = ly_word2molecule (me, gh_car (text), &x);
if (!m.empty_b ())
- mol.add_at_edge (X_AXIS, RIGHT, m, 0);
+ mol.add_at_edge (X_AXIS, RIGHT, m, x);
text = gh_cdr (text);
}
text = gh_car (text);
}
- Molecule m = ly_word2molecule (text);
+ Real x;
+ Molecule m = ly_word2molecule (me,text, &x);
if (!m.empty_b ())
- mol.add_at_edge (X_AXIS, RIGHT, m, 0);
+ mol.add_at_edge (X_AXIS, RIGHT, m, x);
return mol;
}
-Molecule
-Chord_name::do_brew_molecule () const
+MAKE_SCHEME_CALLBACK (Chord_name, after_line_breaking);
+SCM
+Chord_name::after_line_breaking (SCM smob)
{
- SCM style = get_elt_property ("style");
- if (style == SCM_UNDEFINED)
+ Item* me = dynamic_cast<Item*> (unsmob_element (smob));
+ assert (me);
+
+ SCM s = me->get_elt_property ("begin-of-line-visible");
+ if (to_boolean (s))
+ {
+ if (Paper_column::rank_i (me->column_l ()) -
+ /*
+ hmm, what's my column number in this line?
+ why doesn't this work?
+ me->line_l ()->rank_i_ > 2)
+ */
+ me->line_l ()->spanned_rank_iv ()[LEFT] > 1)
+ me->suicide ();
+ }
+ return SCM_UNSPECIFIED;
+}
+
+MAKE_SCHEME_CALLBACK (Chord_name, brew_molecule);
+SCM
+Chord_name::brew_molecule (SCM smob)
+{
+ Score_element *me = unsmob_element (smob);
+ SCM style = me->get_elt_property ("style");
+
+ if (!gh_string_p (style))
style = ly_str02scm ("banter");
- SCM inversion = get_elt_property ("inversion");
- if (inversion == SCM_UNDEFINED)
+ SCM inversion = me-> get_elt_property ("inversion");
+ if (inversion == SCM_EOL)
inversion = SCM_BOOL_F;
- SCM bass = get_elt_property ("bass");
- if (bass == SCM_UNDEFINED)
+ SCM bass = me->get_elt_property ("bass");
+ if (bass == SCM_EOL)
bass = SCM_BOOL_F;
- SCM pitches = get_elt_property ("pitches");
-
- SCM text = scm_eval (gh_list (ly_symbol2scm ("chord::user-name"),
- style,
- ly_quote_scm (pitches),
- ly_quote_scm (gh_cons (inversion, bass)),
- SCM_UNDEFINED));
+ SCM pitches = me->get_elt_property ("pitches");
+ SCM func = me->get_elt_property (ly_symbol2scm ("chord-name-function"));
+ SCM text = gh_call3 (func, style, ly_quote_scm (pitches), ly_quote_scm (gh_cons (inversion, bass)));
- return ly_text2molecule (text);
+ return ly_text2molecule (me, text).create_scheme ();
}