summaryrefslogtreecommitdiff
path: root/src/fontloader/runtime/fontloader-fontloader.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/fontloader/runtime/fontloader-fontloader.lua')
-rw-r--r--src/fontloader/runtime/fontloader-fontloader.lua526
1 files changed, 280 insertions, 246 deletions
diff --git a/src/fontloader/runtime/fontloader-fontloader.lua b/src/fontloader/runtime/fontloader-fontloader.lua
index 96a7dd3..b662152 100644
--- a/src/fontloader/runtime/fontloader-fontloader.lua
+++ b/src/fontloader/runtime/fontloader-fontloader.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 12/21/14 22:25:48
+-- merge date : 03/10/15 12:09:17
do -- begin closure to overcome local limits and interference
@@ -85,6 +85,13 @@ end
if lua then
lua.mask=load([[τεχ = 1]]) and "utf" or "ascii"
end
+local flush=io.flush
+if flush then
+ local execute=os.execute if execute then function os.execute(...) flush() return execute(...) end end
+ local exec=os.exec if exec then function os.exec (...) flush() return exec (...) end end
+ local spawn=os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
+ local popen=io.popen if popen then function io.popen (...) flush() return popen (...) end end
+end
end -- closure
@@ -964,8 +971,9 @@ function table.keys(t)
end
end
local function compare(a,b)
- local ta,tb=type(a),type(b)
- if ta==tb then
+ local ta=type(a)
+ local tb=type(b)
+ if ta==tb and ta=="number" then
return a<b
else
return tostring(a)<tostring(b)
@@ -1288,7 +1296,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
end
- if root and next(root) then
+ if root and next(root)~=nil then
local first,last=nil,0
if compact then
last=#root
@@ -1321,7 +1329,7 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s %q,",depth,v))
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
handle(format("%s {},",depth))
elseif inline then
local st=simple_table(v)
@@ -1405,7 +1413,7 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
elseif tv=="table" then
- if not next(v) then
+ if next(v)==nil then
if tk=="number" then
if hexify then
handle(format("%s [0x%X]={},",depth,k))
@@ -1547,7 +1555,7 @@ local function serialize(_handle,root,name,specification)
local dummy=root._w_h_a_t_e_v_e_r_
root._w_h_a_t_e_v_e_r_=nil
end
- if next(root) then
+ if next(root)~=nil then
do_serialize(root,name,"",0)
end
end
@@ -1682,7 +1690,7 @@ local function sparse(old,nest,keeptables)
if not (v=="" or v==false) then
if nest and type(v)=="table" then
v=sparse(v,nest)
- if keeptables or next(v) then
+ if keeptables or next(v)~=nil then
new[k]=v
end
else
@@ -1799,10 +1807,10 @@ function table.sub(t,i,j)
return { unpack(t,i,j) }
end
function table.is_empty(t)
- return not t or not next(t)
+ return not t or next(t)==nil
end
function table.has_one_entry(t)
- return t and not next(t,next(t))
+ return t and next(t,next(t))==nil
end
function table.loweredkeys(t)
local l={}
@@ -1871,7 +1879,7 @@ function table.filtered(t,pattern,sort,cmp)
else
local n=next(t)
local function iterator()
- while n do
+ while n~=nil do
local k=n
n=next(t,k)
if find(k,pattern) then
@@ -2195,8 +2203,6 @@ function io.readstring(f,n,m)
local str=gsub(f:read(n),"\000","")
return str
end
-if not io.i_limiter then function io.i_limiter() end end
-if not io.o_limiter then function io.o_limiter() end end
end -- closure
@@ -2214,41 +2220,28 @@ local file=file
if not lfs then
lfs=optionalrequire("lfs")
end
-if not lfs then
- lfs={
- getcurrentdir=function()
- return "."
- end,
- attributes=function()
- return nil
- end,
- isfile=function(name)
- local f=io.open(name,'rb')
- if f then
- f:close()
- return true
- end
- end,
- isdir=function(name)
- print("you need to load lfs")
- return false
- end
- }
-elseif not lfs.isfile then
- local attributes=lfs.attributes
- function lfs.isdir(name)
- return attributes(name,"mode")=="directory"
- end
- function lfs.isfile(name)
- return attributes(name,"mode")=="file"
- end
-end
local insert,concat=table.insert,table.concat
local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
local P,R,S,C,Cs,Cp,Cc,Ct=lpeg.P,lpeg.R,lpeg.S,lpeg.C,lpeg.Cs,lpeg.Cp,lpeg.Cc,lpeg.Ct
+local tricky=S("/\\")*P(-1)
+local attributes=lfs.attributes
+if sandbox then
+ sandbox.redefine(lfs.isfile,"lfs.isfile")
+ sandbox.redefine(lfs.isdir,"lfs.isdir")
+end
+function lfs.isdir(name)
+ if lpegmatch(tricky,name) then
+ return attributes(name,"mode")=="directory"
+ else
+ return attributes(name.."/.","mode")=="directory"
+ end
+end
+function lfs.isfile(name)
+ return attributes(name,"mode")=="file"
+end
local colon=P(":")
local period=P(".")
local periods=P("..")
@@ -2535,18 +2528,6 @@ function file.collapsepath(str,anchor)
end
end
end
-local tricky=S("/\\")*P(-1)
-local attributes=lfs.attributes
-function lfs.isdir(name)
- if lpegmatch(tricky,name) then
- return attributes(name,"mode")=="directory"
- else
- return attributes(name.."/.","mode")=="directory"
- end
-end
-function lfs.isfile(name)
- return attributes(name,"mode")=="file"
-end
local validchars=R("az","09","AZ","--","..")
local pattern_a=lpeg.replacer(1-validchars)
local pattern_a=Cs((validchars+P(1)/"-")^1)
@@ -2874,10 +2855,10 @@ string.tracedchars=tracedchars
strings.tracers=tracedchars
function string.tracedchar(b)
if type(b)=="number" then
- return tracedchars[b] or (utfchar(b).." (U+"..format('%05X',b)..")")
+ return tracedchars[b] or (utfchar(b).." (U+"..format("%05X",b)..")")
else
local c=utfbyte(b)
- return tracedchars[c] or (b.." (U+"..format('%05X',c)..")")
+ return tracedchars[c] or (b.." (U+"..(c and format("%05X",c) or "?????")..")")
end
end
function number.signed(i)
@@ -3393,8 +3374,13 @@ end
local dummyfunction=function()
end
local dummyreporter=function(c)
- return function(...)
- (texio.reporter or texio.write_nl)(c.." : "..string.formatters(...))
+ return function(f,...)
+ local r=texio.reporter or texio.write_nl
+ if f then
+ r(c.." : "..string.formatters(f,...))
+ else
+ r("")
+ end
end
end
statistics={
@@ -3981,7 +3967,7 @@ fonts.analyzers={}
fonts.readers={}
fonts.definers={ methods={} }
fonts.loggers={ register=function() end }
-fontloader.totable=fontloader.to_table
+fontloader.totable=fontloader.to_table
end -- closure
@@ -5813,13 +5799,13 @@ local function read_from_tfm(specification)
properties.filename=specification.filename
properties.format=fonts.formats.tfm
parameters.size=size
- shared.rawdata={}
- shared.features=features
- shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
tfmdata.properties=properties
tfmdata.resources=resources
tfmdata.parameters=parameters
tfmdata.shared=shared
+ shared.rawdata={}
+ shared.features=features
+ shared.processes=next(features) and tfm.setfeatures(tfmdata,features) or nil
parameters.slant=parameters.slant or parameters[1] or 0
parameters.space=parameters.space or parameters[2] or 0
parameters.space_stretch=parameters.space_stretch or parameters[3] or 0
@@ -5915,6 +5901,10 @@ local findbinfile=resolvers.findbinfile
local definers=fonts.definers
local readers=fonts.readers
local constructors=fonts.constructors
+local fontloader=fontloader
+local font_to_table=fontloader.to_table
+local open_font=fontloader.open
+local close_font=fontloader.close
local afm=constructors.newhandler("afm")
local pfb=constructors.newhandler("pfb")
local afmfeatures=constructors.newfeatures("afm")
@@ -6030,10 +6020,10 @@ local function get_variables(data,fontmetrics)
end
local function get_indexes(data,pfbname)
data.resources.filename=resolvers.unresolve(pfbname)
- local pfbblob=fontloader.open(pfbname)
+ local pfbblob=open_font(pfbname)
if pfbblob then
local characters=data.characters
- local pfbdata=fontloader.to_table(pfbblob)
+ local pfbdata=font_to_table(pfbblob)
if pfbdata then
local glyphs=pfbdata.glyphs
if glyphs then
@@ -6058,7 +6048,7 @@ local function get_indexes(data,pfbname)
elseif trace_loading then
report_afm("no data in pfb file %a",pfbname)
end
- fontloader.close(pfbblob)
+ close_font(pfbblob)
elseif trace_loading then
report_afm("invalid pfb file %a",pfbname)
end
@@ -7072,13 +7062,14 @@ local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
otf.glists={ "gsub","gpos" }
-otf.version=2.802
+otf.version=2.803
otf.cache=containers.define("fonts","otf",otf.version,true)
-local fontdata=fonts.hashes.identifiers
-local chardata=characters and characters.data
+local hashes=fonts.hashes
local definers=fonts.definers
local readers=fonts.readers
local constructors=fonts.constructors
+local fontdata=hashes and hashes.identifiers
+local chardata=characters and characters.data
local otffeatures=constructors.newfeatures("otf")
local registerotffeature=otffeatures.register
local enhancers=allocate()
@@ -7095,7 +7086,11 @@ local overloadkerns=false
local applyruntimefixes=fonts.treatments and fonts.treatments.applyfixes
local wildcard="*"
local default="dflt"
-local fontloaderfields=fontloader.fields
+local fontloader=fontloader
+local open_font=fontloader.open
+local close_font=fontloader.close
+local font_fields=fontloader.fields
+local apply_featurefile=fontloader.apply_featurefile
local mainfields=nil
local glyphfields=nil
local formats=fonts.formats
@@ -7136,7 +7131,7 @@ local function load_featurefile(raw,featurefile)
if trace_loading then
report_otf("using featurefile %a",featurefile)
end
- fontloader.apply_featurefile(raw,featurefile)
+ apply_featurefile(raw,featurefile)
end
end
local function showfeatureorder(rawdata,filename)
@@ -7387,12 +7382,12 @@ function otf.load(filename,sub,featurefile)
report_otf("loading %a, hash %a",filename,hash)
local fontdata,messages
if sub then
- fontdata,messages=fontloader.open(filename,sub)
+ fontdata,messages=open_font(filename,sub)
else
- fontdata,messages=fontloader.open(filename)
+ fontdata,messages=open_font(filename)
end
if fontdata then
- mainfields=mainfields or (fontloaderfields and fontloaderfields(fontdata))
+ mainfields=mainfields or (font_fields and font_fields(fontdata))
end
if trace_loading and messages and #messages>0 then
if type(messages)=="string" then
@@ -7466,7 +7461,7 @@ function otf.load(filename,sub,featurefile)
report_otf("preprocessing and caching time %s, packtime %s",
elapsedtime(data),packdata and elapsedtime(packtime) or 0)
end
- fontloader.close(fontdata)
+ close_font(fontdata)
if cleanup>3 then
collectgarbage("collect")
end
@@ -9850,9 +9845,9 @@ if not modules then modules={} end modules ['font-inj']={
if not nodes.properties then return end
local next,rawget=next,rawget
local utfchar=utf.char
+local fastcopy=table.fastcopy
local trace_injections=false trackers.register("fonts.injections",function(v) trace_injections=v end)
local report_injections=logs.reporter("fonts","injections")
-report_injections("using experimental injector")
local attributes,nodes,node=attributes,nodes,node
fonts=fonts
local fontdata=fonts.hashes.identifiers
@@ -9899,15 +9894,36 @@ function injections.resetcounts()
keepregisteredcounts=false
end
function injections.reset(n)
- local p=rawget(properties,start)
- if p and p.injections then
- p.injections=nil
+ local p=rawget(properties,n)
+ if p and rawget(p,"injections") then
+ p.injections=nil
+ end
+end
+function injections.copy(target,source)
+ local sp=rawget(properties,source)
+ if sp then
+ local tp=rawget(properties,target)
+ local si=rawget(sp,"injections")
+ if si then
+ si=fastcopy(si)
+ if tp then
+ tp.injections=si
+ else
+ propertydata[target]={
+ injections=si,
+ }
+ end
+ else
+ if tp then
+ tp.injections=nil
+ end
+ end
end
end
function injections.setligaindex(n,index)
local p=rawget(properties,n)
if p then
- local i=p.injections
+ local i=rawget(p,"injections")
if i then
i.ligaindex=index
else
@@ -9926,9 +9942,9 @@ end
function injections.getligaindex(n,default)
local p=rawget(properties,n)
if p then
- p=p.injections
- if p then
- return p.ligaindex or default
+ local i=rawget(p,"injections")
+ if i then
+ return i.ligaindex or default
end
end
return default
@@ -9945,7 +9961,7 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne
end
local p=rawget(properties,start)
if p then
- local i=p.injections
+ local i=rawget(p,"injections")
if i then
i.cursiveanchor=true
else
@@ -9962,7 +9978,7 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne
end
local p=rawget(properties,nxt)
if p then
- local i=p.injections
+ local i=rawget(p,"injections")
if i then
i.cursivex=dx
i.cursivey=dy
@@ -9995,14 +10011,16 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection)
end
local p=rawget(properties,current)
if p then
- local i=p.injections
+ local i=rawget(p,"injections")
if i then
- if leftkern~=0 or rightkern~=0 then
- i.leftkern=i.leftkern or 0+leftkern
- i.rightkern=i.rightkern or 0+rightkern
+ if leftkern~=0 then
+ i.leftkern=(i.leftkern or 0)+leftkern
+ end
+ if rightkern~=0 then
+ i.rightkern=(i.rightkern or 0)+rightkern
end
if yoffset~=0 then
- i.yoffset=i.yoffset or 0+yoffset
+ i.yoffset=(i.yoffset or 0)+yoffset
end
elseif leftkern~=0 or rightkern~=0 then
p.injections={
@@ -10044,9 +10062,9 @@ function injections.setkern(current,factor,rlmode,x,injection)
injection="injections"
end
if p then
- local i=p[injection]
+ local i=rawget(p,injection)
if i then
- i.leftkern=dx+i.leftkern or 0
+ i.leftkern=dx+(i.leftkern or 0)
else
p[injection]={
leftkern=dx,
@@ -10072,7 +10090,7 @@ function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase)
end
local p=rawget(properties,start)
if p then
- local i=p.injections
+ local i=rawget(p,"injections")
if i then
i.markx=dx
i.marky=dy
@@ -10112,18 +10130,18 @@ local function show(n,what,nested,symbol)
if n then
local p=rawget(properties,n)
if p then
- local p=p[what]
- if p then
- local leftkern=p.leftkern or 0
- local rightkern=p.rightkern or 0
- local yoffset=p.yoffset or 0
- local markx=p.markx or 0
- local marky=p.marky or 0
- local markdir=p.markdir or 0
- local markbase=p.markbase or 0
- local cursivex=p.cursivex or 0
- local cursivey=p.cursivey or 0
- local ligaindex=p.ligaindex or 0
+ local i=rawget(p,what)
+ if i then
+ local leftkern=i.leftkern or 0
+ local rightkern=i.rightkern or 0
+ local yoffset=i.yoffset or 0
+ local markx=i.markx or 0
+ local marky=i.marky or 0
+ local markdir=i.markdir or 0
+ local markbase=i.markbase or 0
+ local cursivex=i.cursivex or 0
+ local cursivey=i.cursivey or 0
+ local ligaindex=i.ligaindex or 0
local margin=nested and 4 or 2
if rightkern~=0 or yoffset~=0 then
report_injections("%w%s pair: lx %p, rx %p, dy %p",margin,symbol,leftkern,rightkern,yoffset)
@@ -10151,9 +10169,9 @@ local function showsub(n,what,where)
end
report_injections("end subrun")
end
-local function trace(head)
- report_injections("begin run: %s kerns, %s pairs, %s marks and %s cursives registered",
- nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives)
+local function trace(head,where)
+ report_injections("begin run %s: %s kerns, %s pairs, %s marks and %s cursives registered",
+ where or "",nofregisteredkerns,nofregisteredpairs,nofregisteredmarks,nofregisteredcursives)
local n=head
while n do
local id=getid(n)
@@ -10206,10 +10224,6 @@ local function collect_glyphs_1(head)
local nf,tm=nil,nil
for n in traverse_id(glyph_code,head) do
if getsubtype(n)<256 then
- local pn=rawget(properties,n)
- if pn then
- pn=pn.injections
- end
local f=getfont(n)
if f~=nf then
nf=f
@@ -10222,10 +10236,14 @@ local function collect_glyphs_1(head)
nofglyphs=nofglyphs+1
glyphs[nofglyphs]=n
end
- if pn then
- local yoffset=pn.yoffset
- if yoffset and yoffset~=0 then
- setfield(n,"yoffset",yoffset)
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"injections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
end
end
end
@@ -10259,20 +10277,30 @@ local function inject_marks(marks,nofmarks)
local n=marks[i]
local pn=rawget(properties,n)
if pn then
- pn=pn.injections
- end
- if pn then
+ pn=rawget(pn,"injections")
+ if pn then
local p=pn.markbasenode
if p then
local px=getfield(p,"xoffset")
local ox=0
+ local rightkern=nil
local pp=rawget(properties,p)
- local rightkern=pp and pp.rightkern
+ if pp then
+ pp=rawget(pp,"injections")
+ if pp then
+ rightkern=pp.rightkern
+ end
+ end
if rightkern then
if pn.markdir<0 then
ox=px-pn.markx-rightkern
else
- ox=px-pn.markx-pp.leftkern
+ local leftkern=pp.leftkern
+ if leftkern then
+ ox=px-pn.markx
+ else
+ ox=px-pn.markx-leftkern
+ end
end
else
ox=px-pn.markx
@@ -10293,6 +10321,7 @@ local function inject_marks(marks,nofmarks)
setfield(n,"yoffset",oy)
else
end
+ end
end
end
end
@@ -10303,14 +10332,14 @@ local function inject_cursives(glyphs,nofglyphs)
local n=glyphs[i]
local pn=rawget(properties,n)
if pn then
- pn=pn.injections
+ pn=rawget(pn,"injections")
end
if pn then
local cursivex=pn.cursivex
if cursivex then
if cursiveanchor then
if cursivex~=0 then
- pn.leftkern=pn.leftkern or 0+cursivex
+ pn.leftkern=(pn.leftkern or 0)+cursivex
end
if lastanchor then
if maxc==0 then
@@ -10374,16 +10403,16 @@ local function inject_kerns(head,glyphs,nofglyphs)
local n=glyphs[i]
local pn=rawget(properties,n)
if pn then
- pn=pn.injections
- end
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
- insert_node_before(head,n,newkern(leftkern))
- end
- local rightkern=pn.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(head,n,newkern(rightkern))
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ insert_node_before(head,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ end
end
end
end
@@ -10391,7 +10420,7 @@ end
local function inject_everything(head,where)
head=tonut(head)
if trace_injections then
- trace(head)
+ trace(head,"everything")
end
local glyphs,nofglyphs,marks,nofmarks
if nofregisteredpairs>0 then
@@ -10403,7 +10432,7 @@ local function inject_everything(head,where)
if nofregisteredcursives>0 then
inject_cursives(glyphs,nofglyphs)
end
- if nofregisteredmarks>0 then
+ if nofregisteredmarks>0 then
inject_marks(marks,nofmarks)
end
inject_kerns(head,glyphs,nofglyphs)
@@ -10421,7 +10450,7 @@ end
local function inject_kerns_only(head,where)
head=tonut(head)
if trace_injections then
- trace(head)
+ trace(head,"kerns")
end
local n=head
local p=nil
@@ -10434,10 +10463,10 @@ local function inject_kerns_only(head,where)
if p then
local d=getfield(p,"post")
if d then
- local pn=pn.postinjections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"postinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
local t=find_tail(d)
insert_node_after(d,t,newkern(leftkern))
end
@@ -10445,28 +10474,28 @@ local function inject_kerns_only(head,where)
end
local d=getfield(p,"replace")
if d then
- local pn=pn.replaceinjections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
local t=find_tail(d)
insert_node_after(d,t,newkern(leftkern))
end
end
else
- local pn=pn.injections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
setfield(p,"replace",newkern(leftkern))
end
end
end
else
- local pn=pn.injections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
head=insert_node_before(head,n,newkern(leftkern))
end
end
@@ -10484,12 +10513,12 @@ local function inject_kerns_only(head,where)
if getsubtype(n)<256 then
local pn=rawget(properties,n)
if pn then
- pn=pn.preinjections
- end
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
- h=insert_node_before(h,n,newkern(leftkern))
+ local i=rawget(pn,"preinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
end
end
else
@@ -10507,12 +10536,12 @@ local function inject_kerns_only(head,where)
if getsubtype(n)<256 then
local pn=rawget(properties,n)
if pn then
- pn=pn.postinjections
- end
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
- h=insert_node_before(h,n,newkern(leftkern))
+ local i=rawget(pn,"postinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
end
end
else
@@ -10530,12 +10559,12 @@ local function inject_kerns_only(head,where)
if getsubtype(n)<256 then
local pn=rawget(properties,n)
if pn then
- pn=pn.replaceinjections
- end
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
- h=insert_node_before(h,n,newkern(leftkern))
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
end
end
else
@@ -10562,7 +10591,7 @@ end
local function inject_pairs_only(head,where)
head=tonut(head)
if trace_injections then
- trace(head)
+ trace(head,"pairs")
end
local n=head
local p=nil
@@ -10575,10 +10604,10 @@ local function inject_pairs_only(head,where)
if p then
local d=getfield(p,"post")
if d then
- local pn=pn.postinjections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"postinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
local t=find_tail(d)
insert_node_after(d,t,newkern(leftkern))
end
@@ -10586,35 +10615,35 @@ local function inject_pairs_only(head,where)
end
local d=getfield(p,"replace")
if d then
- local pn=pn.replaceinjections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
local t=find_tail(d)
insert_node_after(d,t,newkern(leftkern))
end
end
else
- local pn=pn.injections
- if pn then
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local i=rawget(pn,"injections")
+ if i then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
setfield(p,"replace",newkern(leftkern))
end
end
end
else
- local pn=pn.injections
- if pn then
- local yoffset=pn.yoffset
+ local i=rawget(pn,"injections")
+ if i then
+ local yoffset=i.yoffset
if yoffset and yoffset~=0 then
setfield(n,"yoffset",yoffset)
end
- local leftkern=pn.leftkern
- if leftkern~=0 then
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
insert_node_before(head,n,newkern(leftkern))
end
- local rightkern=pn.rightkern
+ local rightkern=i.rightkern
if rightkern and rightkern~=0 then
insert_node_after(head,n,newkern(rightkern))
n=getnext(n)
@@ -10632,23 +10661,23 @@ local function inject_pairs_only(head,where)
local h=d
for n in traverse_id(glyph_code,d) do
if getsubtype(n)<256 then
- local pn=rawget(properties,n)
- if pn then
- pn=pn.preinjections
- end
- if pn then
- local yoffset=pn.yoffset
- if yoffset and yoffset~=0 then
- setfield(n,"yoffset",yoffset)
- end
- local leftkern=pn.leftkern
- if leftkern~=0 then
- h=insert_node_before(h,n,newkern(leftkern))
- end
- local rightkern=pn.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(head,n,newkern(rightkern))
- n=getnext(n)
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"preinjections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
+ end
end
end
else
@@ -10664,23 +10693,23 @@ local function inject_pairs_only(head,where)
local h=d
for n in traverse_id(glyph_code,d) do
if getsubtype(n)<256 then
- local pn=rawget(properties,n)
- if pn then
- pn=pn.postinjections
- end
- if pn then
- local yoffset=pn.yoffset
- if yoffset and yoffset~=0 then
- setfield(n,"yoffset",yoffset)
- end
- local leftkern=pn.leftkern
- if leftkern~=0 then
- h=insert_node_before(h,n,newkern(leftkern))
- end
- local rightkern=pn.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(head,n,newkern(rightkern))
- n=getnext(n)
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(p,"postinjections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
+ end
end
end
else
@@ -10696,23 +10725,23 @@ local function inject_pairs_only(head,where)
local h=d
for n in traverse_id(glyph_code,d) do
if getsubtype(n)<256 then
- local pn=rawget(properties,n)
- if pn then
- pn=pn.replaceinjections
- end
- if pn then
- local yoffset=pn.yoffset
- if yoffset and yoffset~=0 then
- setfield(n,"yoffset",yoffset)
- end
- local leftkern=pn.leftkern
- if leftkern~=0 then
- h=insert_node_before(h,n,newkern(leftkern))
- end
- local rightkern=pn.rightkern
- if rightkern and rightkern~=0 then
- insert_node_after(head,n,newkern(rightkern))
- n=getnext(n)
+ local p=rawget(properties,n)
+ if p then
+ local i=rawget(pn,"replaceinjections")
+ if i then
+ local yoffset=i.yoffset
+ if yoffset and yoffset~=0 then
+ setfield(n,"yoffset",yoffset)
+ end
+ local leftkern=i.leftkern
+ if leftkern and leftkern~=0 then
+ h=insert_node_before(h,n,newkern(leftkern))
+ end
+ local rightkern=i.rightkern
+ if rightkern and rightkern~=0 then
+ insert_node_after(head,n,newkern(rightkern))
+ n=getnext(n)
+ end
end
end
else
@@ -11224,6 +11253,7 @@ local setcursive=injections.setcursive
local setkern=injections.setkern
local setpair=injections.setpair
local resetinjection=injections.reset
+local copyinjection=injections.copy
local setligaindex=injections.setligaindex
local getligaindex=injections.getligaindex
local cursonce=true
@@ -11306,10 +11336,13 @@ local function copy_glyph(g)
if components then
setfield(g,"components",nil)
local n=copy_node(g)
+ copyinjection(n,g)
setfield(g,"components",components)
return n
else
- return copy_node(g)
+ local n=copy_node(g)
+ copyinjection(n,g)
+ return n
end
end
local function markstoligature(kind,lookupname,head,start,stop,char)
@@ -15094,13 +15127,14 @@ function nodes.handlers.nodepass(head)
if basepass and #basefonts>0 then
for i=1,#basefonts do
local range=basefonts[i]
- local start,stop=range[1],range[2]
+ local start=range[1]
+ local stop=range[2]
if stop then
- ligaturing(start,stop)
- kerning(start,stop)
- else
- ligaturing(start)
- kerning(start)
+ start,stop=ligaturing(start,stop)
+ start,stop=kerning(start,stop)
+ elseif start then
+ start=ligaturing(start)
+ start=kerning(start)
end
end
end