From 7a4089c8a2e03094284c0484b216f9fa72be3a73 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Thu, 31 Dec 2009 21:32:55 +0200 Subject: Fix LuaTeX crash with transparency Apparently, LuaTeX weren't happy by massive assignments to tex.pdfpageresources (we were reassigning it for almost every node!). Now the code seems to work, but it is just a big hack at best. --- luaotfload.dtx | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/luaotfload.dtx b/luaotfload.dtx index 6c776e1..567cd37 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -664,24 +664,34 @@ end initializers.base.otf.color = initializers.common.color initializers.node.otf.color = initializers.common.color -local res1 = tex.pdfpageresources -local res2 = '/TransGs1<>' +local function hex2dec(hex,one) + if one then + return format("%.1g", tonumber(hex, 16)/255) + else + return format("%.3g", tonumber(hex, 16)/255) + end +end + +local res -local function hex2dec(hex) - return format("%.3g", tonumber(hex, 16)/255) +local function pageresources(a) + local res2 + if not res then + res = "/TransGs1<>" + end + res2 = format("/TransGs%s<>", a, a, a) + res = format("%s%s", res, res:find(res2) and "" or res2) end local function hex_to_rgba(hex) local r, g, b, a, push, pop, res3 if hex then if #hex == 6 then - _, _, r, g, b = hex:find('(..)(..)(..)') + _, _, r, g, b = hex:find('(..)(..)(..)') elseif #hex == 8 then - _, _, r, g, b, a = hex:find('(..)(..)(..)(..)') - a = hex2dec(a) - res3 = format('/TransGs%g<>', a, a, a) - res2 = format('%s%s', res2, res2:find(res3) and "" or res3) - tex.pdfpageresources = format('%s/ExtGState<<%s>>', res1, res2) + _, _, r, g, b, a = hex:find('(..)(..)(..)(..)') + a = hex2dec(a,true) + pageresources(a) end else return nil @@ -735,8 +745,14 @@ local function colorize(head) return head end +local function finalize(head) + tex.pdfpageresources = format("%s\n/ExtGState<<%s>>", tex.pdfpageresources, res) + return head +end + callback.add("hpack_filter", colorize, "Font color") callback.add("pre_linebreak_filter", colorize, "Font color") +callback.add("pre_output_filter", finalize, "Finalize hack") % \end{macrocode} % \iffalse -- cgit v1.2.3