diff options
author | Hans Hagen <pragma@wxs.nl> | 2020-11-23 19:48:34 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2020-11-23 19:48:34 +0100 |
commit | 18499e46a49b8ccf4346686d1cf626ada33935b8 (patch) | |
tree | bd0ae7b601b323e20954c10c07598637d9403e00 /metapost/context/base/mpiv/mp-lmtx.mpxl | |
parent | 4b089e589d39346a66a27d04f9857fe16e4b7b41 (diff) | |
download | context-18499e46a49b8ccf4346686d1cf626ada33935b8.tar.gz |
2020-11-23 18:39:00
Diffstat (limited to 'metapost/context/base/mpiv/mp-lmtx.mpxl')
-rw-r--r-- | metapost/context/base/mpiv/mp-lmtx.mpxl | 2281 |
1 files changed, 0 insertions, 2281 deletions
diff --git a/metapost/context/base/mpiv/mp-lmtx.mpxl b/metapost/context/base/mpiv/mp-lmtx.mpxl deleted file mode 100644 index 1f70d0ac1..000000000 --- a/metapost/context/base/mpiv/mp-lmtx.mpxl +++ /dev/null @@ -1,2281 +0,0 @@ -%D \module -%D [ file=mp-luas.lmtx, -%D version=2019.06.23, -%D title=\CONTEXT\ \METAPOST\ graphics, -%D subtitle=\LUA, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -% This is an experimental module where I test some new interface methods; -% for real advanced graphics use the luapost module. - -if known context_lmtx : endinput ; fi ; - -boolean context_lmtx ; context_lmtx := true ; - -presetparameters "text" [ - offset = 0, - strut = "auto", - style = "", - color = "", - text = "", - anchor = "", - format = "", - position = origin, - trace = false, - - background = "", % "color", - backgroundcolor = "gray", -] ; - -def lmt_text = applyparameters "text" "lmt_do_text" enddef ; - -vardef lmt_do_text = - image ( - pushparameters "text" ; - save style, anchor, txt, fmt, strt ; - string style, anchor, txt, fmt, strt, bgr ; - interim textextoffset := getparameter "offset" ; - style := getparameter "style" ; - anchor := getparameter "anchor" ; - strt := getparameter "strut" ; - fmt := getparameter "format" ; - txt := getparameter "text" ; - bgr := getparameter "background" ; - if fmt <> "" : - txt := "\formatone{" & fmt & "}{" & txt & "}" - fi ; - if strt = "yes" : - txt := "\strut " & txt ; - elseif strt = "auto" : - txt := "\setstrut\strut " & txt ; - fi ; - if style <> "" : - txt := "\style[" & style & "]{" & txt & "}" ; - fi ; - if getparameter "trace" : - txt := "\ruledhbox{\showstruts" & txt & "}" ; - fi ; - draw - if anchor = "" : thetextext else : scantokens("thetextext." & anchor) fi ( - txt, - getparameter "position" - ) - withcolor getparameter "color" ; - if bgr = "color" : - addbackground withcolor getparameter "backgroundcolor" ; - fi ; - popparameters ; - ) -enddef ; - -presetparameters "grid" [ - nx = 1, dx = 1, - ny = 1, dy = 1, -] ; - -def lmt_grid = applyparameters "grid" "lmt_do_grid" enddef ; - -vardef lmt_do_grid = - image ( - save nx; nx := getparameter "grid" "nx" ; - save ny; ny := getparameter "grid" "ny" ; - save dx; dx := getparameter "grid" "dx" ; - save dy; dy := getparameter "grid" "dy" ; - for i = 0 step dx until nx : - draw ((0,0) -- (0,ny)) shifted (i,0) ; - endfor ; - for i = 0 step dy until ny : - draw ((0,0) -- (nx,0)) shifted (0,i) ; - endfor ; - ) -enddef ; - -def lmt_axis = applyparameters "axis" "lmt_do_axis" enddef ; - -presetparameters "axis" [ - nx = 1, dx = 1, tx = 0, sx = 1, startx = 0, - ny = 1, dy = 1, ty = 0, sy = 1, starty = 0, - - samples = { }, - list = { }, - connect = false, - list = [ close = false ], - samplecolors = { "" }, - axiscolor = "", - textcolor = "", -] ; - -vardef lmt_do_axis = - image ( - - pushparameters "axis" ; - save nx, ny, dx, dy, tx, ty ; - save c, startx, starty ; string c ; - nx := getparameter "nx" ; - ny := getparameter "ny" ; - dx := getparameter "dx" ; - dy := getparameter "dy" ; - tx := getparameter "tx" ; - ty := getparameter "ty" ; - c := getparameter "axiscolor" ; - startx := getparameter "startx" ; - starty := getparameter "starty" ; - draw (startx,starty) -- (startx,ny) withcolor c ; - draw (startx,starty) -- (nx,starty) withcolor c ; - for i = startx step dx until nx : - if (i > startx) or (startx = 0) : - draw ((0,0) -- (0,-2)) shifted (i,starty) withcolor c ; - fi ; - endfor ; - for i = starty step dy until ny : - if (i > starty) or (starty = 0) : - draw ((0,0) -- (-2,0)) shifted (startx,i) withcolor c ; - fi ; - endfor ; - if tx <> 0 : - c := getparameter "textcolor" ; - for i = startx step tx until nx : - if (i > startx) or (startx = 0) : - draw - textext("\strut " & decimal (i)) ysized 2 shifted (i,-4+starty) - withcolor c; - fi ; - endfor ; - fi ; - if ty <> 0 : - c := getparameter "textcolor" ; - for i = starty step ty until ny : - if (i > starty) or (starty = 0) : - draw - textext.lft("\strut " & decimal (i)) ysized 2 shifted (-3+startx,i) - withcolor c; - fi ; - endfor ; - fi ; - - if (getparametercount "samples") > 0 : - if getparameter "connect" : - for s = 1 upto getparametercount "samples" : - c := getparameter "samplecolors" s ; - draw for i = 1 upto getparametercount "samples" s : - if (i > 1) : -- fi (i, getparameter "samples" s i) - endfor - withcolor c ; - endfor ; - else : - for s = 1 upto getparametercount "samples" : - c := getparameter "samplecolors" s ; - for i = 1 upto getparametercount "samples" s : - draw (i, getparameter "samples" s i) - withcolor c ; - endfor ; - endfor ; - fi ; - fi ; - - if (getparametercount "list") > 0 : - - save p, ts, a, d ; path p ; numeric ts ; pair a, d ; - - ts := (getparameter "sy") / 20 ; - - pushparameters "list" ; - for s = 1 upto getparametercount : - pushparameters s ; - - c := getparameter "color" ; - - % p := for i = 1 upto getparametercount "points": - % if (i > 1) : -- fi (getparameter "points" i) - % endfor - % if (getparameterdefault "close" false) : -- cycle fi ; - - % this can become: - - % p := if (getparameterdefault "close" false) : - % % getparameterpath "points" "--" true ; - % getparameterpath "points" true ; - % else : - % % getparameterpath "points" "--" false ; - % getparameterpath "points" ; - % fi ; - - % p := getparameterpath "points" if (getparameterdefault "close" false) : true fi ; - - p := getparameterpath "points" (getparameterdefault "close" false) ; - % p := getparameterpath "points" getparameterdefault "close" false ; - - draw p withcolor c ; - - pushparameters "labels" ; - if (getparametercount) > 0 : - for i = 1 upto getparametercount: - n := i - 1 ; - a := point n of p ; - d := direction n of p ; - draw - textext(getparametertext i true) - ysized ts - shifted (a + .5 * unitvector(d) rotated 90) ; - endfor ; - fi ; - popparameters ; - - pushparameters "texts" ; - if (getparametercount) > 0 : - for i = 1 upto getparametercount : - n := i + 0.5 ; - a := point n of p ; - d := direction n of p ; - draw textext.d(getparametertext i true) - if d < left : rotated 180 shifted (0,-5) else : shifted (0,5) fi - ysized ts - shifted a - rotatedaround(a,angle(d)) ; - endfor ; - fi ; - popparameters ; - - popparameters ; - endfor ; - popparameters ; - fi ; - - popparameters ; - - ) - xyscaled(getparameter "axis" "sx",getparameter "axis" "sy") -enddef ; - -presetparameters "outline" [ - text = "", - kind = "draw", - fillcolor = "", - drawcolor = "", - rulethickness = 1/10, - align = "", - style = "", - width = 0, -] ; - -def lmt_outline = applyparameters "outline" "lmt_do_outline" enddef ; - -vardef lmt_do_outline = - image ( normaldraw image ( - save kind ; string kind ; kind := getparameter "outline" "kind" ; - save align ; string align ; align := getparameter "outline" "align" ; - save style ; string style ; style := getparameter "outline" "style" ; - save width ; numeric width ; width := getparameter "outline" "width" ; - if kind = "draw" : - kind := "d" ; - elseif kind = "fill" : - kind := "f" ; - elseif kind = "both" : - kind := "b" ; - elseif kind = "reverse" : - kind := "r" ; - elseif kind = "fillup" : - kind := "u" ; - fi ; - currentoutlinetext := currentoutlinetext + 1 ; - lua.mp.mf_outline_text( - currentoutlinetext, - if align = "" : - getparameter "outline" "text", - else : - "\framed[align={" & align & "}" - if width > 0 : - & ",width=" & decimal width & "bp" - fi - if style <> "" : - & ",foregroundstyle={" & style & "}" - fi - & ",offset=none,frame=off]{" - & (getparameter "outline" "text") - & "}", - fi, - kind - ) ; - save currentpen; pen currentpen ; - pickup pencircle scaled getparameter "outline" "rulethickness" ; - if kind = "f" : - mfun_do_outline_text_set_f ( - withcolor getparameter "outline" "fillcolor" - ); - elseif kind = "d" : - mfun_do_outline_text_set_d ( - withcolor getparameter "outline" "drawcolor" - ); - elseif kind = "b" : - mfun_do_outline_text_set_b ( - withcolor getparameter "outline" "fillcolor" - ) ( - withcolor getparameter "outline" "drawcolor" - ); - elseif kind = "u" : - mfun_do_outline_text_set_u ( - withcolor getparameter "outline" "fillcolor" - ); - elseif kind = "r" : - mfun_do_outline_text_set_r ( - withcolor getparameter "outline" "drawcolor" - ) ( - withcolor getparameter "outline" "fillcolor" - ) ; - elseif kind = "p" : - mfun_do_outline_text_set_p ; - else : - mfun_do_outline_text_set_n ( - % what to use here - ); - fi ; - lua.mp.mf_get_outline_text(currentoutlinetext) ; - ) ) -enddef ; - -presetparameters "followtext" [ - text = "", - spread = true, - trace = false, - reverse = false, - autoscaleup = "no", - autoscaledown = "no", - path = (fullcircle), -] ; - -def lmt_followtext = applyparameters "followtext" "lmt_do_followtext" enddef ; - -vardef lmt_do_followtext = - image ( - pushparameters "followtext" ; - save s_u ; string s_u ; s_u := getparameter "autoscaleup" ; - save s_d ; string s_d ; s_d := getparameter "autoscaledown" ; - save followtextalternative ; followtextalternative := if getparameter "spread" : 1 else : 0 fi ; - save tracingfollowtext ; tracingfollowtext := if getparameter "trace" : 1 else : 0 fi ; - save autoscaleupfollowtext ; autoscaleupfollowtext := if s_u = "yes" : 1 elseif s_u = "max" : 2 else : 0 fi ; - save autoscaledownfollowtext ; autoscaledownfollowtext := if s_d = "yes" : 1 elseif s_d = "max" : 2 else : 0 fi ; - draw followtext ( - if (getparameter "reverse") : reverse fi (getparameter "path"), - getparameter "text" - ) ; - popparameters ; - ) -enddef ; - -presetparameters "arrow" [ - path = origin, - % pen = ..., - kind = "fill", - dimple = 1/5, - scale = 3/4, - penscale = 3, - length = 4, - angle = 45, - location = "end", % middle both - alternative = "normal", % dimpled curved - percentage = 50, - headonly = false, -] ; - -def lmt_arrow = applyparameters "arrow" "lmt_do_arrow" enddef ; - -vardef lmt_do_arrow = - image ( - pushparameters "arrow" ; - save a ; string a ; a := getparameter "alternative" ; - save l ; string l ; l := getparameter "location" ; - save k ; string k ; k := getparameter "kind" ; - save p ; path p ; p := getparameter "path" ; - save ahvariant ; ahvariant := if a = "dimpled" : 1 elseif a = "curved" : 2 else : 0 fi ; - save ahdimple ; ahdimple := getparameter "dimple" ; - save ahscale ; ahscale := getparameter "scale" ; - save ahangle ; ahangle := getparameter "angle" ; - save ahlength ; ahlength := getparameter "length" ; - if not getparameter "headonly" : - draw p ; - fi ; - if hasparameter "pen" : - % a cheat: we should have a type check in lua - if hasoption "pen" "auto" : - ahlength := (getparameter "penscale") * boundingradius(currentpen) ; - else : - ahlength := (getparameter "penscale") * boundingradius(getparameterpen "pen") ; - fi ; - fi ; - if k = "draw" : draw elseif k = "both" : filldraw else : fill fi - if l = "middle" : - midarrowhead p ; - elseif l = "percentage" : - arrowheadonpath (p, (getparameter "percentage")/100) ; - elseif l = "both" : - arrowhead p ; - if k = "draw" : draw elseif k = "both" : filldraw else : fill fi - arrowhead reverse p ; - else : - arrowhead p ; - fi ; - popparameters ; - ) -enddef ; - -% from dum - -presetparameters "placeholder" [ - color = "red", - width = 1, - height = 1, - reduction = 0, - alternative = "circle", -] ; - -def lmt_placeholder = applyparameters "placeholder" "lmt_do_placeholder" enddef ; - -def lmt_do_placeholder = - begingroup ; - pushparameters "placeholder" ; - save w, h, d, r, p, c, b, s, q, a ; - numeric w, h, d, r ; path p ; string s, a ; - s := getparameter "color" ; - w := getparameter "width" ; - h := getparameter "height" ; - r := getparameter "reduction" ; - a := getparameter "alternative" ; - d := max(w,h) ; - if cmykcolor resolvedcolor(s) : - cmykcolor c, b ; b := (0,0,0,0) - else : - color c, b ; b := (1,1,1) - fi ; - c := resolvedcolor(s) ; - p := unitsquare xyscaled (w,h) ; - fill p withcolor r[.5c,b] ; - if a = "square" : - vardef q = fullsquare enddef ; - elseif a = "triangle" : - vardef q = fulltriangle rotated (90 * round(uniformdeviate(4))) enddef ; - else : - vardef q = fullcircle enddef ; - fi ; - for i := 1 upto 60 : - fill q - scaled (d/5 randomized (d/5)) - shifted (center p randomized (d)) - withcolor r[c randomized(.3,.9),b] ; - endfor ; - clip currentpicture to p ; - popparameters ; - endgroup ; -enddef ; - -% maybe: - -vardef lmt_connected(text t) = - save p ; path p ; - p := origin t ; - subpath (1,length(p)) of p -enddef ; - -def lmt_connection expr t = - -- t -enddef ; - -% also (todo) - -% % draw lmt_path [ -% % points = [ color = "darkred", size = 6 ], -% % controls = [ color = "darkgreen", size = 4 ], -% % lines = [ color = "darkgray", size = 1 ], -% % shape = [ color = "middlegray", size = 8 ], -% % labels = [ ], -% % path = ((1cm,1cm) -- (1.5cm,1.5cm) .. (2cm,0cm) .. cycle) -% % ] ; -% -% presetparameters "path" [ -% labels = [ -% color = "", -% size = 1 -% ], -% controls = [ -% color = "black", -% size = 2.5 -% ], -% lines = [ -% color = "middlegray", -% size = 1 -% ], -% points = [ -% color = "black", -% size = 4 -% ], -% path = [ -% color = "lightgray", -% size = 5, -% path = origin -% ] -% ] ; -% -% def lmt_path = applyparameters "path" "lmt_do_path" enddef ; -% -% vardef lmt_do_path = -% image ( -% % This one is not that efficient ... we can better inline the drawing routines here, but -% % it's just an interfacing test after all. -% if hasparameter "path" "path" : -% save p ; path p ; p := getparameter "path" "path" ; -% drawpath p -% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "shape" "size" "*") -% withcolor getparameterdefault "path" "shape" "color" "*" -% ; -% if hasparameter "path" "controls" : -% drawcontrollines p -% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "lines" "size" "*" ) -% withcolor getparameterdefault "path" "lines" "color" "*" -% ; -% drawcontrolpoints p -% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "controls" "size" "*") -% withcolor getparameterdefault "path" "controls" "color" "*" -% ; -% fi ; -% if hasparameter "path" "points" : -% drawpoints p -% withpen pencircle scaled (drawoptionsfactor * getparameterdefault "path" "points" "size" "*") -% withcolor getparameterdefault "path" "points" "color" "*" -% ; -% if hasparameter "path" "labels" : -% drawpointlabels p -% withcolor getparameterdefault "path" "labels" "color" "*" -% ; -% fi ; -% fi ; -% fi ; -% ) -% enddef ; - -% Here we use nodraw and dodraw to create efficient axis ticks. Yet another demo -% of coding. - -presetparameters "function" [ - sx = 1mm, - sy = 1mm, - offset = 0, - xmin = 1, - xmax = 1, - xstep = 1, - xsmall = 0, - xlarge = 0, - xlabels = "no", - xticks = "bottom", % top bottom middle - xcaption = "", - ymin = 1, - ymax = 1, - ystep = 1, - ysmall = 0, - ylarge = 0, - % xfirst = 0, - % xlast = 0, - % yfirst = 0, - % ylast = 0, - ylabels = "no", - yticks = "left", % left right middle - ycaption = "", - code = "", - close = false, - shape = "curve", - fillcolor = "", - drawsize = 1, - drawcolor = "", - frame = "", % yes ticks - linewidth = .05mm, - pointsymbol = "", - pointsize = 2, - pointcolor = "", - xarrow = "", - yarrow = "", - reverse = false, -] ; - -def lmt_function = applyparameters "function" "lmt_do_function" enddef ; - -vardef lmt_do_function_p(expr xmin, xmax, xstep, code, shape, close, fcolor, dsize, dcolor, psymbol, psize, pcolor) = - save p, q ; path p, q ; - p := lua.mp.lmt_function_x(xmin,xmax,xstep,code,shape) ; - if close : - q := (xmin,0) -- p -- (xmax,0) -- cycle ; - fill q withcolor fcolor ; - else : - draw p withpen currentpen scaled dsize withcolor dcolor - ; - fi ; - if psize > 0 : - if psymbol = "dot" : - draw image ( - for i = 0 upto length(p) : - draw point i of p ; - endfor ; - ) withpen currentpen scaled psize withcolor pcolor ; - fi ; - fi ; -enddef ; - -vardef lmt_do_function = - image ( - pushparameters "function" ; - save sx, sy, lw, tl, tr, ts, tt, currentpen ; transform tr, tt ; pen currentpen ; - sx := getparameter "sx" ; - sy := getparameter "sy" ; - lw := getparameter "linewidth" ; - tl := 1/20 ; % tick length - ts := 1/10 ; % text scale - tr := identity xyscaled(10/sx,10/sy) ; - tt := identity xyscaled(ts/sx,ts/sy) ; - pickup pencircle xyscaled(lw/sx,lw/sy) ; - draw image ( - save xmin, xmax, xstep, xsmall, xlarge, ymin, ymax, ystep, ysmall, ylarge, p ; - save code, option, txl, txs, tyl, tys, swap ; - string code, option ; - path txl, txs, tyl, tys ; boolean swap ; - picture p ; - - xmin := getparameter "xmin" ; - xmax := getparameter "xmax" ; - xstep := getparameter "xstep" ; - xsmall := getparameter "xsmall" ; - xlarge := getparameter "xlarge" ; - ymin := getparameter "ymin" ; - ymax := getparameter "ymax" ; - ystep := getparameter "ystep" ; - ysmall := getparameter "ysmall" ; - ylarge := getparameter "ylarge" ; - code := getparameter "code" ; - swap := getparameter "reverse" ; - - p := image ( - - if (getparametercount "functions") > 0 : - for s = 1 upto getparametercount "functions" : - pushparameters "functions" s ; - lmt_do_function_p ( - getparameterdefault "xmin", - getparameterdefault "xmax", - getparameterdefault "xstep", - getparameterdefault "code", - getparameterdefault "shape", - getparameterdefault "close", - getparameterdefault "fillcolor", - getparameterdefault "drawsize", - getparameterdefault "drawcolor", - getparameterdefault "pointsymbol", - getparameterdefault "pointsize", - getparameterdefault "pointcolor" - ) ; - popparameters ; - endfor ; - elseif code <> "" : - lmt_do_function_p ( - getparameter "xmin", - getparameter "xmax", - getparameter "xstep", - getparameter "code", - getparameter "shape", - getparameter "close", - getparameter "fillcolor", - getparameter "drawsize", - getparameter "drawcolor", - getparameter "pointsymbol", - getparameter "pointsize", - getparameter "pointcolor" - ) ; - fi ; - ) ; - - if not swap : draw p fi ; - - option := getparameter "xticks" ; - if option = "top" : - txs := (0,0) -- (0,tl) ; - elseif option = "bottom" : - txs := (0,-tl) -- (0,0) ; - else : - txs := (0,-tl) -- (0,tl) ; - fi ; - - option := getparameter "yticks" ; - if option = "left" : - tys := (-tl,0) -- (0,0) ; - elseif option = "right" : - tys := (0,0) -- (tl,0) ; - else : - tys := (-tl,0) -- (tl,0) ; - fi ; - - txs := txs transformed tr ; - tys := tys transformed tr ; - txl := txs scaled 2 ; - tyl := tys scaled 2 ; - - % this arrow head scaling is for Alan to sort out ... - - xmin := getparameterdefault "xfirst" xmin ; - xmax := getparameterdefault "xlast" xmax ; - ymin := getparameterdefault "yfirst" ymin ; - ymax := getparameterdefault "ylast" ymax ; - - if hasoption "frame" "ticks,sticks" : - if xsmall > 0 : - if hasoption "frame" "horizontal" : - for i = ymin step ((ymax-ymin)/ysmall) until ymax : - draw (xmin,i) -- (xmax,i) ; - endfor ; - dodraw (xmin,ymin) ; % flush snippets - fi ; - fi ; - if ysmall > 0 : - if hasoption "frame" "vertical" : - for i = xmin step ((xmax-xmin)/xsmall) until xmax : - draw (i,ymin) -- (i,ymax) ; - endfor ; - dodraw (xmin,ymin) ; % flush snippets - fi ; - fi ; - fi ; - - option := getparameter "xarrow" ; - if option = "yes" : - save ahlength ; ahlength := tl ; - % save ahangle ; ahangle := 100/sy ; - drawarrow (xmin,0) -- (xmax,0) ; - else : - draw (xmin,0) -- (xmax,0) ; - fi ; - - option := getparameter "yarrow" ; - if option = "yes" : - save ahlength ; ahlength := tl ; - % save ahangle ; ahangle := 100/sx ; - drawarrow (xmin,ymin) -- (xmin,ymax) ; - else : - draw (xmin,ymin) -- (xmin,ymax) ; - fi ; - - if hasoption "frame" "yes" : - draw (xmin,ymin) -- (xmax,ymin) -- (xmax,ymax) -- (xmin,ymax) -- cycle ; - fi ; - - if hasoption "frame" "ticks,sticks" : - if xsmall > 0 : - if hasoption "frame" "horizontal" : - for i = ymin step ((ymax-ymin)/ysmall) until ymax : - draw (xmin,i) -- (xmax,i) ; - endfor ; - fi ; - if hasoption "frame" "bottom" : - txs := ((0,0) -- (0,tl)) if hasoption "frame" "sticks" : rotated 180 fi ; - txs := txs transformed tr ; - for i = xmin step ((xmax-xmin)/xsmall) until xmax : - nodraw txs shifted (i,ymin) ; - endfor ; - fi ; - if hasoption "frame" "top" : - txs := (0,0) -- (0,-tl) if hasoption "frame" "sticks" : rotated 180 fi ; - txs := txs transformed tr ; - for i = xmin step ((xmax-xmin)/xsmall) until xmax : - nodraw txs shifted (i,ymax) ; - endfor ; - fi ; - dodraw (xmin,ymin) ; % flush snippets - fi ; - if ysmall > 0 : - if hasoption "frame" "vertical" : - for i = xmin step ((xmax-xmin)/xsmall) until xmax : - draw (i,ymin) -- (i,ymax) ; - endfor ; - fi ; - if hasoption "frame" "left" : - tys := (0,0) -- (tl,0) if hasoption "frame" "sticks" : rotated 180 fi ; - tys := tys transformed tr ; - for i = ymin step ((ymax-ymin)/ysmall) until ymax : - nodraw tys shifted (xmin,i) ; - endfor ; - fi ; - if hasoption "frame" "right" : - tys := (0,0) -- (-tl,0) if hasoption "frame" "sticks" : rotated 180 fi ; - tys := tys transformed tr ; - for i = ymin step ((ymax-ymin)/ysmall) until ymax : - nodraw tys shifted (xmax,i) ; - endfor ; - fi ; - dodraw (xmin,ymin) ; % flush snippets - fi ; - fi ; - - if xsmall > 0 : - for i = xmin step xsmall until xmax : - nodraw txs shifted (i,0) ; - endfor ; - fi ; - - if xlarge > 0 : - for i = xmin step xlarge until xmax : - nodraw txl shifted (i,0) ; - endfor ; - dodraw (xmin,0) ; % flush snippets - elseif xsmall > 0 : - dodraw (xmin,0) ; % flush snippets - fi ; - - if ysmall > 0 : - for i = ymin step ysmall until ymax : - nodraw tys shifted (xmin,i) ; - endfor ; - fi ; - - if ylarge > 0 : - for i = ymin step ylarge until ymax : - nodraw tyl shifted (xmin,i) ; - endfor ; - dodraw (xmin,ymin) ; % flush snippets - elseif ysmall > 0 : - dodraw (xmin,ymin) ; % flush snippets - fi ; - - if swap : draw p fi ; - - if xlarge > 0 : - option := getparameter "xlabels" ; - if option <> "no" : - for i = xmin step xlarge until xmax : - if ((i <> 0) and ((option <> "nolimits") or ((i > xmin) and (i < xmax)))) : - draw textext.bot(decimal i) transformed tt - shifted (i,1.25*(ypart point 0 of txl)) ; - fi ; - endfor ; - fi ; - fi ; - - if ylarge > 0 : - option := getparameter "ylabels" ; - if option <> "no" : - for i = ymin step ylarge until ymax : - if ((i <> 0) and ((option <> "nolimits") or ((i > ymin) and (i < ymax)))) : - draw textext.lft(decimal i) transformed tt - shifted (xmin+1.25*(xpart point 0 of tyl),i) ; - fi ; - endfor ; - fi ; - fi ; - - option := getparameter "xcaption" ; - if (option <> "") : - draw textext.bot(option) transformed tt - shifted (xmin,-tl) - shifted center bottomboundary currentpicture ; - fi ; - - option := getparameter "ycaption" ; - if (option <> "") : - draw textext.lft(option) transformed tt - shifted (xmin-tl,0) - shifted center leftboundary currentpicture ; - fi ; - ) - - xyscaled(sx,sy) ; - - setbounds currentpicture to - boundingbox currentpicture - enlarged (getparameter "offset") ; - - popparameters ; - ) -enddef ; - -% Don't use this one! - -presetparameters "mesh" [ - trace = false, - auto = false, - step = 0.05, - % box = ... - % paths = { ..., ..., ... } -] ; - -def lmt_mesh = applyparameters "mesh" "lmt_do_mesh" enddef ; - -vardef lmt_do_mesh = - image ( - save p, b ; path p, b ; - pushparameters "mesh" ; - if getparameter "auto" : - b := if hasparameter "box" : getparameter "box" else : OverlayBox fi ; - for i=1 upto getparametercount "paths" : - p := getparameter "paths" i ; - p := meshed(p if not cycle p : -- cycle fi,b,getparameter "step") ; - if getparameter "trace" : - draw p ; - fi ; - runscript("mp.lmt_mesh_update()") i p ; - endfor ; - elseif getparameter "trace" : - for i=1 upto getparametercount "paths" : - p := getparameter "paths" i ; - draw p if not cycle p : -- cycle fi ; - endfor ; - fi ; - popparameters ; - runscript("mp.lmt_mesh_set()") ; - ) -enddef ; - -vardef mfun_meshed_clipped(expr pat, box, pct) = - pp := point (arctime pct of pat) of pat ; - if (ypart pp <= lly) or (ypart pp >= ury) or (xpart pp <= llx) or (xpart pp >= urx) : - (cp -- pp) intersection_point bb - else : - pp - fi -enddef ; - -vardef mfun_meshed_clipped(expr pat, box, pct) = - pp := point (arctime pct of pat) of pat ; - if ypart pp <= lly : - if xpart pp <= llx : - (llx, lly) - elseif xpart pp >= urx : - (urx, lly) - else : - (xpart pp, lly) - fi - elseif ypart pp >= ury : - if xpart pp <= llx : - (llx, ury) - elseif xpart pp >= urx : - (urx, ury) - else : - (xpart pp, ury) - fi - elseif xpart pp <= llx : - (llx, ypart pp) - elseif xpart pp >= urx : - (urx, ypart pp) - else : - pp - fi -enddef ; - -vardef meshed(expr pth, box, stp) = - begingroup - save cb, cp, llx, lly, urx, ury, pp, lp, bb ; pair cb, cp, pp ; path bb ; - bb := box enlarged -1/10; - cb := center bb ; - cp := center pth ; - llx := xpart llcorner bb; - lly := ypart llcorner bb; - urx := xpart urcorner bb; - ury := ypart urcorner bb; - lp := arclength pth ; - for i=stp step stp until 1+stp/2 : - cp -- - mfun_meshed_clipped(pth,bb,lp*(i-stp)) -- - mfun_meshed_clipped(pth,bb,lp*(i )) -- - cp -- - endfor cycle - endgroup -enddef ; - -vardef OverlayMesh(expr p, s) = - lmt_mesh [ paths = { meshed(p,OverlayBox,s) } ] -enddef ; - -% charts - -presetparameters "chart" [ - originsize = 1mm, - trace = false, - showlabels = true, - center = false, - - samples = { }, - - cumulative = false, - percentage = false, - maximum = 0, - distance = 1mm, - - % labels = { }, - labelstyle = "", - labelformat = "", - % labelstrut = "auto", - % labelanchor = "", - % labeloffset = 0, - labelfraction = 0.8, - labelcolor = "", - - backgroundcolor = "", - drawcolor = "white", - fillcolors = { % use color palet - "darkred", "darkgreen", "darkblue", - "darkyellow", "darkmagenta", "darkcyan", - "darkgray" - }, - colormode = "global", - - linewidth = .25mm, - - legendcolor = "", - legendstyle = "", - legend = { }, -] ; - -presetparameters "chart:circle" "chart" [ - height = 5cm, - width = 5mm, - labelanchor = "", - labeloffset = 0, - labelstrut = "no", -] ; - -presetparameters "chart:histogram" "chart" [ - height = 5cm, - width = 5mm, - labelanchor = "bot", - labeloffset = 1mm, - labelstrut = "auto", -] ; - -presetparameters "chart:bar" "chart" [ - height = 5mm, - width = 5cm, - labelanchor = "lft", - labeloffset = 1mm, - labelstrut = "no", -] ; - -def lmt_chart_circle = applyparameters "chart:circle" "lmt_do_chart_circle" enddef ; -def lmt_chart_histogram = applyparameters "chart:histogram" "lmt_do_chart_histogram" enddef ; -def lmt_chart_bar = applyparameters "chart:bar" "lmt_do_chart_bar" enddef ; - -def lmt_do_chart_start (expr what) = - pushparameters what ; - save width, height, distance, linewidth, labelgap, labelfraction, value, nofsamples, nofsamplesets ; - save fillcolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ; - string fillcolor, drawcolor, labelcolor, labelstyle, labelformat, labelstrut, labelanchor, colormode ; - height := getparameter "height" ; - width := getparameter "width" ; - distance := getparameter "distance" ; - linewidth := getparameter "linewidth" ; - drawcolor := getparameter "drawcolor" ; - colormode := getparameter "colormode" ; - labelcolor := getparameter "labelcolor" ; - labelgap := getparameter "labeloffset" ; - labelstyle := getparameter "labelstyle" ; - labelformat := getparameter "labelformat" ; - labelstrut := getparameter "labelstrut" ; - labelanchor := getparameter "labelanchor" ; - labelfraction := getparameter "labelfraction" ; - nofsamplesets := getparametercount "samples" ; - nofsamples := getmaxparametercount "samples" ; -enddef ; - -def lmt_do_chart_stop = - if getparameter "center" : - currentpicture := currentpicture shifted - center currentpicture ; - fi - if (getparameter "backgroundcolor") <> "" : - addbackground withcolor getparameter "backgroundcolor" ; - fi - if getparameter "trace" : - save b ; path b ; b := boundingbox currentpicture ; - draw image ( - draw fullcircle scaled 1mm ; - draw b - ) - dashed evenly scaled 1/4 - withpen pencircle scaled .125mm - withcolor "darkgray" ; - fi - popparameters ; -enddef ; - -vardef lmt_do_chart_text(expr s, i, value) = - lmt_text [ - style = labelstyle, - format = labelformat, - strut = labelstrut, - anchor = labelanchor, - offset = labelgap, - color = labelcolor, - text = (getparameterdefault "labels" s i (decimal value)) - background = "", - ] -enddef ; - -def lmt_do_chart_legend = - n := getparametercount "legend" ; - if n > 0 : - save dx, dy, p, l, w, o, d, ddy ; picture l ; - dx := xpart urcorner currentpicture + EmWidth ; - dy := ypart urcorner currentpicture ; - labelcolor := getparameter "legendcolor" ; - labelstyle := getparameter "legendstyle" ; - w := 2EmWidth ; - o := .25EmWidth ; - d := ExHeight ; - ddy := .8LineHeight ; - for i=1 upto n : - dy := dy - ddy ; - l := lmt_text [ - text = getparameter "legend" i, - anchor = "rt" - style = labelstyle, - color = labelcolor, - background = "", - ] ; - fill leftboundary l rightenlarged w - shifted (dx,dy+d) - withcolor getparameter "fillcolors" i ; - draw l - shifted (dx+w+o,dy+d) ; - endfor ; - fi ; -enddef ; - -vardef lmt_do_chart_circle = - image ( - lmt_do_chart_start("chart:circle") ; - if (nofsamplesets > 0) and (nofsamples > 0) : - nofsamplesets := 1 ; - save p, r, s, first, last, total, factor, n, percentage ; - path p, r, s[] ; boolean percentage ; - percentage := getparameter "percentage" ; - total := 0 ; - for i = 1 upto nofsamples : - total := total + getparameter "samples" (1) i ; % () is needed else 1i - endfor ; - factor := 100/total ; - first := 0 ; - p := fullcircle ysized (height) ; - r := origin -- (2*height,0) ; - for i = 1 upto nofsamples : - fillcolor := getparameter "fillcolors" i ; - value := (getparameter "samples" (1) i) * factor ; - last := first + (360 / 100) * value ; - s[i] := ((p cutbefore (r rotated first)) cutafter (r rotated last)) ; - fill origin -- s[i] -- cycle withcolor fillcolor ; - first := last ; - endfor ; - if linewidth > 0 : - if drawcolor = "" : - drawcolor := backgroundcolor ; - fi ; - for i = 1 upto nofsamples : - interim linecap := butt ; - draw origin -- (point 0 of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ; - draw origin -- (point length(s[i]) of s[i]) withpen pencircle scaled linewidth withcolor drawcolor ; - endfor ; - fi ; - if getparameter "showlabels" : - first := 0 ; - for i = 1 upto nofsamples : - value := getparameter "samples" (1) i ; - last := first + (360/100) * value * factor ; - draw lmt_do_chart_text (s,i,value) - shifted ((labelfraction*(height/2),0) rotated ((first+last)/2)) ; - first := last ; - endfor ; - fi ; - lmt_do_chart_legend ; - n := getparameter "originsize" ; - if n > 0 : - fill fullcircle scaled n withcolor "white" ; - fi ; - fi ; - lmt_do_chart_stop ; - ) -enddef ; - -vardef lmt_do_chart_histogram = - image ( - lmt_do_chart_start("chart:histogram") ; - if (nofsamplesets > 0) and (nofsamples > 0) : - save value, maximum, cumulative, maxwidth ; boolean cumulative ; - maximum := getparameter "maximum" ; - cumulative := getparameter "cumulative" ; - if labelanchor = "center" : - labelanchor := "vcenter" ; - fi ; - if maximum = 0 : - for s = 1 upto nofsamplesets : - for i = 1 upto nofsamples : - value := getparameter "samples" s i ; - maximum := if cumulative : - maximum + value ; - else : - max(maximum,value) ; - fi ; - endfor ; - endfor ; - fi ; - if nofsamplesets = 1 : - distance := 0 ; - fi ; - maxwidth := nofsamplesets * nofsamples * width + (nofsamples - 1)* distance ; - value := 0 ; - for s = 1 upto nofsamplesets : - for i = 1 upto nofsamples : - value := if cumulative : value + fi (getparameter "samples" s i) * height / maximum ; - fill unitsquare xyscaled (width,value) - if linewidth > 0 : - if i > 1 : leftenlarged (-linewidth/2) fi - if i < nofsamples : rightenlarged (-linewidth/2) fi - fi - shifted (nofsamplesets*(i-1)*width+(s-1)*width+(i-1)*distance,0) - withcolor getparameter "fillcolors" if colormode = "local" : s else : i fi ; - endfor ; - endfor ; - setbounds currentpicture to unitsquare xyscaled (maxwidth,height) ; - for s = 1 upto nofsamplesets : - if getparameter "showlabels" : - for i = 1 upto nofsamples : - draw lmt_do_chart_text (s,i,getparameter "samples" s i) - shifted (nofsamplesets*((i-1)*width)+width/2+(s-1)*width+(i-1)*distance,0) ; - endfor ; - fi ; - endfor ; - lmt_do_chart_legend ; - fi ; - lmt_do_chart_stop ; - ) -enddef ; - -vardef lmt_do_chart_bar = - - image ( - lmt_do_chart_start("chart:bar") ; - if (nofsamplesets > 0) and (nofsamples > 0) : - save value, maximum, cumulative, maxheight ; boolean cumulative ; - maximum := getparameter "maximum" ; - cumulative := getparameter "cumulative" ; - if labelanchor = "center" : - labelanchor := "hcenter" ; - fi ; - if maximum = 0 : - for s = 1 upto nofsamplesets : - for i = 1 upto nofsamples : - value := getparameter "samples" s i ; - maximum := if cumulative : maximum + value else : max(maximum,value) fi ; - endfor ; - endfor ; - fi ; - if nofsamplesets = 1 : - distance := 0 ; - fi ; - maxheight := nofsamplesets * nofsamples * height + (nofsamples - 1)* distance ; - for s = 1 upto nofsamplesets : - value := 0 ; - for i = 1 upto nofsamples : - value := if cumulative : value + fi (getparameter "samples" s i) * width / maximum ; - fill unitsquare xyscaled (value,height) - if linewidth > 0 : - if i > 1 : topenlarged (-linewidth/2) fi - if i < nofsamples : bottomenlarged (-linewidth/2) fi - fi - shifted (0,maxheight-nofsamplesets*i*height+(s-1)*height-(i-1)*distance) - withcolor getparameter "fillcolors" if colormode = "local" : s else : i fi ; - endfor ; - endfor ; - setbounds currentpicture to unitsquare xyscaled (width,maxheight) ; - if getparameter "showlabels" : - for s = 1 upto nofsamplesets : - for i = 1 upto nofsamples : - draw lmt_do_chart_text (s,i,getparameter "samples" s i) - shifted (0,maxheight-nofsamplesets*(i*height)+height/2+(s-1)*height-(i-1)*distance) ; - endfor ; - endfor ; - fi ; - lmt_do_chart_legend ; - fi ; - lmt_do_chart_stop ; - ) -enddef ; - -%D This one is more complex than needed but I want to trace so I need all those -%D variables. - -presetparameters "shade" [ - alternative = "circular", - path = origin -- cycle, - trace = false - - % alternative = "circular" | "linear" - % domain = { a, b } - % radius = a | { a, b } - % factor = a - % origin = (a,b) | { (a,b), {c, d) } - % vector = { a, b } - % colors = { a, b } - % center = a | { a, b } - % direction = "up" | "down" | "left" | "right" | { a, b } - -] ; - -% TODO: pass colors as strings - -def lmt_shade = applyparameters "shade" "lmt_do_shade" enddef ; - -vardef lmt_do_shade = - image ( - pushparameters "shade" ; - - save domain_min, domain_max, radius_a, radius_b, factor ; - save color_a, color_b, center_a, center_b, alternative, s ; - string color_a, color_b, alternative, s ; pair center_a, center_b ; - - alternative := getparameter "alternative" ; - - mfun_with_shade_method_analyze(getparameter "path") ; - - domain_min := 0 ; - domain_max := 1 ; - - color_a := "white" ; - color_b := "black" ; - - if alternative = "circular" : - center_a := center mfun_shade_path ; - center_b := center_a ; - radius_a := 0 ; - radius_b := mfun_max_radius(mfun_shade_path) ; - factor := 1.2 ; - else : - center_a := llcorner mfun_shade_path ; - center_b := urcorner mfun_shade_path ; - radius_a := 0 ; - radius_b := 0 ; - factor := 0; - fi ; - - if hasparameter "domain" : - domain_min := getparameter "domain" 1 ; - domain_max := getparameter "domain" 2 ; - fi - if hasparameter "radius" : - if numeric getparameter "radius" : - radius_a := 0 ; - radius_b := getparameter "radius" ; - else : - radius_a := getparameter "radius" 1 ; - radius_b := getparameter "radius" 2 ; - fi ; - factor := 1 ; - fi - if hasparameter "factor" : - factor := getparameter "factor" ; - fi - if hasparameter "origin" : - if pair getparameter "origin" : - center_a := getparameter "origin" ; - center_b := center_b ; - else : - center_a := getparameter "origin" 1 ; - center_b := getparameter "origin" 2 ; - fi ; - fi - if hasparameter "colors" : - color_a := getparameter "colors" 1 ; - color_b := getparameter "colors" 2 ; - fi - if hasparameter "direction" : - save a, b, bb ; path bb ; - bb := boundingbox(mfun_shade_path) ; - a := b := -1 ; - if string getparameter "direction" : - s := getparameter "direction" ; - if s = "up" : - p_a := xpart shadedup ; - p_b := ypart shadedup ; - elseif s = "down" : - p_a := xpart shadeddown ; - p_b := ypart shadeddown ; - elseif s = "left" : - p_a := xpart shadedleft ; - p_b := ypart shadedleft ; - elseif s = "right" : - p_a := xpart shadedright ; - p_b := ypart shadedright ; - fi - else : - p_a := getparameter "direction" 1 ; - p_a := getparameter "direction" 2 ; - fi - if p_a >= 0 : - center_a := point p_a of bb ; - fi - if p_b >= 0 : - center_b := point p_b of bb ; - fi - fi ; - if hasparameter "center" : - save cx, cy ; - if numeric getparameter "center" : - cx := getparameter "center" ; - cx := cy ; - % elseif pair getparameter "center" : - % cx := xpart getparameter "center" ; - % cy := ypart getparameter "center" ; - else : - cx := getparameter "center" 1 ; - cy := getparameter "center" 2 ; - fi - center_a := center mfun_shade_path shifted ( - cx * bbwidth (mfun_shade_path)/2, - cy * bbheight(mfun_shade_path)/2 - ) ; - elseif hasparameter "vector" : - center_a := point (getparameter "vector" 1) of mfun_shade_path ; - center_b := point (getparameter "vector" 2) of mfun_shade_path ; - fi - fill mfun_shade_path - withprescript "sh_domain=" & decimal domain_min & " " & decimal domain_max - withprescript "sh_transform=yes" - withprescript "sh_color=into" - withprescript "sh_color_a=" & colordecimals color_a - withprescript "sh_color_b=" & colordecimals color_b - withprescript "sh_first=" & ddecimal point 0 of mfun_shade_path % used for support scaling - withprescript "sh_set_x=" & ddecimal (mfun_shade_nx,mfun_shade_lx) % - withprescript "sh_set_y=" & ddecimal (mfun_shade_ny,mfun_shade_ly) % - if alternative = "linear" : - withprescript "sh_type=linear" - % withprescript "sh_factor=1" - withprescript "sh_factor=" & decimal factor - withprescript "sh_center_a=" & ddecimal center_a - withprescript "sh_center_b=" & ddecimal center_b - else : - withprescript "sh_type=circular" - % withprescript "sh_factor=1.2" - withprescript "sh_factor=" & decimal factor - withprescript "sh_center_a=" & ddecimal center_a - withprescript "sh_center_b=" & ddecimal center_b - withprescript "sh_radius_a=" & decimal radius_a - withprescript "sh_radius_b=" & decimal radius_b - fi ; - if getparameter "trace" : - draw fullcircle scaled 1mm shifted center_a ; - draw fullsquare scaled 2mm shifted center_b ; - draw textext.top("\strut\ttx center a") ysized LineHeight shifted center_a shifted (0, 2mm) ; - draw textext.bot("\strut\ttx center b") ysized LineHeight shifted center_b shifted (0,-2mm) ; - if alternative = "circular" : -% draw fullcircle scaled ( radius_a * 2) shifted center_a dashed evenly ; -% draw fullcircle scaled (factor * radius_b * 2) shifted -center_b dashed evenly ; - draw fullcircle scaled ( radius_a) shifted center_a dashed evenly ; - draw fullcircle scaled (factor * radius_b) shifted -center_b dashed evenly ; - fi - fi - popparameters ; - ) -enddef ; - -% This is very experimental and will first be tested by a few users who -% are interested in this. - -presetparameters "contour" [ - xmin = 0, - xmax = 0, - ymin = 0, - ymax = 0, - xstep = 0, - ystep = 0, - levels = 10, - % colors = { }, % used when set - preamble = "", - function = "x + y", - color = "lin(l)", % l/n - background = "bitmap", % bitmap | shape | band - foreground = "auto", % cell| edge | shape | auto: bitmap/edge shape/shape - linewidth = .25, - backgroundcolor = "black", - linecolor = "gray", - xformat = "@0.2N", - yformat = "@0.2N", - zformat = "@0.2N", - xstyle = "", - ystyle = "", - zstyle = "", - - width = 0, % auto when 0 - height = 0, % auto when 0 - - trace = false, - checkresult = false, - defaultnan = 0, - defaultinf = 0, - - legend = "all", % x | y | z | function | range | all (but range) - legendheight = LineHeight, - legendwidth = LineHeight, - legendgap = 0, - legenddistance = EmWidth, - textdistance = 2EmWidth/3, - functiondistance = ExHeight, - functionstyle = "", - - level = 4096, % for selecting one (can't be too large for scaled) - - axisdistance = ExHeight, - axislinewidth = .25, - axisoffset = ExHeight/4, - axiscolor = "black", - ticklength = ExHeight, - - xtick = 5, - ytick = 5, - xlabel = 5, - ylabel = 5, - -] ; - -% we can as well push ... - -def lmt_contour = applyparameters "contour" "lmt_do_contour" enddef ; - -def mfun_only_draw = addto currentpicture doublepath enddef ; -def mfun_only_fill = addto currentpicture contour enddef ; -def mfun_only_fillup text t = addto currentpicture doublepath t withpostscript "both" enddef ; -def mfun_only_nodraw text t = addto currentpicture doublepath t withpostscript "collect" enddef ; -def mfun_only_nofill text t = addto currentpicture contour t withpostscript "evenodd" enddef ; -def mfun_only_eofill text t = addto currentpicture contour t withpostscript "collect" enddef ; - -def lmt_do_contour_shortcuts = - save D ; let D = mfun_only_draw ; - save E ; let E = mfun_only_eofill ; - save F ; let F = mfun_only_fill ; - save U ; let U = mfun_only_fillup ; - save d ; let d = mfun_only_nodraw ; - save e ; let f = mfun_only_eofill ; - save f ; let f = mfun_only_nofill ; - save C ; let C = cycle ; - save B ; let B = controls ; - save A ; let A = and ; -enddef ; - -def lmt_do_contour_band = - lua.mp.lmt_contours_edge_set_by_band() ; - for v=1 upto lua.mp.lmt_contours_nofvalues() : - draw image ( - lua.mp.lmt_contours_edge_get_band(v) ; - ) - withcolor lua.mp.lmt_contours_color(v) ; - endfor ; -enddef; - -def lmt_do_contour_cell(expr dx,dy) = - lua.mp.lmt_contours_edge_set_by_cell() ; - draw image ( - if level = 4096 : - for v=1+1 upto lua.mp.lmt_contours_nofvalues() : - lua.mp.lmt_contours_edge_get_cell(v) ; - endfor ; - else : - lua.mp.lmt_contours_edge_get_cell(level) ; - fi - ) - if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi - withcolor getparameter "linecolor" - withpen pencircle scaled getparameter "linewidth" ; -enddef ; - -def lmt_do_contour_edge(expr dx, dy) = - lua.mp.lmt_contours_edge_set() ; - draw image ( - if level = 4096 : - for v=1+1 upto lua.mp.lmt_contours_nofvalues() : - lua.mp.lmt_contours_edge_paths(v); - endfor ; - else : - lua.mp.lmt_contours_edge_paths(level); - fi - ) - if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi - withcolor getparameter "linecolor" - withpen pencircle scaled getparameter "linewidth" ; -enddef ; - -def lmt_do_contour_edges(expr dx, dy) = - lua.mp.lmt_contours_edge_set() ; - if level = 4096 : - for v=1+1 upto lua.mp.lmt_contours_nofvalues() : - draw image ( - lua.mp.lmt_contours_edge_paths(v); - ) - if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi - withpen pencircle scaled getparameter "linewidth" - withcolor lua.mp.lmt_contours_color(v) ; - endfor ; - else : - draw image ( - lua.mp.lmt_contours_edge_paths(level); - ) - if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi - withpen pencircle scaled getparameter "linewidth" - withcolor lua.mp.lmt_contours_color(level) ; - fi ; -enddef ; - -def lmt_do_contour_cells(expr dx, dy) = - lua.mp.lmt_contours_edge_set_by_cell() ; - if level = 4096 : - for v=1+1 upto lua.mp.lmt_contours_nofvalues() : - draw image ( - lua.mp.lmt_contours_edge_get_cell(v) ; - ) - if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi - withpen pencircle scaled getparameter "linewidth" - withcolor lua.mp.lmt_contours_color(v) ; - endfor ; - else : - draw image ( - lua.mp.lmt_contours_edge_get_cell(level) ; - ) - if offset : shifted (-1/2,-1/2) fi - withpen pencircle scaled getparameter "linewidth" - withcolor lua.mp.lmt_contours_color(v) ; - fi ; -enddef ; - -def lmt_do_contour_shape(expr dx, dy) = - draw image ( - if level = 4096 : - for v=1+1 upto lua.mp.lmt_contours_nofvalues() : - lua.mp.lmt_contours_shape_paths(v); - endfor ; - else : - lua.mp.lmt_contours_shape_paths(level); - lua.mp.lmt_contours_shape_paths(1); - fi - ) - if (dx <>0) or (dy <> 0) : shifted (dx,dy) fi - withcolor getparameter "linecolor" - withpen pencircle scaled getparameter "linewidth" ; -enddef ; - -def lmt_do_contour_bitmap = - lua.mp.lmt_contours_bitmap_set() ; - lua.mp.lmt_contours_bitmap_get() ; -enddef ; - -def lmt_do_contour_shades(expr outlines) = - lua.mp.lmt_contours_shade_set(outlines) ; - if level = 4096 : - for v=1 upto lua.mp.lmt_contours_nofvalues() : % no + 1 here - draw image ( - lua.mp.lmt_contours_shade_paths(v) ; - ) - withpen pencircle scaled 0 - withcolor lua.mp.lmt_contours_color(v) ; - endfor ; - else : - draw image ( - lua.mp.lmt_contours_shade_paths(level); - ) - withpen pencircle scaled 0 - withcolor lua.mp.lmt_contours_color(level) ; - fi ; -enddef ; - -def lmt_load_mlib_cnt = - runscript("lua.registercode('mlib-cnt')"); - extra_beginfig := extra_beginfig & % todo: use different hook - "runscript(" & ditto & "mp.lmt_contours_cleanup()" & ditto & ")" ; - let lmt_load_mlib_cnt = relax ; -enddef ; - -vardef lmt_do_contour = - image ( - - lmt_load_mlib_cnt ; - - pushparameters "contour" ; - - lua.mp.lmt_contours_start() ; - - % graphic - - save bg, fg, nx, ny, trace, level, b, done ; string bg, fg ; boolean trace, done ; path b ; - - bg := getparameter "background" ; - fg := getparameter "foreground" ; - nx := lua.mp.lmt_contours_nx() ; - ny := lua.mp.lmt_contours_ny() ; - trace := getparameter "trace" ; - level := getparameter "level" ; - done := true ; - - begingroup ; - - lmt_do_contour_shortcuts ; - - if bg = "band" : - lmt_do_contour_band ; - b := boundingbox currentpicture ; - if (fg = "auto") or (fg = "cell") : - lmt_do_contour_cell(0,0) ; - elseif (fg = "edge") : - lmt_do_contour_edge(0,0) ; % true ? - fi ; - - elseif bg = "bitmap" : - - lmt_do_contour_bitmap ; - b := boundingbox currentpicture ; - if (fg = "auto") or (fg = "cell") : - lmt_do_contour_cell(-1/2,-1/2) ; - elseif (fg = "edge") : - lmt_do_contour_edge(-1/2,-1/2) ; - fi ; - - elseif bg = "shape" : - - lmt_do_contour_shades((fg = "auto") or (fg = "shape")) ; - b := boundingbox currentpicture ; - if (fg == "auto") or (fg = "shape") : - lmt_do_contour_shape(0,0) ; - elseif fg == "cell" : - lmt_do_contour_cell(-1,-1) ; - elseif fg == "edge" : - lmt_do_contour_edge(-1,-1) ; - fi ; - - % currentpicture := currentpicture reflectedabout ( (0, ny/2), (nx,ny/2) ) ; - - elseif fg = "cell" : - - lmt_do_contour_shortcuts ; - lmt_do_contour_cells(0,0) ; - b := boundingbox currentpicture ; - - elseif fg = "edge" : - - lmt_do_contour_shortcuts ; - lmt_do_contour_edges(0,0) ; - b := boundingbox currentpicture ; - - else : - - done := false ; - - fi ; - - endgroup ; - - if done : - - save w, h, cx, cy ; - - cx := - bbwidth (b)/(nx - 1) ; - cy := - bbheight(b)/(ny - 1) ; - clip currentpicture to b - leftenlarged cx rightenlarged cx - topenlarged cy bottomenlarged cy ; - currentpicture := currentpicture - shifted (cx,cy) ; - - w := getparameter "width" ; - h := getparameter "height" ; - - % axis - - save xtic, ytic, auto ; boolean auto ; - - xtic := getparameter "xtick" ; - ytic := getparameter "ytick" ; - auto := (w = 0) and (h = 0) ; - - % resize - - if w <> 0 : - if h <> 0 : - currentpicture := currentpicture xysized (w,h) ; - else : - currentpicture := currentpicture xsized w ; - fi ; - elseif h <> 0 : - currentpicture := currentpicture ysized h ; - fi ; - if w = 0 : - w := bbwidth(currentpicture) ; - fi ; - if h = 0 : - h := bbheight(currentpicture) ; - fi ; - - % legend - - if hasoption "legend" "all,x,y,z,range" : - - save u, s, sx, sy, ax, ay, ao, al, at, tl, ox, oy, lg, tx, ty, wx, hx, ry, fmt, pmin, pmax ; string fmt; picture pmin, pmax ; - - % move some in the ifs - - if hasoption "legend" "all,z" : - - % colorbar - - fmt := lua.mp.lmt_contours_format() ; - pmin := lmt_text [ format = fmt, text = decimal lua.mp.lmt_contours_minmean() ] ; - pmax := lmt_text [ format = fmt, text = decimal lua.mp.lmt_contours_maxmean() ] ; - wx := max(bbwidth(pmin),bbwidth(pmax)) ; - hx := bbheight(pmin) ; - - else : - - hx := 0; - - fi ; - - if auto : - % u := 1 ; - u := lua.mp.lmt_contours_ny() / 100 ; - ry := 4u ; - sy := 5u ; - sx := 5u ; - lg := 0 ; - ox := 5u ; - oy := - sy/2 + ry/2 ; - tx := 2u ; - ty := 1u ; - ax := 1u ; - ay := 1u ; - ao := u ; - al := u/8 ; - at := 3u/2 ; - al := u/4 ; - else : - ry := 0 ; - sy := getparameter "legendheight" ; - sx := getparameter "legendwidth" ; - lg := getparameter "legendgap" ; - ox := getparameter "legenddistance" ; - oy := - sy/2 + hx/2 ; - tx := getparameter "textdistance" ; - ty := getparameter "functiondistance" ; - ax := getparameter "axisdistance" ; - ay := ax ; - ao := getparameter "axisoffset" ; - at := getparameter "ticklength" ; - al := getparameter "axislinewidth" ; - fi ; - - if hasoption "legend" "all,z" : - - save dy ; dy := h ; - - for v=1 upto lua.mp.lmt_contours_nofvalues() : - dy := dy - sy ; - fill unitsquare xyscaled (sx,sy) - shifted (w+ox,dy) - withcolor lua.mp.lmt_contours_color(v) ; - draw - lmt_text [ - trace = trace, - anchor = "llft", - format = fmt, - text = decimal lua.mp.lmt_contours_value(v), - style = getparameter "zstyle", - position = (wx,0), - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (w+ox+tx+sx,dy+sy+oy) - ; - dy := dy - lg ; - endfor ; - - fi ; - - if hasoption "legend" "x,all" : - - save n, d, s, xmin, xmax, xlab ; - - xmin := getparameter "xmin" ; - xmax := getparameter "xmax" ; - xlab := getparameter "xlabel" ; - - draw image ( - interim linecap := butt ; - draw ((0,0) -- (w,0)) ; - n := al/2 ; s := (w - al) / xtic ; d := (xmax - xmin) / xtic ; - for i=xmin step d until xmax : - draw (n,0) -- (n,-at) ; - n := n + s ; - endfor ; - ) shifted (0,-ay) - withpen pencircle scaled al - withcolor getparameter "axiscolor" - ; - - if hasoption "legend" "label,all" : - - draw image ( - n := al/2 ; s := (w - al) / xlab ; d := (xmax - xmin) / xlab ; - for i=xmin step d until xmax : - draw lmt_text [ - trace = trace, - anchor = "bot", - format = getparameter "xformat", - style = getparameter "xstyle", - text = decimal i - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (n,-at-ao) - ; - n := n + s ; - endfor ; - ) shifted (0,-ay) ; - - fi ; - - fi ; - - if hasoption "legend" "y,all" : - - save n, d, s, ymin, ymax, ylab ; - - ymin := getparameter "ymin" ; - ymax := getparameter "ymax" ; - ylab := getparameter "ylabel" ; - - draw image ( - interim linecap := butt ; - draw ((0,0) -- (0,h)) ; - n := al/2 ; s := (h - al) / ytic ; d := (ymax - ymin) / ytic ; - for i=ymin step d until ymax : - draw (0,n) -- (-at,n) ; - n := n + s ; - endfor ; - ) shifted (-ax,0) - withpen pencircle scaled al - withcolor getparameter "axiscolor" ; - ; - - if hasoption "legend" "label,all" : - - draw image ( - n := al/2 ; s := (h - al) / ylab ; d := (ymax - ymin) / ylab ; - for i=ymin step d until ymax : - draw lmt_text [ - trace = trace, - anchor = "lft", - format = getparameter "yformat", - style = getparameter "ystyle", - text = decimal i - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (-at-ao,n) - ; - n := n + s ; - endfor ; - ) shifted (-ax,0) ; - - fi ; - - fi ; - - if hasoption "legend" "range,all" : - - % range - - save d ; d := ypart llcorner currentpicture ; - - draw - lmt_text [ - trace = trace, - anchor = "bot", - text = lua.mp.lmt_contours_range() - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (w/2,d-ty) - ; - - % minmax - - draw - lmt_text [ - trace = trace, - anchor = "lrt", - text = lua.mp.lmt_contours_xrange() - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (0,d-ty) - ; - - draw - lmt_text [ - trace = trace, - anchor = "llft", - text = lua.mp.lmt_contours_yrange() - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (w,d-ty) - ; - - fi ; - - if hasoption "legend" "function,all" : - - % formula - - draw - lmt_text [ - trace = trace, - anchor = "bot", - style = getparameter "functionstyle", - text = lua.mp.lmt_contours_function() - background = "", - ] - if ry <> 0 : ysized (ry) fi - shifted (w/2,ypart llcorner currentpicture - ty) - ; - - fi ; - - if trace : - draw boundingbox currentpicture - dashed evenly - withpen pencircle scaled al ; - fi ; - - fi ; - - fi ; - - lua.mp.lmt_contours_stop() ; - - popparameters ; - ) -enddef ; - -newinternal svgforcecmyk ; svgforcecmyk := 0 ; - -vardef svgcolor(expr r, g, b) = - if svgforcecmyk > 0 : - (1-r,1-g,1-b,0) % simple: no black component, kind of ok for emoji - else : - (r,g,b) - fi -enddef ; - -vardef svgcmyk(expr c, m, y, k) = - (c,m,y,k) -enddef ; - -vardef svggray(expr s) = - s -enddef ; - -presetparameters "svg" [ - filename = "", - fontname = "", - colormap = "", - % unicode = 0, - width = 0, - height = 0, - origin = false, - offset = 0, -] ; - -def lmt_svg = applyparameters "svg" "lmt_do_svg" enddef ; - -vardef lmt_do_svg = - save w, h, o; - image ( - pushparameters "svg" ; - w := getparameter "width" ; - h := getparameter "height" ; - o := getparameter "offset" ; - lua.mp.lmt_svg_include() ; - if getparameter "origin" : - currentpicture := currentpicture shifted -llcorner currentpicture ; - fi ; - popparameters ; - if o <> 0 : - setbounds currentpicture to boundingbox currentpicture enlarged o ; - fi ; - ) - if w > 0 : - if h > 0 : xysized(w,h) else : xsized(w) fi - else : - if h > 0 : ysized(h) fi - fi -enddef ; - -% Another experiment. Parameters might change pending a discussion between Alan -% and me. - -presetparameters "surface" [ - code = "x + y", - color = "f, 0, 0", - linecolor = 1, - xmin = -1, - xmax = 1, - ymin = -1, - ymax = 1, - xstep = .1, - ystep = .1, - snap = .01, - xvector = { -0.7, -0.7 }, - yvector = { 1, 0 }, - zvector = { 0, 1 }, - light = { 3, 3, 10 }, - bright = 100, - clip = false, - lines = true, - linecolor = 1, - % axis = { } - % clipaxis = false - axiscolor = "gray" - axislinewidth = 1/2, -] ; - -def lmt_surface = applyparameters "surface" "lmt_do_surface" enddef ; - -vardef lmt_do_surface = - image ( - - lmt_load_mlib_cnt ; - - pushparameters "surface" ; - - save currentpen; pen currentpen ; - currentpen := pencircle scaled .25 ; - - interim linejoin := butt ; - - lmt_do_contour_shortcuts ; - - lua.mp.lmt_surface_do() ; - - currentpicture := currentpicture ysized getparameter "height" ; - - if hasparameter "axis" : - - save p ; picture p ; p := image ( - if hasparameter "axis" 1 : - draw ((origin) -- unitvector(getparameter "xvector")) scaled (getparameter "axis" 1) ; - fi ; - if hasparameter "axis" 2 : - draw ((origin) -- unitvector(getparameter "yvector")) scaled (getparameter "axis" 2) ; - fi ; - if hasparameter "axis" 3 : - draw ((origin) -- unitvector(getparameter "zvector")) scaled (getparameter "axis" 3) ; - fi ; - ) ; - - if getparameterdefault "clipaxis" false : - clip p to boundingbox currentpicture ; - fi ; - - draw p - withpen pencircle scaled getparameter "axislinewidth" - withcolor getparameter "axiscolor" - ; - - fi ; - - popparameters ; - ) -enddef ; - -% I can make a variant that avoids the lmt_do ... and does an immediate function -% call instead. - -presetparameters "mpsglyphs" [ - name = "dummy", - units = 1000, -] ; - -presetparameters "mpsglyph" [ - category = "dummy", - unicode = 0, - % unichar = "" -] ; - -def lmt_registerglyphs = applyparameters "mpsglyphs" "lmt_do_registerglyphs" enddef ; -def lmt_registerglyph = applyparameters "mpsglyph" "lmt_do_registerglyph" enddef ; - -vardef lmt_do_registerglyphs = lua.mp.lmt_register_glyphs() ; enddef ; -vardef lmt_do_registerglyph = lua.mp.lmt_register_glyph () ; enddef ; - -% Again an experiment (todo: the faster method): - -def lmt_remaptext = runscript("mp.lmt_do_remaptext()") enddef ; - -triplet mfun_tt_s ; - -vardef rawmaptext(expr s) = - mfun_tt_n := mfun_tt_n + 1 ; - mfun_tt_c := nullpicture ; - mfun_tt_o := nullpicture ; - addto mfun_tt_o doublepath origin _op_ ; % save drawoptions - mfun_tt_r := lua.mp.mf_map_text(mfun_tt_n,s,catcoderegime) ; - mfun_tt_s := lua.mp.mf_map_move(mfun_tt_n) ; - addto mfun_tt_c doublepath unitsquare - xscaled wdpart mfun_tt_r - yscaled (htpart mfun_tt_r + dppart mfun_tt_r) - shifted (0,-dppart mfun_tt_r) - withprescript "mf_object=text" - withprescript "tx_index=" & decimal mfun_tt_n - withprescript "tx_color=" & colordecimals colorpart mfun_tt_o - ; - mfun_tt_c -enddef ; - -vardef svgtext(expr t) = - save p ; picture p ; - % mfun_tt_s := (0,0,0) ; - % mfun_tt_r := (0,0,0) ; - p := rawmaptext(t) ; - p - if (mfun_labtype.drt >= 10) : % drt etc - shifted (0,ypart center p) - fi - shifted ( - - mfun_labshift.drt(p) - - (redpart mfun_tt_s,0) - + (greenpart mfun_tt_s,bluepart mfun_tt_s) - ) -enddef ; - -vardef svg expr c = lmt_svg [ code = c ] enddef ; - -% Fun stuff: - -presetparameters "poisson" [ - width = 50, - height = 50, - initialx = 0, - initialy = 0, - distance = 1, - count = 20, - macro = "draw", - arguments = 2 -] ; - -def lmt_poisson = applyparameters "poisson" "lmt_do_poisson" enddef ; - -vardef lmt_do_poisson = - image ( - pushparameters "poisson" ; - lua.mp.lmt_poisson_generate(); - popparameters ; - ) -enddef ; |