From 57c3891a6b93b57f91ea77c9bbecffacbcc0da28 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Sun, 7 May 2017 01:01:21 +0200 Subject: 2017-05-06 23:13:00 --- tex/generic/context/luatex/luatex-fonts-merged.lua | 146 +++++++++++++-------- 1 file changed, 92 insertions(+), 54 deletions(-) (limited to 'tex/generic') diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index cb95e9a87..a31f35866 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.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 : 04/27/17 01:00:26 +-- merge date : 05/06/17 23:06:49 do -- begin closure to overcome local limits and interference @@ -9509,7 +9509,7 @@ local function readtable(tag,f,fontdata,specification,...) reader(f,fontdata,specification,...) end end -local variablefonts_supported=context and true or false +local variablefonts_supported=(context and true) or (logs and logs.application and true) or false local function readdata(f,offset,specification) local fontdata=loadtables(f,specification,offset) if specification.glyphs then @@ -9560,6 +9560,8 @@ local function readdata(f,offset,specification) else report("user instance: %s, bad factors",instance) end + else + report("unknown instance") end end end @@ -12181,7 +12183,7 @@ local function repackpoints(glyphs,shapes) if false then else local contours=shape.contours - local nofcontours=#contours + local nofcontours=contours and #contours or 0 local boundingbox=glyph.boundingbox or noboundingbox r=r+1 result[r]=toshort(nofcontours) r=r+1 result[r]=toshort(boundingbox[1]) @@ -12313,7 +12315,7 @@ local function readglyph(f,nofcontours) else x=x+readshort(f) end - points[i]={ x,y,bittest(flag,0x01) } + points[i]={ x,0,bittest(flag,0x01) } end local y=0 for i=1,nofpoints do @@ -12521,7 +12523,7 @@ local function readpoints(f) end local points={} local p=0 - local n=1 + local n=1 while p0 do local control=readbyte(f) +if not control then + break +end local allzero=bittest(control,0x80) - local runreader=bittest(control,0x40) and readshort or readinteger local runlength=band(control,0x3F)+1 if allzero then - z=runlength + z=z+runlength else - if z then + local runreader=bittest(control,0x40) and readshort or readinteger + if z>0 then for i=1,z do p=p+1 deltas[p]=0 end - z=false + z=0 end for i=1,runlength do p=p+1 @@ -12567,6 +12571,36 @@ local function readdeltas(f,nofpoints) else end end +local function readdeltas(f,nofpoints) + local deltas={} + local p=0 + while nofpoints>0 do + local control=readbyte(f) + if control then + local allzero=bittest(control,0x80) + local runlength=band(control,0x3F)+1 + if allzero then + for i=1,runlength do + p=p+1 + deltas[p]=0 + end + else + local runreader=bittest(control,0x40) and readshort or readinteger + for i=1,runlength do + p=p+1 + deltas[p]=runreader(f) + end + end + nofpoints=nofpoints-runlength + else + break + end + end + if p>0 then + return deltas + else + end +end function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local instance=specification.instance if not instance then @@ -12581,7 +12615,7 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local version=readulong(f) local nofaxis=readushort(f) local noftuples=readushort(f) - local tupleoffset=readulong(f) + local tupleoffset=tableoffset+readulong(f) local nofglyphs=readushort(f) local flags=readushort(f) local dataoffset=tableoffset+readulong(f) @@ -12597,54 +12631,52 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) data[i]=2*readushort(f) end end - setposition(f,tableoffset+tupleoffset) - for i=1,noftuples do - tuples[i]=readtuplerecord(f,nofaxis) + if noftuples>0 then + setposition(f,tupleoffset) + for i=1,noftuples do + tuples[i]=readtuplerecord(f,nofaxis) + end end local lastoffset=false for i=1,nofglyphs do - local shape=shapedata[i-1] - if shape then - local startoffset=dataoffset+data[i] - if startoffset==lastoffset then + local startoffset=dataoffset+data[i] + if startoffset==lastoffset then + else + local shape=shapedata[i-1] + if not shape then else lastoffset=startoffset setposition(f,startoffset) local flags=readushort(f) local count=band(flags,0x0FFF) - local points=bittest(flags,0x8000) local offset=startoffset+readushort(f) local deltas={} - local nofpoints=0 - local allpoints=(shape.nofpoints or 0)+1 - if points then + local allpoints=(shape.nofpoints or 0) + local shared=false + local nofshared=0 + if bittest(flags,0x8000) then local current=getposition(f) setposition(f,offset) - points,nofpoints=readpoints(f) + shared,nofshared=readpoints(f) offset=getposition(f) setposition(f,current) - else - points,nofpoints=nil,0 end - for i=1,count do - local currentstart=getposition(f) + for j=1,count do local size=readushort(f) local flags=readushort(f) local index=band(flags,0x0FFF) local haspeak=bittest(flags,0x8000) local intermediate=bittest(flags,0x4000) - local private=bittest(flags,0x1000) + local private=bittest(flags,0x2000) local peak=nil local start=nil local stop=nil local xvalues=nil local yvalues=nil - local points=points - local nofpoints=nofpoints - local advance=4 - if peak then + local points=shared + local nofpoints=nofshared + if haspeak then peak=readtuplerecord(f,nofaxis) - advance=advance+2*nofaxis else if index+1>#tuples then print("error, bad index",index) @@ -12654,21 +12686,22 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) if intermediate then start=readtuplerecord(f,nofaxis) stop=readtuplerecord(f,nofaxis) - advance=advance+4*nofaxis end if size>0 then + local current=getposition(f) setposition(f,offset) if private then points,nofpoints=readpoints(f) - elseif nofpoints==0 then - nofpoints=allpoints + end + if nofpoints==0 then + nofpoints=allpoints+4 end if nofpoints>0 then xvalues=readdeltas(f,nofpoints) yvalues=readdeltas(f,nofpoints) end - offset=getposition(f) - setposition(f,currentstart+advance) + offset=offset+size + setposition(f,current) end if not xvalues and not yvalues then points=nil @@ -12676,9 +12709,9 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) local s=1 for i=1,nofaxis do local f=factors[i] - local start=start and start[i] or 0 local peak=peak and peak [i] or 0 - local stop=stop and stop [i] or 0 + local start=start and start[i] or (peak<0 and peak or 0) + local stop=stop and stop [i] or (peak>0 and peak or 0) if start>peak or peak>stop then elseif start<0 and stop>0 and peak~=0 then elseif peak==0 then @@ -25960,6 +25993,7 @@ if not modules then modules={} end modules ['font-ocl']={ local tostring,next,format=tostring,next,string.format local round,max=math.round,math.round local sortedkeys,sortedhash=table.sortedkeys,table.sortedhash +local setmetatableindex=table.setmetatableindex local formatters=string.formatters local tounicode=fonts.mappings.tounicode local otf=fonts.handlers.otf @@ -25984,7 +26018,7 @@ else end end local sharedpalettes={} -local hash=table.setmetatableindex(function(t,k) +local hash=setmetatableindex(function(t,k) local v={ "special",k } t[k]=v return v @@ -26051,7 +26085,7 @@ local function initializecolr(tfmdata,kind,value) if palettes then local converted=resources.converted if not converted then - converted=table.setmetatableindex(convert) + converted=setmetatableindex(convert) resources.converted=converted end local colorvalues=sharedpalettes[value] or converted[palettes[tonumber(value) or 1] or palettes[1]] or {} @@ -26066,30 +26100,37 @@ local function initializecolr(tfmdata,kind,value) tfmdata.fonts={ { id=0 } } - local widths=table.setmetatableindex(function(t,k) + local widths=setmetatableindex(function(t,k) local v={ "right",-k } t[k]=v return v end) local getactualtext=otf.getactualtext local default=colorvalues[#colorvalues] - local endactual=nil + local b,e=getactualtext(tounicode(0xFFFD)) local start={ "special","pdf:page:q" } local stop={ "special","pdf:raw:Q" } + local actualb={ "special","pdf:page:"..b } + local actuale={ "special","pdf:page:"..e } + local cache=setmetatableindex(function(t,k) + local v={ "char",k } + t[k]=v + return v + end) for unicode,character in next,characters do local description=descriptions[unicode] if description then local colorlist=description.colors if colorlist then - local b,e=getactualtext(tounicode(characters[unicode].unicode or 0xFFFD)) + local u=description.unicode or characters[unicode].unicode local w=character.width or 0 local s=#colorlist - local goback=w~=0 and widths[w] or nil + local goback=w~=0 and widths[w] or nil local t={ start, - { "special","pdf:raw:"..b } + not u and actualb or { "special","pdf:raw:"..getactualtext(tounicode(u)) } } - local n=#t + local n=2 local l=nil for i=1,s do local entry=colorlist[i] @@ -26098,15 +26139,12 @@ local function initializecolr(tfmdata,kind,value) n=n+1 t[n]=v l=v end - n=n+1 t[n]={ "char",entry.slot } + n=n+1 t[n]=cache[entry.slot] if s>1 and i