From 93902c8eee0e1172fa3c9816dee4935674b2f8a8 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Fri, 22 Jul 2005 22:52:25 +0000 Subject: [PATCH] * scm/define-context-properties.scm (all-internal-translation-properties): remove acceptHashTable, acknowledgeHashTable * lily/translator-group.cc (mark_smob): idem for acceptHashTable. * lily/engraver-group-engraver.cc (Engraver_group_engraver): change acknowledgeHashTable to C++ member. * lily/rest-collision.cc (do_shift): use extract_grob_set(). --- ChangeLog | 25 +++++++++-- VERSION | 2 +- lily/engraver-group-engraver.cc | 21 +++++---- lily/include/engraver-group-engraver.hh | 5 +-- lily/include/translator-group.hh | 1 + lily/include/translator.hh | 19 +++++++-- lily/include/translator.icc | 20 +++++++++ lily/rest-collision.cc | 6 +-- lily/translator-group.cc | 13 +++--- lily/translator.cc | 57 ++++++++++++++++--------- lily/type-swallow-translator.cc | 4 +- scm/define-context-properties.scm | 6 --- scm/page-layout.scm | 9 +++- 13 files changed, 127 insertions(+), 61 deletions(-) diff --git a/ChangeLog b/ChangeLog index c13e26b40e..0598877d6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-07-23 Han-Wen Nienhuys + + * scm/define-context-properties.scm + (all-internal-translation-properties): remove acceptHashTable, + acknowledgeHashTable + + * lily/translator-group.cc (mark_smob): idem for acceptHashTable. + + * lily/engraver-group-engraver.cc (Engraver_group_engraver): + change acknowledgeHashTable to C++ member. + + * lily/rest-collision.cc (do_shift): use extract_grob_set(). + 2005-07-22 Nicolas Sceaux * scm/display-lily.scm: new file. Define a `display-lily-music' @@ -40,7 +53,8 @@ * Documentation/topdocs/NEWS.tely (Top): mention barNumberCheck - * Documentation/user/basic-notation.itely (Barnumber check): add section. + * Documentation/user/basic-notation.itely (Barnumber check): add + section. * scm/music-functions.scm (skip-to-last): new function. Show only last showLastLength part of the \score. @@ -76,15 +90,18 @@ * Documentation/user/instrument-notation.itely (Musica ficta accidentals): add section Musica ficta accidentals - * lily/accidental-engraver.cc (make_suggested_accidental): new function. + * lily/accidental-engraver.cc (make_suggested_accidental): new + function. (make_standard_accidental): move into new function. (create_accidental): new function. - * scm/define-grobs.scm (all-grob-descriptions): new Grob AccidentalSuggestion + * scm/define-grobs.scm (all-grob-descriptions): new Grob + AccidentalSuggestion * lily/output-def-scheme.cc (LY_DEFINE): take default argument. - * lily/output-def.cc (lookup_variable): return SCM_UNDEFINED if undefined. + * lily/output-def.cc (lookup_variable): return SCM_UNDEFINED if + undefined. * Documentation/user/global.itely (Page formatting): document horizontalshift. diff --git a/VERSION b/VERSION index d07bd920b4..02ad8f735d 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=2 MINOR_VERSION=7 -PATCH_LEVEL=2 +PATCH_LEVEL=3 MY_PATCH_LEVEL= diff --git a/lily/engraver-group-engraver.cc b/lily/engraver-group-engraver.cc index ae3000aebf..6584aefed5 100644 --- a/lily/engraver-group-engraver.cc +++ b/lily/engraver-group-engraver.cc @@ -36,7 +36,6 @@ Engraver_group_engraver::acknowledge_grobs () if (!announce_infos_.size ()) return; - SCM tab = context_->get_property ("acknowledgeHashTable"); SCM name_sym = ly_symbol2scm ("name"); SCM meta_sym = ly_symbol2scm ("meta"); @@ -62,11 +61,11 @@ Engraver_group_engraver::acknowledge_grobs () continue; } - SCM acklist = scm_hashq_ref (tab, nm, SCM_UNDEFINED); + SCM acklist = scm_hashq_ref (acknowledge_hash_table_, nm, SCM_UNDEFINED); if (acklist == SCM_BOOL_F) { acklist = find_acknowledge_engravers (get_simple_trans_list (), meta); - scm_hashq_set_x (tab, nm, acklist); + scm_hashq_set_x (acknowledge_hash_table_, nm, acklist); } for (SCM p = acklist; scm_is_pair (p); p = scm_cdr (p)) @@ -128,17 +127,11 @@ Engraver_group_engraver::do_announces () while (pending_grob_count () > 0); } -void -Engraver_group_engraver::initialize () -{ - SCM tab = scm_make_vector (scm_int2num (61), SCM_BOOL_F); - context ()->set_property ("acknowledgeHashTable", tab); - - Translator_group::initialize (); -} Engraver_group_engraver::Engraver_group_engraver () { + acknowledge_hash_table_ = SCM_EOL; + acknowledge_hash_table_ = scm_c_make_hash_table (61); } #include "translator.icc" @@ -179,3 +172,9 @@ find_acknowledge_engravers (SCM gravlist, SCM meta_alist) return l; } + +void +Engraver_group_engraver::derived_mark () const +{ + scm_gc_mark (acknowledge_hash_table_); +} diff --git a/lily/include/engraver-group-engraver.hh b/lily/include/engraver-group-engraver.hh index e235b96731..c34de1c452 100644 --- a/lily/include/engraver-group-engraver.hh +++ b/lily/include/engraver-group-engraver.hh @@ -17,12 +17,11 @@ class Engraver_group_engraver : public virtual Translator_group { protected: Array announce_infos_; - + SCM acknowledge_hash_table_; public: VIRTUAL_COPY_CONSTRUCTOR ( Translator_group, Engraver_group_engraver); Engraver_group_engraver (); - - virtual void initialize (); + virtual void derived_mark () const; PRECOMPUTED_VIRTUAL void do_announces (); virtual void announce_grob (Grob_info); int pending_grob_count () const; diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh index 5f8a93ab3e..d5330dbeb8 100644 --- a/lily/include/translator-group.hh +++ b/lily/include/translator-group.hh @@ -72,6 +72,7 @@ public: Context * context () const { return context_; } protected: SCM simple_trans_list_; + SCM accept_hash_table_; Context *context_; friend class Context_def; diff --git a/lily/include/translator.hh b/lily/include/translator.hh index af21e10ab9..d938f52aa8 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -20,15 +20,27 @@ typedef void (*Translator_void_method_ptr)(Translator*); + +struct Acknowledge_information +{ + SCM symbol_; + Translator_void_method_ptr function_; +}; + + #define TRANSLATOR_DECLARATIONS(NAME) \ public: \ NAME (); \ VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ static SCM static_description_; \ + static Array acknowledge_static_array_; \ virtual void fetch_precomputable_methods (Translator_void_method_ptr methods[]);\ virtual SCM static_translator_description () const; \ - virtual SCM translator_description () const; - + virtual SCM translator_description () const; \ + virtual Translator_void_method_ptr get_acknowledger (SCM sym) { \ + return static_get_acknowledger (sym);\ + }\ + static Translator_void_method_ptr static_get_acknowledger (SCM sym); enum Translator_precompute_index { START_TRANSLATION_TIMESTEP, @@ -48,7 +60,7 @@ enum Translator_precompute_index { class Translator { void init (); - + protected: bool must_be_last_; @@ -73,7 +85,6 @@ public: PRECOMPUTED_VIRTUAL void start_translation_timestep (); PRECOMPUTED_VIRTUAL void process_music (); PRECOMPUTED_VIRTUAL void process_acknowledged (); - Score_context *get_score_context () const; Global_context *get_global_context () const; diff --git a/lily/include/translator.icc b/lily/include/translator.icc index ce57a3c4d6..b90b1fd753 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -10,6 +10,8 @@ #ifndef TRANSLATOR_ICC #define TRANSLATOR_ICC +#include "array.hh" + /** A macro to automate administration of translators. */ @@ -29,8 +31,14 @@ ADD_GLOBAL_CTOR (_ ## T ## _adder); #define ADD_TRANSLATOR(classname, desc, grobs, accepted, acked, read, write) \ + Array classname::acknowledge_static_array_;\ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(classname); \ ADD_THIS_TRANSLATOR (classname); \ + Translator_void_method_ptr\ + classname::static_get_acknowledger (SCM sym) \ + {\ + return generic_get_acknowledger (sym, &acknowledge_static_array_);\ + }\ SCM \ classname::static_translator_description () const \ { \ @@ -84,6 +92,18 @@ T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[])\ : (Translator_void_method_ptr) &T::process_acknowledged; \ } +void add_acknowledger (Translator_void_method_ptr ptr, const char *func_name, Array *ack_array); +Translator_void_method_ptr +generic_get_acknowledger (SCM sym, Array const *ack_array); + +#define ADD_ACKNOWLEDGER(CLASS,NAME) \ +void CLASS ## NAME ## _ack_adder () \ +{\ + add_acknowledger ((Translator_void_method_ptr) &CLASS::NAME, #NAME, &CLASS::acknowledge_static_array_);\ +}\ +ADD_SCM_INIT_FUNC(CLASS ## NAME ## _ack_adder);\ + + #endif /* TRANSLATOR_ICC */ diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 09aadd7a8e..78f55a46f8 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -86,14 +86,14 @@ Rest_collision::add_column (Grob *me, Grob *p) SCM Rest_collision::do_shift (Grob *me) { - SCM elts = me->get_object ("elements"); + extract_grob_set (me, "elements", elts); Link_array rests; Link_array notes; - for (SCM s = elts; scm_is_pair (s); s = scm_cdr (s)) + for (int i = 0; i < elts.size (); i++) { - Grob *e = unsmob_grob (scm_car (s)); + Grob *e = elts[i]; if (unsmob_grob (e->get_object ("rest"))) { /* diff --git a/lily/translator-group.cc b/lily/translator-group.cc index c05c6226f9..304cf9dea8 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -34,9 +34,6 @@ void Translator_group::initialize () { precompute_method_bindings (); - - SCM tab = scm_make_vector (scm_int2num (19), SCM_BOOL_F); - context ()->set_property ("acceptHashTable", tab); } void @@ -74,7 +71,6 @@ find_accept_translators (SCM gravlist, SCM ifaces) bool Translator_group::try_music (Music *m) { - SCM tab = context ()->get_property ("acceptHashTable"); SCM name = scm_sloppy_assq (ly_symbol2scm ("name"), m->get_property_alist (false)); @@ -82,12 +78,12 @@ Translator_group::try_music (Music *m) return false; name = scm_cdr (name); - SCM accept_list = scm_hashq_ref (tab, name, SCM_UNDEFINED); + SCM accept_list = scm_hashq_ref (accept_hash_table_, name, SCM_UNDEFINED); if (accept_list == SCM_BOOL_F) { accept_list = find_accept_translators (get_simple_trans_list (), m->get_property ("types")); - scm_hashq_set_x (tab, name, accept_list); + scm_hashq_set_x (accept_hash_table_, name, accept_list); } for (SCM p = accept_list; scm_is_pair (p); p = scm_cdr (p)) @@ -162,8 +158,11 @@ recurse_over_translators (Context *c, Translator_method ptr, Translator_group_me Translator_group::Translator_group () { simple_trans_list_ = SCM_EOL; + accept_hash_table_ = SCM_EOL; context_ = 0; smobify_self (); + + accept_hash_table_ = scm_c_make_hash_table (19); } void @@ -248,7 +247,7 @@ Translator_group::mark_smob (SCM smob) Translator_group *me = (Translator_group*)SCM_CELL_WORD_1 (smob); me->derived_mark (); - + scm_gc_mark (me->accept_hash_table_); return me->simple_trans_list_; } diff --git a/lily/translator.cc b/lily/translator.cc index e67ffcda22..d7c5fdf29c 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -120,12 +120,6 @@ Translator::mark_smob (SCM sm) return SCM_EOL; } -SCM -Translator::translator_description () const -{ - return SCM_EOL; -} - Global_context * Translator::get_global_context () const { @@ -138,12 +132,6 @@ Translator::get_score_context () const return daddy_context_->get_score_context (); } -SCM -Translator::static_translator_description ()const -{ - return SCM_EOL; -} - IMPLEMENT_SMOBS (Translator); IMPLEMENT_DEFAULT_EQUAL_P (Translator); IMPLEMENT_TYPE_P (Translator, "ly:translator?"); @@ -159,13 +147,6 @@ Translator::derived_mark () const { } -void -Translator::fetch_precomputable_methods (Translator_void_method_ptr ptrs[]) -{ - for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) - ptrs[i] = 0; -} - int Translator::print_smob (SCM s, SCM port, scm_print_state *) { @@ -176,3 +157,41 @@ Translator::print_smob (SCM s, SCM port, scm_print_state *) return 1; } +void +add_acknowledger (Translator_void_method_ptr ptr, + const char *func_name, + Array *ack_array) +{ + Acknowledge_information inf; + inf.function_ = ptr; + + String interface_name(func_name); + + interface_name = interface_name.substitute ("acknowledge_", ""); + interface_name = interface_name.substitute ('_', '-'); + interface_name += "-interface"; + + inf.symbol_ = scm_gc_protect_object (ly_symbol2scm (interface_name.to_str0 ())); + ack_array->push (inf); +} + +Translator_void_method_ptr +generic_get_acknowledger (SCM sym, Array const *ack_array) +{ + for (int i = 0; i < ack_array->size(); i++) + { + if (ack_array->elem (i).symbol_ == sym) + { + return ack_array->elem(i).function_; + } + } + return 0; +} + +ADD_TRANSLATOR(Translator, + "Base class. Unused", + "", + "", + "", + "", + ""); diff --git a/lily/type-swallow-translator.cc b/lily/type-swallow-translator.cc index 2c29240727..11f79a70cb 100644 --- a/lily/type-swallow-translator.cc +++ b/lily/type-swallow-translator.cc @@ -29,7 +29,9 @@ public: TRANSLATOR_DECLARATIONS (Rest_swallow_translator); }; -Skip_event_swallow_translator::Skip_event_swallow_translator (){} +Skip_event_swallow_translator::Skip_event_swallow_translator () +{ +} ADD_TRANSLATOR (Skip_event_swallow_translator, "Swallow \\skip.", diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index d01608205f..5a68721d4e 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -484,12 +484,6 @@ the grobs which are still busy (e.g. note heads, spanners, etc.) ") (barCheckLastFail ,ly:moment? "Where in the measure did the last barcheck fail?") (associatedVoiceContext ,ly:context? "The context object of the Voice that has the melody for this Lyrics.") - (acceptHashTable ,vector? "Internal -variable: store table with MusicName to Engraver entries.") - (acknowledgeHashTable ,vector? - "Internal variable: store interface to engraver smob table for current -context.") - (beamMelismaBusy ,boolean? "Signal if a beam is present.") (dynamicAbsoluteVolumeFunction ,procedure? "[DOCUMENT-ME]") diff --git a/scm/page-layout.scm b/scm/page-layout.scm index 5b3f01a566..98044b870d 100644 --- a/scm/page-layout.scm +++ b/scm/page-layout.scm @@ -194,6 +194,7 @@ of lines. " (define MAXPENALTY 1e9) (define paper (ly:paper-book-paper paper-book)) (define scopes (ly:paper-book-scopes paper-book)) + (define force-equalization-factor #f) (define (page-height page-number last?) (let ((p (ly:output-def-lookup paper 'page-music-height))) @@ -218,14 +219,14 @@ is what have collected so far, and has ascending page numbers." 0.0 (node-penalty (car best-paths)))) (inter-system-space (ly:output-def-lookup paper 'betweensystemspace)) - (force-equalization-factor 0.3) (relative-force (/ force inter-system-space)) (abs-relative-force (abs relative-force))) (+ (* abs-relative-force (+ abs-relative-force 1)) prev-penalty - (* force-equalization-factor (/ (abs (- prev-force force)) inter-system-space)) + (* force-equalization-factor (/ (abs (- prev-force force)) + inter-system-space)) user))) (define (space-systems page-height lines ragged?) @@ -335,6 +336,7 @@ corresponding to DONE-LINES. CURRENT-BEST is the best result sofar, or #f." + (let* ((this-page-num (if (null? best-paths) (ly:output-def-lookup paper 'firstpagenumber) (1+ (node-page-number (car best-paths))))) @@ -382,6 +384,7 @@ CURRENT-BEST is the best result sofar, or #f." #:penalty total-penalty) current-best))) +;; (display total-penalty) (newline) (if #f ;; debug (display (list @@ -428,6 +431,8 @@ DONE." (ly:paper-system-number (car (node-lines node)))) (ly:message (_ "Calculating page breaks...")) + (set! force-equalization-factor + (ly:output-def-lookup paper 'verticalequalizationfactor 0.3)) (let* ((best-break-node (walk-lines '() '() lines)) (break-nodes (get-path best-break-node '())) -- 2.39.2