summaryrefslogtreecommitdiff
path: root/tex/generic/context/luatex-fonts-merged.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/generic/context/luatex-fonts-merged.lua')
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua299
1 files changed, 170 insertions, 129 deletions
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
index b1c147c96..3c6391e92 100644
--- a/tex/generic/context/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 04/03/11 22:32:45
+-- merge date : 04/11/11 16:45:23
do -- begin closure to overcome local limits and interference
@@ -1079,10 +1079,6 @@ function table.fromhash(t)
return hsh
end
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
@@ -1368,15 +1364,36 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(root,name,_handle,_reduce,_noquotes,_hexify) -- I might drop the _'s some day.
local tname = type(name)
+ if tname == "table" then
+ noquotes = name.noquotes
+ hexify = name.hexify
+ handle = name.handle or print
+ reduce = name.reduce or false
+ functions = name.functions
+ compact = name.compact
+ inline = name.inline and compact
+ name = name.name
+ tname = type(name)
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = _noquotes
+ hexify = _hexify
+ handle = _handle or print
+ reduce = _reduce or false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -1443,12 +1460,11 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
function table.tofile(filename,root,name,reduce,noquotes,hexify)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
local t, n = { }, 0
local function flush(s)
@@ -1666,8 +1682,12 @@ function table.sequenced(t,sep,simple) -- hash only
return concat(s, sep or " | ")
end
-function table.print(...)
- table.tohandle(print,...)
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
+ end
end
-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
@@ -1947,8 +1967,6 @@ function file.collapsepath(str,anchor)
end
end
-file.collapse_path = file.collapsepath
-
--~ local function test(str)
--~ print(string.format("%-20s %-15s %-15s",str,file.collapsepath(str),file.collapsepath(str,true)))
--~ end
@@ -2585,6 +2603,12 @@ function caches.savedata(path,name,data)
end
end
+--
+
+local table.setmetatableindex(t,f)
+ setmetatable(t,{ __index = f })
+end
+
end -- closure
do -- begin closure to overcome local limits and interference
@@ -2883,13 +2907,11 @@ if not modules then modules = { } end modules ['font-con'] = {
local utf = unicode.utf8
-local next, tostring, setmetatable, rawget = next, tostring, setmetatable, rawget
+local next, tostring, rawget = next, tostring, rawget
local format, match, lower, gsub = string.format, string.match, string.lower, string.gsub
local utfbyte = utf.byte
local sort, insert, concat, sortedkeys, serialize, fastcopy = table.sort, table.insert, table.concat, table.sortedkeys, table.serialize, table.fastcopy
-local allocate = utilities.storage.allocate
-
local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
@@ -2911,6 +2933,9 @@ local specifiers = fonts.specifiers
local contextsetups = specifiers.contextsetups
local contextnumbers = specifiers.contextnumbers
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
-- will be directives
constructors.dontembed = allocate()
@@ -3544,7 +3569,7 @@ function constructors.finalize(tfmdata)
--
if not tfmdata.descriptions then
local descriptions = { } -- yes or no
- setmetatable(descriptions, { __index = function(t,k) local v = { } t[k] = v return v end })
+ setmetatableindex(descriptions, function(t,k) local v = { } t[k] = v return v end)
tfmdata.descriptions = descriptions
end
--
@@ -3742,16 +3767,14 @@ end
local formats = allocate()
fonts.formats = formats
-setmetatable(formats, {
- __index = function(t,k)
- local l = lower(k)
- if rawget(t,k) then
- t[k] = l
- return l
- end
- return rawget(t,file.extname(l))
+setmetatableindex(formats, function(t,k)
+ local l = lower(k)
+ if rawget(t,k) then
+ t[k] = l
+ return l
end
-} )
+ return rawget(t,file.extname(l))
+end)
local locations = { }
@@ -3851,7 +3874,7 @@ function constructors.newfeatures(what)
local features = handlers[what].features
if not features then
local tables = handlers[what].tables -- can be preloaded
- features = {
+ features = allocate {
defaults = { },
descriptions = tables and tables.features or { },
initializers = { base = { }, node = { } },
@@ -4777,7 +4800,7 @@ local otf = fonts.handlers.otf
otf.glists = { "gsub", "gpos" }
-otf.version = 2.721 -- beware: also sync font-mis.lua
+otf.version = 2.722 -- beware: also sync font-mis.lua
otf.cache = containers.define("fonts", "otf", otf.version, true)
local fontdata = fonts.hashes.identifiers
@@ -5902,13 +5925,55 @@ end
-- to be checked italic_correction
+local function check_variants(unicode,the_variants,splitter,unicodes)
+ local variants = the_variants.variants
+ if variants then -- use splitter
+ local glyphs = lpegmatch(splitter,variants)
+ local done = { [unicode] = true }
+ local n = 0
+ for i=1,#glyphs do
+ local g = glyphs[i]
+ if done[g] then
+ report_otf("skipping cyclic reference U+%05X in math variant U+%05X",g,unicode)
+ elseif n == 0 then
+ n = 1
+ variants = { g }
+ else
+ n = n + 1
+ variants[n] = g
+ end
+ end
+ if n == 0 then
+ variants = nil
+ end
+ end
+ local parts = the_variants.parts
+ if parts then
+ local p = #parts
+ if p > 0 then
+ for i=1,p do
+ local pi = parts[i]
+ pi.glyph = unicodes[pi.component] or 0
+ pi.component = nil
+ end
+ else
+ parts = nil
+ end
+ end
+ local italic_correction = the_variants.italic_correction
+ if italic_correction and italic_correction == 0 then
+ italic_correction = nil
+ end
+ return variants, parts, italic_correction
+end
+
actions["analyze math"] = function(data,filename,raw)
if raw.math then
data.metadata.math = raw.math
local unicodes = data.resources.unicodes
local splitter = data.helpers.tounicodetable
for unicode, description in next, data.descriptions do
- local glyph = description.glyph
+ local glyph = description.glyph
local mathkerns = glyph.mathkern -- singular
local horiz_variants = glyph.horiz_variants
local vert_variants = glyph.vert_variants
@@ -5933,56 +5998,10 @@ actions["analyze math"] = function(data,filename,raw)
math.kerns = mathkerns
end
if horiz_variants then
- local variants = horiz_variants.variants
- if variants then -- use splitter
- local glyphs = lpegmatch(splitter,variants)
- for i=1,#glyphs do
- if glyphs[i] == u then
- remove(glyphs,i)
- break
- end
- end
- math.horiz_variants = glyphs
- end
- local parts = horiz_variants.parts
- if parts and #parts > 0 then
- for i=1,#parts do
- local pi = parts[i]
- pi.glyph = unicodes[pi.component] or 0
- pi.component = nil
- end
- math.horiz_parts = parts
- end
- local italic_correction = horiz_variants.italic_correction
- if italic_correction and italic_correction ~= 0 then
- math.horiz_italic_correction = italic_correction
- end
+ math.horiz_variants, math.horiz_parts, math.horiz_italic_correction = check_variants(unicode,horiz_variants,splitter,unicodes)
end
if vert_variants then
- local variants = vert_variants.variants
- if variants then
- local glyphs = lpegmatch(splitter,variants)
- for i=1,#glyphs do
- if glyphs[i] == u then
- remove(glyphs,i)
- break
- end
- end
- math.vert_variants = glyphs
- end
- local p = vert_variants.parts
- if parts and #parts > 0 then
- for i=1,#parts do
- local pi = parts[i]
- pi.glyph = unicodes[pi.component] or 0
- pi.component = nil
- end
- math.vert_parts = parts
- end
- local italic_correction = vert_variants.italic_correction
- if italic_correction and italic_correction ~= 0 then
- math.vert_italic_correction = italic_correction
- end
+ math.vert_variants, math.vert_parts, math.vert_italic_correction = check_variants(unicode,vert_variants,splitter,unicodes)
end
local italic_correction = description.italic
if italic_correction and italic_correction ~= 0 then
@@ -6340,25 +6359,39 @@ local function copytotfm(data,cache_id)
local m = d.math
if m then
-- watch out: luatex uses horiz_variants for the parts
- local variants, parts = m.horiz_variants, m.horiz_parts
+ local variants = m.horiz_variants
+ local parts = m.horiz_parts
+ -- local done = { [unicode] = true }
if variants then
local c = character
for i=1,#variants do
local un = variants[i]
- c.next = un
- c = characters[un]
+ -- if done[un] then
+ -- -- report_otf("skipping cyclic reference U+%05X in math variant U+%05X",un,unicode)
+ -- else
+ c.next = un
+ c = characters[un]
+ -- done[un] = true
+ -- end
end -- c is now last in chain
c.horiz_variants = parts
elseif parts then
character.horiz_variants = parts
end
- local variants, parts = m.vert_variants, m.vert_parts
+ local variants = m.vert_variants
+ local parts = m.vert_parts
+ -- local done = { [unicode] = true }
if variants then
local c = character
for i=1,#variants do
local un = variants[i]
- c.next = un
- c = characters[un]
+ -- if done[un] then
+ -- -- report_otf("skipping cyclic reference U+%05X in math variant U+%05X",un,unicode)
+ -- else
+ c.next = un
+ c = characters[un]
+ -- done[un] = true
+ -- end
end -- c is now last in chain
c.vert_variants = parts
elseif parts then
@@ -7852,6 +7885,8 @@ local find_node_tail = node.tail or node.slide
local set_attribute = node.set_attribute
local has_attribute = node.has_attribute
+local setmetatableindex = table.setmetatableindex
+
local zwnj = 0x200C
local zwj = 0x200D
local wildcard = "*"
@@ -8148,7 +8183,7 @@ function handlers.gsub_multiple(start,kind,lookupname,multiple)
return multiple_glyphs(start,multiple)
end
-function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or maybe pass lookup ref
+function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence)
local s, stop, discfound = start.next, nil, false
local startchar = start.char
if marks[startchar] then
@@ -8169,14 +8204,18 @@ function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or ma
end
if stop then
local lig = ligature.ligature
- if trace_ligatures then
- local stopchar = stop.char
- start = markstoligature(kind,lookupname,start,stop,lig)
- logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ if lig then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = markstoligature(kind,lookupname,start,stop,lig)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = markstoligature(kind,lookupname,start,stop,lig)
+ end
+ return start, true
else
- start = markstoligature(kind,lookupname,start,stop,lig)
+ -- ok, goto next lookup
end
- return start, true
end
else
local skipmark = sequence.flags[1]
@@ -8209,14 +8248,18 @@ function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or ma
end
if stop then
local lig = ligature.ligature
- if trace_ligatures then
- local stopchar = stop.char
- start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
- logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ if lig then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ end
+ return start, true
else
- start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ -- ok, goto next lookup
end
- return start, true
end
end
return start, false
@@ -9529,16 +9572,14 @@ local resolved = { } -- we only resolve a font,script,language pair once
local lookuphashes = { }
-setmetatable(lookuphashes, { __index =
- function(t,font)
- local lookuphash = fontdata[font].resources.lookuphash
- if not lookuphash or not next(lookuphash) then
- lookuphash = false
- end
- t[font] = lookuphash
- return lookuphash
+setmetatableindex(lookuphashes, function(t,font)
+ local lookuphash = fontdata[font].resources.lookuphash
+ if not lookuphash or not next(lookuphash) then
+ lookuphash = false
end
-})
+ t[font] = lookuphash
+ return lookuphash
+end)
-- fonts.hashes.lookups = lookuphashes
@@ -9585,11 +9626,11 @@ function otf.dataset(ftfmdata,sequences,font) -- generic variant, overloaded in
if not rl then
rl = { }
rs[language] = rl
- setmetatable(rl, { __index = function(t,k)
+ setmetatableindex(rl, function(t,k)
local v = enabled and initialize(sequences[k],script,language,enabled)
t[k] = v
return v
- end})
+ end)
end
return rl
end
@@ -10197,14 +10238,15 @@ if not trackers then trackers = { register = function() end } end
local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
-local fonts, nodes = fonts, nodes
-local node = node
+local fonts, nodes, node = fonts, nodes, node
+
+local allocate = utilities.storage.allocate
local otf = fonts.handlers.otf
local analyzers = fonts.analyzers
-local initializers = { }
-local methods = { }
+local initializers = allocate()
+local methods = allocate()
analyzers.initializers = initializers
analyzers.methods = methods
@@ -10987,18 +11029,17 @@ function definers.read(specification,size,id) -- id can be optional, name can al
if not tfmdata then -- or id?
report_defining( "unknown font %s, loading aborted",specification.name)
elseif trace_defining and type(tfmdata) == "table" then
- constructors.finalize(tfmdata)
- -- local properties = tfmdata.properties or { }
- -- local parameters = tfmdata.parameters or { }
+ local properties = tfmdata.properties or { }
+ local parameters = tfmdata.parameters or { }
report_defining("using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
- properties.type or "unknown",
- id or "?",
- properties.name or "?",
- parameters.size or "default",
- properties.encodingbytes or "?",
- properties.encodingname or "unicode",
- properties.fullname or "?",
- file.basename(properties.filename or "?"))
+ properties.type or "unknown",
+ id or "?",
+ properties.name or "?",
+ parameters.size or "default",
+ properties.encodingbytes or "?",
+ properties.encodingname or "unicode",
+ properties.fullname or "?",
+ file.basename(properties.filename or "?"))
end
statistics.stoptiming(fonts)
return tfmdata
@@ -11008,7 +11049,7 @@ end
<p>We overload the <l n='tfm'/> reader.</p>
--ldx]]--
-callbacks.register('define_font' , definers.read, "definition of fonts (tfmdata preparation)")
+callbacks.register('define_font', definers.read, "definition of fonts (tfmdata preparation)")
end -- closure