/*
- vaticana-ligature.cc -- implement Vaticana_ligature
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2003--2004 Juergen Reuter <reuter@ipd.uka.de>
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 2003--2015 Juergen Reuter <reuter@ipd.uka.de>
+
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vaticana-ligature.hh"
-#include <math.h>
-
-#include "item.hh"
+#include "bezier.hh"
#include "font-interface.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
vaticana_brew_cauda (Grob *me,
- int pos,
- int delta_pitch,
- Real thickness,
- Real blotdiameter)
+ int pos,
+ int delta_pitch,
+ Real thickness,
+ Real blotdiameter)
{
- bool on_staffline = Staff_symbol_referencer::on_staffline (me, pos);
- int interspaces = Staff_symbol_referencer::line_count (me)-1;
- bool above_staff = pos > interspaces;
+ bool on_staffline = Staff_symbol_referencer::on_line (me, pos);
+ bool above_staff = pos > Staff_symbol_referencer::staff_span (me)[UP];
if (delta_pitch > -1)
{
if (on_staffline)
{
if (delta_pitch >= -1)
- length = 1.30;
+ length = 1.30;
else if (delta_pitch >= -2)
- length = 1.35;
+ length = 1.35;
else
- length = 1.85;
+ length = 1.85;
}
else
{
if (delta_pitch >= -1)
- if (above_staff)
- length = 1.30;
- else
- length = 1.00;
+ if (above_staff)
+ length = 1.30;
+ else
+ length = 1.00;
else if (delta_pitch >= -2)
- length = 1.35;
+ length = 1.35;
else if (delta_pitch >= -3)
- length = 1.50;
+ length = 1.50;
else
- length = 1.85;
+ length = 1.85;
}
Box cauda_box (Interval (0, thickness), Interval (-length, 0));
return Lookup::round_filled_box (cauda_box, blotdiameter);
*/
Stencil
vaticana_brew_flexa (Grob *me,
- bool solid,
- Real line_thickness)
+ bool solid,
+ Real line_thickness)
{
Real staff_space = Staff_symbol_referencer::staff_space (me);
Stencil stencil;
Real interval;
SCM flexa_height_scm = me->get_property ("flexa-height");
if (flexa_height_scm != SCM_EOL)
- {
- interval = scm_to_int (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, 0.0);
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, 0.0);
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, 0.0);
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);
Stencil
vaticana_brew_join (Grob *me, int delta_pitch,
- Real join_thickness, Real blotdiameter)
+ Real join_thickness, Real blotdiameter)
{
Real staff_space = Staff_symbol_referencer::staff_space (me);
if (!delta_pitch)
{
- me->programming_error (_f ("Vaticana_ligature: "
- "zero join (delta_pitch == 0)"));
- return Stencil ();
+ me->programming_error ("Vaticana_ligature: "
+ "zero join (delta_pitch == 0)");
+ 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 (delta_pitch * 0.5 * staff_space, 0); // descending 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);
}
if (glyph_name_scm == SCM_EOL)
{
me->programming_error ("Vaticana_ligature: "
- "undefined glyph-name -> ignoring grob");
- return Stencil ();
+ "undefined glyph-name -> ignoring grob");
+ 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;
- Real thickness = robust_scm2double ( me->get_property ("thickness"), 1);
+ Real thickness = robust_scm2double (me->get_property ("thickness"), 1);
- Real line_thickness =
- thickness * me->get_layout ()->get_dimension (ly_symbol2scm ("linethickness"));
+ Real line_thickness
+ = thickness * me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
- Real blotdiameter =
- (me->get_layout ()->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 = 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);
}
SCM
Vaticana_ligature::brew_ligature_primitive (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
SCM primitive = vaticana_brew_primitive (me).smobbed_copy ();
return primitive;
}
return SCM_EOL;
}
-ADD_INTERFACE (Vaticana_ligature, "vaticana-ligature-interface",
- "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");
+ADD_INTERFACE (Vaticana_ligature,
+ "A vaticana style Gregorian ligature.",
+
+ /* properties */
+ "glyph-name "
+ "flexa-height "
+ "flexa-width "
+ "thickness "
+ "add-cauda "
+ "add-stem "
+ "add-join "
+ "delta-position "
+ "x-offset "
+ );