You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
7.7 KiB
262 lines
7.7 KiB
if not modules then modules = { } end modules ['font-oti'] = {
|
|
version = 1.001,
|
|
comment = "companion to font-ini.mkiv",
|
|
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
|
|
copyright = "PRAGMA ADE / ConTeXt Development Team",
|
|
license = "see context related readme files"
|
|
}
|
|
|
|
local lower = string.lower
|
|
|
|
local fonts = fonts
|
|
local constructors = fonts.constructors
|
|
|
|
local otf = constructors.handlers.otf
|
|
local otffeatures = constructors.features.otf
|
|
local registerotffeature = otffeatures.register
|
|
|
|
local otftables = otf.tables or { }
|
|
otf.tables = otftables
|
|
|
|
local allocate = utilities.storage.allocate
|
|
|
|
registerotffeature {
|
|
name = "features",
|
|
description = "initialization of feature handler",
|
|
default = true,
|
|
}
|
|
|
|
-- these are later hooked into node and base initializaters
|
|
|
|
local function setmode(tfmdata,value)
|
|
if value then
|
|
tfmdata.properties.mode = lower(value)
|
|
end
|
|
end
|
|
|
|
otf.modeinitializer = setmode
|
|
|
|
local function setlanguage(tfmdata,value)
|
|
if value then
|
|
local cleanvalue = lower(value)
|
|
local languages = otftables and otftables.languages
|
|
local properties = tfmdata.properties
|
|
if not languages then
|
|
properties.language = cleanvalue
|
|
elseif languages[value] then
|
|
properties.language = cleanvalue
|
|
else
|
|
properties.language = "dflt"
|
|
end
|
|
end
|
|
end
|
|
|
|
local function setscript(tfmdata,value)
|
|
if value then
|
|
local cleanvalue = lower(value)
|
|
local scripts = otftables and otftables.scripts
|
|
local properties = tfmdata.properties
|
|
if not scripts then
|
|
properties.script = cleanvalue
|
|
elseif scripts[value] then
|
|
properties.script = cleanvalue
|
|
else
|
|
properties.script = "dflt"
|
|
end
|
|
end
|
|
end
|
|
|
|
registerotffeature {
|
|
name = "mode",
|
|
description = "mode",
|
|
initializers = {
|
|
base = setmode,
|
|
node = setmode,
|
|
plug = setmode,
|
|
}
|
|
}
|
|
|
|
registerotffeature {
|
|
name = "language",
|
|
description = "language",
|
|
initializers = {
|
|
base = setlanguage,
|
|
node = setlanguage,
|
|
plug = setlanguage,
|
|
}
|
|
}
|
|
|
|
registerotffeature {
|
|
name = "script",
|
|
description = "script",
|
|
initializers = {
|
|
base = setscript,
|
|
node = setscript,
|
|
plug = setscript,
|
|
}
|
|
}
|
|
|
|
-- here (as also in generic
|
|
|
|
otftables.featuretypes = allocate {
|
|
gpos_single = "position",
|
|
gpos_pair = "position",
|
|
gpos_cursive = "position",
|
|
gpos_mark2base = "position",
|
|
gpos_mark2ligature = "position",
|
|
gpos_mark2mark = "position",
|
|
gpos_context = "position",
|
|
gpos_contextchain = "position",
|
|
gsub_single = "substitution",
|
|
gsub_multiple = "substitution",
|
|
gsub_alternate = "substitution",
|
|
gsub_ligature = "substitution",
|
|
gsub_context = "substitution",
|
|
gsub_contextchain = "substitution",
|
|
gsub_reversecontextchain = "substitution",
|
|
gsub_reversesub = "substitution",
|
|
}
|
|
|
|
function otffeatures.checkeddefaultscript(featuretype,autoscript,scripts)
|
|
if featuretype == "position" then
|
|
local default = scripts.dflt
|
|
if default then
|
|
if autoscript == "position" or autoscript == true then
|
|
return default
|
|
else
|
|
report_otf("script feature %s not applied, enable default positioning")
|
|
end
|
|
else
|
|
-- no positioning at all
|
|
end
|
|
elseif featuretype == "substitution" then
|
|
local default = scripts.dflt
|
|
if default then
|
|
if autoscript == "substitution" or autoscript == true then
|
|
return default
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages)
|
|
if featuretype == "position" then
|
|
local default = languages.dflt
|
|
if default then
|
|
if autolanguage == "position" or autolanguage == true then
|
|
return default
|
|
else
|
|
report_otf("language feature %s not applied, enable default positioning")
|
|
end
|
|
else
|
|
-- no positioning at all
|
|
end
|
|
elseif featuretype == "substitution" then
|
|
local default = languages.dflt
|
|
if default then
|
|
if autolanguage == "substitution" or autolanguage == true then
|
|
return default
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- the following might become available generic in due time but for now
|
|
-- this is some context playground (development code)
|
|
|
|
-- if not context then
|
|
-- return
|
|
-- end
|
|
|
|
-- local helpers = otf.readers.helpers
|
|
-- local axistofactors = helpers.axistofactors
|
|
-- local normalizedaxis = helpers.normalizedaxis
|
|
-- local getaxisscale = helpers.getaxisscale
|
|
-- local cleanname = containers.cleanname
|
|
|
|
-- local function validvariable(tfmdata)
|
|
-- if tfmdata.properties.factors then
|
|
-- return
|
|
-- end
|
|
-- local resources = tfmdata.resources
|
|
-- local variabledata = resources and resources.variabledata
|
|
-- if not variabledata then
|
|
-- return
|
|
-- end
|
|
-- local instances = variabledata.instances
|
|
-- local axis = variabledata.axis
|
|
-- local segments = variabledata.segments
|
|
-- if instances and axis then
|
|
-- return instances, axis, segments
|
|
-- end
|
|
-- end
|
|
|
|
-- local function initializeinstance(tfmdata,value)
|
|
-- if type(value) == "string" then
|
|
-- local instances, axis, segments = validvariable(tfmdata)
|
|
-- if instances then
|
|
-- local values
|
|
-- for i=1,#instances do
|
|
-- local instance = instances[i]
|
|
-- if cleanname(instance.subfamily) == value then
|
|
-- values = instance.values
|
|
-- break
|
|
-- end
|
|
-- end
|
|
-- if values then
|
|
-- local factors = { }
|
|
-- for i=1,#axis do
|
|
-- local a = axis[i]
|
|
-- factors[i] = getaxisscale(segments,a.minimum,a.default,a.maximum,values[i].value)
|
|
-- end
|
|
-- tfmdata.properties.instance = {
|
|
-- hash = instance,
|
|
-- factors = factors,
|
|
-- }
|
|
-- end
|
|
-- else
|
|
-- report("incomplete variable data")
|
|
-- end
|
|
-- end
|
|
-- end
|
|
|
|
-- local function initializeaxis(tfmdata,value)
|
|
-- if type(value) == "string" then
|
|
-- local instances, axis, segments = validvariable(tfmdata)
|
|
-- if instances then
|
|
-- local values = axistofactors(value)
|
|
-- if values then
|
|
-- local factors = { }
|
|
-- for i=1,#axis do
|
|
-- local a = axis[i]
|
|
-- local d = a.default
|
|
-- factors[i] = getaxisscale(segments,a.minimum,d,a.maximum,values[a.name or a.tag] or d)
|
|
-- end
|
|
-- tfmdata.properties.instance = {
|
|
-- hash = cleanname(value),
|
|
-- factors = factors,
|
|
-- }
|
|
-- end
|
|
-- else
|
|
-- report("incomplete variable data")
|
|
-- end
|
|
-- end
|
|
-- end
|
|
|
|
-- registerotffeature {
|
|
-- name = "instance",
|
|
-- description = "variation instance",
|
|
-- initializers = {
|
|
-- node = initializeinstance,
|
|
-- base = initializeinstance,
|
|
-- }
|
|
-- }
|
|
|
|
-- registerotffeature {
|
|
-- name = "axis",
|
|
-- description = "variation axis",
|
|
-- initializers = {
|
|
-- node = initializeaxis,
|
|
-- base = initializeaxis,
|
|
-- }
|
|
-- }
|
|
|