summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-t3.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luaotfload/luaotfload-t3.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/luaotfload-t3.lua142
1 files changed, 142 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-t3.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-t3.lua
new file mode 100644
index 00000000000..2588346724f
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-t3.lua
@@ -0,0 +1,142 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-t3.lua
+-- DESCRIPTION: part of luaotfload / Type 3
+-----------------------------------------------------------------------
+do -- block to avoid to many local variables error
+ assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
+ name = "luaotfload-t3",
+ version = "3.19", --TAGVERSION
+ date = "2022-02-24", --TAGDATE
+ description = "luaotfload submodule / Type 3 font handling",
+ license = "GPL v2.0",
+ author = "Marcel Krüger",
+ copyright = "Luaotfload Development Team",
+ }
+end
+
+--[[
+local function u8_to_utf16be(s)
+ local d = {}
+ local i = 0
+ for _, cp, cp2 in utf8.codes(s) do
+ i = i + 1
+ if cp > 0x10000 then
+ cp = cp - 0x10000
+ local high = (cp>>10) | 0xD800
+ local low = (cp&0x3FF) | 0xDC00
+ d[i] = string.format('%04X%04X', high, low)
+ else
+ d[i] = string.format('%04X', cp)
+ end
+ end
+ return table.concat(d, '', 1, i)
+end
+]]
+
+local function t3factory(basename, designsize, callback)
+ local count = 0
+ local gid_to_t3 = {}
+ local t3_to_gid = {}
+ return function(size)
+ local fids = {}
+ return function(gid, width, unicode)
+ local t3id = gid_to_t3[gid]
+ if not t3id then
+ t3id = count
+ count = count + 1
+ gid_to_t3[gid] = t3id
+ t3_to_gid[t3id] = gid
+ end
+ local t3fid, t3cid = t3id >> 8, ~(t3id & 0xFF)
+ local fid = fids[t3fid + 1]
+ local fontdir = fid and font.getfont(fid)
+ local characters = fontdir and fontdir.characters
+ if not (characters and characters[t3cid]) then
+ characters = characters or {}
+ -- First create the character
+ local char = {
+ width = width,
+ height = 0, -- We never look at these two anyway
+ depth = 0,
+ tounicode = unicode,
+ }
+ characters[t3cid] = char
+ if fid then -- Font already exists
+ font.addcharacters(fid, {
+ characters = {
+ [t3cid] = char,
+ },
+ })
+ else
+ fontdir = {
+ name = basename .. '_' .. basesize .. '_' .. t3fid,
+ format = 'type3',
+ psname = 'none',
+ filename = 'not_a_real_filename', -- Can't be null to ensure reuse
+ fullname = basename .. basesize .. '_' .. t3fid,
+ characters = characters,
+ designsize = basesize,
+ size = size,
+ cidinfo = {}, -- Can't be null to ensure reuse
+ attributes = '/FontDescriptor<<\z
+ /Type/FontDescriptor\z
+ /FontName/VirtualLuaFont\z
+ /Flags 4\z
+ /ItalicAngle 0\z
+ >>', -- TODO: Needs work
+ t3_handler = function(stage, _, cid)
+ cid = cid and assert(t3_to_gid[(t3fid << 8) | ~cid])
+ return callback(stage, cid)
+ end
+ }
+ fid = font.define(fontdir)
+ fids[t3fid + 1] = fid
+ end
+ end
+ vf.font(fid)
+ vf.char(t3cid)
+ end
+ end
+end
+
+luatexbase.add_to_callback('provide_charproc_data', function(stage, fid, ...)
+ local fontdir = font.getfont(fid)
+ if not fontdir then error'Unknown font' end
+ local handler = fontdir.t3_handler
+ if not handler then error'Missing t3handler in Type 3 font' end
+ return handler(stage, fid, ...)
+end, 'luaotfload.t3')
+
+return t3factory
+--[===[
+ function callback(stage, cid)
+ if stage == 1 then
+ local char = assert(characters[cid])
+ local head = assert(char.head)
+ local resource = tex.saveboxresource(head, nil--[[attributes]], nil--[[resources]], true--[[immediate]], 0--[[mode]], nil--[[margin]])
+ local name = string.format('/F%i', pdf.getxformname(resource))
+ local resources = characters.resources
+ if resources then
+ characters.resources = string.format('%s %s %i 0 R', resources, name, resource)
+ else
+ characters.resources = string.format('%s %i 0 R', name, resource)
+ end
+ char.resource = name
+ elseif stage == 2 then
+ local char = assert(characters[cid])
+ width = char.width/65781
+ return pdf.obj{
+ type = 'stream',
+ immediate = true,
+ -- objnum =
+ -- attr =
+ -- compresslevel =
+ string = string.format('%g 0 d0 %s Do', width, char.resource)
+ }, width
+ elseif stage == 3 then
+ return 65781/655360, string.format('/XObject<<%s>>', characters.resources)
+ end
+ print(stage, fid, cid)
+ end,
+ }
+]===]