summaryrefslogtreecommitdiff
path: root/src/fontloader/misc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fontloader/misc')
-rw-r--r--src/fontloader/misc/fontloader-font-map.lua103
-rw-r--r--src/fontloader/misc/fontloader-font-otr.lua6
-rw-r--r--src/fontloader/misc/fontloader-font-ots.lua4
-rw-r--r--src/fontloader/misc/fontloader-font-oup.lua78
4 files changed, 106 insertions, 85 deletions
diff --git a/src/fontloader/misc/fontloader-font-map.lua b/src/fontloader/misc/fontloader-font-map.lua
index ce84ca6..db501f0 100644
--- a/src/fontloader/misc/fontloader-font-map.lua
+++ b/src/fontloader/misc/fontloader-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
diff --git a/src/fontloader/misc/fontloader-font-otr.lua b/src/fontloader/misc/fontloader-font-otr.lua
index c5f3d56..7226907 100644
--- a/src/fontloader/misc/fontloader-font-otr.lua
+++ b/src/fontloader/misc/fontloader-font-otr.lua
@@ -21,10 +21,6 @@ if not modules then modules = { } end modules ['font-otr'] = {
-- compatible output as well (We're not that far from it as currently I can load
-- all data reasonable fast.)
--- This code is not yet ready for generic i.e. I want to be free to change the
--- keys and values. Especially the gpos/gsub/gdef/math needs checking (this
--- is implemented in font-dsp.lua).
-
-- We can omit redundant glyphs names i.e. ones that match the agl or
-- are just a unicode string but it doesn't save that much. It will be an option
-- some day.
@@ -2146,7 +2142,7 @@ function readers.getinfo(filename,specification) -- string, nil|number|table
-- platformnames is optional and not used by context (a too unpredictable mess
-- that only add to the confusion) .. so it's only for checking things
local subfont = nil
- local platformname = false
+ local platformnames = false
local rawfamilynames = false
if type(specification) == "table" then
subfont = tonumber(specification.subfont)
diff --git a/src/fontloader/misc/fontloader-font-ots.lua b/src/fontloader/misc/fontloader-font-ots.lua
index 2e648c0..c3e1f48 100644
--- a/src/fontloader/misc/fontloader-font-ots.lua
+++ b/src/fontloader/misc/fontloader-font-ots.lua
@@ -22,8 +22,8 @@ if not modules then modules = { } end modules ['font-ots'] = { -- sequences
--
-- This is a version of font-otn.lua adapted to the new font loader code. It
-- is a context version which can contain experimental code, but when we
--- have serious patches we will backport to the font-otn files. There will
--- be a generic variant too.
+-- have serious patches we will backport to the font-otn files. The plain
+-- loader that ships with context also uses this now.
--
-- todo: looks like we have a leak somewhere (probably in ligatures)
-- todo: copy attributes to disc
diff --git a/src/fontloader/misc/fontloader-font-oup.lua b/src/fontloader/misc/fontloader-font-oup.lua
index b184a7f..59530af 100644
--- a/src/fontloader/misc/fontloader-font-oup.lua
+++ b/src/fontloader/misc/fontloader-font-oup.lua
@@ -736,6 +736,83 @@ local function stripredundant(fontdata)
end
end
+function readers.getcomponents(fontdata) -- handy for resolving ligatures when names are missing
+ local resources = fontdata.resources
+ local descriptions = fontdata.descriptions
+ if resources then
+ local sequences = resources.sequences
+ if sequences then
+ 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
+ insert(l,k)
+ for k, vv in next, v do
+ traverse(p,k,vv)
+ end
+ 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
+ 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
+ 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
+ end
+ end
+ if not done then
+ break
+ end
+ end
+ return collected
+ end
+ end
+ end
+end
+
function readers.rehash(fontdata,hashmethod) -- TODO: combine loops in one
if not (fontdata and fontdata.glyphs) then
return
@@ -757,6 +834,7 @@ function readers.rehash(fontdata,hashmethod) -- TODO: combine loops in one
unifymissing(fontdata)
stripredundant(fontdata)
end
+ -- maybe here components
end
function readers.checkhash(fontdata)