diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/font-prv.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/font-prv.lua | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua b/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua new file mode 100644 index 00000000000..20c06d2e54e --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mkiv/font-prv.lua @@ -0,0 +1,78 @@ +if not modules then modules = { } end modules ['font-prv'] = { + version = 1.001, + comment = "companion to font-ini.mkiv and hand-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local type = type +local formatters = string.formatters + +local fonts = fonts +local helpers = fonts.helpers +local fontdata = fonts.hashes.identifiers + +local setmetatableindex = table.setmetatableindex + +local currentprivate = fonts.privateoffsets.textextrabase +local maximumprivate = currentprivate + 0xFFF + +local extraprivates = { } +helpers.extraprivates = extraprivates + +function fonts.helpers.addextraprivate(name,f) + extraprivates[#extraprivates+1] = { name, f } +end + +-- if we run out of space we can think of another range but by sharing we can +-- use these privates for mechanisms like alignments-on-character and such + +local sharedprivates = setmetatableindex(function(t,k) + local v = currentprivate + if currentprivate < maximumprivate then + currentprivate = currentprivate + 1 + else + -- reuse last slot, todo: warning + end + t[k] = v + return v +end) + +function helpers.addprivate(tfmdata,name,characterdata) + local properties = tfmdata.properties + local characters = tfmdata.characters + local privates = properties.privates + if not privates then + privates = { } + properties.privates = privates + end + if not name then + name = formatters["anonymous_private_0x%05X"](currentprivate) + end + local usedprivate = sharedprivates[name] + privates[name] = usedprivate + characters[usedprivate] = characterdata + return usedprivate +end + +function helpers.getprivates(tfmdata) + if type(tfmdata) == "number" then + tfmdata = fontdata[tfmdata] + end + local properties = tfmdata.properties + return properties and properties.privates +end + +function helpers.hasprivate(tfmdata,name) + if type(tfmdata) == "number" then + tfmdata = fontdata[tfmdata] + end + local properties = tfmdata.properties + local privates = properties and properties.privates + return privates and privates[name] or false +end + +function helpers.privateslot(name) + return rawget(sharedprivates,name) +end |