X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-layout-problem.cc;h=479ac72bf72ec1152a3b4bd78affeae26fe78262;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=5885a661359b6accd9055228bd11b10cf8f19f88;hpb=6eb8d8d2780b4b8e1228d94d845145f558240519;p=lilypond.git diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index 5885a66135..479ac72bf7 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2009--2012 Joe Neeman + Copyright (C) 2009--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,9 +33,10 @@ #include "skyline-pair.hh" #include "system.hh" #include "text-interface.hh" +#include "lily-imports.hh" /* - Returns the number of footntoes associated with a given line. + Returns the number of footnotes associated with a given line. */ vector @@ -44,7 +45,7 @@ Page_layout_problem::get_footnote_grobs (SCM lines) vector footnotes; for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s)) { - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); if (!sys) @@ -55,10 +56,10 @@ Page_layout_problem::get_footnote_grobs (SCM lines) extract_grob_set (sys, "footnotes-after-line-breaking", footnote_grobs); footnotes.insert (footnotes.end (), footnote_grobs.begin (), footnote_grobs.end ()); } - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) { SCM stencils = p->get_property ("footnotes"); - if (stencils == SCM_EOL) + if (scm_is_null (stencils)) continue; for (SCM st = stencils; scm_is_pair (st); st = scm_cdr (st)) footnotes.push_back (0); @@ -82,9 +83,9 @@ Page_layout_problem::get_footnotes_from_lines (SCM lines) return SCM_EOL; bool footnotes_added; - if (Grob *g = unsmob_grob (scm_car (lines))) + if (Grob *g = unsmob (scm_car (lines))) footnotes_added = !scm_is_null (g->get_property ("footnote-stencil")); - else if (Prob *p = unsmob_prob (scm_car (lines))) + else if (Prob *p = unsmob (scm_car (lines))) footnotes_added = !scm_is_null (p->get_property ("footnote-stencil")); else { @@ -100,9 +101,9 @@ Page_layout_problem::get_footnotes_from_lines (SCM lines) SCM out = SCM_EOL; for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s)) { - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) out = scm_cons (g->get_property ("footnote-stencil"), out); - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) out = scm_cons (p->get_property ("footnote-stencil"), out); else programming_error ("Systems on a page must be a prob or grob."); @@ -140,8 +141,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book number_footnote_table = SCM_EOL; SCM numbering_function = paper->c_variable ("footnote-numbering-function"); SCM layout = paper->self_scm (); - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper->self_scm ()); + SCM props = Lily::layout_extract_page_properties (layout); Real padding = robust_scm2double (paper->c_variable ("footnote-padding"), 0.0); Real number_raise = robust_scm2double (paper->c_variable ("footnote-number-raise"), 0.0); @@ -175,13 +175,13 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book } SCM markup = scm_call_1 (numbering_function, scm_from_int (counter)); SCM stencil = Text_interface::interpret_markup (layout, props, markup); - Stencil *st = unsmob_stencil (stencil); + Stencil *st = unsmob (stencil); if (!st) { programming_error ("Your numbering function needs to return a stencil."); markup = SCM_EOL; stencil = Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL).smobbed_copy (); - st = unsmob_stencil (stencil); + st = unsmob (stencil); } in_text_numbers = scm_cons (markup, in_text_numbers); numbers = scm_cons (stencil, numbers); @@ -202,7 +202,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book for (SCM p = numbers; scm_is_pair (p); p = scm_cdr (p)) { - Stencil *st = unsmob_stencil (scm_car (p)); + Stencil *st = unsmob (scm_car (p)); if (!st->extent (X_AXIS).is_empty ()) st->translate_axis ((max_length - st->extent (X_AXIS)[RIGHT]), X_AXIS); @@ -213,7 +213,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s)) { // Take care of musical systems. - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); if (!sys) @@ -232,13 +232,12 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book if (orig->is_broken ()) footnote_markup = orig->broken_intos_[0]->get_property ("footnote-text"); - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper->self_scm ()); + SCM props = Lily::layout_extract_page_properties (paper->self_scm ()); SCM footnote_stl = Text_interface::interpret_markup (paper->self_scm (), props, footnote_markup); - Stencil footnote_stencil = *unsmob_stencil (footnote_stl); + Stencil footnote_stencil = *unsmob (footnote_stl); bool do_numbering = to_boolean (footnote->get_property ("automatically-numbered")); if (Spanner *orig = dynamic_cast(footnote)) { @@ -259,7 +258,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book orig->broken_intos_[i]->set_property ("text", annotation_scm); } - Stencil annotation = *unsmob_stencil (scm_car (numbers)); + Stencil annotation = *unsmob (scm_car (numbers)); annotation.translate_axis ((footnote_stencil.extent (Y_AXIS)[UP] + number_raise - annotation.extent (Y_AXIS)[UP]), @@ -280,24 +279,24 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book sys->set_property ("footnote-stencil", mol.smobbed_copy ()); } // Take care of top-level markups - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) { SCM stencils = p->get_property ("footnotes"); Stencil mol; for (SCM st = stencils; scm_is_pair (st); st = scm_cdr (st)) { - Stencil footnote_stencil = *unsmob_stencil (scm_caddar (st)); + Stencil footnote_stencil = *unsmob (scm_caddar (st)); bool do_numbering = to_boolean (scm_cadar (st)); SCM in_text_stencil = Stencil ().smobbed_copy (); if (do_numbering) { - Stencil annotation = *unsmob_stencil (scm_car (numbers)); + Stencil annotation = *unsmob (scm_car (numbers)); SCM in_text_annotation = scm_car (in_text_numbers); in_text_stencil = Text_interface::interpret_markup (layout, props, in_text_annotation); - if (!unsmob_stencil (in_text_stencil)) + if (!unsmob (in_text_stencil)) in_text_stencil = SCM_EOL; annotation.translate_axis ((footnote_stencil.extent (Y_AXIS)[UP] + number_raise @@ -324,8 +323,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book Stencil Page_layout_problem::get_footnote_separator_stencil (Output_def *paper) { - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper->self_scm ()); + SCM props = Lily::layout_extract_page_properties (paper->self_scm ()); SCM markup = paper->c_variable ("footnote-separator-markup"); @@ -335,7 +333,7 @@ Page_layout_problem::get_footnote_separator_stencil (Output_def *paper) SCM footnote_stencil = Text_interface::interpret_markup (paper->self_scm (), props, markup); - Stencil *footnote_separator = unsmob_stencil (footnote_stencil); + Stencil *footnote_separator = unsmob (footnote_stencil); return footnote_separator ? *footnote_separator : Stencil (); } @@ -352,7 +350,7 @@ Page_layout_problem::add_footnotes_to_footer (SCM footnotes, Stencil foot, Paper for (SCM s = footnotes; scm_is_pair (s); s = scm_cdr (s)) { - Stencil *stencil = unsmob_stencil (scm_car (s)); + Stencil *stencil = unsmob (scm_car (s)); if (!stencil) continue; @@ -377,7 +375,7 @@ Page_layout_problem::add_footnotes_to_footer (SCM footnotes, Stencil foot, Paper Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM systems) : bottom_skyline_ (DOWN) { - Prob *page = unsmob_prob (page_scm); + Prob *page = unsmob (page_scm); bottom_loose_baseline_ = 0; header_height_ = 0; footer_height_ = 0; @@ -388,8 +386,8 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst if (page) { - Stencil *head = unsmob_stencil (page->get_property ("head-stencil")); - Stencil *foot = unsmob_stencil (page->get_property ("foot-stencil")); + Stencil *head = unsmob (page->get_property ("head-stencil")); + Stencil *foot = unsmob (page->get_property ("foot-stencil")); Stencil foot_stencil = foot ? *foot : Stencil (); @@ -433,7 +431,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst markup_markup_spacing = paper->c_variable ("markup-markup-spacing"); last_bottom_spacing = paper->c_variable ("last-bottom-spacing"); top_system_spacing = paper->c_variable ("top-system-spacing"); - if (scm_is_pair (systems) && unsmob_prob (scm_car (systems))) + if (scm_is_pair (systems) && unsmob (scm_car (systems))) top_system_spacing = paper->c_variable ("top-markup-spacing"); // Note: the page height here does _not_ reserve space for headers and @@ -451,9 +449,9 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst for (SCM s = systems; scm_is_pair (s); s = scm_cdr (s)) { - bool first = (s == systems); + bool first = scm_is_eq (s, systems); - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); if (!sys) @@ -479,7 +477,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst append_system (sys, spring, indent, padding); last_system_was_title = false; } - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) { SCM spec = first ? top_system_spacing : (last_system_was_title ? markup_markup_spacing : score_markup_spacing); @@ -538,7 +536,7 @@ Page_layout_problem::set_footer_height (Real height) void Page_layout_problem::append_system (System *sys, Spring const &spring, Real indent, Real padding) { - Grob *align = unsmob_grob (sys->get_object ("vertical-alignment")); + Grob *align = unsmob (sys->get_object ("vertical-alignment")); if (!align) return; @@ -554,7 +552,7 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde build_system_skyline (elts, minimum_offsets_with_min_dist, &up_skyline, &down_skyline); up_skyline.shift (indent); down_skyline.shift (indent); - Stencil *in_note_stencil = unsmob_stencil (sys->get_property ("in-note-stencil")); + Stencil *in_note_stencil = unsmob (sys->get_property ("in-note-stencil")); if (in_note_stencil && in_note_stencil->extent (Y_AXIS).length () > 0) { @@ -587,7 +585,7 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde // store the minimum distance, considering relative indents, // for a loose line Skyline first_skyline (UP); - Skyline_pair *sky = Skyline_pair::unsmob (elts[0]->get_property ("vertical-skylines")); + Skyline_pair *sky = unsmob (elts[0]->get_property ("vertical-skylines")); if (sky) first_skyline.merge ((*sky)[UP]); first_skyline.shift (indent); @@ -659,7 +657,7 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde void Page_layout_problem::append_prob (Prob *prob, Spring const &spring, Real padding) { - Skyline_pair *sky = Skyline_pair::unsmob (prob->get_property ("vertical-skylines")); + Skyline_pair *sky = unsmob (prob->get_property ("vertical-skylines")); Real minimum_distance = 0; bool tight_spacing = to_boolean (prob->get_property ("tight-spacing")); @@ -669,7 +667,7 @@ Page_layout_problem::append_prob (Prob *prob, Spring const &spring, Real padding bottom_loose_baseline_); bottom_skyline_ = (*sky)[DOWN]; } - else if (Stencil *sten = unsmob_stencil (prob->get_property ("stencil"))) + else if (Stencil *sten = unsmob (prob->get_property ("stencil"))) { Interval iv = sten->extent (Y_AXIS); minimum_distance = iv[UP] - bottom_skyline_.max_height (); @@ -728,12 +726,12 @@ Page_layout_problem::solve_rod_spring_problem (bool ragged, Real fixed_force) Real overflow = spacer.configuration_length (spacer.force ()) - page_height_; if (ragged && overflow < 1e-6) - warning (_ ("cannot fit music on page: ragged-spacing was requested, but page was compressed")); + warning (_ ("ragged-bottom was specified, but page must be compressed")); else { - warning (_f ("cannot fit music on page: overflow is %f", + warning (_f ("compressing over-full page by %.1f staff-spaces", overflow)); - warning (_ ("compressing music to fit")); + force_ = -infinity_f; vsize space_count = solution_.size (); Real spacing_increment = overflow / (space_count - 2); for (vsize i = 2; i < space_count; i++) @@ -772,7 +770,7 @@ Page_layout_problem::find_system_offsets () { *tail = scm_cons (scm_from_double (solution_[spring_idx]), SCM_EOL); tail = SCM_CDRLOC (*tail); - Interval prob_extent = unsmob_stencil (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS); + Interval prob_extent = unsmob (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS); // Lay out any non-spaceable lines between this line and // the last one. @@ -991,7 +989,7 @@ Page_layout_problem::build_system_skyline (vector const &staves, { Real dy = minimum_translations[i] - first_translation; Grob *g = staves[i]; - Skyline_pair *sky = Skyline_pair::unsmob (g->get_property ("vertical-skylines")); + Skyline_pair *sky = unsmob (g->get_property ("vertical-skylines")); if (sky) { up->raise (-dy); @@ -1025,7 +1023,7 @@ Page_layout_problem::build_system_skyline (vector const &staves, Interval Page_layout_problem::prob_extent (Prob *p) { - Stencil *sten = unsmob_stencil (p->get_property ("stencil")); + Stencil *sten = unsmob (p->get_property ("stencil")); return sten ? sten->extent (Y_AXIS) : Interval (0, 0); } @@ -1234,7 +1232,7 @@ Page_layout_problem::filter_dead_elements (vector const &input) vector output; for (vsize i = 0; i < input.size (); ++i) { - if (Hara_kiri_group_spanner::has_interface (input[i])) + if (has_interface (input[i])) Hara_kiri_group_spanner::consider_suicide (input[i]); if (input[i]->is_live ())