source file of the GNU LilyPond music typesetter
- (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "grob.hh"
ADD_INTERFACE (Grob,
"A grob represents a piece of music notation.\n"
"\n"
- "All grobs have an X and Y@tie{}position on the page. These "
- "X and Y@tie{}positions are stored in a relative format, thus "
- "they can easily be combined by stacking them, hanging one "
- "grob to the side of another, or coupling them into grouping "
- "objects.\n"
+ "All grobs have an X and Y@tie{}position on the page. These"
+ " X and Y@tie{}positions are stored in a relative format, thus"
+ " they can easily be combined by stacking them, hanging one"
+ " grob to the side of another, or coupling them into grouping"
+ " objects.\n"
"\n"
- "Each grob has a reference point (a.k.a.@: parent): The "
- "position of a grob is stored relative to that reference "
- "point. For example, the X@tie{}reference point of a staccato "
- "dot usually is the note head that it applies to. When the "
- "note head is moved, the staccato dot moves along "
- "automatically.\n"
+ "Each grob has a reference point (a.k.a.@: parent): The"
+ " position of a grob is stored relative to that reference"
+ " point. For example, the X@tie{}reference point of a staccato"
+ " dot usually is the note head that it applies to. When the"
+ " note head is moved, the staccato dot moves along"
+ " automatically.\n"
"\n"
- "A grob is often associated with a symbol, but some grobs do "
- "not print any symbols. They take care of grouping objects. "
- "For example, there is a separate grob that stacks staves "
- "vertically. The @ref{NoteCollision} object is also an "
- "abstract grob: It only moves around chords, but doesn't print "
- "anything.\n"
+ "A grob is often associated with a symbol, but some grobs do"
+ " not print any symbols. They take care of grouping objects."
+ " For example, there is a separate grob that stacks staves"
+ " vertically. The @ref{NoteCollision} object is also an"
+ " abstract grob: It only moves around chords, but doesn't print"
+ " anything.\n"
"\n"
- "Grobs have properties (Scheme variables) that can be read and "
- "set. Two types of them exist: immutable and mutable. "
- "Immutable variables define the default style and behavior. "
- "They are shared between many objects. They can be changed "
- "using @code{\\override} and @code{\\revert}. Mutable "
- "properties are variables that are specific to one grob. "
- "Typically, lists of other objects, or results from "
- "computations are stored in mutable properties. In "
- "particular, every call to @code{set-grob-property} (or its "
- "C++ equivalent) sets a mutable property.\n"
+ "Grobs have properties (Scheme variables) that can be read and"
+ " set. Two types of them exist: immutable and mutable."
+ " Immutable variables define the default style and behavior."
+ " They are shared between many objects. They can be changed"
+ " using @code{\\override} and @code{\\revert}. Mutable"
+ " properties are variables that are specific to one grob."
+ " Typically, lists of other objects, or results from"
+ " computations are stored in mutable properties. In"
+ " particular, every call to @code{set-grob-property} (or its"
+ " C++ equivalent) sets a mutable property.\n"
"\n"
- "The properties @code{after-line-breaking} and "
- "@code{before-line-breaking} are dummies that are not "
- "user-serviceable.",
+ "The properties @code{after-line-breaking} and"
+ " @code{before-line-breaking} are dummies that are not"
+ " user-serviceable.",
/* properties */
"X-extent "
return grob_stencil_extent (me, X_AXIS);
}
+Stream_event*
+Grob::event_cause ()
+{
+ SCM cause = get_property ("cause");
+ if (to_boolean (Stream_event::smob_p (cause)))
+ return unsmob_stream_event (cause);
+ else if (to_boolean (Grob::smob_p (cause)))
+ return unsmob_grob (cause)->event_cause ();
+ return 0;
+}
Grob *
common_refpoint_of_list (SCM elist, Grob *common, Axis a)
Grob *
common_refpoint_of_array (vector<Grob*> const &arr, Grob *common, Axis a)
{
- for (vsize i = arr.size (); i--;)
- if (Grob *s = arr[i])
- {
- if (common)
- common = common->common_refpoint (s, a);
- else
- common = s;
- }
+ for (vsize i = 0; i < arr.size (); i++)
+ if (common)
+ common = common->common_refpoint (arr[i], a);
+ else
+ common = arr[i];
return common;
}