From 3a048d406386e8b8eb5c1315e57d271237da89be Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 8 Jan 2021 12:27:53 +0100 Subject: 2021-01-08 11:47:00 --- tex/context/base/mkii/cont-new.mkii | 2 +- tex/context/base/mkii/context.mkii | 2 +- tex/context/base/mkiv/cont-new.mkiv | 2 +- tex/context/base/mkiv/context.mkiv | 2 +- tex/context/base/mkiv/status-files.pdf | Bin 26130 -> 26128 bytes tex/context/base/mkiv/status-lua.pdf | Bin 253886 -> 253881 bytes tex/context/base/mkxl/cont-new.mkxl | 2 +- tex/context/base/mkxl/context.mkxl | 2 +- tex/context/base/mkxl/font-ctx.lmt | 42 +++++++++++------ tex/context/base/mkxl/font-glf.mklx | 50 +++++++-------------- tex/context/base/mkxl/font-ini.mklx | 22 +++++++-- tex/context/base/mkxl/font-ots.lmt | 50 ++++++++------------- tex/generic/context/luatex/luatex-fonts-merged.lua | 2 +- 13 files changed, 88 insertions(+), 90 deletions(-) diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index d4a5fdb76..ea233b8d2 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2021.01.07 16:56} +\newcontextversion{2021.01.08 11:44} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 1d1031281..ea64e263e 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2021.01.07 16:56} +\edef\contextversion{2021.01.08 11:44} %D For those who want to use this: diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index cf07d5340..da0388cf0 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -13,7 +13,7 @@ % \normalend % uncomment this to get the real base runtime -\newcontextversion{2021.01.07 16:56} +\newcontextversion{2021.01.08 11:44} %D This file is loaded at runtime, thereby providing an excellent place for hacks, %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 10c8b1fdf..23eabed71 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -45,7 +45,7 @@ %D {YYYY.MM.DD HH:MM} format. \edef\contextformat {\jobname} -\edef\contextversion{2021.01.07 16:56} +\edef\contextversion{2021.01.08 11:44} %D Kind of special: diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf index 154b18975..74deffd1f 100644 Binary files a/tex/context/base/mkiv/status-files.pdf and b/tex/context/base/mkiv/status-files.pdf differ diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf index 9434bf9cd..27cd2367e 100644 Binary files a/tex/context/base/mkiv/status-lua.pdf and b/tex/context/base/mkiv/status-lua.pdf differ diff --git a/tex/context/base/mkxl/cont-new.mkxl b/tex/context/base/mkxl/cont-new.mkxl index 700283051..376101d29 100644 --- a/tex/context/base/mkxl/cont-new.mkxl +++ b/tex/context/base/mkxl/cont-new.mkxl @@ -13,7 +13,7 @@ % \normalend % uncomment this to get the real base runtime -\newcontextversion{2021.01.07 16:56} +\newcontextversion{2021.01.08 11:44} %D This file is loaded at runtime, thereby providing an excellent place for hacks, %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkxl/context.mkxl b/tex/context/base/mkxl/context.mkxl index 1a20d3a85..10674b4ee 100644 --- a/tex/context/base/mkxl/context.mkxl +++ b/tex/context/base/mkxl/context.mkxl @@ -29,7 +29,7 @@ %D {YYYY.MM.DD HH:MM} format. \immutable\edef\contextformat {\jobname} -\immutable\edef\contextversion{2021.01.07 16:56} +\immutable\edef\contextversion{2021.01.08 11:44} %overloadmode 1 % check frozen / warning %overloadmode 2 % check frozen / error diff --git a/tex/context/base/mkxl/font-ctx.lmt b/tex/context/base/mkxl/font-ctx.lmt index c59f4c9e7..3dbf7bbbd 100644 --- a/tex/context/base/mkxl/font-ctx.lmt +++ b/tex/context/base/mkxl/font-ctx.lmt @@ -31,7 +31,7 @@ local round = math.round local context, commands = context, commands -local P, S, C, Cc, Cf, Cg, Ct, lpegmatch = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.match +local P, R, S, C, Cc, Cf, Cg, Ct, Cs, lpegmatch = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.Cs, lpeg.match local trace_features = false trackers.register("fonts.features", function(v) trace_features = v end) local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) @@ -1038,8 +1038,12 @@ definers.registersplit(":",colonized,"direct") local sizepattern, splitpattern, specialscale do + -- todo: use lpeg.patterns + ----- space = P(" ") ----- spaces = space^0 + local digit = R('09') + local period = P(".") local leftparent = (P"(") local rightparent = (P")") local leftbrace = (P"{") @@ -1047,27 +1051,31 @@ local sizepattern, splitpattern, specialscale do local withinparents = leftparent * (1-rightparent)^0 * rightparent local withinbraces = leftbrace * (1-rightbrace )^0 * rightbrace local value = C((withinparents + withinbraces + (1-space))^1) - local dimension = C((space/"" + P(1))^1) + -- local dimension = C((space/"" + P(1))^1) + local dimension = Cs((digit+period)^1 * (spaces/"") * (P(1)-digit)^0) +-- local scaler = C((digit+period)^1) + local scaler = lpeg.patterns.unsigned/function(s) return round(tonumber(s)*1000) end + + C(lpeg.patterns.cardinal) local rest = C(P(1)^0) - local scale_none = Cc(0) - local scale_at = (P("at") +P("@")) * Cc(1) * spaces * dimension -- dimension - local scale_sa = P("sa") * Cc(2) * spaces * dimension -- number - local scale_mo = P("mo") * Cc(3) * spaces * dimension -- number - local scale_scaled = P("scaled") * Cc(4) * spaces * dimension -- number - local scale_ht = P("ht") * Cc(5) * spaces * dimension -- dimension - local scale_cp = P("cp") * Cc(6) * spaces * dimension -- dimension + local scale_none = Cc(0) + local scale_at = (P("at") + P("@")) * Cc(1) * spaces * dimension -- dimension + local scale_sa = P("sa") * Cc(2) * spaces * dimension -- number + local scale_mo = P("mo") * Cc(3) * spaces * dimension -- number + local scale_scaled = P("scaled") * Cc(4) * spaces * dimension -- number + local scale_ht = P("ht") * Cc(5) * spaces * dimension -- dimension + local scale_cp = P("cp") * Cc(6) * spaces * dimension -- dimension specialscale = { [5] = "ht", [6] = "cp" } - sizepattern = spaces * (scale_at + scale_sa + scale_mo + scale_ht + scale_cp + scale_scaled + scale_none) + sizepattern = spaces * ((scale_at + scale_sa + scale_mo + scale_ht + scale_cp + scale_scaled) * (spaces * scaler)^0 + scale_none) splitpattern = spaces * value * spaces * rest end function helpers.splitfontpattern(str) local name, size = lpegmatch(splitpattern,str) - local kind, size = lpegmatch(sizepattern,size) - return name, kind, size + local kind, size = lpegmatch(sizepattern,size) -- sx, sy + return name, kind, size -- sx, sy end function helpers.fontpatternhassize(str) @@ -1124,13 +1132,19 @@ do -- else too many locals end -- we can also use a count for the size if size and size ~= "" then - local mode, size = lpegmatch(sizepattern,size) - if size and mode then + local mode, size, sx, sy = lpegmatch(sizepattern,size) + if mode and size and size ~= "" then texsetcount("scaledfontmode",mode) -- ctx_setsomefontsize(size) -- We use a catcodetable, just in case it's 1.2\exheight (a corner case that showed -- up in the lmtx manual: marking that changed size in the mids of some verbatim). setmacro(ctxcatcodes,"somefontsize",size) + if sx then + setmacro("somefontsizex",sx) + end + if sy then + setmacro("somefontsizey",sy) + end else texsetcount("scaledfontmode",0) -- ctx_setemptyfontsize() diff --git a/tex/context/base/mkxl/font-glf.mklx b/tex/context/base/mkxl/font-glf.mklx index ba950feea..023c632dc 100644 --- a/tex/context/base/mkxl/font-glf.mklx +++ b/tex/context/base/mkxl/font-glf.mklx @@ -17,43 +17,25 @@ %D Experiment: -\installcorenamespace{scaledfont} -\installcorenamespace{scaledfontxscale} -\installcorenamespace{scaledfontyscale} +\installcorenamespace{tweakedfont} -\installcommandhandler \??scaledfont {scaledfont} \??scaledfont +\installcommandhandler \??tweakedfont {tweakedfont} \??tweakedfont \appendtoks - \ifempty\currentscaledfont\else - \expandafter\integerdef\csname\??scaledfontxscale\currentscaledfont\endcsname\numericscale\scaledfontparameter\c!xscale\relax - \expandafter\integerdef\csname\??scaledfontyscale\currentscaledfont\endcsname\numericscale\scaledfontparameter\c!yscale\relax - \fi -\to \everysetupscaledfont - -\integerdef\bodyglyphscale\plusthousand - -\appendtoks - \expandafter\integerdef\csname\??scaledfontxscale\currentscaledfont\endcsname\numericscale\scaledfontparameter\c!xscale\relax - \expandafter\integerdef\csname\??scaledfontyscale\currentscaledfont\endcsname\numericscale\scaledfontparameter\c!yscale\relax - \overloaded\frozen\protected\edefcsname\currentscaledfont\endcsname - {\glyphxscale\numexpr\csname\??scaledfontxscale\currentscaledfont\endcsname*\bodyglyphscale/\plusthousand\relax - \glyphyscale\numexpr\csname\??scaledfontyscale\currentscaledfont\endcsname*\bodyglyphscale/\plusthousand\relax - \begincsname\scaledfontparameter\c!style\endcsname}% -\to \everydefinescaledfont - -\setupscaledfont + % we can optimize for zero and 1000 .. maybe also options? + \overloaded\frozen\protected\edefcsname\currenttweakedfont\endcsname + {\begincsname\tweakedfontparameter\c!style\endcsname + \glyphxscale \numexpr\glyphxscale *\numericscale\tweakedfontparameter\c!xscale /\plusthousand\relax + \glyphyscale \numexpr\glyphyscale *\numericscale\tweakedfontparameter\c!yscale /\plusthousand\relax + \glyphxoffset\dimexpr\glyphxoffset+\tweakedfontparameter\c!xoffset\relax + \glyphyoffset\dimexpr\glyphyoffset+\tweakedfontparameter\c!yoffset\relax}% +\to \everydefinetweakedfont + +\setuptweakedfont [\c!scale=\plusthousand, - \c!xscale=\scaledfontparameter\c!scale, - \c!yscale=\scaledfontparameter\c!scale] - -% \installcorenamespace{scaledfontbody} -% -% \permanent\protected\def\definescaledfontbody[#1]#*[#2]% only for testing -% {%\expandafter\integerdef\csname\??scaledfontbody#1\endcsname\integerdef\bodyglyphscale\numericscale#2\relax -% \frozen\protected\defcsname#1\endcsname% -% {\integerdef\bodyglyphscale\numericscale#2\relax -% \glyphxscale\bodyglyphscale -% \glyphyscale\bodyglyphscale -% \the\everybodyfont}} + \c!xscale=\tweakedfontparameter\c!scale, + \c!yscale=\tweakedfontparameter\c!scale, + \c!xoffset=\zeropoint, + \c!yoffset=\zeropoint] \protect \endinput diff --git a/tex/context/base/mkxl/font-ini.mklx b/tex/context/base/mkxl/font-ini.mklx index ea049bc38..764fbfdab 100644 --- a/tex/context/base/mkxl/font-ini.mklx +++ b/tex/context/base/mkxl/font-ini.mklx @@ -657,9 +657,11 @@ \permanent\def\safontscale{\number\dimexpr\v_font_size_absolute\relax} \permanent\def\mofontscale{\number\dimexpr\font_basics_set_mapped_fontsize\v_font_size_absolute\relax} -\mutable\let\somefontname\s!unknown -\mutable\let\somefontspec\s!unknown -\mutable\let\somefontsize\zerocount +\mutable\let\somefontname \s!unknown +\mutable\let\somefontspec \s!unknown +\mutable\let\somefontsize \zerocount +\mutable\let\somefontsizey\empty +\mutable\let\somefontsizey\empty \newcount\scaledfontmode % also used at the lua end \newcount\scaledfontsize % also used at the lua end @@ -705,6 +707,8 @@ {% we can now set more at the lua end \glet\somefontname\defaultfontfile \let\somefontsize\empty + \let\somefontsizex\empty + \let\somefontsizey\empty \clf_definefont_one{\detokenize\expandafter{\normalexpanded{#specification}}}% the escapestring catches at \somedimen % sets \scaledfontmode and \somefontname and \somefontsize \ifcase\fontface\relax @@ -818,6 +822,8 @@ {% we can now set more at the lua end \glet\somefontname\defaultfontfile \let\somefontsize\empty + \let\somefontsizex\empty + \let\somefontsizey\empty \clf_definefont_one{\detokenize\expandafter{\normalexpanded{#specification}}}% the escapestring catches at \somedimen % sets \scaledfontmode and \somefontname and \somefontsize \ifcase\fontface\relax @@ -941,10 +947,18 @@ \else \c_font_future_glyph_scale \fi + \ifempty\somefontsizex\else + \edef\somefontsizex{\glyphxscale\somefontsizex\relax}% todo: inserts relax + \fi + \ifempty\somefontsizey\else + \edef\somefontsizey{\glyphyscale\somefontsizey\relax}% + \fi \ifempty\fontclass\else\global\fi \protected\edefcsname#csname\endcsname {\setfontid\the\fontid\csname#csname\endcsname\relax - \glyphscale\the\glyphscale\relax}% + \glyphscale\the\glyphscale\relax + \somefontsizex + \somefontsizey}% % \expandafter\let\expandafter\lastrawfontcall\csname#csname\endcsname \the\everydefinefont diff --git a/tex/context/base/mkxl/font-ots.lmt b/tex/context/base/mkxl/font-ots.lmt index 578e661eb..37f76b258 100644 --- a/tex/context/base/mkxl/font-ots.lmt +++ b/tex/context/base/mkxl/font-ots.lmt @@ -792,7 +792,6 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip if lg then stop = current ligature = lg - -- current = getnext(current) current = nxt else break @@ -869,7 +868,8 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip match = true end end - if not match and (not pre or not replace) then + -- is this test ok: + if not match and not pre or not replace then local nxt, char = isnextchar(getnext(discfound),currentfont,currentdynamic,currentscale,currentxscale,currentyscale) if char and ligature[char] then match = true @@ -1540,7 +1540,7 @@ function chainprocs.gsub_ligature(head,start,stop,dataset,sequence,currentlookup -- else current = nxt -- end - else + else local lg = ligatures[schar] if lg then ligatures = lg @@ -2515,10 +2515,10 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s end checkdisc = getprev(head) end - local currentfont = currentfont -- really ? - local currentscale = currentscale -- really ? - local currentxscale = currentxscale -- really ? - local currentyscale = currentyscale -- really ? + -- local currentfont = currentfont -- really ? + -- local currentscale = currentscale -- really ? + -- local currentxscale = currentxscale -- really ? + -- local currentyscale = currentyscale -- really ? local skipped -- = false @@ -2576,11 +2576,9 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end - -- last = getnext(last) last = nxt elseif seq[n][char] then if n < l then - -- last = getnext(last) last = nxt end n = n + 1 @@ -2657,7 +2655,6 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s end end -- maybe only if match - -- last = getnext(last) last = nxt else goto next @@ -2688,11 +2685,9 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end - -- prev = getprev(prev) prev = prv elseif seq[n][char] then if n > 1 then - -- prev = getprev(prev) prev = prv end n = n - 1 @@ -2776,20 +2771,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s -- elseif id == glue_code and seq[n][32] and isspace(prev,threshold,id) then -- elseif seq[n][32] and spaces[prev] then -- n = n - 1 - -- -- prev = getprev(prev) -- prev = prv elseif id == glue_code then local sn = seq[n] if (sn[32] and spaces[prev]) or sn[0xFFFC] then n = n - 1 - -- prev = getprev(prev) prev = prv else goto next end elseif seq[n][0xFFFC] then n = n - 1 - -- prev = getprev(prev) prev = prv else goto next @@ -2825,11 +2817,10 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s if trace_skips then show_skip(dataset,sequence,char,ck,classes[char]) end - -- current = getnext(current) -- was absent current = nxt -- was absent elseif seq[n][char] then if n < s then -- new test - current = getnext(current) -- was absent + current = nxt -- was absent end n = n + 1 elseif discfound then @@ -2861,6 +2852,7 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s notmatchpost[current] = true notmatchreplace[current] = nil local pre, post, replace = getdisc(current) + -- no detailed checking here, todo ? if pre then local n = n while pre do @@ -2909,14 +2901,12 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s local sn = seq[n] if (sn[32] and spaces[current]) or sn[0xFFFC] then n = n + 1 - -- current = getnext(current) current = nxt else goto next end elseif seq[n][0xFFFC] then n = n + 1 - -- current = getnext(current) current = nxt else goto next @@ -3435,9 +3425,11 @@ local function c_run_single(head,lookupcache,step,dataset,sequence,rlmode,skipha if ok then done = true end - end - if start then - start = getnext(start) + if start then + start = getnext(start) + end + else + start = nxt end elseif char == false then return head, done @@ -3445,7 +3437,7 @@ local function c_run_single(head,lookupcache,step,dataset,sequence,rlmode,skipha -- else we loose the rest return head, done else - -- in disc component + -- in disc component ... really? start = nxt end end @@ -3460,7 +3452,7 @@ local function t_run_single(start,stop,lookupcache) local lookupmatch = lookupcache[char] if lookupmatch then -- hm, hyphens can match (tlig) so we need to really check -- if we need more than ligatures we can outline the code and use functions - local s = startnext + local s = nxt local ss = nil local sstop = s == stop if not s then @@ -3519,7 +3511,7 @@ local function t_run_single(start,stop,lookupcache) if lastd then return lastd else - start = startnext + start = nxt end else break @@ -4091,13 +4083,12 @@ do local position = 0 while start do - local nxt, char, id = isnextchar(start,currentfont,currentdynamic,currentscale,currentxscale,currentyscale) + local nxt, char, id = isnextchar(start,currentfont,currentdynamic) if char then position = position + 1 local m = merged[char] if m then if skiphash and skiphash[char] then -- we never needed it here but let's try - -- start = getnext(start) start = nxt else for i=m[1],m[2] do @@ -4105,6 +4096,7 @@ do local lookupcache = step.coverage local lookupmatch = lookupcache[char] if lookupmatch then + currentscale, currentxscale, currentyscale = getscales(start) local ok head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step) if ok then @@ -4129,20 +4121,16 @@ do end elseif char == false or id == glue_code then -- a different font|state or glue (happens often) - -- start = getnext(start) start = nxt elseif id == math_code then start = getnext(end_of_math(start)) elseif id == dir_code then topstack, rlmode = txtdirstate(start,dirstack,topstack,rlparmode) - -- start = getnext(start) start = nxt -- elseif id == par_code and start_of_par(start) then -- rlparmode, rlmode = pardirstate(start) - -- -- start = getnext(start) -- start = nxt else - -- start = getnext(start) start = nxt end end diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index dde25ac75..f987a7c06 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 : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 2021-01-07 16:56 +-- merge date : 2021-01-08 11:44 do -- begin closure to overcome local limits and interference -- cgit v1.2.3