diff options
Diffstat (limited to 'tex/context/base/s-fonts-features.lua')
-rw-r--r-- | tex/context/base/s-fonts-features.lua | 322 |
1 files changed, 161 insertions, 161 deletions
diff --git a/tex/context/base/s-fonts-features.lua b/tex/context/base/s-fonts-features.lua index 0a7cf8b13..a45195df7 100644 --- a/tex/context/base/s-fonts-features.lua +++ b/tex/context/base/s-fonts-features.lua @@ -1,161 +1,161 @@ -if not modules then modules = { } end modules ['s-fonts-features'] = { - version = 1.001, - comment = "companion to s-fonts-features.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - -moduledata.fonts = moduledata.fonts or { } -moduledata.fonts.features = moduledata.fonts.features or { } - --- for the moment only otf - -local sortedhash = table.sortedhash - -local NC, NR, bold = context.NC, context.NR, context.bold - -function moduledata.fonts.features.showused(specification) - - specification = interfaces.checkedspecification(specification) - - -- local list = utilities.parsers.settings_to_set(specification.list or "all") - - context.starttabulate { "|T|T|T|T|T|" } - - context.HL() - - NC() bold("feature") - NC() - NC() bold("description") - NC() bold("value") - NC() bold("internal") - NC() NR() - - context.HL() - - local usedfeatures = fonts.handlers.otf.statistics.usedfeatures - local features = fonts.handlers.otf.tables.features - local descriptions = fonts.handlers.otf.features.descriptions - - for feature, keys in sortedhash(usedfeatures) do - -- if list.all or (list.otf and rawget(features,feature)) or (list.extra and rawget(descriptions,feature)) then - local done = false - for k, v in sortedhash(keys) do - if done then - NC() - NC() - NC() - elseif rawget(descriptions,feature) then - NC() context(feature) - NC() context("+") -- extra - NC() context(descriptions[feature]) - done = true - elseif rawget(features,feature) then - NC() context(feature) - NC() -- otf - NC() context(features[feature]) - done = true - else - NC() context(feature) - NC() context("-") -- unknown - NC() - done = true - end - NC() context(k) - NC() context(tostring(v)) - NC() NR() - end - -- end - end - - context.HL() - - context.stoptabulate() - -end - -local function collectkerns(tfmdata,feature) - local combinations = { } - local resources = tfmdata.resources - local characters = tfmdata.characters - local sequences = resources.sequences - local lookuphash = resources.lookuphash - local feature = feature or "kern" - if sequences then - for i=1,#sequences do - local sequence = sequences[i] - if sequence.features and sequence.features[feature] then - local lookuplist = sequence.subtables - if lookuplist then - for l=1,#lookuplist do - local lookupname = lookuplist[l] - local lookupdata = lookuphash[lookupname] - for unicode, data in next, lookupdata do - local kerns = combinations[unicode] - if not kerns then - kerns = { } - combinations[unicode] = kerns - end - for otherunicode, kern in next, data do - if not kerns[otherunicode] and kern ~= 0 then - kerns[otherunicode] = kern - end - end - end - end - end - end - end - end - return combinations -end - -local showkernpair = context.showkernpair - -function moduledata.fonts.features.showbasekerns(specification) - -- assumes that the font is loaded in base mode - specification = interfaces.checkedspecification(specification) - local id, cs = fonts.definers.internal(specification,"<module:fonts:features:font>") - local tfmdata = fonts.hashes.identifiers[id] - local done = false - for unicode, character in sortedhash(tfmdata.characters) do - local kerns = character.kerns - if kerns then - context.par() - for othercode, kern in sortedhash(kerns) do - showkernpair(unicode,kern,othercode) - end - context.par() - done = true - end - end - if not done then - context("no kern pairs found") - context.par() - end -end - -function moduledata.fonts.features.showallkerns(specification) - specification = interfaces.checkedspecification(specification) - local id, cs = fonts.definers.internal(specification,"<module:fonts:features:font>") - local tfmdata = fonts.hashes.identifiers[id] - local allkerns = collectkerns(tfmdata) - local characters = tfmdata.characters - if next(allkerns) then - for first, pairs in sortedhash(allkerns) do - context.par() - for second, kern in sortedhash(pairs) do - -- local kerns = characters[first].kerns - -- if not kerns and pairs[second] then - -- -- weird - -- end - showkernpair(first,kern,second,0) - end - context.par() - end - else - context("no kern pairs found") - context.par() - end -end +if not modules then modules = { } end modules ['s-fonts-features'] = {
+ version = 1.001,
+ comment = "companion to s-fonts-features.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+moduledata.fonts = moduledata.fonts or { }
+moduledata.fonts.features = moduledata.fonts.features or { }
+
+-- for the moment only otf
+
+local sortedhash = table.sortedhash
+
+local NC, NR, bold = context.NC, context.NR, context.bold
+
+function moduledata.fonts.features.showused(specification)
+
+ specification = interfaces.checkedspecification(specification)
+
+ -- local list = utilities.parsers.settings_to_set(specification.list or "all")
+
+ context.starttabulate { "|T|T|T|T|T|" }
+
+ context.HL()
+
+ NC() bold("feature")
+ NC()
+ NC() bold("description")
+ NC() bold("value")
+ NC() bold("internal")
+ NC() NR()
+
+ context.HL()
+
+ local usedfeatures = fonts.handlers.otf.statistics.usedfeatures
+ local features = fonts.handlers.otf.tables.features
+ local descriptions = fonts.handlers.otf.features.descriptions
+
+ for feature, keys in sortedhash(usedfeatures) do
+ -- if list.all or (list.otf and rawget(features,feature)) or (list.extra and rawget(descriptions,feature)) then
+ local done = false
+ for k, v in sortedhash(keys) do
+ if done then
+ NC()
+ NC()
+ NC()
+ elseif rawget(descriptions,feature) then
+ NC() context(feature)
+ NC() context("+") -- extra
+ NC() context(descriptions[feature])
+ done = true
+ elseif rawget(features,feature) then
+ NC() context(feature)
+ NC() -- otf
+ NC() context(features[feature])
+ done = true
+ else
+ NC() context(feature)
+ NC() context("-") -- unknown
+ NC()
+ done = true
+ end
+ NC() context(k)
+ NC() context(tostring(v))
+ NC() NR()
+ end
+ -- end
+ end
+
+ context.HL()
+
+ context.stoptabulate()
+
+end
+
+local function collectkerns(tfmdata,feature)
+ local combinations = { }
+ local resources = tfmdata.resources
+ local characters = tfmdata.characters
+ local sequences = resources.sequences
+ local lookuphash = resources.lookuphash
+ local feature = feature or "kern"
+ if sequences then
+ for i=1,#sequences do
+ local sequence = sequences[i]
+ if sequence.features and sequence.features[feature] then
+ local lookuplist = sequence.subtables
+ if lookuplist then
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookupdata = lookuphash[lookupname]
+ for unicode, data in next, lookupdata do
+ local kerns = combinations[unicode]
+ if not kerns then
+ kerns = { }
+ combinations[unicode] = kerns
+ end
+ for otherunicode, kern in next, data do
+ if not kerns[otherunicode] and kern ~= 0 then
+ kerns[otherunicode] = kern
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return combinations
+end
+
+local showkernpair = context.showkernpair
+
+function moduledata.fonts.features.showbasekerns(specification)
+ -- assumes that the font is loaded in base mode
+ specification = interfaces.checkedspecification(specification)
+ local id, cs = fonts.definers.internal(specification,"<module:fonts:features:font>")
+ local tfmdata = fonts.hashes.identifiers[id]
+ local done = false
+ for unicode, character in sortedhash(tfmdata.characters) do
+ local kerns = character.kerns
+ if kerns then
+ context.par()
+ for othercode, kern in sortedhash(kerns) do
+ showkernpair(unicode,kern,othercode)
+ end
+ context.par()
+ done = true
+ end
+ end
+ if not done then
+ context("no kern pairs found")
+ context.par()
+ end
+end
+
+function moduledata.fonts.features.showallkerns(specification)
+ specification = interfaces.checkedspecification(specification)
+ local id, cs = fonts.definers.internal(specification,"<module:fonts:features:font>")
+ local tfmdata = fonts.hashes.identifiers[id]
+ local allkerns = collectkerns(tfmdata)
+ local characters = tfmdata.characters
+ if next(allkerns) then
+ for first, pairs in sortedhash(allkerns) do
+ context.par()
+ for second, kern in sortedhash(pairs) do
+ -- local kerns = characters[first].kerns
+ -- if not kerns and pairs[second] then
+ -- -- weird
+ -- end
+ showkernpair(first,kern,second,0)
+ end
+ context.par()
+ end
+ else
+ context("no kern pairs found")
+ context.par()
+ end
+end
|