-%!PS-Adobe-1.0: lily.ps
+%!PS-Adobe-1.0: music-drawing-routines.ps
%
% Functions for direct and embedded PostScript
-% round cappings
-1 setlinecap
+
+/blot-diameter { lilypondpaperblotdiameter } bind def
+
+/set_tex_dimen {
+ cvr def
+} bind def
+
+
/euclidean_length
{
1 copy mul exch 1 copy mul add sqrt
} bind def
-/draw_beam % width slope thick
-{
- 2 div /beam_thick exch def
- /beam_slope exch def
- /beam_wd exch def
- beam_slope beam_wd mul /beam_ht exch def
- 0 beam_thick neg moveto
- beam_wd beam_ht rlineto
- 0 beam_thick 2 mul rlineto
- 0 beam_thick lineto
- closepath fill
-} bind def
+% FIXME. translate to middle of box.
+% Nice rectangle with rounded corners
+/draw_box % breapth width depth height
+{
+ currentdict /testing known {
+ %% real thin lines for testing
+ /blot 0.005 def
+ }{
+ /blot blot-diameter def
+ } ifelse
-/draw_repeat_slash % width slope thick
+ 0 setlinecap
+ blot setlinewidth
+ 1 setlinejoin
+
+ blot 2 div sub /h exch def
+ blot 2 div sub /d exch def
+ blot 2 div sub /w exch def
+ blot 2 div sub /b exch def
+
+ b neg d neg moveto
+ b w add 0 rlineto
+ 0 d h add rlineto
+ b w add neg 0 rlineto
+ 0 d h add neg rlineto
+
+ currentdict /testing known {
+ %% outline only, for testing:
+ stroke
+ }{
+ closepath gsave stroke grestore fill
+ } ifelse
+} bind def
+
+
+/draw_symmetric_x_triangle % h w th
{
- /beamthick exch def
- /slope exch def
- /width exch def
- beamthick beamthick slope div euclidean_length
- /xwid exch def
- 0 0 moveto
- xwid 0 rlineto
- width slope width mul rlineto
- xwid neg 0 rlineto
-% width neg width angle sin mul neg rlineto
- closepath fill
+ setlinewidth
+ 0 0 moveto
+ dup 0 lineto
+ 2 div
+ exch lineto
+ 0 0 lineto
+ stroke
} bind def
-/draw_hairpin % width start_h end_h thick
+/draw_round_box % breapth width depth height blot
{
- setlinewidth
- /end_h exch def
- /start_h exch def
- /wid exch def
- 0 start_h moveto
- wid end_h lineto
- stroke
- 0 start_h neg moveto
- wid end_h neg lineto
- stroke
+ /blot exch def
+
+ 0 setlinecap
+ blot setlinewidth
+ 1 setlinejoin
+
+ blot 2 div sub /h exch def
+ blot 2 div sub /d exch def
+ blot 2 div sub /w exch def
+ blot 2 div sub /b exch def
+
+ b neg d neg moveto
+ b w add 0 rlineto
+ 0 d h add rlineto
+ b w add neg 0 rlineto
+ 0 d h add neg rlineto
+
+ currentdict /testing known {
+ %% outline only, for testing:
+ stroke
+ }{
+ closepath gsave stroke grestore fill
+ } ifelse
} bind def
-/draw_tuplet % height gap dx dy thick dir
-{
- /dir exch def
- setlinewidth
- 1 setlinecap
- 1 setlinejoin
- /tuplet_dy exch def
- /tuplet_dx exch def
- /tuplet_gapx exch def
- /tuplet_h exch def
- tuplet_dy tuplet_dx div tuplet_gapx mul /tuplet_gapy exch def
-
-
- 0 0 moveto
- 0 tuplet_h dir mul lineto
- tuplet_dx tuplet_gapx sub 2 div
- tuplet_dy tuplet_gapy sub 2 div tuplet_h dir mul add lineto
- tuplet_dx tuplet_gapx add 2 div
- tuplet_dy tuplet_gapy add 2 div tuplet_h dir mul add moveto
- tuplet_dx tuplet_dy tuplet_h dir mul add lineto
- tuplet_dx tuplet_dy lineto
- stroke
+% Nice beam with rounded corners
+/draw_beam % slope width thick blot
+{
+ /blot exch def
+ blot setlinewidth
+
+ 0 setlinecap
+ 1 setlinejoin
+
+ blot sub /t exch def
+ blot sub /w exch def
+ w mul /h exch def
+
+ blot 2 div t 2 div neg moveto
+ w h rlineto
+ 0 t rlineto
+ w neg h neg rlineto
+ 0 t neg rlineto
+
+ currentdict /testing known {
+ %% outline only, for testing:
+ stroke
+ }{
+ closepath gsave stroke grestore fill
+ } ifelse
} bind def
+/draw_polygon % x(n) y(n) x(n-1) y(n-1) ... x(1) y(1) n blot
+{
+ /blot exch def
+
+ 0 setlinecap
+ blot setlinewidth
+ 1 setlinejoin
+
+ /points exch def
+ 2 copy
+ moveto
+ 1 1 points {pop lineto} for
+ currentdict /testing known {
+ %% outline only, for testing:
+ stroke
+ }{
+ closepath gsave stroke grestore fill
+ } ifelse
+} bind def
+
+/draw_repeat_slash % width slope thick
+{
+ 1 setlinecap
+ 1 setlinejoin
+
+ /beamthick exch def
+ /slope exch def
+ /width exch def
+ beamthick beamthick slope div euclidean_length
+ /xwid exch def
+ 0 0 moveto
+ xwid 0 rlineto
+ width slope width mul rlineto
+ xwid neg 0 rlineto
+ % width neg width angle sin mul neg rlineto
+ closepath fill
+} bind def
+
+
/draw_ez_ball % ch letter_col ball_col font
{
% font
show
} bind def
-/draw_volta % h w thick vert_start vert_end
-{
- /vert_end exch def
- /vert_start exch def
- setlinewidth
- /volta_w exch def
- /volta_h exch def
- 1 setlinecap
- 1 setlinejoin
- vert_start 0 eq {
- 0 0 moveto
- 0 volta_h lineto
- } if
- 0 volta_h moveto
- volta_w volta_h lineto
- vert_end 0 eq {
- volta_w 0 lineto
- } if
- stroke
-} bind def
-
% this is for drawing slurs.
/draw_bezier_sandwich % thickness controls
-{
+{
+ % round ending and round beginning
+ 1 setlinejoin 1 setlinecap
setlinewidth
moveto
curveto
lineto
- curveto
+ curveto
+ closepath
gsave
fill
grestore
stroke
} bind def
+/draw_dot % x1 y2 R
+{
+% 0 360 arc fill stroke
+ 0 360 arc closepath fill stroke
+} bind def
+
/draw_dashed_line % dash thickness dx dy
{
1 setlinecap
} bind def
+% a b c d subvec == a-c b-d
+/subvec {
+ 3 2 roll exch sub
+ 3 1 roll
+ sub exch
+} bind def
+
+
+% centre? zzwidth zzheight thickness x0 y0 x1 y1
+/draw_zigzag_line {
+ newpath
+ 6 dict begin
+
+ 4 2 roll % zzuw zzh th x1 y1 x0 y0
+ 2 copy
+ moveto
+ subvec % zzuw zzh th dx dy
+
+ 2 copy euclidean_length /l exch def
+ l div /uy exch def
+ l div /ux exch def
+ setlinewidth
+ /zzh exch def
+ l exch div round /n exch def
+ n 0 gt { %if
+ /zzw l n 2 mul div def
+ {
+ uy zzh mul 2 div ux zzh mul -2 div rmoveto
+ } if
+ 1 1 n {
+ ux zzw mul uy zzh mul sub
+ uy zzw mul ux zzh mul add
+ rlineto
+ ux zzw mul uy zzh mul add
+ uy zzw mul ux zzh mul sub
+ rlineto
+ } bind for
+ }{ %else
+ pop
+ ux l mul uy l mul rlineto
+ } ifelse
+ stroke
+ end
+} bind def
/bracket_traject
{