2 balloon.cc -- implement Balloon objects
5 #include "text-item.hh"
8 #include "font-interface.hh"
10 #include "lily-guile.hh"
11 #include "paper-def.hh"
14 struct Balloon_interface
18 DECLARE_SCHEME_CALLBACK (brew_molecule, (SCM));
19 static bool has_interface (Grob*);
22 MAKE_SCHEME_CALLBACK (Balloon_interface, brew_molecule, 1);
24 Balloon_interface::brew_molecule (SCM smob)
26 Grob *me= unsmob_grob (smob);
28 SCM cb = me->get_grob_property ("balloon-original-callback");
29 SCM scm_mol = SCM_EOL;
31 if (gh_procedure_p (cb))
33 scm_mol = scm_call_1 (cb, smob);
36 if (!unsmob_molecule (scm_mol))
39 SCM scm_off = me->get_grob_property ("balloon-text-offset");
41 if (!is_number_pair (scm_off))
44 Offset off = ly_scm2offset (scm_off);
45 Molecule * m = unsmob_molecule (scm_mol);
46 Box orig_extent = m->extent_box ();
47 Box box_extent = orig_extent;
49 SCM widen = me->get_grob_property ("balloon-padding");
51 if (gh_number_p (widen))
53 w = gh_scm2double (widen);
55 box_extent.widen (w, w);
58 Molecule fr = Lookup::frame (box_extent, 0.1, 0.05);
65 SCM bt = me->get_grob_property ("balloon-text");
66 SCM chain = Font_interface::font_alist_chain (me);
67 chain = gh_cons (me->get_grob_property ("balloon-text-props"), chain);
70 SCM text = Text_item::interpret_markup (me->get_paper ()->self_scm (), chain, bt);
73 Molecule *text_mol = unsmob_molecule (text);
77 for (int i = X_AXIS; i < NO_AXES; i++)
80 z1[a] = box_extent [a].linear_combination (sign (off[a]));
81 text_mol->align_to (a, -sign (off[a]));
86 fr.add_molecule (Lookup::line (0.1, z1, z2));
88 text_mol->translate (z2);
89 fr.add_molecule (*text_mol);
91 fr = Molecule (orig_extent, fr.get_expr ());
92 return fr.smobbed_copy ();
95 ADD_INTERFACE (Balloon_interface,"text-balloon-interface",
97 "balloon-padding balloon-text-props balloon-text-offset balloon-text balloon-original-callback");