]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/chord-name.cc
release: 1.3.75
[lilypond.git] / lily / chord-name.cc
index 90b81c57fdd53b72e2498ceefcf89fd2e9d96e6c..62562e08ec1a96e57a62a66a171bdbb003211d0c 100644 (file)
 */
 
 #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"
 
 /*
   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)
  */
 
-/*
-  UGH. remove Dictionary< > and use Scheme_hash_table
- */
 Molecule
-Chord_name::ly_word2molecule (SCM word) const
+Chord_name::ly_word2molecule (Score_element * me, SCM word, Real* x) 
 {
-  /*
-    junkme.
-
-    Using the dict doesn't save code, since you have to compare
-    dict entries by hand later on anyway.
-    
-   */
-  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 (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);
-        }
     }
 
-  /*
-    UGH. Should read from font metric structure.
-  */
-  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;
@@ -117,55 +102,53 @@ Chord_name::ly_word2molecule (SCM word) const
   ;; 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;
 }
 
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Chord_name);
+MAKE_SCHEME_CALLBACK(Chord_name,brew_molecule);
 
-Molecule 
-Chord_name::do_brew_molecule () const
+SCM
+Chord_name::brew_molecule (SCM smob) 
 {
-  SCM style = get_elt_property ("style");
-  if (style == SCM_UNDEFINED)
+  Score_element *sc = unsmob_element (smob);
+  SCM style = sc->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 = sc-> get_elt_property ("inversion");
+  if (inversion == SCM_EOL)
     inversion = SCM_BOOL_F;
 
-  SCM bass = get_elt_property ("bass");
-  if (bass == SCM_UNDEFINED)
+  SCM bass =  sc->get_elt_property ("bass");
+  if (bass == SCM_EOL)
     bass = SCM_BOOL_F;
 
-  SCM pitches = get_elt_property ("pitches");
-
+  SCM pitches =  sc->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));
 
-  return ly_text2molecule (text);
-}
-
-Chord_name::Chord_name (SCM s)
-  : Item (s)
-{
+  return ly_text2molecule (sc, text).create_scheme ();
 }