diff options
Diffstat (limited to 'metapost')
| -rw-r--r-- | metapost/context/base/mpiv/mp-crop.mpiv | 22 | ||||
| -rw-r--r-- | metapost/context/base/mpiv/mp-node.mpiv | 144 | 
2 files changed, 102 insertions, 64 deletions
diff --git a/metapost/context/base/mpiv/mp-crop.mpiv b/metapost/context/base/mpiv/mp-crop.mpiv index 00bcdcb44..e06cf8def 100644 --- a/metapost/context/base/mpiv/mp-crop.mpiv +++ b/metapost/context/base/mpiv/mp-crop.mpiv @@ -15,7 +15,7 @@ if known context_crop : endinput ; fi ;  boolean context_crop ; context_crop := true ; -vardef crop_marks_lines (expr box, len, offset, nx, ny) = +vardef crop_marks_lines (expr box, len, offset, nx, ny, boxtoo) =      save p ; picture p ; save w, h, x, y ; numeric w, h, x, y ;      p := image (          x := if nx = 0 : 1 else : nx - 1 fi ; @@ -30,12 +30,20 @@ vardef crop_marks_lines (expr box, len, offset, nx, ny) =              draw ((llcorner box) -- (llcorner box) shifted (0,-len)) shifted (i*w,-offset) ;              draw ((ulcorner box) -- (ulcorner box) shifted (0, len)) shifted (i*w, offset) ;          endfor ; +        if boxtoo : +            for i=0 upto x-1 : +                for j=0 upto y-1 : +                    draw box enlarged 1/8 shifted (i*w,j*h) dashed evenly withpen pencircle scaled 1/4 ; +                endfor ; +            endfor ; +        fi ;      ) ;      setbounds p to box ;      p  enddef ;  vardef crop_marks_cmyk = +    pickup pencircle scaled 1/2 ;      save p ; picture p ; p := image (          fill ulcircle   scaled 12.5 withcolor (1,0,0,0) ;          fill urcircle   scaled 12.5 withcolor (0,1,0,0) ; @@ -125,6 +133,8 @@ enddef ;  def page_marks_add_color(expr width, height, length, offset) = % todo: namespace +    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; +      path page ; page := fullsquare xscaled width yscaled height ;      path more ; more := page enlarged (offset+length/2,offset+length/2) ; @@ -159,6 +169,8 @@ enddef ;  def page_marks_add_marking(expr width, height, length, offset) = % todo: namespace +    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; +      path page ; page := fullsquare xscaled width yscaled height ;      path more ; more := page enlarged (offset+length/2,offset+length/2) ; @@ -169,12 +181,14 @@ def page_marks_add_marking(expr width, height, length, offset) = % todo: namespa  enddef ; -def page_marks_add_lines(expr width, height, length, offset, nx, ny) = % todo: namespace +def page_marks_add_lines(expr width, height, length, offset, nx, ny, boxtoo) = % todo: namespace + +    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ;      path page ; page := fullsquare xscaled width yscaled height ;      path more ; more := page enlarged (offset+length/2,offset+length/2) ; -    draw crop_marks_lines(page,length,offset,nx,ny) ; +    draw crop_marks_lines(page,length,offset,nx,ny,boxtoo) ;      setbounds currentpicture to page ; @@ -182,6 +196,8 @@ enddef ;  def page_marks_add_number(expr width, height, length, offset, n) = % todo: namespace +    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ; +      path page ; page := fullsquare xscaled width yscaled height ;      path more ; more := page enlarged (offset+length/2,offset+length/2) ; diff --git a/metapost/context/base/mpiv/mp-node.mpiv b/metapost/context/base/mpiv/mp-node.mpiv index 834a5a01d..1f046a436 100644 --- a/metapost/context/base/mpiv/mp-node.mpiv +++ b/metapost/context/base/mpiv/mp-node.mpiv @@ -38,18 +38,23 @@ vardef makenodepath(suffix p) =      fi  enddef ; -def clearnodepath suffix p = -    save p ; path p ; +% can take a list: +def clearpath text t = +    save t ; path t ;  enddef ; -clearnodepath nodepath ; +def clearnodepath = clearpath nodepath enddef ; + +clearnodepath ; + +% the trailing "," below handles when number of t<3  vardef makenode@#(text t) =      for a = t : -        if (known a) and (numeric a) : -            _makenode(nodepath, t) +        if (path a) or (unknown a) : +            mfun_makenode@#(t,)          else : -            _makenode(t) +            mfun_makenode@#(nodepath, t,)          fi          exitif true ;      endfor @@ -57,10 +62,10 @@ enddef ;  vardef node@#(text t) =      for a = t : -        if (known a) and (numeric a) : -            _node(nodepath, t) +        if (path a) or (unknown a) : +            mfun_node@#(t,)          else : -            _node(t) +            mfun_node@#(nodepath, t,)          fi          exitif true ;      endfor @@ -68,81 +73,73 @@ enddef ;  vardef nodeboundingpoint@#(text t) =      for a = t : -        if (known a) and (numeric a) : -            _nodeboundingpoint@#(nodepath,a) +        if (path a) or (unknown a) : +            mfun_nodeboundingpoint@#(t)          else : -            _nodeboundingpoint@#(t) +            mfun_nodeboundingpoint@#(nodepath,a)          fi          exitif true ;      endfor  enddef ; -vardef fromto@#(expr d,f)(text t) = +vardef fromto@#(expr d, f)(text t) =      fromtopaths@#(d,nodepath,f,nodepath,t)  enddef ;  % returns a pair suffix if the path is unknown -vardef _makenode@#(suffix p)(text t) = -    save i, d, b ; numeric i, d ; string b ; +vardef mfun_makenode@#(suffix p)(expr i)(text t) = +    save d, b ; string b ; +    d = dimension p ; +    if d > 0 : +        b := prefix p ; +        if not picture p.pic[i] : scantokens("picture " & b & +                                      for j=1 upto d : "[]" & endfor +                                      "pic[] ;") ; fi +        if not pair    p.pos[i] : scantokens("pair "    & b & +                                      for j=1 upto d : "[]" & endfor +                                      "pos[] ;") ; fi +    else : +        if not picture p.pic[i] : picture p.pic[] ; fi +        if not pair    p.pos[i] : pair    p.pos[] ; fi +    fi      for a = t : -        if unknown i : % first argument is the index -            i = a ; -            d = dimension p ; -            if d > 0 : -                b := prefix p ; -                if not picture p.pic[i] : scantokens("picture " & b & -                                              for j=1 upto d : "[]" & endfor -                                              "pic[] ;") ; fi -                if not pair    p.pos[i] : scantokens("pair "    & b & -                                              for j=1 upto d : "[]" & endfor -                                              "pos[] ;") ; fi -            else : -                if not picture p.pic[i] : picture p.pic[] ; fi -                if not pair    p.pos[i] : pair    p.pos[] ; fi -            fi +        if known p.pic[i] : +            addto p.pic[i] also          else : -            if known p.pic[i] : -                addto p.pic[i] also -            else : -                p.pic[i] = -            fi +            p.pic[i] = +        fi              if     picture a           : a -            elseif string  a           : textext@#(a) +            elseif string  a           : if (length(a) > 0) : textext@#(a) else : nullpicture fi              elseif numeric a           : textext@#(decimal a)              elseif ((boolean a) and a) : image(draw origin withpen currentpen scaled 4)              else                       : nullpicture              fi ; -        fi      endfor      p.pos[i] if known p : := point i of p ; fi  enddef ;  % returns a picture -vardef _node@#(suffix p)(text t) = -    if pair _makenode@#(p,t) : +vardef mfun_node@#(suffix p)(expr i)(text t) = +    if pair mfun_makenode@#(p,i,t) :          % nop: enclose in "if ... fi" to gobble the function return.      fi -    % now pick-off only the index: -    for a = t : -        if (unknown p) and (known p.pos[a]) : -            makenodepath(p) ; -        fi -        if known p.pic[a] : -            p.pic[a] if known p : shifted point a of p fi -        else : -            nullpicture -        fi -        exitif true ; -    endfor +    if (unknown p) and (known p.pos[i]) : +        makenodepath(p) ; +    fi +    if known p.pic[i] : +        p.pic[i] if known p : shifted point i of p fi +    else : +        nullpicture +    fi  enddef ;  % returns a path  vardef fromtopaths@#(expr d)(suffix p)(expr f)(suffix q)(text s) =      save r, t, l ; -    path r[] ; numeric t ; picture l ; +    path r[] ; picture l ;      for a = s :          if unknown t :              t = a ; @@ -159,7 +156,7 @@ vardef fromtopaths@#(expr d)(suffix p)(expr f)(suffix q)(text s) =                   else :                       point f of p -- point t of q                   fi ; -            save deviation ; numeric deviation ; +            save deviation ;              deviation := if numeric d: d else: 0 fi ;              r1 = if deviation=0 : r0                  else : @@ -175,12 +172,12 @@ vardef fromtopaths@#(expr d)(suffix p)(expr f)(suffix q)(text s) =              else :                  l :=              fi -                 if     picture a           : a -                 elseif string a            : textext@#(a) -                 elseif numeric a           : textext@#(decimal a) -                 elseif ((boolean a) and a) : image(draw origin withpen currentpen scaled 4) -                 else                       : nullpicture -                 fi ; +                if     picture a           : a +                elseif string  a           : if (length(a) > 0) : textext@#(a) else : nullpicture fi +                elseif numeric a           : textext@#(decimal a) +                elseif ((boolean a) and a) : image(draw origin withpen currentpen scaled 4) +                else                       : nullpicture +                fi ;          fi      endfor      r2 = r1 @@ -202,7 +199,7 @@ enddef ;  % returns pair: bounding point of the node picture -vardef _nodeboundingpoint@#(suffix p)(expr i) = +vardef mfun_nodeboundingpoint@#(suffix p)(expr i) =      if known p.pic[i] :          boundingpoint@#(p.pic[i])      else : @@ -219,7 +216,7 @@ enddef ;  % returns pair: vector between nodes (+ optional scale)  vardef betweennodes@#(suffix p)(expr f)(suffix q)(text s) = -    save t ; numeric t ; +    save t ;      for a = s :          if unknown t :              t = a ; @@ -229,3 +226,28 @@ vardef betweennodes@#(suffix p)(expr f)(suffix q)(text s) =          fi      endfor  enddef ; + +% helpers that save passing tokens + +def mfun_node_init(expr dx, dy, da) = +     save nodelattice ; pair nodelattice[] ; +     nodelattice0 = (dx,0) ; +     nodelattice1 = dy * dir(da) ; +     clearnodepath ; +     save nodecount ; nodecount = -1; +enddef ; + +def mfun_node_make(expr x, y, s) = +    nodecount := nodecount + 1 ; +    makenode(nodecount,s) = x * nodelattice0 + y * nodelattice1 ; +enddef ; + +def mfun_node_flush = +    for i=0 upto nodecount: +        draw node(i) ; +    endfor +enddef ; + +vardef mfun_nodes_fromto@#(expr d, f)(text t) = +    fromtopaths@#(d,nodepath,f,nodepath,t) +enddef ;  | 
