From 7a4089c8a2e03094284c0484b216f9fa72be3a73 Mon Sep 17 00:00:00 2001
From: Khaled Hosny <khaledhosny@eglug.org>
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(-)

(limited to 'luaotfload.dtx')

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<</ca 1/CA 1>>'
+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<</ca 1/CA 1>>"
+    end
+    res2 = format("/TransGs%s<</ca %s/CA %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<</ca %g/CA %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

