#include "warn.hh"
#include "axis-group-interface.hh"
#include "bar-line.hh"
+#include "grob.hh"
+#include "pointer-group-interface.hh"
void
Span_bar::add_bar (Grob *me, Grob *b)
/* Limitations/Bugs:
-(1) Elements from 'me->get_property ("elements")' must be
+(1) Elements from 'me->get_object ("elements")' must be
ordered according to their y coordinates relative to their common
axis group parent. Otherwise, the computation goes mad.
Span_bar::print (SCM smobbed_me)
{
Grob *me = unsmob_grob (smobbed_me);
- SCM elements = me->get_property ("elements");
+ extract_grob_set (me, "elements", elements);
+ Grob *refp = common_refpoint_of_array (elements, me, Y_AXIS);
- Grob *refp = common_refpoint_of_list (elements, me, Y_AXIS);
Span_bar::evaluate_glyph (me);
SCM glyph = me->get_property ("glyph");
/* compose span_bar_mol */
Array<Interval> extents;
Grob *model_bar = 0;
- for (SCM elts = elements; scm_is_pair (elts); elts = scm_cdr (elts))
+ for (int i = elements.size (); i--;)
{
- Grob *bar = unsmob_grob (scm_car (elts));
+ Grob *bar = elements[i];
Interval ext = bar->extent (refp, Y_AXIS);
if (ext.is_empty ())
continue;
if (!model_bar)
model_bar = me;
-
+
extents.sort (&Interval::left_comparison);
Stencil span_bar;
- for (int i = 1; i < extents.size (); i ++)
+ for (int i = 1; i < extents.size (); i++)
{
- Interval prev_extent = extents[i-1];
- Interval ext = extents[i];
+ Interval prev_extent = extents[i - 1];
+ Interval ext = extents[i];
if (!prev_extent.is_empty ())
{
Interval l (prev_extent [UP],
}
span_bar.translate_axis (- me->relative_coordinate (refp, Y_AXIS),
- Y_AXIS);
+ Y_AXIS);
return span_bar.smobbed_copy ();
}
Grob *se = unsmob_grob (element_smob);
(void) scm_axis;
- assert ( (Axis) scm_to_int (scm_axis) == X_AXIS);
+ assert ((Axis) scm_to_int (scm_axis) == X_AXIS);
String gl = ly_scm2string (se->get_property ("glyph"));
/*
if (i.is_empty ())
{
me->suicide ();
- return scm_make_real (0.0);
+ return scm_from_double (0.0);
}
- return scm_make_real (i.center ());
+ return scm_from_double (i.center ());
}
void
/* TODO: filter all hara-kiried out of ELEMENS list, and then
optionally do suicide. Call this cleanage function from
center_on_spanned_callback () as well. */
- if (!scm_is_pair (me->get_property ("elements")))
- {
- me->suicide ();
- }
+
+ extract_grob_set (me, "elements", elements);
+ if (elements.is_empty ())
+ me->suicide ();
}
void
if (scm_is_string (gl))
return;
- for (SCM s = me->get_property ("elements");
- !scm_is_string (gl) && scm_is_pair (s); s = scm_cdr (s))
- {
- gl = unsmob_grob (scm_car (s))
- ->get_property ("glyph");
- }
+ extract_grob_set (me, "elements", elements);
+ for (int i = elements.size ();
+ i-- && !scm_is_string (gl);)
+ gl = elements[i]->get_property ("glyph");
if (!scm_is_string (gl))
{
String type = ly_scm2string (gl);
if (type == "|:")
- {
- type = ".|";
- }
+ type = ".|";
else if (type == ":|")
- {
- type = "|.";
- }
+ type = "|.";
else if (type == ":|:")
- {
- type = ".|.";
- }
+ type = ".|.";
gl = scm_makfrom0str (type.to_str0 ());
if (scm_equal_p (me->get_property ("glyph"), gl)
Span_bar::get_spanned_interval (Grob *me)
{
return ly_scm2interval (Axis_group_interface::group_extent_callback
- (me->self_scm (), scm_int2num (Y_AXIS)));
+ (me->self_scm (), scm_from_int (Y_AXIS)));
}
MAKE_SCHEME_CALLBACK (Span_bar, get_bar_size, 1);
{
/* This happens if the bars are hara-kiried from under us. */
me->suicide ();
- return scm_make_real (-1);
+ return scm_from_double (-1);
}
- return scm_make_real (iv.length ());
+ return scm_from_double (iv.length ());
}
ADD_INTERFACE (Span_bar, "span-bar-interface",