]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/porrectus.cc
* lily/lexer.ll (avoid_silly_flex_induced_gcc_warnings): Disable.
[lilypond.git] / lily / porrectus.cc
index d811c380c3665b77eea00481e6deb12d8c905cc8..e544cfb80c857e31a73062f2c0787bcdc5156f28 100644 (file)
@@ -1,7 +1,7 @@
 /*
   porrectus.cc -- implement Porrectus
 
-  Copyright (c) 2001--2002  Juergen Reuter
+  Copyright (c) 2001--2003  Juergen Reuter
 
   written for the GNU LilyPond music typesetter
 
 #include "molecule.hh"
 #include "pitch.hh"
 #include "lookup.hh"
-#include "debug.hh"
+#include "warn.hh"
 #include "dimensions.hh"
 #include "direction.hh"
 #include "bezier.hh"
 #include "font-interface.hh"
 #include "paper-def.hh"
+#include "note-head.hh"
 #include "math.h" // rint
 
 void
@@ -82,75 +83,6 @@ Porrectus::get_right_head (Grob *me)
     }
 }
 
-// Uugh.  The following two functions are almost duplicated code from
-// custos.cc, which itself is similar to code in note-head.cc.  Maybe
-// this should be moved to staff-symbol-referencer.cc?
-Molecule
-Porrectus::create_ledger_line (Interval x_extent, Grob *me) 
-{
-  Molecule line;
-  Molecule slice = Font_interface::get_default_font (me)->find_by_name ("noteheads-ledgerending");
-  Interval slice_x_extent = slice.extent (X_AXIS);
-  Interval slice_y_extent = slice.extent (Y_AXIS);
-
-  // Create left ending of ledger line.
-  Molecule left_ending = slice;
-  left_ending.translate_axis (x_extent[LEFT] - slice_x_extent[LEFT], X_AXIS);
-  if (x_extent.length () > slice_x_extent.length ())
-    line.add_molecule (left_ending);
-
-  // Create right ending of ledger line.
-  Molecule right_ending = slice;
-  right_ending.translate_axis (x_extent[RIGHT] - slice_x_extent[RIGHT],
-                              X_AXIS);
-  line.add_molecule (right_ending);
-
-  // Fill out space between left and right ending of ledger line by
-  // lining up a series of slices in a row between them.
-  Molecule fill_out_slice = left_ending;
-  Real thick = slice_y_extent.length ();
-  Real delta_x = slice_x_extent.length () - thick;
-  Real xpos = x_extent [LEFT] + 2*delta_x + thick/2; // TODO: check: thick*2?
-  while (xpos <= x_extent[RIGHT])
-    {
-      fill_out_slice.translate_axis (delta_x, X_AXIS);
-      line.add_molecule (fill_out_slice);
-      xpos += delta_x;
-    }
-
-  return line;
-}
-
-Molecule
-Porrectus::create_streepjes (Grob *me,
-                            int pos,
-                            int interspaces,
-                            Interval extent)
-{
-  Real inter_f = Staff_symbol_referencer::staff_space (me)/2;
-  int streepjes_i = abs (pos) < interspaces
-    ? 0
-    : (abs (pos) - interspaces) /2;
-  Molecule molecule = Molecule();
-  if (streepjes_i) 
-    {
-      Direction dir = (Direction)sign (pos);
-      Molecule ledger_line (create_ledger_line (extent, me));
-      ledger_line.set_empty (true);
-      Real offs = (Staff_symbol_referencer::on_staffline (me, pos))
-       ? 0.0
-       : -dir * inter_f;
-      for (int i = 0; i < streepjes_i; i++)
-       {
-         Molecule streep (ledger_line);
-         streep.translate_axis (-dir * inter_f * i * 2 + offs,
-                                Y_AXIS);
-         molecule.add_molecule (streep);
-       }
-    }
-  return molecule;
-}
-
 MAKE_SCHEME_CALLBACK (Porrectus,brew_molecule,1);
 SCM 
 Porrectus::brew_molecule (SCM smob)
@@ -169,7 +101,7 @@ Porrectus::brew_molecule (SCM smob)
   SCM scm_style = me->get_grob_property ("style");
   String style;
   if ((gh_symbol_p (scm_style)) && (scm_style != SCM_EOL))
-    style = ly_scm2string (scm_symbol_to_string (scm_style));
+    style = ly_symbol2string (scm_style);
   else {
     me->warning (_ ("porrectus style undefined; using mensural"));
     style = "mensural";
@@ -179,11 +111,9 @@ Porrectus::brew_molecule (SCM smob)
   bool add_stem = to_boolean (me->get_grob_property ("add-stem"));
 
   /*
-
-  TODO:
-
-  ugr. why not  called direction?
-    
+   * This property is called stem-direction (rather than direction)
+   * since it only refers to this grob's stem (or, more precisely, its
+   * "cauda"), but not the grob as a whole.
    */
   SCM stem_direction_scm = me->get_grob_property ("direction");
   Direction stem_direction =
