From f9e8ebd7846583d696b4e9e7d6454475a38fd767 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 14 Dec 2014 11:00:07 +0100 Subject: [fontloader] sync with Context as of 2014-12-14 --- src/fontloader/misc/fontloader-font-otf.lua | 4 +- src/fontloader/misc/fontloader-fonts-cbk.lua | 53 +++++++++++++++++++----- src/fontloader/misc/fontloader-l-string.lua | 2 +- src/fontloader/misc/fontloader-util-str.lua | 4 +- src/fontloader/runtime/fontloader-fontloader.lua | 51 +++++++++++++++++++---- 5 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/fontloader/misc/fontloader-font-otf.lua b/src/fontloader/misc/fontloader-font-otf.lua index 18b9752..302d8ea 100644 --- a/src/fontloader/misc/fontloader-font-otf.lua +++ b/src/fontloader/misc/fontloader-font-otf.lua @@ -989,8 +989,8 @@ actions["add duplicates"] = function(data,filename,raw) local description = descriptions[unicode] local n = 0 for _, description in next, descriptions do + local kerns = description.kerns if kerns then - local kerns = description.kerns for _, k in next, kerns do local ku = k[unicode] if ku then @@ -1724,6 +1724,8 @@ actions["merge kern classes"] = function(data,filename,raw) local lookup = subtable.lookup or subtable.name if kernclass then -- the next one is quite slow if #kernclass > 0 then + -- it's a table with one entry .. a future luatex can just + -- omit that level kernclass = kernclass[1] lookup = type(kernclass.lookup) == "string" and kernclass.lookup or lookup report_otf("fixing kernclass table of lookup %a",lookup) diff --git a/src/fontloader/misc/fontloader-fonts-cbk.lua b/src/fontloader/misc/fontloader-fonts-cbk.lua index 8632701..965b968 100644 --- a/src/fontloader/misc/fontloader-fonts-cbk.lua +++ b/src/fontloader/misc/fontloader-fonts-cbk.lua @@ -18,21 +18,28 @@ local nodes = nodes local traverse_id = node.traverse_id local glyph_code = nodes.nodecodes.glyph +local disc_code = nodes.nodecodes.disc -- from now on we apply ligaturing and kerning here because it might interfere with complex -- opentype discretionary handling where the base ligature pass expect some weird extra -- pointers (which then confuse the tail slider that has some checking built in) -local ligaturing = node.ligaturing -local kerning = node.kerning +local ligaturing = node.ligaturing +local kerning = node.kerning -function node.ligaturing() texio.write_nl("warning: node.ligaturing is already applied") end -function node.kerning () texio.write_nl("warning: node.kerning is already applied") end +local basepass = true + +function nodes.handlers.setbasepass(v) + basepass = v +end function nodes.handlers.characters(head) local fontdata = fonts.hashes.identifiers if fontdata then - local usedfonts, basefonts, prevfont, basefont = { }, { }, nil, nil + local usedfonts = { } + local basefonts = { } + local prevfont = nil + local basefont = nil for n in traverse_id(glyph_code,head) do local font = n.font if font ~= prevfont then @@ -49,7 +56,7 @@ function nodes.handlers.characters(head) local processors = shared.processes if processors and #processors > 0 then usedfonts[font] = processors - else + elseif basepass then basefont = { n, nil } basefonts[#basefonts+1] = basefont end @@ -58,6 +65,30 @@ function nodes.handlers.characters(head) end end end + for d in traverse_id(disc_code,head) do + local r = d.replace + if r then + for n in traverse_id(glyph_code,r) do + local font = n.font + if font ~= prevfont then + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] -- + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + end + end + end + end + end + end + end + end if next(usedfonts) then for font, processors in next, usedfonts do for i=1,#processors do @@ -65,7 +96,7 @@ function nodes.handlers.characters(head) end end end - if #basefonts > 0 then + if basepass and #basefonts > 0 then for i=1,#basefonts do local range = basefonts[i] local start, stop = range[1], range[2] @@ -85,11 +116,13 @@ function nodes.handlers.characters(head) end function nodes.simple_font_handler(head) --- lang.hyphenate(head) + -- lang.hyphenate(head) head = nodes.handlers.characters(head) nodes.injections.handler(head) + if not basepass then + head = ligaturing(head) + head = kerning(head) + end nodes.handlers.protectglyphs(head) - -- head = node.ligaturing(head) - -- head = node.kerning(head) return head end diff --git a/src/fontloader/misc/fontloader-l-string.lua b/src/fontloader/misc/fontloader-l-string.lua index 3b1a000..70c66f6 100644 --- a/src/fontloader/misc/fontloader-l-string.lua +++ b/src/fontloader/misc/fontloader-l-string.lua @@ -94,7 +94,7 @@ end -- return not find(str,"%S") -- end -local pattern = P(" ")^0 * P(-1) +local pattern = P(" ")^0 * P(-1) -- maybe also newlines -- patterns.onlyspaces = pattern diff --git a/src/fontloader/misc/fontloader-util-str.lua b/src/fontloader/misc/fontloader-util-str.lua index 8529c3a..a040b01 100644 --- a/src/fontloader/misc/fontloader-util-str.lua +++ b/src/fontloader/misc/fontloader-util-str.lua @@ -219,10 +219,12 @@ local striplinepatterns = { ["collapse"] = patterns.collapser, -- how about: stripper fullstripper } +setmetatable(striplinepatterns,{ __index = function(t,k) return p_prune_collapse end }) + strings.striplinepatterns = striplinepatterns function strings.striplines(str,how) - return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str + return str and lpegmatch(striplinepatterns[how],str) or str end -- also see: string.collapsespaces diff --git a/src/fontloader/runtime/fontloader-fontloader.lua b/src/fontloader/runtime/fontloader-fontloader.lua index 0313204..f11a74c 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/03/14 18:26:33 +-- merge date : 12/11/14 12:02:53 do -- begin closure to overcome local limits and interference @@ -2831,9 +2831,10 @@ local striplinepatterns={ ["retain and no empty"]=p_retain_noempty, ["collapse"]=patterns.collapser, } +setmetatable(striplinepatterns,{ __index=function(t,k) return p_prune_collapse end }) strings.striplinepatterns=striplinepatterns function strings.striplines(str,how) - return str and lpegmatch(how and striplinepatterns[how] or p_prune_collapse,str) or str + return str and lpegmatch(striplinepatterns[how],str) or str end strings.striplong=strings.striplines function strings.nice(str) @@ -7830,8 +7831,8 @@ actions["add duplicates"]=function(data,filename,raw) local description=descriptions[unicode] local n=0 for _,description in next,descriptions do + local kerns=description.kerns if kerns then - local kerns=description.kerns for _,k in next,kerns do local ku=k[unicode] if ku then @@ -14560,14 +14561,20 @@ local fonts=fonts local nodes=nodes local traverse_id=node.traverse_id local glyph_code=nodes.nodecodes.glyph +local disc_code=nodes.nodecodes.disc local ligaturing=node.ligaturing local kerning=node.kerning -function node.ligaturing() texio.write_nl("warning: node.ligaturing is already applied") end -function node.kerning () texio.write_nl("warning: node.kerning is already applied") end +local basepass=true +function nodes.handlers.setbasepass(v) + basepass=v +end function nodes.handlers.characters(head) local fontdata=fonts.hashes.identifiers if fontdata then - local usedfonts,basefonts,prevfont,basefont={},{},nil,nil + local usedfonts={} + local basefonts={} + local prevfont=nil + local basefont=nil for n in traverse_id(glyph_code,head) do local font=n.font if font~=prevfont then @@ -14584,7 +14591,7 @@ function nodes.handlers.characters(head) local processors=shared.processes if processors and #processors>0 then usedfonts[font]=processors - else + elseif basepass then basefont={ n,nil } basefonts[#basefonts+1]=basefont end @@ -14593,6 +14600,30 @@ function nodes.handlers.characters(head) end end end + for d in traverse_id(disc_code,head) do + local r=d.replace + if r then + for n in traverse_id(glyph_code,r) do + local font=n.font + if font~=prevfont then + prevfont=font + local used=usedfonts[font] + if not used then + local tfmdata=fontdata[font] + if tfmdata then + local shared=tfmdata.shared + if shared then + local processors=shared.processes + if processors and #processors>0 then + usedfonts[font]=processors + end + end + end + end + end + end + end + end if next(usedfonts) then for font,processors in next,usedfonts do for i=1,#processors do @@ -14600,7 +14631,7 @@ function nodes.handlers.characters(head) end end end - if #basefonts>0 then + if basepass and #basefonts>0 then for i=1,#basefonts do local range=basefonts[i] local start,stop=range[1],range[2] @@ -14621,6 +14652,10 @@ end function nodes.simple_font_handler(head) head=nodes.handlers.characters(head) nodes.injections.handler(head) + if not basepass then + head=ligaturing(head) + head=kerning(head) + end nodes.handlers.protectglyphs(head) return head end -- cgit v1.2.3