]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / accidental.cc
index 3d1f6270dc5426b3d7b9dff475917a390bd901b6..d79c17a9e9af2f1e70de4726723e6c4bca0548df 100644 (file)
@@ -3,15 +3,16 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 2001--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
+#include "accidental-interface.hh"
 #include "font-interface.hh"
+#include "international.hh"
 #include "item.hh"
-#include "stencil.hh"
-#include "accidental-interface.hh"
 #include "output-def.hh"
 #include "pitch.hh"
+#include "stencil.hh"
 
 /*
   TODO: insert support for smaller cautionaries, tie-break-reminders.
 Stencil
 parenthesize (Grob *me, Stencil m)
 {
-  Stencil open = Font_interface::get_default_font (me)->find_by_name ("accidentals.leftparen");
-  Stencil close = Font_interface::get_default_font (me)->find_by_name ("accidentals.rightparen");
+  Font_metric * font
+    = Font_interface::get_default_font (me); 
+  Stencil open
+    = font->find_by_name ("accidentals.leftparen");
+  Stencil close
+    = font->find_by_name ("accidentals.rightparen");
 
   m.add_at_edge (X_AXIS, LEFT, Stencil (open), 0, 0);
   m.add_at_edge (X_AXIS, RIGHT, Stencil (close), 0, 0);
@@ -32,34 +37,35 @@ parenthesize (Grob *me, Stencil m)
   return m;
 }
 
+/*
+  Hmm. Need separate callback, or perhaps #'live bool property.
+ */
 MAKE_SCHEME_CALLBACK (Accidental_interface, after_line_breaking, 1);
 SCM
 Accidental_interface::after_line_breaking (SCM smob)
 {
   Grob *me = unsmob_grob (smob);
-  Grob *tie = unsmob_grob (me->get_property ("tie"));
+  Grob *tie = unsmob_grob (me->get_object ("tie"));
 
-  if (tie && !tie->original_)
-    {
-      me->suicide ();
-    }
+  if (tie && !tie->original ())
+    me->suicide ();
   return SCM_UNSPECIFIED;
 }
 
-Array<Box>
+vector<Box>
 Accidental_interface::accurate_boxes (Grob *a, Grob **common)
 {
   Box b;
   b[X_AXIS] = a->extent (a, X_AXIS);
   b[Y_AXIS] = a->extent (a, Y_AXIS);
 
-  Array<Box> boxes;
+  vector<Box> boxes;
 
   bool parens = false;
   if (to_boolean (a->get_property ("cautionary")))
     {
       SCM cstyle = a->get_property ("cautionary-style");
-      parens = ly_c_equal_p (cstyle, ly_symbol2scm ("parentheses"));
+      parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses"));
     }
 
   SCM accs = a->get_property ("accidentals");
@@ -87,8 +93,8 @@ Accidental_interface::accurate_boxes (Grob *a, Grob **common)
            stem[Y_AXIS] *= 1.1;
            bulb[Y_AXIS][UP] *= .35;
 
-           boxes.push (bulb);
-           boxes.push (stem);
+           boxes.push_back (bulb);
+           boxes.push_back (stem);
          }
          break;
        case NATURAL:
@@ -101,13 +107,13 @@ Accidental_interface::accurate_boxes (Grob *a, Grob **common)
            rstem[Y_AXIS] *= 1.1;
 
            belly[Y_AXIS] *= 0.75;
-           lstem[X_AXIS][RIGHT] *= .5;
-           rstem[X_AXIS][LEFT] = lstem[X_AXIS][RIGHT];
+           lstem[X_AXIS][RIGHT] *= .33;
+           rstem[X_AXIS][LEFT] = rstem[X_AXIS].linear_combination (1.0 / 3.0);
            lstem[Y_AXIS][DOWN] = belly[Y_AXIS][DOWN];
            rstem[Y_AXIS][UP] = belly[Y_AXIS][UP];
