source file of the GNU LilyPond music typesetter
- (c) 2002--2005 Juergen Reuter <reuter@ipd.uka.de>,
+ (c) 2002--2006 Juergen Reuter <reuter@ipd.uka.de>,
Pal Benko <benkop@freestart.hu>
*/
#include "coherent-ligature-engraver.hh"
+#include "font-interface.hh"
+#include "international.hh"
#include "mensural-ligature.hh"
#include "music.hh"
-#include "warn.hh"
-#include "spanner.hh"
-#include "paper-column.hh"
#include "note-column.hh"
-#include "rhythmic-head.hh"
#include "note-head.hh"
-#include "staff-symbol-referencer.hh"
#include "output-def.hh"
-#include "font-interface.hh"
+#include "paper-column.hh"
+#include "rhythmic-head.hh"
+#include "spanner.hh"
+#include "staff-symbol-referencer.hh"
+#include "warn.hh"
/*
* TODO: accidentals are aligned with the first note;
protected:
virtual Spanner *create_ligature_spanner ();
- virtual void build_ligature (Spanner *ligature, Array<Grob_info> primitives);
+ virtual void build_ligature (Spanner *ligature, vector<Grob_info> primitives);
public:
TRANSLATOR_DECLARATIONS (Mensural_ligature_engraver);
private:
- void transform_heads (Array<Grob_info> primitives);
- void propagate_properties (Spanner *ligature, Array<Grob_info> primitives);
- void fold_up_primitives (Array<Grob_info> primitives);
+ void transform_heads (vector<Grob_info> primitives);
+ void propagate_properties (Spanner *ligature, vector<Grob_info> primitives);
+ void fold_up_primitives (vector<Grob_info> primitives);
};
Mensural_ligature_engraver::Mensural_ligature_engraver ()
{
+ brew_ligature_primitive_proc =
+ Mensural_ligature::brew_ligature_primitive_proc;
}
Spanner *
}
void
-Mensural_ligature_engraver::transform_heads (Array<Grob_info> primitives)
+Mensural_ligature_engraver::transform_heads (vector<Grob_info> primitives)
{
if (primitives.size () < 2)
{
bool prev_semibrevis = false;
Item *prev_primitive = NULL;
- for (int i = 0, s = primitives.size (); i < s; i++)
+ for (vsize i = 0, s = primitives.size (); i < s; i++)
{
Grob_info info = primitives[i];
Item *primitive = dynamic_cast<Item *> (info.grob ());
(_f ("prime interval within ligature -> skipping"));
at_beginning = true;
primitive->set_property ("primitive",
- scm_int2num (MLP_NONE));
+ scm_from_int (MLP_NONE));
continue;
}
}
nr->origin ()->warning
(_f ("mensural ligature: duration none of Mx, L, B, S -> skipping"));
primitive->set_property ("primitive",
- scm_int2num (MLP_NONE));
+ scm_from_int (MLP_NONE));
at_beginning = true;
continue;
}
if (duration_log == 0)
{
primitive->set_property ("primitive",
- scm_int2num (MLP_UP | MLP_BREVIS));
+ scm_from_int (MLP_UP | MLP_BREVIS));
prev_semibrevis = prev_brevis_shape = true;
general_case = false;
}
int left_stem = duration_log == -1 ? MLP_DOWN : 0;
primitive->set_property ("primitive",
- scm_int2num (left_stem | MLP_BREVIS));
+ scm_from_int (left_stem | MLP_BREVIS));
prev_brevis_shape = true;
prev_semibrevis = general_case = false;
}
prev_semibrevis = false;
if (duration_log == 0)
{
- primitive->set_property ("primitive", scm_int2num (MLP_BREVIS));
+ primitive->set_property ("primitive", scm_from_int (MLP_BREVIS));
general_case = false;
}
else
nr->origin ()->warning
(_f ("semibrevis must be followed by another one -> skipping"));
primitive->set_property ("primitive",
- scm_int2num (MLP_NONE));
+ scm_from_int (MLP_NONE));
at_beginning = true;
continue;
}
(_f ("semibreves can only appear at the beginning of a ligature,\n"
"and there may be only zero or two of them"));
primitive->set_property ("primitive",
- scm_int2num (MLP_NONE));
+ scm_from_int (MLP_NONE));
at_beginning = true;
continue;
}
{
prev_primitive->set_property
("primitive",
- scm_int2num
+ scm_from_int
(MLP_FLEXA
| (scm_to_int (prev_primitive->get_property ("primitive"))
& MLP_DOWN)));
- primitive->set_property ("primitive", scm_int2num (MLP_NONE));
+ primitive->set_property ("primitive", scm_from_int (MLP_NONE));
break; // no more notes, no join
}
else
"when the last note is a descending brevis,\n"
"the penultimate note must be another one,\n"
"or the ligatura must be LB or SSB"));
- primitive->set_property ("primitive", scm_int2num (MLP_NONE));
+ primitive->set_property ("primitive", scm_from_int (MLP_NONE));
break;
}
}
// longa
else if (duration_log == -2)
{
- primitive->set_property ("primitive", scm_int2num (MLP_BREVIS));
+ primitive->set_property ("primitive", scm_from_int (MLP_BREVIS));
general_case = false;
}
// else maxima; fall through regular case below
static int const shape[3] = {MLP_MAXIMA, MLP_LONGA, MLP_BREVIS};
primitive->set_property ("primitive",
- scm_int2num (shape[duration_log + 3]));
+ scm_from_int (shape[duration_log + 3]));
prev_brevis_shape = duration_log == -1;
}
// ("noteheads.s-2mensural").extent (Y_AXIS).length ()
}
prev_primitive->set_property ("join-right-amount",
- scm_int2num (delta_pitch));
+ scm_from_int (delta_pitch));
// perhaps set add-join as well
}
at_beginning = false;
*/
void
Mensural_ligature_engraver::propagate_properties (Spanner *ligature,
- Array<Grob_info> primitives)
+ vector<Grob_info> primitives)
{
Real thickness
= robust_scm2double (ligature->get_property ("thickness"), 1.4);
thickness
- *= ligature->get_layout ()->get_dimension (ly_symbol2scm ("linethickness"));
+ *= ligature->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
Real head_width
= Font_interface::get_default_font (ligature)->
Real half_flexa_width = 0.5 * (flexa_width + thickness);
- for (int i = 0; i < primitives.size (); i++)
+ for (vsize i = 0; i < primitives.size (); i++)
{
Item *primitive = dynamic_cast<Item *> (primitives[i].grob ());
int output = scm_to_int (primitive->get_property ("primitive"));
primitive->set_property ("thickness",
- scm_make_real (thickness));
+ scm_from_double (thickness));
switch (output & MLP_ANY)
{
case MLP_NONE:
primitive->set_property ("head-width",
- scm_make_real (half_flexa_width));
+ scm_from_double (half_flexa_width));
break;
case MLP_BREVIS:
case MLP_LONGA:
primitive->set_property ("head-width",
- scm_make_real (head_width));
+ scm_from_double (head_width));
break;
case MLP_MAXIMA:
primitive->set_property ("head-width",
- scm_make_real (maxima_head_width));
+ scm_from_double (maxima_head_width));
break;
case MLP_FLEXA:
primitive->set_property ("head-width",
- scm_make_real (half_flexa_width));
+ scm_from_double (half_flexa_width));
primitive->set_property ("flexa-width",
- scm_make_real (flexa_width));
+ scm_from_double (flexa_width));
break;
default:
programming_error (_f ("unexpected case fall-through"));
}
void
-Mensural_ligature_engraver::fold_up_primitives (Array<Grob_info> primitives)
+Mensural_ligature_engraver::fold_up_primitives (vector<Grob_info> primitives)
{
Item *first = 0;
Real distance = 0;
- for (int i = 0; i < primitives.size (); i++)
+ for (vsize i = 0; i < primitives.size (); i++)
{
Item *current = dynamic_cast<Item *> (primitives[i].grob ());
if (i == 0)
- {
- first = current;
- }
+ first = current;
get_set_column (current, first->get_column ());
if (i > 0)
- {
- current->translate_axis (distance, X_AXIS);
- }
+ current->translate_axis (distance, X_AXIS);
distance
+= scm_to_double (current->get_property ("head-width"))
void
Mensural_ligature_engraver::build_ligature (Spanner *ligature,
- Array<Grob_info> primitives)
+ vector<Grob_info> primitives)
{
transform_heads (primitives);
propagate_properties (ligature, primitives);
fold_up_primitives (primitives);
}
+#include "translator.icc"
+
+ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest);
+ADD_ACKNOWLEDGER (Mensural_ligature_engraver, note_head);
ADD_TRANSLATOR (Mensural_ligature_engraver,
- /* descr */ "Handles Mensural_ligature_events by glueing special ligature heads together.",
- /* creats*/ "MensuralLigature",
- /* accepts */ "ligature-event",
- /* acks */ "note-head-interface rest-interface",
- /* reads */ "",
+ /* doc */ "Handles Mensural_ligature_events by glueing special ligature heads together.",
+ /* create */ "MensuralLigature",
+ /* accept */ "ligature-event",
+ /* read */ "",
/* write */ "");