/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1996--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
#include "beam.hh"
#include "interval.hh"
-#include "lily-guile.hh"
-#include "lily-proto.hh"
+#include "lily-guile.hh"
+#include "lily-proto.hh"
#include "main.hh" // DEBUG_BEAM_SCORING
-#include "std-vector.hh"
-#include "stem-info.hh"
+#include "std-vector.hh"
+#include "stem-info.hh"
-enum Scorers {
+enum Scorers
+{
// Should be ordered by increasing expensiveness.
ORIGINAL_DISTANCE,
SLOPE_IDEAL,
Beam_configuration ();
bool done () const;
void add (Real demerit, const string &reason);
- static Beam_configuration* new_config(Interval start,
- Interval offset);
+ static Beam_configuration *new_config (Interval start,
+ Interval offset);
};
// Comparator for a queue of Beam_configuration*.
class Beam_configuration_less
{
public:
- bool operator() (Beam_configuration* const& l, Beam_configuration* const& r)
+ bool operator () (Beam_configuration *const &l, Beam_configuration *const &r)
{
// Invert
return l->demerits > r->demerits;
}
};
-
struct Beam_quant_parameters
{
Real SECONDARY_BEAM_DEMERIT;
Real IDEAL_SLOPE_FACTOR;
Real ROUND_TO_ZERO_SLOPE;
Real COLLISION_PENALTY;
- Real COLLISION_DISTANCE;
+ Real COLLISION_PADDING;
Real HORIZONTAL_INTER_QUANT_PENALTY;
Real STEM_COLLISION_FACTOR;
-
+
void fill (Grob *him);
};
-struct Beam_collision {
+struct Beam_collision
+{
Real x_;
Interval y_;
Real base_penalty_;
// Need to add beam_config->y to get actual offsets.
Interval beam_y_;
};
-
/*
Parameters for a single beam. Precomputed to save time in
scoring individual configurations.
- TODO - use trailing _ on data members.
-
*/
class Beam_scoring_problem
{
public:
- Beam_scoring_problem (Grob *me, Drul_array<Real> ys);
- Drul_array<Real> solve() const;
+ Beam_scoring_problem (Grob *me, Drul_array<Real> ys, bool);
+ Drul_array<Real> solve () const;
private:
- Grob *beam;
+ Spanner *beam_;
- Interval unquanted_y;
-
- Real staff_space;
- Real beam_thickness;
- Real line_thickness;
- Real musical_dy;
+ Interval unquanted_y_;
+ bool align_broken_intos_;
+ bool do_initial_slope_calculations_;
- Interval x_span;
-
- vector<Stem_info> stem_infos;
+ Real staff_space_;
+ Real beam_thickness_;
+ Real line_thickness_;
+ Real musical_dy_;
+ int normal_stem_count_;
+ Real x_span_;
/*
Do stem computations. These depend on YL and YR linearly, so we can
affine linear in YL and YR. If YL == YR == 0, then we might have
stem_y != 0.0, when we're cross staff.
*/
- vector<Real> base_lengths;
- vector<Real> stem_xpositions;
-
- Grob *common[2];
- bool is_xstaff;
- bool is_knee;
+ vector<Stem_info> stem_infos_;
+ vector<Real> chord_start_y_;
+ vector<Interval> head_positions_;
+ vector<Slice> beam_multiplicity_;
+ vector<bool> is_normal_;
+ vector<Real> base_lengths_;
+ vector<Real> stem_xpositions_;
+ vector<Real> stem_ypositions_;
- Beam_quant_parameters parameters;
+ bool is_xstaff_;
+ bool is_knee_;
- Real staff_radius;
- Drul_array<int> edge_beam_counts;
- Drul_array<Direction> edge_dirs;
+ Beam_quant_parameters parameters_;
+
+ Real staff_radius_;
+ Drul_array<int> edge_beam_counts_;
+ Drul_array<Direction> edge_dirs_;
// Half-open intervals, representing allowed positions for the beam,
// starting from close to the notehead to the direction of the stem
// end. This is used for quickly weeding out invalid
// Beam_configurations.
- Drul_array<Interval> quant_range;
- Real beam_translation;
+ Drul_array<Interval> quant_range_;
+ Real beam_translation_;
vector<Beam_collision> collisions_;
vector<Beam_segment> segments_;
-
- void init_stems ();
- void init_collisions (vector<Grob*> grobs);
+
+ vsize first_normal_index ();
+ vsize last_normal_index ();
+
+ void init_instance_variables (Grob *me, Drul_array<Real> ys, bool align_broken_intos);
void add_collision (Real x, Interval y, Real factor);
-
- void one_scorer (Beam_configuration* config) const;
+ void no_visible_stem_positions ();
+ void least_squares_positions ();
+ Real calc_concaveness ();
+ void slope_damping ();
+ void shift_region_to_valid ();
+
+ void one_scorer (Beam_configuration *config) const;
Beam_configuration *force_score (SCM inspect_quants,
- const vector<Beam_configuration*> &configs) const;
- Real y_at (Real x, Beam_configuration const* c) const;
+ const vector<Beam_configuration *> &configs) const;
+ Real y_at (Real x, Beam_configuration const *c) const;
// Scoring functions:
void score_forbidden_quants (Beam_configuration *config) const;
void score_slope_ideal (Beam_configuration *config) const;
void score_slope_direction (Beam_configuration *config) const;
void score_slope_musical (Beam_configuration *config) const;
- void score_stem_lengths (Beam_configuration* config) const;
- void generate_quants(vector<Beam_configuration*>* scores) const;
+ void score_stem_lengths (Beam_configuration *config) const;
+ void generate_quants (vector<Beam_configuration *> *scores) const;
void score_collisions (Beam_configuration *config) const;
};