-           boxes.push (belly);
-           boxes.push (lstem);
-           boxes.push (rstem);
+           boxes.push_back (belly);
+           boxes.push_back (lstem);
+           boxes.push_back (rstem);
          }
          break;
          /*
@@ -115,21 +121,18 @@ Accidental_interface::accurate_boxes (Grob *a, Grob **common)
          */
        }
     }
-      
+
   if (!boxes.size ())
-    boxes.push (b);
+    boxes.push_back (b);
 
   Offset o (a->relative_coordinate (common[X_AXIS], X_AXIS),
            a->relative_coordinate (common[Y_AXIS], Y_AXIS));
-  for (int i = boxes.size (); i--;)
-    {
-      boxes[i].translate (o);
-    }
+  for (vsize i = boxes.size (); i--;)
+    boxes[i].translate (o);
 
   return boxes;
 }
 
-
 /*
  * Some styles do not provide all flavours of accidentals, e.g. there
  * is currently no sharp accidental in vaticana style.  In these cases
@@ -139,14 +142,12 @@ Accidental_interface::accurate_boxes (Grob *a, Grob **common)
 /*
   todo: this sort of stuff in Scheme. --hwn.
 */
-String
-Accidental_interface::get_fontcharname (String style, int alteration)
+string
+Accidental_interface::get_fontcharname (string style, int alteration)
 {
   if (alteration == DOUBLE_FLAT
       || alteration == DOUBLE_SHARP)
-    {
-      return to_string (alteration);
-    }
+    return to_string (alteration);
 
   if (style == "hufnagel")
     switch (alteration)
@@ -196,23 +197,19 @@ Accidental_interface::print (SCM smob)
   if (caut)
     {
       SCM cstyle = me->get_property ("cautionary-style");
-      parens = ly_c_equal_p (cstyle, ly_symbol2scm ("parentheses"));
-      smaller = ly_c_equal_p (cstyle, ly_symbol2scm ("smaller"));
+      parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses"));
+      smaller = ly_is_equal (cstyle, ly_symbol2scm ("smaller"));
     }
 
   SCM scm_style = me->get_property ("style");
-  String style;
+  string style;
   if (scm_is_symbol (scm_style))
-    {
-      style = ly_symbol2string (scm_style);
-    }
+    style = ly_symbol2string (scm_style);
   else
-    {
-      /*
-       preferably no name for the default style.
-      */
-      style = "";
-    }
+    /*
+      preferably no name for the default style.
+    */
+    style = "";
 
   Font_metric *fm = 0;
   if (smaller)
@@ -223,9 +220,9 @@ Accidental_interface::print (SCM smob)
       */
       ac = scm_cons (scm_list_1 (scm_cons
                                 (ly_symbol2scm ("font-size"),
-                                 scm_int2num (-2))),
+                                 scm_from_int (-2))),
                     ac);
-      fm = select_font (me->get_layout (), ac);
+      fm = select_font (me->layout (), ac);
     }
   else
     fm = Font_interface::get_default_font (me);
@@ -235,17 +232,13 @@ Accidental_interface::print (SCM smob)
        scm_is_pair (s); s = scm_cdr (s))
     {
       int alteration = scm_to_int (scm_car (s));
-      String font_char = get_fontcharname (style, alteration);
+      string font_char = get_fontcharname (style, alteration);
       Stencil acc (fm->find_by_name ("accidentals." + font_char));
 
       if (acc.is_empty ())
-       {
-         me->warning (_f ("accidental `%s' not found", font_char));
-       }
+       me->warning (_f ("accidental `%s' not found", font_char));
       else
-       {
-         mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1, 0);
-       }
+       mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1, 0);
     }
 
   if (parens)
@@ -255,9 +248,14 @@ Accidental_interface::print (SCM smob)
 }
 
 /*
-  TODO: should move inside-slur into item?
-
+  TODO: should move avoid-slur into item?
 */
 ADD_INTERFACE (Accidental_interface, "accidental-interface",
               "a single accidental",
-              "inside-slur cautionary cautionary-style style tie accidentals");
+              "accidentals "
+              "avoid-slur "
+              "cautionary "
+              "cautionary-style "
+              "style "
+              "tie "
+              );