diff options
Diffstat (limited to 'otfl-font-tfm.lua')
| -rw-r--r-- | otfl-font-tfm.lua | 180 | 
1 files changed, 8 insertions, 172 deletions
| diff --git a/otfl-font-tfm.lua b/otfl-font-tfm.lua index fd3d8b4..aa87398 100644 --- a/otfl-font-tfm.lua +++ b/otfl-font-tfm.lua @@ -36,6 +36,7 @@ fonts.initializers        = fonts.initializers        or { }  fonts.initializers.common = fonts.initializers.common or { }  local fontdata      = fonts.ids +local disc          = node.id('disc')  local glyph         = node.id('glyph')  local set_attribute = node.set_attribute @@ -49,32 +50,7 @@ tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem fr  tfm.mathactions      = { }  tfm.fontname_mode    = "fullpath" -function tfm.enhance(tfmdata,specification) -    local name, size = specification.name, specification.size -    local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.* -    if filename and encoding and fonts.enc.known[encoding] then -        local data = fonts.enc.load(encoding) -        if data then -            local characters = tfmdata.characters -            tfmdata.encoding = encoding -            local vector = data.vector -            local original = { } -            for k, v in next, characters do -                v.name = vector[k] -                v.index = k -                original[k] = v -            end -            for k,v in next, data.unicodes do -                if k ~= v then -                    if trace_defining then -                        logs.report("define font","mapping %s onto %s",k,v) -                    end -                    characters[k] = original[v] -                end -            end -        end -    end -end +tfm.enhance = tfm.enhance or function() end  function tfm.read_from_tfm(specification)      local fname, tfmdata = specification.filename or "", nil @@ -679,7 +655,8 @@ function fonts.analyzers.aux.setstate(head,font)      local descriptions = tfmdata.descriptions      local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean      while current do -        if current.id == glyph and current.font == font then +        local id = current.id +        if id == glyph and current.font == font then              local d = descriptions[current.char]              if d then                  if d.class == "mark" then @@ -700,6 +677,10 @@ function fonts.analyzers.aux.setstate(head,font)                  end                  first, last, n = nil, nil, 0              end +        elseif id == disc then +            -- always in the middle +            set_attribute(current,state,2) -- midi +            last = current          else -- finish              if first and first == last then                  set_attribute(last,state,4) -- isol @@ -727,151 +708,6 @@ function tfm.replacements(tfm,value)   -- tfm.characters[0x0060] = tfm.characters[0x2018]  end --- auto complete font with missing composed characters - -table.insert(fonts.manipulators,"compose") - -function fonts.initializers.common.compose(tfmdata,value) -    if value then -        fonts.vf.aux.compose_characters(tfmdata) -    end -end - --- tfm features, experimental - -tfm.features         = tfm.features         or { } -tfm.features.list    = tfm.features.list    or { } -tfm.features.default = tfm.features.default or { } - -function tfm.enhance(tfmdata,specification) -    -- we don't really share tfm data because we always reload -    -- but this is more in sycn with afm and such -    local features = (specification.features and specification.features.normal ) or { } -    tfmdata.shared = tfmdata.shared or { } -    tfmdata.shared.features = features -    --  tfmdata.shared.tfmdata = tfmdata -- circular -    tfmdata.filename = specification.name -    if not features.encoding then -        local name, size = specification.name, specification.size -        local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.* -        if filename and encoding and fonts.enc.known[encoding] then -            features.encoding = encoding -        end -    end -    tfm.set_features(tfmdata) -end - -function tfm.set_features(tfmdata) -    -- todo: no local functions -    local shared = tfmdata.shared ---  local tfmdata = shared.tfmdata -    local features = shared.features -    if not table.is_empty(features) then -        local mode = tfmdata.mode or fonts.mode -        local fi = fonts.initializers[mode] -        if fi and fi.tfm then -            local function initialize(list) -- using tex lig and kerning -                if list then -                    for i=1,#list do -                        local f = list[i] -                        local value = features[f] -                        if value and fi.tfm[f] then -- brr -                            if tfm.trace_features then -                                logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown') -                            end -                            fi.tfm[f](tfmdata,value) -                            mode = tfmdata.mode or fonts.mode -                            fi = fonts.initializers[mode] -                        end -                    end -                end -            end -            initialize(fonts.triggers) -            initialize(tfm.features.list) -            initialize(fonts.manipulators) -        end -        local fm = fonts.methods[mode] -        if fm and fm.tfm then -            local function register(list) -- node manipulations -                if list then -                    for i=1,#list do -                        local f = list[i] -                        if features[f] and fm.tfm[f] then -- brr -                            if not shared.processors then -- maybe also predefine -                                shared.processors = { fm.tfm[f] } -                            else -                                shared.processors[#shared.processors+1] = fm.tfm[f] -                            end -                        end -                    end -                end -            end -            register(tfm.features.list) -        end -    end -end - -function tfm.features.register(name,default) -    tfm.features.list[#tfm.features.list+1] = name -    tfm.features.default[name] = default -end - -function tfm.reencode(tfmdata,encoding) -    if encoding and fonts.enc.known[encoding] then -        local data = fonts.enc.load(encoding) -        if data then -            local characters, original, vector = tfmdata.characters, { }, data.vector -            tfmdata.encoding = encoding -- not needed -            for k, v in next, characters do -                v.name, v.index, original[k] = vector[k], k, v -            end -            for k,v in next, data.unicodes do -                if k ~= v then -                    if trace_defining then -                        logs.report("define font","reencoding U+%04X to U+%04X",k,v) -                    end -                    characters[k] = original[v] -                end -            end -        end -    end -end - -tfm.features.register('reencode') - -fonts.initializers.base.tfm.reencode = tfm.reencode -fonts.initializers.node.tfm.reencode = tfm.reencode - -fonts.enc            = fonts.enc            or { } -fonts.enc.remappings = fonts.enc.remappings or { } - -function tfm.remap(tfmdata,remapping) -    local vector = remapping and fonts.enc.remappings[remapping] -    if vector then -        local characters, original = tfmdata.characters, { } -        for k, v in next, characters do -            original[k], characters[k] = v, nil -        end -        for k,v in next, vector do -            if k ~= v then -                if trace_defining then -                    logs.report("define font","remapping U+%04X to U+%04X",k,v) -                end -                local c = original[k] -                characters[v] = c -                c.index = k -            end -        end -        tfmdata.encodingbytes = 2 -        tfmdata.format = 'type1' -    end -end - -tfm.features.register('remap') - -fonts.initializers.base.tfm.remap = tfm.remap -fonts.initializers.node.tfm.remap = tfm.remap -  -- status info  statistics.register("fonts load time", function() | 
