summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/font-map.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-04-17 12:13:37 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-04-17 12:13:37 +0200
commit0835bc2af23d2631e986caef886337d9694b730f (patch)
treeb3107a77fa23774ffe7a7bf04355c63220eb7936 /tex/context/base/mkiv/font-map.lua
parenta104570ad82618ffffc82ffea3f12c5bb0a35232 (diff)
downloadcontext-0835bc2af23d2631e986caef886337d9694b730f.tar.gz
2016-04-17 12:00:00
Diffstat (limited to 'tex/context/base/mkiv/font-map.lua')
-rw-r--r--tex/context/base/mkiv/font-map.lua103
1 files changed, 25 insertions, 78 deletions
diff --git a/tex/context/base/mkiv/font-map.lua b/tex/context/base/mkiv/font-map.lua
index ce84ca692..db501f0b6 100644
--- a/tex/context/base/mkiv/font-map.lua
+++ b/tex/context/base/mkiv/font-map.lua
@@ -437,95 +437,42 @@ function mappings.addtounicode(data,filename,checklookups)
if type(checklookups) == "function" then
checklookups(data,missing,nofmissing)
end
+
-- todo: go lowercase
- local unset = { }
- for unic, glyph in next, descriptions do
+ local collected = false
+ local unicoded = 0
+ for unicode, glyph in next, descriptions do
if not glyph.unicode and glyph.class == "ligature" then
- unset[unic] = glyph
- end
- end
- if next(unset) then
- local sequences = resources.sequences
- local collected = { }
- for i=1,#sequences do
- local sequence = sequences[i]
- if sequence.type == "gsub_ligature" then
- local steps = sequence.steps
- if steps then
- local l = { }
- local function traverse(p,k,v)
- if k == "ligature" then
- collected[v] = { unpack(l) }
- else
- table.insert(l,k)
- for k, vv in next, v do
- traverse(p,k,vv)
- end
- table.remove(l)
- end
- end
- for i=1,#steps do
- -- we actually had/have this in base mode
- local coverage = steps[i].coverage
- if coverage then
- for k, v in next, coverage do
- traverse(k,k,v)
- end
- end
- end
+ if not collected then
+ collected = fonts.handlers.otf.readers.getcomponents(data)
+ if not collected then
+ break
end
end
- end
- if next(collected) then
- while true do
- local done = false
- for k, v in next, collected do
- for i=1,#v do
- local vi = v[i]
- if vi == k then
- collected[k] = nil
- unset[k] = nil
- else
- local c = collected[vi]
- if c then
- done = true
- local t = { }
- local n = i - 1
- for j=1,n do
- t[j] = t[j]
- end
- for j=1,#c do
- n = n + 1
- t[n] = c[j]
- end
- for j=i+1,#v do
- n = n + 1
- t[n] = t[j]
- end
- collected[k] = t
- break
- end
- end
+ local u = collected[unicode] -- always tables
+ if u then
+ local n = #u
+ for i=1,n do
+ if u[i] > private then
+ n = 0
+ break
end
end
- if not done then
- break
- end
- end
- local n = 0
- for k, v in next, unset do
- u = collected[k]
- if u then
- v.unicode = u
- n = n + 1
+ if n > 0 then
+ if n > 1 then
+ glyph.unicode = u
+ else
+ glyph.unicode = u[1]
+ end
+ unicoded = unicoded + 1
end
end
- if trace_mapping and n > 0 then
- report_fonts("%n ligature tounicode mappings deduced from gsub ligature feaures",n)
- end
end
end
+ if trace_mapping and unicoded > 0 then
+ report_fonts("%n ligature tounicode mappings deduced from gsub ligature features",unicoded)
+ end
if trace_mapping then
for unic, glyph in table.sortedhash(descriptions) do