2 system-start-text.cc -- implement System_start_text
4 source file of the GNU LilyPond music typesetter
6 (c) 2006--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "text-interface.hh"
11 #include "pointer-group-interface.hh"
12 #include "output-def.hh"
13 #include "font-interface.hh"
18 class System_start_text
21 static Stencil
get_stencil (Grob
*);
22 DECLARE_GROB_INTERFACE ();
24 DECLARE_SCHEME_CALLBACK (print
, (SCM
));
28 System_start_text::get_stencil (Grob
*me_grob
)
30 Spanner
*me
= dynamic_cast<Spanner
*> (me_grob
);
31 SCM t
= me
->get_property ("text");
32 if (me
->get_break_index () == 0)
33 t
= me
->get_property ("long-text");
36 SCM chain
= Font_interface::text_font_alist_chain (me
);
38 SCM scm_stencil
= Text_interface::is_markup (t
)
39 ? Text_interface::interpret_markup (me
->layout ()->self_scm (), chain
, t
)
43 if (Stencil
*p
= unsmob_stencil (scm_stencil
))
45 SCM align_y
= me_grob
->get_property ("self-alignment-Y");
46 if (scm_is_number (align_y
))
47 p
->align_to (Y_AXIS
, robust_scm2double (align_y
, 0.0));
49 /* Horizontal alignment according to the self-alignment-X property
50 * and indent value. */
51 Output_def
*layout
= me_grob
->layout ();
53 if (me
->get_break_index () == 0)
54 indent
= robust_scm2double (layout
->c_variable ("indent"), 0);
56 indent
= robust_scm2double (layout
->c_variable ("short-indent"), 0);
57 Real align_x
= robust_scm2double (me
->get_property ("self-alignment-X"), 0);
58 Interval p_extent_x
= p
->extent (X_AXIS
);
59 Interval
padding (0.0, max (0.0, indent
- p_extent_x
.length ()));
60 Real right_padding
= padding
.length () - padding
.linear_combination (align_x
);
61 Box
box (Interval (p_extent_x
[LEFT
], p_extent_x
[RIGHT
] + right_padding
),
63 Stencil
*aligned_p
= new Stencil (box
, p
->expr ());
70 MAKE_SCHEME_CALLBACK (System_start_text
, print
, 1);
72 System_start_text::print (SCM smob
)
74 Spanner
*me
= unsmob_spanner (smob
);
76 if (!me
->get_bound (LEFT
)->break_status_dir ())
82 extract_grob_set (me
, "elements", all_elts
);
84 for (vsize i
= 0; i
< all_elts
.size (); i
++)
85 if (all_elts
[i
]->is_live ())
86 elts
.push_back (all_elts
[i
]);
94 Grob
*common
= common_refpoint_of_array (elts
, me
, Y_AXIS
);
97 for (vsize i
= elts
.size (); i
--;)
99 Spanner
*sp
= dynamic_cast<Spanner
*> (elts
[i
]);
102 && sp
->get_bound (LEFT
) == me
->get_bound (LEFT
))
103 ext
.add_point (sp
->relative_coordinate (common
, Y_AXIS
));
106 Stencil m
= get_stencil (me
);
107 if (!ext
.is_empty ())
108 m
.translate_axis (ext
.center (), Y_AXIS
);
109 return m
.smobbed_copy ();
113 ADD_INTERFACE (System_start_text
,
114 "Text in front of the system.",