diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkxl/mlib-lmt.lmt')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkxl/mlib-lmt.lmt | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkxl/mlib-lmt.lmt b/Master/texmf-dist/tex/context/base/mkxl/mlib-lmt.lmt new file mode 100644 index 00000000000..b7c869c3bac --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mkxl/mlib-lmt.lmt @@ -0,0 +1,199 @@ +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) |