diff options
Diffstat (limited to 'tex/context/base/font-fbk.lua')
-rw-r--r-- | tex/context/base/font-fbk.lua | 608 |
1 files changed, 304 insertions, 304 deletions
diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua index 48e2167e6..32e5d16de 100644 --- a/tex/context/base/font-fbk.lua +++ b/tex/context/base/font-fbk.lua @@ -1,304 +1,304 @@ -if not modules then modules = { } end modules ['font-fbk'] = { - version = 1.001, - comment = "companion to font-ini.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - -local cos, tan, rad, format = math.cos, math.tan, math.rad, string.format -local utfbyte, utfchar = utf.byte, utf.char - ---[[ldx-- -<p>This is very experimental code!</p> ---ldx]]-- - -local trace_combining_visualize = false trackers.register("fonts.composing.visualize", function(v) trace_combining_visualize = v end) -local trace_combining_define = false trackers.register("fonts.composing.define", function(v) trace_combining_define = v end) - -trackers.register("fonts.combining", "fonts.composing.define") -- for old times sake (and manuals) -trackers.register("fonts.combining.all", "fonts.composing.*") -- for old times sake (and manuals) - -local report_combining = logs.reporter("fonts","combining") - -local force_combining = false -- just for demo purposes (see mk) - -local allocate = utilities.storage.allocate - -local fonts = fonts -local handlers = fonts.handlers -local constructors = fonts.constructors - -local registerotffeature = handlers.otf.features.register -local registerafmfeature = handlers.afm.features.register - -local unicodecharacters = characters.data -local unicodefallbacks = characters.fallbacks - -local vf = handlers.vf -local commands = vf.combiner.commands -local push = vf.predefined.push -local pop = vf.predefined.pop - -local force_composed = false -local cache = { } -- we could make these weak -local fraction = 0.15 -- 30 units for lucida - -local function composecharacters(tfmdata) - -- this assumes that slot 1 is self, there will be a proper self some day - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - local parameters = tfmdata.parameters - local properties = tfmdata.properties - local Xdesc = descriptions[utfbyte("X")] - local xdesc = descriptions[utfbyte("x")] - if Xdesc and xdesc then - local scale = parameters.factor or 1 - local deltaxheight = scale * (Xdesc.boundingbox[4] - xdesc.boundingbox[4]) - local extraxheight = fraction * deltaxheight -- maybe use compose value - local italicfactor = parameters.italicfactor or 0 - local vfspecials = backends.tables.vfspecials --brr - local red, green, blue, black - if trace_combining_visualize then - red = vfspecials.red - green = vfspecials.green - blue = vfspecials.blue - black = vfspecials.black - end - local compose = fonts.goodies.getcompositions(tfmdata) - if compose and trace_combining_visualize then - report_combining("using compose information from goodies file") - end - local done = false - for i, c in next, unicodecharacters do -- loop over all characters ... not that efficient but a specials hash takes memory - if force_combining or not characters[i] then - local s = c.specials - if s and s[1] == 'char' then - local chr = s[2] - local charschr = characters[chr] - if charschr then - local cc = c.category - if cc == 'll' or cc == 'lu' or cc == 'lt' then -- characters.is_letter[cc] - local acc = s[3] - local t = { } - for k, v in next, charschr do - if k ~= "commands" then - t[k] = v - end - end - local charsacc = characters[acc] - --~ local ca = charsacc.category - --~ if ca == "mn" then - --~ -- mark nonspacing - --~ elseif ca == "ms" then - --~ -- mark spacing combining - --~ elseif ca == "me" then - --~ -- mark enclosing - --~ else - if not charsacc then -- fallback accents - acc = unicodefallbacks[acc] - charsacc = acc and characters[acc] - end - local chr_t = cache[chr] - if not chr_t then - chr_t = {"slot", 1, chr} - cache[chr] = chr_t - end - if charsacc then - if trace_combining_define then - report_combining("composed %C, base %C, accent %C",i,chr,acc) - end - local acc_t = cache[acc] - if not acc_t then - acc_t = {"slot", 1, acc} - cache[acc] = acc_t - end - local cb = descriptions[chr].boundingbox - local ab = descriptions[acc].boundingbox - -- todo: adapt height - if cb and ab then - local c_llx, c_lly, c_urx, c_ury = scale*cb[1], scale*cb[2], scale*cb[3], scale*cb[4] - local a_llx, a_lly, a_urx, a_ury = scale*ab[1], scale*ab[2], scale*ab[3], scale*ab[4] - local done = false - if compose then - local i_compose = compose[i] - local i_anchored = i_compose and i_compose.anchored - if i_anchored then - local c_compose = compose[chr] - local a_compose = compose[acc] - local c_anchors = c_compose and c_compose.anchors - local a_anchors = a_compose and a_compose.anchors - if c_anchors and a_anchors then - local c_anchor = c_anchors[i_anchored] - local a_anchor = a_anchors[i_anchored] - if c_anchor and a_anchor then - local cx = c_anchor.x or 0 - local cy = c_anchor.y or 0 - local ax = a_anchor.x or 0 - local ay = a_anchor.y or 0 - local dx = cx - ax - local dy = cy - ay - if trace_combining_define then - report_combining("building %C from %C and %C",i,chr,acc) - report_combining(" boundingbox:") - report_combining(" chr: %3i %3i %3i %3i",unpack(cb)) - report_combining(" acc: %3i %3i %3i %3i",unpack(ab)) - report_combining(" anchors:") - report_combining(" chr: %3i %3i",cx,cy) - report_combining(" acc: %3i %3i",ax,ay) - report_combining(" delta:") - report_combining(" %s: %3i %3i",i_anchored,dx,dy) - end - if trace_combining_visualize then - t.commands = { push, {"right", scale*dx}, {"down",-scale*dy}, green, acc_t, black, pop, chr_t } - -- t.commands = { - -- push, {"right", scale*cx}, {"down", -scale*cy}, red, {"rule",10000,10000,10000}, pop, - -- push, {"right", scale*ax}, {"down", -scale*ay}, blue, {"rule",10000,10000,10000}, pop, - -- push, {"right", scale*dx}, {"down", -scale*dy}, green, acc_t, black, pop, chr_t - -- } - else - t.commands = { push, {"right", scale*dx}, {"down",-scale*dy}, acc_t, pop, chr_t } - end - done = true - end - end - end - end - if not done then - -- can be sped up for scale == 1 - local dx = (c_urx - a_urx - a_llx + c_llx)/2 - local dd = (c_urx - c_llx)*italicfactor - if a_ury < 0 then - if trace_combining_visualize then - t.commands = { push, {"right", dx-dd}, red, acc_t, black, pop, chr_t } - else - t.commands = { push, {"right", dx-dd}, acc_t, pop, chr_t } - end - elseif c_ury > a_lly then -- messy test - local dy - if compose then - -- experimental: we could use sx but all that testing - -- takes time and code - dy = compose[i] - if dy then - dy = dy.dy - end - if not dy then - dy = compose[acc] - if dy then - dy = dy and dy.dy - end - end - if not dy then - dy = compose.dy - end - if not dy then - dy = - deltaxheight + extraxheight - elseif dy > -1.5 and dy < 1.5 then - -- we assume a fraction of (percentage) - dy = - dy * deltaxheight - else - -- we assume fontunits (value smaller than 2 make no sense) - dy = - dy * scale - end - else - dy = - deltaxheight + extraxheight - end - if trace_combining_visualize then - t.commands = { push, {"right", dx+dd}, {"down", dy}, green, acc_t, black, pop, chr_t } - else - t.commands = { push, {"right", dx+dd}, {"down", dy}, acc_t, pop, chr_t } - end - else - if trace_combining_visualize then - t.commands = { push, {"right", dx+dd}, blue, acc_t, black, pop, chr_t } - else - t.commands = { push, {"right", dx+dd}, acc_t, pop, chr_t } - end - end - end - else - t.commands = { chr_t } -- else index mess - end - else - if trace_combining_define then - report_combining("%C becomes simplfied %C",i,chr) - end - t.commands = { chr_t } -- else index mess - end - done = true - characters[i] = t - local d = { } - for k, v in next, descriptions[chr] do - d[k] = v - end - descriptions[i] = d - end - end - end - end - end - if done then - properties.virtualized = true - end - end -end - -registerotffeature { - name = "compose", - description = "additional composed characters", - manipulators = { - base = composecharacters, - node = composecharacters, - } -} - -registerafmfeature { - name = "compose", - description = "additional composed characters", - manipulators = { - base = composecharacters, - node = composecharacters, - } -} - -vf.helpers.composecharacters = composecharacters - --- This installs the builder into the regular virtual font builder, --- which only makes sense as demo. - -commands["compose.trace.enable"] = function() - trace_combining_visualize = true -end - -commands["compose.trace.disable"] = function() - trace_combining_visualize = false -end - -commands["compose.force.enable"] = function() - force_combining = true -end - -commands["compose.force.disable"] = function() - force_combining = false -end - -commands["compose.trace.set"] = function(g,v) - if v[2] == nil then - trace_combining_visualize = true - else - trace_combining_visualize = v[2] - end -end - -commands["compose.apply"] = function(g,v) - composecharacters(g) -end - --- vf builder - --- {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'}, --- {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'}, --- {'special', 'pdf: /Fm\XX\space Do'}, --- {'special', 'pdf: Q'}, --- {'special', 'pdf: Q'}, +if not modules then modules = { } end modules ['font-fbk'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local cos, tan, rad, format = math.cos, math.tan, math.rad, string.format
+local utfbyte, utfchar = utf.byte, utf.char
+
+--[[ldx--
+<p>This is very experimental code!</p>
+--ldx]]--
+
+local trace_combining_visualize = false trackers.register("fonts.composing.visualize", function(v) trace_combining_visualize = v end)
+local trace_combining_define = false trackers.register("fonts.composing.define", function(v) trace_combining_define = v end)
+
+trackers.register("fonts.combining", "fonts.composing.define") -- for old times sake (and manuals)
+trackers.register("fonts.combining.all", "fonts.composing.*") -- for old times sake (and manuals)
+
+local report_combining = logs.reporter("fonts","combining")
+
+local force_combining = false -- just for demo purposes (see mk)
+
+local allocate = utilities.storage.allocate
+
+local fonts = fonts
+local handlers = fonts.handlers
+local constructors = fonts.constructors
+
+local registerotffeature = handlers.otf.features.register
+local registerafmfeature = handlers.afm.features.register
+
+local unicodecharacters = characters.data
+local unicodefallbacks = characters.fallbacks
+
+local vf = handlers.vf
+local commands = vf.combiner.commands
+local push = vf.predefined.push
+local pop = vf.predefined.pop
+
+local force_composed = false
+local cache = { } -- we could make these weak
+local fraction = 0.15 -- 30 units for lucida
+
+local function composecharacters(tfmdata)
+ -- this assumes that slot 1 is self, there will be a proper self some day
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local parameters = tfmdata.parameters
+ local properties = tfmdata.properties
+ local Xdesc = descriptions[utfbyte("X")]
+ local xdesc = descriptions[utfbyte("x")]
+ if Xdesc and xdesc then
+ local scale = parameters.factor or 1
+ local deltaxheight = scale * (Xdesc.boundingbox[4] - xdesc.boundingbox[4])
+ local extraxheight = fraction * deltaxheight -- maybe use compose value
+ local italicfactor = parameters.italicfactor or 0
+ local vfspecials = backends.tables.vfspecials --brr
+ local red, green, blue, black
+ if trace_combining_visualize then
+ red = vfspecials.red
+ green = vfspecials.green
+ blue = vfspecials.blue
+ black = vfspecials.black
+ end
+ local compose = fonts.goodies.getcompositions(tfmdata)
+ if compose and trace_combining_visualize then
+ report_combining("using compose information from goodies file")
+ end
+ local done = false
+ for i, c in next, unicodecharacters do -- loop over all characters ... not that efficient but a specials hash takes memory
+ if force_combining or not characters[i] then
+ local s = c.specials
+ if s and s[1] == 'char' then
+ local chr = s[2]
+ local charschr = characters[chr]
+ if charschr then
+ local cc = c.category
+ if cc == 'll' or cc == 'lu' or cc == 'lt' then -- characters.is_letter[cc]
+ local acc = s[3]
+ local t = { }
+ for k, v in next, charschr do
+ if k ~= "commands" then
+ t[k] = v
+ end
+ end
+ local charsacc = characters[acc]
+ --~ local ca = charsacc.category
+ --~ if ca == "mn" then
+ --~ -- mark nonspacing
+ --~ elseif ca == "ms" then
+ --~ -- mark spacing combining
+ --~ elseif ca == "me" then
+ --~ -- mark enclosing
+ --~ else
+ if not charsacc then -- fallback accents
+ acc = unicodefallbacks[acc]
+ charsacc = acc and characters[acc]
+ end
+ local chr_t = cache[chr]
+ if not chr_t then
+ chr_t = {"slot", 1, chr}
+ cache[chr] = chr_t
+ end
+ if charsacc then
+ if trace_combining_define then
+ report_combining("composed %C, base %C, accent %C",i,chr,acc)
+ end
+ local acc_t = cache[acc]
+ if not acc_t then
+ acc_t = {"slot", 1, acc}
+ cache[acc] = acc_t
+ end
+ local cb = descriptions[chr].boundingbox
+ local ab = descriptions[acc].boundingbox
+ -- todo: adapt height
+ if cb and ab then
+ local c_llx, c_lly, c_urx, c_ury = scale*cb[1], scale*cb[2], scale*cb[3], scale*cb[4]
+ local a_llx, a_lly, a_urx, a_ury = scale*ab[1], scale*ab[2], scale*ab[3], scale*ab[4]
+ local done = false
+ if compose then
+ local i_compose = compose[i]
+ local i_anchored = i_compose and i_compose.anchored
+ if i_anchored then
+ local c_compose = compose[chr]
+ local a_compose = compose[acc]
+ local c_anchors = c_compose and c_compose.anchors
+ local a_anchors = a_compose and a_compose.anchors
+ if c_anchors and a_anchors then
+ local c_anchor = c_anchors[i_anchored]
+ local a_anchor = a_anchors[i_anchored]
+ if c_anchor and a_anchor then
+ local cx = c_anchor.x or 0
+ local cy = c_anchor.y or 0
+ local ax = a_anchor.x or 0
+ local ay = a_anchor.y or 0
+ local dx = cx - ax
+ local dy = cy - ay
+ if trace_combining_define then
+ report_combining("building %C from %C and %C",i,chr,acc)
+ report_combining(" boundingbox:")
+ report_combining(" chr: %3i %3i %3i %3i",unpack(cb))
+ report_combining(" acc: %3i %3i %3i %3i",unpack(ab))
+ report_combining(" anchors:")
+ report_combining(" chr: %3i %3i",cx,cy)
+ report_combining(" acc: %3i %3i",ax,ay)
+ report_combining(" delta:")
+ report_combining(" %s: %3i %3i",i_anchored,dx,dy)
+ end
+ if trace_combining_visualize then
+ t.commands = { push, {"right", scale*dx}, {"down",-scale*dy}, green, acc_t, black, pop, chr_t }
+ -- t.commands = {
+ -- push, {"right", scale*cx}, {"down", -scale*cy}, red, {"rule",10000,10000,10000}, pop,
+ -- push, {"right", scale*ax}, {"down", -scale*ay}, blue, {"rule",10000,10000,10000}, pop,
+ -- push, {"right", scale*dx}, {"down", -scale*dy}, green, acc_t, black, pop, chr_t
+ -- }
+ else
+ t.commands = { push, {"right", scale*dx}, {"down",-scale*dy}, acc_t, pop, chr_t }
+ end
+ done = true
+ end
+ end
+ end
+ end
+ if not done then
+ -- can be sped up for scale == 1
+ local dx = (c_urx - a_urx - a_llx + c_llx)/2
+ local dd = (c_urx - c_llx)*italicfactor
+ if a_ury < 0 then
+ if trace_combining_visualize then
+ t.commands = { push, {"right", dx-dd}, red, acc_t, black, pop, chr_t }
+ else
+ t.commands = { push, {"right", dx-dd}, acc_t, pop, chr_t }
+ end
+ elseif c_ury > a_lly then -- messy test
+ local dy
+ if compose then
+ -- experimental: we could use sx but all that testing
+ -- takes time and code
+ dy = compose[i]
+ if dy then
+ dy = dy.dy
+ end
+ if not dy then
+ dy = compose[acc]
+ if dy then
+ dy = dy and dy.dy
+ end
+ end
+ if not dy then
+ dy = compose.dy
+ end
+ if not dy then
+ dy = - deltaxheight + extraxheight
+ elseif dy > -1.5 and dy < 1.5 then
+ -- we assume a fraction of (percentage)
+ dy = - dy * deltaxheight
+ else
+ -- we assume fontunits (value smaller than 2 make no sense)
+ dy = - dy * scale
+ end
+ else
+ dy = - deltaxheight + extraxheight
+ end
+ if trace_combining_visualize then
+ t.commands = { push, {"right", dx+dd}, {"down", dy}, green, acc_t, black, pop, chr_t }
+ else
+ t.commands = { push, {"right", dx+dd}, {"down", dy}, acc_t, pop, chr_t }
+ end
+ else
+ if trace_combining_visualize then
+ t.commands = { push, {"right", dx+dd}, blue, acc_t, black, pop, chr_t }
+ else
+ t.commands = { push, {"right", dx+dd}, acc_t, pop, chr_t }
+ end
+ end
+ end
+ else
+ t.commands = { chr_t } -- else index mess
+ end
+ else
+ if trace_combining_define then
+ report_combining("%C becomes simplfied %C",i,chr)
+ end
+ t.commands = { chr_t } -- else index mess
+ end
+ done = true
+ characters[i] = t
+ local d = { }
+ for k, v in next, descriptions[chr] do
+ d[k] = v
+ end
+ descriptions[i] = d
+ end
+ end
+ end
+ end
+ end
+ if done then
+ properties.virtualized = true
+ end
+ end
+end
+
+registerotffeature {
+ name = "compose",
+ description = "additional composed characters",
+ manipulators = {
+ base = composecharacters,
+ node = composecharacters,
+ }
+}
+
+registerafmfeature {
+ name = "compose",
+ description = "additional composed characters",
+ manipulators = {
+ base = composecharacters,
+ node = composecharacters,
+ }
+}
+
+vf.helpers.composecharacters = composecharacters
+
+-- This installs the builder into the regular virtual font builder,
+-- which only makes sense as demo.
+
+commands["compose.trace.enable"] = function()
+ trace_combining_visualize = true
+end
+
+commands["compose.trace.disable"] = function()
+ trace_combining_visualize = false
+end
+
+commands["compose.force.enable"] = function()
+ force_combining = true
+end
+
+commands["compose.force.disable"] = function()
+ force_combining = false
+end
+
+commands["compose.trace.set"] = function(g,v)
+ if v[2] == nil then
+ trace_combining_visualize = true
+ else
+ trace_combining_visualize = v[2]
+ end
+end
+
+commands["compose.apply"] = function(g,v)
+ composecharacters(g)
+end
+
+-- vf builder
+
+-- {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'},
+-- {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'},
+-- {'special', 'pdf: /Fm\XX\space Do'},
+-- {'special', 'pdf: Q'},
+-- {'special', 'pdf: Q'},
|