]> git.donarmstrong.com Git - lilypond.git/blobdiff - ps/music-drawing-routines.ps
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / ps / music-drawing-routines.ps
index 85434be8a8dca4d61e6ccdadcd5fce60d119647c..e0f28e82a6a21e9b9918409a81bd5c0c255858af 100644 (file)
@@ -2,39 +2,43 @@
 %
 % 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
+% Emulation code from Postscript Language Reference.
 
-% 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
-    /languagelevel where % If level not equal to 1 then
-    {pop languagelevel % set strokeadjust and
-    1 ne % overprint to their defaults.
-      {false setstrokeadjust false setoverprint
-      } if
-    } if
+/*SF
+{
+       exch findfont exch
+       dup type /arraytype eq
+               {makefont}
+               {scalefont}
+       ifelse
+       setfont
 } bind def
 
+/languagelevel where
+       {pop languagelevel}
+       {1}
+ifelse
+
+2 lt
+       { /selectfont /*SF load def }
+if
+
+% end emulation code
+
+/pdfmark where
+{pop} {userdict /pdfmark /cleartomark load put} ifelse
 
-/EndEPSF { %def
-  count op_count sub {pop} repeat % Clean up stacks
-  countdictstack dict_count sub {end} repeat
-  b4_Inc_state restore
-} bind def 
 
 % llx lly urx ury URI
 /mark_URI
+% It's possible to eliminate the coordinate variables by doing [ /Rect [ 7 3
+% roll.  That is, however, kind of ugly.  It would be nice if this procedure
+% were only included when PDF marks are enabled.
 {
     /command exch def
     /ury exch def
@@ -43,7 +47,8 @@
     /llx exch def
     [
        /Rect [ llx lly urx ury ]
-       /Border [ 0 0 0 0 ]
+       
+       /Border [ 0 0 0 ]
 
         /Action
            <<
 }
 bind def
 
-/set_tex_dimen
-{
-       cvr 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
+    /languagelevel where % If level not equal to 1 then
+    {pop languagelevel % set strokeadjust and
+    1 ne % overprint to their defaults.
+      {false setstrokeadjust false setoverprint
+      } if
+    } if
 } 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 
 
 
-/euclidean_length
+%<font> <encoding> <name> reencode-font
+/reencode-font
 {
-       1 copy mul exch 1 copy mul add sqrt
+    /name exch def
+    /encoding exch def
+    dup length
+    dict begin {
+       1 index /FID ne {def} {pop
+       pop} ifelse
+    }
+    forall
+    /Encoding encoding
+    def currentdict
+    end
+    name exch definefont
 } 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
+/set_tex_dimen
+{
+       cvr def
+} bind 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_and_fill {
+       gsave
                stroke
-       }{
-               closepath gsave stroke grestore fill
-       } ifelse
+       grestore
+       fill
 } 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
+       setlinewidth % w h x y
+       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
+       rmoveto % w h
+       currentpoint % w h x1 y1
+       4 2 roll % x1 y1 w h
+       4 copy
+       rectfill
+       rectstroke
 } bind def
 
-/draw_polygon % x(n) y(n) x(n-1) y(n-1) ... x(1) y(1) n blot fill
+/draw_polygon % fill? x(n) y(n) x(n-1) y(n-1) ... x(0) y(0) n blot
 {
-       /fillp exch def
-       /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
+       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 
-       fillp {
-               gsave stroke grestore fill
+       { %fill?
+               stroke_and_fill
        }{
                stroke
        } ifelse
 } bind def
 
-/draw_repeat_slash % width slope thick
+/draw_repeat_slash % x-width width height draw_repeat_slash
 {
+       2 index % duplicate x-width
        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
+       
+         0  rlineto % x-width 0
+            rlineto % width height
+       neg 0 rlineto % -x-width 0
        closepath fill
 } bind def
 
 % this is for drawing slurs.
 /draw_bezier_sandwich  % thickness controls
 {
+       gsave
+       currentpoint translate
     % round ending and round beginning
     1 setlinejoin 1 setlinecap
        setlinewidth
@@ -207,53 +188,75 @@ bind def
        lineto
        curveto
        closepath
-       gsave
-       fill
+       stroke_and_fill
        grestore
-       stroke
 } bind def
 
-/draw_dot % x1 y2 R
+/draw_dot % radius x y draw_dot
 {
-%      0 360 arc fill stroke
-       0 360 arc closepath fill stroke
+       rmoveto
+       currentpoint
+       3 2 roll
+       0 360 arc closepath stroke_and_fill
 } bind def
 
-/draw_circle % R T F
+/draw_circle % filled? radius thickness draw_circle
 {
-       /filled exch def
-       setlinewidth
-       dup 0 moveto
-       0 exch 0 exch
+       setlinewidth    % f? r
+       currentpoint    % f? r x0 y0
+       3 2 roll        % f? x0 y0 r
+       dup 0 rmoveto
        0 360 arc closepath
-       gsave stroke grestore
-       filled { fill } if 
+               { stroke_and_fill } 
+               { stroke }
+       ifelse
 } bind def
 
 
+/draw_line % dx dy x1 y1 thickness draw_line
+{
+       setlinewidth % dx dy x1 y1
+       1 setlinecap
+       1 setlinejoin
+       rmoveto % dx dy
+       rlineto
+       stroke
+} bind def
 
-/draw_dashed_line % dash thickness dx dy
+/draw_dashed_line % dx dy thickness dashpattern draw_dashed_line
 {
        1 setlinecap
        1 setlinejoin
-       setdash
-       setlinewidth
-       0 0 moveto
-       lineto
+       setdash % dx dy thickness
+       setlinewidth %dx dy
+       rlineto
        stroke
+       [] 0 setdash % reset dash pattern
 } bind def
 
-/draw_dashed_slur % dash thickness controls
+/draw_dashed_slur % controls thickness dash
 {
+gsave
+       currentpoint translate
        1 setlinecap
        1 setlinejoin
        setdash
        setlinewidth
-       8 -2 roll
+       8 2 roll
        moveto
        curveto
        stroke
+grestore
 } bind def
 
-
+/print_glyphs % dx dy glyph print_glyphs
+{
+       {
+               currentpoint %dx dy glyph x0 y0
+               3 2 roll %dx dy x0 y0 glyph
+               glyphshow % dx dy x0 y0
+               moveto % dx dy
+               rmoveto
+       }repeat
+}bind def
 %end music-drawing-routines.ps