summaryrefslogtreecommitdiff
path: root/src/fontloader
diff options
context:
space:
mode:
authorPhilipp Gesang <phg@phi-gamma.net>2016-04-17 12:36:59 +0200
committerPhilipp Gesang <phg@phi-gamma.net>2016-04-17 12:36:59 +0200
commit97ec9e582e5be33001c136a9c69b5eebee4fdb2a (patch)
tree987d7791ae6f39bcf371c72f87d6e8cf759f0c75 /src/fontloader
parentdef18cd19d849e3ad6ed3c2416ac8ad6f8aef203 (diff)
downloadluaotfload-97ec9e582e5be33001c136a9c69b5eebee4fdb2a.tar.gz
[fontloader] sync with Context as of 2016-04-17
Diffstat (limited to 'src/fontloader')
-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
-rw-r--r--src/fontloader/runtime/fontloader-reference.lua180
5 files changed, 207 insertions, 164 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)
diff --git a/src/fontloader/runtime/fontloader-reference.lua b/src/fontloader/runtime/fontloader-reference.lua
index 2472903..0d22a73 100644
--- a/src/fontloader/runtime/fontloader-reference.lua
+++ b/src/fontloader/runtime/fontloader-reference.lua
@@ -1,6 +1,6 @@
-- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date : 04/16/16 15:27:56
+-- merge date : 04/17/16 11:56:26
do -- begin closure to overcome local limits and interference
@@ -6673,92 +6673,39 @@ function mappings.addtounicode(data,filename,checklookups)
if type(checklookups)=="function" then
checklookups(data,missing,nofmissing)
end
- 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
- 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]
+ 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
local name=glyph.name
@@ -9696,7 +9643,7 @@ function readers.loadfont(filename,n)
end
function readers.getinfo(filename,specification)
local subfont=nil
- local platformname=false
+ local platformnames=false
local rawfamilynames=false
if type(specification)=="table" then
subfont=tonumber(specification.subfont)
@@ -14220,6 +14167,81 @@ local function stripredundant(fontdata)
end
end
end
+function readers.getcomponents(fontdata)
+ 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
+ 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)
if not (fontdata and fontdata.glyphs) then
return