Hi Luigi,
I've attached a series of font-related patches.
Patch 1:
Even if you set "tounicode = 1" at the top level of a font, "tounicode =
<something>" for each character, and run "pdf.setgentounicode(1)",
LuaTeX will only write out a /ToUnicode entry if the document uses
"\pdfextension glyphtounicode" somewhere.
A minimal(-ish) example:
% \pdfextension glyphtounicode{fake!}{0000}
\newcount\fontid
\directlua{
local height = tex.sp("8bp")
local width = tex.sp("36bp")
pdf.setgentounicode(1)
local inner = font.define {
name = "fake-font-inner",
parameters = {},
properties = {},
encodingbytes = 0,
psname = "none",
tounicode = 1,
characters = {
[1] = {
width = width,
height = height,
depth = 0,
tounicode = { 0x1f986 },
}
}
}
tex.count.fontid = font.define {
name = "fake-font-virtual",
parameters = {},
properties = {},
characters = {
[string.byte"x"] = {
width = width,
height = height,
depth = 0,
commands = {
{ "slot", 1, 1 }
}
}
},
type = "virtual",
fonts = {{ id = inner }},
}
callback.register(
"provide_charproc_data",
function (mode, font_id, slot)
if mode == 2 then
return pdf.immediateobj("stream", "36 0 d0 0 0 36 8 re f"), 36
elseif mode == 3 then
return 1 / 10
end
end
)
}
x{\setfontid\fontid x}x
\bye
You would expect that copying the black box would give you a duck, but
this only happens if the first line is uncommented. The first patch
should fix this.
Patch 2:
Defining a Type 3 font with a character index greater than 256 can cause
a segfault. Using an index >256 is impossible with a T3 font, but you
shouldn't be able to cause a segfault from Lua code.
Minimal example:
\directlua{
local height = tex.sp("8bp")
local width = tex.sp("36bp")
local id = font.define {
name = "fake-font-inner",
parameters = {},
properties = {},
encodingbytes = 0,
psname = "none",
tounicode = 1,
characters = {
[0x1f986] = {
width = width,
height = height,
depth = 0,
}
}
}
callback.register(
"provide_charproc_data",
function (mode, font_id, slot)
if mode == 2 then
return pdf.immediateobj("stream", "36 0 d0 0 0 36 8 re f"), 36
elseif mode == 3 then
return 1 / 10
end
end
)
local glyph = node.new("glyph")
glyph.font = id
glyph.char = 0x1f986
tex.forcehmode()
node.write(glyph)
}
\bye
The second patch catches this when the font is initialized, skips the
too-large character, and issues a warning.
Patch 3:
The third patch adds the "provide_charproc_data" callback to the manual.
Thanks,
-- Max