diff options
35 files changed, 1283 insertions, 587 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/luaotfload/luaotfload-tool.lua b/Build/source/texk/texlive/linked_scripts/luaotfload/luaotfload-tool.lua index 75144922799..60fa37e8b1d 100755 --- a/Build/source/texk/texlive/linked_scripts/luaotfload/luaotfload-tool.lua +++ b/Build/source/texk/texlive/linked_scripts/luaotfload/luaotfload-tool.lua @@ -2,13 +2,13 @@ ----------------------------------------------------------------------- -- FILE: luaotfload-tool.lua -- DESCRIPTION: database functionality --- REQUIREMENTS: luaotfload 2.9 +-- REQUIREMENTS: luaotfload 2.91 -- AUTHOR: Khaled Hosny, Élie Roux, Philipp Gesang -- LICENSE: GPL v2.0 ----------------------------------------------------------------------- luaotfload = luaotfload or { } -local version = "2.9" +local version = "2.91" luaotfload.version = version luaotfload.min_luatex_version = { 0, 95, 0 } luaotfload.self = "luaotfload-tool" diff --git a/Build/source/texk/texlive/linked_scripts/simpdftex/simpdftex b/Build/source/texk/texlive/linked_scripts/simpdftex/simpdftex index 28836cfc1fb..beff5ee57c3 100755 --- a/Build/source/texk/texlive/linked_scripts/simpdftex/simpdftex +++ b/Build/source/texk/texlive/linked_scripts/simpdftex/simpdftex @@ -119,9 +119,12 @@ # that do not support -n and this script will have to be changed # before it works on such a system. # 2018/09/19 Added --distilleropts optlist command line flag for -# options to be added to the distiller aapplication; +# options to be added to the distiller application; # e.g. "-dCompatibilityLevel=1.5 -dNOSAFER". # Removed uses of echo -n. +# 2018/09/24 Added -dCompatibilityLevel=15 into the distillerprog definition +# and removed quotes around execution of ${distillerprog} so it can +# contain options. # FEATURE: it seems -u +foo.map -u -foo.map does not work. So --extradvipsopts # cannot be used to remove a map from the standard list @@ -130,7 +133,7 @@ # i.e. foo.bar.bla gets you foo.bar.pdf not foo.bar.bla.pdf # Hint: Give all extensions explicitly on the command line -version='20180920' +version='20180924' calledas=`basename "$0"` if [ "${calledas}" = "simpdftex" ] then @@ -169,7 +172,7 @@ texpath=`dirname "$0"` #distillerfilter="yes" distillerpath="/usr/local/bin" #distillerprog="ps2pdf13" -distillerprog="ps2pdf" +distillerprog="ps2pdf -dCompatibilityLevel=1.5" distillerfilter="no" unset outdir debug="no" @@ -499,12 +502,12 @@ run_dvips() if [ "${distillerfilter}" = "yes" ]; then /bin/echo "### ${distillerprog} ${distilleroptions} <${psfile} >${pdffile}" - "${distillerprog}" ${distilleroptions} <"${psfile}" >"${pdffile}" || \ + ${distillerprog} ${distilleroptions} <"${psfile}" >"${pdffile}" || \ { /bin/echo "### FAILED to generate ${pdffile} (${status})" exit 1; } else /bin/echo "### ${distillerprog} ${distilleroptions} ${psfile} ${pdffile}" - "${distillerprog}" ${distilleroptions} "${psfile}" "${pdffile}" || \ + ${distillerprog} ${distilleroptions} "${psfile}" "${pdffile}" || \ { /bin/echo "### FAILED to generate ${pdffile} (${status})" exit 1; } fi diff --git a/Master/texmf-dist/doc/luatex/luaotfload/NEWS b/Master/texmf-dist/doc/luatex/luaotfload/NEWS index ff28406d0c1..153ba8d76c3 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/NEWS +++ b/Master/texmf-dist/doc/luatex/luaotfload/NEWS @@ -1,5 +1,9 @@ Change History -------------- +2018-10-03 luaotfload v2.91 + * solved copy & paste of variant glyphs, https://tex.stackexchange.com/questions/451442/localized-glyphs-locl-have-unicode-value-ufffd + * solved problem with PUA no longer accessible with \char, see https://github.com/u-fischer/luaotfload/issues/7 + 2018-09-21 luaotfload v2.9 * added various testfiles for the l3build system/travis tests to the github repository * solved a bug regarding directions https://github.com/u-fischer/lua-font-pond/issues/12 diff --git a/Master/texmf-dist/doc/luatex/luaotfload/README.md b/Master/texmf-dist/doc/luatex/luaotfload/README.md index 1b80398bcdd..02dab41a0d7 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/README.md +++ b/Master/texmf-dist/doc/luatex/luaotfload/README.md @@ -1,8 +1,8 @@ # The Luaotfload Package -VERSION: 2.9 +VERSION: 2.91 -DATE: 2018-09-24 +DATE: 2018-10-03 ## Description diff --git a/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf b/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf Binary files differindex 5dada16b980..4f7674ae8f4 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf +++ b/Master/texmf-dist/doc/luatex/luaotfload/filegraph.pdf diff --git a/Master/texmf-dist/doc/luatex/luaotfload/filegraph.tex b/Master/texmf-dist/doc/luatex/luaotfload/filegraph.tex index e37167400c5..33826e81be2 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/filegraph.tex +++ b/Master/texmf-dist/doc/luatex/luaotfload/filegraph.tex @@ -252,7 +252,7 @@ to[out=-90,in=180] (m17); to[out=0,in=-135] ++(5,1) to[out=45,in=0] (m12-4-1); \end{scope} -\begin{scope}[shift={([xshift=2cm,yshift=-3cm]current bounding box.north west)}] +\begin{scope}[shift={([xshift=2cm,yshift=-3cm]current bounding box.north west)},sharp corners] \marmot; \duck[invisible]; \node[anchor=south,draw,text width=3cm,shape=rectangle callout,font=\sffamily\scriptsize,align=center] diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf Binary files differindex c3fd47ce7ee..101d598121b 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf +++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-conf.pdf diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf Binary files differindex 75eaaaff1d8..465bd88204f 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf +++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.pdf diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex index f7ff510afef..5cde1893267 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex +++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-latex.tex @@ -49,7 +49,7 @@ citecolor=\primarycolor, pdftitle={The Luaotfload package}, pdfsubject={OpenType layout system for Plain TeX and LaTeX}, - pdfauthor={Elie Roux & Khaled Hosny & Philipp Gesang & Ulrike Fischer}, + pdfauthor={Elie Roux \& Khaled Hosny \& Philipp Gesang \& Ulrike Fischer}, pdfkeywords={luatex, lualatex, unicode, opentype} ]{hyperref} @@ -513,8 +513,17 @@ end \input {luaotfload-main.tex} \clearpage \includepdf[fitpaper,pagecommand={\label{file-graph}}]{filegraph} -\includepdf[pages=-]{luaotfload-conf.pdf} -\includepdf[pages=-]{luaotfload-tool.pdf} +\clearpage + +\includepdf[pages=1,pagecommand={\phantomsection\addcontentsline{toc}{section}{Appendix: Manual of luaotfload.conf}{\thepage}{}}]{luaotfload-conf.pdf} +\includepdf[pages=2-]{luaotfload-conf.pdf} + +\clearpage + +\includepdf[pages=1,pagecommand={\phantomsection\addcontentsline{toc}{section}{Appendix: Manual of luaotfload-tool}{\thepage}{} +}]{luaotfload-tool.pdf} +\includepdf[pages=2-]{luaotfload-tool.pdf} + \end {document} diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex index 429f8646e08..d01cc95c8b0 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex +++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex @@ -32,7 +32,7 @@ \beginfrontmatter \setdocumenttitle {The \identifier{luaotfload} package} - \setdocumentdate {2018/09/24 v2.9} + \setdocumentdate {2018/10/03 v2.91} \setdocumentauthor {Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer\\ Home: \hyperlink {https://github.com/lualatex/luaotfload}\\ New Home: \hyperlink {https://github.com/u-fischer/luaotfload}\\ @@ -53,8 +53,16 @@ \endfrontmatter +\pdfbookmark[1]{\contentsname}{table} \typesetcontent +\beginsection {New in version 2.91 (by Ulrike Fischer)} + +This version mostly correct two bugs found in the previous fontloader: Glyphvariants weren't copied and pasted correctly. Glyphs encoded in the PUA couldn't be accessed anymore. + +\endsection + + \beginsection {New in version 2.9 (by Ulrike Fischer)} On the one side there is not very much new in this version: The native components of \identifier{Luaotfload} are nearly unchanged. A few bugs have been corrected, the various files lists which loads the components of the font loader have been cleaned up. @@ -64,22 +72,22 @@ On the other side there is a lot new: \begindescriptions \beginaltitem {Fontloader} The fontloader files imported from \CONTEXT\ have been updated to the current version. - This was necessary to make \identifier{Luaotfload} compatible with the comimg \LUATEX 1.08. Compared to the previous version from february 2017 quite a number of things have changed. Most importantly the handling of arabic fonts has greatly improved. But this also means that changes in the output are possible. + This was necessary to make \identifier{Luaotfload} compatible with the coming \LUATEX 1.08/1.09. Compared to the previous version from february 2017 quite a number of things have changed. Most importantly the handling of arabic fonts has greatly improved. But this also means that changes in the output are possible. \endaltitem - \beginaltitem {Lualibs} The update of the fontloader files also required an update of the \identifier{Lualibs} package. This \identifier{Luaotfload} versions needs version 2.6 of \identifier{Lualibs}. + \beginaltitem {Lualibs} The update of the fontloader files also required an update of the \identifier{Lualibs} package. This \identifier{Luaotfload} version needs version 2.6 of \identifier{Lualibs}. \endaltitem - \beginaltitem {Maintenance} As the current maintainer wasn't available and it was urgent to get a \identifier{Luaotfload} compatible with \LUATEX 1.08 maintenance has been transfered to Ulrike Fischer and Marcel Krüger. The package is currently maintained and developed at \hyperlink{https://github.com/u-fischer/luaotfload.git}. Issues should be reported there. + \beginaltitem {Maintenance} As the current maintainer wasn't available and it was urgent to get a \identifier{Luaotfload} compatible with \LUATEX 1.08/1.09 maintenance has been transfered to Ulrike Fischer and Marcel Krüger. The package is currently maintained and developed at \hyperlink{https://github.com/u-fischer/luaotfload}. Issues should be reported there. \endaltitem \beginaltitem {Documentation} - The core of documentation is nearly unchanged. I added this introduction. I recreated with the help of @marmot the graphic. I updated the file lists. I imported as appendix pdf versions of the two man files which are part of the \identifier{Luaotfload} documentation. + The core of documentation is nearly unchanged. I added this introduction. I recreated with the help of @marmot the graphic on \pageref{file-graph}. I updated the file lists. I imported as appendix pdf versions of the two man files which are part of the \identifier{Luaotfload} documentation. \endaltitem \enddescriptions - +\endsection %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \beginsection {Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -267,7 +275,7 @@ for a more formal description see figure \ref{font-syntax}. \endsyntaxfloat %% Below guarded space gets borked in index; why‽ -\beginsubsection{Prefix -- the \identifier{luaotfload}{ }Way} +\beginsubsection{Prefix -- the \texorpdfstring{\identifier{luaotfload}}{luaotfload}{ }Way} In \identifier{luaotfload}, the canonical syntax for font requests requires a \emphasis{prefix}: @@ -1888,7 +1896,7 @@ code imported from \CONTEXT. The complete text of the license is given as a separate file \fileent {COPYING} in the toplevel directory of the -\hyperlink [\fileent {Luaotfload} Git repository]{https://github.com/lualatex/luaotfload/blob/master/COPYING}. +\hyperlink [\fileent {Luaotfload} Git repository]{https://github.com/lualatex/luaotfload/blob/master/COPYING}.\\ Distributions probably package it as \fileent {doc/luatex/luaotfload/COPYING} in the relevant \fileent {texmf} tree. diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf Binary files differindex cf13510a3c7..730ca437a11 100644 --- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf +++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-tool.pdf diff --git a/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua b/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua index 75144922799..60fa37e8b1d 100755 --- a/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua +++ b/Master/texmf-dist/scripts/luaotfload/luaotfload-tool.lua @@ -2,13 +2,13 @@ ----------------------------------------------------------------------- -- FILE: luaotfload-tool.lua -- DESCRIPTION: database functionality --- REQUIREMENTS: luaotfload 2.9 +-- REQUIREMENTS: luaotfload 2.91 -- AUTHOR: Khaled Hosny, Élie Roux, Philipp Gesang -- LICENSE: GPL v2.0 ----------------------------------------------------------------------- luaotfload = luaotfload or { } -local version = "2.9" +local version = "2.91" luaotfload.version = version luaotfload.min_luatex_version = { 0, 95, 0 } luaotfload.self = "luaotfload-tool" diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-09-24.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-10-02.lua index 99e38f6399a..eed5fb7d455 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-09-24.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-2018-10-02.lua @@ -1,6 +1,6 @@ --[[info----------------------------------------------------------------------- Luaotfload fontloader package - build 2018-09-24 22:51:46 by fischer@troubleshooting-tex.de + build 2018-10-02 23:45:47 by fischer@troubleshooting-tex.de ------------------------------------------------------------------------------- © 2018 PRAGMA ADE / ConTeXt Development Team @@ -61,7 +61,7 @@ --info]]----------------------------------------------------------------------- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “data-con” d8982c834ed9acc6193eee23067b9d5d] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “data-con” d8982c834ed9acc6193eee23067b9d5d] --- if not modules then modules={} end modules ['data-con']={ version=1.100, @@ -173,10 +173,10 @@ function containers.cleanname(name) return (gsub(lower(name),"[^%w\128-\255]+","-")) end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “data-con”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “data-con”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “basics-nod” 78f56219685f3145b9393c2b688aad94] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “basics-nod” 78f56219685f3145b9393c2b688aad94] --- if not modules then modules={} end modules ['luatex-fonts-nod']={ version=1.001, @@ -589,10 +589,10 @@ do } end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “basics-nod”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “basics-nod”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ini” 6f615d3bc72fb29f409ed2b8f6364c35] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ini” dd3ff5febc73c79b23e16d713a1282fb] --- if not modules then modules={} end modules ['font-ini']={ version=1.001, @@ -602,9 +602,11 @@ if not modules then modules={} end modules ['font-ini']={ license="see context related readme files" } local allocate=utilities.storage.allocate +local sortedhash=table.sortedhash fonts=fonts or {} local fonts=fonts -fonts.hashes=fonts.hashes or { identifiers=allocate() } +local identifiers=allocate() +fonts.hashes=fonts.hashes or { identifiers=identifiers } fonts.tables=fonts.tables or {} fonts.helpers=fonts.helpers or {} fonts.tracers=fonts.tracers or {} @@ -614,13 +616,24 @@ fonts.readers={} fonts.definers={ methods={} } fonts.loggers={ register=function() end } if context then + font.originaleach=font.each + function font.each() + return sortedhash(identifiers) + end fontloader=nil end +fonts.privateoffsets={ + textbase=0xF0000, + textextrabase=0xFD000, + mathextrabase=0xFE000, + mathbase=0xFF000, + keepnames=false, +} -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ini”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ini”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-mis” fd0a52acf5180695d2870da654db7272] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-mis” 17e967c9ec4d001deefd43ddf25e98f7] --- if not modules then modules={} end modules ['luatex-font-mis']={ version=1.001, @@ -648,11 +661,14 @@ table.setmetatableindex(marks,function(t,k) return marks end end) +function font.each() + return table.sortedhash(fonts.hashes.identifiers) +end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-mis”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-mis”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-con” 3218bd21a24c2abb13b284085da8ced4] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-con” eff77b4c54c2d26eacb29de59e94e2f9] --- if not modules then modules={} end modules ['font-con']={ version=1.001, @@ -684,7 +700,7 @@ constructors.autocleanup=true constructors.namemode="fullpath" constructors.version=1.01 constructors.cache=containers.define("fonts","constructors",constructors.version,false) -constructors.privateoffset=0xF0000 +constructors.privateoffset=fonts.privateoffsets.textbase or 0xF0000 constructors.cacheintex=true local designsizes=allocate() constructors.designsizes=designsizes @@ -1991,10 +2007,10 @@ function constructors.addcoreunicodes(unicodes) return unicodes end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-con”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-con”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-enc” 5ff4ca50493d7c4ecea0e15c203099f0] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-enc” 5ff4ca50493d7c4ecea0e15c203099f0] --- if not modules then modules={} end modules ['luatex-font-enc']={ version=1.001, @@ -2063,10 +2079,10 @@ function encodings.load(filename) return containers.write(encodings.cache,name,data) end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-enc”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-enc”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] --- if not modules then modules={} end modules ['font-cid']={ version=1.001, @@ -2217,10 +2233,10 @@ function cid.getmap(specification) return found end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-cid”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-cid”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-map” 2c03dc61afabb5887ef18a88e6ec86bd] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-map” f57b80596cf5096c3505c0f3ef4285a8] --- if not modules then modules={} end modules ['font-map']={ version=1.001, @@ -2517,12 +2533,16 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures) missing[du]=true nofmissing=nofmissing+1 end + else end end else local overload=overloads[du] if overload then glyph.unicode=overload.unicode + elseif not glyph.unicode then + missing[du]=true + nofmissing=nofmissing+1 end end end @@ -2603,10 +2623,10 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-map”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-map”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-vfc” 237aff1862009b7850653c2098473bd4] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-vfc” 237aff1862009b7850653c2098473bd4] --- if not modules then modules={} end modules ['font-vfc']={ version=1.001, @@ -2682,10 +2702,10 @@ helpers.commands=utilities.storage.allocate { dummy=dummy, } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-vfc”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-vfc”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otr” 4a1dae571a43d7cb8afce7e906df89c6] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otr” 4a1dae571a43d7cb8afce7e906df89c6] --- if not modules then modules={} end modules ['font-otr']={ version=1.001, @@ -4463,10 +4483,10 @@ function readers.extend(fontdata) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otr”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otr”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] --- if not modules then modules={} end modules ['font-oti']={ version=1.001, @@ -4609,10 +4629,10 @@ function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-oti”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-oti”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ott” a4dd9bc516bdb7669ee61d5207f899c6] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ott” b20ddcf6360a2e35e79b7bdad0289a19] --- if not modules then modules={} end modules ["font-ott"]={ version=1.001, @@ -4998,6 +5018,7 @@ local languages=allocate { ["kiu" ]="kirmanjki", ["kjd" ]="southern kiwai", ["kjp" ]="eastern pwo karen", + ["kjz" ]="bumthangkha", ["kkn" ]="kokni", ["klm" ]="kalmyk", ["kmb" ]="kamba", @@ -5086,6 +5107,7 @@ local languages=allocate { ["mdr" ]="mandar", ["men" ]="me'en", ["mer" ]="meru", + ["mfa" ]="pattani malay", ["mfe" ]="morisyen", ["min" ]="minangkabau", ["miz" ]="mizo", @@ -5283,6 +5305,7 @@ local languages=allocate { ["tpi" ]="tok pisin", ["trk" ]="turkish", ["tsg" ]="tsonga", + ["tsj" ]="tshangla", ["tua" ]="turoyo aramaic", ["tul" ]="tulu", ["tuv" ]="tuvin", @@ -5313,6 +5336,7 @@ local languages=allocate { ["xbd" ]="lü", ["xhs" ]="xhosa", ["xjb" ]="minjangbal", + ["xkf" ]="khengkha", ["xog" ]="soga", ["xpe" ]="kpelle (liberia)", ["yak" ]="sakha", @@ -5658,10 +5682,10 @@ function otffeatures.normalize(features) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ott”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ott”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-cff” eefa156275ba0ac91aa651a944d35978] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-cff” 428a467664b5f49b812b2d66f579e3cf] --- if not modules then modules={} end modules ['font-cff']={ version=1.001, @@ -7524,10 +7548,10 @@ function readers.cffcheck(filename) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-cff”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-cff”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ttf” ff587471f4297aa8ba0fa022609adc6e] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ttf” ff587471f4297aa8ba0fa022609adc6e] --- if not modules then modules={} end modules ['font-ttf']={ version=1.001, @@ -8618,10 +8642,10 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ttf”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ttf”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-dsp” 9cade9beb226c61b4323729aca1f4a80] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-dsp” cb8138a91cfbe562467821c5e0c2568e] --- if not modules then modules={} end modules ['font-dsp']={ version=1.001, @@ -8630,7 +8654,7 @@ if not modules then modules={} end modules ['font-dsp']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local next,type=next,type +local next,type,tonumber=next,type,tonumber local band=bit32.band local extract=bit32.extract local bor=bit32.bor @@ -9415,8 +9439,9 @@ local function unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,n rules=rules, } elseif subtype==3 then - local current=readarray(f) + local nofglyphs=readushort(f) local noflookups=readushort(f) + local current=readcardinaltable(f,nofglyphs,ushort) local lookups=readlookuparray(f,noflookups,#current) current=readcoveragearray(f,tableoffset,current,true) return { @@ -9610,7 +9635,7 @@ function gsubhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg local delta=readshort(f) local coverage=readcoverage(f,tableoffset+coverage) for index in next,coverage do - local newindex=index+delta + local newindex=(index+delta)%65536 if index>nofglyphs or newindex>nofglyphs then report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs) coverage[index]=nil @@ -10496,7 +10521,6 @@ do if not rlookups then report_issue(i,what,sequence,"no") elseif not next(rlookups) then - report_issue(i,what,sequence,"empty") rule.lookups=nil else local length=#rlookups @@ -10685,7 +10709,7 @@ do elseif specification.globalkerns then name="globalkern" else - report("ignoring global kern table using gpos kern feature") + report("ignoring global kern table, using gpos kern feature") return end setposition(f,datatable.offset) @@ -11632,10 +11656,10 @@ function readers.mvar(f,fontdata,specification) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-dsp”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-dsp”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-oup” 020f2630f5a18d39e209f1cbf7a334ea] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-oup” ab288020c44f14da4d7eff185a37c8a4] --- if not modules then modules={} end modules ['font-oup']={ version=1.001, @@ -11653,8 +11677,15 @@ local sortedkeys=table.sortedkeys local sortedhash=table.sortedhash local tohash=table.tohash local setmetatableindex=table.setmetatableindex -local report=logs.reporter("otf reader") +local report_error=logs.reporter("otf reader","error") +local report_markwidth=logs.reporter("otf reader","markwidth") +local report_cleanup=logs.reporter("otf reader","cleanup") +local report_optimizations=logs.reporter("otf reader","merges") +local report_unicodes=logs.reporter("otf reader","unicodes") local trace_markwidth=false trackers.register("otf.markwidth",function(v) trace_markwidth=v end) +local trace_cleanup=false trackers.register("otf.cleanups",function(v) trace_cleanups=v end) +local trace_optimizations=false trackers.register("otf.optimizations",function(v) trace_optimizations=v end) +local trace_unicodes=false trackers.register("otf.unicodes",function(v) trace_unicodes=v end) local readers=fonts.handlers.otf.readers local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000 local f_private=formatters["P%05X"] @@ -11695,6 +11726,7 @@ local function unifyresources(fontdata,indices) if not descriptions or not resources then return end + local nofindices=#indices local variants=fontdata.resources.variants if variants then for selector,unicodes in next,variants do @@ -11710,8 +11742,8 @@ local function unifyresources(fontdata,indices) local u=indices[k] if u then newmarks[u]=v - else - report("discarding mark %i",k) + elseif trace_optimizations then + report_optimizations("discarding mark %i",k) end end return newmarks @@ -11744,18 +11776,28 @@ local function unifyresources(fontdata,indices) if not done[c] then local t={} for k,v in next,c do - t[indices[k]]=v + local ug=indices[k] + if ug then + t[ug]=v + else + report_error("case %i, bad index in unifying %s: %s of %s",1,"coverage",k,nofindices) + end end cover[i]=t done[c]=d end end end - local function recursed(c) + local function recursed(c,kind) local t={} for g,d in next,c do if type(d)=="table" then - t[indices[g]]=recursed(d) + local ug=indices[g] + if ug then + t[ug]=recursed(d,kind) + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g,nofindices) + end else t[g]=indices[d] end @@ -11783,18 +11825,31 @@ local function unifyresources(fontdata,indices) if duplicates then for g1,d1 in next,c do local ug1=indices[g1] - local ud1=indices[d1] - t1[ug1]=ud1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=ud1 + if ug1 then + local ud1=indices[d1] + if ud1 then + t1[ug1]=ud1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=ud1 + end + end + else + report_error("case %i, bad index in unifying %s: %s of %s",3,kind,d1,nofindices) end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) end end else for g1,d1 in next,c do - t1[indices[g1]]=indices[d1] + local ug1=indices[g1] + if ug1 then + t1[ug1]=indices[d1] + else + report_error("fuzzy case %i in unifying %s: %i",2,kind,g1) + end end end done[c]=t1 @@ -11808,15 +11863,25 @@ local function unifyresources(fontdata,indices) if not t1 then t1={} for g1,d1 in next,c do - local t2=done[d1] - if not t2 then - t2={} - for g2,d2 in next,d1 do - t2[indices[g2]]=d2 + local ug1=indices[g1] + if ug1 then + local t2=done[d1] + if not t2 then + t2={} + for g2,d2 in next,d1 do + local ug2=indices[g2] + if ug2 then + t2[ug2]=d2 + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g2,nofindices,nofindices) + end + end + done[d1]=t2 end - done[d1]=t2 + t1[ug1]=t2 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end - t1[indices[g1]]=t2 end done[c]=t1 end @@ -11825,7 +11890,7 @@ local function unifyresources(fontdata,indices) elseif kind=="gsub_ligature" then local c=step.coverage if c then - step.coverage=recursed(c) + step.coverage=recursed(c,kind) end elseif kind=="gsub_alternate" or kind=="gsub_multiple" then local c=step.coverage @@ -11836,21 +11901,37 @@ local function unifyresources(fontdata,indices) if duplicates then for g1,d1 in next,c do for i=1,#d1 do - d1[i]=indices[d1[i]] + local d1i=d1[i] + local d1u=indices[d1i] + if d1u then + d1[i]=d1u + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,i,d1i,nofindices) + end end local ug1=indices[g1] - t1[ug1]=d1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=copy(d1) + if ug1 then + t1[ug1]=d1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=copy(d1) + end end + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end end else for g1,d1 in next,c do for i=1,#d1 do - d1[i]=indices[d1[i]] + local d1i=d1[i] + local d1u=indices[d1i] + if d1u then + d1[i]=d1u + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,d1i,nofindices) + end end t1[indices[g1]]=d1 end @@ -11859,6 +11940,41 @@ local function unifyresources(fontdata,indices) end step.coverage=t1 end + elseif kind=="gpos_single" then + local c=step.coverage + if c then + local t1=done[c] + if not t1 then + t1={} + if duplicates then + for g1,d1 in next,c do + local ug1=indices[g1] + if ug1 then + t1[ug1]=d1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=d1 + end + end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) + end + end + else + for g1,d1 in next,c do + local ug1=indices[g1] + if ug1 then + t1[ug1]=d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) + end + end + end + done[c]=t1 + end + step.coverage=t1 + end elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" or kind=="gpos_mark2ligature" then local c=step.coverage if c then @@ -11866,7 +11982,12 @@ local function unifyresources(fontdata,indices) if not t1 then t1={} for g1,d1 in next,c do - t1[indices[g1]]=d1 + local ug1=indices[g1] + if ug1 then + t1[ug1]=d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) + end end done[c]=t1 end @@ -11881,7 +12002,12 @@ local function unifyresources(fontdata,indices) if not t2 then t2={} for g2,d2 in next,d1 do - t2[indices[g2]]=d2 + local ug2=indices[g2] + if ug2 then + t2[ug2]=d2 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g2,nofindices) + end end done[d1]=t2 end @@ -11890,7 +12016,7 @@ local function unifyresources(fontdata,indices) done[c]=c end end - elseif kind=="gpos_single" then + elseif kind=="gpos_cursive" then local c=step.coverage if c then local t1=done[c] @@ -11899,44 +12025,27 @@ local function unifyresources(fontdata,indices) if duplicates then for g1,d1 in next,c do local ug1=indices[g1] - t1[ug1]=d1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=d1 + if ug1 then + t1[ug1]=d1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=copy(d1) + end end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) end end else for g1,d1 in next,c do - t1[indices[g1]]=d1 - end - end - done[c]=t1 - end - step.coverage=t1 - end - elseif kind=="gpos_cursive" then - local c=step.coverage - if c then - local t1=done[c] - if not t1 then - t1={} - if duplicates then - for g1,d1 in next,c do local ug1=indices[g1] - t1[ug1]=d1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=copy(d1) - end + if ug1 then + t1[ug1]=d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end end - else - for g1,d1 in next,c do - t1[indices[g1]]=d1 - end end done[c]=t1 end @@ -11980,9 +12089,13 @@ local function copyduplicates(fontdata) if not ds or ds.width==0 then if ds then descriptions[0xAD]=nil - report("patching soft hyphen") + if trace_unicodes then + report_unicodes("patching soft hyphen") + end else - report("adding soft hyphen") + if trace_unicodes then + report_unicodes("adding soft hyphen") + end end if not duplicates then duplicates={} @@ -12018,10 +12131,12 @@ local function copyduplicates(fontdata) end n=n+1 end - if n<=m then - report("duplicates: %i : % t",n,t) - else - report("duplicates: %i : % t ...",n,t) + if trace_unicodes then + if n<=m then + report_unicodes("%i : % t",n,t) + else + report_unicodes("%i : % t ...",n,t) + end end else end @@ -12143,7 +12258,9 @@ local function checklookups(fontdata,missing,nofmissing) end end if nofmissing<=0 then - report("all done in %s loops",loops) + if trace_unicodes then + report_unicodes("all missings done in %s loops",loops) + end return elseif old==nofmissing then break @@ -12192,7 +12309,9 @@ local function checklookups(fontdata,missing,nofmissing) recursed(ligatures[i]) end if nofmissing<=0 then - report("all done in %s loops",loops) + if trace_unicodes then + report_unicodes("all missings done in %s loops",loops) + end return elseif old==nofmissing then break @@ -12201,7 +12320,7 @@ local function checklookups(fontdata,missing,nofmissing) t=nil n=0 end - if nofmissing>0 then + if trace_unicodes and nofmissing>0 then local done={} for i,r in next,missing do if r then @@ -12213,7 +12332,7 @@ local function checklookups(fontdata,missing,nofmissing) end end if next(done) then - report("not unicoded: % t",sortedkeys(done)) + report_unicode("not unicoded: % t",sortedkeys(done)) end end end @@ -12236,6 +12355,9 @@ local function unifymissing(fontdata) fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups) resources.unicodes=nil end +local firstprivate=fonts.privateoffsets.textbase or 0xF0000 +local puafirst=0xE000 +local pualast=0xF8FF local function unifyglyphs(fontdata,usenames) local private=fontdata.private or privateoffset local glyphs=fontdata.glyphs @@ -12258,40 +12380,106 @@ local function unifyglyphs(fontdata,usenames) else indices[0]=zerocode end - for index=1,#glyphs do - local glyph=glyphs[index] - local unicode=glyph.unicode - if not unicode or unicode>=private or (unicode>=0xE000 and unicode<=0xF8FF) or unicode==0xFFFE or unicode==0xFFFF then - unicode=private - if names then + if names then + for index=1,#glyphs do + local glyph=glyphs[index] + local unicode=glyph.unicode + if not unicode then + unicode=private local name=glyph.name or f_private(unicode) indices[index]=name names[name]=unicode - else - indices[index]=unicode - end - private=private+1 - elseif descriptions[unicode] then - report("assigning private unicode %U to glyph indexed %05X (%C)",private,index,unicode) - unicode=private - if names then + private=private+1 + elseif unicode>=firstprivate then + unicode=private + local name=glyph.name or f_private(unicode) + indices[index]=name + names[name]=unicode + private=private+1 + elseif unicode>=puafirst and unicode<=pualast then local name=glyph.name or f_private(unicode) indices[index]=name names[name]=unicode + elseif descriptions[unicode] then + unicode=private + local name=glyph.name or f_private(unicode) + indices[index]=name + names[name]=unicode + private=private+1 else - indices[index]=unicode - end - private=private+1 - else - if names then local name=glyph.name or f_unicode(unicode) indices[index]=name names[name]=unicode + end + descriptions[unicode]=glyph + end + elseif trace_unicodes then + for index=1,#glyphs do + local glyph=glyphs[index] + local unicode=glyph.unicode + if not unicode then + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=firstprivate then + local name=glyph.name + if name then + report_unicodes("moving glyph %a indexed %05X from private %U to %U ",name,index,unicode,private) + else + report_unicodes("moving glyph indexed %05X from private %U to %U ",index,unicode,private) + end + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=puafirst and unicode<=pualast then + local name=glyph.name + if name then + report_unicodes("keeping private unicode %U for glyph %a indexed %05X",unicode,name,index) + else + report_unicodes("keeping private unicode %U for glyph indexed %05X",unicode,index) + end + indices[index]=unicode + elseif descriptions[unicode] then + local name=glyph.name + if name then + report_unicodes("assigning duplicate unicode %U to %U for glyph %a indexed %05X ",unicode,private,name,index) + else + report_unicodes("assigning duplicate unicode %U to %U for glyph indexed %05X ",unicode,private,index) + end + unicode=private + indices[index]=unicode + private=private+1 + else + indices[index]=unicode + end + descriptions[unicode]=glyph + end + else + for index=1,#glyphs do + local glyph=glyphs[index] + local unicode=glyph.unicode + if not unicode then + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=firstprivate then + local name=glyph.name + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=puafirst and unicode<=pualast then + local name=glyph.name + indices[index]=unicode + elseif descriptions[unicode] then + local name=glyph.name + unicode=private + indices[index]=unicode + private=private+1 else indices[index]=unicode end + descriptions[unicode]=glyph end - descriptions[unicode]=glyph end for index=1,#glyphs do local math=glyphs[index].math @@ -12335,28 +12523,39 @@ local function unifyglyphs(fontdata,usenames) end local p_bogusname=( (P("uni")+P("UNI")+P("Uni")+P("U")+P("u"))*S("Xx")^0*R("09","AF")^1+(P("identity")+P("Identity")+P("IDENTITY"))*R("09","AF")^1+(P("index")+P("Index")+P("INDEX"))*R("09")^1 -)*P(-1) +)*(P(-1)+P(".")) local function stripredundant(fontdata) local descriptions=fontdata.descriptions if descriptions then local n=0 local c=0 - for unicode,d in next,descriptions do - local name=d.name - if name and lpegmatch(p_bogusname,name) then - d.name=nil - n=n+1 + if not context and fonts.privateoffsets.keepnames then + for unicode,d in next,descriptions do + if d.class=="base" then + d.class=nil + c=c+1 + end end - if d.class=="base" then - d.class=nil - c=c+1 + else + for unicode,d in next,descriptions do + local name=d.name + if name and lpegmatch(p_bogusname,name) then + d.name=nil + n=n+1 + end + if d.class=="base" then + d.class=nil + c=c+1 + end end end - if n>0 then - report("%s bogus names removed (verbose unicode)",n) - end - if c>0 then - report("%s base class tags removed (default is base)",c) + if trace_cleanup then + if n>0 then + report_cleanup("%s bogus names removed (verbose unicode)",n) + end + if c>0 then + report_cleanup("%s base class tags removed (default is base)",c) + end end end end @@ -13445,12 +13644,16 @@ local function mergesteps_1(lookup,strict) local f=first.format for i=2,nofsteps do if steps[i].format~=f then - report("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + end return 0 end end end - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage for i=2,nofsteps do local c=steps[i].coverage @@ -13475,12 +13678,16 @@ local function mergesteps_2(lookup) local f=first.format for i=2,nofsteps do if steps[i].format~=f then - report("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + end return 0 end end end - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage for i=2,nofsteps do local c=steps[i].coverage @@ -13507,7 +13714,9 @@ end local function mergesteps_3(lookup,strict) local steps=lookup.steps local nofsteps=lookup.nofsteps - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local coverage={} for i=1,nofsteps do local c=steps[i].coverage @@ -13515,7 +13724,9 @@ local function mergesteps_3(lookup,strict) for k,v in next,c do local tk=coverage[k] if tk then - report("quitting merge due to multiple checks") + if trace_optimizations then + report_optimizations("quitting merge due to multiple checks") + end return nofsteps else coverage[k]=v @@ -13562,7 +13773,9 @@ local function mergesteps_4(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps local first=steps[1] - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage for i=2,nofsteps do local c=steps[i].coverage @@ -13585,7 +13798,9 @@ local function mergesteps_5(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps local first=steps[1] - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage local hash=nil for k,v in next,target do @@ -13634,7 +13849,9 @@ local function checkkerns(lookup) end end if kerns then - report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + end local c={} for g1,d1 in next,coverage do if d1 and d1~=true then @@ -13675,7 +13892,9 @@ local function checkpairs(lookup) if step.format=="pair" then local coverage=onlykerns(step) if coverage then - report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + end for g1,d1 in next,coverage do local d={} for g2,d2 in next,d1 do @@ -13791,17 +14010,19 @@ function readers.compact(data) end end end - else - report("no lookups in %a",what) + elseif trace_optimizations then + report_optimizations("no lookups in %a",what) end end compact("sequences") compact("sublookups") - if merged>0 then - report("%i steps of %i removed due to merging",merged,allsteps) - end - if kerned>0 then - report("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) + if trace_optimizations then + if merged>0 then + report_optimizations("%i steps of %i removed due to merging",merged,allsteps) + end + if kerned>0 then + report_optimizations("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) + end end end local function mergesteps(t,k) @@ -13892,7 +14113,7 @@ function readers.expand(data) if not wd then d.width=defaultwidth elseif trace_markwidth and wd~=0 and d.class=="mark" then - report("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) + report_markwidth("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) end if bb then local ht=bb[4] @@ -14042,10 +14263,10 @@ function readers.expand(data) expandlookups(sublookups) end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-oup”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-oup”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otl” fcc55ae6cff5fd55b5054f923c21cafa] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otl” 40cdceeb682bac55b4a69465b76bcc33] --- if not modules then modules={} end modules ['font-otl']={ version=1.001, @@ -14073,7 +14294,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_de local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.104 +otf.version=3.106 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) otf.sbixcache=containers.define("fonts","sbix",otf.version,true) @@ -14149,7 +14370,7 @@ function otf.load(filename,sub,instance) end if reload then report_otf("loading %a, hash %a",filename,hash) - starttiming(otfreaders) + starttiming(otfreaders,true) data=otfreaders.loadfont(filename,sub or 1,instance) if data then local used=checkmemory() @@ -14232,6 +14453,7 @@ function otf.load(filename,sub,instance) checkmemory(used,threshold,tracememory) end else + stoptiming(otfreaders) data=nil report_otf("loading failed due to read error") end @@ -14747,10 +14969,10 @@ otf.coverup={ end } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otl”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otl”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-oto” d78a6165b7ff6c21f4c3c4c3c0553648] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-oto” d78a6165b7ff6c21f4c3c4c3c0553648] --- if not modules then modules={} end modules ['font-oto']={ version=1.001, @@ -15197,10 +15419,10 @@ registerotffeature { } otf.basemodeinitializer=featuresinitializer -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-oto”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-oto”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otj” 578448ae37a167319dbccd5af04738da] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otj” 578448ae37a167319dbccd5af04738da] --- if not modules then modules={} end modules ['font-otj']={ version=1.001, @@ -16657,10 +16879,10 @@ function injections.handler(head,where) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otj”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otj”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ota” d883cf661bb8c27bfa9b7cc66420c1ed] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ota” d883cf661bb8c27bfa9b7cc66420c1ed] --- if not modules then modules={} end modules ['font-ota']={ version=1.001, @@ -17038,10 +17260,10 @@ directives.register("otf.analyze.useunicodemarks",function(v) analyzers.useunicodemarks=v end) -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ota”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ota”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ots” 624f23e63b7430a51212c8824d09924f] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ots” 624f23e63b7430a51212c8824d09924f] --- if not modules then modules={} end modules ['font-ots']={ version=1.001, @@ -20609,10 +20831,10 @@ registerotffeature { }, } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ots”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ots”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-osd” d2b542031aa693bb423b6d3272820c9a] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-osd” d2b542031aa693bb423b6d3272820c9a] --- if not modules then modules={} end modules ['font-osd']={ version=1.001, @@ -22547,10 +22769,10 @@ for i=1,nofscripts do methods[scripts_two[i]]=method_two end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-osd”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-osd”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ocl” 49cf3230228aa7f2d19cd491f55f5395] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ocl” 49cf3230228aa7f2d19cd491f55f5395] --- if not modules then modules={} end modules ['font-ocl']={ version=1.001, @@ -23022,10 +23244,10 @@ fonts.handlers.otf.features.register { } } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-ocl”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-ocl”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otc” 9dcd93d83bc61c90f0fb6161a1911a55] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otc” 9dcd93d83bc61c90f0fb6161a1911a55] --- if not modules then modules={} end modules ['font-otc']={ version=1.001, @@ -23766,10 +23988,10 @@ end otf.enhancers.enhance=enhance otf.enhancers.register("check extra features",enhance) -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-otc”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-otc”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-onr” cf93eb4ab34461d2b3797792dbdb035f] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-onr” cf93eb4ab34461d2b3797792dbdb035f] --- if not modules then modules={} end modules ['font-onr']={ version=1.001, @@ -24122,10 +24344,10 @@ function readers.getinfo(filename) end end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-onr”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-onr”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-one” 52588c7c3aab714d95d03e91ee86e1ad] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-one” 52588c7c3aab714d95d03e91ee86e1ad] --- if not modules then modules={} end modules ['font-one']={ version=1.001, @@ -24824,10 +25046,10 @@ registerafmenhancer("normalize features",enhance_normalize_features) registerafmenhancer("check extra features",otfenhancers.enhance) registerafmenhancer("fix names",enhance_fix_names) -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-one”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-one”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-afk” 9da14e0fb22129c053acc599d1312544] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-afk” 9da14e0fb22129c053acc599d1312544] --- if not modules then modules={} end modules ['font-afk']={ version=1.001, @@ -24994,10 +25216,10 @@ fonts.handlers.afm.helpdata={ } } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-afk”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-afk”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-tfm” c9797c1b4ccb8fdb7f041e19207109a2] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-tfm” c9797c1b4ccb8fdb7f041e19207109a2] --- if not modules then modules={} end modules ['font-tfm']={ version=1.001, @@ -25508,10 +25730,10 @@ registertfmfeature { } } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-tfm”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-tfm”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] --- if not modules then modules={} end modules ['font-lua']={ version=1.001, @@ -25551,10 +25773,10 @@ function readers.lua(specification) return check_lua(specification,fullname) end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-lua”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-lua”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-def” 8e2cb2552bf02246da2ac43334b91795] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-def” 8e2cb2552bf02246da2ac43334b91795] --- if not modules then modules={} end modules ['font-def']={ version=1.001, @@ -25959,10 +26181,10 @@ function font.getfont(id) end callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)") -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-def”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-def”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] --- if not modules then modules={} end modules ['luatex-fonts-def']={ version=1.001, @@ -26043,10 +26265,10 @@ function fonts.definers.applypostprocessors(tfmdata) return tfmdata end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-def”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-def”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] --- if not modules then modules={} end modules ['luatex-fonts-ext']={ version=1.001, @@ -26232,10 +26454,10 @@ registerotffeature { } } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-ext”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-ext”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-tex” ceb087ef6fa2f89aed7179f60ddf8f35] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-tex” ceb087ef6fa2f89aed7179f60ddf8f35] --- if not modules then modules={} end modules ['font-imp-tex']={ version=1.001, @@ -26334,10 +26556,10 @@ registerotffeature { description="arabic digits", } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-tex”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-tex”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-ligatures” 26ffcf089391445f7af59536c8814364] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-ligatures” 26ffcf089391445f7af59536c8814364] --- if not modules then modules={} end modules ['font-imp-ligatures']={ version=1.001, @@ -26451,10 +26673,10 @@ if context then } end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-ligatures”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-ligatures”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-italics” c2e6d6c4096a2c30d68fbffd3d7d58a7] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-italics” c2e6d6c4096a2c30d68fbffd3d7d58a7] --- if not modules then modules={} end modules ['font-imp-italics']={ version=1.001, @@ -26560,10 +26782,10 @@ if context then registerafmfeature(dimensions_specification) end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-italics”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-italics”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-effects” 3327181ef3db6f44dd234ad66ccc3f38] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-effects” 3327181ef3db6f44dd234ad66ccc3f38] --- if not modules then modules={} end modules ['font-imp-effects']={ version=1.001, @@ -26920,10 +27142,10 @@ local specification={ registerotffeature(specification) registerafmfeature(specification) -end --- [luaotfload, fontloader-2018-09-24.lua scope for “font-imp-effects”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “font-imp-effects”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] --- fonts.handlers.otf.addfeature { @@ -28992,10 +29214,10 @@ fonts.handlers.otf.addfeature { ["type"]="ligature", } -end --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-lig”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-lig”] --- -do --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-gbn” 10ecdf01e7c926e5128ad8a9dff4d677] --- +do --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-gbn” 10ecdf01e7c926e5128ad8a9dff4d677] --- if not modules then modules={} end modules ['luatex-fonts-gbn']={ version=1.001, @@ -29260,7 +29482,7 @@ function nodes.simple_font_handler(head,groupcode,size,packtype,direction) return head end -end --- [luaotfload, fontloader-2018-09-24.lua scope for “fonts-gbn”] --- +end --- [luaotfload, fontloader-2018-10-02.lua scope for “fonts-gbn”] --- --- vim:ft=lua:sw=2:ts=8:et:tw=79 diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua index 87234dd460f..ecd49fa3ad1 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-cff.lua @@ -1567,6 +1567,7 @@ do end local function blend() + -- leaves n values on stack local n = stack[top] top = top - 1 if not axis then diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua index e8bcd56a263..54cf2c19953 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-con.lua @@ -46,8 +46,7 @@ constructors.namemode = "fullpath" -- will be a function constructors.version = 1.01 constructors.cache = containers.define("fonts", "constructors", constructors.version, false) -constructors.privateoffset = 0xF0000 -- 0x10FFFF | context also uses privates: 0xE000-0xEFFF - +constructors.privateoffset = fonts.privateoffsets.textbase or 0xF0000 constructors.cacheintex = true -- so we see the original table in fonts.font -- This might become an interface: diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua index 1fe4289b2f7..127afd9cbaf 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-dsp.lua @@ -54,7 +54,7 @@ if not modules then modules = { } end modules ['font-dsp'] = { -- Although we use a few table readers there i sno real gain in there (apart from having -- less code. After all there are often not that many demanding features. -local next, type = next, type +local next, type, tonumber = next, type, tonumber local band = bit32.band local extract = bit32.extract local bor = bit32.bor @@ -1007,8 +1007,9 @@ local function unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,n rules = rules, } elseif subtype == 3 then - local current = readarray(f) + local nofglyphs = readushort(f) local noflookups = readushort(f) + local current = readcardinaltable(f,nofglyphs,ushort) local lookups = readlookuparray(f,noflookups,#current) current = readcoveragearray(f,tableoffset,current,true) return { @@ -1215,7 +1216,7 @@ function gsubhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg local delta = readshort(f) -- can be negative local coverage = readcoverage(f,tableoffset+coverage) -- not simple as we need to set key/value anyway for index in next, coverage do - local newindex = index + delta + local newindex = (index + delta) % 65536 -- modulo is new in 1.8.3 if index > nofglyphs or newindex > nofglyphs then report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs) coverage[index] = nil @@ -2213,7 +2214,7 @@ do report_issue(i,what,sequence,"no") elseif not next(rlookups) then -- can be ok as it aborts a chain sequence - report_issue(i,what,sequence,"empty") + -- report_issue(i,what,sequence,"empty") rule.lookups = nil else -- we can have holes in rlookups flagged false and we can have multiple lookups @@ -2421,7 +2422,7 @@ do elseif specification.globalkerns then name = "globalkern" else - report("ignoring global kern table using gpos kern feature") + report("ignoring global kern table, using gpos kern feature") return end setposition(f,datatable.offset) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ini.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ini.lua index 3d5dd27a2d5..462e30bf909 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ini.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ini.lua @@ -10,22 +10,45 @@ if not modules then modules = { } end modules ['font-ini'] = { <p>Not much is happening here.</p> --ldx]]-- -local allocate = utilities.storage.allocate +local allocate = utilities.storage.allocate +local sortedhash = table.sortedhash -fonts = fonts or { } -local fonts = fonts +fonts = fonts or { } +local fonts = fonts -fonts.hashes = fonts.hashes or { identifiers = allocate() } -fonts.tables = fonts.tables or { } -fonts.helpers = fonts.helpers or { } -fonts.tracers = fonts.tracers or { } -- for the moment till we have move to moduledata -fonts.specifiers = fonts.specifiers or { } -- in format ! +local identifiers = allocate() -fonts.analyzers = { } -- not needed here -fonts.readers = { } -fonts.definers = { methods = { } } -fonts.loggers = { register = function() end } +fonts.hashes = fonts.hashes or { identifiers = identifiers } +fonts.tables = fonts.tables or { } +fonts.helpers = fonts.helpers or { } +fonts.tracers = fonts.tracers or { } -- for the moment till we have move to moduledata +fonts.specifiers = fonts.specifiers or { } -- in format ! + +fonts.analyzers = { } -- not needed here +fonts.readers = { } +fonts.definers = { methods = { } } +fonts.loggers = { register = function() end } if context then + + font.originaleach = font.each + + function font.each() + return sortedhash(identifiers) + end + fontloader = nil + end + +-- Outside context one can bump textbase to some higher value but only the +-- textbase given here is officially supported (read: bug testing etc will +-- use the values below). + +fonts.privateoffsets = { + textbase = 0xF0000, -- used for hidden (opentype features) + textextrabase = 0xFD000, -- used for visible by name + mathextrabase = 0xFE000, -- used for visible by code + mathbase = 0xFF000, -- used for hidden (virtual math) + keepnames = false, -- when set to true names are always kept (not for context) +} diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua index a7fbfe49e89..712b1584c50 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-map.lua @@ -550,12 +550,17 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures) missing[du] = true nofmissing = nofmissing + 1 end + else + -- maybe a message or so end end else local overload = overloads[du] if overload then glyph.unicode = overload.unicode + elseif not glyph.unicode then + missing[du] = true + nofmissing = nofmissing + 1 end end end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua index abb0ebd148c..7a8e9b02eaa 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-otl.lua @@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading") local fonts = fonts local otf = fonts.handlers.otf -otf.version = 3.104 -- beware: also sync font-mis.lua and in mtx-fonts +otf.version = 3.106 -- beware: also sync font-mis.lua and in mtx-fonts otf.cache = containers.define("fonts", "otl", otf.version, true) otf.svgcache = containers.define("fonts", "svg", otf.version, true) otf.sbixcache = containers.define("fonts", "sbix", otf.version, true) @@ -155,7 +155,7 @@ function otf.load(filename,sub,instance) if reload then report_otf("loading %a, hash %a",filename,hash) -- - starttiming(otfreaders) + starttiming(otfreaders,true) data = otfreaders.loadfont(filename,sub or 1,instance) -- we can pass the number instead (if it comes from a name search) if data then -- todo: make this a plugin @@ -242,6 +242,7 @@ function otf.load(filename,sub,instance) checkmemory(used,threshold,tracememory) end else + stoptiming(otfreaders) data = nil report_otf("loading failed due to read error") end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ott.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ott.lua index 88da136ac70..6f8b85446f7 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ott.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-ott.lua @@ -390,6 +390,7 @@ local languages = allocate { ["kiu" ] = "kirmanjki", ["kjd" ] = "southern kiwai", ["kjp" ] = "eastern pwo karen", + ["kjz" ] = "bumthangkha", ["kkn" ] = "kokni", ["klm" ] = "kalmyk", ["kmb" ] = "kamba", @@ -478,6 +479,7 @@ local languages = allocate { ["mdr" ] = "mandar", ["men" ] = "me'en", ["mer" ] = "meru", + ["mfa" ] = "pattani malay", ["mfe" ] = "morisyen", ["min" ] = "minangkabau", ["miz" ] = "mizo", @@ -675,6 +677,7 @@ local languages = allocate { ["tpi" ] = "tok pisin", ["trk" ] = "turkish", ["tsg" ] = "tsonga", + ["tsj" ] = "tshangla", ["tua" ] = "turoyo aramaic", ["tul" ] = "tulu", ["tuv" ] = "tuvin", @@ -705,6 +708,7 @@ local languages = allocate { ["xbd" ] = "lü", ["xhs" ] = "xhosa", ["xjb" ] = "minjangbal", + ["xkf" ] = "khengkha", ["xog" ] = "soga", ["xpe" ] = "kpelle (liberia)", ["yak" ] = "sakha", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua index 562d7561d94..012b007d502 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-font-oup.lua @@ -11,27 +11,34 @@ local P, R, S = lpeg.P, lpeg.R, lpeg.S local lpegmatch = lpeg.match local insert, remove, copy, unpack = table.insert, table.remove, table.copy, table.unpack -local formatters = string.formatters -local sortedkeys = table.sortedkeys -local sortedhash = table.sortedhash -local tohash = table.tohash -local setmetatableindex = table.setmetatableindex - -local report = logs.reporter("otf reader") - -local trace_markwidth = false trackers.register("otf.markwidth",function(v) trace_markwidth = v end) - -local readers = fonts.handlers.otf.readers -local privateoffset = fonts.constructors and fonts.constructors.privateoffset or 0xF0000 -- 0x10FFFF - -local f_private = formatters["P%05X"] -local f_unicode = formatters["U%05X"] -local f_index = formatters["I%05X"] -local f_character_y = formatters["%C"] -local f_character_n = formatters["[ %C ]"] - -local check_duplicates = true -- can become an option (pseudo feature) / aways needed anyway -local check_soft_hyphen = true -- can become an option (pseudo feature) / needed for tagging +local formatters = string.formatters +local sortedkeys = table.sortedkeys +local sortedhash = table.sortedhash +local tohash = table.tohash +local setmetatableindex = table.setmetatableindex + +local report_error = logs.reporter("otf reader","error") +local report_markwidth = logs.reporter("otf reader","markwidth") +local report_cleanup = logs.reporter("otf reader","cleanup") +local report_optimizations = logs.reporter("otf reader","merges") +local report_unicodes = logs.reporter("otf reader","unicodes") + +local trace_markwidth = false trackers.register("otf.markwidth", function(v) trace_markwidth = v end) +local trace_cleanup = false trackers.register("otf.cleanups", function(v) trace_cleanups = v end) +local trace_optimizations = false trackers.register("otf.optimizations", function(v) trace_optimizations = v end) +local trace_unicodes = false trackers.register("otf.unicodes", function(v) trace_unicodes = v end) + +local readers = fonts.handlers.otf.readers +local privateoffset = fonts.constructors and fonts.constructors.privateoffset or 0xF0000 -- 0x10FFFF + +local f_private = formatters["P%05X"] +local f_unicode = formatters["U%05X"] +local f_index = formatters["I%05X"] +local f_character_y = formatters["%C"] +local f_character_n = formatters["[ %C ]"] + +local check_duplicates = true -- can become an option (pseudo feature) / aways needed anyway +local check_soft_hyphen = true -- can become an option (pseudo feature) / needed for tagging directives.register("otf.checksofthyphen",function(v) check_soft_hyphen = v @@ -67,6 +74,8 @@ local function unifyresources(fontdata,indices) return end -- + local nofindices = #indices + -- local variants = fontdata.resources.variants if variants then for selector, unicodes in next, variants do @@ -83,8 +92,8 @@ local function unifyresources(fontdata,indices) local u = indices[k] if u then newmarks[u] = v - else - report("discarding mark %i",k) + elseif trace_optimizations then + report_optimizations("discarding mark %i",k) end end return newmarks @@ -123,7 +132,12 @@ local function unifyresources(fontdata,indices) if not done[c] then local t = { } for k, v in next, c do - t[indices[k]] = v + local ug = indices[k] + if ug then + t[ug] = v + else + report_error("case %i, bad index in unifying %s: %s of %s",1,"coverage",k,nofindices) + end end cover[i] = t done[c] = d @@ -131,11 +145,16 @@ local function unifyresources(fontdata,indices) end end -- - local function recursed(c) -- ligs are not packed + local function recursed(c,kind) -- ligs are not packed local t = { } for g, d in next, c do if type(d) == "table" then - t[indices[g]] = recursed(d) + local ug = indices[g] + if ug then + t[ug] = recursed(d,kind) + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g,nofindices) + end else t[g] = indices[d] -- ligature end @@ -167,19 +186,31 @@ local function unifyresources(fontdata,indices) if duplicates then for g1, d1 in next, c do local ug1 = indices[g1] - local ud1 = indices[d1] - t1[ug1] = ud1 - -- - local dg1 = duplicates[ug1] - if dg1 then - for u in next, dg1 do - t1[u] = ud1 + if ug1 then + local ud1 = indices[d1] + if ud1 then + t1[ug1] = ud1 + local dg1 = duplicates[ug1] + if dg1 then + for u in next, dg1 do + t1[u] = ud1 + end + end + else + report_error("case %i, bad index in unifying %s: %s of %s",3,kind,d1,nofindices) end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) end end else for g1, d1 in next, c do - t1[indices[g1]] = indices[d1] + local ug1 = indices[g1] + if ug1 then + t1[ug1] = indices[d1] + else + report_error("fuzzy case %i in unifying %s: %i",2,kind,g1) + end end end done[c] = t1 @@ -193,15 +224,25 @@ local function unifyresources(fontdata,indices) if not t1 then t1 = { } for g1, d1 in next, c do - local t2 = done[d1] - if not t2 then - t2 = { } - for g2, d2 in next, d1 do - t2[indices[g2]] = d2 + local ug1 = indices[g1] + if ug1 then + local t2 = done[d1] + if not t2 then + t2 = { } + for g2, d2 in next, d1 do + local ug2 = indices[g2] + if ug2 then + t2[ug2] = d2 + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g2,nofindices,nofindices) + end + end + done[d1] = t2 end - done[d1] = t2 + t1[ug1] = t2 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end - t1[indices[g1]] = t2 end done[c] = t1 end @@ -210,7 +251,7 @@ local function unifyresources(fontdata,indices) elseif kind == "gsub_ligature" then local c = step.coverage if c then - step.coverage = recursed(c) + step.coverage = recursed(c,kind) end elseif kind == "gsub_alternate" or kind == "gsub_multiple" then local c = step.coverage @@ -221,22 +262,37 @@ local function unifyresources(fontdata,indices) if duplicates then for g1, d1 in next, c do for i=1,#d1 do - d1[i] = indices[d1[i]] + local d1i = d1[i] + local d1u = indices[d1i] + if d1u then + d1[i] = d1u + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,i,d1i,nofindices) + end end local ug1 = indices[g1] - t1[ug1] = d1 - -- - local dg1 = duplicates[ug1] - if dg1 then - for u in next, dg1 do - t1[u] = copy(d1) + if ug1 then + t1[ug1] = d1 + local dg1 = duplicates[ug1] + if dg1 then + for u in next, dg1 do + t1[u] = copy(d1) + end end + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end end else for g1, d1 in next, c do for i=1,#d1 do - d1[i] = indices[d1[i]] + local d1i = d1[i] + local d1u = indices[d1i] + if d1u then + d1[i] = d1u + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,d1i,nofindices) + end end t1[indices[g1]] = d1 end @@ -245,6 +301,41 @@ local function unifyresources(fontdata,indices) end step.coverage = t1 end + elseif kind == "gpos_single" then + local c = step.coverage + if c then + local t1 = done[c] + if not t1 then + t1 = { } + if duplicates then + for g1, d1 in next, c do + local ug1 = indices[g1] + if ug1 then + t1[ug1] = d1 + local dg1 = duplicates[ug1] + if dg1 then + for u in next, dg1 do + t1[u] = d1 + end + end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) + end + end + else + for g1, d1 in next, c do + local ug1 = indices[g1] + if ug1 then + t1[ug1] = d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) + end + end + end + done[c] = t1 + end + step.coverage = t1 + end elseif kind == "gpos_mark2base" or kind == "gpos_mark2mark" or kind == "gpos_mark2ligature" then local c = step.coverage if c then @@ -252,7 +343,12 @@ local function unifyresources(fontdata,indices) if not t1 then t1 = { } for g1, d1 in next, c do - t1[indices[g1]] = d1 + local ug1 = indices[g1] + if ug1 then + t1[ug1] = d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) + end end done[c] = t1 end @@ -267,7 +363,12 @@ local function unifyresources(fontdata,indices) if not t2 then t2 = { } for g2, d2 in next, d1 do - t2[indices[g2]] = d2 + local ug2 = indices[g2] + if ug2 then + t2[ug2] = d2 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g2,nofindices) + end end done[d1] = t2 end @@ -276,7 +377,7 @@ local function unifyresources(fontdata,indices) done[c] = c end end - elseif kind == "gpos_single" then + elseif kind == "gpos_cursive" then local c = step.coverage if c then local t1 = done[c] @@ -285,47 +386,29 @@ local function unifyresources(fontdata,indices) if duplicates then for g1, d1 in next, c do local ug1 = indices[g1] - t1[ug1] = d1 - -- - local dg1 = duplicates[ug1] - if dg1 then - for u in next, dg1 do - t1[u] = d1 + if ug1 then + t1[ug1] = d1 + -- + local dg1 = duplicates[ug1] + if dg1 then + -- probably needs a bit more + for u in next, dg1 do + t1[u] = copy(d1) + end end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) end end else for g1, d1 in next, c do - t1[indices[g1]] = d1 - end - end - done[c] = t1 - end - step.coverage = t1 - end - elseif kind == "gpos_cursive" then - local c = step.coverage - if c then - local t1 = done[c] - if not t1 then - t1 = { } - if duplicates then - for g1, d1 in next, c do local ug1 = indices[g1] - t1[ug1] = d1 - -- - local dg1 = duplicates[ug1] - if dg1 then - -- probably needs a bit more - for u in next, dg1 do - t1[u] = copy(d1) - end + if ug1 then + t1[ug1] = d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end end - else - for g1, d1 in next, c do - t1[indices[g1]] = d1 - end end done[c] = t1 end @@ -376,9 +459,13 @@ local function copyduplicates(fontdata) if not ds or ds.width == 0 then if ds then descriptions[0xAD] = nil - report("patching soft hyphen") + if trace_unicodes then + report_unicodes("patching soft hyphen") + end else - report("adding soft hyphen") + if trace_unicodes then + report_unicodes("adding soft hyphen") + end end if not duplicates then duplicates = { } @@ -414,10 +501,12 @@ local function copyduplicates(fontdata) end n = n + 1 end - if n <= m then - report("duplicates: %i : % t",n,t) - else - report("duplicates: %i : % t ...",n,t) + if trace_unicodes then + if n <= m then + report_unicodes("%i : % t",n,t) + else + report_unicodes("%i : % t ...",n,t) + end end else -- what a mess @@ -457,7 +546,6 @@ local function checklookups(fontdata,missing,nofmissing) end end end - local function collectthem(sequences) if not sequences then return @@ -549,7 +637,9 @@ local function checklookups(fontdata,missing,nofmissing) end end if nofmissing <= 0 then - report("all done in %s loops",loops) + if trace_unicodes then + report_unicodes("all missings done in %s loops",loops) + end return elseif old == nofmissing then break @@ -601,7 +691,9 @@ local function checklookups(fontdata,missing,nofmissing) recursed(ligatures[i]) end if nofmissing <= 0 then - report("all done in %s loops",loops) + if trace_unicodes then + report_unicodes("all missings done in %s loops",loops) + end return elseif old == nofmissing then break @@ -611,7 +703,7 @@ local function checklookups(fontdata,missing,nofmissing) n = 0 end - if nofmissing > 0 then + if trace_unicodes and nofmissing > 0 then local done = { } for i, r in next, missing do if r then @@ -623,7 +715,7 @@ local function checklookups(fontdata,missing,nofmissing) end end if next(done) then - report("not unicoded: % t",sortedkeys(done)) + report_unicode("not unicoded: % t",sortedkeys(done)) end end end @@ -648,6 +740,10 @@ local function unifymissing(fontdata) resources.unicodes = nil end +local firstprivate = fonts.privateoffsets.textbase or 0xF0000 +local puafirst = 0xE000 +local pualast = 0xF8FF + local function unifyglyphs(fontdata,usenames) local private = fontdata.private or privateoffset local glyphs = fontdata.glyphs @@ -671,45 +767,107 @@ local function unifyglyphs(fontdata,usenames) indices[0] = zerocode end -- - for index=1,#glyphs do - local glyph = glyphs[index] - local unicode = glyph.unicode -- this is the primary one - -- if not unicode then -- some fonts use the private space - if not unicode or unicode >= private or (unicode >= 0xE000 and unicode <= 0xF8FF) or unicode == 0xFFFE or unicode == 0xFFFF then - -- report("assigning private unicode %U to glyph indexed %05X (%s)",private,index,"unset") - unicode = private - -- glyph.unicode = -1 - if names then + if names then + -- seldom uses, we don't issue message ... this branch might even go away + for index=1,#glyphs do + local glyph = glyphs[index] + local unicode = glyph.unicode -- this is the primary one + if not unicode then + unicode = private local name = glyph.name or f_private(unicode) indices[index] = name names[name] = unicode - else - indices[index] = unicode - end - private = private + 1 - elseif descriptions[unicode] then - -- real weird - report("assigning private unicode %U to glyph indexed %05X (%C)",private,index,unicode) - unicode = private - -- glyph.unicode = -1 - if names then + private = private + 1 + elseif unicode >= firstprivate then + unicode = private + local name = glyph.name or f_private(unicode) + indices[index] = name + names[name] = unicode + private = private + 1 + elseif unicode >= puafirst and unicode <= pualast then local name = glyph.name or f_private(unicode) indices[index] = name names[name] = unicode + elseif descriptions[unicode] then + unicode = private + local name = glyph.name or f_private(unicode) + indices[index] = name + names[name] = unicode + private = private + 1 else - indices[index] = unicode - end - private = private + 1 - else - if names then local name = glyph.name or f_unicode(unicode) indices[index] = name names[name] = unicode + end + descriptions[unicode] = glyph + end + elseif trace_unicodes then + for index=1,#glyphs do + local glyph = glyphs[index] + local unicode = glyph.unicode -- this is the primary one + if not unicode then + unicode = private + indices[index] = unicode + private = private + 1 + elseif unicode >= firstprivate then + local name = glyph.name + if name then + report_unicodes("moving glyph %a indexed %05X from private %U to %U ",name,index,unicode,private) + else + report_unicodes("moving glyph indexed %05X from private %U to %U ",index,unicode,private) + end + unicode = private + indices[index] = unicode + private = private + 1 + elseif unicode >= puafirst and unicode <= pualast then + local name = glyph.name + if name then + report_unicodes("keeping private unicode %U for glyph %a indexed %05X",unicode,name,index) + else + report_unicodes("keeping private unicode %U for glyph indexed %05X",unicode,index) + end + indices[index] = unicode + elseif descriptions[unicode] then + local name = glyph.name + if name then + report_unicodes("assigning duplicate unicode %U to %U for glyph %a indexed %05X ",unicode,private,name,index) + else + report_unicodes("assigning duplicate unicode %U to %U for glyph indexed %05X ",unicode,private,index) + end + unicode = private + indices[index] = unicode + private = private + 1 + else + indices[index] = unicode + end + descriptions[unicode] = glyph + end + else + for index=1,#glyphs do + local glyph = glyphs[index] + local unicode = glyph.unicode -- this is the primary one + if not unicode then + unicode = private + indices[index] = unicode + private = private + 1 + elseif unicode >= firstprivate then + local name = glyph.name + unicode = private + indices[index] = unicode + private = private + 1 + elseif unicode >= puafirst and unicode <= pualast then + local name = glyph.name + indices[index] = unicode + elseif descriptions[unicode] then + local name = glyph.name + unicode = private + indices[index] = unicode + private = private + 1 else indices[index] = unicode end + descriptions[unicode] = glyph end - descriptions[unicode] = glyph end -- for index=1,#glyphs do @@ -762,29 +920,42 @@ local p_bogusname = ( (P("uni") + P("UNI") + P("Uni") + P("U") + P("u")) * S("Xx")^0 * R("09","AF")^1 + (P("identity") + P("Identity") + P("IDENTITY")) * R("09","AF")^1 + (P("index") + P("Index") + P("INDEX")) * R("09")^1 -) * P(-1) +) * (P(-1) + P(".")) + local function stripredundant(fontdata) local descriptions = fontdata.descriptions if descriptions then local n = 0 local c = 0 - for unicode, d in next, descriptions do - local name = d.name - if name and lpegmatch(p_bogusname,name) then - d.name = nil - n = n + 1 + -- in context we always strip + if not context and fonts.privateoffsets.keepnames then + for unicode, d in next, descriptions do + if d.class == "base" then + d.class = nil + c = c + 1 + end end - if d.class == "base" then - d.class = nil - c = c + 1 + else + for unicode, d in next, descriptions do + local name = d.name + if name and lpegmatch(p_bogusname,name) then + d.name = nil + n = n + 1 + end + if d.class == "base" then + d.class = nil + c = c + 1 + end end end - if n > 0 then - report("%s bogus names removed (verbose unicode)",n) - end - if c > 0 then - report("%s base class tags removed (default is base)",c) + if trace_cleanup then + if n > 0 then + report_cleanup("%s bogus names removed (verbose unicode)",n) + end + if c > 0 then + report_cleanup("%s base class tags removed (default is base)",c) + end end end end @@ -2126,12 +2297,16 @@ local function mergesteps_1(lookup,strict) local f = first.format for i=2,nofsteps do if steps[i].format ~= f then - report("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + end return 0 end end end - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target = first.coverage for i=2,nofsteps do local c = steps[i].coverage @@ -2160,12 +2335,16 @@ local function mergesteps_2(lookup) -- pairs local f = first.format for i=2,nofsteps do if steps[i].format ~= f then - report("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + end return 0 end end end - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target = first.coverage for i=2,nofsteps do local c = steps[i].coverage @@ -2196,7 +2375,9 @@ end local function mergesteps_3(lookup,strict) -- marks local steps = lookup.steps local nofsteps = lookup.nofsteps - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end -- check first local coverage = { } for i=1,nofsteps do @@ -2205,7 +2386,9 @@ local function mergesteps_3(lookup,strict) -- marks for k, v in next, c do local tk = coverage[k] -- { class, { x, y } } if tk then - report("quitting merge due to multiple checks") + if trace_optimizations then + report_optimizations("quitting merge due to multiple checks") + end return nofsteps else coverage[k] = v @@ -2255,7 +2438,9 @@ local function mergesteps_4(lookup) -- ligatures local steps = lookup.steps local nofsteps = lookup.nofsteps local first = steps[1] - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target = first.coverage for i=2,nofsteps do local c = steps[i].coverage @@ -2283,7 +2468,9 @@ local function mergesteps_5(lookup) -- cursive local steps = lookup.steps local nofsteps = lookup.nofsteps local first = steps[1] - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target = first.coverage local hash = nil for k, v in next, target do @@ -2335,7 +2522,9 @@ local function checkkerns(lookup) end end if kerns then - report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + end local c = { } for g1, d1 in next, coverage do if d1 and d1 ~= true then @@ -2395,7 +2584,9 @@ local function checkpairs(lookup) if step.format == "pair" then local coverage = onlykerns(step) if coverage then - report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + end for g1, d1 in next, coverage do local d = { } for g2, d2 in next, d1 do @@ -2518,17 +2709,19 @@ function readers.compact(data) end end end - else - report("no lookups in %a",what) + elseif trace_optimizations then + report_optimizations("no lookups in %a",what) end end compact("sequences") compact("sublookups") - if merged > 0 then - report("%i steps of %i removed due to merging",merged,allsteps) - end - if kerned > 0 then - report("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) + if trace_optimizations then + if merged > 0 then + report_optimizations("%i steps of %i removed due to merging",merged,allsteps) + end + if kerned > 0 then + report_optimizations("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) + end end end @@ -2628,7 +2821,7 @@ function readers.expand(data) -- or bb? d.width = defaultwidth elseif trace_markwidth and wd ~= 0 and d.class == "mark" then - report("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) + report_markwidth("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) end if bb then local ht = bb[4] diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-fonts-mis.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-fonts-mis.lua index d3cfd70a910..b472b86dda8 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-fonts-mis.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-fonts-mis.lua @@ -29,3 +29,7 @@ table.setmetatableindex(marks,function(t,k) return marks end end) + +function font.each() + return table.sortedhash(fonts.hashes.identifiers) +end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua index 8ee2fcb32de..ccf6d3a7cd0 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/fontloader-reference.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 : 09/24/18 14:11:29 +-- merge date : 10/02/18 23:17:57 do -- begin closure to overcome local limits and interference @@ -9049,9 +9049,11 @@ if not modules then modules={} end modules ['font-ini']={ license="see context related readme files" } local allocate=utilities.storage.allocate +local sortedhash=table.sortedhash fonts=fonts or {} local fonts=fonts -fonts.hashes=fonts.hashes or { identifiers=allocate() } +local identifiers=allocate() +fonts.hashes=fonts.hashes or { identifiers=identifiers } fonts.tables=fonts.tables or {} fonts.helpers=fonts.helpers or {} fonts.tracers=fonts.tracers or {} @@ -9061,9 +9063,17 @@ fonts.readers={} fonts.definers={ methods={} } fonts.loggers={ register=function() end } if context then + --removed end +fonts.privateoffsets={ + textbase=0xF0000, + textextrabase=0xFD000, + mathextrabase=0xFE000, + mathbase=0xFF000, + keepnames=false, +} end -- closure @@ -9096,6 +9106,9 @@ table.setmetatableindex(marks,function(t,k) return marks end end) +function font.each() + return table.sortedhash(fonts.hashes.identifiers) +end end -- closure @@ -9131,7 +9144,7 @@ constructors.autocleanup=true constructors.namemode="fullpath" constructors.version=1.01 constructors.cache=containers.define("fonts","constructors",constructors.version,false) -constructors.privateoffset=0xF0000 +constructors.privateoffset=fonts.privateoffsets.textbase or 0xF0000 constructors.cacheintex=true local designsizes=allocate() constructors.designsizes=designsizes @@ -10962,12 +10975,16 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures) missing[du]=true nofmissing=nofmissing+1 end + else end end else local overload=overloads[du] if overload then glyph.unicode=overload.unicode + elseif not glyph.unicode then + missing[du]=true + nofmissing=nofmissing+1 end end end @@ -13516,6 +13533,7 @@ local languages=allocate { ["kiu" ]="kirmanjki", ["kjd" ]="southern kiwai", ["kjp" ]="eastern pwo karen", + ["kjz" ]="bumthangkha", ["kkn" ]="kokni", ["klm" ]="kalmyk", ["kmb" ]="kamba", @@ -13604,6 +13622,7 @@ local languages=allocate { ["mdr" ]="mandar", ["men" ]="me'en", ["mer" ]="meru", + ["mfa" ]="pattani malay", ["mfe" ]="morisyen", ["min" ]="minangkabau", ["miz" ]="mizo", @@ -13801,6 +13820,7 @@ local languages=allocate { ["tpi" ]="tok pisin", ["trk" ]="turkish", ["tsg" ]="tsonga", + ["tsj" ]="tshangla", ["tua" ]="turoyo aramaic", ["tul" ]="tulu", ["tuv" ]="tuvin", @@ -13831,6 +13851,7 @@ local languages=allocate { ["xbd" ]="lü", ["xhs" ]="xhosa", ["xjb" ]="minjangbal", + ["xkf" ]="khengkha", ["xog" ]="soga", ["xpe" ]="kpelle (liberia)", ["yak" ]="sakha", @@ -17145,7 +17166,7 @@ if not modules then modules={} end modules ['font-dsp']={ copyright="PRAGMA ADE / ConTeXt Development Team", license="see context related readme files" } -local next,type=next,type +local next,type,tonumber=next,type,tonumber local band=bit32.band local extract=bit32.extract local bor=bit32.bor @@ -17930,8 +17951,9 @@ local function unchainedcontext(f,fontdata,lookupid,lookupoffset,offset,glyphs,n rules=rules, } elseif subtype==3 then - local current=readarray(f) + local nofglyphs=readushort(f) local noflookups=readushort(f) + local current=readcardinaltable(f,nofglyphs,ushort) local lookups=readlookuparray(f,noflookups,#current) current=readcoveragearray(f,tableoffset,current,true) return { @@ -18125,7 +18147,7 @@ function gsubhandlers.single(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofg local delta=readshort(f) local coverage=readcoverage(f,tableoffset+coverage) for index in next,coverage do - local newindex=index+delta + local newindex=(index+delta)%65536 if index>nofglyphs or newindex>nofglyphs then report("invalid index in %s format %i: %i -> %i (max %i)","single",subtype,index,newindex,nofglyphs) coverage[index]=nil @@ -19011,7 +19033,6 @@ do if not rlookups then report_issue(i,what,sequence,"no") elseif not next(rlookups) then - report_issue(i,what,sequence,"empty") rule.lookups=nil else local length=#rlookups @@ -19200,7 +19221,7 @@ do elseif specification.globalkerns then name="globalkern" else - report("ignoring global kern table using gpos kern feature") + report("ignoring global kern table, using gpos kern feature") return end setposition(f,datatable.offset) @@ -20167,8 +20188,15 @@ local sortedkeys=table.sortedkeys local sortedhash=table.sortedhash local tohash=table.tohash local setmetatableindex=table.setmetatableindex -local report=logs.reporter("otf reader") +local report_error=logs.reporter("otf reader","error") +local report_markwidth=logs.reporter("otf reader","markwidth") +local report_cleanup=logs.reporter("otf reader","cleanup") +local report_optimizations=logs.reporter("otf reader","merges") +local report_unicodes=logs.reporter("otf reader","unicodes") local trace_markwidth=false trackers.register("otf.markwidth",function(v) trace_markwidth=v end) +local trace_cleanup=false trackers.register("otf.cleanups",function(v) trace_cleanups=v end) +local trace_optimizations=false trackers.register("otf.optimizations",function(v) trace_optimizations=v end) +local trace_unicodes=false trackers.register("otf.unicodes",function(v) trace_unicodes=v end) local readers=fonts.handlers.otf.readers local privateoffset=fonts.constructors and fonts.constructors.privateoffset or 0xF0000 local f_private=formatters["P%05X"] @@ -20209,6 +20237,7 @@ local function unifyresources(fontdata,indices) if not descriptions or not resources then return end + local nofindices=#indices local variants=fontdata.resources.variants if variants then for selector,unicodes in next,variants do @@ -20224,8 +20253,8 @@ local function unifyresources(fontdata,indices) local u=indices[k] if u then newmarks[u]=v - else - report("discarding mark %i",k) + elseif trace_optimizations then + report_optimizations("discarding mark %i",k) end end return newmarks @@ -20258,18 +20287,28 @@ local function unifyresources(fontdata,indices) if not done[c] then local t={} for k,v in next,c do - t[indices[k]]=v + local ug=indices[k] + if ug then + t[ug]=v + else + report_error("case %i, bad index in unifying %s: %s of %s",1,"coverage",k,nofindices) + end end cover[i]=t done[c]=d end end end - local function recursed(c) + local function recursed(c,kind) local t={} for g,d in next,c do if type(d)=="table" then - t[indices[g]]=recursed(d) + local ug=indices[g] + if ug then + t[ug]=recursed(d,kind) + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g,nofindices) + end else t[g]=indices[d] end @@ -20297,18 +20336,31 @@ local function unifyresources(fontdata,indices) if duplicates then for g1,d1 in next,c do local ug1=indices[g1] - local ud1=indices[d1] - t1[ug1]=ud1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=ud1 + if ug1 then + local ud1=indices[d1] + if ud1 then + t1[ug1]=ud1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=ud1 + end + end + else + report_error("case %i, bad index in unifying %s: %s of %s",3,kind,d1,nofindices) end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) end end else for g1,d1 in next,c do - t1[indices[g1]]=indices[d1] + local ug1=indices[g1] + if ug1 then + t1[ug1]=indices[d1] + else + report_error("fuzzy case %i in unifying %s: %i",2,kind,g1) + end end end done[c]=t1 @@ -20322,15 +20374,25 @@ local function unifyresources(fontdata,indices) if not t1 then t1={} for g1,d1 in next,c do - local t2=done[d1] - if not t2 then - t2={} - for g2,d2 in next,d1 do - t2[indices[g2]]=d2 + local ug1=indices[g1] + if ug1 then + local t2=done[d1] + if not t2 then + t2={} + for g2,d2 in next,d1 do + local ug2=indices[g2] + if ug2 then + t2[ug2]=d2 + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g2,nofindices,nofindices) + end + end + done[d1]=t2 end - done[d1]=t2 + t1[ug1]=t2 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end - t1[indices[g1]]=t2 end done[c]=t1 end @@ -20339,7 +20401,7 @@ local function unifyresources(fontdata,indices) elseif kind=="gsub_ligature" then local c=step.coverage if c then - step.coverage=recursed(c) + step.coverage=recursed(c,kind) end elseif kind=="gsub_alternate" or kind=="gsub_multiple" then local c=step.coverage @@ -20350,21 +20412,37 @@ local function unifyresources(fontdata,indices) if duplicates then for g1,d1 in next,c do for i=1,#d1 do - d1[i]=indices[d1[i]] + local d1i=d1[i] + local d1u=indices[d1i] + if d1u then + d1[i]=d1u + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,i,d1i,nofindices) + end end local ug1=indices[g1] - t1[ug1]=d1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=copy(d1) + if ug1 then + t1[ug1]=d1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=copy(d1) + end end + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end end else for g1,d1 in next,c do for i=1,#d1 do - d1[i]=indices[d1[i]] + local d1i=d1[i] + local d1u=indices[d1i] + if d1u then + d1[i]=d1u + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,d1i,nofindices) + end end t1[indices[g1]]=d1 end @@ -20373,6 +20451,41 @@ local function unifyresources(fontdata,indices) end step.coverage=t1 end + elseif kind=="gpos_single" then + local c=step.coverage + if c then + local t1=done[c] + if not t1 then + t1={} + if duplicates then + for g1,d1 in next,c do + local ug1=indices[g1] + if ug1 then + t1[ug1]=d1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=d1 + end + end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) + end + end + else + for g1,d1 in next,c do + local ug1=indices[g1] + if ug1 then + t1[ug1]=d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) + end + end + end + done[c]=t1 + end + step.coverage=t1 + end elseif kind=="gpos_mark2base" or kind=="gpos_mark2mark" or kind=="gpos_mark2ligature" then local c=step.coverage if c then @@ -20380,7 +20493,12 @@ local function unifyresources(fontdata,indices) if not t1 then t1={} for g1,d1 in next,c do - t1[indices[g1]]=d1 + local ug1=indices[g1] + if ug1 then + t1[ug1]=d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) + end end done[c]=t1 end @@ -20395,7 +20513,12 @@ local function unifyresources(fontdata,indices) if not t2 then t2={} for g2,d2 in next,d1 do - t2[indices[g2]]=d2 + local ug2=indices[g2] + if ug2 then + t2[ug2]=d2 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g2,nofindices) + end end done[d1]=t2 end @@ -20404,7 +20527,7 @@ local function unifyresources(fontdata,indices) done[c]=c end end - elseif kind=="gpos_single" then + elseif kind=="gpos_cursive" then local c=step.coverage if c then local t1=done[c] @@ -20413,44 +20536,27 @@ local function unifyresources(fontdata,indices) if duplicates then for g1,d1 in next,c do local ug1=indices[g1] - t1[ug1]=d1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=d1 + if ug1 then + t1[ug1]=d1 + local dg1=duplicates[ug1] + if dg1 then + for u in next,dg1 do + t1[u]=copy(d1) + end end + else + report_error("case %i, bad index in unifying %s: %s of %s",1,kind,g1,nofindices) end end else for g1,d1 in next,c do - t1[indices[g1]]=d1 - end - end - done[c]=t1 - end - step.coverage=t1 - end - elseif kind=="gpos_cursive" then - local c=step.coverage - if c then - local t1=done[c] - if not t1 then - t1={} - if duplicates then - for g1,d1 in next,c do local ug1=indices[g1] - t1[ug1]=d1 - local dg1=duplicates[ug1] - if dg1 then - for u in next,dg1 do - t1[u]=copy(d1) - end + if ug1 then + t1[ug1]=d1 + else + report_error("case %i, bad index in unifying %s: %s of %s",2,kind,g1,nofindices) end end - else - for g1,d1 in next,c do - t1[indices[g1]]=d1 - end end done[c]=t1 end @@ -20494,9 +20600,13 @@ local function copyduplicates(fontdata) if not ds or ds.width==0 then if ds then descriptions[0xAD]=nil - report("patching soft hyphen") + if trace_unicodes then + report_unicodes("patching soft hyphen") + end else - report("adding soft hyphen") + if trace_unicodes then + report_unicodes("adding soft hyphen") + end end if not duplicates then duplicates={} @@ -20532,10 +20642,12 @@ local function copyduplicates(fontdata) end n=n+1 end - if n<=m then - report("duplicates: %i : % t",n,t) - else - report("duplicates: %i : % t ...",n,t) + if trace_unicodes then + if n<=m then + report_unicodes("%i : % t",n,t) + else + report_unicodes("%i : % t ...",n,t) + end end else end @@ -20657,7 +20769,9 @@ local function checklookups(fontdata,missing,nofmissing) end end if nofmissing<=0 then - report("all done in %s loops",loops) + if trace_unicodes then + report_unicodes("all missings done in %s loops",loops) + end return elseif old==nofmissing then break @@ -20706,7 +20820,9 @@ local function checklookups(fontdata,missing,nofmissing) recursed(ligatures[i]) end if nofmissing<=0 then - report("all done in %s loops",loops) + if trace_unicodes then + report_unicodes("all missings done in %s loops",loops) + end return elseif old==nofmissing then break @@ -20715,7 +20831,7 @@ local function checklookups(fontdata,missing,nofmissing) t=nil n=0 end - if nofmissing>0 then + if trace_unicodes and nofmissing>0 then local done={} for i,r in next,missing do if r then @@ -20727,7 +20843,7 @@ local function checklookups(fontdata,missing,nofmissing) end end if next(done) then - report("not unicoded: % t",sortedkeys(done)) + report_unicode("not unicoded: % t",sortedkeys(done)) end end end @@ -20750,6 +20866,9 @@ local function unifymissing(fontdata) fonts.mappings.addtounicode(fontdata,fontdata.filename,checklookups) resources.unicodes=nil end +local firstprivate=fonts.privateoffsets.textbase or 0xF0000 +local puafirst=0xE000 +local pualast=0xF8FF local function unifyglyphs(fontdata,usenames) local private=fontdata.private or privateoffset local glyphs=fontdata.glyphs @@ -20772,40 +20891,106 @@ local function unifyglyphs(fontdata,usenames) else indices[0]=zerocode end - for index=1,#glyphs do - local glyph=glyphs[index] - local unicode=glyph.unicode - if not unicode or unicode>=private or (unicode>=0xE000 and unicode<=0xF8FF) or unicode==0xFFFE or unicode==0xFFFF then - unicode=private - if names then + if names then + for index=1,#glyphs do + local glyph=glyphs[index] + local unicode=glyph.unicode + if not unicode then + unicode=private local name=glyph.name or f_private(unicode) indices[index]=name names[name]=unicode - else - indices[index]=unicode - end - private=private+1 - elseif descriptions[unicode] then - report("assigning private unicode %U to glyph indexed %05X (%C)",private,index,unicode) - unicode=private - if names then + private=private+1 + elseif unicode>=firstprivate then + unicode=private + local name=glyph.name or f_private(unicode) + indices[index]=name + names[name]=unicode + private=private+1 + elseif unicode>=puafirst and unicode<=pualast then local name=glyph.name or f_private(unicode) indices[index]=name names[name]=unicode + elseif descriptions[unicode] then + unicode=private + local name=glyph.name or f_private(unicode) + indices[index]=name + names[name]=unicode + private=private+1 else - indices[index]=unicode - end - private=private+1 - else - if names then local name=glyph.name or f_unicode(unicode) indices[index]=name names[name]=unicode + end + descriptions[unicode]=glyph + end + elseif trace_unicodes then + for index=1,#glyphs do + local glyph=glyphs[index] + local unicode=glyph.unicode + if not unicode then + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=firstprivate then + local name=glyph.name + if name then + report_unicodes("moving glyph %a indexed %05X from private %U to %U ",name,index,unicode,private) + else + report_unicodes("moving glyph indexed %05X from private %U to %U ",index,unicode,private) + end + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=puafirst and unicode<=pualast then + local name=glyph.name + if name then + report_unicodes("keeping private unicode %U for glyph %a indexed %05X",unicode,name,index) + else + report_unicodes("keeping private unicode %U for glyph indexed %05X",unicode,index) + end + indices[index]=unicode + elseif descriptions[unicode] then + local name=glyph.name + if name then + report_unicodes("assigning duplicate unicode %U to %U for glyph %a indexed %05X ",unicode,private,name,index) + else + report_unicodes("assigning duplicate unicode %U to %U for glyph indexed %05X ",unicode,private,index) + end + unicode=private + indices[index]=unicode + private=private+1 + else + indices[index]=unicode + end + descriptions[unicode]=glyph + end + else + for index=1,#glyphs do + local glyph=glyphs[index] + local unicode=glyph.unicode + if not unicode then + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=firstprivate then + local name=glyph.name + unicode=private + indices[index]=unicode + private=private+1 + elseif unicode>=puafirst and unicode<=pualast then + local name=glyph.name + indices[index]=unicode + elseif descriptions[unicode] then + local name=glyph.name + unicode=private + indices[index]=unicode + private=private+1 else indices[index]=unicode end + descriptions[unicode]=glyph end - descriptions[unicode]=glyph end for index=1,#glyphs do local math=glyphs[index].math @@ -20849,28 +21034,39 @@ local function unifyglyphs(fontdata,usenames) end local p_bogusname=( (P("uni")+P("UNI")+P("Uni")+P("U")+P("u"))*S("Xx")^0*R("09","AF")^1+(P("identity")+P("Identity")+P("IDENTITY"))*R("09","AF")^1+(P("index")+P("Index")+P("INDEX"))*R("09")^1 -)*P(-1) +)*(P(-1)+P(".")) local function stripredundant(fontdata) local descriptions=fontdata.descriptions if descriptions then local n=0 local c=0 - for unicode,d in next,descriptions do - local name=d.name - if name and lpegmatch(p_bogusname,name) then - d.name=nil - n=n+1 + if not context and fonts.privateoffsets.keepnames then + for unicode,d in next,descriptions do + if d.class=="base" then + d.class=nil + c=c+1 + end end - if d.class=="base" then - d.class=nil - c=c+1 + else + for unicode,d in next,descriptions do + local name=d.name + if name and lpegmatch(p_bogusname,name) then + d.name=nil + n=n+1 + end + if d.class=="base" then + d.class=nil + c=c+1 + end end end - if n>0 then - report("%s bogus names removed (verbose unicode)",n) - end - if c>0 then - report("%s base class tags removed (default is base)",c) + if trace_cleanup then + if n>0 then + report_cleanup("%s bogus names removed (verbose unicode)",n) + end + if c>0 then + report_cleanup("%s base class tags removed (default is base)",c) + end end end end @@ -21959,12 +22155,16 @@ local function mergesteps_1(lookup,strict) local f=first.format for i=2,nofsteps do if steps[i].format~=f then - report("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + end return 0 end end end - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage for i=2,nofsteps do local c=steps[i].coverage @@ -21989,12 +22189,16 @@ local function mergesteps_2(lookup) local f=first.format for i=2,nofsteps do if steps[i].format~=f then - report("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("not merging %a steps of %a lookup %a, different formats",nofsteps,lookup.type,lookup.name) + end return 0 end end end - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage for i=2,nofsteps do local c=steps[i].coverage @@ -22021,7 +22225,9 @@ end local function mergesteps_3(lookup,strict) local steps=lookup.steps local nofsteps=lookup.nofsteps - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local coverage={} for i=1,nofsteps do local c=steps[i].coverage @@ -22029,7 +22235,9 @@ local function mergesteps_3(lookup,strict) for k,v in next,c do local tk=coverage[k] if tk then - report("quitting merge due to multiple checks") + if trace_optimizations then + report_optimizations("quitting merge due to multiple checks") + end return nofsteps else coverage[k]=v @@ -22076,7 +22284,9 @@ local function mergesteps_4(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps local first=steps[1] - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage for i=2,nofsteps do local c=steps[i].coverage @@ -22099,7 +22309,9 @@ local function mergesteps_5(lookup) local steps=lookup.steps local nofsteps=lookup.nofsteps local first=steps[1] - report("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("merging %a steps of %a lookup %a",nofsteps,lookup.type,lookup.name) + end local target=first.coverage local hash=nil for k,v in next,target do @@ -22148,7 +22360,9 @@ local function checkkerns(lookup) end end if kerns then - report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + end local c={} for g1,d1 in next,coverage do if d1 and d1~=true then @@ -22189,7 +22403,9 @@ local function checkpairs(lookup) if step.format=="pair" then local coverage=onlykerns(step) if coverage then - report("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + if trace_optimizations then + report_optimizations("turning pairs of step %a of %a lookup %a into kerns",i,lookup.type,lookup.name) + end for g1,d1 in next,coverage do local d={} for g2,d2 in next,d1 do @@ -22305,17 +22521,19 @@ function readers.compact(data) end end end - else - report("no lookups in %a",what) + elseif trace_optimizations then + report_optimizations("no lookups in %a",what) end end compact("sequences") compact("sublookups") - if merged>0 then - report("%i steps of %i removed due to merging",merged,allsteps) - end - if kerned>0 then - report("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) + if trace_optimizations then + if merged>0 then + report_optimizations("%i steps of %i removed due to merging",merged,allsteps) + end + if kerned>0 then + report_optimizations("%i steps of %i steps turned from pairs into kerns",kerned,allsteps) + end end end local function mergesteps(t,k) @@ -22406,7 +22624,7 @@ function readers.expand(data) if not wd then d.width=defaultwidth elseif trace_markwidth and wd~=0 and d.class=="mark" then - report("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) + report_markwidth("mark %a with width %b found in %a",d.name or "<noname>",wd,basename) end if bb then local ht=bb[4] @@ -22586,7 +22804,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_de local report_otf=logs.reporter("fonts","otf loading") local fonts=fonts local otf=fonts.handlers.otf -otf.version=3.104 +otf.version=3.106 otf.cache=containers.define("fonts","otl",otf.version,true) otf.svgcache=containers.define("fonts","svg",otf.version,true) otf.sbixcache=containers.define("fonts","sbix",otf.version,true) @@ -22662,7 +22880,7 @@ function otf.load(filename,sub,instance) end if reload then report_otf("loading %a, hash %a",filename,hash) - starttiming(otfreaders) + starttiming(otfreaders,true) data=otfreaders.loadfont(filename,sub or 1,instance) if data then local used=checkmemory() @@ -22745,6 +22963,7 @@ function otf.load(filename,sub,instance) checkmemory(used,threshold,tracememory) end else + stoptiming(otfreaders) data=nil report_otf("loading failed due to read error") end diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua index 03027e760e3..180f4bb6731 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua @@ -2,7 +2,7 @@ ----------------------------------------------------------------------- -- FILE: luaotfload-auxiliary.lua -- DESCRIPTION: part of luaotfload --- REQUIREMENTS: luaotfload 2.9 +-- REQUIREMENTS: luaotfload 2.91 -- AUTHOR: Khaled Hosny, Élie Roux, Philipp Gesang ----------------------------------------------------------------------- -- diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua index 13b2e05157b..de541db051f 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-colors.lua @@ -1,5 +1,5 @@ if not modules then modules = { } end modules ['luaotfload-colors'] = { - version = "2.9", + version = "2.91", comment = "companion to luaotfload-main.lua (font color)", author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle", copyright = "Luaotfload Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua index d7604241c4d..45397189d0f 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-configuration.lua @@ -2,14 +2,14 @@ ------------------------------------------------------------------------------- -- FILE: luaotfload-configuration.lua -- DESCRIPTION: config file reader --- REQUIREMENTS: Luaotfload 2.8 or above +-- REQUIREMENTS: Luaotfload 2.9 or above -- AUTHOR: Philipp Gesang, <phg@phi-gamma.net> -- AUTHOR: Dohyun Kim <nomosnomos@gmail.com> ------------------------------------------------------------------------------- -- if not modules then modules = { } end modules ["luaotfload-configuration"] = { - version = "2.9", + version = "2.91", comment = "part of Luaotfload", author = "Philipp Gesang, Dohyun Kim", copyright = "Luaotfload Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua index a195eaae724..b825c0b3e64 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua @@ -1,5 +1,5 @@ if not modules then modules = { } end modules ['luaotfload-database'] = { - version = "2.9", + version = "2.91", comment = "companion to luaotfload-main.lua", author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", copyright = "Luaotfload Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua index c69cab3a720..b66c1160b65 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-features.lua @@ -1,5 +1,5 @@ if not modules then modules = { } end modules ["features"] = { - version = "2.9", + version = "2.91", comment = "companion to luaotfload-main.lua", author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger", copyright = "PRAGMA ADE / ConTeXt Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua index 3446b79aff9..29ce2de3111 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-filelist.lua @@ -1,9 +1,9 @@ ------------------------------------------------------------------------------- -- FILE: luaotfload-filelist.lua -- DESCRIPTION: a table with the files of luaotfload --- VERSION: 2.9 +-- VERSION: 2.91 -- AUTHOR: Ulrike Fischer, <fischer@troubleshooting-tex.de> --- DATE: 2018-09-23 +-- DATE: 2018-10-03 ------------------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua index b50b5c2291d..50fbee19a61 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-init.lua @@ -3,7 +3,7 @@ -- FILE: luaotfload-init.lua -- DESCRIPTION: Luaotfload font loader initialization -- REQUIREMENTS: luatex v.0.80 or later; packages lualibs --- VERSION: 2.9 2018-09-24 +-- VERSION: 2.91 2018-10-03 -- AUTHOR: Philipp Gesang (Phg), <phg@phi-gamma.net>, Marcel Krüger ----------------------------------------------------------------------- -- @@ -601,18 +601,18 @@ local init_main = function () fontloader, path) local _void = require (path) - elseif fontloader then + elseif kpselookup (("fontloader-%s.lua"):format(fontloader)) then logreport ("log", 0, "init", "Using predefined fontloader “%s”.", fontloader) load_fontloader_module (fontloader) else - logreport ("log", 0, "init", + logreport ("both", 0, "init", "No match for requested fontloader “%s”.", fontloader) fontloader = luaotfload.fontloader_package - logreport ("log", 0, "init", + logreport ("both", 0, "init", "Defaulting to predefined fontloader “%s”.", fontloader) load_fontloader_module (fontloader) diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua index 104047ba8ba..9e9350905ac 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-letterspace.lua @@ -1,5 +1,5 @@ if not modules then modules = { } end modules ['letterspace'] = { - version = "2.9", + version = "2.91", comment = "companion to luaotfload-main.lua", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL; adapted by Philipp Gesang, Ulrike Fischer", copyright = "PRAGMA ADE / ConTeXt Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua index 8ba3e1c474a..07c7c1235b7 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-log.lua @@ -1,5 +1,5 @@ if not modules then modules = { } end modules ["luaotfload-log"] = { - version = "2.9", + version = "2.91", comment = "companion to Luaotfload", author = "Khaled Hosny, Elie Roux, Philipp Gesang", copyright = "Luaotfload Development Team", diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua index 1ac0752c621..727bfb07689 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-main.lua @@ -11,7 +11,7 @@ config = config or { } luaotfload = luaotfload or { } local luaotfload = luaotfload luaotfload.log = luaotfload.log or { } -luaotfload.version = "2.9" +luaotfload.version = "2.91" luaotfload.loaders = { } luaotfload.min_luatex_version = { 0, 95, 0 } luaotfload.fontloader_package = "reference" --- default: from current Context @@ -52,8 +52,8 @@ local authors = "\z luaotfload.module = { name = "luaotfload-main", - version = 2.90001, - date = "2018/09/24", + version = 2.91001, + date = "2018/10/03", description = "OpenType layout system.", author = authors, copyright = authors, diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua index cb3cdd57811..443c60fe2f1 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload-status.lua @@ -1,8 +1,8 @@ return { ["hashes"]={ - { "fontloader-2018-09-24.lua", "9b44571b829ca5276deffe1d1a9c8673" }, + { "fontloader-2018-10-02.lua", "0f32b26fe46cb16473473c3d67084433" }, { "fontloader-util-fil.lua", "258d23db3b135c06ceb87faecbe785b4" }, - { "fontloader-util-str.lua", "98fd6915ad05564aed39dff72102b6db" }, + { "fontloader-util-str.lua", "48e82196229dca83ad7be2d8b42fc203" }, { "fontloader-l-unicode.lua", "c8dd70435ced1bd05e257557a05b718b" }, { "fontloader-l-math.lua", "082add08e0bb79f39191ae9534a79849" }, { "fontloader-l-boolean.lua", "abe28515dd33e8f6c416c09bca351cf8" }, @@ -18,7 +18,7 @@ return { { "fontloader-fonts-ext.lua", "32013cbc5d5d336be8b1d1e5879d86c4" }, { "fontloader-fonts-def.lua", "f435e0875f203f343157baeff876ec9c" }, { "fontloader-fonts-enc.lua", "5ff4ca50493d7c4ecea0e15c203099f0" }, - { "fontloader-fonts-mis.lua", "f8d0788d2554d71720dc543cf4ffafe1" }, + { "fontloader-fonts-mis.lua", "17e967c9ec4d001deefd43ddf25e98f7" }, { "fontloader-basics-nod.lua", "78f56219685f3145b9393c2b688aad94" }, { "fontloader-font-imp-effects.lua", "3327181ef3db6f44dd234ad66ccc3f38" }, { "fontloader-font-imp-italics.lua", "c2e6d6c4096a2c30d68fbffd3d7d58a7" }, @@ -29,7 +29,7 @@ return { { "fontloader-font-tfm.lua", "c9797c1b4ccb8fdb7f041e19207109a2" }, { "fontloader-font-afk.lua", "9da14e0fb22129c053acc599d1312544" }, { "fontloader-font-one.lua", "52588c7c3aab714d95d03e91ee86e1ad" }, - { "fontloader-font-onr.lua", "66a0c352b5c36b9974aab1b5026152f2" }, + { "fontloader-font-onr.lua", "cf93eb4ab34461d2b3797792dbdb035f" }, { "fontloader-font-otc.lua", "9dcd93d83bc61c90f0fb6161a1911a55" }, { "fontloader-font-ocl.lua", "49cf3230228aa7f2d19cd491f55f5395" }, { "fontloader-font-osd.lua", "d2b542031aa693bb423b6d3272820c9a" }, @@ -37,50 +37,50 @@ return { { "fontloader-font-ota.lua", "d883cf661bb8c27bfa9b7cc66420c1ed" }, { "fontloader-font-otj.lua", "578448ae37a167319dbccd5af04738da" }, { "fontloader-font-oto.lua", "d78a6165b7ff6c21f4c3c4c3c0553648" }, - { "fontloader-font-otl.lua", "fcc55ae6cff5fd55b5054f923c21cafa" }, - { "fontloader-font-oup.lua", "020f2630f5a18d39e209f1cbf7a334ea" }, - { "fontloader-font-dsp.lua", "9cade9beb226c61b4323729aca1f4a80" }, + { "fontloader-font-otl.lua", "40cdceeb682bac55b4a69465b76bcc33" }, + { "fontloader-font-oup.lua", "ab288020c44f14da4d7eff185a37c8a4" }, + { "fontloader-font-dsp.lua", "cb8138a91cfbe562467821c5e0c2568e" }, { "fontloader-font-ttf.lua", "ff587471f4297aa8ba0fa022609adc6e" }, - { "fontloader-font-cff.lua", "eefa156275ba0ac91aa651a944d35978" }, - { "fontloader-font-ott.lua", "a4dd9bc516bdb7669ee61d5207f899c6" }, + { "fontloader-font-cff.lua", "428a467664b5f49b812b2d66f579e3cf" }, + { "fontloader-font-ott.lua", "b20ddcf6360a2e35e79b7bdad0289a19" }, { "fontloader-font-oti.lua", "309a75f9c14b77d87e94eba827dc4e71" }, { "fontloader-font-otr.lua", "4a1dae571a43d7cb8afce7e906df89c6" }, { "fontloader-font-vfc.lua", "237aff1862009b7850653c2098473bd4" }, - { "fontloader-font-map.lua", "2c03dc61afabb5887ef18a88e6ec86bd" }, + { "fontloader-font-map.lua", "f57b80596cf5096c3505c0f3ef4285a8" }, { "fontloader-font-cid.lua", "22b0367742fb253deef84ef7ccf5e8de" }, - { "fontloader-font-con.lua", "3218bd21a24c2abb13b284085da8ced4" }, - { "fontloader-font-ini.lua", "6f615d3bc72fb29f409ed2b8f6364c35" }, + { "fontloader-font-con.lua", "eff77b4c54c2d26eacb29de59e94e2f9" }, + { "fontloader-font-ini.lua", "dd3ff5febc73c79b23e16d713a1282fb" }, { "fontloader-data-con.lua", "d8982c834ed9acc6193eee23067b9d5d" }, - { "fontloader-reference.lua", "78d6781759aa7a701282370a9c02bbb5" }, + { "fontloader-reference.lua", "087a1ac6e832824c0387692b76d38735" }, { "fontloader-basics-gen.lua", "a1e8c7de52ec6a8afcce3b2105f0d355" }, { "mktests", "c7cff7025962922944376acc1ffa9c47" }, { "mkstatus", "66bd373bfc704d78084cfe95a6b9c192" }, { "mkcharacters", "42bb2bec362979ffdccce9be69acc5fb" }, { "mkglyphlist", "2ff6dcdec67b4853c6ad102a16fa8539" }, { "mkimport", "2540d1920712e0b3777d0dc0aec52729" }, - { "luaotfload-glyphlist.lua", "bcf89e1441be9f4ad29c0cf3a076bcea" }, + { "luaotfload-glyphlist.lua", "b53cbf4a32c0f3fa4ece22d533b698ca" }, { "luaotfload-characters.lua", "910152da2c9ae773c539284ac6cb0a90" }, { "luaotfload-resolvers.lua", "6cd52af62c4726ba8fce657376de4579" }, { "luaotfload-parsers.lua", "c6e627e3b157fc4004f7c9e715c01822" }, { "luaotfload-loaders.lua", "a2bdea2fc644fbc31efec7377312b282" }, - { "luaotfload-letterspace.lua", "078b211a668ac6943141442b84062354" }, - { "luaotfload-features.lua", "14041df7943fb33d0d2493b14cf95706" }, - { "luaotfload-database.lua", "f4ee22158855438aa8a29623552ed82c" }, - { "luaotfload-configuration.lua", "12e69f5d83340c8fb810c590f16f60cf" }, - { "luaotfload-colors.lua", "d494389674e7fe39678f4819c7bd0d00" }, - { "luaotfload-auxiliary.lua", "6788b0f763d759933de8c1d493421210" }, - { "luaotfload-filelist.lua", "dae5349af86ec3b471f9a57eb6b5631b" }, - { "luaotfload-tool.lua", "e3cc9e50fb9fc5ce3428c0c8ac72bf25" }, + { "luaotfload-letterspace.lua", "aea76b256d57b1c323e187f6d1c5523a" }, + { "luaotfload-features.lua", "a21be7e463260c98e69f232c2fad3798" }, + { "luaotfload-database.lua", "72df8179882da8e0045e9ce8574046f4" }, + { "luaotfload-configuration.lua", "dca6b1f7a05ab469aeedb23092511801" }, + { "luaotfload-colors.lua", "6fbe333cc790b0e0e85df10df2c42d65" }, + { "luaotfload-auxiliary.lua", "4c81811eb5da713a80f53ad21011b35a" }, + { "luaotfload-filelist.lua", "1c4ae87307a75ce3d09d9fa6a224c6ba" }, + { "luaotfload-tool.lua", "0974625b294bb157ef3d7b930dec08bc" }, { "luaotfload-diagnostics.lua", "1ff35d5ef3adf4e9d92ee3f979672b9c" }, - { "luaotfload-log.lua", "7b9e8dd90047a06a8840d662f2b63739" }, - { "luaotfload-init.lua", "63d9efafb1a9f659f7f2cce355022899" }, - { "luaotfload-main.lua", "c4784393b85fb082a100ffaf100d5e74" }, + { "luaotfload-log.lua", "faf32504a1c3310197f154caf015a7c4" }, + { "luaotfload-init.lua", "79dd1f0754ac710c8b43f60059aa105c" }, + { "luaotfload-main.lua", "d9b80dcf36322ef52f29339dda858845" }, }, ["notes"]={ ["committer"]="Ulrike Fischer <fischer@troubleshooting-tex.de>", - ["description"]="2.9", - ["loader"]="fontloader-2018-09-24.lua", - ["revision"]="f9f554b2305fba2bc075b84380321104161e230d", - ["timestamp"]="2018-09-25 16:34:44 +0200", + ["description"]="v2.91", + ["loader"]="fontloader-2018-10-02.lua", + ["revision"]="0f1daff67762435aeabbb00a7874e5b1adba432e", + ["timestamp"]="2018-10-03 00:47:03 +0200", }, }
\ No newline at end of file diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty index 312771474f0..04f219ba416 100644 --- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty +++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty @@ -42,7 +42,7 @@ \ProvidesPackage{luaotfload}% %% FIXME The date is meaningless, we need to find a way to %% use the git revision instead. - [2018/09/24 v2.9 OpenType layout system] + [2018/10/03 v2.91 OpenType layout system] \fi \directlua{ require('luaotfload-main') |