summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-08-14 20:52:07 +0000
committerKarl Berry <karl@freefriends.org>2019-08-14 20:52:07 +0000
commitbce9fed0de3adbb0f82fc4ac9171b618921fb14d (patch)
tree4a9dc14d7556dba48b12bf5c8b626aa4ebbc9157 /Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
parentcb9ce80d54602fd1ef6f8703980bc158a947fd8d (diff)
luaotfload (14aug19)
git-svn-id: svn://tug.org/texlive/trunk@51880 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua141
1 files changed, 98 insertions, 43 deletions
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
index 6bd9bbd5930..3120f45135b 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/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 : 07/04/19 12:29:22
+-- merge date : 08/11/19 20:03:46
do -- begin closure to overcome local limits and interference
@@ -121,6 +121,9 @@ elseif not ffi.number then
end
if LUAVERSION>5.3 then
end
+if status and os.setenv then
+ os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
+end
end -- closure
@@ -1988,7 +1991,7 @@ end
local function sequenced(t,sep,simple)
if not t then
return ""
- elseif type(t)=="string" then
+ elseif type(t)~="table" then
return t
end
local n=#t
@@ -2027,7 +2030,11 @@ local function sequenced(t,sep,simple)
end
end
end
- return concat(s,sep or " | ")
+ if sep==true then
+ return "{ "..concat(s,", ").." }"
+ else
+ return concat(s,sep or " | ")
+ end
end
table.sequenced=sequenced
function table.print(t,...)
@@ -3392,6 +3399,13 @@ local template=[[
%s
return function(%s) return %s end
]]
+local pattern=Cs(Cc('"')*(
+ (1-S('"\\\n\r'))^1+P('"')/'\\"'+P('\\')/'\\\\'+P('\n')/'\\n'+P('\r')/'\\r'
+)^0*Cc('"'))
+patterns.escapedquotes=pattern
+function string.escapedquotes(s)
+ return lpegmatch(pattern,s)
+end
local preamble=""
local environment={
global=global or _G,
@@ -3418,6 +3432,7 @@ local environment={
formattedfloat=number.formattedfloat,
stripzero=patterns.stripzero,
stripzeros=patterns.stripzeros,
+ escapedquotes=string.escapedquotes,
FORMAT=string.f9,
}
local arguments={ "a1" }
@@ -3475,7 +3490,7 @@ local format_q=function()
end
local format_Q=function()
n=n+1
- return format("format('%%q',tostring(a%s))",n)
+ return format("escapedquotes(tostring(a%s))",n)
end
local format_i=function(f)
n=n+1
@@ -9437,13 +9452,13 @@ function constructors.finalize(tfmdata)
parameters.width=0
end
if not parameters.slantfactor then
- parameters.slantfactor=tfmdata.slant or 0
+ parameters.slantfactor=(tfmdata.slant or 0)/1000
end
if not parameters.extendfactor then
- parameters.extendfactor=tfmdata.extend or 0
+ parameters.extendfactor=(tfmdata.extend or 1000)/1000
end
if not parameters.squeezefactor then
- parameters.squeezefactor=tfmdata.squeeze or 0
+ parameters.squeezefactor=(tfmdata.squeeze or 1000)/1000
end
local designsize=parameters.designsize
if designsize then
@@ -10830,8 +10845,9 @@ local sortedhash=table.sortedhash
local stripstring=string.nospaces
local utf16_to_utf8_be=utf.utf16_to_utf8_be
local report=logs.reporter("otf reader")
-local trace_cmap=false
-local trace_cmap_detail=false
+local report_cmap=logs.reporter("otf reader","cmap")
+local trace_cmap=false trackers.register("otf.cmap",function(v) trace_cmap=v end)
+local trace_cmap_details=false trackers.register("otf.cmap.details",function(v) trace_cmap_details=v end)
fonts=fonts or {}
local handlers=fonts.handlers or {}
fonts.handlers=handlers
@@ -11493,15 +11509,18 @@ readers.vmtx=function(f,fontdata,specification)
local glyphs=fontdata.glyphs
local nofglyphs=fontdata.nofglyphs
local vheight=0
- local vdefault=verticalheader.ascender+verticalheader.descender
+ local vdefault=verticalheader.ascender-verticalheader.descender
local topsidebearing=0
for i=0,nofmetrics-1 do
local glyph=glyphs[i]
- vheight=readshort(f)
+ vheight=readushort(f)
topsidebearing=readshort(f)
if vheight~=0 and vheight~=vdefault then
glyph.vheight=vheight
end
+ if topsidebearing~=0 then
+ glyph.tsb=topsidebearing
+ end
end
for i=nofmetrics,nofglyphs-1 do
local glyph=glyphs[i]
@@ -11579,11 +11598,14 @@ local sequence={
{ 3,1,4 },
{ 3,10,12 },
{ 0,3,4 },
+ { 0,3,12 },
{ 0,1,4 },
+ { 0,1,12 },
{ 0,0,6 },
{ 3,0,6 },
+ { 3,0,4 },
{ 0,5,14 },
-{ 0,4,12 },
+ { 0,4,12 },
{ 3,10,13 },
}
local supported={}
@@ -11628,7 +11650,7 @@ formatreaders[4]=function(f,fontdata,offset)
elseif startchar==0xFFFF and offset==0 then
elseif offset==0xFFFF then
elseif offset==0 then
- if trace_cmap_detail then
+ if trace_cmap_details then
report("format 4.%i segment %2i from %C upto %C at index %H",1,segment,startchar,endchar,(startchar+delta)%65536)
end
for unicode=startchar,endchar do
@@ -11660,8 +11682,8 @@ formatreaders[4]=function(f,fontdata,offset)
end
else
local shift=(segment-nofsegments+offset/2)-startchar
- if trace_cmap_detail then
- report("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar+delta)%65536)
+ if trace_cmap_details then
+ report_cmap("format 4.%i segment %2i from %C upto %C at index %H",0,segment,startchar,endchar,(startchar+delta)%65536)
end
for unicode=startchar,endchar do
local slot=shift+unicode
@@ -11708,8 +11730,8 @@ formatreaders[6]=function(f,fontdata,offset)
local count=readushort(f)
local stop=start+count-1
local nofdone=0
- if trace_cmap_detail then
- report("format 6 from %C to %C",2,start,stop)
+ if trace_cmap_details then
+ report_cmap("format 6 from %C to %C",2,start,stop)
end
for unicode=start,stop do
local index=readushort(f)
@@ -11741,8 +11763,8 @@ formatreaders[12]=function(f,fontdata,offset)
local first=readulong(f)
local last=readulong(f)
local index=readulong(f)
- if trace_cmap_detail then
- report("format 12 from %C to %C starts at index %i",first,last,index)
+ if trace_cmap_details then
+ report_cmap("format 12 from %C to %C starts at index %i",first,last,index)
end
for unicode=first,last do
local glyph=glyphs[index]
@@ -11780,8 +11802,8 @@ formatreaders[13]=function(f,fontdata,offset)
local last=readulong(f)
local index=readulong(f)
if first<privateoffset then
- if trace_cmap_detail then
- report("format 13 from %C to %C get index %i",first,last,index)
+ if trace_cmap_details then
+ report_cmap("format 13 from %C to %C get index %i",first,last,index)
end
local glyph=glyphs[index]
local unicode=glyph.unicode
@@ -11851,27 +11873,46 @@ formatreaders[14]=function(f,fontdata,offset)
end
end
local function checkcmap(f,fontdata,records,platform,encoding,format)
- local data=records[platform]
- if not data then
+ local pdata=records[platform]
+ if not pdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no platform",platform,encoding,format)
+ end
return 0
end
- data=data[encoding]
- if not data then
+ local edata=pdata[encoding]
+ if not edata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no encoding",platform,encoding,format)
+ end
return 0
end
- data=data[format]
- if not data then
+ local fdata=edata[format]
+ if not fdata then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","no format",platform,encoding,format)
+ end
+ return 0
+ elseif type(fdata)~="number" then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","already done",platform,encoding,format)
+ end
return 0
end
+ edata[format]=true
local reader=formatreaders[format]
if not reader then
+ if trace_cmap_details then
+ report_cmap("skipped, %s, p=%i e=%i f=%i","unsupported format",platform,encoding,format)
+ end
return 0
end
- local p=platforms[platform]
- local e=encodings[p]
- local n=reader(f,fontdata,data) or 0
- if trace_cmap then
- report("cmap checked: platform %i (%s), encoding %i (%s), format %i, new unicodes %i",platform,p,encoding,e and e[encoding] or "?",format,n)
+ local n=reader(f,fontdata,fdata) or 0
+ if trace_cmap_details or trace_cmap then
+ local p=platforms[platform]
+ local e=encodings[p]
+ report_cmap("checked, platform %i (%s), encoding %i (%s), format %i, new unicodes %i",
+ platform,p,encoding,e and e[encoding] or "?",format,n)
end
return n
end
@@ -12066,6 +12107,7 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst
local postscript=fontdata.postscript or {}
local fontheader=fontdata.fontheader or {}
local cffinfo=fontdata.cffinfo or {}
+ local verticalheader=fontdata.verticalheader or {}
local filename=fontdata.filename
local weight=getname(fontdata,"weight") or (cffinfo and cffinfo.weight) or (metrics and metrics.weight)
local width=getname(fontdata,"width") or (cffinfo and cffinfo.width ) or (metrics and metrics.width )
@@ -12131,6 +12173,7 @@ local function getinfo(maindata,sub,platformnames,rawfamilynames,metricstoo,inst
platformnames=platformnames or nil,
instancenames=instancenames or nil,
tableoffsets=fontdata.tableoffsets,
+ defaultvheight=(verticalheader.ascender or 0)-(verticalheader.descender or 0)
}
if metricstoo then
local keys={
@@ -15239,7 +15282,7 @@ do
local function call(scope,list,bias)
depth=depth+1
if top==0 then
- showstate(formatters["unknown %s call"](scope))
+ showstate(formatters["unknown %s call %s"](scope,"?"))
top=0
else
local index=stack[top]+bias
@@ -15251,7 +15294,7 @@ do
if tab then
process(tab)
else
- showstate(formatters["unknown %s call %i"](scope,index))
+ showstate(formatters["unknown %s call %s"](scope,index))
top=0
end
end
@@ -15321,7 +15364,7 @@ do
i=i+1
local t=tab[i]
if justpass then
- if t>=34 or t<=37 then
+ if t>=34 and t<=37 then
for i=1,top do
r=r+1;result[r]=encode[stack[i]]
end
@@ -15423,12 +15466,16 @@ end
end
end
end
- local function setbias(globals,locals)
+ local function setbias(globals,locals,nobias)
+ if nobias then
+ return 0,0
+ else
local g=#globals
local l=#locals
return
((g<1240 and 107) or (g<33900 and 1131) or 32768)+1,
((l<1240 and 107) or (l<33900 and 1131) or 32768)+1
+ end
end
local function processshape(tab,index)
if not tab then
@@ -15538,7 +15585,7 @@ end
end
return privatedata.nominalwidthx or 0,privatedata.defaultwidthx or 0
end
- parsecharstrings=function(fontdata,data,glphs,doshapes,tversion,streams)
+ parsecharstrings=function(fontdata,data,glphs,doshapes,tversion,streams,nobias)
local dictionary=data.dictionaries[1]
local charstrings=dictionary.charstrings
keepcurve=doshapes
@@ -15549,7 +15596,7 @@ end
charset=dictionary.charset
vsindex=dictionary.vsindex or 0
glyphs=glphs or {}
- globalbias,localbias=setbias(globals,locals)
+ globalbias,localbias=setbias(globals,locals,nobias)
nominalwidth,defaultwidth=setwidths(dictionary.private)
if charstrings then
startparsing(fontdata,data,streams)
@@ -15571,8 +15618,8 @@ end
charset=false
vsindex=dictionary.vsindex or 0
glyphs=glphs or {}
- justpass=streams==true
- globalbias,localbias=setbias(globals,locals)
+ justpass=streams==true
+ globalbias,localbias=setbias(globals,locals,nobias)
nominalwidth,defaultwidth=setwidths(dictionary.private)
processshape(tab,index-1)
end
@@ -16543,7 +16590,14 @@ local function repackpoints(glyphs,shapes)
currentx=px
currenty=py
if lastflag==fl then
- nofflags=nofflags+1
+ if nofflags==255 then
+ lastflag=lastflag+0x08
+ r=r+1 result[r]=char(lastflag,nofflags-1)
+ nofflags=1
+ lastflag=fl
+ else
+ nofflags=nofflags+1
+ end
else
if nofflags==1 then
r=r+1 result[r]=chars[lastflag]
@@ -22995,7 +23049,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.108
+otf.version=3.109
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
@@ -23357,6 +23411,7 @@ local function copytotfm(data,cache_id)
parameters.ascender=abs(metadata.ascender or 0)
parameters.descender=abs(metadata.descender or 0)
parameters.units=units
+ parameters.vheight=metadata.defaultvheight
properties.space=spacer
properties.encodingbytes=2
properties.format=data.format or formats.otf
@@ -33372,7 +33427,7 @@ do
}
},
}
- fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams)
+ fonts.handlers.otf.readers.parsecharstrings(false,data,glyphs,true,"cff",streams,true)
else
lpegmatch(p_filternames,binary,1,filename)
end