diff options
author | Philipp Gesang <phg@phi-gamma.net> | 2016-04-17 12:36:59 +0200 |
---|---|---|
committer | Philipp Gesang <phg@phi-gamma.net> | 2016-04-17 12:36:59 +0200 |
commit | 97ec9e582e5be33001c136a9c69b5eebee4fdb2a (patch) | |
tree | 987d7791ae6f39bcf371c72f87d6e8cf759f0c75 /src/fontloader/misc | |
parent | def18cd19d849e3ad6ed3c2416ac8ad6f8aef203 (diff) | |
download | luaotfload-97ec9e582e5be33001c136a9c69b5eebee4fdb2a.tar.gz |
[fontloader] sync with Context as of 2016-04-17
Diffstat (limited to 'src/fontloader/misc')
-rw-r--r-- | src/fontloader/misc/fontloader-font-map.lua | 103 | ||||
-rw-r--r-- | src/fontloader/misc/fontloader-font-otr.lua | 6 | ||||
-rw-r--r-- | src/fontloader/misc/fontloader-font-ots.lua | 4 | ||||
-rw-r--r-- | src/fontloader/misc/fontloader-font-oup.lua | 78 |
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) |