X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdot-configuration.cc;h=940420c31255fa541d07e49a70da595909654fc3;hb=8e427e706929b903b6b7d0c3c7858c95ccf72c77;hp=7676c14dd4cc3628d804b20016c147464d8aa862;hpb=5027fa60c3a76dc406fb1ba8fb4a0e24c2ccf38e;p=lilypond.git diff --git a/lily/dot-configuration.cc b/lily/dot-configuration.cc index 7676c14dd4..940420c312 100644 --- a/lily/dot-configuration.cc +++ b/lily/dot-configuration.cc @@ -1,17 +1,27 @@ /* - dot-implement.cc -- declare Dot_configuration + This file is part of LilyPond, the GNU music typesetter. - Source file of the GNU LilyPond music typesetter. Distributed under - terms of the GNU General Public License. LilyPond comes with NO - WARRANTY. + Copyright (C) 1997--2012 Han-Wen Nienhuys - (c) 1997--2007 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ +#include #include "dot-configuration.hh" +#include "dot-formatting-problem.hh" #include "staff-symbol-referencer.hh" - int Dot_configuration::badness () const { @@ -23,16 +33,11 @@ Dot_configuration::badness () const int demerit = sqr (p - i->second.pos_) * 2; int dot_move_dir = sign (p - i->second.pos_); - if (i->second.extremal_head_) - { - if (i->second.dir_ - && dot_move_dir != i->second.dir_) - demerit += 3; - else if (dot_move_dir != UP) - demerit += 2; - } + if (i->second.dir_ + && dot_move_dir != i->second.dir_) + demerit += 2; else if (dot_move_dir != UP) - demerit += 1; + demerit += 1; t += demerit; } @@ -47,7 +52,7 @@ Dot_configuration::print () const for (Dot_configuration::const_iterator i (begin ()); i != end (); i++) printf ("%d, ", i->first); - printf ("} \n"); + printf ("}\n"); } /* @@ -60,61 +65,61 @@ Dot_configuration::print () const Dot_configuration Dot_configuration::shifted (int k, Direction d) const { - Dot_configuration new_cfg; + Dot_configuration new_cfg (*problem_); int offset = 0; if (d > 0) { for (Dot_configuration::const_iterator i (begin ()); - i != end (); i++) - { - int p = i->first; - if (p == k) - { - if (Staff_symbol_referencer::on_line (i->second.dot_, p)) - p += d; - else - p += 2* d; - - offset = 2*d; - - new_cfg[p] = i->second; - } - else - { - if (new_cfg.find (p) == new_cfg.end ()) - offset = 0; - new_cfg[p + offset] = i->second; - } - } + i != end (); i++) + { + int p = i->first; + if (p == k) + { + if (Staff_symbol_referencer::on_line (i->second.dot_, p)) + p += d; + else + p += 2 * d; + + offset = 2 * d; + + new_cfg[p] = i->second; + } + else + { + if (new_cfg.find (p) == new_cfg.end ()) + offset = 0; + new_cfg[p + offset] = i->second; + } + } } else { Dot_configuration::const_iterator i (end ()); do - { - i--; - - int p = i->first; - if (p == k) - { - if (Staff_symbol_referencer::on_line (i->second.dot_, p)) - p += d; - else - p += 2* d; - - offset = 2*d; - - new_cfg[p] = i->second; - } - else - { - if (new_cfg.find (p) == new_cfg.end ()) - offset = 0; - - new_cfg[p + offset] = i->second; - } - } + { + i--; + + int p = i->first; + if (p == k) + { + if (Staff_symbol_referencer::on_line (i->second.dot_, p)) + p += d; + else + p += 2 * d; + + offset = 2 * d; + + new_cfg[p] = i->second; + } + else + { + if (new_cfg.find (p) == new_cfg.end ()) + offset = 0; + + new_cfg[p + offset] = i->second; + } + } while (i != begin ()); } @@ -141,3 +146,19 @@ Dot_configuration::remove_collision (int p) *this = (b_up < b_down) ? cfg_up : cfg_down; } } + +Dot_configuration::Dot_configuration (Dot_formatting_problem const &problem) +{ + problem_ = &problem; +} + +Real +Dot_configuration::x_offset () const +{ + Real off = 0.0; + for (Dot_configuration::const_iterator i (begin ()); + i != end (); i++) + off = max (off, problem_->head_skyline_.height ((*i).first)); + + return off; +}