X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvaticana-ligature.cc;h=4995aad2f04ddd0b8920c57789f36516f66bf5fd;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=ba3626d90ffb605acb504b0c92df031d84e9c53f;hpb=05fabaaf86fd44f9bd903f282bb98d343a991e40;p=lilypond.git diff --git a/lily/vaticana-ligature.cc b/lily/vaticana-ligature.cc index ba3626d90f..4995aad2f0 100644 --- a/lily/vaticana-ligature.cc +++ b/lily/vaticana-ligature.cc @@ -1,32 +1,32 @@ /* vaticana-ligature.cc -- implement Vaticana_ligature - + source file of the GNU LilyPond music typesetter - - (c) 2003--2004 Juergen Reuter + + (c) 2003--2008 Juergen Reuter */ -#include -#include "item.hh" #include "vaticana-ligature.hh" + +#include "bezier.hh" #include "font-interface.hh" -#include "molecule.hh" +#include "international.hh" +#include "item.hh" #include "lookup.hh" -#include "staff-symbol-referencer.hh" #include "note-head.hh" -#include "paper-def.hh" -#include "bezier.hh" +#include "output-def.hh" +#include "staff-symbol-referencer.hh" #include "warn.hh" -Molecule +Stencil vaticana_brew_cauda (Grob *me, 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 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) @@ -65,50 +65,46 @@ vaticana_brew_cauda (Grob *me, /* * TODO: move this function to class Lookup? */ -Molecule +Stencil vaticana_brew_flexa (Grob *me, bool solid, Real line_thickness) { Real staff_space = Staff_symbol_referencer::staff_space (me); - Molecule molecule = Molecule (); + Stencil stencil; Real right_height = 0.6 * staff_space; Real interval; - SCM flexa_height_scm = me->get_grob_property ("flexa-height"); + SCM flexa_height_scm = me->get_property ("flexa-height"); if (flexa_height_scm != SCM_EOL) - { - interval = gh_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_grob_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 @@ -122,30 +118,30 @@ vaticana_brew_flexa (Grob *me, 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) { - Molecule solid_head = - Lookup::bezier_sandwich (top_curve, bottom_curve); - molecule.add_molecule (solid_head); + 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)); - Molecule top_edge = - Lookup::bezier_sandwich (top_curve, inner_top_curve); - molecule.add_molecule(top_edge); + 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)); - Molecule bottom_edge = - Lookup::bezier_sandwich (bottom_curve, inner_bottom_curve); - molecule.add_molecule(bottom_edge); + Stencil bottom_edge + = Lookup::bezier_sandwich (bottom_curve, inner_bottom_curve); + stencil.add_stencil (bottom_edge); /* * TODO: Use horizontal slope with proper slope value rather @@ -156,101 +152,78 @@ vaticana_brew_flexa (Grob *me, * the left end of the bezier curve. */ Box left_edge_box (Interval (0, line_thickness), - Interval (-0.5*left_height, +0.5*left_height)); - Molecule left_edge = Lookup::filled_box (left_edge_box); - molecule.add_molecule(left_edge); + 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)); - Molecule right_edge = Lookup::filled_box (right_edge_box); + 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); - molecule.add_molecule(right_edge); + stencil.add_stencil (right_edge); } - molecule.translate_axis (ypos_correction, Y_AXIS); - return molecule; + stencil.translate_axis (ypos_correction, Y_AXIS); + return stencil; } -Molecule +Stencil vaticana_brew_join (Grob *me, int delta_pitch, 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 Molecule (); + 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 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); } -void -vaticana_add_ledger_lines (Grob *me, Molecule *out, int pos, Real offs, - bool ledger_take_space) -{ - int interspaces = Staff_symbol_referencer::line_count (me)-1; - if (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 l_extents = Interval (hd[LEFT] - left_ledger_protusion, - hd[RIGHT] + right_ledger_protusion); - Molecule ledger_lines = - Note_head::brew_ledger_lines (me, pos, interspaces, - l_extents, 0, - ledger_take_space); - ledger_lines.translate_axis (offs, Y_AXIS); - out->add_molecule (ledger_lines); - } -} - -Molecule -vaticana_brew_primitive (Grob *me, bool ledger_take_space) +Stencil +vaticana_brew_primitive (Grob *me) { - SCM glyph_name_scm = me->get_grob_property ("glyph-name"); + SCM glyph_name_scm = me->get_property ("glyph-name"); if (glyph_name_scm == SCM_EOL) { me->programming_error ("Vaticana_ligature: " "undefined glyph-name -> ignoring grob"); - return Molecule (); + 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); - Molecule out; - int flexa_height = 0; - Real thickness = robust_scm2double ( me->get_grob_property ("thickness"), 1); + Stencil out; + Real thickness = robust_scm2double (me->get_property ("thickness"), 1); - Real line_thickness = - thickness * me->get_paper ()->get_realvar (ly_symbol2scm ("linethickness")); + Real line_thickness + = thickness * me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); - Real blotdiameter = - (me->get_paper ()->get_realvar (ly_symbol2scm ("blotdiameter"))); + Real blotdiameter + = (me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"))); - int pos = (int)rint (Staff_symbol_referencer::get_position (me)); + int pos = Staff_symbol_referencer::get_rounded_position (me); - SCM delta_pitch_scm = me->get_grob_property ("delta-pitch"); + SCM delta_pitch_scm = me->get_property ("delta-position"); int delta_pitch; if (delta_pitch_scm != SCM_EOL) - delta_pitch = gh_scm2int (delta_pitch_scm); + delta_pitch = scm_to_int (delta_pitch_scm); else delta_pitch = 0; - Real x_offset = robust_scm2double ( me->get_grob_property ("x-offset"), 0); + Real x_offset = robust_scm2double (me->get_property ("x-offset"), 0); - bool add_stem = to_boolean (me->get_grob_property ("add-stem")); - bool add_cauda = to_boolean (me->get_grob_property ("add-cauda")); - bool add_join = to_boolean (me->get_grob_property ("add-join")); + 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 @@ -260,54 +233,44 @@ vaticana_brew_primitive (Grob *me, bool ledger_take_space) * flexa_width.) */ Real staff_space = Staff_symbol_referencer::staff_space (me); - Real flexa_width = robust_scm2double ( me->get_grob_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) { - Molecule cauda = - vaticana_brew_cauda (me, pos, delta_pitch, - line_thickness, blotdiameter); - out.add_molecule (cauda); + Stencil cauda + = vaticana_brew_cauda (me, pos, delta_pitch, + line_thickness, blotdiameter); + out.add_stencil (cauda); } if (add_stem) { - Molecule 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_molecule (stem); + out.add_stencil (stem); } if (add_join) { - Molecule 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_molecule (join); - } - - vaticana_add_ledger_lines(me, &out, pos, 0, ledger_take_space); - if (!String::compare (glyph_name, "flexa")) - { - pos += flexa_height; - vaticana_add_ledger_lines(me, &out, pos, 0.5*flexa_height, - ledger_take_space); + out.add_stencil (join); } return out; @@ -318,7 +281,7 @@ SCM Vaticana_ligature::brew_ligature_primitive (SCM smob) { Grob *me = unsmob_grob (smob); - SCM primitive = vaticana_brew_primitive (me, false).smobbed_copy (); + SCM primitive = vaticana_brew_primitive (me).smobbed_copy (); return primitive; } @@ -329,8 +292,17 @@ Vaticana_ligature::print (SCM) 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 " + );