67 lines
2.1 KiB
Lua
67 lines
2.1 KiB
Lua
|
-- This is serializet2.lua.
|
||
|
-- Copyright 2019 Marcel Krüger <tex@2krueger.de>
|
||
|
--
|
||
|
-- This work may be distributed and/or modified under the
|
||
|
-- conditions of the LaTeX Project Public License version 1.3c.
|
||
|
-- The full text of this version can be found at
|
||
|
-- http://www.latex-project.org/lppl/lppl-1-3c.txt
|
||
|
--
|
||
|
-- This work has the LPPL maintenance status `maintained'
|
||
|
--
|
||
|
-- The Current Maintainer of this work is Marcel Krüger.
|
||
|
--
|
||
|
-- This work consists of the files buildcffwrapper.lua, buildotfwrapper.lua,
|
||
|
-- finish_pdffont.lua, finisht3.lua, glyph2char.lua, libSfnt.lua,
|
||
|
-- luaglyphlist.lua, luaotfprovider.lua, make_extensible_per_char.lua,
|
||
|
-- mpfont.lua, mplibtolist.lua, mplibtot2.lua, mpnodelib.lua,
|
||
|
-- mt1_fontloader.lua, nodebuilder.lua, optimizet2.lua, serializet2.lua.
|
||
|
|
||
|
local pack = string.pack
|
||
|
local optimizet2 = require'luametalatex-font-t2-opt'
|
||
|
local function numbertot2(n)
|
||
|
if math.abs(n) > 2^15 then
|
||
|
error[[Number too big]]
|
||
|
end
|
||
|
local num = math.floor(n + .5)
|
||
|
if n ~= 0 and math.abs((num-n)/n) > 0.001 then
|
||
|
num = math.floor(n * 2^16 + 0.5)
|
||
|
return pack(">Bi4", 255, math.floor(n * 2^16 + 0.5))
|
||
|
elseif num >= -107 and num <= 107 then
|
||
|
return string.char(num + 139)
|
||
|
elseif num >= 108 and num <= 1131 then
|
||
|
return pack(">I2", num+0xF694) -- -108+(247*0x100)
|
||
|
elseif num >= -1131 and num <= -108 then
|
||
|
return pack(">I2", -num+0xFA94) -- -108+(251*0x100)
|
||
|
else
|
||
|
return pack(">Bi2", 28, num)
|
||
|
end
|
||
|
end
|
||
|
local function convert_cs(cs, upem)
|
||
|
local cs_parts = {}
|
||
|
local function add(cmd, first, ...)
|
||
|
if cmd == 19 or cmd == 20 then
|
||
|
cs_parts[#cs_parts+1] = string.char(cmd)
|
||
|
cs_parts[#cs_parts+1] = first
|
||
|
return
|
||
|
end
|
||
|
if first then
|
||
|
cs_parts[#cs_parts+1] = numbertot2(first*upem/1000)
|
||
|
return add(cmd, ...)
|
||
|
end
|
||
|
if cmd then
|
||
|
if cmd < 0 then
|
||
|
cs_parts[#cs_parts+1] = string.char(12, -cmd-1)
|
||
|
else
|
||
|
cs_parts[#cs_parts+1] = string.char(cmd)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
for _, args in ipairs(cs) do if args then add(table.unpack(args)) end end
|
||
|
return table.concat(cs_parts)
|
||
|
end
|
||
|
|
||
|
return function(cs, upem, raw)
|
||
|
if not raw then optimizet2(cs) end
|
||
|
return convert_cs(cs, upem or 1000)
|
||
|
end
|