X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgrob.cc;h=882808180c6f2509cd7c807b5d22fed795f8239e;hb=eac874ad80855c7f8372c7893394fd63371a7be1;hp=56000a0c129608c8a29767ce05fde61bad0c7088;hpb=62f221b6b3861ff055dc0384ec3c48cc665688cd;p=lilypond.git diff --git a/lily/grob.cc b/lily/grob.cc index 56000a0c12..882808180c 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--2010 Han-Wen Nienhuys - (c) 1997--2008 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" @@ -19,6 +31,7 @@ #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" @@ -110,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 { @@ -142,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; @@ -426,10 +451,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); @@ -460,6 +482,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 ****************************************************************/ @@ -533,6 +568,9 @@ Grob::fixup_refpoint () 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"); @@ -559,6 +597,9 @@ Grob::name () const 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"); @@ -569,7 +610,7 @@ Grob::programming_error (string s) const 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); } @@ -606,8 +647,8 @@ ADD_INTERFACE (Grob, " 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" @@ -643,6 +684,7 @@ ADD_INTERFACE (Grob, "staff-symbol " "stencil " "transparent " + "whiteout " ); /**************************************************************** @@ -703,7 +745,6 @@ Grob::stencil_width (SCM smob) } - Grob * common_refpoint_of_list (SCM elist, Grob *common, Axis a) { @@ -741,3 +782,18 @@ robust_relative_extent (Grob *me, Grob *refpoint, 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; +} +