diff options
Diffstat (limited to 'otfl-font-dum.lua')
| -rw-r--r-- | otfl-font-dum.lua | 202 | 
1 files changed, 78 insertions, 124 deletions
| diff --git a/otfl-font-dum.lua b/otfl-font-dum.lua index c9ffb63..54b631d 100644 --- a/otfl-font-dum.lua +++ b/otfl-font-dum.lua @@ -10,28 +10,29 @@ fonts = fonts or { }  -- general -fonts.otf.pack          = false -fonts.tfm.resolve_vf    = false -- no sure about this -fonts.tfm.fontname_mode = "specification" -- somehow latex needs this +fonts.otf.pack              = false -- only makes sense in context +fonts.tfm.resolvevirtualtoo = false -- context specific (due to resolver) +fonts.tfm.fontnamemode      = "specification" -- somehow latex needs this (changed name!)  -- readers  fonts.tfm.readers          = fonts.tfm.readers or { } -fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm' } +fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm', 'lua' }  fonts.tfm.readers.afm      = nil  -- define -fonts.define = fonts.define or { } +fonts.definers            = fonts.definers or { } +fonts.definers.specifiers = fonts.definers.specifiers or { } ---~ fonts.define.method = "tfm" +fonts.definers.specifiers.colonizedpreference = "name" -- is "file" in context -fonts.define.specify.colonized_default_lookup = "name" - -function fonts.define.get_specification(str) +function fonts.definers.getspecification(str)      return "", str, "", ":", str  end +fonts.definers.registersplit("",fonts.definers.specifiers.variants[":"]) -- we add another one for catching lone [names] +  -- logger  fonts.logger = fonts.logger or { } @@ -63,7 +64,7 @@ function fonts.names.resolve(name,sub)          if basename and basename ~= "" then              for i=1,#fileformats do                  local format = fileformats[i] -                local foundname = resolvers.find_file(basename,format) or "" +                local foundname = resolvers.findfile(basename,format) or ""                  if foundname ~= "" then                      data = dofile(foundname)                      break @@ -90,6 +91,10 @@ end  fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv +function fonts.names.getfilename(askedname,suffix)  -- only supported in mkiv +    return "" +end +  -- For the moment we put this (adapted) pseudo feature here.  table.insert(fonts.triggers,"itlc") @@ -158,119 +163,20 @@ fonts.protrusions.setups = fonts.protrusions.setups or { }  local setups  = fonts.protrusions.setups --- As this is experimental code, users should not depend on it. The --- implications are still discussed on the ConTeXt Dev List and we're --- not sure yet what exactly the spec is (the next code is tested with --- a gyre font patched by / fea file made by Khaled Hosny). The double --- trick should not be needed it proper hanging punctuation is used in --- which case values < 1 can be used. --- --- preferred (in context, usine vectors): --- --- \definefontfeature[whatever][default][mode=node,protrusion=quality] --- --- using lfbd and rtbd, with possibibility to enable only one side : --- --- \definefontfeature[whocares][default][mode=node,protrusion=yes,  opbd=yes,script=latn] --- \definefontfeature[whocares][default][mode=node,protrusion=right,opbd=yes,script=latn] --- --- idem, using multiplier --- --- \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn] --- \definefontfeature[whocares][default][mode=node,protrusion=double,opbd=yes,script=latn] --- --- idem, using named feature file (less frozen): --- --- \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn,featurefile=texgyrepagella-regularxx.fea] - -local function map_opbd_onto_protrusion(tfmdata,value,opbd) -    local characters, descriptions = tfmdata.characters, tfmdata.descriptions -    local otfdata = tfmdata.shared.otfdata -    local singles = otfdata.shared.featuredata.gpos_single -    local script, language = tfmdata.script, tfmdata.language -    local done, factor, left, right = false, 1, 1, 1 -    local setup = setups[value] -    if setup then -        factor = setup.factor or 1 -        left   = setup.left   or 1 -        right  = setup.right  or 1 -    else -        factor = tonumber(value) or 1 -    end -    if opbd ~= "right" then -        local validlookups, lookuplist = fonts.otf.collect_lookups(otfdata,"lfbd",script,language) -        if validlookups then -            for i=1,#lookuplist do -                local lookup = lookuplist[i] -                local data = singles[lookup] -                if data then -                    if trace_protrusion then -                        logs.report("fonts","set left protrusion using lfbd lookup '%s'",lookup) -                    end -                    for k, v in next, data do -                    --  local p = - v[3] / descriptions[k].width-- or 1 ~= 0 too but the same -                        local p = - (v[1] / 1000) * factor * left -                        characters[k].left_protruding = p -                        if trace_protrusion then -                            logs.report("opbd","lfbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," ")) -                        end -                    end -                    done = true -                end -            end -        end -    end -    if opbd ~= "left" then -        local validlookups, lookuplist = fonts.otf.collect_lookups(otfdata,"rtbd",script,language) -        if validlookups then -            for i=1,#lookuplist do -                local lookup = lookuplist[i] -                local data = singles[lookup] -                if data then -                    if trace_protrusion then -                        logs.report("fonts","set right protrusion using rtbd lookup '%s'",lookup) -                    end -                    for k, v in next, data do -                    --  local p = v[3] / descriptions[k].width -- or 3 -                        local p = (v[1] / 1000) * factor * right -                        characters[k].right_protruding = p -                        if trace_protrusion then -                            logs.report("opbd","rtbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," ")) -                        end -                    end -                end -                done = true -            end -        end -    end -    tfmdata.auto_protrude = done -end - --- The opbd test is just there because it was discussed on the --- context development list. However, the mentioned fxlbi.otf font --- only has some kerns for digits. So, consider this feature not --- supported till we have a proper test font. -  function fonts.initializers.common.protrusion(tfmdata,value)      if value then -        local opbd = tfmdata.shared.features.opbd -        if opbd then -            -- possible values: left right both yes no (experimental) -            map_opbd_onto_protrusion(tfmdata,value,opbd) -        elseif value then -            local setup = setups[value] -            if setup then -                local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1 -                local emwidth = tfmdata.parameters.quad -                tfmdata.auto_protrude = true -                for i, chr in next, tfmdata.characters do -                    local v, pl, pr = setup[i], nil, nil -                    if v then -                        pl, pr = v[1], v[2] -                    end -                    if pl and pl ~= 0 then chr.left_protruding  = left *pl*factor end -                    if pr and pr ~= 0 then chr.right_protruding = right*pr*factor end +        local setup = setups[value] +        if setup then +            local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1 +            local emwidth = tfmdata.parameters.quad +            tfmdata.auto_protrude = true +            for i, chr in next, tfmdata.characters do +                local v, pl, pr = setup[i], nil, nil +                if v then +                    pl, pr = v[1], v[2]                  end +                if pl and pl ~= 0 then chr.left_protruding  = left *pl*factor end +                if pr and pr ~= 0 then chr.right_protruding = right*pr*factor end              end          end      end @@ -309,7 +215,7 @@ fonts.initializers.node.otf.expansion  = fonts.initializers.common.expansion  -- left over -function fonts.register_message() +function fonts.registermessage()  end  -- example vectors @@ -360,10 +266,16 @@ fonts.otf.meanings.normalize = fonts.otf.meanings.normalize or function(t)      end  end +-- needed (different in context) + +function fonts.otf.scriptandlanguage(tfmdata) +    return tfmdata.script, tfmdata.language +end +  -- bonus -function fonts.otf.name_to_slot(name) -    local tfmdata = fonts.ids[font.current()] +function fonts.otf.nametoslot(name) +    local tfmdata = fonts.identifiers[font.current()]      if tfmdata and tfmdata.shared then          local otfdata = tfmdata.shared.otfdata          local unicode = otfdata.luatex.unicodes[name] @@ -373,7 +285,7 @@ end  function fonts.otf.char(n)      if type(n) == "string" then -        n = fonts.otf.name_to_slot(n) +        n = fonts.otf.nametoslot(n)      end      if type(n) == "number" then          tex.sprint("\\char" .. n) @@ -398,3 +310,45 @@ fonts.strippables = table.tohash {      0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,  } +-- \font\test=file:somefont:reencode=mymessup +-- +--  fonts.enc.reencodings.mymessup = { +--      [109] = 110, -- m +--      [110] = 109, -- n +--  } + +fonts.enc             = fonts.enc or {} +local reencodings     = { } +fonts.enc.reencodings = reencodings + +local function specialreencode(tfmdata,value) +    -- we forget about kerns as we assume symbols and we +    -- could issue a message if ther are kerns but it's +    -- a hack anyway so we odn't care too much here +    local encoding = value and reencodings[value] +    if encoding then +        local temp = { } +        local char = tfmdata.characters +        for k, v in next, encoding do +            temp[k] = char[v] +        end +        for k, v in next, temp do +            char[k] = temp[k] +        end +        -- if we use the font otherwise luatex gets confused so +        -- we return an additional hash component for fullname +        return string.format("reencoded:%s",value) +    end +end + +local function reencode(tfmdata,value) +    tfmdata.postprocessors = tfmdata.postprocessors or { } +    table.insert(tfmdata.postprocessors, +        function(tfmdata) +            return specialreencode(tfmdata,value) +        end +    ) +end + +table.insert(fonts.manipulators,"reencode") +fonts.initializers.base.otf.reencode = reencode | 
