summaryrefslogtreecommitdiff
path: root/scm
diff options
context:
space:
mode:
authorThomas Morley <thomasmorley65@gmail.com>2016-01-25 00:53:34 +0100
committerThomas Morley <thomasmorley65@gmail.com>2016-01-30 13:33:34 +0100
commit5b2517c7f542a333fdfbfe9e0f15d2ac8fc4d8d1 (patch)
treed8c2b39d6c6caef899381a2eade8170c8d2d6e86 /scm
parent6f4466e43d9b85478f1d4b1d911d4b600743d595 (diff)
make select-head-glyph and note-head::calc-glyph-name more robust
Issue 4753 In case style is not a symbol.
Diffstat (limited to 'scm')
-rw-r--r--scm/output-lib.scm102
1 files changed, 55 insertions, 47 deletions
diff --git a/scm/output-lib.scm b/scm/output-lib.scm
index dcec6ae939..733531c3c7 100644
--- a/scm/output-lib.scm
+++ b/scm/output-lib.scm
@@ -395,56 +395,64 @@
(define-public (select-head-glyph style log)
"Select a note head glyph string based on note head style @var{style}
and duration-log @var{log}."
- (case style
- ;; "default" style is directly handled in note-head.cc as a
- ;; special case (HW says, mainly for performance reasons).
- ;; Therefore, style "default" does not appear in this case
- ;; statement. -- jr
- ((xcircle) "2xcircle")
- ((harmonic) "0harmonic")
- ((harmonic-black) "2harmonic")
- ((harmonic-mixed) (if (<= log 1) "0harmonic"
- "2harmonic"))
- ((baroque)
- ;; Oops, I actually would not call this "baroque", but, for
- ;; backwards compatibility to 1.4, this is supposed to take
- ;; brevis, longa and maxima from the neo-mensural font and all
- ;; other note heads from the default font. -- jr
- (if (< log 0)
- (string-append (number->string log) "neomensural")
- (number->string log)))
- ((altdefault)
- ;; Like default, but brevis is drawn with double vertical lines
- (if (= log -1)
- (string-append (number->string log) "double")
- (number->string log)))
- ((mensural)
- (string-append (number->string log) (symbol->string style)))
- ((petrucci)
- (if (< log 0)
- (string-append (number->string log) "mensural")
- (string-append (number->string log) (symbol->string style))))
- ((blackpetrucci)
- (if (< log 0)
- (string-append (number->string log) "blackmensural")
- (string-append (number->string log) (symbol->string style))))
- ((semipetrucci)
- (if (< log 0)
- (string-append (number->string log) "semimensural")
- (string-append (number->string log) "petrucci")))
- ((neomensural)
- (string-append (number->string log) (symbol->string style)))
- ((kievan)
- (string-append (number->string log) "kievan"))
- (else
- (if (string-match "vaticana*|hufnagel*|medicaea*" (symbol->string style))
- (symbol->string style)
- (string-append (number->string (max 0 log))
- (symbol->string style))))))
+ (if (symbol? style)
+ (case style
+ ;; "default" style is directly handled in note-head.cc as a
+ ;; special case (HW says, mainly for performance reasons).
+ ;; Therefore, style "default" does not appear in this case
+ ;; statement. -- jr
+ ;; Though we not to care if style is '(), see below. -- harm
+ ((xcircle) "2xcircle")
+ ((harmonic) "0harmonic")
+ ((harmonic-black) "2harmonic")
+ ((harmonic-mixed) (if (<= log 1) "0harmonic"
+ "2harmonic"))
+ ((baroque)
+ ;; Oops, I actually would not call this "baroque", but, for
+ ;; backwards compatibility to 1.4, this is supposed to take
+ ;; brevis, longa and maxima from the neo-mensural font and all
+ ;; other note heads from the default font. -- jr
+ (if (< log 0)
+ (string-append (number->string log) "neomensural")
+ (number->string log)))
+ ((altdefault)
+ ;; Like default, but brevis is drawn with double vertical lines
+ (if (= log -1)
+ (string-append (number->string log) "double")
+ (number->string log)))
+ ((mensural)
+ (string-append (number->string log) (symbol->string style)))
+ ((petrucci)
+ (if (< log 0)
+ (string-append (number->string log) "mensural")
+ (string-append (number->string log) (symbol->string style))))
+ ((blackpetrucci)
+ (if (< log 0)
+ (string-append (number->string log) "blackmensural")
+ (string-append (number->string log) (symbol->string style))))
+ ((semipetrucci)
+ (if (< log 0)
+ (string-append (number->string log) "semimensural")
+ (string-append (number->string log) "petrucci")))
+ ((neomensural)
+ (string-append (number->string log) (symbol->string style)))
+ ((kievan)
+ (string-append (number->string log) "kievan"))
+ (else
+ (if (string-match "vaticana*|hufnagel*|medicaea*"
+ (symbol->string style))
+ (symbol->string style)
+ (string-append (number->string (max 0 log))
+ (symbol->string style)))))
+ ;; 'vaticana-ligature-interface has a 'glyph-name-property for NoteHead.
+ ;; Probably best to return an empty list here, if called in a context
+ ;; without setting 'style, i.e. 'style is '(), to avoid a scheme-error.
+ '()))
(define-public (note-head::calc-glyph-name grob)
(let* ((style (ly:grob-property grob 'style))
- (log (if (string-match "kievan*" (symbol->string style))
+ (log (if (and (symbol? style)
+ (string-match "kievan*" (symbol->string style)))
(min 3 (ly:grob-property grob 'duration-log))
(min 2 (ly:grob-property grob 'duration-log)))))
(select-head-glyph style log)))