if not modules then modules = { } end modules ['mlib-lmt'] = { version = 1.001, comment = "companion to mlib-ctx.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files", } -- todo: check for possible inject usage local type = type local round = math.round local aux = mp.aux local mpdirect = aux.direct local mppath = mp.path local scan = mp.scan local scannumeric = scan.numeric local scanpath = scan.path local injectpath = mp.inject.path local injectcolor = mp.inject.color local getparameter = metapost.getparameter local registerscript = metapost.registerscript function mp.lmt_function_x(xmin,xmax,xstep,code,shape) -- experimental local code = "return function(x) return " .. code .. " end" local action = load(code) local points = { } local nofpoints = 0 if action then action = action() end if shape == "steps" then local halfx = xstep / 2 local lastx = xmin local lasty = action(xmin) for xi = xmin, xmax, xstep do local yi = action(xi) local xx = lastx + halfx nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, lasty } nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, yi } lastx = xi lasty = yi end if points[nofpoints][1] ~= xmax then local yi = action(xmax) local xx = lastx + halfx nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, lasty } nofpoints = nofpoints + 1 ; points[nofpoints] = { xx, yi } lastx = xi lasty = yi end else for xi = xmin, xmax, xstep do nofpoints = nofpoints + 1 ; points[nofpoints] = { xi, action(xi) } end if points[nofpoints][1] ~= xmax then nofpoints = nofpoints + 1 ; points[nofpoints] = { xmax, action(xmax) } end end mppath(points,shape == "curve" and ".." or "--",false) end function mp.lmt_mesh_set() local mesh = getparameter { "mesh", "paths" } structures.references.currentset.mesh = mesh end function mp.lmt_mesh_update() local mesh = getparameter { "paths" } or getparameter { "mesh", "paths" } mesh[scannumeric()] = scanpath(true) end -- moved here function mp.lmt_svg_include() local labelfile = metapost.getparameter { "labelfile" } if labelfile and labelfile ~= "" then local labels = table.load(labelfile) -- todo: same path as svg file if type(labels) == "table" then for i=1,#labels do metapost.remaptext(labels[i]) end end end local fontname = metapost.getparameter { "fontname" } if fontname and fontname ~= "" then local unicode = metapost.getparameter { "unicode" } if unicode then mpdirect ( metapost.svgglyphtomp(fontname,math.round(unicode)) ) end return end local colorfile = metapost.getparameter { "colormap" } local colormap = false if colorfile and colorfile ~= "" then colormap = metapost.svgcolorremapper(colorfile) end local filename = metapost.getparameter { "filename" } if filename and filename ~= "" then mpdirect ( metapost.svgtomp { data = io.loaddata(filename), remap = true, colormap = colormap, id = filename, } ) else local buffer = metapost.getparameter { "buffer" } if buffer then mpdirect ( metapost.svgtomp { data = buffers.getcontent(buffer), -- remap = true, colormap = colormap, id = buffer or "buffer", } ) else local code = metapost.getparameter { "code" } if code then mpdirect ( metapost.svgtomp { data = code, colormap = colormap, id = "code", } ) end end end end registerscript("remaptext", function() local parameters = metapost.scanparameters() if parameters and parameters.label then metapost.remaptext(parameters) end end) do local dropins = fonts.dropins local registerglyph = dropins.registerglyph local registerglyphs = dropins.registerglyphs registerscript("registerglyph", function() registerglyph (metapost.getparameterset("mpsglyph")) end) registerscript("registerglyphs",function() registerglyphs(metapost.getparameterset("mpsglyphs")) end) end todecimal = xdecimal and xdecimal.new or tonumber -- bonus -- mail on list by Mikael Sundqvist and Taco's analysis of near duplicate points (2021/02/11+) registerscript("scrutenized", function() local p = scanpath() local d = 10^scannumeric() for i=1,#p do local pi = p[i] pi[1] = round(pi[1] * d) / d pi[2] = round(pi[2] * d) / d end local x1 = round(p[1][1]) local y1 = round(p[1][2]) local n = 1 local m = #p local t = { p[1], cycle = p.cycle } for i=2,m-1 do local pi = p[i] local x2 = r(pi[1]) local y2 = r(pi[2]) if x1 ~= x2 or y1 ~= y2 then n = n + 1 t[n] = p[i] x1 = x2 y1 = y2 end end local x1 = r(p[1][1]) local y1 = r(p[1][2]) local x2 = r(p[m][1]) local y2 = r(p[m][2]) if x1 ~= x2 or y1 ~= y2 then n = n + 1 t[n] = p[m] end mp.path(t) -- injectpath(t) end) -- A goodie, mostly a side effect of updating the metafun manual. local labtorgb = attributes.colors.labtorgb registerscript("labtorgb", function() injectcolor(labtorgb(scannumeric(),scannumeric(),scannumeric())) end)