(readPostTable): ugh. Kludge: nglyphs in maxp
[lilypond.git] / lily / dynamic-text-spanner.cc
blob5ed1f00caeeebdedc3f771cd9897573880594079
1 /*
2 crescendo-text-spanner.cc -- implement Text_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2005 Jan Nieuwenhuizen <janneke@gnu.org>
8 Revised over good by Han-Wen.
9 */
11 #include "text-interface.hh"
12 #include "text-spanner.hh"
13 #include "line-spanner.hh"
14 #include "spanner.hh"
15 #include "font-interface.hh"
16 #include "dimensions.hh"
17 #include "output-def.hh"
18 #include "warn.hh"
19 #include "paper-column.hh"
21 class Dynamic_text_spanner
23 public:
24 DECLARE_SCHEME_CALLBACK (print, (SCM));
25 static bool has_interface (Grob *);
29 This is a partial C&P from text-spanner.cc
31 Dynamic_text_spanner is similar, but
33 * does not require bracket functionality.
35 * should make room for spanning points (mf/f/mp texts).
37 * In the future, we should support
39 cresc - - - - poco - - - a - - - - poco - - -
41 as well
44 The cut & paste is rather inelegant, but text-spanner was a failed
45 and buggy attempt at being generic.
47 MAKE_SCHEME_CALLBACK (Dynamic_text_spanner, print, 1);
48 SCM
49 Dynamic_text_spanner::print (SCM smob)
51 Grob *me = unsmob_grob (smob);
52 Spanner *spanner = dynamic_cast<Spanner *> (me);
54 Grob *common = spanner->get_bound (LEFT)->common_refpoint (spanner->get_bound (RIGHT), X_AXIS);
55 Output_def *layout = me->get_layout ();
57 Interval span_points;
58 Drul_array<bool> broken;
59 Direction d = LEFT;
62 Item *b = spanner->get_bound (d);
63 broken[d] = b->break_status_dir () != CENTER;
65 if (broken[d])
67 if (d == LEFT)
68 span_points[d] = spanner->get_broken_left_end_align ();
69 else
70 span_points[d] = b->relative_coordinate (common, X_AXIS);
72 else
74 Real pad = 0.0;
75 Real encl = d;
76 if (b->internal_has_interface (ly_symbol2scm ("dynamic-interface")))
78 pad = robust_scm2double (me->get_property ("bound-padding"), 0.0);
79 encl = -d;
82 Interval ext = b->extent (common, X_AXIS);
83 span_points[d] = -d * pad
84 + robust_relative_extent (b, common, X_AXIS)
85 .linear_combination (encl);
88 while (flip (&d) != LEFT);
90 Stencil m;
91 SCM properties = Font_interface::text_font_alist_chain (me);
92 SCM edge_text = me->get_property ("edge-text");
93 Drul_array<Stencil> edge;
94 if (scm_is_pair (edge_text))
96 Direction d = LEFT;
99 if (broken[d])
100 continue;
102 SCM text = index_get_cell (edge_text, d);
104 if (Text_interface::markup_p (text))
105 edge[d] = *unsmob_stencil (Text_interface::interpret_markup (layout->self_scm (), properties, text));
107 if (!edge[d].is_empty ())
108 edge[d].align_to (Y_AXIS, CENTER);
110 while (flip (&d) != LEFT);
115 Interval ext = edge[d].extent (X_AXIS);
116 Real pad = robust_scm2double (me->get_property ("bound-padding"), 0.0);
117 if (!ext.is_empty ())
119 edge[d].translate_axis (span_points[d], X_AXIS);
120 m.add_stencil (edge[d]);
121 span_points[d] += -d * (ext[-d] + pad);
124 while (flip (&d) != LEFT);
126 if (!span_points.is_empty ())
128 Stencil l = Line_spanner::line_stencil (me,
129 Offset (span_points[LEFT], 0),
130 Offset (span_points[RIGHT], 0));
131 m.add_stencil (l);
133 m.translate_axis (- me->relative_coordinate (common, X_AXIS), X_AXIS);
134 return m.smobbed_copy ();
137 ADD_INTERFACE (Dynamic_text_spanner,
138 "dynamic-text-spanner-interface",
139 "A text spanner for crescendo texts",
140 "bound-padding dash-period dash-fraction edge-text style thickness");