2 stencil.hh -- declare Stencil
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
11 #include <cstdlib> // size_t
14 #include "lily-proto.hh"
18 /** a group of individually translated symbols. You can add stencils
19 to the top, to the right, etc.
21 It is implemented as a "tree" of scheme expressions, as in
23 Expr = combine Expr-list
24 | translate Offset Expr
25 | origin (ORIGIN) Expr
30 SCHEME is a Scheme expression that --when eval'd-- produces the
35 * Because of the way that Stencil is implemented, it is the most
36 efficient to add "fresh" stencils to what you're going to build.
38 * Do not create Stencil objects on the heap. That includes passing
39 around Stencil* which are produced by unsmob_stencil(). Either
40 copy Stencil objects, or use SCM references.
42 * Empty stencils have empty dimensions. If add_at_edge is used to
43 init the stencil, we assume that
45 DIMENSIONS = (Interval (0, 0), Interval (0, 0)
50 This provides the reference point of the symbol, for example with
51 characters, it is on the base line of the character. Usually,
58 DECLARE_SIMPLE_SMOBS (Stencil,);
63 Offset origin () const;
67 Set dimensions to empty, or to (Interval (0, 0), Interval (0, 0) */
68 void set_empty (bool);
69 Stencil moved_to_edge (Axis a, Direction d, const Stencil &m, Real padding,
72 void add_at_edge (Axis a, Direction d, const Stencil &m, Real padding,
74 void add_stencil (Stencil const &m);
75 void translate (Offset);
76 void rotate (Real, Offset);
77 void align_to (Axis a, Real x);
78 void translate_axis (Real, Axis);
80 Interval extent (Axis) const;
81 Box extent_box () const;
82 bool is_empty () const;
83 Stencil in_color (Real r, Real g, Real b) const;
86 DECLARE_UNSMOB (Stencil, stencil);
88 void interpret_stencil_expression (SCM expr,
89 void (*func) (void *, SCM),
92 SCM find_expression_fonts (SCM expr);
94 void register_stencil_head (SCM symbol);
95 bool is_stencil_head (SCM symbol);
96 SCM all_stencil_heads ();
98 #endif /* STENCIL_HH */