X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvaticana-ligature.cc;h=d8ac36b9a30c2c8f55b14bbcf8d6e5217a6378e2;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=2368aa36fcb36e213c2db20e96a39e67c76f4166;hpb=50a19de991aac1e93d1ff2cda6b30929661e036d;p=lilypond.git diff --git a/lily/vaticana-ligature.cc b/lily/vaticana-ligature.cc index 2368aa36fc..d8ac36b9a3 100644 --- a/lily/vaticana-ligature.cc +++ b/lily/vaticana-ligature.cc @@ -1,33 +1,43 @@ /* - vaticana-ligature.cc -- implement Vaticana_ligature - - source file of the GNU LilyPond music typesetter - - (c) 2003 Juergen Reuter + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2003--2014 Juergen Reuter + + 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 . */ -#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) + 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) { @@ -38,25 +48,25 @@ vaticana_brew_cauda (Grob *me, 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); @@ -65,50 +75,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) + 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 +128,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, 0.0); + 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, 0.0); + 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, 0.0); + stencil.add_stencil (bottom_edge); /* * TODO: Use horizontal slope with proper slope value rather @@ -156,101 +162,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 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 (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); } -void -vaticana_add_ledger_lines (Grob *me, Molecule *out, int pos, Real offs, - bool ledger_take_space) +Stencil +vaticana_brew_primitive (Grob *me) { - 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, - 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) -{ - 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 (); + "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); - 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 +243,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); - 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,19 +291,28 @@ 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; } -MAKE_SCHEME_CALLBACK (Vaticana_ligature, brew_molecule, 1); +MAKE_SCHEME_CALLBACK (Vaticana_ligature, print, 1); SCM -Vaticana_ligature::brew_molecule (SCM) +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 " + );