/*
- 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 <hanwen@xs4all.nl>
- (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ 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 <http://www.gnu.org/licenses/>.
*/
#include "grob.hh"
#include <cstring>
#include "align-interface.hh"
+#include "axis-group-interface.hh"
#include "input.hh"
#include "international.hh"
#include "item.hh"
#include "music.hh"
#include "output-def.hh"
#include "pointer-group-interface.hh"
+#include "program-option.hh"
#include "stencil.hh"
#include "stream-event.hh"
#include "system.hh"
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
{
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;
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<System *>(me);
+}
void
Grob::handle_broken_dependencies ()
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);
return Interval_t<int> (-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
****************************************************************/
void
Grob::warning (string s) const
{
+ if (get_program_option ("warning-as-error"))
+ error (s);
+
SCM cause = self_scm ();
while (Grob *g = unsmob_grob (cause))
cause = g->get_property ("cause");
void
Grob::programming_error (string s) const
{
+ if (get_program_option ("warning-as-error"))
+ error (s);
+
SCM cause = self_scm ();
while (Grob *g = unsmob_grob (cause))
cause = g->get_property ("cause");
if (Music *m = unsmob_music (cause))
m->origin ()->message (s);
else if (Stream_event *ev = unsmob_stream_event (cause))
- ev->origin ()->warning (s);
+ ev->origin ()->message (s);
else
::message (s);
}
" properties are variables that are specific to one grob."
" Typically, lists of other objects, or results from"
" computations are stored in mutable properties. In"
- " particular, every call to @code{set-grob-property} (or its"
- " C++ equivalent) sets a mutable property.\n"
+ " particular, every call to @code{ly:grob-set-property!}"
+ " (or its C++ equivalent) sets a mutable property.\n"
"\n"
"The properties @code{after-line-breaking} and"
" @code{before-line-breaking} are dummies that are not"
"staff-symbol "
"stencil "
"transparent "
+ "whiteout "
);
/****************************************************************
return grob_stencil_extent (me, X_AXIS);
}
-Stream_event*
-Grob::event_cause ()
-{
- SCM cause = get_property ("cause");
- if (to_boolean (Stream_event::smob_p (cause)))
- return unsmob_stream_event (cause);
- else if (to_boolean (Grob::smob_p (cause)))
- return unsmob_grob (cause)->event_cause ();
-
- return 0;
-}
Grob *
common_refpoint_of_list (SCM elist, Grob *common, Axis a)
return ext;
}
+// Checks whether there is a vertical alignment in the chain of
+// parents between this and commony.
+bool
+Grob::check_cross_staff (Grob *commony)
+{
+ if (Align_interface::has_interface (commony))
+ return true;
+
+ for (Grob *g = this; g && g != commony; g = g->get_parent (Y_AXIS))
+ if (Align_interface::has_interface (g))
+ return true;
+
+ return false;
+}
+