]> git.donarmstrong.com Git - lilypond.git/blobdiff - ps/music-drawing-routines.ps
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / ps / music-drawing-routines.ps
index 3bcfa3a45f2bf8746448c5e67730024be06c7ea5..03df7c03cb7735e5f8f4746983e19384cb85ea19 100644 (file)
@@ -1,31 +1,33 @@
-%!PS-Adobe-1.0: music-drawing-routines.ps
+%!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.
+% 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
 {
-    /command exch def
+    /uri exch def
     /ury exch def
     /urx exch def
     /lly exch def
     /llx exch def
     [
        /Rect [ llx lly urx ury ]
-       /Border [ 0 0 0 0 ]
+       
+       /Border [ 0 0 0 ]
 
         /Action
            <<
                /Subtype /URI
-               /URI command
+               /URI uri
            >>
         /Subtype /Link
     /ANN
 }
 bind def
 
-/set_tex_dimen
+% llx lly urx ury page
+/mark_page_link
 {
-       cvr def
-} bind def
-
-
+    /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
 
-/euclidean_length
-{
-       1 copy mul exch 1 copy mul add sqrt
+% 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
 
-% 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
-
-       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
+/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
 
-/draw_round_box % breapth width depth height blot
-{
-       /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
+/vector_add { % x1 y1 x2 y2 vector_add x1+x2 y1+y2
+       exch
+       4 1 roll
+       add
+       3 1 roll
+       add
+       exch
 } bind def
 
-% Nice beam with rounded corners
-/draw_beam % slope width thick  blot
+/draw_round_box % width height x y 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:
+    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
-       }{
-               closepath gsave stroke grestore fill
-       } ifelse
+           }
+           {
+               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 % x(n) y(n) x(n-1) y(n-1) ... x(1) y(1) n blot
+/draw_polygon % fill? x(n) y(n) x(n-1) y(n-1) ... x(0) y(0) n blot
 {
-       /blot exch def
+       setlinewidth %set to blot
 
        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_white_text  % text scale font
-{
-  %font
-  findfont
-  %scale
-  exch scalefont setfont
-  1 setgray
-  0 0 moveto
-  %-0.05 -0.05 moveto
-  % text
-  show
-} bind def
-
-/draw_ez_ball % ch letter_col ball_col font
-{
-       % font
-       findfont 0.7 scalefont setfont
-       0.1 setlinewidth
-       0 0 moveto
-       0 setgray
-       0.5 0 0.5 0 360 arc closepath fill stroke
-       % ball_col
-       1 eq {
-               0.01 setlinewidth
-               1 setgray
-               0.5 0 0.4 0 360 arc closepath
-               fill stroke
-       } if
-       % letter_col
-       setgray
-       % 0.25 is empiric centering. Change to taste
-       0.25 -0.25 moveto
-       % ch
-       show
-} bind def
-
-% Simple, but does it work everywhere?
-% Han-Wen reports that one printer (brand?) at cs.uu.nl chokes on this,
-% reverted for now -- jcn
-%
-% The filled circles are drawn by setting the linewidth
-% to 2*radius and drawing a point.
-/simple_draw_ez_ball % ch letter_col ball_col font
-{
-       % font
-       findfont 0.85 scalefont setfont
-       /origin { 0.45 0 } def
-       0 setgray
-       1.1 setlinewidth
-       origin moveto
-       origin lineto stroke
-       % ball_col
-       setgray
-       0.9 setlinewidth
-       origin moveto
-       origin lineto stroke
-       % letter_col
-       setgray
-       % 0.25 is empiric centering. Change to taste
-       origin moveto
-       -0.28 -0.30 rmoveto
-       % ch
-       show
-} 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
+       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
-       gsave
-       fill
-       grestore
-       stroke
+       stroke_and_fill?
 } bind def
 
-/draw_dot % x1 y2 R
+/draw_circle % filled? radius thickness draw_circle
 {
-%      0 360 arc fill stroke
-       0 360 arc closepath fill stroke
+       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_circle % R T
+/draw_ellipse % filled? x-radius y-radius thickness draw_ellipse
 {
-       setlinewidth
-       dup 0 moveto
-       0 exch 0 exch
-       0 360 arc closepath stroke
+  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_white_dot % x1 y2 R
+/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)
 {
-%      0 360 arc fill stroke
-       0 360 arc closepath % fill stroke
-gsave
- 1 setgray fill
-grestore
-%      0 360 arc closepath % fill stroke
-  0.05 setlinewidth 0 setgray stroke
+  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_dashed_line % dash thickness dx dy
+/draw_line % dx dy x1 y1 thickness draw_line
 {
+       setlinewidth % dx dy x1 y1
        1 setlinecap
-       1 setlinejoin
-       setdash
-       setlinewidth
-       0 0 moveto
-       lineto
+       rmoveto % dx dy
+       rlineto
        stroke
 } bind def
 
-/draw_dashed_slur % dash thickness controls
+/draw_dashed_line % dx dy thickness dashpattern offset draw_dashed_line
 {
        1 setlinecap
-       1 setlinejoin
-       setdash
-       setlinewidth
-       8 -2 roll
-       moveto
-       curveto
+       setdash % dx dy thickness
+       setlinewidth %dx dy
+       rlineto
        stroke
+       [] 0 setdash % reset dash pattern
 } 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
+/print_glyphs % w dx dy glyph print_glyphs
 {
-       /traject_ds exch def
-       /traject_alpha exch def
-       traject_ds traject_alpha sin mul add
-       exch
-       traject_ds traject_alpha cos mul add
-       exch
-} bind def
-
-
-
-/half_bracket
-{
-%6
-       0 0
-%5a
-       bracket_thick arch_height add half_height arch_thick sub arch_width add
-       arch_angle arch_height -0.15 mul bracket_traject
-%5b
-       bracket_thick 0.5 mul half_height
-       0 arch_height 0.5 mul bracket_traject
-%5c
-       0 half_height
-%4a
-       bracket_thick half_height arch_thick sub
-       0 arch_height 0.4 mul bracket_traject
-%4b
-       bracket_thick arch_height add half_height arch_thick sub arch_width add
-       arch_angle arch_height -0.25 mul bracket_traject
-%4c
-       bracket_thick arch_height add half_height arch_thick sub arch_width add
-%3
-       bracket_thick half_height arch_thick sub
-%2
-       bracket_thick 0
-%1
-       0 0
-} bind def
-
-/draw_half_bracket {
-       moveto
-       lineto
-       lineto
-       curveto
-       curveto
-       lineto
-       gsave
-       fill
-       grestore
-} bind def
-
-/draw_bracket % arch_angle arch_width arch_height bracket_height arch_thick bracket_thick
-{
-       % urg
-
-       /bracket_thick exch def
-       /arch_thick exch def
-       /bracket_height exch def
-       /arch_height exch def
-       /arch_width exch def
-       /arch_angle exch def
-
-       bracket_height 2 div bracket_thick add /half_height exch def
-       bracket_thick 0.5 mul setlinewidth
-       1 setlinecap
-       1 setlinejoin
-       half_bracket
-       20 copy
-       1 -1 scale
-       draw_half_bracket
-       stroke
-       1 -1 scale
-       draw_half_bracket
-       stroke
-} bind def
-
+       {
+               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