X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbar-number-engraver.cc;h=44f155df6e24298ca81a6f20c45b8b63904abd74;hb=6a97c502db3e52c8c2209ab43bececb03febc8a2;hp=83ff7fed5148f8a39034973a031266b7552d8b25;hpb=8d8982cc88ba1d0b20df5aff22b9555f76976a26;p=lilypond.git diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index 83ff7fed51..44f155df6e 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2015 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 @@ -45,14 +45,13 @@ protected: protected: void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (alternative); - DECLARE_ACKNOWLEDGER (break_alignment); + void listen_alternative (Stream_event *); + void acknowledge_break_alignment (Grob_info); void process_music (); void create_items (); TRANSLATOR_DECLARATIONS (Bar_number_engraver); }; -IMPLEMENT_TRANSLATOR_LISTENER (Bar_number_engraver, alternative); void Bar_number_engraver::listen_alternative (Stream_event *ev) { @@ -62,8 +61,10 @@ Bar_number_engraver::listen_alternative (Stream_event *ev) alternative_event_ = ev; int current_barnumber = robust_scm2int (get_property ("currentBarNumber"), 0); Direction alternative_dir = robust_scm2dir (ev->get_property ("alternative-dir"), CENTER); - bool make_alternative = get_property ("alternativeNumberingStyle") == ly_symbol2scm ("numbers") - || get_property ("alternativeNumberingStyle") == ly_symbol2scm ("numbers-with-letters"); + bool make_alternative = scm_is_eq (get_property ("alternativeNumberingStyle"), + ly_symbol2scm ("numbers")) + || scm_is_eq (get_property ("alternativeNumberingStyle"), + ly_symbol2scm ("numbers-with-letters")); if (make_alternative) { /* @@ -84,16 +85,6 @@ Bar_number_engraver::listen_alternative (Stream_event *ev) } } -int -int_pow (int n, int i) -{ - if (i == 1) - return n; - if (i <= 0) - return 1; - return int_pow (n * n, i - 1); -} - void Bar_number_engraver::process_music () { @@ -102,65 +93,50 @@ Bar_number_engraver::process_music () if (scm_is_string (wb)) { Moment mp (robust_scm2moment (get_property ("measurePosition"), Moment (0))); - if (mp.main_part_ == Rational (0)) + SCM bn = get_property ("currentBarNumber"); + SCM proc = get_property ("barNumberVisibility"); + if (scm_is_number (bn) && ly_is_procedure (proc) + && to_boolean (scm_call_2 (proc, bn, mp.smobbed_copy ()))) { - SCM bn = get_property ("currentBarNumber"); - SCM proc = get_property ("barNumberVisibility"); - if (scm_is_number (bn) && ly_is_procedure (proc) - && to_boolean (scm_call_1 (proc, bn))) + create_items (); + SCM alternative_style = get_property ("alternativeNumberingStyle"); + string text_tag = ""; + if (scm_is_eq (alternative_style, ly_symbol2scm ("numbers-with-letters"))) { - create_items (); - SCM alternative_style = get_property ("alternativeNumberingStyle"); - string text_tag = ""; - if (alternative_style == ly_symbol2scm ("numbers-with-letters")) + if (alternative_event_) { - if (alternative_event_) - { - Direction alternative_dir = robust_scm2dir (alternative_event_->get_property ("alternative-dir"), RIGHT); - switch (alternative_dir) - { - case LEFT: - alternative_number_ = 0; - break; - case CENTER: - break; - case RIGHT: - alternative_number_ = INT_MIN; - break; - default: - assert (false); - } - alternative_number_ += alternative_number_increment_; - - alternative_number_increment_ = robust_scm2int (alternative_event_->get_property ("alternative-increment"), 1); - } - if (alternative_number_ >= 0) + Direction alternative_dir = robust_scm2dir (alternative_event_->get_property ("alternative-dir"), RIGHT); + switch (alternative_dir) { - string alphabet = "abcdefghijklmnopqrstuvwxyz"; - int power = 0; - int running_sum = 0; - int scratch = alternative_number_; - while (running_sum <= alternative_number_) - { - power++; - running_sum += int_pow (26, power); - } - scratch += int_pow (26, power) - running_sum; - for (int i = power; i--;) - text_tag += alphabet.at ((scratch / int_pow (26, i)) % 26); + case LEFT: + alternative_number_ = 0; + break; + case CENTER: + break; + case RIGHT: + alternative_number_ = INT_MIN; + break; + default: + assert (false); } + alternative_number_ += alternative_number_increment_; + + alternative_number_increment_ = robust_scm2int (alternative_event_->get_property ("alternative-increment"), 1); } - // guh. - text_->set_property - ("text", - scm_string_concatenate (scm_list_2 (scm_number_to_string (bn, scm_from_int (10)), - ly_string2scm (text_tag)))); } + SCM formatter = get_property ("barNumberFormatter"); + if (ly_is_procedure (formatter)) + text_->set_property ("text", scm_call_4 (formatter, + bn, + mp.smobbed_copy (), + scm_from_int (alternative_number_), + context ()->self_scm ())); } } } -Bar_number_engraver::Bar_number_engraver () +Bar_number_engraver::Bar_number_engraver (Context *c) + : Engraver (c) { text_ = 0; alternative_starting_bar_number_ = 0; @@ -201,7 +177,13 @@ Bar_number_engraver::create_items () text_ = make_item ("BarNumber", SCM_EOL); } -ADD_ACKNOWLEDGER (Bar_number_engraver, break_alignment); + +void +Bar_number_engraver::boot () +{ + ADD_LISTENER (Bar_number_engraver, alternative); + ADD_ACKNOWLEDGER (Bar_number_engraver, break_alignment); +} ADD_TRANSLATOR (Bar_number_engraver, /* doc */ @@ -219,6 +201,7 @@ ADD_TRANSLATOR (Bar_number_engraver, "currentBarNumber " "whichBar " "stavesFound " + "barNumberFormatter " "barNumberVisibility " "alternativeNumberingStyle ",