X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob.cc;h=c613effccc65fd6be001aad742e41a1ed29b15a4;hb=a0112838d85cb2187e3b27f24f68f8f51fb90fea;hp=ce3e41c76dbcbf826d9191c9e27511edd23f1209;hpb=2f38710a2b40a24977441aa7faa05b6ab132f3cf;p=lilypond.git diff --git a/lily/grob.cc b/lily/grob.cc index ce3e41c76d..c613effccc 100644 --- a/lily/grob.cc +++ b/lily/grob.cc @@ -1,9 +1,20 @@ /* - grob.cc -- implement Grob + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2011 Han-Wen Nienhuys - (c) 1997--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 "grob.hh" @@ -11,6 +22,7 @@ #include #include "align-interface.hh" +#include "axis-group-interface.hh" #include "input.hh" #include "international.hh" #include "item.hh" @@ -111,7 +123,9 @@ Grob::get_print_stencil () const if (Stencil *m = unsmob_stencil (stil)) { retval = *m; - if (to_boolean (get_property ("transparent"))) + bool transparent = to_boolean (get_property ("transparent")); + + if (transparent) retval = Stencil (m->extent_box (), SCM_EOL); else { @@ -143,6 +157,16 @@ Grob::get_print_stencil () const retval = Stencil (retval.extent_box (), expr); } + /* process whiteout */ + /* a grob has to be visible, otherwise the whiteout property has no effect */ + if (!transparent && to_boolean (get_property ("whiteout"))) + { + /* Call the scheme procedure stencil-whiteout in scm/stencils.scm */ + /* to add a round-filled-box stencil to the stencil list */ + retval + = *unsmob_stencil (scm_call_1 (ly_lily_module_constant ("stencil-whiteout"), + retval.smobbed_copy())); + } } return retval; @@ -167,6 +191,16 @@ Grob::get_system () const return 0; } +/* This version of get_system is more reliable than this->get_system () + before line-breaking has been done, at which point there is only + one system in the whole score and we can find it just by following + parent pointers. */ +System * +Grob::get_system(Grob *me) +{ + Grob *p = me->get_parent (X_AXIS); + return p ? get_system (p) : dynamic_cast(me); +} void Grob::handle_broken_dependencies () @@ -427,10 +461,7 @@ Grob::extent (Grob *refp, Axis a) const Interval Grob::pure_height (Grob *refp, int start, int end) { - SCM proc = get_property_data (ly_symbol2scm ("Y-extent")); - SCM iv_scm = call_pure_function (proc, - scm_list_1 (self_scm ()), - start, end); + SCM iv_scm = get_pure_property ("Y-extent", start, end); Interval iv = robust_scm2interval (iv_scm, Interval (0, 0)); Real offset = pure_relative_y_coordinate (refp, start, end); @@ -461,6 +492,19 @@ Grob::spanned_rank_interval () const return Interval_t (-1, 0); } +bool +Grob::pure_is_visible (int /* start */, int /* end */) const +{ + return true; +} + +/* Sort grobs according to their starting column. */ +bool +Grob::less (Grob *g1, Grob *g2) +{ + return g1->spanned_rank_interval ()[LEFT] < g2->spanned_rank_interval ()[LEFT]; +} + /**************************************************************** REFPOINTS ****************************************************************/ @@ -650,6 +694,7 @@ ADD_INTERFACE (Grob, "staff-symbol " "stencil " "transparent " + "whiteout " ); /**************************************************************** @@ -761,3 +806,4 @@ Grob::check_cross_staff (Grob *commony) return false; } +