X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcontext.cc;h=36e506cd7e01d88891b57ac5c68f6817183eafc5;hb=0387f04497978e37b335a8b99eec905499d6ad0f;hp=d9c5f88129e9d746072252638fbb895c31e290f7;hpb=abbdb46061be5c0a0682059d1f86bf3e44ca5cf3;p=lilypond.git diff --git a/lily/context.cc b/lily/context.cc index d9c5f88129..36e506cd7e 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2006 Han-Wen Nienhuys + (c) 2004--2008 Han-Wen Nienhuys */ #include "context.hh" @@ -47,8 +47,8 @@ Context::check_removal () } Context::Context (Context const &src) - : key_manager_ (src.key_manager_) { + (void) src; assert (false); } @@ -69,8 +69,7 @@ Context::add_context (Context *child) } -Context::Context (Object_key const *key) - : key_manager_ (key) +Context::Context () { daddy_context_ = 0; aliases_ = SCM_EOL; @@ -92,12 +91,6 @@ Context::Context (Object_key const *key) event_source_->unprotect (); events_below_ = new Dispatcher (); events_below_->unprotect (); - - /* - UGH UGH - const correctness. - */ - key_manager_.unprotect(); } /* TODO: this shares code with find_create_context (). */ @@ -111,17 +104,12 @@ Context::create_unique_context (SCM name, string id, SCM operations) if (gthis && gthis->get_score_context ()) return gthis->get_score_context ()->create_unique_context (name, id, operations); - /* - TODO: use accepts_list_. - */ - vector path - = unsmob_context_def (definition_)->path_to_acceptable_context (name, get_output_def ()); - + vector path = path_to_acceptable_context (name); if (path.size ()) { Context *current = this; - // start at 1. The first one (index 0) will be us. + // Iterate through the path and create all of the implicit contexts. for (vsize i = 0; i < path.size (); i++) { SCM ops = SCM_EOL; @@ -148,7 +136,7 @@ Context::create_unique_context (SCM name, string id, SCM operations) ret = daddy_context_->create_unique_context (name, id, operations); else { - warning (_f ("can't find or create new `%s'", + warning (_f ("cannot find or create new `%s'", ly_symbol2string (name).c_str ())); ret = 0; } @@ -174,11 +162,7 @@ Context::find_create_context (SCM n, string id, SCM operations) return tg; } - /* - TODO: use accepts_list_. - */ - vector path - = unsmob_context_def (definition_)->path_to_acceptable_context (n, get_output_def ()); + vector path = path_to_acceptable_context (n); if (path.size ()) { @@ -210,7 +194,7 @@ Context::find_create_context (SCM n, string id, SCM operations) ret = daddy_context_->find_create_context (n, id, operations); else { - warning (_f ("can't find or create `%s' called `%s'", + warning (_f ("cannot find or create `%s' called `%s'", ly_symbol2string (n).c_str (), id)); ret = 0; } @@ -238,7 +222,7 @@ Context::set_property_from_event (SCM sev) if (val != SCM_EOL) ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")); if (ok) - internal_set_property (sym, val); + set_property (sym, val); } } @@ -267,10 +251,9 @@ Context::create_context_from_event (SCM sev) SCM ops = ev->get_property ("ops"); SCM type_scm = ev->get_property ("type"); string type = ly_symbol2string (type_scm); - Object_key const *key = key_manager_.get_context_key (now_mom(), type, id); - vector path - = unsmob_context_def (definition_)->path_to_acceptable_context (type_scm, get_output_def ()); + vector path = path_to_acceptable_context (type_scm); + if (path.size () != 1) { programming_error (_f ("Invalid CreateContext event: Cannot create %s context", type.c_str ())); @@ -278,7 +261,7 @@ Context::create_context_from_event (SCM sev) } Context_def *cdef = path[0]; - Context *new_context = cdef->instantiate (ops, key); + Context *new_context = cdef->instantiate (ops); new_context->id_string_ = id; @@ -320,6 +303,25 @@ Context::create_context_from_event (SCM sev) ly_symbol2scm ("creator"), sev); } +vector +Context::path_to_acceptable_context (SCM name) const +{ + // The 'accepts elements in definition_mods_ is a list of ('accepts string), + // but the Context_def expects to see elements of the form ('accepts symbol). + SCM accepts = SCM_EOL; + for (SCM s = scm_reverse (definition_mods_); scm_is_pair (s); s = scm_cdr (s)) + if (scm_caar (s) == ly_symbol2scm ("accepts")) + { + SCM elt = scm_list_2 (scm_caar (s), scm_string_to_symbol (scm_cadar (s))); + accepts = scm_cons (elt, accepts); + } + + return unsmob_context_def (definition_)->path_to_acceptable_context (name, + get_output_def (), + accepts); + +} + Context * Context::create_context (Context_def *cdef, string id, @@ -337,7 +339,7 @@ Context::create_context (Context_def *cdef, send_stream_event (this, "CreateContext", 0, ly_symbol2scm ("ops"), ops, ly_symbol2scm ("type"), cdef->get_context_name (), - ly_symbol2scm ("id"), scm_makfrom0str (id.c_str ())); + ly_symbol2scm ("id"), ly_string2scm (id)); event_source_-> remove_listener (GET_LISTENER (acknowledge_infant), ly_symbol2scm ("AnnounceNewContext")); @@ -385,7 +387,7 @@ Context::get_default_interpreter () Context_def *t = unsmob_context_def (st); if (!t) { - warning (_f ("can't find or create: `%s'", name.c_str ())); + warning (_f ("cannot find or create: `%s'", name.c_str ())); t = unsmob_context_def (this->definition_); } @@ -444,7 +446,7 @@ Context::internal_send_stream_event (SCM type, Input *origin, SCM props[]) Stream_event *e = new Stream_event (type, origin); for (int i = 0; props[i]; i += 2) { - e->internal_set_property (props[i], props[i+1]); + e->set_property (props[i], props[i+1]); } event_source_->broadcast (e); e->unprotect (); @@ -468,13 +470,18 @@ Context::add_alias (SCM sym) aliases_ = scm_cons (sym, aliases_); } +/* we don't (yet) instrument context properties */ +void +Context::instrumented_set_property (SCM sym, SCM val, const char*, int, const char*) +{ + internal_set_property (sym, val); +} + void Context::internal_set_property (SCM sym, SCM val) { -#ifndef NDEBUG if (do_internal_type_checking_global) assert (type_check_assignment (sym, val, ly_symbol2scm ("translation-type?"))); -#endif properties_dict ()->set (sym, val); } @@ -507,7 +514,9 @@ void Context::remove_context (SCM) { /* ugh, the translator group should listen to RemoveContext events by itself */ - implementation ()->disconnect_from_context (); + Translator_group *impl = implementation (); + if (impl) + impl->disconnect_from_context (); disconnect_from_parent (); } @@ -619,23 +628,10 @@ Context::print_smob (SCM s, SCM port, scm_print_state *) return 1; } -Object_key const * -Context::get_grob_key (string name) -{ - return key_manager_.get_grob_key (now_mom (), name); -} - -Object_key const * -Context::get_context_key (string name, string id) -{ - return key_manager_.get_context_key (now_mom (), name, id); -} - SCM Context::mark_smob (SCM sm) { Context *me = (Context *) SCM_CELL_WORD_1 (sm); - me->key_manager_.gc_mark(); scm_gc_mark (me->context_list_); scm_gc_mark (me->aliases_); @@ -643,10 +639,15 @@ Context::mark_smob (SCM sm) scm_gc_mark (me->definition_mods_); scm_gc_mark (me->properties_scm_); scm_gc_mark (me->accepts_list_); + if (me->implementation_) scm_gc_mark (me->implementation_->self_scm ()); - if (me->event_source_) scm_gc_mark (me->event_source_->self_scm ()); - if (me->events_below_) scm_gc_mark (me->events_below_->self_scm ()); + + if (me->event_source_) + scm_gc_mark (me->event_source_->self_scm ()); + + if (me->events_below_) + scm_gc_mark (me->events_below_->self_scm ()); return me->properties_scm_; } @@ -674,17 +675,6 @@ Context::get_parent_context () const return daddy_context_; } -void -Context::clear_key_disambiguations () -{ - if (!use_object_keys) - return; - - key_manager_.clear (); - for (SCM s = context_list_; scm_is_pair (s); s = scm_cdr (s)) - unsmob_context (scm_car (s))->clear_key_disambiguations (); -} - /* Ugh. Where to put this? */ @@ -719,11 +709,40 @@ measure_position (Context const *context) return m; } +/* Finds the measure position after a note of length DUR that + begins at the current measure position. */ +Moment +measure_position (Context const *context, Duration const *dur) +{ + Moment pos = measure_position (context); + Rational dur_length = dur ? dur->get_length () : Rational (0); + + Moment end_pos = pos.grace_part_ < Rational(0) + ? Moment(pos.main_part_, pos.grace_part_ + dur_length) + : Moment(pos.main_part_ + dur_length, 0); + + return end_pos; +} + +int +measure_number (Context const *context) +{ + SCM barnum = context->get_property ("internalBarNumber"); + SCM smp = context->get_property ("measurePosition"); + + int bn = robust_scm2int (barnum, 0); + Moment mp = robust_scm2moment (smp, Moment (0)); + if (mp.main_part_ < Rational (0)) + bn--; + + return bn; +} + void set_context_property_on_children (Context *trans, SCM sym, SCM val) { - trans->internal_set_property (sym, ly_deep_copy (val)); + trans->set_property (sym, ly_deep_copy (val)); for (SCM p = trans->children_contexts (); scm_is_pair (p); p = scm_cdr (p)) { Context *trg = unsmob_context (scm_car (p)); @@ -737,7 +756,7 @@ melisma_busy (Context *tr) SCM melisma_properties = tr->get_property ("melismaBusyProperties"); bool busy = false; - for (; scm_is_pair (melisma_properties); + for (; !busy && scm_is_pair (melisma_properties); melisma_properties = scm_cdr (melisma_properties)) busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties)));