#include <cstring>
+#include "align-interface.hh"
#include "input-smob.hh"
#include "international.hh"
#include "item.hh"
else
{
SCM expr = m->expr ();
- if (point_and_click_global)
- expr = scm_list_3 (ly_symbol2scm ("grob-cause"),
- self_scm (), expr);
+ expr = scm_list_3 (ly_symbol2scm ("grob-cause"),
+ self_scm (), expr);
retval = Stencil (m->extent_box (), expr);
}
+ SCM rot = get_property ("rotation");
+ if (scm_is_pair (rot))
+ {
+ Real angle = scm_to_double (scm_car (rot));
+ Real x = scm_to_double (scm_cadr (rot));
+ Real y = scm_to_double (scm_caddr (rot));
+
+ retval.rotate (angle, Offset (x, y));
+ }
/* color support... see interpret_stencil_expression () for more... */
SCM color = get_property ("color");
return off;
}
+Real
+Grob::pure_relative_y_coordinate (Grob const *refp, int start, int end)
+{
+ if (refp == this)
+ return 0.0;
+
+ SCM pure_off = ly_lily_module_constant ("pure-Y-offset");
+ Real off = 0;
+
+ if (dim_cache_[Y_AXIS].offset_)
+ off = *dim_cache_[Y_AXIS].offset_;
+ else if (ly_is_procedure (pure_off))
+ {
+ dim_cache_[Y_AXIS].offset_ = new Real (0.0);
+ off = scm_to_double (scm_apply_3 (pure_off, self_scm (),
+ scm_from_int (start), scm_from_int (end),
+ SCM_EOL));
+ delete dim_cache_[Y_AXIS].offset_;
+ dim_cache_[Y_AXIS].offset_ = 0;
+ }
+
+ /* we simulate positioning-done if we are the child of a VerticalAlignment */
+ Grob *p = get_parent (Y_AXIS);
+ Real trans = 0;
+ if (Align_interface::has_interface (p))
+ trans = Align_interface::get_pure_child_y_translation (p, this, start, end);
+
+ return off + trans
+ + dim_cache_[Y_AXIS].parent_->pure_relative_y_coordinate (refp, start, end);
+}
+
/* Invoke callbacks to get offset relative to parent. */
Real
Grob::get_offset (Axis a) const
return 0.0;
}
+Real
+Grob::maybe_pure_coordinate (Grob const *refp, Axis a, bool pure, int start, int end)
+{
+ if (pure && a != Y_AXIS)
+ programming_error ("tried to get pure X-offset");
+ return (pure && a == Y_AXIS) ? pure_relative_y_coordinate (refp, start, end)
+ : relative_coordinate (refp, a);
+}
/****************************************************************
extents
SCM min_ext = internal_get_property (min_ext_sym);
if (is_number_pair (min_ext))
real_ext.unite (ly_scm2interval (min_ext));
- ((Grob*)this)->del_property (ext_sym);
((Grob*)this)->dim_cache_[a].extent_ = new Interval (real_ext);
}
return real_ext;
}
+Interval
+Grob::pure_height (Grob *refp, int start, int end)
+{
+ SCM pure_height = ly_lily_module_constant ("pure-Y-extent");
+ Interval iv (0, 0);
+
+ if (ly_is_procedure (pure_height))
+ iv = ly_scm2interval (scm_apply_3 (pure_height, self_scm (),
+ scm_from_int (start), scm_from_int (end),
+ SCM_EOL));
+ Real offset = pure_relative_y_coordinate (refp, start, end);
+
+ iv.translate (offset);
+ return iv;
+}
+
+Interval
+Grob::maybe_pure_extent (Grob *refp, Axis a, bool pure, int start, int end)
+{
+ if (pure && a != Y_AXIS)
+ programming_error ("tried to get pure width");
+ return (pure && a == Y_AXIS) ? pure_height (refp, start, end) : extent (refp, a);
+}
+
+Interval_t<int>
+Grob::spanned_rank_iv ()
+{
+ return Interval_t<int> (INT_MIN, INT_MAX);
+}
+
/****************************************************************
REFPOINTS
****************************************************************/
MESSAGES
****************************************************************/
void
-Grob::warning (std::string s) const
+Grob::warning (string s) const
{
SCM cause = self_scm ();
while (Grob *g = unsmob_grob (cause))
}
-std::string
+string
Grob::name () const
{
SCM meta = get_property ("meta");
}
void
-Grob::programming_error (std::string s) const
+Grob::programming_error (string s) const
{
SCM cause = self_scm ();
while (Grob *g = unsmob_grob (cause))
"meta "
"minimum-X-extent "
"minimum-Y-extent "
+ "rotation "
"springs-and-rods "
"staff-symbol "
"stencil "
}
Grob *
-common_refpoint_of_array (Link_array<Grob> const &arr, Grob *common, Axis a)
+common_refpoint_of_array (vector<Grob*> const &arr, Grob *common, Axis a)
{
- for (int i = arr.size (); i--;)
+ for (vsize i = arr.size (); i--;)
if (Grob *s = arr[i])
{
if (common)