]> git.donarmstrong.com Git - lilypond.git/blobdiff - mf/feta-macros.mf
* lily/lily-guile.cc (robust_scm2double): new function. Use throughout.
[lilypond.git] / mf / feta-macros.mf
index 47e415c70da45a5b36dfeb607bd5b35305389a80..2fd3e72ae89a192ace18396272d1be40de0bbdef 100644 (file)
@@ -18,12 +18,30 @@ enddef;
 
 
 def draw_staff(expr first, last, offset)=
+if test <> 0:
        pickup pencircle scaled stafflinethickness;
        for i:= first step 1 until last:
                draw (- staff_space, (i + offset) * staff_space) .. (4 staff_space,( i+ offset)* staff_space);
        endfor
-       enddef;
+fi;
+
+enddef;
+
+% draw the outline of the stafflines. For fine tuning. 
+def draw_staff_outline(expr first, last, offset)=
+if test <> 0:
+       save p;
+       path p;
+       pickup pencircle scaled 2;
+       for i:= first step 1 until last:
+               p := (- staff_space,  (i + offset) * staff_space) .. (4 staff_space,( i+ offset)* staff_space);
+
+               draw p shifted (0, .5 stafflinethickness);
+               draw p shifted (0, -.5 stafflinethickness);
+       endfor
+fi;
 
+enddef;
 
 %
 % Transforms
@@ -95,39 +113,75 @@ enddef;
 % drawing
 %
 
-def simple_serif(expr p,q, a)= 
-       p{dir(angle(q-p) -a)} .. q{ - dir(angle(p -q) + a)}
+def soft_penstroke text t =
+       forsuffixes e = l,r: path_.e:=t; endfor
+       if cycle path_.l:
+         cyclestroke_
+       else:
+         fill path_.l .. tension1.5 .. reverse path_.r .. tension1.5 .. cycle
+       fi
 enddef;
-%
 
-% a: x diameter
-% b: y diameter
-% err_x: drift of y axis at top
-% err_y: drift of x axis at right
-def distorted_ellipse(expr a,b,err_y,err_x,super) =
-       superellipse((a,err_x),(-err_y,b),(-a,-err_x),(err_y,-b),super);
-       enddef;
 
-% stolen from feta-eindelijk, but still
-% FIXME: too high
-def draw_block (expr bottom_left, top_right) =
-       pickup pencircle scaled blot_diameter;
+%
+% make a round path segment going from P to Q. 2*A is the angle that the 
+% path should take.
+%
 
-       begingroup;
-       save x,y;
-       bot y1 = ypart bottom_left;
-       top y2 = ypart top_right;
-       y3 = y2;
-       y4 = y1;
+def simple_serif(expr p,q, a)= 
+       p{dir(angle(q-p) -a)} .. q{ - dir(angle(p -q) + a)}
+enddef;
+%
 
-       rt x1 = xpart top_right;
-       x2 = x1;
-       lft x3 = xpart bottom_left;
-       x4 = x3;
+%
+% draw an axis aligned block making sure that edges are on pixels.
+%
 
-       filldraw z1--z2--z3--z4--cycle;
-       endgroup;
-       enddef;
+def draw_rounded_block (expr bottom_left, top_right, roundness) =
+       save round;
+       round = floor min(roundness,xpart (top_right-bottom_left),
+                                   ypart (top_right-bottom_left));
+       pickup pencircle scaled round;
+  
+        begingroup;
+        save x,y;
+       z2+(round/2,round/2) = top_right;
+       z4-(round/2,round/2) = bottom_left;
+        y3 = y2;
+        y4 = y1;
+        x2 = x1;
+        x4 = x3;
+       fill bot z1 .. rt z1 --- rt z2 .. top z2 ---
+            top z3 .. lft z3 --- lft z4 .. bot z4 --- cycle;
+        endgroup;
+        enddef;
+  
+
+
+ def draw_block (expr bottom_left, top_right) =
+       draw_rounded_block (bottom_left, top_right, blot_diameter);
+       enddef;
+
+ def draw_square_block (expr bottom_left, top_right) =
+       save x,y;
+       x1 = xpart bottom_left;
+       y1 = ypart bottom_left;
+       x2 = xpart top_right;
+       y2 = ypart top_right;
+
+
+       fill (x1,y1) --- (x2,y1) --- (x2,y2) --- (x1,y2) --- cycle; 
+       enddef;
+
+
+ def draw_gridline (expr bottom_left,top_right,thickness) =
+       draw_rounded_block (bottom_left-(thickness/2,thickness/2),
+                           top_right+(thickness/2,thickness/2),
+                           thickness);
+       enddef;
+       
 
 def draw_brush(expr a,w,b,v) =
        save x,y;
