diff options
Diffstat (limited to 'tex/generic/context/luatex-fonts-merged.lua')
| -rw-r--r-- | tex/generic/context/luatex-fonts-merged.lua | 269 | 
1 files changed, 140 insertions, 129 deletions
| diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index 2f3ad7e85..795ddb515 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@  -- merged file : luatex-fonts-merged.lua  -- parent file : luatex-fonts.lua --- merge date  : 11/03/10 19:42:18 +-- merge date  : 11/12/10 18:22:36  do -- begin closure to overcome local limits and interference @@ -285,11 +285,6 @@ end  patterns.textline = content ---~ local p = lpeg.splitat("->",false)  print(match(p,"oeps->what->more"))  -- oeps what more ---~ local p = lpeg.splitat("->",true)   print(match(p,"oeps->what->more"))  -- oeps what->more ---~ local p = lpeg.splitat("->",false)  print(match(p,"oeps"))              -- oeps ---~ local p = lpeg.splitat("->",true)   print(match(p,"oeps"))              -- oeps -  local splitters_s, splitters_m = { }, { }  local function splitat(separator,single) @@ -311,6 +306,11 @@ end  lpeg.splitat = splitat +--~ local p = splitat("->",false)  print(match(p,"oeps->what->more"))  -- oeps what more +--~ local p = splitat("->",true)   print(match(p,"oeps->what->more"))  -- oeps what->more +--~ local p = splitat("->",false)  print(match(p,"oeps"))              -- oeps +--~ local p = splitat("->",true)   print(match(p,"oeps"))              -- oeps +  local cache = { }  function lpeg.split(separator,str) @@ -2089,6 +2089,13 @@ end  --~     end  --~ end +-- for myself: + +function file.strip(name,dir) +    local b, a = match(name,"^(.-)" .. dir .. "(.*)$") +    return a ~= "" and a or name +end +  end -- closure  do -- begin closure to overcome local limits and interference @@ -2699,10 +2706,6 @@ local new_node    = node.new  local glyph_code = nodecodes.glyph --- fonts - -local fontdata = fonts.ids or { } -  function nodes.simple_font_handler(head)  --  lang.hyphenate(head)      head = nodes.handlers.characters(head) @@ -2718,7 +2721,7 @@ if tex.attribute[0] ~= 0 then      texio.write_nl("log","!")      texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")      texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special") -    texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.") +    texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.")      texio.write_nl("log","!")      tex.attribute[0] = 0 -- else no features @@ -2729,36 +2732,41 @@ nodes.handlers.protectglyphs   = node.protect_glyphs  nodes.handlers.unprotectglyphs = node.unprotect_glyphs  function nodes.handlers.characters(head) -    local usedfonts, done, prevfont = { }, false, nil -    for n in traverse_id(glyph_code,head) 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 -                            done = true +    local fontdata = fonts.identifiers +    if fontdata then +        local usedfonts, done, prevfont = { }, false, nil +        for n in traverse_id(glyph_code,head) 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 +                                done = true +                            end                          end                      end                  end              end          end -    end -    if done then -        for font, processors in next, usedfonts do -            for i=1,#processors do -                local h, d = processors[i](head,font,0) -                head, done = h or head, done or d +        if done then +            for font, processors in next, usedfonts do +                for i=1,#processors do +                    local h, d = processors[i](head,font,0) +                    head, done = h or head, done or d +                end              end          end +        return head, true +    else +        return head, false      end -    return head, true  end  -- helper @@ -2820,7 +2828,7 @@ if not modules then modules = { } end modules ['node-inj'] = {      license   = "see context related readme files"  } --- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini) +-- tricky ... fonts.identifiers is not yet defined .. to be solved (maybe general tex ini)  -- This is very experimental (this will change when we have luatex > .50 and  -- a few pending thingies are available. Also, Idris needs to make a few more @@ -2835,18 +2843,18 @@ local report_injections = logs.new("injections")  local attributes, nodes, node = attributes, nodes, node -fonts     = fonts      or { } -fonts.tfm = fonts.tfm  or { } -fonts.ids = fonts.ids  or { } +fonts                    = fonts or { } +fonts.tfm                = fonts.tfm or { } +fonts.identifiers        = fonts.identifiers or { } -nodes.injections = nodes.injections or { } -local injections = nodes.injections +nodes.injections         = nodes.injections or { } +local injections         = nodes.injections -local fontdata   = fonts.ids -local nodecodes  = nodes.nodecodes -local glyph_code = nodecodes.glyph -local nodepool   = nodes.pool -local newkern    = nodepool.kern +local fontdata           = fonts.identifiers +local nodecodes          = nodes.nodecodes +local glyph_code         = nodecodes.glyph +local nodepool           = nodes.pool +local newkern            = nodepool.kern  local traverse_id        = node.traverse_id  local unset_attribute    = node.unset_attribute @@ -3293,14 +3301,18 @@ fontloader.totable = fontloader.to_table  fonts = fonts or { } --- we will also have des and fam hashes +-- beware, some already defined --- beware, soem alreadyu defined +fonts.identifiers = mark(fonts.identifiers or { }) -- fontdata +-----.characters  = mark(fonts.characters  or { }) -- chardata +-----.csnames     = mark(fonts.csnames     or { }) -- namedata +-----.quads       = mark(fonts.quads       or { }) -- quaddata -fonts.ids = mark(fonts.ids or { })  fonts.identifiers = fonts.ids -- aka fontdata -fonts.chr = mark(fonts.chr or { })  fonts.characters  = fonts.chr -- aka chardata -fonts.qua = mark(fonts.qua or { })  fonts.quads       = fonts.qua -- aka quaddata -fonts.css = mark(fonts.css or { })  fonts.csnames     = fonts.css -- aka namedata +--~ fonts.identifiers[0] = { -- nullfont +--~     characters   = { }, +--~     descriptions = { }, +--~     name         = "nullfont", +--~ }  fonts.tfm = fonts.tfm or { }  fonts.vf  = fonts.vf  or { } @@ -3309,15 +3321,7 @@ fonts.pfb = fonts.pfb or { }  fonts.otf = fonts.otf or { }  fonts.privateoffset = 0xF0000 -- 0x10FFFF -fonts.verbose = false -- more verbose cache tables - -fonts.ids[0] = { -- nullfont -    characters   = { }, -    descriptions = { }, -    name         = "nullfont", -} - -fonts.chr[0] = { } +fonts.verbose       = false   -- more verbose cache tables (will move to context namespace)  fonts.methods = fonts.methods or {      base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, @@ -3426,7 +3430,7 @@ fonts.initializers.common = fonts.initializers.common or { }  local set_attribute = node.set_attribute -local fontdata   = fonts.ids +local fontdata   = fonts.identifiers  local nodecodes  = nodes.nodecodes  local disc_code  = nodecodes.disc @@ -3692,7 +3696,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)      end      -- status      local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized -    local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil) +    local hasmath = (tfmtable.mathparameters ~= nil and next(tfmtable.mathparameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)      local nodemode = tfmtable.mode == "node"      local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude      local hasitalic = tfmtable.has_italic @@ -3718,7 +3722,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)          t.fonts = table.fastcopy(tfmtable.fonts) -- hm  also at the end      end      local tp = t.parameters -    local mp = t.math_parameters +    local mp = t.mathparameters      local tfmp = tfmtable.parameters -- let's check for indexes      --      tp.slant         = (tfmp.slant         or tfmp[1] or 0) @@ -5602,7 +5606,7 @@ fonts.otf            = fonts.otf or { }  local otf            = fonts.otf  local tfm            = fonts.tfm -local fontdata       = fonts.ids +local fontdata       = fonts.identifiers  local chardata       = characters and characters.data -- not used  otf.features         = otf.features         or { } @@ -6952,7 +6956,7 @@ actions["check metadata"] = function(data,filename,raw)      data.map = nil  end -local private_math_parameters = { +local private_mathparameters = {      "FractionDelimiterSize",      "FractionDelimiterDisplayStyleSize",  } @@ -6960,8 +6964,8 @@ local private_math_parameters = {  actions["check math parameters"] = function(data,filename,raw)      local mathdata = data.metadata.math      if mathdata then -        for m=1,#private_math_parameters do -            local pmp = private_math_parameters[m] +        for m=1,#private_mathparameters do +            local pmp = private_mathparameters[m]              if not mathdata[pmp] then                  if trace_loading then                      report_otf("setting math parameter '%s' to 0", pmp) @@ -7174,7 +7178,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th          local unicodes = luatex.unicodes -- names to unicodes          local indices = luatex.indices          local mode = data.mode or "base" -        local characters, parameters, math_parameters, descriptions = { }, { }, { }, { } +        local characters, parameters, mathparameters, descriptions = { }, { }, { }, { }          local designsize = metadata.designsize or metadata.design_size or 100          if designsize == 0 then              designsize = 100 @@ -7189,7 +7193,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th          if metadata.math then              -- parameters              for name, value in next, metadata.math do -                math_parameters[name] = value +                mathparameters[name] = value              end              -- we could use a subset              for u, char in next, characters do @@ -7304,7 +7308,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th          return {              characters         = characters,              parameters         = parameters, -            math_parameters    = math_parameters, +            mathparameters     = mathparameters,              descriptions       = descriptions,              indices            = indices,              unicodes           = unicodes, @@ -7487,7 +7491,7 @@ local report_otf = logs.new("load otf")  local fonts          = fonts  local otf            = fonts.otf -local fontdata       = fonts.ids +local fontdata       = fonts.identifiers  otf.features         = otf.features         or { }  otf.features.default = otf.features.default or { } @@ -8238,7 +8242,7 @@ local markonce = true  local cursonce = true  local kernonce = true -local fontdata = fonts.ids +local fontdata = fonts.identifiers  otf.features.process = { } @@ -10784,7 +10788,7 @@ local has_attribute      = node.has_attribute  local traverse_id        = node.traverse_id  local traverse_node_list = node.traverse -local fontdata           = fonts.ids +local fontdata           = fonts.identifiers  local state              = attributes.private('state')  local categories         = characters and characters.categories or { } -- sorry, only in context @@ -14983,7 +14987,8 @@ if not modules then modules = { } end modules ['font-def'] = {      license   = "see context related readme files"  } -local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower +local concat = table.concat +local format, gmatch, match, find, lower, gsub = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub  local tostring, next = tostring, next  local lpegmatch = lpeg.match @@ -15006,13 +15011,11 @@ default loader that only handles <l n='tfm'/>.</p>  local fonts         = fonts  local tfm           = fonts.tfm  local vf            = fonts.vf -local fontcsnames   = fonts.csnames  fonts.used          = allocate()  tfm.readers         = tfm.readers or { }  tfm.fonts           = allocate() -tfm.internalized    = allocate() -- internal tex numbers  local readers       = tfm.readers  local sequence      = allocate { 'otf', 'ttf', 'afm', 'tfm' } @@ -15102,9 +15105,12 @@ end  definers.getspecification = getspecification -function definers.registersplit(symbol,action) +function definers.registersplit(symbol,action,verbosename)      addspecifier(symbol)      variants[symbol] = action +    if verbosename then +        variants[verbosename] = action +    end  end  function definers.makespecification(specification, lookup, name, sub, method, detail, size) @@ -15315,7 +15321,8 @@ function tfm.read(specification)      if not tfmtable then          local forced = specification.forced or ""          if forced ~= "" then -            tfmtable = readers[lower(forced)](specification) +            local reader = readers[lower(forced)] +            tfmtable = reader and reader(specification)              if not tfmtable then                  report_define("forced type %s of %s not found",forced,specification.name)              end @@ -15368,17 +15375,17 @@ function tfm.readanddefine(name,size) -- no id      local hash = tfm.hashinstance(specification)      local id = definers.registered(hash)      if not id then -        local fontdata = tfm.read(specification) -        if fontdata then -            fontdata.hash = hash -            id = font.define(fontdata) -            definers.register(fontdata,id) -            tfm.cleanuptable(fontdata) +        local tfmdata = tfm.read(specification) +        if tfmdata then +            tfmdata.hash = hash +            id = font.define(tfmdata) +            definers.register(tfmdata,id) +            tfm.cleanuptable(tfmdata)          else              id = 0  -- signal          end      end -    return fonts.ids[id], id +    return fonts.identifiers[id], id  end  --[[ldx-- @@ -15466,6 +15473,16 @@ function readers.afm(specification,method)      return tfmtable  end +function readers.pfb(specification,method) -- only called when forced +    local original = specification.specification +    if trace_loading then +        report_afm("using afm reader for '%s'",original) +    end +    specification.specification = gsub(original,"%.pfb",".afm") +    specification.forced = "afm" +    return readers.afm(specification,method) +end +  -- maybe some day a set of names  local function check_otf(forced,specification,suffix,what) @@ -15545,31 +15562,29 @@ not gain much. By the way, passing id's back to in the callback was  introduced later in the development.</p>  --ldx]]-- -local lastdefined = nil -- we don't want this one to end up in s-tra-02 +local lastdefined  = nil -- we don't want this one to end up in s-tra-02 +local internalized = { }  function definers.current() -- or maybe current      return lastdefined  end -function definers.register(fontdata,id) -    if fontdata and id then -        local hash = fontdata.hash -        if not tfm.internalized[hash] then +function definers.register(tfmdata,id) -- will be overloaded +    if tfmdata and id then +        local hash = tfmdata.hash +        if not internalized[hash] then              if trace_defining then -                report_define("loading at 2 id %s, hash: %s",id or "?",hash or "?") +                report_define("registering font, id: %s, hash: %s",id or "?",hash or "?")              end -            fonts.identifiers[id] = fontdata -            fonts.characters [id] = fontdata.characters -            fonts.quads      [id] = fontdata.parameters and fontdata.parameters.quad -            -- todo: extra functions, e.g. setdigitwidth etc in list -            tfm.internalized[hash] = id +            fonts.identifiers[id] = tfmdata +            internalized[hash] = id          end      end  end -function definers.registered(hash) -    local id = tfm.internalized[hash] -    return id, id and fonts.ids[id] +function definers.registered(hash) -- will be overloaded +    local id = internalized[hash] +    return id, id and fonts.identifiers[id]  end  local cache_them = false @@ -15602,49 +15617,45 @@ function definers.read(specification,size,id) -- id can be optional, name can al      specification = definers.resolve(specification)      local hash = tfm.hashinstance(specification)      if cache_them then -        local fontdata = containers.read(fonts.cache,hash) -- for tracing purposes +        local tfmdata = containers.read(fonts.cache,hash) -- for tracing purposes      end -    local fontdata = definers.registered(hash) -- id -    if not fontdata then +    local tfmdata = definers.registered(hash) -- id +    if not tfmdata then          if specification.features.vtf and specification.features.vtf.preset then -            fontdata = tfm.make(specification) +            tfmdata = tfm.make(specification)          else -            fontdata = tfm.read(specification) -            if fontdata then -                tfm.checkvirtualid(fontdata) +            tfmdata = tfm.read(specification) +            if tfmdata then +                tfm.checkvirtualid(tfmdata)              end          end          if cache_them then -            fontdata = containers.write(fonts.cache,hash,fontdata) -- for tracing purposes +            tfmdata = containers.write(fonts.cache,hash,tfmdata) -- for tracing purposes          end -        if fontdata then -            fontdata.hash = hash -            fontdata.cache = "no" +        if tfmdata then +            tfmdata.hash = hash +            tfmdata.cache = "no"              if id then -                definers.register(fontdata,id) +                definers.register(tfmdata,id)              end          end      end -    lastdefined = fontdata or id -- todo ! ! ! ! ! -    if not fontdata then -- or id? +    lastdefined = tfmdata or id -- todo ! ! ! ! ! +    if not tfmdata then -- or id?          report_define( "unknown font %s, loading aborted",specification.name) -    elseif trace_defining and type(fontdata) == "table" then +    elseif trace_defining and type(tfmdata) == "table" then          report_define("using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s", -            fontdata.type          or "unknown", -            id                     or "?", -            fontdata.name          or "?", -            fontdata.size          or "default", -            fontdata.encodingbytes or "?", -            fontdata.encodingname  or "unicode", -            fontdata.fullname      or "?", -            file.basename(fontdata.filename or "?")) -    end -    local cs = specification.cs -    if cs then -        fontcsnames[cs] = fontdata -- new (beware: locals can be forgotten) +            tfmdata.type          or "unknown", +            id                    or "?", +            tfmdata.name          or "?", +            tfmdata.size          or "default", +            tfmdata.encodingbytes or "?", +            tfmdata.encodingname  or "unicode", +            tfmdata.fullname      or "?", +            file.basename(tfmdata.filename or "?"))      end      statistics.stoptiming(fonts) -    return fontdata +    return tfmdata  end  function vf.find(name) @@ -15675,7 +15686,7 @@ end  --ldx]]--  callbacks.register('define_font' , definers.read, "definition of fonts (tfmtable preparation)") -callbacks.register('find_vf_file', vf.find    , "locating virtual fonts, insofar needed") -- not that relevant any more +callbacks.register('find_vf_file', vf.find,       "locating virtual fonts, insofar needed") -- not that relevant any more  end -- closure @@ -15780,7 +15791,7 @@ local function colonized(specification) -- xetex mode      return specification  end -definers.registersplit(":",colonized) +definers.registersplit(":",colonized,"cryptic")  end -- closure @@ -16063,7 +16074,7 @@ end  -- bonus  function fonts.otf.nametoslot(name) -    local tfmdata = fonts.ids[font.current()] +    local tfmdata = fonts.identifiers[font.current()]      if tfmdata and tfmdata.shared then          local otfdata = tfmdata.shared.otfdata          local unicode = otfdata.luatex.unicodes[name] | 
