summaryrefslogtreecommitdiff
path: root/tex/context/base/font-afm.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/font-afm.lua')
-rw-r--r--tex/context/base/font-afm.lua185
1 files changed, 107 insertions, 78 deletions
diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua
index 75b3cddef..e29363c11 100644
--- a/tex/context/base/font-afm.lua
+++ b/tex/context/base/font-afm.lua
@@ -23,26 +23,31 @@ local trace_loading = false trackers.register("afm.loading", function(v) trac
local report_afm = logs.new("load afm")
+local next, type = next, type
local format, match, gmatch, lower, gsub = string.format, string.match, string.gmatch, string.lower, string.gsub
local lpegmatch = lpeg.match
local abs = math.abs
-fonts = fonts or { }
-fonts.afm = fonts.afm or { }
+local fonts = fonts
+fonts.afm = fonts.afm or { }
-local afm = fonts.afm
-local tfm = fonts.tfm
+local afm = fonts.afm
+local tfm = fonts.tfm
afm.version = 1.402 -- incrementing this number one up will force a re-cache
afm.syncspace = true -- when true, nicer stretch values
afm.enhance_data = true -- best leave this set to true
-afm.features = { }
-afm.features.aux = { }
-afm.features.data = { }
-afm.features.list = { }
-afm.features.default = { }
afm.cache = containers.define("fonts", "afm", afm.version, true)
+local afmfeatures = {
+ aux = { },
+ data = { },
+ list = { },
+ default = { },
+}
+
+afm.features = afmfeatures
+
--[[ldx--
<p>We start with the basic reader which we give a name similar to the
built in <l n='tfm'/> and <l n='otf'/> reader.</p>
@@ -64,11 +69,13 @@ built in <l n='tfm'/> and <l n='otf'/> reader.</p>
--~ Comment DELIM 2390 1010
--~ Comment AXISHEIGHT 250
-local c = lpeg.P("Comment")
-local s = lpeg.S(" \t")
-local l = lpeg.S("\n\r")
-local w = lpeg.C((1 - l)^1)
-local n = lpeg.C((lpeg.R("09") + lpeg.S("."))^1) / tonumber * s^0
+local P, S, C = lpeg.P, lpeg.S, lpeg.C
+
+local c = P("Comment")
+local s = S(" \t")
+local l = S("\n\r")
+local w = C((1 - l)^1)
+local n = C((lpeg.R("09") + S("."))^1) / tonumber * s^0
local fd = { }
@@ -253,6 +260,8 @@ by adding ligatures and kern information to the afm derived data. That
way we can set them faster when defining a font.</p>
--ldx]]--
+local add_kerns, add_ligatures, unify -- we will implement these later
+
function afm.load(filename)
-- hm, for some reasons not resolved yet
filename = resolvers.find_file(filename,'afm') or ""
@@ -284,14 +293,14 @@ function afm.load(filename)
report_afm("no pfb file for %s",filename)
end
report_afm( "unifying %s",filename)
- afm.unify(data,filename)
+ unify(data,filename)
if afm.enhance_data then
report_afm( "add ligatures")
- afm.add_ligatures(data,'ligatures') -- easier this way
+ add_ligatures(data,'ligatures') -- easier this way
report_afm( "add tex-ligatures")
- afm.add_ligatures(data,'texligatures') -- easier this way
+ add_ligatures(data,'texligatures') -- easier this way
report_afm( "add extra kerns")
- afm.add_kerns(data) -- faster this way
+ add_kerns(data) -- faster this way
end
report_afm( "add tounicode data")
fonts.map.add_to_unicode(data,filename)
@@ -311,7 +320,7 @@ function afm.load(filename)
end
end
-function afm.unify(data, filename)
+unify = function(data, filename)
local unicodevector = fonts.enc.load('unicode').hash
local glyphs, indices, unicodes, names = { }, { }, { }, { }
local verbose, private = fonts.verbose, fonts.private
@@ -361,7 +370,7 @@ end
and extra kerns. This saves quite some lookups later.</p>
--ldx]]--
-function afm.add_ligatures(afmdata,ligatures)
+add_ligatures = function(afmdata,ligatures)
local glyphs, luatex = afmdata.glyphs, afmdata.luatex
local indices, unicodes, names = luatex.indices, luatex.unicodes, luatex.names
for k,v in next, characters[ligatures] do -- main characters table
@@ -389,7 +398,7 @@ end
them selectively.</p>
--ldx]]--
-function afm.add_kerns(afmdata)
+add_kerns = function(afmdata)
local glyphs = afmdata.glyphs
local names = afmdata.luatex.names
local uncomposed = characters.uncomposed
@@ -449,7 +458,7 @@ end
-- once we have otf sorted out (new format) we can try to make the afm
-- cache similar to it (similar tables)
-function afm.add_dimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name
+local function add_dimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name
if data then
for index, glyph in next, data.glyphs do
local bb = glyph.boundingbox
@@ -594,11 +603,13 @@ to treat this fontformat like any other and handle features in a
more configurable way.</p>
--ldx]]--
-function afm.features.register(name,default)
- afm.features.list[#afm.features.list+1] = name
- afm.features.default[name] = default
+local function register_feature(name,default)
+ afmfeatures.list[#afmfeatures.list+1] = name
+ afmfeatures.default[name] = default
end
+afmfeatures.register = register_feature
+
function afm.set_features(tfmdata)
local shared = tfmdata.shared
local afmdata = shared.afmdata
@@ -611,7 +622,7 @@ function afm.set_features(tfmdata)
if fiafm then
local lists = {
fonts.triggers,
- afm.features.list,
+ afmfeatures.list,
fonts.manipulators,
}
for l=1,3 do
@@ -636,7 +647,7 @@ function afm.set_features(tfmdata)
local fmafm = fm and fm.afm
if fmafm then
local lists = {
- afm.features.list,
+ afmfeatures.list,
}
local sp = shared.processors
for l=1,1 do
@@ -660,7 +671,7 @@ function afm.set_features(tfmdata)
end
function afm.check_features(specification)
- local features, done = fonts.define.check(specification.features.normal,afm.features.default)
+ local features, done = fonts.define.check(specification.features.normal,afmfeatures.default)
if done then
specification.features.normal = features
tfm.hash_instance(specification,true)
@@ -693,13 +704,14 @@ function afm.afm_to_tfm(specification)
if not tfmdata then
local afmdata = afm.load(afmname)
if afmdata and next(afmdata) then
- afm.add_dimensions(afmdata)
+ add_dimensions(afmdata)
tfmdata = afm.copy_to_tfm(afmdata)
if tfmdata and next(tfmdata) then
- tfmdata.shared = tfmdata.shared or { }
- tfmdata.unique = tfmdata.unique or { }
- tfmdata.shared.afmdata = afmdata
- tfmdata.shared.features = features
+ local shared = tfmdata.shared
+ local unique = tfmdata.unique
+ if not shared then shared = { } tfmdata.shared = shared end
+ if not unique then unique = { } tfmdata.unique = unique end
+ shared.afmdata, shared.features = afmdata, features
afm.set_features(tfmdata)
end
elseif trace_loading then
@@ -723,9 +735,17 @@ tfm.default_encoding = 'unicode'
function tfm.set_normal_feature(specification,name,value)
if specification and name then
- specification.features = specification.features or { }
- specification.features.normal = specification.features.normal or { }
- specification.features.normal[name] = value
+ local features = specification.features
+ if not features then
+ features = { }
+ specification.features = features
+ end
+ local normalfeatures = features.normal
+ if normalfeatures then
+ normalfeatures[name] = value
+ else
+ features.normal = { [name] = value }
+ end
end
end
@@ -745,7 +765,7 @@ end
those that make sense for this format.</p>
--ldx]]--
-function afm.features.prepare_ligatures(tfmdata,ligatures,value)
+local function prepare_ligatures(tfmdata,ligatures,value)
if value then
local afmdata = tfmdata.shared.afmdata
local luatex = afmdata.luatex
@@ -774,7 +794,7 @@ function afm.features.prepare_ligatures(tfmdata,ligatures,value)
end
end
-function afm.features.prepare_kerns(tfmdata,kerns,value)
+local function prepare_kerns(tfmdata,kerns,value)
if value then
local afmdata = tfmdata.shared.afmdata
local luatex = afmdata.luatex
@@ -800,59 +820,68 @@ function afm.features.prepare_kerns(tfmdata,kerns,value)
end
end
--- hm, register?
-
-function fonts.initializers.base.afm.ligatures (tfmdata,value) afm.features.prepare_ligatures(tfmdata,'ligatures', value) end
-function fonts.initializers.base.afm.texligatures(tfmdata,value) afm.features.prepare_ligatures(tfmdata,'texligatures',value) end
-function fonts.initializers.base.afm.kerns (tfmdata,value) afm.features.prepare_kerns (tfmdata,'kerns', value) end
-function fonts.initializers.base.afm.extrakerns (tfmdata,value) afm.features.prepare_kerns (tfmdata,'extrakerns', value) end
-
-afm.features.register('liga',true)
-afm.features.register('kerns',true)
-afm.features.register('extrakerns') -- needed?
+afmfeatures.prepare_kerns = prepare_kerns
+afmfeatures.prepare_ligatures = prepare_ligatures
-fonts.initializers.node.afm.ligatures = fonts.initializers.base.afm.ligatures
-fonts.initializers.node.afm.texligatures = fonts.initializers.base.afm.texligatures
-fonts.initializers.node.afm.kerns = fonts.initializers.base.afm.kerns
-fonts.initializers.node.afm.extrakerns = fonts.initializers.base.afm.extrakerns
-
-fonts.initializers.base.afm.liga = fonts.initializers.base.afm.ligatures
-fonts.initializers.node.afm.liga = fonts.initializers.base.afm.ligatures
-fonts.initializers.base.afm.tlig = fonts.initializers.base.afm.texligatures
-fonts.initializers.node.afm.tlig = fonts.initializers.base.afm.texligatures
-
-fonts.initializers.base.afm.trep = tfm.replacements
-fonts.initializers.node.afm.trep = tfm.replacements
+-- hm, register?
-afm.features.register('tlig',true) -- todo: also proper features for afm
-afm.features.register('trep',true) -- todo: also proper features for afm
+local base_initializers = fonts.initializers.base.afm
+local node_initializers = fonts.initializers.node.afm
+local common_initializers = fonts.initializers.common
+
+local function ligatures (tfmdata,value) prepare_ligatures(tfmdata,'ligatures', value) end
+local function texligatures(tfmdata,value) prepare_ligatures(tfmdata,'texligatures',value) end
+local function kerns (tfmdata,value) prepare_kerns (tfmdata,'kerns', value) end
+local function extrakerns (tfmdata,value) prepare_kerns (tfmdata,'extrakerns', value) end
+
+register_feature('liga',true)
+register_feature('kerns',true)
+register_feature('extrakerns') -- needed?
+
+base_initializers.ligatures = ligatures
+node_initializers.ligatures = ligatures
+base_initializers.texligatures = texligatures
+node_initializers.texligatures = texligatures
+base_initializers.kerns = kerns
+node_initializers.kerns = kerns
+node_initializers.extrakerns = extrakerns
+base_initializers.extrakerns = extrakerns
+
+base_initializers.liga = ligatures
+node_initializers.liga = ligatures
+base_initializers.tlig = texligatures
+node_initializers.tlig = texligatures
+base_initializers.trep = tfm.replacements
+node_initializers.trep = tfm.replacements
+
+register_feature('tlig',true) -- todo: also proper features for afm
+register_feature('trep',true) -- todo: also proper features for afm
-- tfm features
-fonts.initializers.base.afm.equaldigits = fonts.initializers.common.equaldigits
-fonts.initializers.node.afm.equaldigits = fonts.initializers.common.equaldigits
-fonts.initializers.base.afm.lineheight = fonts.initializers.common.lineheight
-fonts.initializers.node.afm.lineheight = fonts.initializers.common.lineheight
+base_initializers.equaldigits = common_initializers.equaldigits
+node_initializers.equaldigits = common_initializers.equaldigits
+base_initializers.lineheight = common_initializers.lineheight
+node_initializers.lineheight = common_initializers.lineheight
-- vf features
-fonts.initializers.base.afm.compose = fonts.initializers.common.compose
-fonts.initializers.node.afm.compose = fonts.initializers.common.compose
+base_initializers.compose = common_initializers.compose
+node_initializers.compose = common_initializers.compose
-- afm specific, encodings ...kind of obsolete
-afm.features.register('encoding')
+register_feature('encoding')
-fonts.initializers.base.afm.encoding = fonts.initializers.common.encoding
-fonts.initializers.node.afm.encoding = fonts.initializers.common.encoding
+base_initializers.encoding = common_initializers.encoding
+node_initializers.encoding = common_initializers.encoding
-- todo: oldstyle smallcaps as features for afm files (use with care)
-fonts.initializers.base.afm.onum = fonts.initializers.common.oldstyle
-fonts.initializers.base.afm.smcp = fonts.initializers.common.smallcaps
-fonts.initializers.base.afm.fkcp = fonts.initializers.common.fakecaps
-
-afm.features.register('onum',false)
-afm.features.register('smcp',false)
-afm.features.register('fkcp',false)
+base_initializers.onum = common_initializers.oldstyle
+base_initializers.smcp = common_initializers.smallcaps
+base_initializers.fkcp = common_initializers.fakecaps
+register_feature('onum',false)
+register_feature('smcp',false)
+register_feature('fkcp',false)