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 /src/fontloader/misc | |
| 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.
Diffstat (limited to 'src/fontloader/misc')
| -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 | 
