diff options
| -rw-r--r-- | src/fontloader/misc/fontloader-font-otf.lua | 4 | ||||
| -rw-r--r-- | src/fontloader/misc/fontloader-fonts-cbk.lua | 53 | ||||
| -rw-r--r-- | src/fontloader/misc/fontloader-l-string.lua | 2 | ||||
| -rw-r--r-- | src/fontloader/misc/fontloader-util-str.lua | 4 | ||||
| -rw-r--r-- | 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 | 
