X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspanner.cc;h=f3d13c84f9879a5878a6dc9739528842b94e8205;hb=94cce45d444cd6700d3f4df84cda68fb7de96cd7;hp=12346042df772cbb88f0b4380470ba0a1fe14391;hpb=db4c4e9f240b6c1becad366e1b62495e395cc10c;p=lilypond.git diff --git a/lily/spanner.cc b/lily/spanner.cc index 12346042df..f3d13c84f9 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -1,9 +1,20 @@ /* - spanner.cc -- implement Spanner + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1996--2011 Han-Wen Nienhuys - (c) 1996--2009 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 "libc-extension.hh" @@ -215,12 +226,14 @@ Spanner::Spanner (SCM s) { break_index_ = 0; spanned_drul_.set (0, 0); + pure_property_cache_ = SCM_UNDEFINED; } Spanner::Spanner (Spanner const &s) : Grob (s) { spanned_drul_.set (0, 0); + pure_property_cache_ = SCM_UNDEFINED; } Real @@ -316,6 +329,8 @@ Spanner::get_broken_left_end_align () const void Spanner::derived_mark () const { + scm_gc_mark (pure_property_cache_); + Direction d = LEFT; do if (spanned_drul_[d]) @@ -443,6 +458,29 @@ Spanner::kill_zero_spanned_time (SCM grob) return SCM_UNSPECIFIED; } +SCM +Spanner::get_cached_pure_property (SCM sym, int start, int end) +{ + // The pure property cache is indexed by (name start . end), where name is + // a symbol, and start and end are numbers referring to the starting and + // ending column ranks of the current line. + if (scm_hash_table_p (pure_property_cache_) == SCM_BOOL_F) + return SCM_UNDEFINED; + + SCM key = scm_cons (sym, scm_cons (scm_from_int (start), scm_from_int (end))); + return scm_hash_ref (pure_property_cache_, key, SCM_UNDEFINED); +} + +void +Spanner::cache_pure_property (SCM sym, int start, int end, SCM val) +{ + if (scm_hash_table_p (pure_property_cache_) == SCM_BOOL_F) + pure_property_cache_ = scm_c_make_hash_table (17); + + SCM key = scm_cons (sym, scm_cons (scm_from_int (start), scm_from_int (end))); + scm_hash_set_x (pure_property_cache_, key, val); +} + ADD_INTERFACE (Spanner, "Some objects are horizontally spanned between objects. For" " example, slurs, beams, ties, etc. These grobs form a subtype"