]> git.donarmstrong.com Git - lilypond.git/blob - lily/grid-line-interface.cc
5bb0b097affa63ca4b96f5fa447cba1f568bbd06
[lilypond.git] / lily / grid-line-interface.cc
1 /*
2   grid-line-interface.cc --  implement Grid_line_interface
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "grid-line-interface.hh"
10
11 #include "grob.hh"
12 #include "pointer-group-interface.hh"
13 #include "lookup.hh"
14 #include "output-def.hh"
15
16 MAKE_SCHEME_CALLBACK (Grid_line_interface, print, 1);
17 SCM
18 Grid_line_interface::print (SCM smobbed_me)
19 {
20   Grob *me = unsmob_grob (smobbed_me);
21
22   extract_grob_set (me, "elements", elts);
23   /* compute common refpoint of elements */
24   Grob *refp = common_refpoint_of_array (elts, me, Y_AXIS);
25   Interval iv;
26
27   for (vsize i = 0; i < elts.size (); i++)
28     {
29       Grob *point = elts[i];
30
31       iv.unite (point->extent (refp, Y_AXIS));
32     }
33
34   if (iv.is_empty ())
35     {
36       me->suicide ();
37       return SCM_EOL;
38     }
39
40   Real staffline = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
41   Real thick = robust_scm2double (me->get_property ("thickness"), 1.0)
42     * staffline;
43
44   iv += -me->relative_coordinate (refp, Y_AXIS);
45   Stencil st = Lookup::filled_box (Box (Interval (0, thick),
46                                         iv));
47
48   return st.smobbed_copy ();
49 }
50
51 MAKE_SCHEME_CALLBACK (Grid_line_interface, width, 1);
52 SCM
53 Grid_line_interface::width (SCM smob)
54 {
55   Grob *me = unsmob_grob (smob);
56
57   Real staffline = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
58   Real thick = robust_scm2double (me->get_property ("thickness"), 1.0)
59     * staffline;
60
61   return ly_interval2scm (Interval (0, thick));
62 }
63
64 void
65 Grid_line_interface::add_grid_point (Grob *me, Grob *b)
66 {
67   Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), b);
68 }
69
70 ADD_INTERFACE (Grid_line_interface,
71                "A line that is spanned between grid-points.",
72
73                /* properties */
74                "elements "
75                "thickness "
76                );
77
78 ADD_INTERFACE (Grid_point_interface,
79                "A spanning point for grid lines.",
80
81                /* properties */
82                ""
83                );