X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fballoon.cc;fp=lily%2Fballoon.cc;h=c4efb46b687c17ac4cafb93cabef601915f9584a;hb=e90f0536f9be39ada0bef0aeb0d275dec3b2fb5b;hp=0c82fdca8e4a35e00094b0d2f2fe5870d070c726;hpb=a8c9e8a7ca320ab0df5fd32e717fd62cd7635ce6;p=lilypond.git diff --git a/lily/balloon.cc b/lily/balloon.cc index 0c82fdca8e..c4efb46b68 100644 --- a/lily/balloon.cc +++ b/lily/balloon.cc @@ -1,25 +1,41 @@ /* - balloon.cc -- implement Balloon + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2004--2011 Han-Wen Nienhuys - (c) 2004--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 "text-interface.hh" #include "grob.hh" +#include "item.hh" #include "line-interface.hh" #include "lookup.hh" #include "font-interface.hh" #include "lily-guile.hh" #include "output-def.hh" #include "misc.hh" +#include "spanner.hh" class Balloon_interface { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); + DECLARE_SCHEME_CALLBACK (print_spanner, (SCM)); DECLARE_GROB_INTERFACE (); + + static SCM internal_balloon_print (Grob *me, Grob *p, Offset off); }; MAKE_SCHEME_CALLBACK (Balloon_interface, print, 1); @@ -28,19 +44,60 @@ Balloon_interface::print (SCM smob) { Grob *me = unsmob_grob (smob); + if (Item *item = dynamic_cast (me)) + if (!Item::break_visible (item)) + return SCM_EOL; + Grob *p = me->get_parent (X_AXIS); - + Offset off (me->relative_coordinate (p, X_AXIS), me->relative_coordinate (p, Y_AXIS)); + return internal_balloon_print (me, p, off); +} + +MAKE_SCHEME_CALLBACK (Balloon_interface, print_spanner, 1); +SCM +Balloon_interface::print_spanner (SCM smob) +{ + Spanner *me = unsmob_spanner (smob); + Spanner *orig = dynamic_cast (me->original ()); + + if (orig) + { + Direction spanner_placement = robust_scm2dir (me->get_property ("spanner-placement"), LEFT); + + Spanner *wanted = (spanner_placement != RIGHT) + ? orig->broken_intos_[0] + : orig->broken_intos_.back (); + + if (me != wanted) + return SCM_EOL; + } + + + Spanner *p = dynamic_cast (me->get_parent (Y_AXIS)); + + if (!p) + return SCM_EOL; + + Offset off (me->relative_coordinate (me->get_bound (LEFT), X_AXIS), + me->relative_coordinate (p, Y_AXIS)); + return internal_balloon_print (me, p, off); +} + +SCM +Balloon_interface::internal_balloon_print (Grob *me, Grob *p, Offset off) +{ Box b (p->extent (p, X_AXIS), p->extent (p, Y_AXIS)); - Real padding = robust_scm2double (me->get_property ("padding"), .1); b.widen (padding, padding); // FIXME - Stencil fr = Lookup::frame (b, 0.1, 0.05); + Stencil fr; + if (to_boolean (me->get_property ("annotation-balloon"))) + fr = Lookup::frame (b, 0.1, 0.05); SCM bt = me->get_property ("text"); SCM chain = Font_interface::text_font_alist_chain (me); @@ -60,7 +117,8 @@ Balloon_interface::print (SCM smob) Offset z2 = z1 + off; - fr.add_stencil (Line_interface::line (me, z1, z2)); + if (to_boolean (me->get_property ("annotation-line"))) + fr.add_stencil (Line_interface::line (me, z1, z2)); text_stil->translate (z2); fr.add_stencil (*text_stil); @@ -74,7 +132,10 @@ ADD_INTERFACE (Balloon_interface, " object.", /* properties */ + "annotation-balloon " + "annotation-line " "padding " + "spanner-placement " "text " );