lilypond-1.3.21
[lilypond.git] / mf / feta-macros.mf
blob47e415c70da45a5b36dfeb607bd5b35305389a80
2 % debugging
4 def test_grid =
5 if test>1:
6         proofrulethickness 1pt#;
7         makegrid(0pt,0pt for i:=-5pt step 1pt until 5pt: ,i endfor)
8                 (0pt,0pt for i:=-5pt step 1pt until 5pt: ,i endfor);
9         proofrulethickness .1pt#;
10         makegrid(0pt,0pt for i:=-4.8pt step .2pt until 4.8pt: ,i endfor)
11                 (0pt,0pt for i:=-4.8pt step .2pt until 4.8pt: ,i endfor);
13         enddef;
15 def treq =
16         tracingequations := tracingonline := 1;
17 enddef;
20 def draw_staff(expr first, last, offset)=
21         pickup pencircle scaled stafflinethickness;
22         for i:= first step 1 until last:
23                 draw (- staff_space, (i + offset) * staff_space) .. (4 staff_space,( i+ offset)* staff_space);
24         endfor
25         enddef;
29 % Transforms
32 def scaledabout(expr point, scale) =
33         shifted -point scaled scale shifted point
34 enddef;
38 % make a local (restored after endgroup) copy of t_var 
40 def local_copy(text type, t_var)=
41         save copy_temp;
42         type copy_temp; 
43         copy_temp := t_var;
44         save t_var;
45         type t_var;
46         t_var := copy_temp;
47 enddef;
51 % Urgh! Want to do parametric types
54 def del_picture_stack=
55         save save_picture_stack, picture_stack_idx;
56 enddef;
58 % better versions of Taupin/Egler savepic cmds
61 def make_picture_stack = 
62         % override previous stack.
63         del_picture_stack;
64         picture save_picture_stack[];
65         numeric picture_stack_idx;
66         picture_stack_idx := 0;
67         def push_picture(expr p) = 
68                 save_picture_stack[picture_stack_idx] := p ;
69                 picture_stack_idx := picture_stack_idx + 1;
70         enddef;
71         def pop_picture =  save_picture_stack[decr picture_stack_idx] enddef;
72         def top_picture = save_picture_stack[picture_stack_idx] enddef;
73 enddef;
76 % save/restore pens
77 % why can't I delete individual pens?
78 def make_pen_stack =
79         del_pen_stack;
80         pen save_pen_stack[];
81         numeric pen_stack_idx;
82         pen_stack_idx := 0;
83         def push_pen(expr p) = 
84                 save_pen_stack[pen_stack_idx] := p ;
85                 pen_stack_idx := pen_stack_idx +1;
86         enddef;
87         def pop_pen =  save_pen_stack[decr pen_stack_idx] enddef;
88         def top_pen = save_pen_stack[pen_stack_idx] enddef;
89 enddef;
90 def del_pen_stack=
91         save save_pen_stack, pen_stack_idx;
92 enddef;
95 % drawing
98 def simple_serif(expr p,q, a)= 
99         p{dir(angle(q-p) -a)} .. q{ - dir(angle(p -q) + a)}
100 enddef;
103 % a: x diameter
104 % b: y diameter
105 % err_x: drift of y axis at top
106 % err_y: drift of x axis at right
107 def distorted_ellipse(expr a,b,err_y,err_x,super) =
108         superellipse((a,err_x),(-err_y,b),(-a,-err_x),(err_y,-b),super);
109         enddef;
111 % stolen from feta-eindelijk, but still
112 % FIXME: too high
113 def draw_block (expr bottom_left, top_right) =
114         pickup pencircle scaled blot_diameter;
116         begingroup;
117         save x,y;
118         bot y1 = ypart bottom_left;
119         top y2 = ypart top_right;
120         y3 = y2;
121         y4 = y1;
123         rt x1 = xpart top_right;
124         x2 = x1;
125         lft x3 = xpart bottom_left;
126         x4 = x3;
128         filldraw z1--z2--z3--z4--cycle;
129         endgroup;
130         enddef;
132 def draw_brush(expr a,w,b,v) =
133         save x,y;
134         z1=a; z2=b;
135         penpos3(w,angle(z2-z1)+90);
136         penpos4(w,angle(z2-z1));
137         penpos5(v,angle(z1-z2)+90);
138         penpos6(v,angle(z1-z2));
139         z3 = z4 = z1;
140         z5 = z6 = z2;
142         fill z3r{z3r-z5l}..z4l..{z5r-z3l}z3l..z5r{z5r-z3l}..z6l..{z3r-z5l}z5l..cycle;
143 enddef;
145 def draw_flare(expr pos,alpha,beta,line,flare) =
146         begingroup;
147         clearxy;
148         penpos1(line,180+beta+alpha);
149         z1r=pos;
150         penpos2(flare,180+beta+alpha);
151         z2=z3;
152         penpos3(flare,0+alpha);
153         z3l=z1r+(1/2+0.43)*flare*dir(alpha+beta);
154         z4=z2r-line*dir(alpha);
155         penlabels(1,2,3,4);
156         pickup pencircle;
157         save t; t=0.833;
158         fill z1r{dir(alpha)}..z3r{dir(180+alpha-beta)}..z2l{dir(alpha+180)}
159                 ..z3l{dir(180+alpha+beta)}..tension t
160                 ..z4{dir(180+alpha+beta)}..z1l{dir(alpha+180)}..cycle;
161         endgroup;
162         enddef;
164 def brush(expr a,w,b,v) =
165         begingroup;
166         draw_brush(a,w,b,v);    
167         penlabels(3,4,5,6);
168         endgroup;
169 enddef;
172 % Draw a (rest) crook, starting at thickness STEM in point A,
173 % ending a ball W to the left, diameter BALLDIAM
174 % ypart of the center of the ball is BALLDIAM/4 lower than ypart A
176 def balled_crook(expr a, w, balldiam, stem) =
177 begingroup;
178         save x,y;
179         penpos1(balldiam/2,-90);
180         penpos2(balldiam/2,0);
181         penpos3(balldiam/2,90);
182         penpos4(balldiam/2,180);
183         x4r=xpart a-w; y3r=ypart a+balldiam/4;
184         x1l=x2l=x3l=x4l;
185         y1l=y2l=y3l=y4l;
186         penpos5(stem,250);
187         x5=x4r+9/8balldiam; y5r=y1r;
188         penpos6(stem,260);
189         x6l=xpart a; y6l=ypart a;
190         penstroke z1e..z2e..z3e..z4e..z1e..z5e{right}..z6e;
191         penlabels(1,2,3,4,5,6);
192 endgroup;
193 enddef;
195 def y_mirror_char =
196         currentpicture := currentpicture yscaled -1;
197         set_char_box(charbp, charwd, charht, chardp);
198 enddef;
201 def xy_mirror_char =
202         currentpicture := currentpicture scaled -1;
203         set_char_box(charwd, charbp, charht, chardp);
204 enddef;
208 % center_factor: typically .5, the larger, the larger the radius of the bulb
209 % radius factor: how much the bulb curves inward
211 def draw_bulb(expr turndir, zl, zr, bulb_rad, radius_factor)=
212         begingroup;
213         clearxy;
214         save rad, ang;
216         ang = angle(zr-zl);
217         z0 = zr + bulb_rad * (zl-zr)/length(zr -zl);
218         rad =  bulb_rad;
220         z1 = z0 + radius_factor* rad * dir(ang + turndir* 100);
221         z2 = z0 + rad * dir(ang  + turndir*300);
222         labels(0,1,2);
223         fill zr{dir (ang + turndir* 90)} .. z1 .. z2 -- cycle;
225         endgroup
226 enddef;