From f861bacd6096d49a91faaeb5298864416e59bf8b Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 1 Oct 2013 20:00:29 +0300 Subject: beta 2013.10.01 19:00 --- tex/context/base/cont-new.mkiv | 2 +- tex/context/base/context-version.pdf | Bin 4113 -> 4118 bytes tex/context/base/context.mkiv | 2 +- tex/context/base/font-gds.lua | 38 +++++++++++ tex/context/base/font-odv.lua | 23 ++++--- tex/context/base/font-pre.mkiv | 2 + tex/context/base/meta-fnt.lua | 19 ++++-- tex/context/base/meta-pag.mkiv | 4 +- tex/context/base/mlib-pdf.lua | 22 ++++--- tex/context/base/status-files.pdf | Bin 24782 -> 24733 bytes tex/context/base/status-lua.log | 2 +- tex/context/base/typo-krn.lua | 71 ++++++++++++++------- tex/context/fonts/unifraktur.lfg | 17 +++++ tex/generic/context/luatex/luatex-fonts-merged.lua | 2 +- 14 files changed, 153 insertions(+), 51 deletions(-) create mode 100644 tex/context/fonts/unifraktur.lfg (limited to 'tex') diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 233482b35..5b54b459f 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2013.10.01 11:27} +\newcontextversion{2013.10.01 19:00} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf index 002df6dd6..224eaeec1 100644 Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index dc16c148b..20ba815f4 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -25,7 +25,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2013.10.01 11:27} +\edef\contextversion{2013.10.01 19:00} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/font-gds.lua b/tex/context/base/font-gds.lua index 1b2ac0009..284714261 100644 --- a/tex/context/base/font-gds.lua +++ b/tex/context/base/font-gds.lua @@ -832,3 +832,41 @@ registerotffeature { node = finalize, } } + +-- kern hackery + +local function setkeptligatures(tfmdata,scheme) + local goodies = tfmdata.goodies + if goodies then + for i=1,#goodies do + local g = goodies[i] + local letterspacing = g.letterspacing + if letterspacing then + local keptligatures = letterspacing.keptligatures + if keptligatures then + local unicodes = tfmdata.resources.unicodes + local hash = { } + for k, v in next, keptligatures do + local u = unicodes[k] + if u then + hash[u] = true + else + -- error: unknown name + end + end + tfmdata.properties.keptligatures = hash + end + end + end + end +end + +registerotffeature { + name = "keptligatures", + description = "kept ligatures in letterspacing", + default = true, + initializers = { + base = setkeptligatures, + node = setkeptligatures, + } +} diff --git a/tex/context/base/font-odv.lua b/tex/context/base/font-odv.lua index 7437bd8c3..69f74dfa5 100644 --- a/tex/context/base/font-odv.lua +++ b/tex/context/base/font-odv.lua @@ -133,7 +133,12 @@ replace_all_nbsp = function(head) -- delayed definition end local fontprocesses = fonts.hashes.processes -local xprocesscharacters = nodes.handlers.characters +local xprocesscharacters = nil + +xprocesscharacters = function(head,font) + xprocesscharacters = nodes.handlers.characters + return xprocesscharacters(head,font) +end local function processcharacters(head,font) return xprocesscharacters(head) @@ -559,7 +564,7 @@ local function deva_reorder(head,start,stop,font,attr,nbspaces) -- if syllable starts with Ra + H and script has 'Reph' then exclude Reph -- from candidates for base consonants if n == stop then - return head, stop + return head, stop, nbspaces end if n.next.char == c_zwj then current = start @@ -575,7 +580,7 @@ local function deva_reorder(head,start,stop,font,attr,nbspaces) stop = stop.prev head = remove_node(head,current) free_node(current) - return head, stop + return head, stop, nbspaces else nbspaces = nbspaces + 1 base = current @@ -592,7 +597,7 @@ local function deva_reorder(head,start,stop,font,attr,nbspaces) if next ~= stop and halant[next.char] then current = next next = current.next - local tmp = next.next + local tmp = next and next.next or nil -- needs checking local changestop = next == stop local tempcurrent = copy_node(next) local nextcurrent = copy_node(current) @@ -610,7 +615,9 @@ local function deva_reorder(head,start,stop,font,attr,nbspaces) current.char = tempcurrent.char -- (assumes that result of blwf consists of one node) local freenode = current.next current.next = tmp - tmp.prev = current + if tmp then + tmp.prev = current + end free_node(freenode) flush_list(tempcurrent) if changestop then @@ -1390,12 +1397,12 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pa current = start.next.next end - local function action(is_nbsp) + local function stand_alone(is_nbsp) if current == stop then stop = stop.prev head = remove_node(head,current) free_node(current) - return head, stop + return head, stop, nbspaces else if is_nbsp then nbspaces = nbspaces + 1 @@ -1473,7 +1480,7 @@ local function dev2_reorder(head,start,stop,font,attr,nbspaces) -- maybe do a pa if start[a_state] == s_rphf then start[a_state] = unsetvalue end - return head, stop + return head, stop, nbspaces else if base[a_state] then base[a_state] = unsetvalue diff --git a/tex/context/base/font-pre.mkiv b/tex/context/base/font-pre.mkiv index e58a3d1f5..63c0858d4 100644 --- a/tex/context/base/font-pre.mkiv +++ b/tex/context/base/font-pre.mkiv @@ -17,6 +17,8 @@ %D A basic set of features is defined here. +% rlig ccmp + \definefontfeature [always] [mode=auto, diff --git a/tex/context/base/meta-fnt.lua b/tex/context/base/meta-fnt.lua index 811690b69..0ebe8e0dc 100644 --- a/tex/context/base/meta-fnt.lua +++ b/tex/context/base/meta-fnt.lua @@ -28,20 +28,25 @@ metapost.fonts = metapost.fonts or { } local characters, descriptions = { }, { } local factor, code, slot, width, height, depth, total, variants = 100, { }, 0, 0, 0, 0, 0, 0, true --- A next version of mplib will provide the tfm font information which --- gives better glyph dimensions, plus additional kerning information. --- --- Somehow actualtext is not used for cut and paste ... in spite of what --- manuals say ... the usual compatibility mess I guess. +-- The next variant of ActualText is what Taco and I could come up with +-- eventually. As of September 2013 Acrobat copies okay, Summatra copies a +-- question mark, pdftotext injects an extra space and Okular adds a +-- newline plus space. + +-- return formatters["BT /Span << /ActualText (CONTEXT) >> BDC [] TJ % t EMC ET"](code) local function topdf(n,code) if n < 0x10000 then - return formatters["/Span << /ActualText >> BDC % t EMC"](n,code) + return formatters["BT /Span << /ActualText >> BDC [] TJ % t EMC ET"](n,code) else - return formatters["/Span << /ActualText >> BDC % t EMC"](n/1024+0xD800,n%1024+0xDC00,code) + return formatters["BT /Span << /ActualText >> BDC [] TJ % t EMC ET"](n/1024+0xD800,n%1024+0xDC00,code) end end +-- local function topdf(n,code) +-- return formatters["/Span << /ActualText (CTX) >> BDC % t EMC"](code) +-- end + local flusher = { startfigure = function(chrnum,llx,lly,urx,ury) code = { } diff --git a/tex/context/base/meta-pag.mkiv b/tex/context/base/meta-pag.mkiv index 7124902e7..a25353b18 100644 --- a/tex/context/base/meta-pag.mkiv +++ b/tex/context/base/meta-pag.mkiv @@ -41,7 +41,7 @@ % maybe always set as frozen anyway \startMPinitializations - def LoadPageState = + % def LoadPageState = OnRightPage:=\MPonrightpage; OnOddPage:=\MPonoddpage; RealPageNumber:=\the\realpageno; @@ -88,6 +88,8 @@ LayoutColumns:=\the\layoutcolumns; LayoutColumnDistance:=\the\layoutcolumndistance; LayoutColumnWidth:=\the\layoutcolumnwidth; + def LoadPageState = + % now always set .. this dummy can move to the mp code enddef; \stopMPinitializations diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua index 0115dfabe..8d7febf43 100644 --- a/tex/context/base/mlib-pdf.lua +++ b/tex/context/base/mlib-pdf.lua @@ -335,19 +335,23 @@ function metapost.flush(result,flusher,askedfig) local bbox = figure:boundingbox() local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4] local variables = { } + metapost.variables = variables + metapost.properties = { + llx = llx, + lly = lly, + urx = urx, + ury = ury, + slot = figure:charcode(), + width = figure:width(), + height = figure:height(), + depth = figure:depth(), + italic = figure:italcorr(), + } + -- replaced by the above metapost.llx = llx metapost.lly = lly metapost.urx = urx metapost.ury = ury - metapost.variables = variables --- todo (maybe the lib will change to charwd too): --- --- metapost.charcode = figure.charcode --- metapost.charwd = figure.width --- metapost.charht = figure.height --- metapost.chardp = figure.depth --- metapost.charic = figure.italic --- if urx < llx then -- invalid startfigure(fignum,0,0,0,0,"invalid",figure) diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index b8041dc9b..3825c5148 100644 Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ diff --git a/tex/context/base/status-lua.log b/tex/context/base/status-lua.log index 5008311ec..be7dbe7e1 100644 --- a/tex/context/base/status-lua.log +++ b/tex/context/base/status-lua.log @@ -1,6 +1,6 @@ (cont-yes.mkiv -ConTeXt ver: 2013.10.01 11:27 MKIV beta fmt: 2013.10.1 int: english/english +ConTeXt ver: 2013.10.01 19:00 MKIV beta fmt: 2013.10.1 int: english/english system > 'cont-new.mkiv' loaded (cont-new.mkiv) diff --git a/tex/context/base/typo-krn.lua b/tex/context/base/typo-krn.lua index a7f17e280..2fc3ff13e 100644 --- a/tex/context/base/typo-krn.lua +++ b/tex/context/base/typo-krn.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['typo-krn'] = { license = "see context related readme files" } +-- glue is still somewhat suboptimal + local next, type, tonumber = next, type, tonumber local utfchar = utf.char @@ -53,6 +55,8 @@ local fontdata = fonthashes.identifiers local chardata = fonthashes.characters local quaddata = fonthashes.quads local markdata = fonthashes.marks +local fontproperties = fonthashes.properties +local fontdescriptions = fonthashes.descriptions local v_max = interfaces.variables.max @@ -62,6 +66,9 @@ local typesetters = typesetters typesetters.kerns = typesetters.kerns or { } local kerns = typesetters.kerns +local report = logs.reporter("kerns") +local trace_ligatures = trackers.register("typesetters.kerns.ligatures",function(v) trace_ligatures = v end) + kerns.mapping = kerns.mapping or { } kerns.factors = kerns.factors or { } local a_kerns = attributes.private("kern") @@ -85,6 +92,26 @@ local gluefactor = 4 -- assumes quad = .5 enspace kerns.keepligature = false -- just for fun (todo: control setting with key/value) kerns.keeptogether = false -- just for fun (todo: control setting with key/value) +function kerns.keepligature(n) -- might become default + local f = n.font + local c = n.char + local k = fontproperties[f].keptligatures + if trace_ligatures then + -- mostly for identifying names as they get reported + local d = fontdescriptions[f][c].name + if k and k[c] then + report("font %s, glyph %a, slot %X -> kept ligature",f,d,c) + return true + else + report("font %s, glyph %a, slot %X -> split ligature",f,d,c) + end + else + if k and k[c] then + return true + end + end +end + -- can be optimized .. the prev thing .. but hardly worth the effort local function kern_injector(fillup,kern) @@ -133,30 +160,30 @@ local function do_process(head,force) -- todo: glue so that we can fully stretch if id == glyph_code then lastfont = start.font local c = start.components - if c then - if keepligature and keepligature(start) then - -- keep 'm + if not c then + -- fine + elseif keepligature and keepligature(start) then + -- keep 'm + else + c = do_process(c,attr) + local s = start + local p, n = s.prev, s.next + local tail = find_node_tail(c) + if p then + p.next = c + c.prev = p else - c = do_process(c,attr) - local s = start - local p, n = s.prev, s.next - local tail = find_node_tail(c) - if p then - p.next = c - c.prev = p - else - head = c - end - if n then - n.prev = tail - end - tail.next = n - start = c - s.components = nil - -- we now leak nodes ! - -- free_node(s) - done = true + head = c + end + if n then + n.prev = tail end + tail.next = n + start = c + s.components = nil + -- we now leak nodes ! + -- free_node(s) + done = true end local prev = start.prev if not prev then diff --git a/tex/context/fonts/unifraktur.lfg b/tex/context/fonts/unifraktur.lfg new file mode 100644 index 000000000..8b9b299f5 --- /dev/null +++ b/tex/context/fonts/unifraktur.lfg @@ -0,0 +1,17 @@ +return { + name = "unicode fraktur", + version = "1.00", + comment = "Goodies that complement unicode fraktur.", + author = "Hans Hagen", + copyright = "ConTeXt development team", + letterspacing = { + -- watch it: zwnj's are used (in the tounicodes too) + keptligatures = { + ["c_afii301_k.ccmp"] = true, -- ck + ["c_afii301_h.ccmp"] = true, -- ch + ["t_afii301_z.ccmp"] = true, -- tz + ["uniFB05"] = true, -- ſt + }, + } +} + diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 71b1a1e72..62f1b874c 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 10/01/13 11:27:38 +-- merge date : 10/01/13 19:00:22 do -- begin closure to overcome local limits and interference -- cgit v1.2.3