diff options
-rw-r--r-- | luaotfload.dtx | 179 | ||||
-rw-r--r-- | otfl-font-msc.lua | 159 |
2 files changed, 159 insertions, 179 deletions
diff --git a/luaotfload.dtx b/luaotfload.dtx index 86c5b8d..afcc7bb 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -78,7 +78,6 @@ and the derived files \generate{% \usedir{tex/luatex/luaotfload}% \file{luaotfload.lua}{\from{luaotfload.dtx}{lua}}%% - \file{otfl-font-msc.lua}{\from{luaotfload.dtx}{font-msc}}%% } \obeyspaces @@ -583,184 +582,6 @@ end %</lua> % \fi % -% \section{\texttt{otfl-font-msc.lua}} -% -% \iffalse -%<*font-msc> -% \fi -% -% First, some initializations. -% -% \begin{macrocode} - -if not modules then modules = { } end modules ['font-msc'] = { - version = 1.001, - comment = "companion to font-otf.lua (miscellaneous)", - author = "Khaled Hosny", - copyright = "Khaled Hosny", - license = "GPL" -} - -% \end{macrocode} -% -% Support for font slanting and extending. -% -% \begin{macrocode} - -fonts.triggers = fonts.triggers or { } -fonts.initializers = fonts.initializers or { } -fonts.initializers.common = fonts.initializers.common or { } - -local initializers, format = fonts.initializers, string.format - -table.insert(fonts.triggers,"slant") - -function fonts.initializers.common.slant(tfmdata,value) - value = tonumber(value) - if not value then - value = 0 - elseif value > 1 then - value = 1 - elseif value < -1 then - value = -1 - end - tfmdata.slant_factor = value -end - -initializers.base.otf.slant = initializers.common.slant -initializers.node.otf.slant = initializers.common.slant - -table.insert(fonts.triggers,"extend") - -function initializers.common.extend(tfmdata,value) - value = tonumber(value) - if not value then - value = 0 - elseif value > 10 then - value = 10 - elseif value < -10 then - value = -10 - end - tfmdata.extend_factor = value -end - -initializers.base.otf.extend = initializers.common.extend -initializers.node.otf.extend = initializers.common.extend - -% \end{macrocode} -% -% Support for font color. -% -% \begin{macrocode} - -table.insert(fonts.triggers,"color") - -function initializers.common.color(tfmdata,value) - if value then - tfmdata.color = value - end -end - -initializers.base.otf.color = initializers.common.color -initializers.node.otf.color = initializers.common.color - -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 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('(..)(..)(..)') - elseif #hex == 8 then - _, _, r, g, b, a = hex:find('(..)(..)(..)(..)') - a = hex2dec(a,true) - pageresources(a) - end - else - return nil - end - r = hex2dec(r) - g = hex2dec(g) - b = hex2dec(b) - if a then - push = format('/TransGs%g gs %s %s %s rg', a, r, g, b) - pop = '0 g /TransGs1 gs' - else - push = format('%s %s %s rg', r, g, b) - pop = '0 g' - end - return push, pop -end - -local glyph = node.id('glyph') -local hlist = node.id('hlist') -local vlist = node.id('vlist') -local whatsit = node.id('whatsit') - -local function colorize(head) - for n in node.traverse(head) do - if n.id == hlist or n.id == vlist then - colorize(n.list) - end - if n.id == glyph then - local tfmdata = fonts.ids[n.font] - if tfmdata and tfmdata.color then - local prev = n.prev - local next = n.next - local pushcolor, popcolor = hex_to_rgba(tfmdata.color) - if prev.id == glyph and fonts.ids[prev.font].color == tfmdata.color then - else - local push = node.new(whatsit, 8) - push.mode = 1 - push.data = pushcolor - head = node.insert_before(head, n, push) - end - if next.id == glyph and fonts.ids[next.font].color == tfmdata.color then - else - local pop = node.new(whatsit, 8) - pop.mode = 1 - pop.data = popcolor - head = node.insert_after(head, n, pop) - end - end - end - end - return head -end - -local function finalize(head) - if res then - tex.pdfpageresources = format("%s\n/ExtGState<<%s>>", tex.pdfpageresources, res) - end - 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 -%</font-msc> -% \fi -% % \section{\texttt{luaotfload.sty}} % % \iffalse diff --git a/otfl-font-msc.lua b/otfl-font-msc.lua new file mode 100644 index 0000000..00697f2 --- /dev/null +++ b/otfl-font-msc.lua @@ -0,0 +1,159 @@ +if not modules then modules = { } end modules ['font-msc'] = { + version = 1.001, + comment = "companion to font-otf.lua (miscellaneous)", + author = "Khaled Hosny", + copyright = "Khaled Hosny", + license = "GPL" +} + +--[[ + Support for font slanting and extending. +--]] + +fonts.triggers = fonts.triggers or { } +fonts.initializers = fonts.initializers or { } +fonts.initializers.common = fonts.initializers.common or { } + +local initializers, format = fonts.initializers, string.format + +table.insert(fonts.triggers,"slant") + +function fonts.initializers.common.slant(tfmdata,value) + value = tonumber(value) + if not value then + value = 0 + elseif value > 1 then + value = 1 + elseif value < -1 then + value = -1 + end + tfmdata.slant_factor = value +end + +initializers.base.otf.slant = initializers.common.slant +initializers.node.otf.slant = initializers.common.slant + +table.insert(fonts.triggers,"extend") + +function initializers.common.extend(tfmdata,value) + value = tonumber(value) + if not value then + value = 0 + elseif value > 10 then + value = 10 + elseif value < -10 then + value = -10 + end + tfmdata.extend_factor = value +end + +initializers.base.otf.extend = initializers.common.extend +initializers.node.otf.extend = initializers.common.extend + +--[[ + Support for font color. +--]] + +table.insert(fonts.triggers,"color") + +function initializers.common.color(tfmdata,value) + if value then + tfmdata.color = value + end +end + +initializers.base.otf.color = initializers.common.color +initializers.node.otf.color = initializers.common.color + +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 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('(..)(..)(..)') + elseif #hex == 8 then + _, _, r, g, b, a = hex:find('(..)(..)(..)(..)') + a = hex2dec(a,true) + pageresources(a) + end + else + return nil + end + r = hex2dec(r) + g = hex2dec(g) + b = hex2dec(b) + if a then + push = format('/TransGs%g gs %s %s %s rg', a, r, g, b) + pop = '0 g /TransGs1 gs' + else + push = format('%s %s %s rg', r, g, b) + pop = '0 g' + end + return push, pop +end + +local glyph = node.id('glyph') +local hlist = node.id('hlist') +local vlist = node.id('vlist') +local whatsit = node.id('whatsit') + +local function colorize(head) + for n in node.traverse(head) do + if n.id == hlist or n.id == vlist then + colorize(n.list) + end + if n.id == glyph then + local tfmdata = fonts.ids[n.font] + if tfmdata and tfmdata.color then + local prev = n.prev + local next = n.next + local pushcolor, popcolor = hex_to_rgba(tfmdata.color) + if prev.id == glyph and fonts.ids[prev.font].color == tfmdata.color then + else + local push = node.new(whatsit, 8) + push.mode = 1 + push.data = pushcolor + head = node.insert_before(head, n, push) + end + if next.id == glyph and fonts.ids[next.font].color == tfmdata.color then + else + local pop = node.new(whatsit, 8) + pop.mode = 1 + pop.data = popcolor + head = node.insert_after(head, n, pop) + end + end + end + end + return head +end + +local function finalize(head) + if res then + tex.pdfpageresources = format("%s\n/ExtGState<<%s>>", tex.pdfpageresources, res) + end + 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") + |