if (scm_is_number (scm_car (l)))
return l;
SCM res = get_number_list (scm_car (l));
- if (res == SCM_BOOL_F)
+ if (scm_is_false (res))
return get_number_list (scm_cdr (l));
return res;
}
{
if (scm_is_pair (l))
{
- if (scm_memv (scm_car (l),
- scm_list_n (ly_symbol2scm ("moveto"),
- ly_symbol2scm ("rmoveto"),
- ly_symbol2scm ("lineto"),
- ly_symbol2scm ("rlineto"),
- ly_symbol2scm ("curveto"),
- ly_symbol2scm ("rcurveto"),
- ly_symbol2scm ("closepath"),
- SCM_UNDEFINED))
- != SCM_BOOL_F)
+ if (scm_is_true (scm_memv (scm_car (l),
+ scm_list_n (ly_symbol2scm ("moveto"),
+ ly_symbol2scm ("rmoveto"),
+ ly_symbol2scm ("lineto"),
+ ly_symbol2scm ("rlineto"),
+ ly_symbol2scm ("curveto"),
+ ly_symbol2scm ("rcurveto"),
+ ly_symbol2scm ("closepath"),
+ SCM_UNDEFINED))))
return l;
SCM res = get_path_list (scm_car (l));
- if (res == SCM_BOOL_F)
+ if (scm_is_false (res))
return get_path_list (scm_cdr (l));
return res;
}
int quantization = max (1, (int) (((x_rad * trans.xx) + (y_rad * trans.yy)) * M_PI / QUANTIZATION_UNIT));
do
{
- for (vsize i = 0; i < 1 + quantization; i++)
+ for (vsize i = 0; i < 1 + (vsize) quantization; i++)
{
Real ang = linear_map (start, end, 0, quantization, i);
complex<Real> coord = polar (1.0, ang);
Offset first = get_point_in_y_direction (curve.control_[0], perpendicular_slope (curve.slope_at_point (0.0)), th / 2, d);
pango_matrix_transform_point (&trans, &first[X_AXIS], &first[Y_AXIS]);
points[d].push_back (first);
- for (vsize i = 1; i < quantization; i++)
+ for (vsize i = 1; i < (vsize) quantization; i++)
{
Real pt = (i * 1.0) / quantization;
Offset inter = get_point_in_y_direction (curve.curve_point (pt), perpendicular_slope (curve.slope_at_point (pt)), th / 2, d);
bool first = true;
while (scm_is_pair (expr))
{
- if (scm_car (expr) == ly_symbol2scm ("moveto")
- || (scm_car (expr) == ly_symbol2scm ("rmoveto") && first))
+ if (scm_is_eq (scm_car (expr), ly_symbol2scm ("moveto"))
+ || (scm_is_eq (scm_car (expr), ly_symbol2scm ("rmoveto")) && first))
{
Real x = robust_scm2double (scm_cadr (expr), 0.0);
Real y = robust_scm2double (scm_caddr (expr), 0.0);
current = start;
expr = scm_cdddr (expr);
}
- if (scm_car (expr) == ly_symbol2scm ("rmoveto"))
+ if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rmoveto")))
{
Real x = robust_scm2double (scm_cadr (expr), 0.0);
Real y = robust_scm2double (scm_caddr (expr), 0.0);
current = start;
expr = scm_cdddr (expr);
}
- else if (scm_car (expr) == ly_symbol2scm ("lineto"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("lineto")))
{
Real x = robust_scm2double (scm_cadr (expr), 0.0);
Real y = robust_scm2double (scm_caddr (expr), 0.0);
current = Offset (x, y);
expr = scm_cdddr (expr);
}
- else if (scm_car (expr) == ly_symbol2scm ("rlineto"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rlineto")))
{
Real x = robust_scm2double (scm_cadr (expr), 0.0);
Real y = robust_scm2double (scm_caddr (expr), 0.0);
current = (Offset (x, y) + current);
expr = scm_cdddr (expr);
}
- else if (scm_car (expr) == ly_symbol2scm ("curveto"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("curveto")))
{
Real x1 = robust_scm2double (scm_cadr (expr), 0.0);
expr = scm_cddr (expr);
out);
current = Offset (x3, y3);
}
- else if (scm_car (expr) == ly_symbol2scm ("rcurveto"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rcurveto")))
{
Real x1 = robust_scm2double (scm_cadr (expr), 0.0);
expr = scm_cddr (expr);
out);
current = (Offset (x3, y3) + current);
}
- else if (scm_car (expr) == ly_symbol2scm ("closepath"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("closepath")))
{
if ((current[X_AXIS] != start[X_AXIS]) || (current[Y_AXIS] != start[Y_AXIS]))
{
make_named_glyph_boxes (vector<Box> &boxes, vector<Drul_array<Offset> > &buildings, PangoMatrix trans, SCM expr)
{
SCM fm_scm = scm_car (expr);
- Font_metric *fm = unsmob_metrics (fm_scm);
+ Font_metric *fm = Font_metric::unsmob (fm_scm);
expr = scm_cdr (expr);
SCM glyph = scm_car (expr);
string glyph_s = ly_scm2string (glyph);
make_glyph_string_boxes (vector<Box> &boxes, vector<Drul_array<Offset> > &buildings, PangoMatrix trans, SCM expr)
{
SCM fm_scm = scm_car (expr);
- Font_metric *fm = unsmob_metrics (fm_scm);
+ Font_metric *fm = Font_metric::unsmob (fm_scm);
expr = scm_cdr (expr);
expr = scm_cdr (expr); // font-name
expr = scm_cdr (expr); // size
{
if (not scm_is_pair (expr))
return;
- if (scm_car (expr) == ly_symbol2scm ("draw-line"))
+ if (scm_is_eq (scm_car (expr), ly_symbol2scm ("draw-line")))
make_draw_line_boxes (boxes, buildings, trans, scm_cdr (expr), true);
- else if (scm_car (expr) == ly_symbol2scm ("dashed-line"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("dashed-line")))
{
expr = scm_cdr (expr);
SCM th = scm_car (expr);
SCM x2 = scm_car (expr);
make_draw_line_boxes (boxes, buildings, trans, scm_list_5 (th, scm_from_double (0.0), scm_from_double (0.0), x1, x2), true);
}
- else if (scm_car (expr) == ly_symbol2scm ("circle"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("circle")))
{
expr = scm_cdr (expr);
SCM rad = scm_car (expr);
SCM_BOOL_T,
SCM_UNDEFINED));
}
- else if (scm_car (expr) == ly_symbol2scm ("ellipse"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("ellipse")))
{
expr = scm_cdr (expr);
SCM x_rad = scm_car (expr);
SCM_BOOL_T,
SCM_UNDEFINED));
}
- else if (scm_car (expr) == ly_symbol2scm ("partial-ellipse"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("partial-ellipse")))
make_partial_ellipse_boxes (boxes, buildings, trans, scm_cdr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("round-filled-box"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("round-filled-box")))
make_round_filled_box_boxes (boxes, trans, scm_cdr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("named-glyph"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("named-glyph")))
make_named_glyph_boxes (boxes, buildings, trans, scm_cdr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("polygon"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("polygon")))
make_polygon_boxes (boxes, buildings, trans, scm_cdr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("path"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("path")))
make_path_boxes (boxes, buildings, trans, scm_cdr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("glyph-string"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("glyph-string")))
make_glyph_string_boxes (boxes, buildings, trans, scm_cdr (expr));
else
{
{
if (scm_is_null (expr))
return vector<Transform_matrix_and_expression> ();
- else if (expr == ly_string2scm (""))
+ else if (scm_is_eq (expr, ly_string2scm ("")))
return vector<Transform_matrix_and_expression> ();
- else if (scm_car (expr) == ly_symbol2scm ("combine-stencil"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("combine-stencil")))
{
vector<Transform_matrix_and_expression> out;
for (SCM s = scm_cdr (expr); scm_is_pair (s); s = scm_cdr (s))
}
return out;
}
- else if (scm_car (expr) == ly_symbol2scm ("footnote"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("footnote")))
return vector<Transform_matrix_and_expression> ();
- else if (scm_car (expr) == ly_symbol2scm ("translate-stencil"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("translate-stencil")))
{
Real x = robust_scm2double (scm_caadr (expr), 0.0);
Real y = robust_scm2double (scm_cdadr (expr), 0.0);
pango_matrix_translate (&trans, x, y);
return stencil_traverser (trans, scm_caddr (expr));
}
- else if (scm_car (expr) == ly_symbol2scm ("scale-stencil"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("scale-stencil")))
{
Real x = robust_scm2double (scm_caadr (expr), 0.0);
Real y = robust_scm2double (scm_cadadr (expr), 0.0);
pango_matrix_scale (&trans, x, y);
return stencil_traverser (trans, scm_caddr (expr));
}
- else if (scm_car (expr) == ly_symbol2scm ("rotate-stencil"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rotate-stencil")))
{
Real ang = robust_scm2double (scm_caadr (expr), 0.0);
Real x = robust_scm2double (scm_car (scm_cadadr (expr)), 0.0);
pango_matrix_translate (&trans, -x, -y);
return stencil_traverser (trans, scm_caddr (expr));
}
- else if (scm_car (expr) == ly_symbol2scm ("delay-stencil-evaluation"))
- return stencil_traverser (trans, scm_force (scm_cadr (expr)));
- else if (scm_car (expr) == ly_symbol2scm ("grob-cause"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("delay-stencil-evaluation")))
+ // should not use the place-holder text, but no need for the warning below
+ return vector<Transform_matrix_and_expression> ();
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("grob-cause")))
return stencil_traverser (trans, scm_caddr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("color"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("color")))
return stencil_traverser (trans, scm_caddr (expr));
- else if (scm_car (expr) == ly_symbol2scm ("id"))
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("transparent-stencil")))
+ return stencil_traverser (trans, scm_cadr (expr));
+ else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("id")))
return stencil_traverser (trans, scm_caddr (expr));
else
{
? Interval (-infinity_f, infinity_f)
: me->maybe_pure_extent (me, Y_AXIS, pure, beg, end);
- // In horizontal spacing, there are grobs like SystemStartBracket
- // that take up no vertical spcae. So, if the y extent is empty,
- // we use the entire Y extent ot make the X a sort of horizontal wall.
- // Ditto for vertical spacing and grobs like BassFigureAlginmentPositioning.
- if (a == Y_AXIS && yex.is_empty ())
- yex.set_full ();
-
- if (a == X_AXIS && xex.is_empty ())
- xex.set_full ();
-
if (xex.is_empty () || yex.is_empty ())
return Skyline_pair ().smobbed_copy ();
SCM
Grob::pure_simple_vertical_skylines_from_extents (SCM smob, SCM begscm, SCM endscm)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
int beg = robust_scm2int (begscm, 0);
int end = robust_scm2int (endscm, INT_MAX);
- return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, true, beg, end, dynamic_cast<Spanner *> (me), false);
+ // We cannot measure the widths before line breaking,
+ // so we assume that the width is infinite: pass ignore_x=true
+ return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, true, beg, end, true, false);
}
MAKE_SCHEME_CALLBACK (Grob, simple_vertical_skylines_from_extents, 1);
SCM
Grob::simple_vertical_skylines_from_extents (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, false, 0, 0, false, false);
}
SCM
Grob::pure_simple_horizontal_skylines_from_extents (SCM smob, SCM begscm, SCM endscm)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
int beg = robust_scm2int (begscm, 0);
int end = robust_scm2int (endscm, INT_MAX);
+ // If the grob is cross staff, we cannot measure its Y-extent before
+ // wayyyy downstream (after spacing of axis groups is done).
+ // Thus, we assume that the Y extent is infinite for cross staff grobs.
return maybe_pure_internal_simple_skylines_from_extents (me, Y_AXIS, true, beg, end, false, to_boolean (me->get_property ("cross-staff")));
}
SCM
Grob::simple_horizontal_skylines_from_extents (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
+ // See comment in function above.
return maybe_pure_internal_simple_skylines_from_extents (me, Y_AXIS, false, 0, 0, false, to_boolean (me->get_property ("cross-staff")));
}
SCM
Stencil::skylines_from_stencil (SCM sten, Real pad, Axis a)
{
- Stencil *s = unsmob_stencil (sten);
+ Stencil *s = Stencil::unsmob (sten);
if (!s)
return Skyline_pair ().smobbed_copy ();
for (DOWN_and_UP (d))
out[d] = out[d].padded (pad);
- out.deholify ();
return out.smobbed_copy ();
}
SCM
Grob::vertical_skylines_from_stencil (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
Real pad = robust_scm2double (me->get_property ("skyline-horizontal-padding"), 0.0);
SCM out = Stencil::skylines_from_stencil (me->get_property ("stencil"), pad, X_AXIS);
SCM
Grob::horizontal_skylines_from_stencil (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = Grob::unsmob (smob);
Real pad = robust_scm2double (me->get_property ("skyline-vertical-padding"), 0.0);
SCM out = Stencil::skylines_from_stencil (me->get_property ("stencil"), pad, Y_AXIS);
}
SCM
-Grob::internal_skylines_from_element_stencils (SCM smob, Axis a)
+Grob::internal_skylines_from_element_stencils (Grob *me, Axis a, bool pure, int beg, int end)
{
- Grob *me = unsmob_grob (smob);
extract_grob_set (me, "elements", elts);
vector<Real> x_pos;
for (vsize i = 0; i < elts.size (); i++)
{
x_pos.push_back (elts[i]->relative_coordinate (x_common, X_AXIS));
- y_pos.push_back (elts[i]->relative_coordinate (y_common, Y_AXIS));
+ y_pos.push_back (elts[i]->maybe_pure_coordinate (y_common, Y_AXIS, pure, beg, end));
}
Real my_x = me->relative_coordinate (x_common, X_AXIS);
- Real my_y = me->relative_coordinate (y_common, Y_AXIS);
+ Real my_y = me->maybe_pure_coordinate (y_common, Y_AXIS, pure, beg, end);
+
Skyline_pair res;
for (vsize i = 0; i < elts.size (); i++)
{
- Skyline_pair *skyp = Skyline_pair::unsmob (elts[i]->get_property (a == X_AXIS ? "vertical-skylines" : "horizontal-skylines"));
+ Skyline_pair *skyp = Skyline_pair::unsmob (elts[i]->get_maybe_pure_property (a == X_AXIS ? "vertical-skylines" : "horizontal-skylines", pure, beg, end));
if (skyp)
{
/*
SCM
Grob::vertical_skylines_from_element_stencils (SCM smob)
{
- return internal_skylines_from_element_stencils (smob, X_AXIS);
+ Grob *me = Grob::unsmob (smob);
+ return internal_skylines_from_element_stencils (me, X_AXIS, false, 0, INT_MAX);
}
MAKE_SCHEME_CALLBACK (Grob, horizontal_skylines_from_element_stencils, 1);
SCM
Grob::horizontal_skylines_from_element_stencils (SCM smob)
{
- return internal_skylines_from_element_stencils (smob, Y_AXIS);
+ Grob *me = Grob::unsmob (smob);
+ return internal_skylines_from_element_stencils (me, Y_AXIS, false, 0, INT_MAX);
+}
+
+MAKE_SCHEME_CALLBACK (Grob, pure_vertical_skylines_from_element_stencils, 3);
+SCM
+Grob::pure_vertical_skylines_from_element_stencils (SCM smob, SCM beg_scm, SCM end_scm)
+{
+ Grob *me = Grob::unsmob (smob);
+ int beg = robust_scm2int (beg_scm, 0);
+ int end = robust_scm2int (end_scm, 0);
+ return internal_skylines_from_element_stencils (me, X_AXIS, true, beg, end);
+}
+
+MAKE_SCHEME_CALLBACK (Grob, pure_horizontal_skylines_from_element_stencils, 3);
+SCM
+Grob::pure_horizontal_skylines_from_element_stencils (SCM smob, SCM beg_scm, SCM end_scm)
+{
+ Grob *me = Grob::unsmob (smob);
+ int beg = robust_scm2int (beg_scm, 0);
+ int end = robust_scm2int (end_scm, 0);
+ return internal_skylines_from_element_stencils (me, Y_AXIS, true, beg, end);
}