+2005-07-23 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * 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 <nicolas.sceaux@free.fr>
* scm/display-lily.scm: new file. Define a `display-lily-music'
* 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.
* 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.
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=7
-PATCH_LEVEL=2
+PATCH_LEVEL=3
MY_PATCH_LEVEL=
if (!announce_infos_.size ())
return;
- SCM tab = context_->get_property ("acknowledgeHashTable");
SCM name_sym = ly_symbol2scm ("name");
SCM meta_sym = ly_symbol2scm ("meta");
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))
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"
return l;
}
+
+void
+Engraver_group_engraver::derived_mark () const
+{
+ scm_gc_mark (acknowledge_hash_table_);
+}
{
protected:
Array<Grob_info> 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;
Context * context () const { return context_; }
protected:
SCM simple_trans_list_;
+ SCM accept_hash_table_;
Context *context_;
friend class Context_def;
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_information> 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,
class Translator
{
void init ();
-
+
protected:
bool must_be_last_;
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;
#ifndef TRANSLATOR_ICC
#define TRANSLATOR_ICC
+#include "array.hh"
+
/**
A macro to automate administration of translators.
*/
ADD_GLOBAL_CTOR (_ ## T ## _adder);
#define ADD_TRANSLATOR(classname, desc, grobs, accepted, acked, read, write) \
+ Array<Acknowledge_information> 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 \
{ \
: (Translator_void_method_ptr) &T::process_acknowledged; \
}
+void add_acknowledger (Translator_void_method_ptr ptr, const char *func_name, Array<Acknowledge_information> *ack_array);
+Translator_void_method_ptr
+generic_get_acknowledger (SCM sym, Array<Acknowledge_information> 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 */
SCM
Rest_collision::do_shift (Grob *me)
{
- SCM elts = me->get_object ("elements");
+ extract_grob_set (me, "elements", elts);
Link_array<Grob> rests;
Link_array<Grob> 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")))
{
/*
Translator_group::initialize ()
{
precompute_method_bindings ();
-
- SCM tab = scm_make_vector (scm_int2num (19), SCM_BOOL_F);
- context ()->set_property ("acceptHashTable", tab);
}
void
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));
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))
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
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_;
}
return SCM_EOL;
}
-SCM
-Translator::translator_description () const
-{
- return SCM_EOL;
-}
-
Global_context *
Translator::get_global_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?");
{
}
-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 *)
{
return 1;
}
+void
+add_acknowledger (Translator_void_method_ptr ptr,
+ const char *func_name,
+ Array<Acknowledge_information> *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<Acknowledge_information> 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",
+ "",
+ "",
+ "",
+ "",
+ "");
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.",
")
(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]")
(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)))
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?)
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)))))
#:penalty total-penalty)
current-best)))
+;; (display total-penalty) (newline)
(if #f ;; debug
(display
(list
(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 '()))