/*
vaticana-ligature.cc -- implement Vaticana_ligature
-
+
source file of the GNU LilyPond music typesetter
-
- (c) 2003--2004 Juergen Reuter <reuter@ipd.uka.de>
+
+ (c) 2003--2007 Juergen Reuter <reuter@ipd.uka.de>
*/
-#include <math.h>
-#include "item.hh"
#include "vaticana-ligature.hh"
+
+#include "bezier.hh"
#include "font-interface.hh"
-#include "stencil.hh"
+#include "international.hh"
+#include "item.hh"
#include "lookup.hh"
-#include "staff-symbol-referencer.hh"
#include "note-head.hh"
#include "output-def.hh"
-#include "bezier.hh"
+#include "staff-symbol-referencer.hh"
#include "warn.hh"
Stencil
Real thickness,
Real blotdiameter)
{
- bool on_staffline = Staff_symbol_referencer::on_staffline (me, pos);
- int interspaces = Staff_symbol_referencer::line_count (me)-1;
+ bool on_staffline = Staff_symbol_referencer::on_line (me, pos);
+ int interspaces = Staff_symbol_referencer::line_count (me) - 1;
bool above_staff = pos > interspaces;
if (delta_pitch > -1)
Real interval;
SCM flexa_height_scm = me->get_property ("flexa-height");
if (flexa_height_scm != SCM_EOL)
- {
- interval = ly_scm2int (flexa_height_scm);
- }
+ interval = scm_to_int (flexa_height_scm);
else
{
me->warning ("Vaticana_ligature: "
- "flexa-height undefined; assuming 0");
+ + _ ("flexa-height undefined; assuming 0"));
interval = 0.0;
}
if (interval >= 0.0)
- {
- me->warning (_ ("ascending vaticana style flexa"));
- }
+ me->warning (_ ("ascending vaticana style flexa"));
- Real width = robust_scm2double ( me->get_property ("flexa-width"), 2);
+ Real width = robust_scm2double (me->get_property ("flexa-width"), 2);
/*
* Compensate curve thickness that appears to be smaller in steep
* section of bend.
*/
- Real left_height =
- right_height +
- min (0.12 * abs (interval), 0.3) * staff_space;
+ Real left_height
+ = right_height
+ + min (0.12 * abs (interval), 0.3) * staff_space;
/*
* Compensate optical illusion regarding vertical position of left
* and right endings due to curved shape.
*/
- Real ypos_correction = -0.1*staff_space * sign (interval);
- Real interval_correction = 0.2*staff_space * sign (interval);
- Real corrected_interval = interval*staff_space + interval_correction;
+ Real ypos_correction = -0.1 * staff_space * sign (interval);
+ Real interval_correction = 0.2 * staff_space * sign (interval);
+ Real corrected_interval = interval * staff_space + interval_correction;
/*
* middle curve of flexa shape
Bezier top_curve = curve, bottom_curve = curve;
for (int i = 0; i < 4; i++)
{
- Real curve_thickness = 0.33 * ((3 - i)*left_height + i*right_height);
+ Real curve_thickness = 0.33 * ((3 - i) * left_height + i * right_height);
top_curve.control_[i] += Offset (0, 0.5 * curve_thickness);
bottom_curve.control_[i] -= Offset (0, 0.5 * curve_thickness);
}
if (solid)
{
- Stencil solid_head =
- Lookup::bezier_sandwich (top_curve, bottom_curve);
+ Stencil solid_head
+ = Lookup::bezier_sandwich (top_curve, bottom_curve);
stencil.add_stencil (solid_head);
}
else // outline
{
Bezier inner_top_curve = top_curve;
inner_top_curve.translate (Offset (0.0, -line_thickness));
- Stencil top_edge =
- Lookup::bezier_sandwich (top_curve, inner_top_curve);
+ Stencil top_edge
+ = Lookup::bezier_sandwich (top_curve, inner_top_curve);
stencil.add_stencil (top_edge);
Bezier inner_bottom_curve = bottom_curve;
inner_bottom_curve.translate (Offset (0.0, +line_thickness));
- Stencil bottom_edge =
- Lookup::bezier_sandwich (bottom_curve, inner_bottom_curve);
+ Stencil bottom_edge
+ = Lookup::bezier_sandwich (bottom_curve, inner_bottom_curve);
stencil.add_stencil (bottom_edge);
/*
* the left end of the bezier curve.
*/
Box left_edge_box (Interval (0, line_thickness),
- Interval (-0.5*left_height, +0.5*left_height));
+ Interval (-0.5 * left_height, +0.5 * left_height));
Stencil left_edge = Lookup::filled_box (left_edge_box);
stencil.add_stencil (left_edge);
Box right_edge_box (Interval (-line_thickness, 0),
- Interval (-0.5*right_height, +0.5*right_height));
+ Interval (-0.5 * right_height, +0.5 * right_height));
Stencil right_edge = Lookup::filled_box (right_edge_box);
right_edge.translate_axis (width, X_AXIS);
right_edge.translate_axis (corrected_interval / 2.0, Y_AXIS);
{
me->programming_error (_f ("Vaticana_ligature: "
"zero join (delta_pitch == 0)"));
- return Stencil ();
+ return Lookup::blank (Box (Interval (0, 0), Interval (0, 0)));
}
Interval x_extent = Interval (0, join_thickness);
- Interval y_extent = (delta_pitch > 0) ?
- Interval (0, delta_pitch * 0.5 * staff_space) : // ascending join
+ Interval y_extent = (delta_pitch > 0)
+ ? Interval (0, delta_pitch * 0.5 * staff_space) : // ascending join
Interval (delta_pitch * 0.5 * staff_space, 0); // descending join
Box join_box (x_extent, y_extent);
return Lookup::round_filled_box (join_box, blotdiameter);
{
me->programming_error ("Vaticana_ligature: "
"undefined glyph-name -> ignoring grob");
- return Stencil ();
+ return Lookup::blank (Box (Interval (0, 0), Interval (0, 0)));
}
- String glyph_name = ly_scm2string (glyph_name_scm);
+ string glyph_name = ly_scm2string (glyph_name_scm);
Stencil out;
- int flexa_height = 0;
- Real thickness = robust_scm2double ( me->get_property ("thickness"), 1);
+ Real thickness = robust_scm2double (me->get_property ("thickness"), 1);
- Real line_thickness =
- thickness * me->get_paper ()->get_dimension (ly_symbol2scm ("linethickness"));
+ Real line_thickness
+ = thickness * me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
- Real blotdiameter =
- (me->get_paper ()->get_dimension (ly_symbol2scm ("blotdiameter")));
+ Real blotdiameter
+ = (me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")));
int pos = Staff_symbol_referencer::get_rounded_position (me);
- SCM delta_pitch_scm = me->get_property ("delta-pitch");
+ SCM delta_pitch_scm = me->get_property ("delta-position");
int delta_pitch;
if (delta_pitch_scm != SCM_EOL)
- delta_pitch = ly_scm2int (delta_pitch_scm);
+ delta_pitch = scm_to_int (delta_pitch_scm);
else
delta_pitch = 0;
- Real x_offset = robust_scm2double ( me->get_property ("x-offset"), 0);
+ Real x_offset = robust_scm2double (me->get_property ("x-offset"), 0);
bool add_stem = to_boolean (me->get_property ("add-stem"));
bool add_cauda = to_boolean (me->get_property ("add-cauda"));
bool add_join = to_boolean (me->get_property ("add-join"));
- if (!String::compare (glyph_name, ""))
+ if (glyph_name == "")
{
/*
* This is an empty head. This typically applies for the right
* flexa_width.)
*/
Real staff_space = Staff_symbol_referencer::staff_space (me);
- Real flexa_width = robust_scm2double ( me->get_property ("flexa-width"), 2) *staff_space;
- out =
- Lookup::blank (Box (Interval (0, 0.5*flexa_width), Interval (0,0)));
- }
- else if (!String::compare (glyph_name, "flexa"))
- {
- out = vaticana_brew_flexa (me, true, line_thickness);
+ Real flexa_width = robust_scm2double (me->get_property ("flexa-width"), 2) * staff_space;
+ out
+ = Lookup::blank (Box (Interval (0, 0.5 * flexa_width), Interval (0, 0)));
}
+ else if (glyph_name == "flexa")
+ out = vaticana_brew_flexa (me, true, line_thickness);
else
{
- out =
- Font_interface::get_default_font (me)->
- find_by_name ("noteheads-" + glyph_name);
+ out
+ = Font_interface::get_default_font (me)->
+ find_by_name ("noteheads.s" + glyph_name);
}
out.translate_axis (x_offset, X_AXIS);
Real head_width = out.extent (X_AXIS).length ();
if (add_cauda)
{
- Stencil cauda =
- vaticana_brew_cauda (me, pos, delta_pitch,
- line_thickness, blotdiameter);
+ Stencil cauda
+ = vaticana_brew_cauda (me, pos, delta_pitch,
+ line_thickness, blotdiameter);
out.add_stencil (cauda);
}
if (add_stem)
{
- Stencil stem =
- vaticana_brew_cauda (me, pos, -1,
- line_thickness, blotdiameter);
+ Stencil stem
+ = vaticana_brew_cauda (me, pos, -1,
+ line_thickness, blotdiameter);
stem.translate_axis (head_width - line_thickness, X_AXIS);
out.add_stencil (stem);
}
if (add_join)
{
- Stencil join =
- vaticana_brew_join (me, delta_pitch, line_thickness, blotdiameter);
+ Stencil join
+ = vaticana_brew_join (me, delta_pitch, line_thickness, blotdiameter);
join.translate_axis (head_width - line_thickness, X_AXIS);
out.add_stencil (join);
}
return SCM_EOL;
}
-ADD_INTERFACE (Vaticana_ligature, "vaticana-ligature-interface",
+ADD_INTERFACE (Vaticana_ligature,
"A vaticana style gregorian ligature",
- "glyph-name flexa-height flexa-width thickness add-cauda "
- "add-stem add-join delta-pitch x-offset "
- "ligature-primitive-callback");
+
+ /* properties */
+ "glyph-name "
+ "flexa-height "
+ "flexa-width "
+ "thickness "
+ "add-cauda "
+ "add-stem "
+ "add-join "
+ "delta-position "
+ "x-offset "
+ );