summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--luaotfload-colors.lua70
1 files changed, 41 insertions, 29 deletions
diff --git a/luaotfload-colors.lua b/luaotfload-colors.lua
index 1525214..d7b84fc 100644
--- a/luaotfload-colors.lua
+++ b/luaotfload-colors.lua
@@ -6,19 +6,19 @@ if not modules then modules = { } end modules ['luaotfload-colors'] = {
license = "GNU GPL v2"
}
-local newnode = node.new
-local nodetype = node.id
-local traverse_nodes = node.traverse
-local insert_node_before = node.insert_before
-local insert_node_after = node.insert_after
+local newnode = node.new
+local nodetype = node.id
+local traverse_nodes = node.traverse
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
-local stringformat = string.format
-local stringgsub = string.gsub
-local stringfind = string.find
+local stringformat = string.format
+local stringgsub = string.gsub
+local stringfind = string.find
-local otffeatures = fonts.constructors.newfeatures("otf")
-local ids = fonts.hashes.identifiers
-local registerotffeature = otffeatures.register
+local otffeatures = fonts.constructors.newfeatures("otf")
+local identifiers = fonts.hashes.identifiers
+local registerotffeature = otffeatures.register
local function setcolor(tfmdata,value)
local sanitized
@@ -97,29 +97,38 @@ local function hex_to_rgba(hex)
return push, pop
end
-local glyph = nodetype('glyph')
-local hlist = nodetype('hlist')
-local vlist = nodetype('vlist')
-local whatsit = nodetype('whatsit')
-local pgi = nodetype('page_insert')
-local sbox = nodetype('sub_box')
+--- Luatex internal types
+
+local glyph_t = nodetype("glyph")
+local hlist_t = nodetype("hlist")
+local vlist_t = nodetype("vlist")
+local whatsit_t = nodetype("whatsit")
+local page_insert_t = nodetype("page_insert")
+local sub_box_t = nodetype("sub_box")
local function lookup_next_color(head)
for n in traverse_nodes(head) do
- if n.id == glyph then
- if ids[n.font] and ids[n.font].properties and ids[n.font].properties.color then
- return ids[n.font].properties.color
+ local n_id = n.id
+ if n_id == glyph_t then
+ local n_font
+ if identifiers[n_font]
+ and identifiers[n_font].properties
+ and identifiers[n_font].properties.color
+ then
+ return identifiers[n.font].properties.color
else
return -1
end
- elseif n.id == vlist or n.id == hlist or n.id == sbox then
+
+ elseif n_id == vlist_t or n_id == hlist_t or n_id == sub_box_t then
local r = lookup_next_color(n.list)
if r == -1 then
return -1
elseif r then
return r
end
- elseif n.id == whatsit or n.id == pgi then
+
+ elseif n_id == whatsit_t or n_id == page_insert_t then
return -1
end
end
@@ -128,15 +137,18 @@ end
local function node_colorize(head, current_color, next_color)
for n in traverse_nodes(head) do
- if n.id == hlist or n.id == vlist or n.id == sbox then
+ local n_id = n.id
+
+ if n_id == hlist_t or n_id == vlist_t or n_id == sub_box_t then
local next_color_in = lookup_next_color(n.next) or next_color
n.list, current_color = node_colorize(n.list, current_color, next_color_in)
- elseif n.id == glyph then
- local tfmdata = ids[n.font]
+
+ elseif n_id == glyph_t then
+ local tfmdata = identifiers[n.font]
if tfmdata and tfmdata.properties and tfmdata.properties.color then
if tfmdata.properties.color ~= current_color then
local pushcolor = hex_to_rgba(tfmdata.properties.color)
- local push = newnode(whatsit, 8)
+ local push = newnode(whatsit_t, 8)
push.mode = 1
push.data = pushcolor
head = insert_node_before(head, n, push)
@@ -145,7 +157,7 @@ local function node_colorize(head, current_color, next_color)
local next_color_in = lookup_next_color (n.next) or next_color
if next_color_in ~= tfmdata.properties.color then
local _, popcolor = hex_to_rgba(tfmdata.properties.color)
- local pop = newnode(whatsit, 8)
+ local pop = newnode(whatsit_t, 8)
pop.mode = 1
pop.data = popcolor
head = insert_node_after(head, n, pop)
@@ -164,13 +176,13 @@ local function font_colorize(head)
local r = "/ExtGState<<"..res..">>"
tex.pdfpageresources = stringgsub(tex.pdfpageresources, r, "")
end
- local h = node_colorize(head, nil, nil)
+ local new_head = node_colorize(head, nil, nil)
-- now append our page resources
if res and stringfind(res, "%S") then -- test for non-empty string
local r = "/ExtGState<<"..res..">>"
tex.pdfpageresources = tex.pdfpageresources..r
end
- return h
+ return new_head
end
local color_callback_activated = 0