From 3e958aa906558831211e954cc2648666c85d39b7 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Fri, 19 Mar 2004 17:12:27 +0000 Subject: [PATCH] (ly:optimal-page-breaks): Bugfix: underful solutions are now optimal too. --- ChangeLog | 3 +++ input/test/title-markup.ly | 8 +++----- scm/page-layout.scm | 41 ++++++++++++-------------------------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a9d506247..a01fa81a8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2004-03-19 Jan Nieuwenhuizen + * scm/page-layout.scm (ly:optimal-page-breaks): Bugfix: underful + solutions are now optimal too. + * lily/paper-outputter.cc (Paper_outputter): Import page breaking functions into safe module. diff --git a/input/test/title-markup.ly b/input/test/title-markup.ly index 5caa3076dc..9d0a77689b 100644 --- a/input/test/title-markup.ly +++ b/input/test/title-markup.ly @@ -82,11 +82,9 @@ spaceTest = \markup { "two space chars" } \score { \context Staff \notes \relative c' { - %% stress page breaking: keep on 3 pages - %% 35 looks very good: 3 pages - %% Hmmm. - %% 36 seems to show a bug: - %% 4 pages, first two half full, last two full + %% stress page breaking: + %% 35 keep on 3 pages + %% 36 spread evenly over 4 pages \repeat unfold 35 { a b c d \break } c1 } diff --git a/scm/page-layout.scm b/scm/page-layout.scm index 133032a37a..0c75b5e58a 100644 --- a/scm/page-layout.scm +++ b/scm/page-layout.scm @@ -220,17 +220,6 @@ (mean (/ (apply + densities) (length densities))) (diff (map (lambda (x) (- x mean)) densities)) (var (map sqr (map (lambda (x) (* (car p-heights) x)) diff)))) - (if #f - (begin - (format (current-error-port) "\nDENSITIES") - (format (current-error-port) "lines: ~S\n" - (map robust-line-number height-nodes)) - (format (current-error-port) "page-heighs: ~S\n" p-heights) - (format (current-error-port) "heights: ~S\n" heights) - (format (current-error-port) "densities: ~S\n" densities) - (format (current-error-port) "mean: ~S\n" mean) - (format (current-error-port) "diff: ~S\n" diff) - (format (current-error-port) "density-var: ~S\n" var))) (apply + var))) (define (walk-paths best node lines nodes paths) @@ -247,24 +236,22 @@ (path-score (if (null? paths) 0 (node-score (car paths)))) (score (add-scores path-score this-score))) - (if #f - (begin - (format (current-error-port) "page-score: ~S\n" page-score) - (format (current-error-port) "density-score: ~S\n" density-score) - (format (current-error-port) "this-score: ~S\n" this-score))) - (if (and (>= score 0) - (or (< score (node-score best)) + (or (<= score (node-score best)) (= (node-score best) -1))) (begin (set! (node-score best) score) (set! (node-page best) next-page) (set! (node-height best) height) - (set! (node-prev best) node))) - - (if (null? nodes) + (set! (node-prev best) (car paths)))) + + (if (or (null? nodes) + ;; short circuit + (and (= path-score -1) + (> (- (/ height page) 1) MAX-CRAMP))) best - (walk-paths best (car paths) (cons (node-line node) lines) + (walk-paths best (car nodes) + (cons (node-line (car paths)) lines) (cdr nodes) (cdr paths))))) (define (walk-lines lines nodes paths) @@ -273,9 +260,8 @@ (let* ((prev (node-prev (car nodes))) (this (make-node prev (car lines) 0 INFINITY)) (next (make-node this (cadr lines) 0 0)) - (best (walk-paths this (car paths) - (list (node-line (car nodes))) - (cddr nodes) (cdr paths)))) + (best (walk-paths this prev (list (node-line (car nodes))) + (cddr nodes) paths))) (walk-lines (cdr lines) (cons next nodes) (cons best paths))))) (let* ((dummy (make-node '() '() 0 0)) @@ -288,8 +274,7 @@ (format (current-error-port) "ESTIMATE: ~S\n" (/ book-height text-height)) (format (current-error-port) "breaks: ~S\n" breaks) + ;; TODO: if solution is bad return no breaks and revert to + ;; ragged bottom (force-output (current-error-port)) - - (if #f (format (current-error-port) "scores: ~S\n" (map node-score path))) - (list->vector breaks))) -- 2.39.5