summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fontloader/misc/fontloader-font-otf.lua4
-rw-r--r--src/fontloader/misc/fontloader-fonts-cbk.lua53
-rw-r--r--src/fontloader/misc/fontloader-l-string.lua2
-rw-r--r--src/fontloader/misc/fontloader-util-str.lua4
-rw-r--r--src/fontloader/runtime/fontloader-fontloader.lua51
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