/*
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
}
}
-// 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)
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";
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 =
if (!stem_direction)
stem_direction = DOWN;
-
/*
TODO: revise name.
*/
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"));
}
}
- 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;
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;
}
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);
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();
}
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");
-