diff options
author | Philipp Gesang <phg@phi-gamma.net> | 2016-01-22 00:42:10 +0100 |
---|---|---|
committer | Philipp Gesang <phg@phi-gamma.net> | 2016-01-22 00:42:16 +0100 |
commit | a65f049165c52ff75de5498983a1d713c773471c (patch) | |
tree | 411dc52b33113ed5069fd873e1702c2770beec37 | |
parent | 95c68d691764fd1458e68456f8cc035f6164d041 (diff) | |
download | luaotfload-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.
-rw-r--r-- | src/fontloader/misc/fontloader-basics-nod.lua | 9 | ||||
-rw-r--r-- | src/fontloader/misc/fontloader-font-otn.lua | 67 |
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 |