@@ -142,7 +196,32 @@ def draw_brush(expr a,w,b,v) =
        fill z3r{z3r-z5l}..z4l..{z5r-z3l}z3l..z5r{z5r-z3l}..z6l..{z3r-z5l}z5l..cycle;
 enddef;
 
-def draw_flare(expr pos,alpha,beta,line,flare) =
+
+
+%
+% make a superellipsoid segment going from FROM to TO, with SUPERNESS.  
+% Take superness = sqrt(2)/2 to get a circle segment 
+%
+% see Knuth, p. 267 and p.126
+def super_curvelet(expr from, to, superness, dir) =
+       if dir = 1:
+        (superness [xpart to, xpart from], superness [ypart from,ypart to]){to - from}
+       else:
+        (superness [xpart from, xpart to], superness [ypart  to,ypart from]){to - from}
+       fi
+enddef;
+
+
+%
+% Bulb with smooth inside curve.
+%
+% alpha = start direction.
+% beta = which side to turn to.
+% flare = diameter of the bulb
+% line = diameter of line attachment
+% direction = is ink on left or right side (1 or -1)
+%
+def flare_path(expr pos,alpha,beta,line,flare, direction) =
        begingroup;
        clearxy;
        penpos1(line,180+beta+alpha);
@@ -150,17 +229,29 @@ def draw_flare(expr pos,alpha,beta,line,flare) =
        penpos2(flare,180+beta+alpha);
        z2=z3;
        penpos3(flare,0+alpha);
-       z3l=z1r+(1/2+0.43)*flare*dir(alpha+beta);
-       z4=z2r-line*dir(alpha);
+       z3l=z1r+(1/2+0.43)*flare*dir(alpha+beta) ;
+       save taille;
+       taille = 0.0;
+       z4=z2r-  line * dir(alpha);
        penlabels(1,2,3,4);
        pickup pencircle;
        save t; t=0.833;
-       fill z1r{dir(alpha)}..z3r{dir(180+alpha-beta)}..z2l{dir(alpha+180)}
+       save p; 
+       path p;
+       p:=z1r{dir(alpha)}..z3r{dir(180+alpha-beta)}..z2l{dir(alpha+180)}
                ..z3l{dir(180+alpha+beta)}..tension t
-               ..z4{dir(180+alpha+beta)}..z1l{dir(alpha+180)}..cycle;
-       endgroup;
+               ..z4{dir(180+alpha+beta)}..z1l{dir(alpha+180)};
+
+       if direction = 1:
+               p
+       else:
+               reverse p
+       fi
+       endgroup
        enddef;
 
+
+
 def brush(expr a,w,b,v) =
        begingroup;
        draw_brush(a,w,b,v);    
@@ -192,6 +283,7 @@ begingroup;
 endgroup;
 enddef;
 
+
 def y_mirror_char =
        currentpicture := currentpicture yscaled -1;
        set_char_box(charbp, charwd, charht, chardp);
@@ -214,7 +306,11 @@ def draw_bulb(expr turndir, zl, zr, bulb_rad, radius_factor)=
        save rad, ang;
 
        ang = angle(zr-zl);
-       z0 = zr + bulb_rad * (zl-zr)/length(zr -zl);
+
+       % don't get near infinity
+       %z0 = zr + bulb_rad * (zl-zr)/length(zr -zl);
+       z0 = zr + bulb_rad /length(zr -zl) * (zl-zr);
+
        rad =  bulb_rad;
 
        z1 = z0 + radius_factor* rad * dir(ang + turndir* 100);
@@ -224,3 +320,5 @@ def draw_bulb(expr turndir, zl, zr, bulb_rad, radius_factor)=
 
        endgroup
 enddef;
+
+pi:=3.14159;