From c076033eae06ee3f30c02bfa4d529001379eff6c Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 9 Dec 2014 23:07:55 +0100 Subject: [fontloader] reorganize under the new import scheme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For better orientation, the fontloader tree now contains two subdirectories into which files have been reorganized: The two files required at runtime for the fontloader and luaotfload-tool are: × ``fontloader-basics-gen.lua`` × ``fontloader-fontloader.lua`` They are now kept in the ``src/fontloader/runtime/`` subdirectory. All other files from upstream are now located in ``src/fontloader/misc``. This includes a number of files that have not yet been part of Luaotfload. Currently, the *misc* set of files is not packaged along with Luaotfload. This may change in the future when there is an option to switch the merged fontloader for its constituent files, or even for upstream. --- src/fontloader/misc/fontloader-fonts-cbk.lua | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/fontloader/misc/fontloader-fonts-cbk.lua (limited to 'src/fontloader/misc/fontloader-fonts-cbk.lua') diff --git a/src/fontloader/misc/fontloader-fonts-cbk.lua b/src/fontloader/misc/fontloader-fonts-cbk.lua new file mode 100644 index 0000000..8632701 --- /dev/null +++ b/src/fontloader/misc/fontloader-fonts-cbk.lua @@ -0,0 +1,95 @@ +if not modules then modules = { } end modules ['luatex-fonts-cbk'] = { + version = 1.001, + comment = "companion to luatex-*.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if context then + texio.write_nl("fatal error: this module is not for context") + os.exit() +end + +local fonts = fonts +local nodes = nodes + +-- Fonts: (might move to node-gef.lua) + +local traverse_id = node.traverse_id +local glyph_code = nodes.nodecodes.glyph + +-- from now on we apply ligaturing and kerning here because it might interfere with complex +-- opentype discretionary handling where the base ligature pass expect some weird extra +-- pointers (which then confuse the tail slider that has some checking built in) + +local ligaturing = node.ligaturing +local kerning = node.kerning + +function node.ligaturing() texio.write_nl("warning: node.ligaturing is already applied") end +function node.kerning () texio.write_nl("warning: node.kerning is already applied") end + +function nodes.handlers.characters(head) + local fontdata = fonts.hashes.identifiers + if fontdata then + local usedfonts, basefonts, prevfont, basefont = { }, { }, nil, nil + for n in traverse_id(glyph_code,head) do + local font = n.font + if font ~= prevfont then + if basefont then + basefont[2] = n.prev + end + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] -- + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + else + basefont = { n, nil } + basefonts[#basefonts+1] = basefont + end + end + end + end + end + end + if next(usedfonts) then + for font, processors in next, usedfonts do + for i=1,#processors do + head = processors[i](head,font,0) or head + end + end + end + if #basefonts > 0 then + for i=1,#basefonts do + local range = basefonts[i] + local start, stop = range[1], range[2] + if stop then + ligaturing(start,stop) + kerning(start,stop) + else + ligaturing(start) + kerning(start) + end + end + end + return head, true + else + return head, false + end +end + +function nodes.simple_font_handler(head) +-- lang.hyphenate(head) + head = nodes.handlers.characters(head) + nodes.injections.handler(head) + nodes.handlers.protectglyphs(head) + -- head = node.ligaturing(head) + -- head = node.kerning(head) + return head +end -- cgit v1.2.3 From f9e8ebd7846583d696b4e9e7d6454475a38fd767 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 14 Dec 2014 11:00:07 +0100 Subject: [fontloader] sync with Context as of 2014-12-14 --- src/fontloader/misc/fontloader-fonts-cbk.lua | 53 ++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 10 deletions(-) (limited to 'src/fontloader/misc/fontloader-fonts-cbk.lua') diff --git a/src/fontloader/misc/fontloader-fonts-cbk.lua b/src/fontloader/misc/fontloader-fonts-cbk.lua index 8632701..965b968 100644 --- a/src/fontloader/misc/fontloader-fonts-cbk.lua +++ b/src/fontloader/misc/fontloader-fonts-cbk.lua @@ -18,21 +18,28 @@ local nodes = nodes local traverse_id = node.traverse_id local glyph_code = nodes.nodecodes.glyph +local disc_code = nodes.nodecodes.disc -- from now on we apply ligaturing and kerning here because it might interfere with complex -- opentype discretionary handling where the base ligature pass expect some weird extra -- pointers (which then confuse the tail slider that has some checking built in) -local ligaturing = node.ligaturing -local kerning = node.kerning +local ligaturing = node.ligaturing +local kerning = node.kerning -function node.ligaturing() texio.write_nl("warning: node.ligaturing is already applied") end -function node.kerning () texio.write_nl("warning: node.kerning is already applied") end +local basepass = true + +function nodes.handlers.setbasepass(v) + basepass = v +end function nodes.handlers.characters(head) local fontdata = fonts.hashes.identifiers if fontdata then - local usedfonts, basefonts, prevfont, basefont = { }, { }, nil, nil + local usedfonts = { } + local basefonts = { } + local prevfont = nil + local basefont = nil for n in traverse_id(glyph_code,head) do local font = n.font if font ~= prevfont then @@ -49,7 +56,7 @@ function nodes.handlers.characters(head) local processors = shared.processes if processors and #processors > 0 then usedfonts[font] = processors - else + elseif basepass then basefont = { n, nil } basefonts[#basefonts+1] = basefont end @@ -58,6 +65,30 @@ function nodes.handlers.characters(head) end end end + for d in traverse_id(disc_code,head) do + local r = d.replace + if r then + for n in traverse_id(glyph_code,r) do + local font = n.font + if font ~= prevfont then + prevfont = font + local used = usedfonts[font] + if not used then + local tfmdata = fontdata[font] -- + if tfmdata then + local shared = tfmdata.shared -- we need to check shared, only when same features + if shared then + local processors = shared.processes + if processors and #processors > 0 then + usedfonts[font] = processors + end + end + end + end + end + end + end + end if next(usedfonts) then for font, processors in next, usedfonts do for i=1,#processors do @@ -65,7 +96,7 @@ function nodes.handlers.characters(head) end end end - if #basefonts > 0 then + if basepass and #basefonts > 0 then for i=1,#basefonts do local range = basefonts[i] local start, stop = range[1], range[2] @@ -85,11 +116,13 @@ function nodes.handlers.characters(head) end function nodes.simple_font_handler(head) --- lang.hyphenate(head) + -- lang.hyphenate(head) head = nodes.handlers.characters(head) nodes.injections.handler(head) + if not basepass then + head = ligaturing(head) + head = kerning(head) + end nodes.handlers.protectglyphs(head) - -- head = node.ligaturing(head) - -- head = node.kerning(head) return head end -- cgit v1.2.3