summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/font-imp-dimensions.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/font-imp-dimensions.lua')
-rw-r--r--tex/context/base/mkiv/font-imp-dimensions.lua115
1 files changed, 115 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/font-imp-dimensions.lua b/tex/context/base/mkiv/font-imp-dimensions.lua
new file mode 100644
index 000000000..a7125625d
--- /dev/null
+++ b/tex/context/base/mkiv/font-imp-dimensions.lua
@@ -0,0 +1,115 @@
+if not modules then modules = { } end modules ['font-imp-dimensions'] = {
+ 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"
+}
+
+if not context then return end
+
+local next, type, tonumber = next, type, tonumber
+
+local fonts = fonts
+local utilities = utilities
+
+local helpers = fonts.helpers
+local prependcommands = helpers.prependcommands
+local charcommand = helpers.commands.char
+local rightcommand = helpers.commands.right
+
+local handlers = fonts.handlers
+local otf = handlers.otf
+local afm = handlers.afm
+
+local registerotffeature = otf.features.register
+local registerafmfeature = afm.features.register
+
+local settings_to_array = utilities.parsers.settings_to_array
+local gettexdimen = tex.getdimen
+
+-- For Wolfgang Schuster:
+--
+-- \definefontfeature[thisway][default][script=hang,language=zhs,dimensions={2,2,2}]
+-- \definedfont[file:kozminpr6nregular*thisway]
+
+local function initialize(tfmdata,key,value)
+ if type(value) == "string" and value ~= "" then
+ local characters = tfmdata.characters
+ local parameters = tfmdata.parameters
+ local emwidth = parameters.quad
+ local exheight = parameters.xheight
+ local newwidth = false
+ local newheight = false
+ local newdepth = false
+ if value == "strut" then
+ newheight = gettexdimen("strutht")
+ newdepth = gettexdimen("strutdp")
+ elseif value == "mono" then
+ newwidth = emwidth
+ else
+ local spec = settings_to_array(value)
+ newwidth = tonumber(spec[1])
+ newheight = tonumber(spec[2])
+ newdepth = tonumber(spec[3])
+ if newwidth then newwidth = newwidth * emwidth end
+ if newheight then newheight = newheight * exheight end
+ if newdepth then newdepth = newdepth * exheight end
+ end
+ if newwidth or newheight or newdepth then
+ for unicode, character in next, characters do
+ local oldwidth = character.width
+ local oldheight = character.height
+ local olddepth = character.depth
+ local width = newwidth or oldwidth or 0
+ local height = newheight or oldheight or 0
+ local depth = newdepth or olddepth or 0
+ if oldwidth ~= width or oldheight ~= height or olddepth ~= depth then
+ character.width = width
+ character.height = height
+ character.depth = depth
+ if oldwidth ~= width then
+ local commands = character.commands
+ local hshift = rightcommand[(width - oldwidth) / 2]
+ if commands then
+ character.commands = prependcommands (
+ commands,
+ hshift
+ )
+ else
+ character.commands = {
+ hshift,
+ charcommand[unicode],
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+local specification = {
+ name = "dimensions",
+ description = "force dimensions",
+ manipulators = {
+ base = initialize,
+ node = initialize,
+ }
+}
+
+registerotffeature(specification)
+registerafmfeature(specification)
+
+local function initialize(tfmdata,value)
+ tfmdata.properties.realdimensions = value and true
+end
+
+registerotffeature {
+ name = "realdimensions",
+ description = "accept negative dimenions",
+ initializers = {
+ base = initialize,
+ node = initialize,
+ }
+}