summaryrefslogtreecommitdiff
path: root/src/fontloader/misc
diff options
context:
space:
mode:
authorPhilipp Gesang <phg@phi-gamma.net>2016-01-22 00:42:10 +0100
committerPhilipp Gesang <phg@phi-gamma.net>2016-01-22 00:42:16 +0100
commita65f049165c52ff75de5498983a1d713c773471c (patch)
tree411dc52b33113ed5069fd873e1702c2770beec37 /src/fontloader/misc
parent95c68d691764fd1458e68456f8cc035f6164d041 (diff)
downloadluaotfload-a65f049165c52ff75de5498983a1d713c773471c.tar.gz
[fontloader] revert features handler temporarily
Address issue #318 This reverts the changes made to font-otn.lua with commit adc43c3c24.. Certain features related to directionality are not handled correctly with the most recent fontloader. As a temporary measure, revert the handling code in font-otn.lua and restore the values it references. While this appears to suppress the issue, we’ll switch back to the upstream code once we have an actual solution.
Diffstat (limited to 'src/fontloader/misc')
-rw-r--r--src/fontloader/misc/fontloader-basics-nod.lua9
-rw-r--r--src/fontloader/misc/fontloader-font-otn.lua67
2 files changed, 68 insertions, 8 deletions
diff --git a/src/fontloader/misc/fontloader-basics-nod.lua b/src/fontloader/misc/fontloader-basics-nod.lua
index 78f1b17..95a1744 100644
--- a/src/fontloader/misc/fontloader-basics-nod.lua
+++ b/src/fontloader/misc/fontloader-basics-nod.lua
@@ -51,15 +51,11 @@ nodes = { }
nodes.pool = { }
nodes.handlers = { }
-local nodecodes = { }
+local nodecodes = { } for k,v in next, node.types () do nodecodes[string.gsub(v,"_","")] = k end
+local whatcodes = { } for k,v in next, node.whatsits() do whatcodes[string.gsub(v,"_","")] = k end
local glyphcodes = node.subtypes("glyph")
local disccodes = node.subtypes("disc")
-for k, v in next, node.types() do
- v = string.gsub(v,"_","")
- nodecodes[k] = v
- nodecodes[v] = k
-end
for i=0,#glyphcodes do
glyphcodes[glyphcodes[i]] = i
end
@@ -67,6 +63,7 @@ for i=0,#disccodes do
disccodes[disccodes[i]] = i
end
+nodes.whatcodes = whatcodes
nodes.nodecodes = nodecodes
nodes.glyphcodes = glyphcodes
nodes.disccodes = disccodes
diff --git a/src/fontloader/misc/fontloader-font-otn.lua b/src/fontloader/misc/fontloader-font-otn.lua
index b6f30c3..081630a 100644
--- a/src/fontloader/misc/fontloader-font-otn.lua
+++ b/src/fontloader/misc/fontloader-font-otn.lua
@@ -246,6 +246,7 @@ local zwj = 0x200D
local wildcard = "*"
local default = "dflt"
+local whatcodes = nodes.whatcodes
local nodecodes = nodes.nodecodes
local glyphcodes = nodes.glyphcodes
local disccodes = nodes.disccodes
@@ -253,9 +254,10 @@ local disccodes = nodes.disccodes
local glyph_code = nodecodes.glyph
local glue_code = nodecodes.glue
local disc_code = nodecodes.disc
+local whatsit_code = nodecodes.whatsit
local math_code = nodecodes.math
-local dir_code = nodecodes.dir
-local localpar_code = nodecodes.localpar
+local dir_code = nodecodes.dir or whatcodes.dir
+local localpar_code = nodecodes.localpar or whatcodes.localpar
local discretionary_code = disccodes.discretionary
local ligature_code = glyphcodes.ligature
@@ -3358,6 +3360,37 @@ local function featuresprocessor(head,font,attr)
comprun(start,c_run)
start = getnext(start)
end
+ elseif id == whatsit_code then
+ local subtype = getsubtype(start)
+ if subtype == dir_code then
+ local dir = getfield(start,"dir")
+ if dir == "+TLT" then
+ topstack = topstack + 1
+ dirstack[topstack] = dir
+ rlmode = 1
+ elseif dir == "+TRT" then
+ topstack = topstack + 1
+ dirstack[topstack] = dir
+ rlmode = -1
+ elseif dir == "-TLT" or dir == "-TRT" then
+ topstack = topstack - 1
+ rlmode = dirstack[topstack] == "+TRT" and -1 or 1
+ else
+ rlmode = rlparmode
+ end
+ elseif subtype == localpar_code then
+ local dir = getfield(start,"dir")
+ if dir == "TRT" then
+ rlparmode = -1
+ elseif dir == "TLT" then
+ rlparmode = 1
+ else
+ rlparmode = 0
+ end
+ -- one might wonder if the par dir should be looked at, so we might as well drop the n
+ rlmode = rlparmode
+ end
+ start = getnext(start)
elseif id == math_code then
start = getnext(end_of_math(start))
elseif id == dir_code then
@@ -3628,6 +3661,36 @@ local function featuresprocessor(head,font,attr)
comprun(start,c_run)
start = getnext(start)
end
+ elseif id == whatsit_code then
+ local subtype = getsubtype(start)
+ if subtype == dir_code then
+ local dir = getfield(start,"dir")
+ if dir == "+TLT" then
+ topstack = topstack + 1
+ dirstack[topstack] = dir
+ rlmode = 1
+ elseif dir == "+TRT" then
+ topstack = topstack + 1
+ dirstack[topstack] = dir
+ rlmode = -1
+ elseif dir == "-TLT" or dir == "-TRT" then
+ topstack = topstack - 1
+ rlmode = dirstack[topstack] == "+TRT" and -1 or 1
+ else
+ rlmode = rlparmode
+ end
+ elseif subtype == localpar_code then
+ local dir = getfield(start,"dir")
+ if dir == "TRT" then
+ rlparmode = -1
+ elseif dir == "TLT" then
+ rlparmode = 1
+ else
+ rlparmode = 0
+ end
+ rlmode = rlparmode
+ end
+ start = getnext(start)
elseif id == math_code then
start = getnext(end_of_math(start))
elseif id == dir_code then