Docs: NR 2.4 Fretted: Add ref to Harmonics
[lilypond/mpolesky.git] / ps / music-drawing-routines.ps
blob762657508449c1ef4cff795575fc9be9dc26f26b
1 %!PS-Adobe-1.0: music-drawing-routines.ps
3 % Functions for direct and embedded PostScript
5 % Careful with double % as comment prefix.
6 % Any %%X comment is interpreted as DSC comments.
8 % TODO: use dicts or prefixes to prevent namespace pollution.
10 /pdfmark where
11 {pop} {userdict /pdfmark /cleartomark load put} ifelse
14 % llx lly urx ury URI
15 /mark_URI
17     /uri exch def
18     /ury exch def
19     /urx exch def
20     /lly exch def
21     /llx exch def
22     [
23         /Rect [ llx lly urx ury ]
24         
25         /Border [ 0 0 0 ]
27         /Action
28             <<
29                 /Subtype /URI
30                 /URI uri
31             >>
32         /Subtype /Link
33     /ANN
34     pdfmark
36 bind def
38 % from adobe tech note 5002. 
39 /BeginEPSF { %def
40     /b4_Inc_state save def % Save state for cleanup
41     /dict_count countdictstack def % Count objects on dict stack
42     /op_count count 1 sub def % Count objects on operand stack
43     userdict begin % Push userdict on dict stack
44     /showpage { } def % Redefine showpage, { } = null proc
45     0 setgray 0 setlinecap % Prepare graphics state
46     1 setlinewidth 0 setlinejoin
47     10 setmiterlimit [ ] 0 setdash newpath
48     /languagelevel where % If level not equal to 1 then
49     {pop languagelevel % set strokeadjust and
50     1 ne % overprint to their defaults.
51       {false setstrokeadjust false setoverprint
52       } if
53     } if
54 } bind def
56 /EndEPSF { %def
57   count op_count sub {pop} repeat % Clean up stacks
58   countdictstack dict_count sub {end} repeat
59   b4_Inc_state restore
60 } bind def 
62 /stroke_and_fill {
63         gsave
64                 stroke
65         grestore
66         fill
67 } bind def
69 /vector_add { % x1 y1 x2 y2 vector_add x1+x2 y1+y2
70         exch
71         4 1 roll
72         add
73         3 1 roll
74         add
75         exch
76 } bind def
78 /draw_round_box % width height x y blot
80         setlinewidth % w h x y
81         0 setlinecap
82         1 setlinejoin
84         rmoveto % w h
85         currentpoint % w h x1 y1
86         4 2 roll % x1 y1 w h
87         4 copy
88         rectfill
89         rectstroke
90 } bind def
92 /draw_polygon % fill? x(n) y(n) x(n-1) y(n-1) ... x(0) y(0) n blot
94         setlinewidth %set to blot
96         0 setlinecap
97         1 setlinejoin
99         3 1 roll
100         /polygon_x
101         currentpoint
102         /polygon_y exch def
103         def
104         rmoveto % x(0) y(0)
105         { polygon_x polygon_y vector_add lineto } repeat % n times
106         closepath 
107         { %fill?
108                 stroke_and_fill
109         }{
110                 stroke
111         } ifelse
112 } bind def
114 /draw_repeat_slash % x-width width height draw_repeat_slash
116         2 index % duplicate x-width
117         1 setlinecap
118         1 setlinejoin
119         
120           0  rlineto % x-width 0
121              rlineto % width height
122         neg 0 rlineto % -x-width 0
123         closepath fill
124 } bind def
126 % this is for drawing slurs and barre-indicators.
127 /draw_bezier_sandwich  % thickness controls
129         gsave
130         currentpoint translate
131     % round ending and round beginning
132     1 setlinejoin 1 setlinecap
133         setlinewidth
134         moveto
135         curveto
136         lineto
137         curveto
138         closepath
139         stroke_and_fill
140         grestore
141 } bind def
143 /draw_dot % radius x y draw_dot
145         rmoveto
146         currentpoint
147         3 2 roll
148         0 360 arc closepath stroke_and_fill
149 } bind def
151 /draw_circle % filled? radius thickness draw_circle
153         setlinewidth    % f? r
154         currentpoint    % f? r x0 y0
155         3 2 roll        % f? x0 y0 r
156         dup 0 rmoveto
157         0 360 arc closepath
158                 { stroke_and_fill } 
159                 { stroke }
160         ifelse
161 } bind def
163 /draw_oval % filled? x-radius y-radius thickness draw_ellipse
165   setlinewidth % f? x-r y-r
166   /yrad exch def
167   /xrad exch def
168   xrad 0 rmoveto
169   0 yrad -2 xrad mul dup yrad exch 0 rcurveto
170   0 yrad neg dup 2 xrad mul dup 3 1 roll 0 rcurveto
171   closepath
172       { stroke_and_fill}
173       { stroke }
174   ifelse
175 } bind def
177 /draw_ellipse % filled? x-radius y-radius thickness draw_ellipse
179   setlinewidth % f? x-r y-r
180   /savematrix matrix currentmatrix def
181   scale % f?
182   currentpoint
183   1 0 rmoveto
184   1 0 360  arc closepath
185   savematrix setmatrix
186              { stroke_and_fill}
187              { stroke }
188   ifelse
189 } bind def
191 /draw_line % dx dy x1 y1 thickness draw_line
193         setlinewidth % dx dy x1 y1
194         1 setlinecap
195         1 setlinejoin
196         rmoveto % dx dy
197         rlineto
198         stroke
199 } bind def
201 /draw_dashed_line % dx dy thickness dashpattern offset draw_dashed_line
203         1 setlinecap
204         1 setlinejoin
205         setdash % dx dy thickness
206         setlinewidth %dx dy
207         rlineto
208         stroke
209         [] 0 setdash % reset dash pattern
210 } bind def
212 /draw_dashed_slur % controls thickness dash
214 gsave
215         currentpoint translate
216         1 setlinecap
217         1 setlinejoin
218         setdash
219         setlinewidth
220         8 2 roll
221         moveto
222         curveto
223         stroke
224 grestore
225 } bind def
227 /print_glyphs % dx dy glyph print_glyphs
229         {
230                 currentpoint %dx dy glyph x0 y0
231                 3 2 roll %dx dy x0 y0 glyph
232                 glyphshow % dx dy x0 y0
233                 moveto % dx dy
234                 rmoveto
235         }repeat
236 }bind def
237 %end music-drawing-routines.ps