summaryrefslogtreecommitdiff
path: root/metapost
diff options
context:
space:
mode:
Diffstat (limited to 'metapost')
-rw-r--r--metapost/context/mp-core.mp72
-rw-r--r--metapost/context/mp-tool.mp26
2 files changed, 79 insertions, 19 deletions
diff --git a/metapost/context/mp-core.mp b/metapost/context/mp-core.mp
index 63a49720a..fea67e1a8 100644
--- a/metapost/context/mp-core.mp
+++ b/metapost/context/mp-core.mp
@@ -27,20 +27,36 @@ enddef ;
def initialize_box_pos (expr pos,n,x,y,w,h,d) =
pair lxy, rxy, cxy, llxy, lrxy, ulxy, urxy ;
path pxy ; numeric hxy, wxy, dxy, nxy;
- lxy := (x,y) ; lxy[pos] := lxy ;
- llxy := (x,y-d) ; llxy[pos] := llxy ;
- lrxy := (x+w,y-d) ; lrxy[pos] := lrxy ;
- urxy := (x+w,y+h) ; urxy[pos] := urxy ;
- ulxy := (x,y+h) ; ulxy[pos] := ulxy ;
- wxy := w ; wxy[pos] := wxy ;
- hxy := h ; hxy[pos] := hxy ;
- dxy := d ; dxy[pos] := dxy ;
- rxy := lxy shifted (wxy,0) ; rxy[pos] := rxy ;
- pxy := llxy--lrxy--urxy--ulxy--cycle ; pxy[pos] := pxy ;
- cxy := center pxy ; cxy[pos] := cxy ;
- nxy := n ; nxy[pos] := nxy ;
+ lxy := (x,y) ;
+ llxy := (x,y-d) ;
+ lrxy := (x+w,y-d) ;
+ urxy := (x+w,y+h) ;
+ ulxy := (x,y+h) ;
+ wxy := w ;
+ hxy := h ;
+ dxy := d ;
+ rxy := lxy shifted (wxy,0) ;
+ pxy := llxy--lrxy--urxy--ulxy--cycle ;
+ cxy := center pxy ;
+ nxy := n ;
+ freeze_box(pos) ;
enddef ;
+def freeze_box (expr pos) =
+ lxy[pos] := lxy ;
+ llxy[pos] := llxy ;
+ lrxy[pos] := lrxy ;
+ urxy[pos] := urxy ;
+ ulxy[pos] := ulxy ;
+ wxy[pos] := wxy ;
+ hxy[pos] := hxy ;
+ dxy[pos] := dxy ;
+ rxy[pos] := rxy ;
+ pxy[pos] := pxy ;
+ cxy[pos] := cxy ;
+ nxy[pos] := nxy ;
+enddef ;
+
def initialize_box (expr n,x,y,w,h,d) =
numeric bpos ; bpos := 0 ; initialize_box_pos(bpos,n,x,y,w,h,d) ;
@@ -93,6 +109,32 @@ def initialize_par (expr fn,fx,fy,fw,fh,fd,
enddef ;
+def initialize_area_par (expr fn,fx,fy,fw,fh,fd,
+ tn,tx,ty,tw,th,td,
+ wn,wx,wy,ww,wh,wd) =
+
+ numeric fpos ; fpos := 1 ; initialize_box_pos(fpos,fn,fx,fy,fw,fh,fd) ;
+ numeric tpos ; tpos := 2 ; initialize_box_pos(tpos,tn,tx,ty,tw,th,td) ;
+ numeric wpos ; wpos := 3 ; initialize_box_pos(wpos,wn,wx,wy,ww,wh,wd) ;
+
+ numeric par_strut_height, par_strut_depth, par_line_height ;
+
+ par_strut_height := wh ;
+ par_strut_depth := wd ;
+ par_line_height := wh + wd ;
+
+ numeric ffpos ; ffpos := 4 ; initialize_box_pos(ffpos,wn,wx,fy,0,wh,wd) ;
+ numeric ttpos ; ttpos := 5 ; initialize_box_pos(ttpos,wn,wx+ww,ty,0,wh,wd) ;
+
+ do_initialize_area (ffpos, ttpos) ;
+
+ numeric mpos ; mpos := 6 ; freeze_box(mpos) ;
+
+% do_initialize_area (fpos, tpos) ;
+ do_initialize_par (fpos, tpos, mpos, ffpos, 0,0,0,0,0,0) ;
+
+enddef ;
+
def do_initialize_par (expr fpos, tpos, mpos, ppos, rw,rl,rr,rh,ra,ri) =
pair lref, rref, pref, lhref, rhref ;
@@ -322,7 +364,7 @@ def show_par =
enddef ;
vardef do_draw_par (expr p) =
- if length p > 2 :
+ if (length p>2) and (bbwidth(p)>1) and (bbheight(p)>1) :
save pp ; path pp ;
if (boxlineradius>0) and (boxlinetype=2) :
pp := p cornered boxlineradius ;
@@ -339,7 +381,7 @@ vardef do_draw_par (expr p) =
enddef ;
vardef baseline_grid (expr pxy, pdir, at_baseline) =
- if (par_line_height>0) : % and (round(bbheight(pxy))>=round(par_line_height)) :
+ if (par_line_height>0) and (bbheight(pxy)>1) and (bbwidth(pxy)>1) and (boxgridwidth>0) :
save grid, start ; picture grid ; pair start ;
grid := image
( %fails with inlinespace
@@ -370,7 +412,7 @@ vardef baseline_grid (expr pxy, pdir, at_baseline) =
enddef ;
vardef graphic_grid (expr pxy, dx, dy, x, y) =
- if (bbheight(pxy)>dy) and (bbwidth(pxy)>dx) :
+ if (bbheight(pxy)>dy) and (bbwidth(pxy)>dx) and (boxgridwidth>0) :
save grid ; picture grid ;
grid := image
( for i = xpart llcorner pxy step dx until xpart lrcorner pxy :
diff --git a/metapost/context/mp-tool.mp b/metapost/context/mp-tool.mp
index 408d56dfb..59988d5f3 100644
--- a/metapost/context/mp-tool.mp
+++ b/metapost/context/mp-tool.mp
@@ -707,9 +707,15 @@ primarydef p randomized s =
((point length(p) of p) randomshifted s)
fi
elseif pair p :
- p randomshifted s
+ p randomshifted s
+ elseif color p :
+ if pair s :
+ ((xpart s + uniformdeviate (ypart s - xpart s)) * p)
+ else :
+ (uniformdeviate s * p)
+ fi
else :
- p + uniformdeviate s
+ p + uniformdeviate s
fi)
enddef ;
@@ -780,7 +786,7 @@ drawpathoptions (withpen pencircle scaled 5 withcolor .8white) ;
def drawpath expr p =
normaldraw p _pth_opt_
-enddef;
+enddef ;
%D Arrow.
@@ -789,6 +795,18 @@ vardef drawarrowpath expr p =
drawarrow p _pth_opt_
enddef ;
+%def drawarrowpath expr p =
+% begingroup ;
+% save autoarrows ; boolean autoarrows ; autoarrows := true ;
+% save arrowpath ; path arrowpath ; arrowpath := p ;
+% _drawarrowpath_
+%enddef ;
+%
+%def _drawarrowpath_ text t =
+% drawarrow arrowpath _pth_opt_ t ;
+% endgroup ;
+%enddef ;
+
def midarrowhead expr p =
arrowhead p cutafter
(point length(p cutafter point .5 along p)+ahlength on p)
@@ -976,7 +994,7 @@ boolean autoarrows ; autoarrows := false ;
numeric ahfactor ; ahfactor := 2.5 ;
def set_ahlength (text t) =
- ahlength := (ahfactor*pen_size(t)) ;
+ ahlength := (ahfactor*pen_size(_op_ t)) ; % _op_ added
enddef ;
vardef pen_size (text t) =