]> git.donarmstrong.com Git - lilypond.git/blob - lily/self-aligment-interface.cc
* lily/self-aligment-interface.cc (centered_on_parent): only
[lilypond.git] / lily / self-aligment-interface.cc
1 #include "side-position-interface.hh"
2 #include "warn.hh"
3
4 /*
5   Position centered on parent.
6  */
7 MAKE_SCHEME_CALLBACK (Self_alignment_interface,centered_on_parent,2);
8 SCM
9 Self_alignment_interface::centered_on_parent (SCM element_smob, SCM axis)
10 {
11   Grob *me = unsmob_grob (element_smob);
12   Axis a = (Axis) gh_scm2int (axis);
13   Grob *him = me->get_parent (a);
14   Interval he = him->extent (him,a);
15   
16   return  gh_double2scm (he.empty_b () ? 0.0 : he.center ());
17 }
18
19
20
21
22 /**
23   callback that centers the element on itself
24
25   Requires that self-alignment-{X,Y} be set.
26  */
27 MAKE_SCHEME_CALLBACK (Self_alignment_interface,aligned_on_self,2);
28 SCM
29 Self_alignment_interface::aligned_on_self (SCM element_smob, SCM axis)
30 {
31   Grob *me = unsmob_grob (element_smob);
32   Axis a = (Axis) gh_scm2int (axis);
33   static SCM  prop_syms[2];
34
35   if (!prop_syms[0])
36     {
37       prop_syms[X_AXIS] = ly_symbol2scm ("self-alignment-X");
38       prop_syms[Y_AXIS] = ly_symbol2scm ("self-alignment-Y");
39     }
40   
41   SCM align (me->internal_get_grob_property (prop_syms[a]));
42   if (gh_number_p (align))
43     {
44       Interval ext (me->extent (me,a));
45
46       if (ext.empty_b ())
47         {
48           programming_error ("I'm empty. Can't align on self");
49           return gh_double2scm (0.0);
50         }
51       else
52         {
53           return gh_double2scm (- ext.linear_combination (gh_scm2double (align)));
54         }
55     }
56   else if (unsmob_grob (align))
57     {
58       return gh_double2scm (- unsmob_grob (align)->relative_coordinate (me,  a));
59     }
60   return gh_double2scm (0.0);
61 }
62
63
64 ADD_INTERFACE (Self_alignment_interface, "self-alignment-interface",
65   "Position self using some alignment",
66   "self-alignment-X self-alignment-Y");
67