]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/custos.cc
Run grand-replace (issue 3765)
[lilypond.git] / lily / custos.cc
index d4025b188e814f91ca3c63051dd31cebdcdafe5c..1bbf5f8d7191c1792ae56f9c203da4aea06ce628 100644 (file)
 /*
-  custos.cc -- implement Custos
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 2000--2014 Juergen Reuter <reuter@ipd.uka.de>
 
- (C) 2000, 2002 Juergen Reuter <reuter@ipd.uka.de>
-*/
-
-/* TODO:
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
- - merge create_ledger_line () and Note_head::create_ledger_line ()
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
- - rewrite create_ledger_line () to support short and thin ledger lines
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
- - do not show if a clef change immediately follows in the next line
+/* TODO:
 
- - decide: do or do not print custos if the next line starts with a rest
+- do not show if a clef change immediately follows in the next line
 
+- decide: do or do not print custos if the next line starts with a rest
 */
 
+#include <cstdio>
+#include <cmath> // rint
+using namespace std;
 
-#include <stdio.h>
-#include "direction.hh"
-#include "staff-symbol-referencer.hh"
 #include "custos.hh"
-#include "molecule.hh"
-#include "debug.hh"
-#include "note-head.hh"
-#include "item.hh"
+#include "direction.hh"
 #include "font-interface.hh"
-#include "math.h" // rint
+#include "international.hh"
+#include "item.hh"
+#include "note-head.hh"
+#include "staff-symbol-referencer.hh"
+#include "warn.hh"
 
-MAKE_SCHEME_CALLBACK (Custos,brew_molecule,1);
+MAKE_SCHEME_CALLBACK (Custos, print, 1);
 SCM
-Custos::brew_molecule (SCM smob)
+Custos::print (SCM smob)
 {
   Item *me = (Item *)unsmob_grob (smob);
-  SCM scm_style = me->get_grob_property ("style");
 
-  if (gh_symbol_p (scm_style))
-    {
-      String style = ly_scm2string (scm_symbol_to_string (scm_style));
-
-      /*
-       * Shall we use a common custos font character regardless if on
-       * staffline or not, or shall we use individual font characters
-       * for both cases?
-       */
-      bool adjust =
-       to_boolean (me->get_grob_property ("adjust-if-on-staffline"));
-
-      String idx = "custodes-" + style + "-";
-
-      int neutral_pos;
-      SCM ntr_pos = me->get_grob_property ("neutral-position");
-      if (gh_number_p (ntr_pos))
-       neutral_pos = gh_scm2int (ntr_pos);
-      else
-       neutral_pos = 0;
-
-      Direction neutral_direction =
-       to_dir (me->get_grob_property ("neutral-direction"));
-
-      int pos = (int)rint (Staff_symbol_referencer::position_f (me));
-      int sz = Staff_symbol_referencer::line_count (me)-1;
-
-      if (pos < neutral_pos)
-       idx += "u";
-      else if (pos > neutral_pos)
-       idx += "d";
-      else if (neutral_direction == UP)
-       idx += "u";
-      else if (neutral_direction == DOWN)
-       idx += "d";
-      else // auto direction; not yet supported -> use "d"
-       idx += "d";
-
-      if (adjust)
-        {
-         idx += (((pos ^ sz) & 0x1) == 0) ? "1" : "0";
-       }
-      else
-        {
-         idx += "2";
-       }
-
-      Molecule molecule
-       = Font_interface::get_default_font (me)->find_by_name (idx);
-      if (molecule.empty_b ())
-        {
-         String message = "no such custos: `" + idx + "'";
-         warning (_ (message.ch_C ()));
-         return SCM_EOL;
-       }
-      else
-        {
-         // add ledger lines
-         int pos = (int)rint (Staff_symbol_referencer::position_f (me));
-         int interspaces = Staff_symbol_referencer::line_count (me)-1;
-         if (abs (pos) - interspaces > 1)
-           {
-             Molecule ledger_lines =
-               Note_head::brew_ledger_lines (me, pos, interspaces,
-                                             molecule.extent (X_AXIS), true);
-             molecule.add_molecule (ledger_lines);
-           }
-         return molecule.smobbed_copy ();
-       }
-    }
+  SCM scm_style = me->get_property ("style");
+  string style;
+  if (scm_is_symbol (scm_style))
+    style = ly_symbol2string (scm_style);
   else
-    return SCM_EOL;
-}
+    style = "mensural";
+
+  /*
+   * Shall we use a common custos font character regardless if on
+   * staffline or not, or shall we use individual font characters
+   * for both cases?
+   */
+  bool adjust = true;
+
+  int neutral_pos = robust_scm2int (me->get_property ("neutral-position"), 0);
+  Direction neutral_direction
+    = to_dir (me->get_property ("neutral-direction"));
+
+  int pos = Staff_symbol_referencer::get_rounded_position (me);
+
+  string font_char = "custodes." + style + ".";
+  if (pos < neutral_pos)
+    font_char += "u";
+  else if (pos > neutral_pos)
+    font_char += "d";
+  else if (neutral_direction == UP)
+    font_char += "u";
+  else if (neutral_direction == DOWN)
+    font_char += "d";
+  else // auto direction; not yet supported -> use "d"
+    font_char += "d";
+
+  if (adjust)
+    font_char += Staff_symbol_referencer::on_line (me, pos) ? "1" : "0";
+  else
+    font_char += "2";
 
+  Stencil stencil
+    = Font_interface::get_default_font (me)->find_by_name (font_char);
+  if (stencil.is_empty ())
+    {
+      me->warning (_f ("custos `%s' not found", font_char));
+      return SCM_EOL;
+    }
 
-ADD_INTERFACE (Custos, "custos-interface",
-  "A custos is a staff context symbol that appears at the end of a
-  staff line with monophonic musical contents (i.e. with a single
-  voice).  It anticipates the pitch of the first note of the following
-  line and thus helps the player or singer to manage line breaks
-  during performance, thus enhancing readability of a score.
+  return stencil.smobbed_copy ();
+}
 
-  Custodes were frequently used in music notation until the 16th
-  century.  There were different appearences for different notation
-  styles.  Nowadays, they have survived only in special forms of
-  musical notation such as via the editio vaticana dating back to the
-  beginning of the 20th century.
+ADD_INTERFACE (Custos,
+               "A custos object.  @code{style} can have four valid values:"
+               " @code{mensural}, @code{vaticana}, @code{medicaea}, and"
+               " @code{hufnagel}.  @code{mensural} is the default style.",
 
-[TODO: add to glossary]",
-  "style adjust-if-on-staffline neutral-position");
+               /* properties */
+               "style "
+               "neutral-position "
+               "neutral-direction "
+              );