Spaces:
Sleeping
Sleeping
File size: 7,177 Bytes
f65fe85 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
%!PS-Adobe-2.0
%
% Functions for direct and embedded PostScript
%
% This file is part of LilyPond, the GNU music typesetter.
%
% Copyright (C) 1998-2006 Han-Wen Nienhuys <[email protected]>,
% 2013-2019 David Kastrup <[email protected]>
%
% 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 <http://www.gnu.org/licenses/>.
%
% Careful with double % as comment prefix.
% Any %%X comment is interpreted as DSC comments.
% TODO: use dicts or prefixes to prevent namespace pollution.
/pdfmark where
{pop} {userdict /pdfmark /cleartomark load put} ifelse
% llx lly urx ury URI
/mark_URI
{
/uri exch def
/ury exch def
/urx exch def
/lly exch def
/llx exch def
[
/Rect [ llx lly urx ury ]
/Border [ 0 0 0 ]
/Action
<<
/Subtype /URI
/URI uri
>>
/Subtype /Link
/ANN
pdfmark
}
bind def
% llx lly urx ury page
/mark_page_link
{
/page exch def
/ury exch def
/urx exch def
/lly exch def
/llx exch def
[
/Rect [ llx lly urx ury ]
/Border [ 0 0 0 ]
/Page page
/Subtype /Link
/ANN
pdfmark
}
bind def
% from adobe tech note 5002.
/BeginEPSF { %def
/b4_Inc_state save def % Save state for cleanup
/dict_count countdictstack def % Count objects on dict stack
/op_count count 1 sub def % Count objects on operand stack
userdict begin % Push userdict on dict stack
/showpage { } def % Redefine showpage, { } = null proc
0 setgray 0 setlinecap % Prepare graphics state
1 setlinewidth 0 setlinejoin
10 setmiterlimit [ ] 0 setdash newpath
false setoverprint
} bind def
/EndEPSF { %def
count op_count sub {pop} repeat % Clean up stacks
countdictstack dict_count sub {end} repeat
b4_Inc_state restore
} bind def
/stroke_and_fill? {
{
gsave
false setstrokeadjust
stroke
grestore
fill
}
{
stroke
}
ifelse
} bind def
/vector_add { % x1 y1 x2 y2 vector_add x1+x2 y1+y2
exch
4 1 roll
add
3 1 roll
add
exch
} bind def
/draw_round_box % width height x y blot
{
dup 0 lt { pop 0 } if setlinewidth
matrix currentmatrix 5 1 roll
currentpoint translate newpath translate
2 copy dup 0 gt { pop 0 } if exch dup 0 gt { pop 0 } if exch translate
abs exch abs exch
currentlinewidth 0 eq
{ % straight corners
2 copy 2 mul gt
{ % horizontal
0 1 index 2 div moveto
setlinewidth
0 rlineto
0 setlinecap
stroke
}
{
2 copy exch 2 mul gt
{ % vertical
1 index 2 div 0 moveto
exch setlinewidth
0 exch rlineto
0 setlinecap
stroke
}
{
0 0 4 2 roll rectfill
}
ifelse
}
ifelse
}
{ % rounded corners
2 copy 0 eq exch 0 eq or
{ % line shape
0 0 moveto
rlineto
1 setlinecap
stroke
0 setlinecap
}
{ % full shape
currentstrokeadjust {
currentlinewidth 2 div
0 0 2 index 180 270 arc
2 index 0 2 index 270 360 arc
3 copy 0 90 arc
0 2 index 3 -1 roll 90 180 arc
closepath
2 copy 2 mul gt
{ % horizontal
2 copy add currentlinewidth add 10 add % large enough
0 1 index neg moveto
2 index 1 index neg lineto
2 index 1 index lineto
0 exch lineto closepath
gsave clip newpath
0 1 index 2 div moveto
currentlinewidth add setlinewidth
0 rlineto
2 setlinecap
stroke
grestore
}
{
2 copy exch 2 mul gt
{ % vertical
2 copy add currentlinewidth add 10 add % large enough
dup neg 0 moveto
dup 0 lineto
dup 2 index lineto
neg 1 index lineto closepath
gsave clip newpath
1 index 2 div 0 moveto
exch currentlinewidth add setlinewidth
0 exch rlineto
2 setlinecap
stroke
grestore
}
{
pop pop
fill
}
ifelse
}
ifelse
newpath
}
{
1 setlinejoin
0 0 4 2 roll 4 copy rectstroke rectfill
}
ifelse
}
ifelse
}
ifelse
setmatrix
} bind def
/draw_polygon % fill? x(n) y(n) x(n-1) y(n-1) ... x(0) y(0) n blot
{
setlinewidth %set to blot
0 setlinecap
1 setlinejoin
3 1 roll
/polygon_x
currentpoint
/polygon_y exch def
def
rmoveto % x(0) y(0)
{ polygon_x polygon_y vector_add lineto } repeat % n times
closepath
stroke_and_fill?
} bind def
/draw_circle % filled? radius thickness draw_circle
{
setlinewidth % f? r
currentpoint % f? r x0 y0
3 2 roll % f? x0 y0 r
dup 0 rmoveto
0 360 arc closepath
stroke_and_fill?
} bind def
/draw_ellipse % filled? x-radius y-radius thickness draw_ellipse
{
setlinewidth % f? x-r y-r
/savematrix matrix currentmatrix def
scale % f?
currentpoint
1 0 rmoveto
1 0 360 arc closepath
savematrix setmatrix
stroke_and_fill?
} bind def
/draw_partial_ellipse % filled connect x-radius y-radius startangle endangle thickness draw_partial_ellipse
% Note that filled is not boolean to permit for different graylevels (ie for trill keys)
{
gsave
currentpoint translate
/thickness exch def
/endangle exch def
/startangle exch def
/y_radius exch def
/x_radius exch def
/endrad x_radius y_radius mul
x_radius x_radius mul
endangle cos endangle cos mul mul
y_radius y_radius mul
endangle sin endangle sin mul mul add sqrt div def
/endangle endangle sin endrad mul y_radius div
endangle cos endrad mul x_radius div atan def
/startrad x_radius y_radius mul
x_radius x_radius mul
startangle cos startangle cos mul mul
y_radius y_radius mul
startangle sin startangle sin mul mul add sqrt div def
/startangle startangle sin startrad mul y_radius div
startangle cos startrad mul x_radius div atan def
/connect exch def
/filled exch def
/savematrix matrix currentmatrix def
thickness setlinewidth
x_radius y_radius scale
startangle cos startangle sin moveto
0 0 1 startangle
startangle endangle eq { endangle 360 add } { endangle } ifelse
arc
connect {
startangle cos startangle sin moveto endangle cos endangle sin lineto }
if
savematrix setmatrix filled stroke_and_fill?
grestore
} bind def
/draw_line % dx dy x1 y1 thickness draw_line
{
setlinewidth % dx dy x1 y1
1 setlinecap
rmoveto % dx dy
rlineto
stroke
} bind def
/draw_dashed_line % dx dy thickness dashpattern offset draw_dashed_line
{
1 setlinecap
setdash % dx dy thickness
setlinewidth %dx dy
rlineto
stroke
[] 0 setdash % reset dash pattern
} bind def
/print_glyphs % w dx dy glyph print_glyphs
{
{
currentpoint %w dx dy glyph x0 y0
5 2 roll %w x0 y0 dx dy glyph
3 1 roll %w x0 y0 glyph dx dy
rmoveto %w x0 y0 glyph
glyphshow %w x0 y0
moveto %w
0 rmoveto
}repeat
}bind def
%end music-drawing-routines.ps
|