X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finstrument-name-engraver.cc;h=26a6fdd04d80066c3d879b4880e8d0ff4772c0d7;hb=d59b3e4801e5832c86e9210724ac3d2ec4fef1be;hp=76e0a88e33dca6ca44535e889f230ed91aa0fe43;hpb=6eeb079ba4ed77997316262c842b215016dfe1e7;p=lilypond.git diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index 76e0a88e33..26a6fdd04d 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -1,13 +1,23 @@ /* - instrument-name-engraver.cc -- implement Instrument_name_engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2000--2010 Han-Wen Nienhuys - (c) 2000--2006 Han-Wen Nienhuys + 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 "engraver.hh" -#include "spanner.hh" #include "pointer-group-interface.hh" #include "side-position-interface.hh" #include "axis-group-interface.hh" @@ -28,15 +38,25 @@ protected: SCM long_text_; SCM short_text_; - vector axis_groups_; + vector axis_groups_; virtual void finalize (); DECLARE_ACKNOWLEDGER (axis_group); void process_music (); void start_spanner (); + void consider_start_spanner (); void stop_spanner (); + + virtual void derived_mark () const; }; +void +Instrument_name_engraver::derived_mark () const +{ + scm_gc_mark (long_text_); + scm_gc_mark (short_text_); +} + Instrument_name_engraver::Instrument_name_engraver () { text_spanner_ = 0; @@ -48,11 +68,11 @@ Instrument_name_engraver::Instrument_name_engraver () void Instrument_name_engraver::process_music () { - start_spanner (); + consider_start_spanner (); } void -Instrument_name_engraver::start_spanner () +Instrument_name_engraver::consider_start_spanner () { SCM long_text = get_property ("instrumentName"); SCM short_text = get_property ("shortInstrumentName"); @@ -63,7 +83,7 @@ Instrument_name_engraver::start_spanner () long_text = get_property ("vocalName"); short_text = get_property ("shortVocalName"); } - + if ((Text_interface::is_markup (long_text) || Text_interface::is_markup (short_text)) && (!text_spanner_ @@ -72,25 +92,45 @@ Instrument_name_engraver::start_spanner () { if (text_spanner_) stop_spanner (); - - text_spanner_ = make_spanner ("InstrumentName", SCM_EOL); - - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); - text_spanner_->set_bound (LEFT, col); - text_spanner_->set_property ("text", short_text); - text_spanner_->set_property ("long-text", long_text); short_text_ = short_text; long_text_ = long_text; + + start_spanner (); } } +void +Instrument_name_engraver::start_spanner () +{ + text_spanner_ = make_spanner ("InstrumentName", SCM_EOL); + + Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + text_spanner_->set_bound (LEFT, col); + text_spanner_->set_property ("text", short_text_); + text_spanner_->set_property ("long-text", long_text_); + + /* + UGH, should handle this in Score_engraver. + */ + Grob *system = unsmob_grob (get_property ("rootSystem")); + if (system) + Axis_group_interface::add_element (system, text_spanner_); + else + text_spanner_->programming_error ("cannot find root system"); +} + void Instrument_name_engraver::acknowledge_axis_group (Grob_info info) { - if (text_spanner_ - && dynamic_cast (info.grob ()) + if (dynamic_cast (info.grob ()) && Axis_group_interface::has_axis (info.grob (), Y_AXIS) + + /* ugh. */ + + && !info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface")) + && !info.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface")) + && !info.grob ()->internal_has_interface (ly_symbol2scm ("volta-interface")) && (!Align_interface::has_interface (info.grob ()))) { axis_groups_.push_back (info.grob ()); @@ -101,56 +141,44 @@ void Instrument_name_engraver::finalize () { if (text_spanner_) - { - stop_spanner (); - } + stop_spanner (); } void Instrument_name_engraver::stop_spanner () { for (vsize i = 0; i < axis_groups_.size (); i++) - Pointer_group_interface::add_grob (text_spanner_, ly_symbol2scm ("elements"), axis_groups_[i]); + Pointer_group_interface::add_grob (text_spanner_, + ly_symbol2scm ("elements"), + axis_groups_[i]); text_spanner_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); - Pointer_group_interface::set_ordered (text_spanner_, ly_symbol2scm ("elements"), false); - - System *system = get_root_system (text_spanner_); - - /* - UGH, should handle this in Score_engraver. - */ - if (system) - Axis_group_interface::add_element (system, text_spanner_); - else - text_spanner_->programming_error ("can't find root system"); + Pointer_group_interface::set_ordered (text_spanner_, + ly_symbol2scm ("elements"), + false); text_spanner_ = 0; } -#include "translator.icc" ADD_ACKNOWLEDGER (Instrument_name_engraver, axis_group); ADD_TRANSLATOR (Instrument_name_engraver, - /* doc */ - "Creates a system start text for instrument or vocal names.", + "Create a system start text for instrument or vocal names.", /* create */ "InstrumentName ", - /* accept */ - "", - /* read */ "currentCommandColumn " - "shortInstrumentName " "instrumentName " + "shortInstrumentName " "shortVocalName " - "vocalName " - , + "vocalName ", - /* write */ ""); + /* write */ + "" + );