diff options
-rw-r--r-- | luaotfload.dtx | 8 | ||||
-rw-r--r-- | otfl-font-otb.lua | 78 | ||||
-rw-r--r-- | otfl-font-otf.lua | 33 | ||||
-rw-r--r-- | otfl-font-otn.lua | 2 | ||||
-rw-r--r-- | otfl-font-tfm.lua | 180 | ||||
-rw-r--r-- | otfl-luat-dum.lua | 2 | ||||
-rw-r--r-- | otfl-node-inj.lua | 3 | ||||
-rw-r--r-- | tests/fontencoding.tex | 4 |
8 files changed, 53 insertions, 257 deletions
diff --git a/luaotfload.dtx b/luaotfload.dtx index f543fd0..33b8922 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -493,14 +493,6 @@ luaotfload.loadmodule('font-clr.lua') % \end{macrocode} % -% This is a small patch that prevents errors in some \LaTeX\ files. -% -% \begin{macrocode} - -fonts.enc.known = {} - -% \end{macrocode} -% % Finally two functions % % \begin{macrocode} diff --git a/otfl-font-otb.lua b/otfl-font-otb.lua index a684580..020b107 100644 --- a/otfl-font-otb.lua +++ b/otfl-font-otb.lua @@ -134,43 +134,12 @@ local function resolve_ligatures(tfmdata,ligatures,kind) end end -local function collect_lookups(otfdata,kind,script,language) - -- maybe store this in the font - local sequences = otfdata.luatex.sequences - if sequences then - local featuremap, featurelist = { }, { } - for s=1,#sequences do - local sequence = sequences[s] - local features = sequence.features - features = features and features[kind] - features = features and (features[script] or features[default] or features[wildcard]) - features = features and (features[language] or features[default] or features[wildcard]) - if features then - local subtables = sequence.subtables - if subtables then - for s=1,#subtables do - local ss = subtables[s] - if not featuremap[s] then - featuremap[ss] = true - featurelist[#featurelist+1] = ss - end - end - end - end - end - if #featurelist > 0 then - return featuremap, featurelist - end - end - return nil, nil -end - local splitter = lpeg.splitat(" ") function prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features if value then local otfdata = tfmdata.shared.otfdata - local validlookups, lookuplist = collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) + local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) if validlookups then local ligatures = { } local unicodes = tfmdata.unicodes -- names to unicodes @@ -218,7 +187,7 @@ function prepare_base_substitutions(tfmdata,kind,value) -- we can share some cod end if characters[upc] then if trace_baseinit and trace_alternatives then - logs.report("define otf","%s: base alternate %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upc)) + logs.report("define otf","%s: base alternate %s %s => %s",cref(kind,lookup),tostring(value),gref(descriptions,k),gref(descriptions,upc)) end changed[k] = upc end @@ -279,51 +248,10 @@ function prepare_base_substitutions(tfmdata,kind,value) -- we can share some cod end end ---~ local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all ---~ if value then ---~ local otfdata = tfmdata.shared.otfdata ---~ local validlookups, lookuplist = collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) ---~ if validlookups then ---~ local unicodes = tfmdata.unicodes -- names to unicodes ---~ local indices = tfmdata.indices ---~ local characters = tfmdata.characters ---~ local descriptions = tfmdata.descriptions ---~ for u, chr in next, characters do ---~ local d = descriptions[u] ---~ if d then ---~ local dk = d.mykerns ---~ if dk then ---~ local t, done = chr.kerns or { }, false ---~ for l=1,#lookuplist do ---~ local lookup = lookuplist[l] ---~ local kerns = dk[lookup] ---~ if kerns then ---~ for k, v in next, kerns do ---~ if v ~= 0 and not t[k] then -- maybe no 0 test here ---~ t[k], done = v, true ---~ if trace_baseinit and trace_kerns then ---~ logs.report("define otf","%s: base kern %s + %s => %s",cref(kind,lookup),gref(descriptions,u),gref(descriptions,k),v) ---~ end ---~ end ---~ end ---~ end ---~ end ---~ if done then ---~ chr.kerns = t -- no empty assignments ---~ end ---~ -- elseif d.kerns then ---~ -- logs.report("define otf","%s: invalid mykerns for %s",cref(kind),gref(descriptions,u)) ---~ end ---~ end ---~ end ---~ end ---~ end ---~ end - local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all if value then local otfdata = tfmdata.shared.otfdata - local validlookups, lookuplist = collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) + local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) if validlookups then local unicodes = tfmdata.unicodes -- names to unicodes local indices = tfmdata.indices diff --git a/otfl-font-otf.lua b/otfl-font-otf.lua index 94f5dcf..1465e13 100644 --- a/otfl-font-otf.lua +++ b/otfl-font-otf.lua @@ -1711,3 +1711,36 @@ function tfm.read_from_open_type(specification) --~ print(tfmtable.fullname) return tfmtable end + +-- helpers + +function otf.collect_lookups(otfdata,kind,script,language) + -- maybe store this in the font + local sequences = otfdata.luatex.sequences + if sequences then + local featuremap, featurelist = { }, { } + for s=1,#sequences do + local sequence = sequences[s] + local features = sequence.features + features = features and features[kind] + features = features and (features[script] or features[default] or features[wildcard]) + features = features and (features[language] or features[default] or features[wildcard]) + if features then + local subtables = sequence.subtables + if subtables then + for s=1,#subtables do + local ss = subtables[s] + if not featuremap[s] then + featuremap[ss] = true + featurelist[#featurelist+1] = ss + end + end + end + end + end + if #featurelist > 0 then + return featuremap, featurelist + end + end + return nil, nil +end diff --git a/otfl-font-otn.lua b/otfl-font-otn.lua index efafa30..16ecc2d 100644 --- a/otfl-font-otn.lua +++ b/otfl-font-otn.lua @@ -1988,6 +1988,7 @@ function fonts.methods.node.otf.features(head,font,attr) if not lookupcache then report_missing_cache(typ,lookupname) else +--~ print(typ,lookupname,lookupcache,table.serialize(lookupcache)) while start do local id = start.id if id == glyph then @@ -1997,6 +1998,7 @@ function fonts.methods.node.otf.features(head,font,attr) if lookupmatch then -- sequence kan weg local ok +--~ print("!!!") start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,1) --~ texio.write_nl(tostring(lookupname),tostring(lookupmatch),tostring(ok)) if ok then diff --git a/otfl-font-tfm.lua b/otfl-font-tfm.lua index fd3d8b4..aa87398 100644 --- a/otfl-font-tfm.lua +++ b/otfl-font-tfm.lua @@ -36,6 +36,7 @@ fonts.initializers = fonts.initializers or { } fonts.initializers.common = fonts.initializers.common or { } local fontdata = fonts.ids +local disc = node.id('disc') local glyph = node.id('glyph') local set_attribute = node.set_attribute @@ -49,32 +50,7 @@ tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem fr tfm.mathactions = { } tfm.fontname_mode = "fullpath" -function tfm.enhance(tfmdata,specification) - local name, size = specification.name, specification.size - local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.* - if filename and encoding and fonts.enc.known[encoding] then - local data = fonts.enc.load(encoding) - if data then - local characters = tfmdata.characters - tfmdata.encoding = encoding - local vector = data.vector - local original = { } - for k, v in next, characters do - v.name = vector[k] - v.index = k - original[k] = v - end - for k,v in next, data.unicodes do - if k ~= v then - if trace_defining then - logs.report("define font","mapping %s onto %s",k,v) - end - characters[k] = original[v] - end - end - end - end -end +tfm.enhance = tfm.enhance or function() end function tfm.read_from_tfm(specification) local fname, tfmdata = specification.filename or "", nil @@ -679,7 +655,8 @@ function fonts.analyzers.aux.setstate(head,font) local descriptions = tfmdata.descriptions local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean while current do - if current.id == glyph and current.font == font then + local id = current.id + if id == glyph and current.font == font then local d = descriptions[current.char] if d then if d.class == "mark" then @@ -700,6 +677,10 @@ function fonts.analyzers.aux.setstate(head,font) end first, last, n = nil, nil, 0 end + elseif id == disc then + -- always in the middle + set_attribute(current,state,2) -- midi + last = current else -- finish if first and first == last then set_attribute(last,state,4) -- isol @@ -727,151 +708,6 @@ function tfm.replacements(tfm,value) -- tfm.characters[0x0060] = tfm.characters[0x2018] end --- auto complete font with missing composed characters - -table.insert(fonts.manipulators,"compose") - -function fonts.initializers.common.compose(tfmdata,value) - if value then - fonts.vf.aux.compose_characters(tfmdata) - end -end - --- tfm features, experimental - -tfm.features = tfm.features or { } -tfm.features.list = tfm.features.list or { } -tfm.features.default = tfm.features.default or { } - -function tfm.enhance(tfmdata,specification) - -- we don't really share tfm data because we always reload - -- but this is more in sycn with afm and such - local features = (specification.features and specification.features.normal ) or { } - tfmdata.shared = tfmdata.shared or { } - tfmdata.shared.features = features - -- tfmdata.shared.tfmdata = tfmdata -- circular - tfmdata.filename = specification.name - if not features.encoding then - local name, size = specification.name, specification.size - local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.* - if filename and encoding and fonts.enc.known[encoding] then - features.encoding = encoding - end - end - tfm.set_features(tfmdata) -end - -function tfm.set_features(tfmdata) - -- todo: no local functions - local shared = tfmdata.shared --- local tfmdata = shared.tfmdata - local features = shared.features - if not table.is_empty(features) then - local mode = tfmdata.mode or fonts.mode - local fi = fonts.initializers[mode] - if fi and fi.tfm then - local function initialize(list) -- using tex lig and kerning - if list then - for i=1,#list do - local f = list[i] - local value = features[f] - if value and fi.tfm[f] then -- brr - if tfm.trace_features then - logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown') - end - fi.tfm[f](tfmdata,value) - mode = tfmdata.mode or fonts.mode - fi = fonts.initializers[mode] - end - end - end - end - initialize(fonts.triggers) - initialize(tfm.features.list) - initialize(fonts.manipulators) - end - local fm = fonts.methods[mode] - if fm and fm.tfm then - local function register(list) -- node manipulations - if list then - for i=1,#list do - local f = list[i] - if features[f] and fm.tfm[f] then -- brr - if not shared.processors then -- maybe also predefine - shared.processors = { fm.tfm[f] } - else - shared.processors[#shared.processors+1] = fm.tfm[f] - end - end - end - end - end - register(tfm.features.list) - end - end -end - -function tfm.features.register(name,default) - tfm.features.list[#tfm.features.list+1] = name - tfm.features.default[name] = default -end - -function tfm.reencode(tfmdata,encoding) - if encoding and fonts.enc.known[encoding] then - local data = fonts.enc.load(encoding) - if data then - local characters, original, vector = tfmdata.characters, { }, data.vector - tfmdata.encoding = encoding -- not needed - for k, v in next, characters do - v.name, v.index, original[k] = vector[k], k, v - end - for k,v in next, data.unicodes do - if k ~= v then - if trace_defining then - logs.report("define font","reencoding U+%04X to U+%04X",k,v) - end - characters[k] = original[v] - end - end - end - end -end - -tfm.features.register('reencode') - -fonts.initializers.base.tfm.reencode = tfm.reencode -fonts.initializers.node.tfm.reencode = tfm.reencode - -fonts.enc = fonts.enc or { } -fonts.enc.remappings = fonts.enc.remappings or { } - -function tfm.remap(tfmdata,remapping) - local vector = remapping and fonts.enc.remappings[remapping] - if vector then - local characters, original = tfmdata.characters, { } - for k, v in next, characters do - original[k], characters[k] = v, nil - end - for k,v in next, vector do - if k ~= v then - if trace_defining then - logs.report("define font","remapping U+%04X to U+%04X",k,v) - end - local c = original[k] - characters[v] = c - c.index = k - end - end - tfmdata.encodingbytes = 2 - tfmdata.format = 'type1' - end -end - -tfm.features.register('remap') - -fonts.initializers.base.tfm.remap = tfm.remap -fonts.initializers.node.tfm.remap = tfm.remap - -- status info statistics.register("fonts load time", function() diff --git a/otfl-luat-dum.lua b/otfl-luat-dum.lua index 34dd9ed..832f80d 100644 --- a/otfl-luat-dum.lua +++ b/otfl-luat-dum.lua @@ -64,7 +64,7 @@ local remapper = { function resolvers.find_file(name,kind) name = string.gsub(name,"\\","\/") kind = string.lower(kind) - return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or "tex") + return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex")) end function resolvers.findbinfile(name,kind) diff --git a/otfl-node-inj.lua b/otfl-node-inj.lua index 4c58409..9c4612a 100644 --- a/otfl-node-inj.lua +++ b/otfl-node-inj.lua @@ -70,7 +70,8 @@ function nodes.set_pair(current,factor,rlmode,r2lflag,spec,tfmchr) local bound = has_attribute(current,kernpair) if bound then local kb = kerns[bound] - kb[2], kb[3], kb[4], kb[5] = kb[2] + x, kb[3] + y, kb[4] + w, kb[5] + h + -- inefficient but singles have less, but weird anyway, needs checking + kb[2], kb[3], kb[4], kb[5] = (kb[2] or 0) + x, (kb[3] or 0) + y, (kb[4] or 0)+ w, (kb[5] or 0) + h else bound = #kerns + 1 set_attribute(current,kernpair,bound) diff --git a/tests/fontencoding.tex b/tests/fontencoding.tex new file mode 100644 index 0000000..bbbbac6 --- /dev/null +++ b/tests/fontencoding.tex @@ -0,0 +1,4 @@ +\input luaotfload.sty +\font\tenrm=ec-lmr10 +\tenrm +\bye |