]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-head.cc
2003 -> 2004
[lilypond.git] / lily / note-head.cc
index 76eb2a69395e94fbac1a18a3a678d1e993ead025..9fc325784851864ee5ff4c1c1e4751501e8e5a03 100644 (file)
@@ -3,11 +3,12 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 #include <math.h>
 #include <ctype.h>
 
+#include "staff-symbol.hh"
 #include "misc.hh"
 #include "dots.hh"
 #include "note-head.hh"
@@ -66,8 +67,10 @@ Note_head::brew_ledger_lines (Grob *me,
                               int pos,
                               int interspaces,
                               Interval x_extent,
+                             Real left_shorten,
                              bool take_space)
 {
+  Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
   Real inter_f = Staff_symbol_referencer::staff_space (me)/2;
   int line_count = (abs (pos) < interspaces)
     ? 0
@@ -78,28 +81,35 @@ Note_head::brew_ledger_lines (Grob *me,
   if (line_count)
     {
       Real ledgerlinethickness =
-       (me->get_paper ()->get_realvar (ly_symbol2scm ("ledgerlinethickness")));
+       Staff_symbol::get_ledger_line_thickness (staff);
       Real blotdiameter = ledgerlinethickness;
-      //       (me->get_paper ()->get_realvar (ly_symbol2scm ("blotdiameter")));
       Interval y_extent =
        Interval (-0.5*(ledgerlinethickness),
                  +0.5*(ledgerlinethickness));
-      Box ledger_line (x_extent, y_extent);
-
       Molecule proto_ledger_line =
-       Lookup::round_filled_box (ledger_line, blotdiameter);
+       Lookup::round_filled_box (Box (x_extent, y_extent), blotdiameter);
 
-      if (!take_space)
-        proto_ledger_line.set_empty (true);
+      x_extent[LEFT] += left_shorten;
+      Molecule proto_first_line =
+       Lookup::round_filled_box (Box (x_extent, y_extent), blotdiameter);
 
+      if (!take_space)
+        {
+         proto_ledger_line.set_empty (true);
+         proto_first_line.set_empty (true);
+       }
       
       Direction dir = (Direction)sign (pos);
       Real offs = (Staff_symbol_referencer::on_staffline (me, pos))
         ? 0.0
         : -dir * inter_f;
+      
       for (int i = 0; i < line_count; i++)
         {
-          Molecule ledger_line (proto_ledger_line);
+          Molecule ledger_line ((i == 0) 
+                               ? proto_first_line
+                               : proto_ledger_line
+                               );
           ledger_line.translate_axis (-dir * inter_f * i * 2 + offs, Y_AXIS);
           molecule.add_molecule (ledger_line);
         }
@@ -124,7 +134,7 @@ internal_brew_molecule (Grob *me, bool with_ledgers)
 
   Font_metric * fm = Font_interface::get_default_font (me);
   Molecule out = fm->find_by_name (font_char);
-  if (out.empty_b())
+  if (out.is_empty ())
     {
       me->warning (_f ("note head `%s' not found", font_char.to_str0 ()));
     }
@@ -134,10 +144,10 @@ internal_brew_molecule (Grob *me, bool with_ledgers)
   if (with_ledgers && interspaces >= 0
       && abs (pos) - interspaces > 1)
     {
-      Interval hd = out.extent (X_AXIS);
-      Real left_ledger_protusion = hd.length ()/4;
-      Real right_ledger_protusion = left_ledger_protusion;
+      Interval ledger_size = out.extent (X_AXIS);
+      ledger_size.widen ( ledger_size.length ()/4);
 
+      Real left_shorten =0.0;
       if (Grob * g = unsmob_grob(me->get_grob_property ("accidental-grob")))
        {
          /*
@@ -149,16 +159,21 @@ internal_brew_molecule (Grob *me, bool with_ledgers)
 
          Grob *common = g->common_refpoint (me, X_AXIS);
          Real d =
-           me->extent (common, X_AXIS)[LEFT]
-           -g->extent (common, X_AXIS)[RIGHT];
-         
-         left_ledger_protusion = left_ledger_protusion <? (d/2);
+           (me->extent (common, X_AXIS)[LEFT]
+            +g->extent (common, X_AXIS)[RIGHT]) /2;
+
+         left_shorten =  (-ledger_size[LEFT] + d) >?  0 ;
+
+         /*
+           TODO: shorten 2 ledger lines for the case natural +
+           downstem.
+          */
        }
 
-      Interval l_extents = Interval (hd[LEFT] - left_ledger_protusion,
-                                    hd[RIGHT] + right_ledger_protusion);
       out.add_molecule (Note_head::brew_ledger_lines (me, pos, interspaces,
-                                                     l_extents, false));
+                                                     ledger_size,
+                                                     left_shorten,
+                                                     false));
     }
   return out;
 }
@@ -190,7 +205,7 @@ Note_head::head_extent (Grob *me, Axis a)
     {
       Molecule mol = internal_brew_molecule (me, false);
   
-      if (!mol.empty_b())
+      if (!mol.is_empty ())
        return mol.extent (a);
     }
   else
@@ -250,9 +265,8 @@ Note_head::brew_ez_molecule (SCM smob)
   if (abs (pos) - interspaces > 1)
     {
       Interval hd = m.extent (X_AXIS);
-      Real hw = hd.length ()/4;
-      Interval extent = Interval (hd[LEFT] - hw, hd[RIGHT] + hw);
-      m.add_molecule (brew_ledger_lines (me, pos, interspaces, extent, false));
+      hd.widen ( hd.length ()/4);
+      m.add_molecule (brew_ledger_lines (me, pos, interspaces, hd, 0, false));
     }
 
   return m.smobbed_copy ();
@@ -285,7 +299,7 @@ Note_head::stem_attachment_coordinate (Grob *me, Axis a)
          Box b = fm->get_indexed_char (k);
          Offset wxwy = fm->get_indexed_wxwy (k);
          Interval v = b[a];
-         if (!v.empty_b ())
+         if (!v.is_empty ())
            return 2 * (wxwy[a] - v.center()) / v.length ();
        }
     }
@@ -303,7 +317,7 @@ Note_head::stem_attachment_coordinate (Grob *me, Axis a)
 
   result = (a == X_AXIS) ? ly_car (result) : ly_cdr (result);
   
-  return gh_number_p (result) ?  gh_scm2double (result) : 0.0;
+  return robust_scm2double (result,0);
 }
 
 int