summaryrefslogtreecommitdiff
path: root/tex/generic/context/luatex/luatex-fonts-ext.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/generic/context/luatex/luatex-fonts-ext.lua')
-rw-r--r--tex/generic/context/luatex/luatex-fonts-ext.lua251
1 files changed, 84 insertions, 167 deletions
diff --git a/tex/generic/context/luatex/luatex-fonts-ext.lua b/tex/generic/context/luatex/luatex-fonts-ext.lua
index 15762d9ba..aee43ec4b 100644
--- a/tex/generic/context/luatex/luatex-fonts-ext.lua
+++ b/tex/generic/context/luatex/luatex-fonts-ext.lua
@@ -7,89 +7,54 @@ if not modules then modules = { } end modules ['luatex-fonts-ext'] = {
}
if context then
- texio.write_nl("fatal error: this module is not for context")
os.exit()
end
-local fonts = fonts
-local otffeatures = fonts.constructors.features.otf
-local getprivate = fonts.constructors.getprivate
+local byte = string.byte
--- A few generic extensions.
+local fonts = fonts
+local handlers = fonts.handlers
+local otf = handlers.otf
+local afm = handlers.afm
+local registerotffeature = otf.features.register
+local registerafmfeature = afm.features.register
-local function initializeitlc(tfmdata,value)
- if value then
- -- the magic 40 and it formula come from Dohyun Kim but we might need another guess
- local parameters = tfmdata.parameters
- local italicangle = parameters.italicangle
- if italicangle and italicangle ~= 0 then
- local properties = tfmdata.properties
- local factor = tonumber(value) or 1
- properties.hasitalics = true
- properties.autoitalicamount = factor * (parameters.uwidth or 40)/2
- end
- end
-end
+-- extra generic stuff
-otffeatures.register {
- name = "itlc",
- description = "italic correction",
- initializers = {
- base = initializeitlc,
- node = initializeitlc,
- }
-}
+function fonts.loggers.onetimemessage() end
--- slant and extend
+-- done elsewhere
+--
+-- loadmodule('font-ext-imp-italic.lua')
+-- loadmodule('font-ext-imp-effect.lua')
+-- loadmodule('luatex-fonts-lig.lua')
-local function initializeslant(tfmdata,value)
- value = tonumber(value)
- if not value then
- value = 0
- elseif value > 1 then
- value = 1
- elseif value < -1 then
- value = -1
- end
- tfmdata.parameters.slantfactor = value
-end
+-- protrusion (simplified version)
-otffeatures.register {
- name = "slant",
- description = "slant glyphs",
- initializers = {
- base = initializeslant,
- node = initializeslant,
- }
-}
-
-local function initializeextend(tfmdata,value)
- value = tonumber(value)
- if not value then
- value = 0
- elseif value > 10 then
- value = 10
- elseif value < -10 then
- value = -10
- end
- tfmdata.parameters.extendfactor = value
-end
+fonts.protrusions = fonts.protrusions or { }
+fonts.protrusions.setups = fonts.protrusions.setups or { }
+local setups = fonts.protrusions.setups
-otffeatures.register {
- name = "extend",
- description = "scale glyphs horizontally",
- initializers = {
- base = initializeextend,
- node = initializeextend,
- }
-}
+setups['default'] = { -- demo vector
--- expansion and protrusion
+ factor = 1,
+ left = 1,
+ right = 1,
-fonts.protrusions = fonts.protrusions or { }
-fonts.protrusions.setups = fonts.protrusions.setups or { }
+ [0x002C] = { 0, 1 }, -- comma
+ [0x002E] = { 0, 1 }, -- period
+ [0x003A] = { 0, 1 }, -- colon
+ [0x003B] = { 0, 1 }, -- semicolon
+ [0x002D] = { 0, 1 }, -- hyphen
+ [0x2013] = { 0, 0.50 }, -- endash
+ [0x2014] = { 0, 0.33 }, -- emdash
+ [0x3001] = { 0, 1 }, -- ideographic comma 、
+ [0x3002] = { 0, 1 }, -- ideographic full stop 。
+ [0x060C] = { 0, 1 }, -- arabic comma ،
+ [0x061B] = { 0, 1 }, -- arabic semicolon ؛
+ [0x06D4] = { 0, 1 }, -- arabic full stop ۔
-local setups = fonts.protrusions.setups
+}
local function initializeprotrusion(tfmdata,value)
if value then
@@ -112,7 +77,7 @@ local function initializeprotrusion(tfmdata,value)
end
end
-otffeatures.register {
+local specification = {
name = "protrusion",
description = "shift characters into the left and or right margin",
initializers = {
@@ -121,10 +86,32 @@ otffeatures.register {
}
}
-fonts.expansions = fonts.expansions or { }
-fonts.expansions.setups = fonts.expansions.setups or { }
+registerotffeature(specification)
+registerafmfeature(specification)
-local setups = fonts.expansions.setups
+-- expansion (simplified version)
+
+fonts.expansions = fonts.expansions or { }
+fonts.expansions.setups = fonts.expansions.setups or { }
+local setups = fonts.expansions.setups
+
+setups['default'] = { -- demo vector
+
+ stretch = 2,
+ shrink = 2,
+ step = .5,
+ factor = 1,
+
+ [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
+ [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
+ [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
+ [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
+ [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
+ [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
+ [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
+ [byte('w')] = 0.7, [byte('z')] = 0.7,
+ [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+}
local function initializeexpansion(tfmdata,value)
if value then
@@ -149,7 +136,7 @@ local function initializeexpansion(tfmdata,value)
end
end
-otffeatures.register {
+local specification = {
name = "expansion",
description = "apply hz optimization",
initializers = {
@@ -158,55 +145,20 @@ otffeatures.register {
}
}
--- left over
-
-function fonts.loggers.onetimemessage() end
-
--- example vectors
-
-local byte = string.byte
-
-fonts.expansions.setups['default'] = {
-
- stretch = 2, shrink = 2, step = .5, factor = 1,
-
- [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
- [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
- [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
- [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
- [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
- [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
- [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
- [byte('w')] = 0.7, [byte('z')] = 0.7,
- [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
-}
-
-fonts.protrusions.setups['default'] = {
-
- factor = 1, left = 1, right = 1,
-
- [0x002C] = { 0, 1 }, -- comma
- [0x002E] = { 0, 1 }, -- period
- [0x003A] = { 0, 1 }, -- colon
- [0x003B] = { 0, 1 }, -- semicolon
- [0x002D] = { 0, 1 }, -- hyphen
- [0x2013] = { 0, 0.50 }, -- endash
- [0x2014] = { 0, 0.33 }, -- emdash
- [0x3001] = { 0, 1 }, -- ideographic comma 、
- [0x3002] = { 0, 1 }, -- ideographic full stop 。
- [0x060C] = { 0, 1 }, -- arabic comma ،
- [0x061B] = { 0, 1 }, -- arabic semicolon ؛
- [0x06D4] = { 0, 1 }, -- arabic full stop ۔
+registerotffeature(specification)
+registerafmfeature(specification)
-}
+-- normalizer (generic only)
--- normalizer
+if not otf.features.normalize then
-fonts.handlers.otf.features.normalize = function(t)
- if t.rand then
- t.rand = "random"
+ otf.features.normalize = function(t)
+ if t.rand then
+ t.rand = "random"
+ end
+ return t
end
- return t
+
end
-- bonus
@@ -230,6 +182,8 @@ end
-- [110] = 109, -- n
-- }
+-- reencoding (generic only)
+
fonts.encodings = fonts.encodings or { }
local reencodings = { }
fonts.encodings.reencodings = reencodings
@@ -254,7 +208,7 @@ local function specialreencode(tfmdata,value)
end
end
-local function reencode(tfmdata,value)
+local function initialize(tfmdata,value)
tfmdata.postprocessors = tfmdata.postprocessors or { }
table.insert(tfmdata.postprocessors,
function(tfmdata)
@@ -263,65 +217,28 @@ local function reencode(tfmdata,value)
)
end
-otffeatures.register {
+registerotffeature {
name = "reencode",
description = "reencode characters",
manipulators = {
- base = reencode,
- node = reencode,
+ base = initialize,
+ node = initialize,
}
}
-local function ignore(tfmdata,key,value)
+-- math stuff (generic only)
+
+local function initialize(tfmdata,key,value)
if value then
tfmdata.mathparameters = nil
end
end
-otffeatures.register {
+registerotffeature {
name = "ignoremathconstants",
description = "ignore math constants table",
initializers = {
- base = ignore,
- node = ignore,
- }
-}
-
-local setmetatableindex = table.setmetatableindex
-
-local function additalictowidth(tfmdata,key,value)
- local characters = tfmdata.characters
- local additions = { }
- for unicode, old_c in next, characters do
- -- maybe check for math
- local oldwidth = old_c.width
- local olditalic = old_c.italic
- if olditalic and olditalic ~= 0 then
- local private = getprivate(tfmdata)
- local new_c = {
- width = oldwidth + olditalic,
- height = old_c.height,
- depth = old_c.depth,
- commands = {
- { "slot", 1, private },
- { "right", olditalic },
- },
- }
- setmetatableindex(new_c,old_c)
- characters[unicode] = new_c
- additions[private] = old_c
- end
- end
- for k, v in next, additions do
- characters[k] = v
- end
-end
-
-otffeatures.register {
- name = "italicwidths",
- description = "add italic to width",
- manipulators = {
- base = additalictowidth,
- -- node = additalictowidth, -- only makes sense for math
+ base = initialize,
+ node = initialize,
}
}