From 97ec9e582e5be33001c136a9c69b5eebee4fdb2a Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 17 Apr 2016 12:36:59 +0200 Subject: [fontloader] sync with Context as of 2016-04-17 --- src/fontloader/misc/fontloader-font-map.lua | 103 ++++---------- src/fontloader/misc/fontloader-font-otr.lua | 6 +- src/fontloader/misc/fontloader-font-ots.lua | 4 +- src/fontloader/misc/fontloader-font-oup.lua | 78 ++++++++++ src/fontloader/runtime/fontloader-reference.lua | 180 +++++++++++++----------- 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 -- cgit v1.2.3