X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fballoon.cc;h=1dfab523a8bc54cc77dfe60a69b049344e6627cb;hb=3ef09ea5cf542f2443113e4004b0e3928f319567;hp=fb7ac913d68a698872de90ebdf35003fba3cc354;hpb=31a6650e2b2a5c1cae3237ee47b80cd43d084d53;p=lilypond.git diff --git a/lily/balloon.cc b/lily/balloon.cc index fb7ac913d6..1dfab523a8 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--2005 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)); - static bool has_interface (Grob *); + 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,63 +44,105 @@ Balloon_interface::print (SCM smob) { Grob *me = unsmob_grob (smob); - SCM stil = me->get_property ("original-stencil"); - if (!unsmob_stencil (stil)) - return stil; + if (Item *item = dynamic_cast (me)) + if (!Item::break_visible (item)) + return SCM_EOL; - SCM scm_off = me->get_property ("balloon-text-offset"); + Grob *p = me->get_parent (X_AXIS); - if (!is_number_pair (scm_off)) - return stil; + Offset off (me->relative_coordinate (p, X_AXIS), + me->relative_coordinate (p, Y_AXIS)); - Offset off = ly_scm2offset (scm_off); - Stencil *s = unsmob_stencil (stil); - Box orig_extent = s->extent_box (); - Box box_extent = orig_extent; + return internal_balloon_print (me, p, off); +} - Real w = robust_scm2double (me->get_property ("balloon-padding"), .1); - box_extent.widen (w, w); +// ugh...code dup...hopefully can be consolidated w/ above one day +MAKE_SCHEME_CALLBACK (Balloon_interface, print_spanner, 1); +SCM +Balloon_interface::print_spanner (SCM smob) +{ + Spanner *me = unsmob_spanner (smob); + Grob *orig = me->original (); - // FIXME - Stencil fr = Lookup::frame (box_extent, 0.1, 0.05); + if (orig) + { + // TODO : consolidate code dup from System::get_footnote_grobs_in_range + int pos = orig->spanned_rank_interval ()[LEFT]; + Real spanner_placement = min (1.0, + max (robust_scm2double (me->get_property ("spanner-placement"), -1.0), + -1.0)); + + spanner_placement = (spanner_placement + 1.0) / 2.0; + int rpos = orig->spanned_rank_interval ()[RIGHT]; + pos = (int)((rpos - pos) * spanner_placement + pos + 0.5); + + if (pos < me->spanned_rank_interval () [LEFT]) + return SCM_EOL; + if (pos >= me->spanned_rank_interval () [RIGHT] && (me->spanned_rank_interval () [RIGHT] != orig->spanned_rank_interval () [RIGHT])) + return SCM_EOL; + } - fr.add_stencil (*s); - SCM bt = me->get_property ("balloon-text"); + 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; + 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); - chain = scm_cons (me->get_property ("balloon-text-props"), chain); - SCM text = Text_interface::interpret_markup (me->get_layout ()->self_scm (), - chain, bt); + SCM stencil = Text_interface::interpret_markup (me->layout ()->self_scm (), + chain, bt); - Stencil *text_stil = unsmob_stencil (text); + Stencil *text_stil = unsmob_stencil (stencil); Offset z1; for (int i = X_AXIS; i < NO_AXES; i++) { Axis a ((Axis)i); - z1[a] = box_extent [a].linear_combination (sign (off[a])); + z1[a] = b[a].linear_combination (sign (off[a])); text_stil->align_to (a, -sign (off[a])); } 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); - fr = Stencil (orig_extent, fr.expr ()); + fr.translate (-off); return fr.smobbed_copy (); } -ADD_INTERFACE (Balloon_interface, "text-balloon-interface", - "A collection of routines to put text balloons around an object.", +ADD_INTERFACE (Balloon_interface, + "A collection of routines to put text balloons around an" + " object.", /* properties */ - "balloon-padding " - "balloon-text-props " - "balloon-text-offset " - "balloon-text " - "original-stencil "); + "annotation-balloon " + "annotation-line " + "padding " + "spanner-placement " + "text " + );