@@ -191,7 +121,6 @@ Porrectus::brew_molecule (SCM smob)
   if (!stem_direction)
     stem_direction = DOWN;
 
-
   /*
     TODO: revise name.
    */
@@ -199,7 +128,7 @@ Porrectus::brew_molecule (SCM smob)
   if (auto_properties)
       // determine add_stem and stem_direction automatically from durations
     {
-      if (String::compare_i (style, "mensural") != 0)
+      if (String::compare (style, "mensural") != 0)
        me->warning (String("auto-property should be used for\r\n") +
                 String("mensural style porrectus only; trying anyway"));
 
@@ -236,8 +165,8 @@ Porrectus::brew_molecule (SCM smob)
        }
     }
 
-  Real left_position_f = Staff_symbol_referencer::position_f (left_head);
-  Real right_position_f = Staff_symbol_referencer::position_f (right_head);
+  Real left_position_f = Staff_symbol_referencer::get_position (left_head);
+  Real right_position_f = Staff_symbol_referencer::get_position (right_head);
   Real interval = right_position_f - left_position_f;
 
   Molecule molecule;
@@ -253,7 +182,7 @@ Porrectus::brew_molecule (SCM smob)
       line_thickness = 1.0;
     }
   Real thickness =
-    line_thickness * me->paper_l ()->get_var ("stafflinethickness");
+    line_thickness * me->get_paper ()->get_var ("linethickness");
 
   SCM porrectus_width_scm = me->get_grob_property ("width");
   Real porrectus_width;
@@ -267,11 +196,11 @@ Porrectus::brew_molecule (SCM smob)
     }
   Real width = porrectus_width * Staff_symbol_referencer::staff_space (me);
 
-  if (String::compare_i (style, "vaticana") == 0)
+  if (String::compare (style, "vaticana") == 0)
     molecule = brew_vaticana_molecule (me, interval,
                                       solid, width, thickness,
                                       add_stem, stem_direction);
-  else if (String::compare_i (style, "mensural") == 0)
+  else if (String::compare (style, "mensural") == 0)
     molecule = brew_mensural_molecule (me, interval,
                                       solid, width, thickness,
                                       add_stem, stem_direction);
@@ -285,15 +214,25 @@ Porrectus::brew_molecule (SCM smob)
 
   molecule.translate_axis (left_position_f * space/2, Y_AXIS);
 
-  Molecule left_head_streepjes =
-    create_streepjes (me, (int)rint (left_position_f), interspaces, extent);
-  left_head_streepjes.translate_axis (left_position_f * space/2, Y_AXIS);
-  molecule.add_molecule (left_head_streepjes);
+  int left_pos = (int)rint (left_position_f);
+  if (abs (left_pos) - interspaces > 1)
+    {
+      Molecule left_head_ledger_lines =
+       Note_head::brew_ledger_lines (me, left_pos, interspaces, extent, true);
+      left_head_ledger_lines.translate_axis (left_position_f * space/2,
+                                            Y_AXIS);
+      molecule.add_molecule (left_head_ledger_lines);
+    }
 
-  Molecule right_head_streepjes =
-    create_streepjes (me, (int)rint (right_position_f), interspaces, extent);
-  right_head_streepjes.translate_axis (right_position_f * space/2, Y_AXIS);
-  molecule.add_molecule (right_head_streepjes);
+  int right_pos = (int)rint (right_position_f);
+  if (abs (right_pos) - interspaces > 1)
+    {
+      Molecule right_head_ledger_lines =
+       Note_head::brew_ledger_lines (me, right_pos, interspaces, extent, true);
+      right_head_ledger_lines.translate_axis (right_position_f * space/2,
+                                             Y_AXIS);
+      molecule.add_molecule (right_head_ledger_lines);
+    }
 
   return molecule.smobbed_copy();
 }
@@ -496,4 +435,3 @@ Porrectus::brew_mensural_molecule (Item *me,
 ADD_INTERFACE (Porrectus,"porrectus-interface",
   "A porrectus ligature, joining two note heads into a single grob.",
   "left-head right-head width add-stem auto-properties solid direction");
-