LEFT | RIGHT |
1 ;;;; This file is part of LilyPond, the GNU music typesetter. | 1 ;;;; This file is part of LilyPond, the GNU music typesetter. |
2 ;;;; | 2 ;;;; |
3 ;;;; Copyright (C) 2008--2011 Reinhold Kainhofer <reinhold@kainhofer.com> | 3 ;;;; Copyright (C) 2008--2011 Reinhold Kainhofer <reinhold@kainhofer.com> |
4 ;;;; | 4 ;;;; |
5 ;;;; LilyPond is free software: you can redistribute it and/or modify | 5 ;;;; LilyPond is free software: you can redistribute it and/or modify |
6 ;;;; it under the terms of the GNU General Public License as published by | 6 ;;;; it under the terms of the GNU General Public License as published by |
7 ;;;; the Free Software Foundation, either version 3 of the License, or | 7 ;;;; the Free Software Foundation, either version 3 of the License, or |
8 ;;;; (at your option) any later version. | 8 ;;;; (at your option) any later version. |
9 ;;;; | 9 ;;;; |
10 ;;;; LilyPond is distributed in the hope that it will be useful, | 10 ;;;; LilyPond is distributed in the hope that it will be useful, |
11 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 ;;;; GNU General Public License for more details. | 13 ;;;; GNU General Public License for more details. |
14 ;;;; | 14 ;;;; |
15 ;;;; You should have received a copy of the GNU General Public License | 15 ;;;; You should have received a copy of the GNU General Public License |
16 ;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>. | 16 ;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>. |
17 | 17 |
18 ;;;; This file implements different flag styles in Scheme / GUILE, most | 18 ;;;; This file implements different flag styles in Scheme / GUILE, most |
19 ;;;; notably the old-straight-flag and the modern-straight-flag styles. | 19 ;;;; notably the old-straight-flag and the modern-straight-flag styles. |
20 | 20 |
21 | 21 |
22 (define-public (no-flag stem-grob) | 22 (define-public (no-flag grob) |
23 "No flag: Simply return empty stencil." | 23 "No flag: Simply return empty stencil." |
24 empty-stencil) | 24 empty-stencil) |
25 | 25 |
26 | 26 |
27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
28 ;;;; Straight flags | 28 ;;;; Straight flags |
29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
30 | 30 |
31 | 31 |
32 (define-public (add-stroke-straight stencil stem-grob dir log stroke-style | 32 (define-public (add-stroke-straight stencil grob dir log stroke-style |
33 offset length thickness stroke-thickness) | 33 offset length thickness stroke-thickness) |
34 "Add the stroke for acciaccatura to the given flag stencil. | 34 "Add the stroke for acciaccatura to the given flag stencil. |
35 The stroke starts for up-flags at `upper-end-of-flag + (0,length/2)' | 35 The stroke starts for up-flags at `upper-end-of-flag + (0,length/2)' |
36 and ends at `(0, vertical-center-of-flag-end) - | 36 and ends at `(0, vertical-center-of-flag-end) - |
37 (flag-x-width/2, flag-x-width + flag-thickness)'. Here `length' is the | 37 (flag-x-width/2, flag-x-width + flag-thickness)'. Here `length' is the |
38 whole length, while `flag-x-width' is just the x-extent and thus depends on | 38 whole length, while `flag-x-width' is just the x-extent and thus depends on |
39 the angle! Other combinations don't look as good. | 39 the angle! Other combinations don't look as good. |
40 | 40 |
41 For down-stems the y-coordinates are simply mirrored." | 41 For down-stems the y-coordinates are simply mirrored." |
42 (let* ((start (offset-add offset (cons 0 (* (/ length 2) dir)))) | 42 (let* ((stem-grob (ly:grob-parent grob X)) |
| 43 (start (offset-add offset (cons 0 (* (/ length 2) dir)))) |
43 (end (offset-add (cons 0 (cdr offset)) | 44 (end (offset-add (cons 0 (cdr offset)) |
44 (cons (- (/ (car offset) 2)) (* (- (+ thickness (car o
ffset))) dir)))) | 45 (cons (- (/ (car offset) 2)) (* (- (+ thickness (car o
ffset))) dir)))) |
45 (stroke (make-line-stencil stroke-thickness (car start) (cdr start) (ca
r end) (cdr end)))) | 46 (stroke (make-line-stencil stroke-thickness (car start) (cdr start) (ca
r end) (cdr end)))) |
46 (ly:stencil-add stencil stroke))) | 47 (ly:stencil-add stencil stroke))) |
47 | 48 |
48 (define (buildflag flag-stencil remain curr-stencil spacing) | 49 (define (buildflag flag-stencil remain curr-stencil spacing) |
49 "Internal function to recursively create a stencil with @code{remain} flags | 50 "Internal function to recursively create a stencil with @code{remain} flags |
50 from the single-flag stencil curr-stencil, which is already translated to | 51 from the single-flag stencil curr-stencil, which is already translated to |
51 the position of the previous flag position." | 52 the position of the previous flag position." |
52 (if (> remain 0) | 53 (if (> remain 0) |
53 (let* ((translated-stencil (ly:stencil-translate-axis curr-stencil spacing
Y)) | 54 (let* ((translated-stencil (ly:stencil-translate-axis curr-stencil spacing
Y)) |
54 (new-stencil (ly:stencil-add flag-stencil translated-stencil))) | 55 (new-stencil (ly:stencil-add flag-stencil translated-stencil))) |
55 (buildflag new-stencil (- remain 1) translated-stencil spacing)) | 56 (buildflag new-stencil (- remain 1) translated-stencil spacing)) |
56 flag-stencil)) | 57 flag-stencil)) |
57 | 58 |
58 (define-public (straight-flag flag-thickness flag-spacing | 59 (define-public (straight-flag flag-thickness flag-spacing |
59 upflag-angle upflag-length | 60 upflag-angle upflag-length |
60 downflag-angle downflag-length) | 61 downflag-angle downflag-length) |
61 "Create a stencil for a straight flag. @var{flag-thickness} and | 62 "Create a stencil for a straight flag. @var{flag-thickness} and |
62 @var{flag-spacing} are given in staff spaces, @var{upflag-angle} and | 63 @var{flag-spacing} are given in staff spaces, @var{upflag-angle} and |
63 @var{downflag-angle} are given in degrees, and @var{upflag-length} and | 64 @var{downflag-angle} are given in degrees, and @var{upflag-length} and |
64 @var{downflag-length} are given in staff spaces. | 65 @var{downflag-length} are given in staff spaces. |
65 | 66 |
66 All lengths are scaled according to the font size of the note." | 67 All lengths are scaled according to the font size of the note." |
67 | 68 |
68 (lambda (stem-grob) | 69 (lambda (grob) |
69 (let* ((log (ly:grob-property stem-grob 'duration-log)) | 70 (let* ((stem-grob (ly:grob-parent grob X)) |
| 71 (log (ly:grob-property stem-grob 'duration-log)) |
70 (dir (ly:grob-property stem-grob 'direction)) | 72 (dir (ly:grob-property stem-grob 'direction)) |
71 (stem-up (eqv? dir UP)) | 73 (stem-up (eqv? dir UP)) |
72 (layout (ly:grob-layout stem-grob)) | 74 (layout (ly:grob-layout grob)) |
73 ; scale with the note size (e.g. for grace notes) | 75 ; scale with the note size (e.g. for grace notes) |
74 (factor (magstep (ly:grob-property stem-grob 'font-size 0))) | 76 (factor (magstep (ly:grob-property grob 'font-size 0))) |
75 (grob-stem-thickness (ly:grob-property stem-grob 'thickness)) | 77 (grob-stem-thickness (ly:grob-property stem-grob 'thickness)) |
76 (line-thickness (ly:output-def-lookup layout 'line-thickness)) | 78 (line-thickness (ly:output-def-lookup layout 'line-thickness)) |
77 (half-stem-thickness (/ (* grob-stem-thickness line-thickness) 2)) | 79 (half-stem-thickness (/ (* grob-stem-thickness line-thickness) 2)) |
78 (raw-length (if stem-up upflag-length downflag-length)) | 80 (raw-length (if stem-up upflag-length downflag-length)) |
79 (angle (if stem-up upflag-angle downflag-angle)) | 81 (angle (if stem-up upflag-angle downflag-angle)) |
80 (flag-length (+ (* raw-length factor) half-stem-thickness)) | 82 (flag-length (+ (* raw-length factor) half-stem-thickness)) |
81 (flag-end (polar->rectangular flag-length angle)) | 83 (flag-end (polar->rectangular flag-length angle)) |
82 (thickness (* flag-thickness factor)) | 84 (thickness (* flag-thickness factor)) |
83 (thickness-offset (cons 0 (* -1 thickness dir))) | 85 (thickness-offset (cons 0 (* -1 thickness dir))) |
84 (spacing (* -1 flag-spacing factor dir )) | 86 (spacing (* -1 flag-spacing factor dir )) |
85 (start (cons (- half-stem-thickness) (* half-stem-thickness dir))) | 87 (start (cons (- half-stem-thickness) (* half-stem-thickness dir))) |
86 ; The points of a round-filled-polygon need to be given in clockwise | 88 ; The points of a round-filled-polygon need to be given in clockwise |
87 ; order, otherwise the polygon will be enlarged by blot-size*2! | 89 ; order, otherwise the polygon will be enlarged by blot-size*2! |
88 (points (if stem-up (list start flag-end | 90 (points (if stem-up (list start flag-end |
89 (offset-add flag-end thickness-offset) | 91 (offset-add flag-end thickness-offset) |
90 (offset-add start thickness-offset)) | 92 (offset-add start thickness-offset)) |
91 (list start | 93 (list start |
92 (offset-add start thickness-offset) | 94 (offset-add start thickness-offset) |
93 (offset-add flag-end thickness-offset) | 95 (offset-add flag-end thickness-offset) |
94 flag-end))) | 96 flag-end))) |
95 (stencil (ly:round-filled-polygon points half-stem-thickness)) | 97 (stencil (ly:round-filled-polygon points half-stem-thickness)) |
96 ; Log for 1/8 is 3, so we need to subtract 3 | 98 ; Log for 1/8 is 3, so we need to subtract 3 |
97 (flag-stencil (buildflag stencil (- log 3) stencil spacing)) | 99 (flag-stencil (buildflag stencil (- log 3) stencil spacing)) |
98 (stroke-style (ly:grob-property stem-grob 'stroke-style))) | 100 (stroke-style (ly:grob-property grob 'stroke-style))) |
99 (if (equal? stroke-style "grace") | 101 (if (equal? stroke-style "grace") |
100 (add-stroke-straight flag-stencil stem-grob | 102 (add-stroke-straight flag-stencil grob |
101 dir log | 103 dir log |
102 stroke-style | 104 stroke-style |
103 flag-end flag-length | 105 flag-end flag-length |
104 thickness | 106 thickness |
105 (* half-stem-thickness 2)) | 107 (* half-stem-thickness 2)) |
106 flag-stencil)))) | 108 flag-stencil)))) |
107 | 109 |
108 (define-public (modern-straight-flag stem-grob) | 110 (define-public (modern-straight-flag grob) |
109 "Modern straight flag style (for composers like Stockhausen, Boulez, etc.). | 111 "Modern straight flag style (for composers like Stockhausen, Boulez, etc.). |
110 The angles are 18 and 22 degrees and thus smaller than for the ancient style | 112 The angles are 18 and 22 degrees and thus smaller than for the ancient style |
111 of Bach, etc." | 113 of Bach, etc." |
112 ((straight-flag 0.55 1 -18 1.1 22 1.2) stem-grob)) | 114 ((straight-flag 0.55 1 -18 1.1 22 1.2) grob)) |
113 | 115 |
114 (define-public (old-straight-flag stem-grob) | 116 (define-public (old-straight-flag grob) |
115 "Old straight flag style (for composers like Bach). The angles of the | 117 "Old straight flag style (for composers like Bach). The angles of the |
116 flags are both 45 degrees." | 118 flags are both 45 degrees." |
117 ((straight-flag 0.55 1 -45 1.2 45 1.4) stem-grob)) | 119 ((straight-flag 0.55 1 -45 1.2 45 1.4) grob)) |
118 | 120 |
119 | 121 |
120 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 122 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
121 ;;;; Flags created from feta glyphs (normal and mensural flags) | 123 ;;;; Flags created from feta glyphs (normal and mensural flags) |
122 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 124 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
123 | 125 |
124 | 126 |
125 ; NOTE: By default, lilypond uses the C++ method Stem::calc-flag | 127 ; NOTE: By default, lilypond uses the C++ method Flag::stencil |
126 ; (ly:stem::calc-flag is the corresponding Scheme interface) to generate the | 128 ; (ly:flag::stencil is the corresponding Scheme interface) to generate the |
127 ; flag stencil. The following functions are simply a reimplementation in | 129 ; flag stencil. The following functions are simply a reimplementation in |
128 ; Scheme, so that one has that functionality available in Scheme, if one | 130 ; Scheme, so that one has that functionality available in Scheme, if one |
129 ; wants to write a flag style, which modifies one of the standard flags | 131 ; wants to write a flag style, which modifies one of the standard flags |
130 ; by some stencil operations. | 132 ; by some stencil operations. |
131 | 133 |
132 | 134 |
133 (define-public (add-stroke-glyph stencil stem-grob dir stroke-style flag-style) | 135 (define-public (add-stroke-glyph stencil grob dir stroke-style flag-style) |
134 "Load and add a stroke (represented by a glyph in the font) to the given | 136 "Load and add a stroke (represented by a glyph in the font) to the given |
135 flag stencil." | 137 flag stencil." |
136 (if (not (string? stroke-style)) | 138 (if (not (string? stroke-style)) |
137 stencil | 139 stencil |
138 ; Otherwise: look up the stroke glyph and combine it with the flag | 140 ; Otherwise: look up the stroke glyph and combine it with the flag |
139 (let* ((font-char (string-append "flags." flag-style dir stroke-style)) | 141 (let* ((stem-grob (ly:grob-parent grob X)) |
| 142 (font-char (string-append "flags." flag-style dir stroke-style)) |
140 (alt-font-char (string-append "flags." dir stroke-style)) | 143 (alt-font-char (string-append "flags." dir stroke-style)) |
141 (font (ly:grob-default-font stem-grob)) | 144 (font (ly:grob-default-font grob)) |
142 (tmpstencil (ly:font-get-glyph font font-char)) | 145 (tmpstencil (ly:font-get-glyph font font-char)) |
143 (stroke-stencil (if (ly:stencil-empty? tmpstencil) | 146 (stroke-stencil (if (ly:stencil-empty? tmpstencil) |
144 (ly:font-get-glyph font alt-font-char) | 147 (ly:font-get-glyph font alt-font-char) |
145 tmpstencil))) | 148 tmpstencil))) |
146 (if (ly:stencil-empty? stroke-stencil) | 149 (if (ly:stencil-empty? stroke-stencil) |
147 (begin | 150 (begin |
148 (ly:warning (_ "flag stroke `~a' or `~a' not found") font-char alt-fon
t-char) | 151 (ly:warning (_ "flag stroke `~a' or `~a' not found") font-char alt-fon
t-char) |
149 stencil) | 152 stencil) |
150 (ly:stencil-add stencil stroke-stencil))))) | 153 (ly:stencil-add stencil stroke-stencil))))) |
151 | 154 |
152 | 155 |
153 (define-public (retrieve-glyph-flag flag-style dir dir-modifier stem-grob) | 156 (define-public (retrieve-glyph-flag flag-style dir dir-modifier grob) |
154 "Load the correct flag glyph from the font." | 157 "Load the correct flag glyph from the font." |
155 (let* ((log (ly:grob-property stem-grob 'duration-log)) | 158 (let* ((stem-grob (ly:grob-parent grob X)) |
156 (font (ly:grob-default-font stem-grob)) | 159 (log (ly:grob-property stem-grob 'duration-log)) |
| 160 (font (ly:grob-default-font grob)) |
157 (font-char (string-append "flags." flag-style dir dir-modifier (number-
>string log))) | 161 (font-char (string-append "flags." flag-style dir dir-modifier (number-
>string log))) |
158 (flag (ly:font-get-glyph font font-char))) | 162 (flag (ly:font-get-glyph font font-char))) |
159 (if (ly:stencil-empty? flag) | 163 (if (ly:stencil-empty? flag) |
160 (ly:warning "flag ~a not found" font-char)) | 164 (ly:warning "flag ~a not found" font-char)) |
161 flag)) | 165 flag)) |
162 | 166 |
163 | 167 |
164 (define-public (create-glyph-flag flag-style dir-modifier stem-grob) | 168 (define-public (create-glyph-flag flag-style dir-modifier grob) |
165 "Create a flag stencil by looking up the glyph from the font." | 169 "Create a flag stencil by looking up the glyph from the font." |
166 (let* ((dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "u" "d")) | 170 (let* ((stem-grob (ly:grob-parent grob X)) |
167 (flag (retrieve-glyph-flag flag-style dir dir-modifier stem-grob)) | 171 (dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "u" "d")) |
168 (stroke-style (ly:grob-property stem-grob 'stroke-style))) | 172 (flag (retrieve-glyph-flag flag-style dir dir-modifier grob)) |
| 173 (stroke-style (ly:grob-property grob 'stroke-style))) |
169 (if (null? stroke-style) | 174 (if (null? stroke-style) |
170 flag | 175 flag |
171 (add-stroke-glyph flag stem-grob dir stroke-style flag-style)))) | 176 (add-stroke-glyph flag grob dir stroke-style flag-style)))) |
172 | 177 |
173 | 178 |
174 | 179 |
175 (define-public (mensural-flag stem-grob) | 180 (define-public (mensural-flag grob) |
176 "Mensural flags: Create the flag stencil by loading the glyph from the font. | 181 "Mensural flags: Create the flag stencil by loading the glyph from the font. |
177 Flags are always aligned with staff lines, so we need to check the end point | 182 Flags are always aligned with staff lines, so we need to check the end point |
178 of the stem: For stems ending on staff lines, use different flags than for | 183 of the stem: For stems ending on staff lines, use different flags than for |
179 notes between staff lines. The idea is that flags are always vertically | 184 notes between staff lines. The idea is that flags are always vertically |
180 aligned with the staff lines, regardless of whether the note head is on a | 185 aligned with the staff lines, regardless of whether the note head is on a |
181 staff line or between two staff lines. In other words, the inner end of | 186 staff line or between two staff lines. In other words, the inner end of |
182 a flag always touches a staff line." | 187 a flag always touches a staff line." |
183 | 188 |
184 (let* ((adjust #t) | 189 (let* ((stem-grob (ly:grob-parent grob X)) |
| 190 (adjust #t) |
185 (d (ly:grob-property stem-grob 'direction)) | 191 (d (ly:grob-property stem-grob 'direction)) |
186 (ss (ly:staff-symbol-staff-space stem-grob)) | 192 (ss (ly:staff-symbol-staff-space stem-grob)) |
187 (stem-end (inexact->exact (round (* (index-cell | 193 (stem-end (inexact->exact (round (* (index-cell |
188 (ly:grob-extent stem-grob | 194 (ly:grob-extent stem-grob |
189 stem-grob | 195 stem-grob |
190 Y) | 196 Y) |
191 d) | 197 d) |
192 (/ 2 ss))))) | 198 (/ 2 ss))))) |
193 ; For some reason the stem-end is a real instead of an integer... | 199 ; For some reason the stem-end is a real instead of an integer... |
194 (dir-modifier (if (ly:position-on-line? stem-grob stem-end) "1" "0")) | 200 (dir-modifier (if (ly:position-on-line? stem-grob stem-end) "1" "0")) |
195 (modifier (if adjust dir-modifier "2"))) | 201 (modifier (if adjust dir-modifier "2"))) |
196 (create-glyph-flag "mensural" modifier stem-grob))) | 202 (create-glyph-flag "mensural" modifier grob))) |
197 | 203 |
198 | 204 |
199 | 205 |
200 (define-public ((glyph-flag flag-style) stem-grob) | 206 (define-public ((glyph-flag flag-style) grob) |
201 "Simulatesthe default way of generating flags: Look up glyphs | 207 "Simulatesthe default way of generating flags: Look up glyphs |
202 @code{flags.style[ud][1234]} from the feta font and use it for the flag | 208 @code{flags.style[ud][1234]} from the feta font and use it for the flag |
203 stencil." | 209 stencil." |
204 (create-glyph-flag flag-style "" stem-grob)) | 210 (create-glyph-flag flag-style "" grob)) |
205 | 211 |
206 | 212 |
207 | 213 |
208 (define-public (normal-flag stem-grob) | 214 (define-public (normal-flag grob) |
209 "Create a default flag." | 215 "Create a default flag." |
210 (create-glyph-flag "" "" stem-grob)) | 216 (create-glyph-flag "" "" grob)) |
211 | 217 |
212 | 218 |
213 | 219 |
214 (define-public (default-flag stem-grob) | 220 (define-public (default-flag grob) |
215 "Create a flag stencil for the stem. Its style will be derived from the | 221 "Create a flag stencil for the stem. Its style will be derived from the |
216 @code{'flag-style} Stem property. By default, @code{lilypond} uses a | 222 @code{'style} Flag property. By default, @code{lilypond} uses a |
217 C++ Function (which is slightly faster) to do exactly the same as this | 223 C++ Function (which is slightly faster) to do exactly the same as this |
218 function. However, if one wants to modify the default flags, this function | 224 function. However, if one wants to modify the default flags, this function |
219 can be used to obtain the default flag stencil, which can then be modified | 225 can be used to obtain the default flag stencil, which can then be modified |
220 at will. The correct way to do this is: | 226 at will. The correct way to do this is: |
221 | 227 |
222 @example | 228 @example |
223 \\override Stem #'flag = #default-flag | 229 \\override Flag #'stencil = #default-flag |
224 \\override Stem #'flag-style = #'mensural | 230 \\override Flag #'style = #'mensural |
225 @end example | 231 @end example |
226 " | 232 " |
227 (let* ((flag-style-symbol (ly:grob-property stem-grob 'flag-style)) | 233 (let* ((stem-grob (ly:grob-parent grob X)) |
| 234 (flag-style-symbol (ly:grob-property grob 'style)) |
228 (flag-style (if (symbol? flag-style-symbol) | 235 (flag-style (if (symbol? flag-style-symbol) |
229 (symbol->string flag-style-symbol) | 236 (symbol->string flag-style-symbol) |
230 ""))) | 237 ""))) |
231 (cond | 238 (cond |
232 ((equal? flag-style "") (normal-flag stem-grob)) | 239 ((equal? flag-style "") (normal-flag grob)) |
233 ((equal? flag-style "mensural") (mensural-flag stem-grob)) | 240 ((equal? flag-style "mensural") (mensural-flag grob)) |
234 ((equal? flag-style "no-flag") (no-flag stem-grob)) | 241 ((equal? flag-style "no-flag") (no-flag grob)) |
235 (else ((glyph-flag flag-style) stem-grob))))) | 242 (else ((glyph-flag flag-style) grob))))) |
LEFT | RIGHT |