summaryrefslogtreecommitdiff
path: root/ps/music-drawing-routines.ps
blob: 03df7c03cb7735e5f8f4746983e19384cb85ea19 (about) (plain)
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
%!PS-Adobe-2.0
%
% Functions for direct and embedded PostScript

% 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
{
    0 max setlinewidth
    matrix currentmatrix 5 1 roll
    currentpoint translate newpath translate
    2 copy 0 min exch 0 min 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