diff options
| -rw-r--r-- | luaotfload.dtx | 1 | ||||
| -rw-r--r-- | otfl-font-dum.lua | 2 | ||||
| -rw-r--r-- | otfl-font-otp.lua | 504 | 
3 files changed, 1 insertions, 506 deletions
diff --git a/luaotfload.dtx b/luaotfload.dtx index 8de140e..28c1aeb 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -547,7 +547,6 @@ luaotfload.loadmodule('font-oti.lua')  luaotfload.loadmodule('font-otb.lua')  luaotfload.loadmodule('font-otn.lua')  luaotfload.loadmodule('font-ota.lua') -luaotfload.loadmodule('font-otp.lua')  luaotfload.loadmodule('font-otc.lua')  luaotfload.loadmodule('font-def.lua')  luaotfload.loadmodule('font-xtx.lua') diff --git a/otfl-font-dum.lua b/otfl-font-dum.lua index dbdf5d7..2de1ae1 100644 --- a/otfl-font-dum.lua +++ b/otfl-font-dum.lua @@ -10,7 +10,7 @@ fonts = fonts or { }  -- general -fonts.otf.pack          = true +fonts.otf.pack          = false  fonts.tfm.resolve_vf    = false -- no sure about this  fonts.tfm.fontname_mode = "specification" -- somehow latex needs this diff --git a/otfl-font-otp.lua b/otfl-font-otp.lua deleted file mode 100644 index a80c515..0000000 --- a/otfl-font-otp.lua +++ /dev/null @@ -1,504 +0,0 @@ -if not modules then modules = { } end modules ['font-otp'] = { -    version   = 1.001, -    comment   = "companion to font-otf.lua (packing)", -    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", -    copyright = "PRAGMA ADE / ConTeXt Development Team", -    license   = "see context related readme files" -} - --- todo: pack math (but not that much to share) - -local next, type, tostring = next, type, tostring -local sort, concat = table.sort, table.concat - -local trace_loading = false  trackers.register("otf.loading", function(v) trace_loading = v end) - -fonts               = fonts               or { } -fonts.otf           = fonts.otf           or { } -fonts.otf.enhancers = fonts.otf.enhancers or { } -fonts.otf.glists    = fonts.otf.glists    or { "gsub", "gpos" } - -local criterium, threshold, tabstr = 1, 0, table.serialize - -local function tabstr(t) -- hashed from core-uti / experiment -    local s = { } -    for k, v in next, t do -        if type(v) == "table" then -            s[#s+1] = k.."={"..tabstr(v).."}" -        else -            s[#s+1] = k.."="..tostring(v) -        end -    end -    sort(s) -    return concat(s,",") -end - -function fonts.otf.enhancers.pack(data) -    if data then -        local h, t, c = { }, { }, { } -        local hh, tt, cc = { }, { }, { } -        local function pack_1(v) -            -- v == table -            local tag = tabstr(v) -            local ht = h[tag] -            if not ht then -                ht = #t+1 -                t[ht] = v -                h[tag] = ht -                c[ht] = 1 -            else -                c[ht] = c[ht] + 1 -            end -            return ht -        end -        local function pack_2(v) -            -- v == number -            if c[v] <= criterium then -                return t[v] -            else -                -- compact hash -                local hv = hh[v] -                if not hv then -                    hv = #tt+1 -                    tt[hv] = t[v] -                    hh[v] = hv -                    cc[hv] = c[v] -                end -                return hv -            end -        end -        local function success(stage,pass) -            if #t == 0 then -                if trace_loading then -                    logs.report("load otf","pack quality: nothing to pack") -                end -                return false -            elseif #t >= threshold then -                local one, two, rest = 0, 0, 0 -                if pass == 1 then -                    for k,v in next, c do -                        if v == 1 then -                            one = one + 1 -                        elseif v == 2 then -                            two = two + 1 -                        else -                            rest = rest + 1 -                        end -                    end -                else -                    for k,v in next, cc do -                        if v >20 then -                            rest = rest + 1 -                        elseif v >10 then -                            two = two + 1 -                        else -                            one = one + 1 -                        end -                    end -                    data.tables = tt -                end -                if trace_loading then -                    logs.report("load otf","pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)", stage, pass, one+two+rest, one, two, rest, criterium) -                end -                return true -            else -                if trace_loading then -                    logs.report("load otf","pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)", stage, pass, #t, threshold) -                end -                return false -            end -        end -        for pass=1,2 do -            local pack = (pass == 1 and pack_1) or pack_2 -            for k, v in next, data.glyphs do -                v.boundingbox = pack(v.boundingbox) -                local l = v.slookups -                if l then -                    for k,v in next, l do -                        l[k] = pack(v) -                    end -                end -                local l = v.mlookups -                if l then -                    for k,v in next, l do -                        for kk=1,#v do -                            local vkk = v[kk] -                            local what = vkk[1] -                            if what == "pair" then -                                local t = vkk[3] if t then vkk[3] = pack(t) end -                                local t = vkk[4] if t then vkk[4] = pack(t) end -                            elseif what == "position" then -                                local t = vkk[2] if t then vkk[2] = pack(t) end -                            end -                        --  v[kk] = pack(vkk) -                        end -                    end -                end -                local m = v.mykerns -                if m then -                    for k,v in next, m do -                        m[k] = pack(v) -                    end -                end -                local m = v.math -                if m then -                    local mk = m.kerns -                    if mk then -                        for k,v in next, mk do -                            mk[k] = pack(v) -                        end -                    end -                end -                local a = v.anchors -                if a then -                    for k,v in next, a do -                        if k == "baselig" then -                            for kk, vv in next, v do -                                for kkk=1,#vv do -                                    vv[kkk] = pack(vv[kkk]) -                                end -                            end -                        else -                            for kk, vv in next, v do -                                v[kk] = pack(vv) -                            end -                        end -                    end -                end -            end -            if data.lookups then -                for k, v in next, data.lookups do -                    if v.rules then -                        for kk, vv in next, v.rules do -                            local l = vv.lookups -                            if l then -                                vv.lookups = pack(l) -                            end -                            local c = vv.coverage -                            if c then -                                local cc = c.before  if cc then c.before  = pack(cc) end -                                local cc = c.after   if cc then c.after   = pack(cc) end -                                local cc = c.current if cc then c.current = pack(cc) end -                            end -                            local c = vv.reversecoverage -                            if c then -                                local cc = c.before  if cc then c.before  = pack(cc) end -                                local cc = c.after   if cc then c.after   = pack(cc) end -                                local cc = c.current if cc then c.current = pack(cc) end -                            end -                            -- no need to pack vv.glyphs -                            local c = vv.glyphs -                            if c then -                                if c.fore == "" then c.fore = nil end -                                if c.back == "" then c.back = nil end -                            end -                        end -                    end -                end -            end -            if data.luatex then -                local la = data.luatex.anchor_to_lookup -                if la then -                    for lookup, ldata in next, la do -                        la[lookup] = pack(ldata) -                    end -                end -                local la = data.luatex.lookup_to_anchor -                if la then -                    for lookup, ldata in next, la do -                        la[lookup] = pack(ldata) -                    end -                end -                local ls = data.luatex.sequences -                if ls then -                    for feature, fdata in next, ls do -                        local flags = fdata.flags -                        if flags then -                            fdata.flags = pack(flags) -                        end -                        local subtables = fdata.subtables -                        if subtables then -                            fdata.subtables = pack(subtables) -                        end -                        local features = fdata.features -                        if features then -                            for script, sdata in next, features do -                                features[script] = pack(sdata) -                            end -                        end -                    end -                end -                local ls = data.luatex.lookups -                if ls then -                    for lookup, fdata in next, ls do -                        local flags = fdata.flags -                        if flags then -                            fdata.flags = pack(flags) -                        end -                        local subtables = fdata.subtables -                        if subtables then -                            fdata.subtables = pack(subtables) -                        end -                    end -                end -                local lf = data.luatex.features -                if lf then -                    for _, g in next, fonts.otf.glists do -                        local gl = lf[g] -                        if gl then -                            for feature, spec in next, gl do -                                gl[feature] = pack(spec) -                            end -                        end -                    end -                end -            end -            if not success(1,pass) then -                return -            end -        end -        if #t > 0 then -            for pass=1,2 do -                local pack = (pass == 1 and pack_1) or pack_2 -                for k, v in next, data.glyphs do -                    local m = v.mykerns -                    if m then -                        v.mykerns = pack(m) -                    end -                    local m = v.math -                    if m then -                        local mk = m.kerns -                        if mk then -                            m.kerns = pack(mk) -                        end -                    end -                    local a = v.anchors -                    if a then -                        v.anchors = pack(a) -                    end -                    local l = v.mlookups -                    if l then -                        for k,v in next, l do -                            for kk=1,#v do -                                v[kk] = pack(v[kk]) -                            end -                        end -                    end -                end -                local ls = data.luatex.sequences -                if ls then -                    for feature, fdata in next, ls do -                        fdata.features = pack(fdata.features) -                    end -                end -                if not success(2,pass) then ---~                     return -                end -            end -        end -    end -end - -function fonts.otf.enhancers.unpack(data) -    if data then -        local t = data.tables -        if t then -            local unpacked = { } -            for k, v in next, data.glyphs do -                local tv = t[v.boundingbox] if tv then v.boundingbox = tv end -                local l = v.slookups -                if l then -                    for k,v in next, l do -                        local tv = t[v] if tv then l[k] = tv end -                    end -                end -                local l = v.mlookups -                if l then -                    for k,v in next, l do -                        for i=1,#v do -                            local vi = v[i] -                            local tv = t[vi] -                            if tv then -                                v[i] = tv -                                if unpacked[tv] then -                                    vi = false -                                else -                                    unpacked[tv], vi = true, tv -                                end -                            end -                            if vi then -                                local what = vi[1] -                                if what == "pair" then -                                    local tv = t[vi[3]] if tv then vi[3] = tv end -                                    local tv = t[vi[4]] if tv then vi[4] = tv end -                                elseif what == "position" then -                                    local tv = t[vi[2]] if tv then vi[2] = tv end -                                end -                            end -                        end -                    end -                end -                local m = v.mykerns -                if m then -                    local tm = t[m] -                    if tm then -                        v.mykerns = tm -                        if unpacked[tm] then -                            m = false -                        else -                            unpacked[tm], m = true, tm -                        end -                    end -                    if m then -                        for k,v in next, m do -                            local tv = t[v] if tv then m[k] = tv end -                        end -                    end -                end -                local m = v.math -                if m then -                    local mk = m.kerns -                    if mk then -                        local tm = t[mk] -                        if tm then -                            m.kerns = tm -                            if unpacked[tm] then -                                mk = false -                            else -                                unpacked[tm], mk = true, tm -                            end -                        end -                        if mk then -                            for k,v in next, mk do -                                local tv = t[v] if tv then mk[k] = tv end -                            end -                        end -                    end -                end -                local a = v.anchors -                if a then -                    local ta = t[a] -                    if ta then -                        v.anchors = ta -                        if not unpacked[ta] then -                            unpacked[ta], a = true, ta -                        else -                            a = false -                        end -                    end -                    if a then -                        for k,v in next, a do -                            if k == "baselig" then -                                for kk, vv in next, v do -                                    for kkk=1,#vv do -                                        local tv = t[vv[kkk]] if tv then vv[kkk] = tv end -                                    end -                                end -                            else -                                for kk, vv in next, v do -                                    local tv = t[vv] if tv then v[kk] = tv end -                                end -                            end -                        end -                    end -                end -            end -            if data.lookups then -                for k, v in next, data.lookups do -                    local r = v.rules -                    if r then -                        for kk, vv in next, r do -                            local l = vv.lookups -                            if l then -                                local tv = t[l] if tv then vv.lookups = tv end -                            end -                            local c = vv.coverage -                            if c then -                                local cc = c.before  if cc then local tv = t[cc] if tv then c.before  = tv end end -                                      cc = c.after   if cc then local tv = t[cc] if tv then c.after   = tv end end -                                      cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end -                            end -                            local c = vv.reversecoverage -                            if c then -                                local cc = c.before  if cc then local tv = t[cc] if tv then c.before  = tv end end -                                      cc = c.after   if cc then local tv = t[cc] if tv then c.after   = tv end end -                                      cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end -                            end -                            -- no need to unpack vv.glyphs -                        end -                    end -                end -            end -            local luatex = data.luatex -            if luatex then -                local la = luatex.anchor_to_lookup -                if la then -                    for lookup, ldata in next, la do -                        local tv = t[ldata] if tv then la[lookup] = tv end -                    end -                end -                local la = luatex.lookup_to_anchor -                if la then -                    for lookup, ldata in next, la do -                        local tv = t[ldata] if tv then la[lookup] = tv end -                    end -                end -                local ls = luatex.sequences -                if ls then -                    for feature, fdata in next, ls do -                        local flags = fdata.flags -                        if flags then -                            local tv = t[flags] if tv then fdata.flags = tv end -                        end -                        local subtables = fdata.subtables -                        if subtables then -                            local tv = t[subtables] if tv then fdata.subtables = tv end -                        end -                        local features = fdata.features -                        if features then -                            local tv = t[features] -                            if tv then -                                fdata.features = tv -                                if not unpacked[tv] then -                                    unpacked[tv], features = true, tv -                                else -                                    features = false -                                end -                            end -                            if features then -                                for script, sdata in next, features do -                                    local tv = t[sdata] if tv then features[script] = tv end -                                end -                            end -                        end -                    end -                end -                local ls = luatex.lookups -                if ls then -                    for lookups, fdata in next, ls do -                        local flags = fdata.flags -                        if flags then -                            local tv = t[flags] if tv then fdata.flags = tv end -                        end -                        local subtables = fdata.subtables -                        if subtables then -                            local tv = t[subtables] if tv then fdata.subtables = tv end -                        end -                    end -                end -                local lf = luatex.features -                if lf then -                    for _, g in next, fonts.otf.glists do -                        local gl = lf[g] -                        if gl then -                            for feature, spec in next, gl do -                                local tv = t[spec] if tv then gl[feature] = tv end -                            end -                        end -                    end -                end -            end -            data.tables = nil -        end -    end -end  | 
