1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
-- for the moment here:
local utfchar = utf.char
local concat = table.concat
local nodecodes = nodes.nodecodes
local hlist_code = nodecodes.hlist
local vlist_code = nodecodes.vlist
local glyph_code = nodecodes.glyph
local kern_code = nodecodes.kern
local setnodecolor = nodes.tracers.colors.set
local parameters = fonts.hashes.parameters
local basepoints = number.basepoints
-- definecolor[hz:positive] [r=0.6]
-- definecolor[hz:negative] [g=0.6]
-- definecolor[hz:zero] [b=0.6]
-- scale = multiplier + ef/multiplier
local trace_both = false trackers.register("builders.paragraphs.expansion.both", function(v) trace_verbose = false trace_both = v end)
local trace_verbose = false trackers.register("builders.paragraphs.expansion.verbose", function(v) trace_verbose = v trace_color = v end)
local report_verbose = logs.reporter("fonts","expansion")
local function colorize(n)
local size, font, ef, width, list, flush, length
if trace_verbose then
width = 0
length = 0
list = { }
flush = function()
if length > 0 then
report_verbose("%0.3f : %10s %10s %s",ef/1000,basepoints(width),basepoints(width*ef/1000000),concat(list,"",1,length))
width = 0
length = 0
end
end
else
length = 0
end
-- tricky: the built-in method creates dummy fonts and the last line normally has the
-- original font and that one then has ex.auto set
while n do
local id = n.id
if id == glyph_code then
local ne = n.expansion_factor
if ne == 0 then
if length > 0 then flush() end
setnodecolor(n,"hz:zero")
else
local f = n.font
if f ~= font then
if length > 0 then
flush()
end
local pf = parameters[f]
local ex = pf.expansion
if ex and ex.auto then
size = pf.size
font = f -- save lookups
else
size = false
end
end
if size then
if ne ~= ef then
if length > 0 then
flush()
end
ef = ne
end
if ef > 1 then
setnodecolor(n,"hz:plus")
elseif ef < 1 then
setnodecolor(n,"hz:minus")
else
setnodecolor(n,"hz:zero")
end
if trace_verbose then
length = length + 1
list[length] = utfchar(n.char)
width = width + n.width -- no kerning yet
end
end
end
elseif id == hlist_code or id == vlist_code then
if length > 0 then
flush()
end
colorize(n.list,flush)
else -- nothing to show on kerns
if length > 0 then
flush()
end
end
n = n.next
end
if length > 0 then
flush()
end
end
builders.paragraphs.expansion = builders.paragraphs.expansion or { }
function builders.paragraphs.expansion.trace(head)
colorize(head,true)
return head
end
local tasks = nodes.tasks
tasks.prependaction("shipouts","normalizers","builders.paragraphs.expansion.trace")
tasks.disableaction("shipouts","builders.paragraphs.expansion.trace")
local function set(v)
if v then
tasks.enableaction("shipouts","builders.paragraphs.expansion.trace")
else
tasks.disableaction("shipouts","builders.paragraphs.expansion.trace")
end
end
trackers.register("builders.paragraphs.expansion.verbose",set)
trackers.register("builders.paragraphs.expansion.both",set)
|