meta-imp-outlines.mkiv / last modification: 2020-01-30 14:16
%D \module
%D   [       file=meta-imp-outlines,
%D        version=2015.06.02,
%D          title=\METAPOST\ Graphics,
%D       subtitle=Outlines,
%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.

\startluacode

local concat      = table.concat
local formatters  = string.formatters
local validstring = string.valid

local f_setbounds = formatters["setbounds currentpicture to (%s) enlarged %.4G;"]
local f_index     = formatters['draw anchored.bot(textext("\\tttf\\setstrut\\strut index %i") ysized 10bp ,.5[llcorner currentpicture,lrcorner currentpicture] shifted (0,%.4G));']
local f_unicode   = formatters['draw anchored.bot(textext("\\tttf\\setstrut\\strut unicode %05X") ysized 10bp ,.5[llcorner currentpicture,lrcorner currentpicture] shifted (0,%.4G));']

local f_in_red    = formatters["draw %s withpen pencircle scaled .15 withcolor .5red;"]
local f_in_green  = formatters["draw %s withpen pencircle scaled .15 withcolor .5green;"]
local f_in_blue   = formatters["draw %s withpen pencircle scaled .15 withcolor .5blue;"]
local f_in_gray   = formatters["draw image(%s) withcolor .75yellow;"]

local f_glyph = formatters [ [[
pickup pencircle scaled .15;
pointlabelfont := "Mono sa .125";
pointlabelscale := 1bp ;
drawoptionsfactor := .2bp ;
originlength := 2bp ;
%s;
]] ]

local metapost  = fonts.metapost

local variables = interfaces.variables

local v_all     = variables.all
local v_page    = variables.page
local v_text    = variables.text
local v_command = variables.command
local v_box     = variables.box
local v_width   = variables.width
local v_min     = variables.min
local v_max     = variables.max
local v_comment = variables.comment
local v_simple  = variables.simple

function metapost.showglyph(specification)
    local fontid      = font.current()
    local shapedata   = fonts.hashes.shapes[fontid] -- by index
    local chardata    = fonts.hashes.characters[fontid] -- by unicode
    local shapeglyphs = shapedata.glyphs or { }
    local character   = validstring(specification.character)
    local index       = validstring(specification.index)
    local alternative = validstring(specification.alternative)
    local command     = validstring(specification.command)
    local options     = utilities.parsers.settings_to_set(specification.option)
    local all         = not next(options) and not options[v_simple] or options[v_all]
    local function shape(index,what,f_comment)
        if not index then
            return
        end
        local glyph = shapeglyphs[index]
        if glyph and (glyph.segments or glyph.sequence) then
            local units  = shapedata.units or 1000
            local factor = 100/units
            local paths  = metapost.paths(glyph,factor)
            if #paths > 0 and glyph.boundingbox and glyph.width then
                local graphic = f_glyph(concat{
                                                    f_in_gray  (metapost.fill(paths)),
                                                                metapost.draw(paths,true), -- true triggers trace
                    (all or options[v_box])     and f_in_red   (metapost.boundingbox(glyph,factor)) or "",
                    (all or options[v_width])   and f_in_green (metapost.widthline(glyph,factor)) or "",
                    (all or options[v_min])     and f_in_blue  (metapost.zeroline(glyph,factor)) or "",
                    (all or options[v_max])     and f_setbounds(metapost.maxbounds(data,index,factor),offset or 1) or "",
                    (all or options[v_comment]) and f_comment  (what,1) or "",
                })
                if alternative == v_page then
                    context.startMPpage()
                        context(graphic)
                    context.stopMPpage()
                elseif alternative == v_command then
                    context[command](graphic)
                else -- v_text
                    context.startMPcode()
                        context(graphic)
                    context.stopMPcode()
                end
            end
        end
    end

    if character == v_all then
        for u, c in table.sortedhash(chardata) do
            shape(c.index,u,f_unicode)
        end
        return
    end
    if type(character) == "string" then
        character = utf.byte(character)
    end
    if type(character) == "number" then
        local c = chardata[character]
        if c then
            shape(c.index,c.index,f_index)
        end
        return
    end
    if type(index) == "number" then
        shape(index,index,f_index)
        return
    end
    local first, last
    if type(index) == "string" then
        first, last = string.split(index,":")
        if first and last then
            first = tonumber(first)
            last  = tonumber(last)
        else
            first = tonumber(index)
            last  = first
        end
        if not first then
            first = 1
            last  = #shapeglyphs
        elseif not last then
            last = first
        end
    else
        first = 1
        last  = #shapeglyphs
    end
    for index=first,last do
        shape(index,index,f_index)
    end
end

\stopluacode

\unprotect

% option: box|width|min|max|comment

\unexpanded\def\showshape
  {\dosingleargument\meta_shapes_show}

\def\meta_shapes_show[#1]%
  {\begingroup
   \letdummyparameter\c!index\empty
   \letdummyparameter\c!character\empty
   \letdummyparameter\c!alternative\v!text
   \letdummyparameter\c!command\empty
   \letdummyparameter\c!option\v!all
   \getdummyparameters[#1]%
   \ctxlua{fonts.metapost.showglyph{
        character   = "\dummyparameter\c!character",
        index       = "\dummyparameter\c!index",
        alternative = "\dummyparameter\c!alternative",
        command     = "\dummyparameter\c!command",
        option      = "\dummyparameter\c!option",
   }}%
   \endgroup}

\protect

\continueifinputfile{meta-imp-outlines.mkiv}

\starttext

% \setupbodyfont[pagella]

% \definedfont[latinmodern-math]\showshape[index=3078,alternative=page]

% \setupbodyfont[pagella]
% \showshape[character=all,alternative=page]

\usemodule[art-01]

% \definedfont[lt55476.afm]

\startcombination[3*1]
    {\ruledhbox{\startMPcode draw textext("\showshape[character=a]") ; \stopMPcode}} {}
    {\ruledhbox{\startMPcode draw textext("\showshape[character=x]") ; \stopMPcode}} {}
    {\ruledhbox{\showshape[character=P,alternative=text]}} {}
\stopcombination

\startcombination[3*1]
    {\ruledhbox{\startMPcode draw textext("\showshape[character=a,option={simple}]") ; \stopMPcode}} {}
    {\ruledhbox{\startMPcode draw textext("\showshape[character=x,option={simple}]") ; \stopMPcode}} {}
    {\ruledhbox{\showshape[character=P,alternative=text,option=simple]}} {}
\stopcombination

% \definedfont[almfixed]
% \showshape[character=all,alternative=page]

% \definedfont[file:sourcehansans-bold.otf]
% \showshape[index=40000:41000,alternative=page]

\stoptext