X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=ps%2Fmusic-drawing-routines.ps;h=03df7c03cb7735e5f8f4746983e19384cb85ea19;hb=HEAD;hp=ad75562e77c67f0c38a58277cb003d8879fa377b;hpb=c225073ce98f6270b8f2725296fc8f02f1fe0065;p=lilypond.git diff --git a/ps/music-drawing-routines.ps b/ps/music-drawing-routines.ps index ad75562e77..03df7c03cb 100644 --- a/ps/music-drawing-routines.ps +++ b/ps/music-drawing-routines.ps @@ -1,4 +1,4 @@ -%!PS-Adobe-1.0: music-drawing-routines.ps +%!PS-Adobe-2.0 % % Functions for direct and embedded PostScript @@ -10,66 +10,24 @@ /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% 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 - - -% reencode-font -/reencode-font -{ - /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 - % 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 ] /Action << /Subtype /URI - /URI command + /URI uri >> /Subtype /Link /ANN @@ -77,204 +35,277 @@ } 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 +/EndEPSF { %def + count op_count sub {pop} repeat % Clean up stacks + countdictstack dict_count sub {end} repeat + b4_Inc_state restore +} bind def - currentdict /testing known { - %% outline only, for testing: - stroke - }{ - closepath gsave stroke grestore fill - } ifelse +/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 % breapth width depth height blot +/draw_round_box % width height x y 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: + 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 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 - closepath - fillp { - gsave stroke grestore fill - }{ - stroke - } 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 - -% 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 -} bind def - -/draw_dot % x1 y2 R -{ -% 0 360 arc fill stroke - 0 360 arc closepath fill stroke + 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? } bind def - -% JUNKME. use color & circle. -/draw_white_dot % x1 y2 R +/draw_ellipse % filled? x-radius y-radius thickness draw_ellipse { -% 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 + 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 - -% JUNKME: Use color. -/draw_white_text % text scale font +/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) { - %font - findfont - %scale - exch scalefont setfont - 1 setgray - 0 0 moveto - %-0.05 -0.05 moveto - % text - show + 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 - +/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