diff options
author | Matteo Bernardini | 2019-08-18 16:29:50 +0200 |
---|---|---|
committer | Matteo Bernardini | 2019-08-18 16:29:50 +0200 |
commit | e81a89f1b6ccd3da8cffc51b431e0026126e34b9 (patch) | |
tree | d58abd1dad22c526d4bebefe25d34800370d6392 /office/texlive | |
parent | d04189e642ca17186cb9b2b5899fa9c12aceb782 (diff) | |
download | slackbuilds-current-20190818.2.tar.gz |
20190818.2 global branch merge.current-20190818.2
Signed-off-by: Matteo Bernardini <ponce@slackbuilds.org>
Diffstat (limited to 'office/texlive')
-rw-r--r-- | office/texlive/README | 14 | ||||
-rw-r--r-- | office/texlive/README.tlpkg | 17 | ||||
-rw-r--r-- | office/texlive/doinst.sh | 5 | ||||
-rw-r--r-- | office/texlive/patches/tabu.sty.diff | 32 | ||||
-rw-r--r-- | office/texlive/patches/texlive-20190410-source-upstream_fixes-1.patch | 4096 | ||||
-rw-r--r-- | office/texlive/prep/texmf_get.sh | 1106 | ||||
-rw-r--r-- | office/texlive/slack-desc | 19 | ||||
-rw-r--r-- | office/texlive/texlive.SlackBuild | 249 | ||||
-rw-r--r-- | office/texlive/texlive.info | 12 |
9 files changed, 0 insertions, 5550 deletions
diff --git a/office/texlive/README b/office/texlive/README deleted file mode 100644 index d08796d591..0000000000 --- a/office/texlive/README +++ /dev/null @@ -1,14 +0,0 @@ -TeXLive (TeXLive binaries, support files, TeX formats) - -This package contains binaries and many support files, TeX formats and -packages, and other files included in the TeXLive TeX distribution. -This should be adequate for the needs of most TeX users. - -The remaining stuff can be found in texlive-extra and texlive-docs, -all of which are also available at SlackBuilds.org. - -Have a look at the scripts in the prep/ directory to see how the texmf -archives were created from the original Texlive netarchives. - -Note that this package conflicts with the tetex packages in Slackware, -so you'll need to remove tetex and tetex-doc before installing TeXLive. diff --git a/office/texlive/README.tlpkg b/office/texlive/README.tlpkg deleted file mode 100644 index 7a6f790ca8..0000000000 --- a/office/texlive/README.tlpkg +++ /dev/null @@ -1,17 +0,0 @@ -The TeXLive Package Manager, i.e. tlmgr(1), is not shipped with this -TeXLive package, as it's not expected to work properly (if at all). -The general consensus from the TeXLive users mailing list is that -distributions should not be shipping tlpkg. - -The *proper* way to upgrade the TeXLive Slackware package (or any -part of it) is through your Slackware's package manager. If you -elect to try tlmgr(1), and it doesn't work at all, or worse, it messes -up part of your TeXLive installation, too bad. On the other hand, -if you are able to document exactly what we need to do in order to -make it: - 1) work - 2) put updates and such in a user-specific directory, i.e. - *not* alter/replace system package contents -then we would love to hear from you. :-) - ---rworkman :-) diff --git a/office/texlive/doinst.sh b/office/texlive/doinst.sh deleted file mode 100644 index f864e767d6..0000000000 --- a/office/texlive/doinst.sh +++ /dev/null @@ -1,5 +0,0 @@ -chroot . /usr/bin/mktexlsr 1>/dev/null 2>/dev/null -printf "y\n" | chroot . /usr/bin/updmap-sys --syncwithtrees 1>/dev/null 2>/dev/null -chroot . /usr/bin/updmap-sys 1>/dev/null 2>/dev/null -chroot . /usr/bin/fmtutil-sys --all 1>/dev/null 2>/dev/null -chroot . /usr/bin/mtxrun --generate 1>/dev/null 2>/dev/null diff --git a/office/texlive/patches/tabu.sty.diff b/office/texlive/patches/tabu.sty.diff deleted file mode 100644 index 8ebe034d18..0000000000 --- a/office/texlive/patches/tabu.sty.diff +++ /dev/null @@ -1,32 +0,0 @@ ---- ./tabu.sty.orig 2019-01-14 16:10:48.000000000 -0600 -+++ ./tabu.sty 2019-06-30 16:24:01.975474339 -0500 -@@ -57,7 +57,7 @@ - %% - - \NeedsTeXFormat{LaTeX2e} --\ProvidesPackage{tabu}[2019/01/11 v2.9 - flexible LaTeX tabulars (FC+tabu-fixed)] -+\ProvidesPackage{tabu}[2019/01/11 v2.9 - flexible LaTeX tabulars (FC+tabu-fixed) + intermediate FMi] - \RequirePackage{array}[2008/09/09] - \RequirePackage{varwidth}[2009/03/30] - \AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} -@@ -727,6 +727,10 @@ - \tabu@currentgrouptype\expandafter{\the\currentgrouptype}}% - \fi - }% \tabu@init -+%%TABU-FIXED set up \tabu@currentgrouptype -+%FMi cancel for nested arrays ... -+\def\@tabarray{\m@th\def\tabu@currentgrouptype{\currentgrouptype}\@ifnextchar[\@array{\@array[c]}} -+ - \def\tabu@indent{% correction for indentation - \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget - \everypar\expandafter{% -@@ -1663,6 +1667,9 @@ - \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target - \tabu@target=\tabu@temp\tabucolX \fi\fi - \setbox\tabu@box \hbox \bgroup -+%%TABU-FIXED add \color@begingroup -+%%FMi not yet understood why this one is also needed ... -+ \color@begingroup - \begin{varwidth}\tabu@target - \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... - \narrowragged \arraybackslash \parfillskip \@flushglue diff --git a/office/texlive/patches/texlive-20190410-source-upstream_fixes-1.patch b/office/texlive/patches/texlive-20190410-source-upstream_fixes-1.patch deleted file mode 100644 index 8e29d492d9..0000000000 --- a/office/texlive/patches/texlive-20190410-source-upstream_fixes-1.patch +++ /dev/null @@ -1,4096 +0,0 @@ -Submitted By: Ken Moffat <ken at linuxfromscratch dot org> -Date: 2019-05-31 -Initial Package Version: 2019 -Upstream Status: Applied -Origin: Upstream -Description: Fixes from branch2019 up to svn r51236, and fixes -from trunk for harfbuzz-2.5.0 changes (svn r51269, 51271). - -diff -Naur a/texk/dvipdfm-x/ChangeLog b/texk/dvipdfm-x/ChangeLog ---- a/texk/dvipdfm-x/ChangeLog 2019-04-07 02:42:55.000000000 +0100 -+++ b/texk/dvipdfm-x/ChangeLog 2019-05-31 22:00:04.006964029 +0100 -@@ -1,3 +1,47 @@ -+2019-05-08 Akira Kakuto <kakuto@w32tex.org> -+ -+ * dpxfile.c: Avoid buffer overflow. -+ -+2019-05-08 Shunsaku Hirata <shunsaku.hirata74@gmail.com> -+ -+ * spc_pdfm.c: Transformation also applies to annotations -+ created by pdf:ann. -+ -+2019-05-07 Shunsaku Hirata <shunsaku.hirata74@gmail.com> -+ -+ * tt_cmap.c: Fix a bug that CFF charset data were not read. -+ * unicode.c: Fix a bug that end-of-buffer calculation was -+ wrong. -+ -+2019-05-05 Shunsaku Hirata <shunsaku.hirata74@gmail.com> -+ -+ * pdfdoc.c: g option affects only annotations created by -+ "pdf:bann/eann" and html "a link" specials. -+ Report from Joseph Wright: -+ https://tug.org/pipermail/tex-live/2019-May/043612.html -+ -+2019-05-03 Shunsaku Hirata <shunsaku.hirata74@gmail.com> -+ -+ * specials.c: transformation applied to current point was not -+ done properly. -+ -+2019-05-03 Akira Kakuto <kakuto@w32tex.org> -+ -+ * dpxfile.c, mfileio.h, pdfximage.c: Support non-ascii file -+ names in default code page of OS irrespective of values of a -+ variable 'command_line_encoding' (Windows only). -+ -+2019-05-03 Shunsaku Hirata <shunsaku.hirata74@gmail.com> -+ -+ * pdfobj.c, pdfobj.h: Add support for ASCIIHex and ASCII85 -+ decode filter. Support for decoding stream data with multiple -+ filters applied. Remove unused function. -+ * tt_cmap.c, tt_gsub.[ch]: Revise ToUnicode CMap creation for -+ OpenType. Use GSUB for mapping unencoded glyphs to Unicode -+ (XeTeX support), lowering priority of CJK compatibility -+ ideographs. -+ * configure.ac: Version 20190503. -+ - 2019-04-07 Karl Berry <karl@freefriends.org> - - * TeX Live 2019. -diff -Naur a/texk/dvipdfm-x/configure b/texk/dvipdfm-x/configure ---- a/texk/dvipdfm-x/configure 2019-02-24 22:07:11.000000000 +0000 -+++ b/texk/dvipdfm-x/configure 2019-05-31 22:00:04.007964030 +0100 -@@ -1,8 +1,8 @@ - #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. --# Generated by GNU Autoconf 2.69 for dvipdfm-x (TeX Live) 20190225. -+# Generated by GNU Autoconf 2.69 for dvipdfm-x (TeX Live) 20190503. - # --# Report bugs to <tex-k@tug.org>. -+# Report bugs to <dvipdfmx@tug.org>. - # - # - # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -@@ -274,7 +274,7 @@ - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else -- $as_echo "$0: Please tell bug-autoconf@gnu.org and tex-k@tug.org -+ $as_echo "$0: Please tell bug-autoconf@gnu.org and dvipdfmx@tug.org - $0: about your system, including any error possibly output - $0: before this message. Then install a modern shell, or - $0: manually run the script under such a shell if you do -@@ -590,9 +590,9 @@ - # Identity of this package. - PACKAGE_NAME='dvipdfm-x (TeX Live)' - PACKAGE_TARNAME='dvipdfm-x--tex-live-' --PACKAGE_VERSION='20190225' --PACKAGE_STRING='dvipdfm-x (TeX Live) 20190225' --PACKAGE_BUGREPORT='tex-k@tug.org' -+PACKAGE_VERSION='20190503' -+PACKAGE_STRING='dvipdfm-x (TeX Live) 20190503' -+PACKAGE_BUGREPORT='dvipdfmx@tug.org' - PACKAGE_URL='' - - ac_unique_file="agl.c" -@@ -1350,7 +1350,7 @@ - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF --\`configure' configures dvipdfm-x (TeX Live) 20190225 to adapt to many kinds of systems. -+\`configure' configures dvipdfm-x (TeX Live) 20190503 to adapt to many kinds of systems. - - Usage: $0 [OPTION]... [VAR=VALUE]... - -@@ -1421,7 +1421,7 @@ - - if test -n "$ac_init_help"; then - case $ac_init_help in -- short | recursive ) echo "Configuration of dvipdfm-x (TeX Live) 20190225:";; -+ short | recursive ) echo "Configuration of dvipdfm-x (TeX Live) 20190503:";; - esac - cat <<\_ACEOF - -@@ -1488,7 +1488,7 @@ - Use these variables to override the choices made by `configure' or to help - it to find libraries and programs with nonstandard names/locations. - --Report bugs to <tex-k@tug.org>. -+Report bugs to <dvipdfmx@tug.org>. - _ACEOF - ac_status=$? - fi -@@ -1551,7 +1551,7 @@ - test -n "$ac_init_help" && exit $ac_status - if $ac_init_version; then - cat <<\_ACEOF --dvipdfm-x (TeX Live) configure 20190225 -+dvipdfm-x (TeX Live) configure 20190503 - generated by GNU Autoconf 2.69 - - Copyright (C) 2012 Free Software Foundation, Inc. -@@ -1896,9 +1896,9 @@ - $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 - $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} --( $as_echo "## ---------------------------- ## --## Report this to tex-k@tug.org ## --## ---------------------------- ##" -+( $as_echo "## ------------------------------- ## -+## Report this to dvipdfmx@tug.org ## -+## ------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; - esac -@@ -2390,7 +2390,7 @@ - This file contains any messages produced by compilers while - running configure, to aid debugging if configure makes a mistake. - --It was created by dvipdfm-x (TeX Live) $as_me 20190225, which was -+It was created by dvipdfm-x (TeX Live) $as_me 20190503, which was - generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ -@@ -8077,7 +8077,7 @@ - - # Define the identity of the package. - PACKAGE='dvipdfm-x--tex-live-' -- VERSION='20190225' -+ VERSION='20190503' - - - cat >>confdefs.h <<_ACEOF -@@ -14746,7 +14746,7 @@ - Report bugs to <bug-libtool@gnu.org>." - - lt_cl_version="\ --dvipdfm-x (TeX Live) config.lt 20190225 -+dvipdfm-x (TeX Live) config.lt 20190503 - configured by $0, generated by GNU Autoconf 2.69. - - Copyright (C) 2011 Free Software Foundation, Inc. -@@ -16636,7 +16636,7 @@ - # report actual input values of CONFIG_FILES etc. instead of their - # values after options handling. - ac_log=" --This file was extended by dvipdfm-x (TeX Live) $as_me 20190225, which was -+This file was extended by dvipdfm-x (TeX Live) $as_me 20190503, which was - generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES -@@ -16700,13 +16700,13 @@ - Configuration commands: - $config_commands - --Report bugs to <tex-k@tug.org>." -+Report bugs to <dvipdfmx@tug.org>." - - _ACEOF - cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" - ac_cs_version="\\ --dvipdfm-x (TeX Live) config.status 20190225 -+dvipdfm-x (TeX Live) config.status 20190503 - configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -diff -Naur a/texk/dvipdfm-x/configure.ac b/texk/dvipdfm-x/configure.ac ---- a/texk/dvipdfm-x/configure.ac 2019-02-24 22:07:11.000000000 +0000 -+++ b/texk/dvipdfm-x/configure.ac 2019-05-31 22:00:04.007964030 +0100 -@@ -7,7 +7,7 @@ - dnl gives unlimited permission to copy and/or distribute it, - dnl with or without modifications, as long as this notice is preserved. - dnl --AC_INIT([dvipdfm-x (TeX Live)], [20190225], [tex-k@tug.org]) -+AC_INIT([dvipdfm-x (TeX Live)], [20190503], [dvipdfmx@tug.org]) - AC_PREREQ([2.65]) - AC_CONFIG_SRCDIR([agl.c]) - AC_CONFIG_AUX_DIR([../../build-aux]) -diff -Naur a/texk/dvipdfm-x/dpxfile.c b/texk/dvipdfm-x/dpxfile.c ---- a/texk/dvipdfm-x/dpxfile.c 2018-10-07 22:27:40.000000000 +0100 -+++ b/texk/dvipdfm-x/dpxfile.c 2019-05-31 22:00:04.007964030 +0100 -@@ -1,5 +1,5 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. -- Copyright (C) 2007-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2007-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -159,11 +159,17 @@ - static char _tmpbuf[PATH_MAX+1]; - #endif /* MIKTEX */ - -+#if defined(WIN32) -+extern int utf8name_failed; -+#endif /* WIN32 */ -+ -+#define CMDBUFSIZ 1024 - static int exec_spawn (char *cmd) - { - char **cmdv, **qv; - char *p, *pp; -- char buf[1024]; -+ char buf[CMDBUFSIZ]; -+ int charcnt; - int i, ret = -1; - #ifdef WIN32 - wchar_t **cmdvw, **qvw; -@@ -182,11 +188,12 @@ - i++; - p++; - } -- cmdv = xcalloc (i + 2, sizeof (char *)); -+ cmdv = xcalloc (i + 4, sizeof (char *)); - p = cmd; - qv = cmdv; - while (*p) { - pp = buf; -+ charcnt = 0; - if (*p == '"') { - p++; - while (*p != '"') { -@@ -194,6 +201,10 @@ - goto done; - } - *pp++ = *p++; -+ charcnt++; -+ if (charcnt > CMDBUFSIZ - 1) { -+ ERROR("Too long a command line."); -+ } - } - p++; - } else if (*p == '\'') { -@@ -203,6 +214,10 @@ - goto done; - } - *pp++ = *p++; -+ charcnt++; -+ if (charcnt > CMDBUFSIZ - 1) { -+ ERROR("Too long a command line."); -+ } - } - p++; - } else { -@@ -214,10 +229,18 @@ - goto done; - } - *pp++ = *p++; -+ charcnt++; -+ if (charcnt > CMDBUFSIZ - 1) { -+ ERROR("Too long a command line."); -+ } - } - p++; - } else { - *pp++ = *p++; -+ charcnt++; -+ if (charcnt > CMDBUFSIZ - 1) { -+ ERROR("Too long a command line."); -+ } - } - } - } -@@ -235,20 +258,39 @@ - p++; - qv++; - } -+ *qv = NULL; -+ - #ifdef WIN32 - #if defined(MIKTEX) - ret = _spawnvp(_P_WAIT, *cmdv, (const char* const*)cmdv); - #else -- cmdvw = xcalloc (i + 2, sizeof (wchar_t *)); -- qv = cmdv; -- qvw = cmdvw; -- while (*qv) { -- *qvw = get_wstring_from_fsyscp(*qv, *qvw=NULL); -- qv++; -- qvw++; -+ cmdvw = xcalloc (i + 4, sizeof (wchar_t *)); -+ if (utf8name_failed == 0) { -+ qv = cmdv; -+ qvw = cmdvw; -+ while (*qv) { -+ *qvw = get_wstring_from_fsyscp(*qv, *qvw=NULL); -+ qv++; -+ qvw++; -+ } -+ *qvw = NULL; -+ ret = _wspawnvp (_P_WAIT, *cmdvw, (const wchar_t* const*) cmdvw); -+ } else { -+ int tmpcp; -+ tmpcp = file_system_codepage; -+ file_system_codepage = win32_codepage; -+ qv = cmdv; -+ qvw = cmdvw; -+ while (*qv) { -+ *qvw = get_wstring_from_fsyscp(*qv, *qvw=NULL); -+ qv++; -+ qvw++; -+ } -+ *qvw = NULL; -+ file_system_codepage = tmpcp; -+ utf8name_failed = 0; -+ ret = _wspawnvp (_P_WAIT, *cmdvw, (const wchar_t* const*) cmdvw); - } -- *qvw = NULL; -- ret = _wspawnvp (_P_WAIT, *cmdvw, (const wchar_t* const*) cmdvw); - if (cmdvw) { - qvw = cmdvw; - while (*qvw) { -@@ -1242,3 +1284,21 @@ - - return r; - } -+ -+#if defined(WIN32) -+FILE *generic_fsyscp_fopen (const char *filename, const char *mode) -+{ -+ FILE *f; -+ -+ f = fsyscp_fopen (filename, mode); -+ -+ if (f == NULL && file_system_codepage != win32_codepage) { -+ int tmpcp = file_system_codepage; -+ file_system_codepage = win32_codepage; -+ f = fsyscp_fopen (filename, mode); -+ file_system_codepage = tmpcp; -+ } -+ -+ return f; -+} -+#endif /* WIN32 */ -diff -Naur a/texk/dvipdfm-x/dvipdfmx.c b/texk/dvipdfm-x/dvipdfmx.c ---- a/texk/dvipdfm-x/dvipdfmx.c 2019-02-11 18:22:31.000000000 +0000 -+++ b/texk/dvipdfm-x/dvipdfmx.c 2019-05-31 22:00:04.007964030 +0100 -@@ -232,7 +232,7 @@ - printf ("Papersize is specified by paper format (e.g., \"a4\")\n"); - printf ("\tor by w<unit>,h<unit> (e.g., \"20cm,30cm\").\n"); - printf ("\n"); -- printf ("Email bug reports to tex-k@tug.org.\n"); -+ printf ("Email bug reports to dvipdfmx@tug.org.\n"); - } - - static void -diff -Naur a/texk/dvipdfm-x/mfileio.h b/texk/dvipdfm-x/mfileio.h ---- a/texk/dvipdfm-x/mfileio.h 2016-01-11 03:57:04.000000000 +0000 -+++ b/texk/dvipdfm-x/mfileio.h 2019-05-31 22:00:04.008964031 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2002-2016 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2002-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -36,7 +36,8 @@ - mfclose((file),__FUNCTION__,__LINE__) - #else - #if defined(WIN32) --#define MFOPEN(name,mode) fsyscp_fopen((name),(mode)) -+extern FILE *generic_fsyscp_fopen(const char *fname, const char *mode); -+#define MFOPEN(name,mode) generic_fsyscp_fopen((name),(mode)) - #else - #define MFOPEN(name,mode) fopen((name),(mode)) - #endif -diff -Naur a/texk/dvipdfm-x/pdfdoc.c b/texk/dvipdfm-x/pdfdoc.c ---- a/texk/dvipdfm-x/pdfdoc.c 2018-12-21 03:39:51.000000000 +0000 -+++ b/texk/dvipdfm-x/pdfdoc.c 2019-05-31 22:00:04.008964031 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2008-2018 by Jin-Hwan Cho, Matthias Franz, and Shunsaku Hirata, -+ Copyright (C) 2008-2019 by Jin-Hwan Cho, Matthias Franz, and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -1780,7 +1780,6 @@ - pdf_doc *p = &pdoc; - pdf_page *page; - pdf_obj *rect_array; -- double annot_grow = p->opt.annot_grow; - double xpos, ypos; - pdf_rect annbox; - -@@ -1812,10 +1811,10 @@ - } - - rect_array = pdf_new_array(); -- pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.llx - annot_grow, 0.001))); -- pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.lly - annot_grow, 0.001))); -- pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.urx + annot_grow, 0.001))); -- pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.ury + annot_grow, 0.001))); -+ pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.llx, 0.001))); -+ pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.lly, 0.001))); -+ pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.urx, 0.001))); -+ pdf_add_array(rect_array, pdf_new_number(ROUND(annbox.ury, 0.001))); - pdf_add_dict (annot_dict, pdf_new_name("Rect"), rect_array); - - pdf_add_array(page->annots, pdf_ref_obj(annot_dict)); -@@ -2802,13 +2801,22 @@ - void - pdf_doc_break_annot (void) - { -+ pdf_doc *p = &pdoc; -+ double g = p->opt.annot_grow; -+ - if (breaking_state.dirty) { - pdf_obj *annot_dict; -+ pdf_rect rect; - - /* Copy dict */ - annot_dict = pdf_new_dict(); - pdf_merge_dict(annot_dict, breaking_state.annot_dict); -- pdf_doc_add_annot(pdf_doc_current_page_number(), &(breaking_state.rect), -+ rect = breaking_state.rect; -+ rect.llx -= g; -+ rect.lly -= g; -+ rect.urx += g; -+ rect.ury += g; -+ pdf_doc_add_annot(pdf_doc_current_page_number(), &rect, - annot_dict, !breaking_state.broken); - pdf_release_obj(annot_dict); - -diff -Naur a/texk/dvipdfm-x/pdfobj.c b/texk/dvipdfm-x/pdfobj.c ---- a/texk/dvipdfm-x/pdfobj.c 2018-12-26 23:07:57.000000000 +0000 -+++ b/texk/dvipdfm-x/pdfobj.c 2019-05-31 22:00:04.008964031 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2007-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2007-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -2223,48 +2223,9 @@ - - #if HAVE_ZLIB - #define WBUF_SIZE 4096 --int --pdf_add_stream_flate (pdf_obj *dst, const void *data, int len) --{ -- z_stream z; -- Bytef wbuf[WBUF_SIZE]; -- -- z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; -- -- z.next_in = (z_const Bytef *) data; z.avail_in = len; -- z.next_out = (Bytef *) wbuf; z.avail_out = WBUF_SIZE; -- -- if (inflateInit(&z) != Z_OK) { -- WARN("inflateInit() failed."); -- return -1; -- } -- -- for (;;) { -- int status; -- status = inflate(&z, Z_NO_FLUSH); -- if (status == Z_STREAM_END) -- break; -- else if (status != Z_OK) { -- WARN("inflate() failed. Broken PDF file?"); -- inflateEnd(&z); -- return -1; -- } -- -- if (z.avail_out == 0) { -- pdf_add_stream(dst, wbuf, WBUF_SIZE); -- z.next_out = wbuf; -- z.avail_out = WBUF_SIZE; -- } -- } -- -- if (WBUF_SIZE - z.avail_out > 0) -- pdf_add_stream(dst, wbuf, WBUF_SIZE - z.avail_out); -- -- return (inflateEnd(&z) == Z_OK ? 0 : -1); --} - - static int --get_decode_parms (struct decode_parms *parms, pdf_obj *dict) -+filter_get_DecodeParms_FlateDecode (struct decode_parms *parms, pdf_obj *dict) - { - pdf_obj *tmp; - -@@ -2278,18 +2239,25 @@ - parms->columns = 1; - - tmp = pdf_deref_obj(pdf_lookup_dict(dict, "Predictor")); -- if (tmp) -+ if (tmp) { - parms->predictor = pdf_number_value(tmp); -+ pdf_release_obj(tmp); -+ } - tmp = pdf_deref_obj(pdf_lookup_dict(dict, "Colors")); -- if (tmp) -+ if (tmp) { - parms->colors = pdf_number_value(tmp); -+ pdf_release_obj(tmp); -+ } - tmp = pdf_deref_obj(pdf_lookup_dict(dict, "BitsPerComponent")); -- if (tmp) -+ if (tmp) { - parms->bits_per_component = pdf_number_value(tmp); -+ pdf_release_obj(tmp); -+ } - tmp = pdf_deref_obj(pdf_lookup_dict(dict, "Columns")); -- if (tmp) -+ if (tmp) { - parms->columns = pdf_number_value(tmp); -- -+ pdf_release_obj(tmp); -+ } - if (parms->bits_per_component != 1 && - parms->bits_per_component != 2 && - parms->bits_per_component != 4 && -@@ -2354,17 +2322,19 @@ - * Especially, calling pdf_add_stream() for each 4 bytes append is highly - * inefficient. - */ --static int --filter_decoded (pdf_obj *dst, const void *src, int srclen, -- struct decode_parms *parms) -+static pdf_obj * -+filter_stream_decode_Predictor (const void *src, size_t srclen, struct decode_parms *parms) - { -+ pdf_obj *dst; - const unsigned char *p = (const unsigned char *) src; - const unsigned char *endptr = p + srclen; -- unsigned char *prev, *buf; -- int bits_per_pixel = parms->colors * parms->bits_per_component; -- int bytes_per_pixel = (bits_per_pixel + 7) / 8; -- int length = (parms->columns * bits_per_pixel + 7) / 8; -- int i, error = 0; -+ unsigned char *prev, *buf; -+ int bits_per_pixel = parms->colors * parms->bits_per_component; -+ int bytes_per_pixel = (bits_per_pixel + 7) / 8; -+ int length = (parms->columns * bits_per_pixel + 7) / 8; -+ int i, error = 0; -+ -+ dst = pdf_new_stream(0); - - prev = NEW(length, unsigned char); - buf = NEW(length, unsigned char); -@@ -2491,16 +2461,21 @@ - RELEASE(prev); - RELEASE(buf); - -- return error; -+ if (error) { -+ pdf_release_obj(dst); -+ dst = NULL; -+ } -+ -+ return dst; - } - --static int --pdf_add_stream_flate_filtered (pdf_obj *dst, const void *data, int len, struct decode_parms *parms) -+static pdf_obj * -+filter_stream_decode_FlateDecode (const void *data, size_t len, struct decode_parms *parms) - { -- pdf_obj *tmp; -- z_stream z; -- Bytef wbuf[WBUF_SIZE]; -- int error; -+ pdf_obj *dst; -+ pdf_obj *tmp; -+ z_stream z; -+ Bytef wbuf[WBUF_SIZE]; - - z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; - -@@ -2509,7 +2484,7 @@ - - if (inflateInit(&z) != Z_OK) { - WARN("inflateInit() failed."); -- return -1; -+ return NULL; - } - - tmp = pdf_new_stream(0); -@@ -2521,7 +2496,8 @@ - else if (status != Z_OK) { - WARN("inflate() failed. Broken PDF file?"); - inflateEnd(&z); -- return -1; -+ pdf_release_obj(tmp); -+ return NULL; - } - - if (z.avail_out == 0) { -@@ -2534,79 +2510,310 @@ - if (WBUF_SIZE - z.avail_out > 0) - pdf_add_stream(tmp, wbuf, WBUF_SIZE - z.avail_out); - -- error = filter_decoded(dst, pdf_stream_dataptr(tmp), pdf_stream_length(tmp), parms); -+ if (inflateEnd(&z) == Z_OK) { -+ if (parms) { -+ dst = filter_stream_decode_Predictor(pdf_stream_dataptr(tmp), pdf_stream_length(tmp), parms); -+ } else { -+ dst = pdf_link_obj(tmp); -+ } -+ } else { -+ dst = NULL; -+ } - pdf_release_obj(tmp); - -- return ((!error && inflateEnd(&z) == Z_OK) ? 0 : -1); -+ return dst; - } - #endif - --int --pdf_concat_stream (pdf_obj *dst, pdf_obj *src) -+static pdf_obj * -+filter_stream_decode_ASCIIHexDecode (const void *data, size_t len) -+{ -+ pdf_obj *dst; -+ int eod, error; -+ const char *p = (const char *) data; -+ const char *endptr = p + len; -+ unsigned char *buf, ch; -+ size_t pos, n; -+ -+ buf = NEW((len+1)/2, unsigned char); -+ skip_white(&p, endptr); -+ ch = 0; n = 0; pos = 0; eod = 0; error = 0; -+ while (p < endptr && !error && !eod) { -+ char c1, val; -+ c1 = p[0]; -+ if (c1 >= 'A' && c1 <= 'F') { -+ val = c1 - 'A' + 10; -+ } else if (c1 >= 'a' && c1 <= 'f') { -+ val = c1 - 'a' + 10; -+ } else if (c1 >= '0' && c1 <= '9') { -+ val = c1 - '0'; -+ } else if (c1 == '>') { -+ val = 0; -+ eod = 1; -+ if ((pos % 2) == 0) -+ break; -+ } else { -+ error = -1; -+ break; -+ } -+ if (pos % 2) { -+ buf[n] = ch + val; -+ n++; -+ ch = 0; -+ } else { -+ ch = val << 4; -+ } -+ pos++; p++; -+ skip_white(&p, endptr); -+ } -+ if (error || !eod) { -+ WARN("Invalid ASCIIHex data seen: %s", error ? "Invalid character" : "No EOD marker"); -+ dst = NULL; -+ } else { -+ dst = pdf_new_stream(0); -+ pdf_add_stream(dst, buf, n); -+ } -+ RELEASE(buf); -+ -+ return dst; -+} -+ -+/* Percent sign is not start of comment here. -+ * We need this for reading Ascii85 encoded data. -+ */ -+#define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\f' || \ -+ (c) == '\r' || (c) == '\n' || (c) == '\0') -+static void -+skip_white_a85 (const char **p, const char *endptr) -+{ -+ while (*p < endptr && (is_space(**p))) { -+ (*p)++; -+ } -+} -+ -+static pdf_obj * -+filter_stream_decode_ASCII85Decode (const void *data, size_t len) - { -+ pdf_obj *dst; -+ int eod, error; -+ const char *p = (const char *) data; -+ const char *endptr = p + len; -+ unsigned char *buf; -+ size_t n; -+ -+ buf = NEW(((len+4)/5)*4, unsigned char); -+ skip_white_a85(&p, endptr); -+ n = 0; eod = 0; error = 0; -+ while (p < endptr && !error && !eod) { -+ char q[5] = {'u', 'u', 'u', 'u', 'u'}; -+ int m; -+ char ch; -+ -+ ch = p[0]; -+ p++; -+ skip_white_a85(&p, endptr); -+ if (ch == 'z') { -+ memset(buf+n, 0, 4); -+ n += 4; -+ continue; -+ } else if (ch == '~') { -+ if (p < endptr && p[0] == '>') { -+ eod = 1; -+ p++; -+ } else { -+ error = -1; -+ } -+ break; -+ } -+ q[0] = ch; -+ for (m = 1; m < 5 && p < endptr; m++) { -+ ch = p[0]; -+ p++; -+ skip_white_a85(&p, endptr); -+ if (ch == '~') { -+ if (p < endptr && p[0] == '>') { -+ eod = 1; -+ p++; -+ } else { -+ error = -1; -+ } -+ break; -+ } else if (ch < '!' || ch > 'u') { -+ error = -1; -+ break; -+ } else { -+ q[m] = ch; -+ } -+ } -+ if (!error) { -+ uint32_t val = 0; -+ int i; -+ if (m <= 1) { -+ error = -1; -+ break; -+ } -+ val = 85*85*85*(q[0] - '!') + 85*85*(q[1] - '!') -+ + 85*(q[2] - '!') + (q[3] - '!'); -+ /* Check overflow */ -+ if (val > UINT32_MAX / 85) { -+ error = -1; -+ break; -+ } else { -+ val = 85 * val; -+ if (val > UINT32_MAX - (q[4] - '!')) { -+ error = -1; -+ break; -+ } -+ val += (q[4] - '!'); -+ } -+ if (!error) { -+ for (i = 3; i >= 0; i--) { -+ buf[n + i] = val & 0xff; -+ val /= 256; -+ } -+ n += m - 1; -+ } -+ } -+ } -+ -+ if (error) { -+ WARN("Error in reading ASCII85 data."); -+ dst = NULL; -+ } else if (!eod) { -+ WARN("Error in reading ASCII85 data: No EOD"); -+ dst = NULL; -+ } else { -+ dst = pdf_new_stream(0); -+ pdf_add_stream(dst, buf, n); -+ } -+ RELEASE(buf); -+ -+ return dst; -+} -+ -+static pdf_obj * -+filter_stream_decode (const char *filter_name, pdf_obj *src, pdf_obj *parm) -+{ -+ pdf_obj *dec; - const char *stream_data; -- int stream_length; -- pdf_obj *stream_dict; -- pdf_obj *filter; -- int error = 0; -+ size_t stream_length; - -- if (!PDF_OBJ_STREAMTYPE(dst) || !PDF_OBJ_STREAMTYPE(src)) -- ERROR("Invalid type."); -+ if (!filter_name) -+ return pdf_link_obj(src); - - stream_data = pdf_stream_dataptr(src); -- stream_length = pdf_stream_length (src); -- stream_dict = pdf_stream_dict (src); -+ stream_length = pdf_stream_length(src); - -- filter = pdf_lookup_dict(stream_dict, "Filter"); -- if (!filter) -- pdf_add_stream(dst, stream_data, stream_length); -+ if (!strcmp(filter_name, "ASCIIHexDecode")) { -+ dec = filter_stream_decode_ASCIIHexDecode(stream_data, stream_length); -+ } else if (!strcmp(filter_name, "ASCII85Decode")) { -+ dec = filter_stream_decode_ASCII85Decode(stream_data, stream_length); - #if HAVE_ZLIB -- else { -- struct decode_parms parms; -- int have_parms = 0; -+ } else if (!strcmp(filter_name, "FlateDecode")) { -+ struct decode_parms decode_parm; -+ if (parm) -+ filter_get_DecodeParms_FlateDecode(&decode_parm, parm); -+ dec = filter_stream_decode_FlateDecode(stream_data, stream_length, parm ? &decode_parm : NULL); -+#endif /* HAVE_ZLIB */ -+ } else { -+ WARN("DecodeFilter \"%s\" not supported.", filter_name); -+ dec = NULL; -+ } - -- if (pdf_lookup_dict(stream_dict, "DecodeParms")) { -- pdf_obj *tmp; -+ return dec; -+} - -- /* Dictionary or array */ -- tmp = pdf_deref_obj(pdf_lookup_dict(stream_dict, "DecodeParms")); -- if (PDF_OBJ_ARRAYTYPE(tmp)) { -- if (pdf_array_length(tmp) > 1) { -- WARN("Unexpected size for DecodeParms array."); -- return -1; -- } -- tmp = pdf_deref_obj(pdf_get_array(tmp, 0)); -- } -- if (!PDF_OBJ_DICTTYPE(tmp)) { -- WARN("PDF dict expected for DecodeParms..."); -- return -1; -- } -- error = get_decode_parms(&parms, tmp); -- if (error) -- ERROR("Invalid value(s) in DecodeParms dictionary."); -- have_parms = 1; -- } -- if (PDF_OBJ_ARRAYTYPE(filter)) { -- if (pdf_array_length(filter) > 1) { -- WARN("Multiple DecodeFilter not supported."); -+int -+pdf_concat_stream (pdf_obj *dst, pdf_obj *src) -+{ -+ pdf_obj *filtered; -+ pdf_obj *stream_dict; -+ pdf_obj *filter, *parms; -+ int error = 0; -+ -+ if (!PDF_OBJ_STREAMTYPE(dst) || !PDF_OBJ_STREAMTYPE(src)) { -+ WARN("Passed invalid type in pdf_concat_stream()."); -+ return -1; -+ } -+ -+ stream_dict = pdf_stream_dict(src); -+ -+ filter = pdf_lookup_dict(stream_dict, "Filter"); -+ if (!filter) { -+ pdf_add_stream(dst, pdf_stream_dataptr(src), pdf_stream_length(src)); -+ return 0; -+ } -+ if (pdf_lookup_dict(stream_dict, "DecodeParms")) { -+ /* Dictionary or array */ -+ parms = pdf_deref_obj(pdf_lookup_dict(stream_dict, "DecodeParms")); -+ if (!parms) { -+ WARN("Failed to deref DeocdeParms..."); -+ return -1; -+ } else if (!PDF_OBJ_ARRAYTYPE(parms) && !PDF_OBJ_DICTTYPE(parms)) { -+ WARN("PDF dict or array expected for DecodeParms..."); -+ pdf_release_obj(parms); -+ return -1; -+ } -+ } else { -+ parms = NULL; -+ } -+ if (PDF_OBJ_ARRAYTYPE(filter)) { -+ int i, num; -+ pdf_obj *prev = NULL; -+ -+ num = pdf_array_length(filter); -+ if (parms) { -+ if (!PDF_OBJ_ARRAYTYPE(parms) || pdf_array_length(parms) != num) { -+ WARN("Invalid DecodeParam object found."); -+ pdf_release_obj(parms); - return -1; - } -- filter = pdf_get_array(filter, 0); - } -- if (PDF_OBJ_NAMETYPE(filter)) { -- char *filter_name = pdf_name_value(filter); -- if (filter_name && !strcmp(filter_name, "FlateDecode")) { -- if (have_parms) -- error = pdf_add_stream_flate_filtered(dst, stream_data, stream_length, &parms); -- else -- error = pdf_add_stream_flate(dst, stream_data, stream_length); -- } else { -- WARN("DecodeFilter \"%s\" not supported.", filter_name); -- error = -1; -+ if (num == 0) { -+ filtered = pdf_link_obj(src); -+ } else { -+ filtered = NULL; -+ prev = pdf_link_obj(src); -+ for (i = 0; i < num && prev != NULL; i++) { -+ pdf_obj *tmp1, *tmp2; -+ -+ tmp1 = pdf_deref_obj(pdf_get_array(filter, i)); -+ if (parms) { -+ tmp2 = pdf_deref_obj(pdf_get_array(parms, i)); -+ } else { -+ tmp2 = NULL; -+ } -+ if (PDF_OBJ_NAMETYPE(tmp1)) { -+ filtered = filter_stream_decode(pdf_name_value(tmp1), prev, tmp2); -+ } else if (PDF_OBJ_NULLTYPE(tmp1)) { -+ filtered = pdf_link_obj(prev); -+ } else { -+ WARN("Unexpected object found for /Filter..."); -+ filtered = NULL; -+ } -+ if (prev) -+ pdf_release_obj(prev); -+ if (tmp1) -+ pdf_release_obj(tmp1); -+ if (tmp2) -+ pdf_release_obj(tmp2); -+ prev = filtered; - } -- } else -- ERROR("Broken PDF file?"); --#endif /* HAVE_ZLIB */ -+ } -+ } else if (PDF_OBJ_NAMETYPE(filter)) { -+ filtered = filter_stream_decode(pdf_name_value(filter), src, parms); -+ } else { -+ WARN("Invalid value for /Filter found."); -+ filtered = NULL; -+ } -+ if (parms) -+ pdf_release_obj(parms); -+ if (filtered) { -+ pdf_add_stream(dst, pdf_stream_dataptr(filtered), pdf_stream_length(filtered)); -+ pdf_release_obj(filtered); -+ error = 0; -+ } else { -+ error = -1; - } - - return error; -diff -Naur a/texk/dvipdfm-x/pdfobj.h b/texk/dvipdfm-x/pdfobj.h ---- a/texk/dvipdfm-x/pdfobj.h 2018-09-15 22:18:43.000000000 +0100 -+++ b/texk/dvipdfm-x/pdfobj.h 2019-05-31 22:00:04.008964031 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2007-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2007-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -152,11 +152,6 @@ - extern void pdf_add_stream (pdf_obj *stream, - const void *stream_data_ptr, - int stream_data_len); --#if HAVE_ZLIB --extern int pdf_add_stream_flate (pdf_obj *stream, -- const void *stream_data_ptr, -- int stream_data_len); --#endif - extern int pdf_concat_stream (pdf_obj *dst, pdf_obj *src); - extern pdf_obj *pdf_stream_dict (pdf_obj *stream); - extern int pdf_stream_length (pdf_obj *stream); -diff -Naur a/texk/dvipdfm-x/pdfximage.c b/texk/dvipdfm-x/pdfximage.c ---- a/texk/dvipdfm-x/pdfximage.c 2018-09-14 04:34:50.000000000 +0100 -+++ b/texk/dvipdfm-x/pdfximage.c 2019-05-31 22:00:04.008964031 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2007-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2007-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -363,6 +363,10 @@ - #define dpx_fopen(n,m) (MFOPEN((n),(m))) - #define dpx_fclose(f) (MFCLOSE((f))) - -+#if defined(WIN32) -+int utf8name_failed = 0; -+#endif /* WIN32 */ -+ - int - pdf_ximage_findresource (const char *ident, load_options options) - { -@@ -394,8 +398,23 @@ - strcpy(fullname, f); - } else { - /* try loading image */ -+#if defined(WIN32) -+ utf8name_failed = 0; -+#endif /* WIN32 */ - fullname = dpx_find_file(ident, "_pic_", ""); -+#if defined(WIN32) -+ if (!fullname && file_system_codepage != win32_codepage) { -+ int tmpcp = file_system_codepage; -+ utf8name_failed = 1; -+ file_system_codepage = win32_codepage; -+ fullname = dpx_find_file(ident, "_pic_", ""); -+ file_system_codepage = tmpcp; -+ } -+#endif /* WIN32 */ - if (!fullname) { -+#if defined(WIN32) -+ utf8name_failed = 0; -+#endif /* WIN32 */ - WARN("Error locating image file \"%s\"", ident); - return -1; - } -diff -Naur a/texk/dvipdfm-x/README b/texk/dvipdfm-x/README ---- a/texk/dvipdfm-x/README 2015-07-06 17:13:08.000000000 +0100 -+++ b/texk/dvipdfm-x/README 2019-05-31 22:00:04.006964029 +0100 -@@ -1,9 +1,17 @@ - dvipdfmx and xdvipdfmx for TeX Live - =================================== - -+This package is released under the GNU GPL, version 2, or (at your -+option) any later version. -+ -+dvipdfmx is now maintained as part of TeX Live. -+ -+Mailing list for bug reports and all discussion: -+https://lists.tug.org/dvipdfmx; anyone can join the list, but it is not -+necessary to join to post. Archives are public. -+ - xdvipdfmx - ========= -- - xdvipdfmx is an extended version of dvipdfmx, and is now incorporated in - the same sources. - -@@ -15,8 +23,6 @@ - redistributed under the terms of the GNU General Public License, - version 2 or (at your option) any later version. - --There is a hope to merge xdvipdfmx into dvipdfmx. -- - Jonathan Kew mentions that in the past, XeTeX used a Mac-specific - program xdv2pdf as the backend instead of xdvipdfmx. xdv2pdf supported - a couple of special effects that are not yet available through -@@ -26,18 +32,8 @@ - if anyone is looking for some nontrivial but not-impossible job and - happens across this file. - --The dvipdfmx Project --==================== -- --Copyright (C) 2002-2014 by Jin-Hwan Cho, Shunsaku Hirata, --Matthias Franz, and the dvipdfmx project team. This package is released --under the GNU GPL, version 2, or (at your option) any later version. -- --dvipdfmx is now maintained as part of TeX Live. -- - Contents - -------- -- - 1. Introduction - - 2. Installation -diff -Naur a/texk/dvipdfm-x/spc_pdfm.c b/texk/dvipdfm-x/spc_pdfm.c ---- a/texk/dvipdfm-x/spc_pdfm.c 2019-03-30 03:42:07.000000000 +0000 -+++ b/texk/dvipdfm-x/spc_pdfm.c 2019-05-31 22:00:04.008964031 +0100 -@@ -597,6 +597,7 @@ - return dict; - } - -+#define SPC_PDFM_SUPPORT_ANNOT_TRANS 1 - static int - spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args) - { -@@ -604,7 +605,6 @@ - pdf_obj *annot_dict; - pdf_rect rect; - char *ident = NULL; -- pdf_coord cp; - transform_info ti; - - skip_white(&args->curptr, args->endptr); -@@ -642,19 +642,96 @@ - return -1; - } - -- cp.x = spe->x_user; cp.y = spe->y_user; -- pdf_dev_transform(&cp, NULL); -- if (ti.flags & INFO_HAS_USER_BBOX) { -- rect.llx = ti.bbox.llx + cp.x; -- rect.lly = ti.bbox.lly + cp.y; -- rect.urx = ti.bbox.urx + cp.x; -- rect.ury = ti.bbox.ury + cp.y; -- } else { -- rect.llx = cp.x; -- rect.lly = cp.y - spe->mag * ti.depth; -- rect.urx = cp.x + spe->mag * ti.width; -- rect.ury = cp.y + spe->mag * ti.height; -+#ifdef SPC_PDFM_SUPPORT_ANNOT_TRANS -+ { -+ pdf_coord cp1, cp2, cp3, cp4; -+ /* QuadPoints not working? */ -+#ifdef USE_QUADPOINTS -+ pdf_obj *qpoints; -+#endif -+ if (ti.flags & INFO_HAS_USER_BBOX) { -+ cp1.x = spe->x_user + ti.bbox.llx; -+ cp1.y = spe->y_user + ti.bbox.lly; -+ cp2.x = spe->x_user + ti.bbox.urx; -+ cp2.y = spe->y_user + ti.bbox.lly; -+ cp3.x = spe->x_user + ti.bbox.urx; -+ cp3.y = spe->y_user + ti.bbox.ury; -+ cp4.x = spe->x_user + ti.bbox.llx; -+ cp4.y = spe->y_user + ti.bbox.ury; -+ } else { -+ cp1.x = spe->x_user; -+ cp1.y = spe->y_user - spe->mag * ti.depth; -+ cp2.x = spe->x_user + spe->mag * ti.width; -+ cp2.y = spe->y_user - spe->mag * ti.depth; -+ cp3.x = spe->x_user + spe->mag * ti.width; -+ cp3.y = spe->y_user + spe->mag * ti.height; -+ cp4.x = spe->x_user; -+ cp4.y = spe->y_user + spe->mag * ti.height; -+ } -+ pdf_dev_transform(&cp1, NULL); -+ pdf_dev_transform(&cp2, NULL); -+ pdf_dev_transform(&cp3, NULL); -+ pdf_dev_transform(&cp4, NULL); -+ rect.llx = cp1.x; -+ if (cp2.x < rect.llx) -+ rect.llx = cp2.x; -+ if (cp3.x < rect.llx) -+ rect.llx = cp3.x; -+ if (cp4.x < rect.llx) -+ rect.llx = cp4.x; -+ rect.urx = cp1.x; -+ if (cp2.x > rect.urx) -+ rect.urx = cp2.x; -+ if (cp3.x > rect.urx) -+ rect.urx = cp3.x; -+ if (cp4.x > rect.urx) -+ rect.urx = cp4.x; -+ rect.lly = cp1.y; -+ if (cp2.y < rect.lly) -+ rect.lly = cp2.y; -+ if (cp3.y < rect.lly) -+ rect.lly = cp3.y; -+ if (cp4.y < rect.lly) -+ rect.lly = cp4.y; -+ rect.ury = cp1.y; -+ if (cp2.y > rect.ury) -+ rect.ury = cp2.y; -+ if (cp3.y > rect.ury) -+ rect.ury = cp3.y; -+ if (cp4.y > rect.ury) -+ rect.ury = cp4.y; -+#ifdef USE_QUADPOINTS -+ qpoints = pdf_new_array(); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp1.x, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp1.y, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp2.x, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp2.y, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp3.x, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp3.y, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp4.x, 0.01))); -+ pdf_add_array(qpoints, pdf_new_number(ROUND(cp4.y, 0.01))); -+ pdf_add_dict(annot_dict, pdf_new_name("QuadPoints"), qpoints); -+#endif - } -+#else -+ { -+ pdf_coord cp; -+ -+ cp.x = spe->x_user; cp.y = spe->y_user; -+ pdf_dev_transform(&cp, NULL); -+ if (ti.flags & INFO_HAS_USER_BBOX) { -+ rect.llx = ti.bbox.llx + cp.x; -+ rect.lly = ti.bbox.lly + cp.y; -+ rect.urx = ti.bbox.urx + cp.x; -+ rect.ury = ti.bbox.ury + cp.y; -+ } else { -+ rect.llx = cp.x; -+ rect.lly = cp.y - spe->mag * ti.depth; -+ rect.urx = cp.x + spe->mag * ti.width; -+ rect.ury = cp.y + spe->mag * ti.height; -+ } -+ } -+#endif - - /* Order is important... */ - if (ident) -diff -Naur a/texk/dvipdfm-x/specials.c b/texk/dvipdfm-x/specials.c ---- a/texk/dvipdfm-x/specials.c 2019-03-29 22:13:05.000000000 +0000 -+++ b/texk/dvipdfm-x/specials.c 2019-05-31 22:00:04.008964031 +0100 -@@ -169,12 +169,12 @@ - switch (k) { - /* xpos and ypos must be position in device space here. */ - case K_OBJ__XPOS: -- cp.x = dvi_dev_xpos(); cp.y = 0.0; -+ cp.x = dvi_dev_xpos(); cp.y = dvi_dev_ypos(); - pdf_dev_transform(&cp, NULL); - value = pdf_new_number(ROUND(cp.x, .01)); - break; - case K_OBJ__YPOS: -- cp.x = 0.0; cp.y = dvi_dev_ypos(); -+ cp.x = dvi_dev_xpos(); cp.y = dvi_dev_ypos(); - pdf_dev_transform(&cp, NULL); - value = pdf_new_number(ROUND(cp.y, .01)); - break; -@@ -233,12 +233,12 @@ - for (k = 0; _rkeys[k] && strcmp(key, _rkeys[k]); k++); - switch (k) { - case K_OBJ__XPOS: -- cp.x = dvi_dev_xpos(); cp.y = 0.0; -+ cp.x = dvi_dev_xpos(); cp.y = dvi_dev_ypos(); - pdf_dev_transform(&cp, NULL); - value = pdf_new_number(ROUND(cp.x, .01)); - break; - case K_OBJ__YPOS: -- cp.x = 0.0; cp.y = dvi_dev_ypos(); -+ cp.x = dvi_dev_xpos(); cp.y = dvi_dev_ypos(); - pdf_dev_transform(&cp, NULL); - value = pdf_new_number(ROUND(cp.y, .01)); - break; -diff -Naur a/texk/dvipdfm-x/tt_cmap.c b/texk/dvipdfm-x/tt_cmap.c ---- a/texk/dvipdfm-x/tt_cmap.c 2019-02-25 10:27:33.000000000 +0000 -+++ b/texk/dvipdfm-x/tt_cmap.c 2019-05-31 22:00:04.009964032 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2007-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2002-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - This program is free software; you can redistribute it and/or modify -@@ -68,11 +68,12 @@ - struct cmap0 *map; - int i; - -- if (len < 256) -- ERROR("invalid cmap subtable"); -+ if (len < 256) { -+ WARN("invalid format 0 TT cmap subtable"); -+ return NULL; -+ } - - map = NEW(1, struct cmap0); -- - for (i = 0; i < 256; i++) - map->glyphIndexArray[i] = sfnt_get_byte(sfont); - -@@ -114,14 +115,14 @@ - struct cmap2 *map; - USHORT i, n; - -- if (len < 512) -- ERROR("invalid cmap subtable"); -- -- map = NEW(1, struct cmap2); -+ if (len < 512) { -+ WARN("invalid fromt2 TT cmap subtable"); -+ return NULL; -+ } - -+ map = NEW(1, struct cmap2); - for (i = 0; i < 256; i++) - map->subHeaderKeys[i] = sfnt_get_ushort(sfont); -- - for (n = 0, i = 0; i < 256; i++) { - map->subHeaderKeys[i] /= 8; - if (n < map->subHeaderKeys[i]) -@@ -129,7 +130,13 @@ - } - n += 1; /* the number of subHeaders is one plus the max of subHeaderKeys */ - -- map->subHeaders = NEW(n, struct SubHeader); -+ if (len < 512 + n * 8 ) { -+ WARN("invalid/truncated format2 TT cmap subtable"); -+ RELEASE(map); -+ return NULL; -+ } -+ -+ map->subHeaders = NEW(n, struct SubHeader); - for (i = 0; i < n; i++) { - map->subHeaders[i].firstCode = sfnt_get_ushort(sfont); - map->subHeaders[i].entryCount = sfnt_get_ushort(sfont); -@@ -222,8 +229,10 @@ - struct cmap4 *map; - USHORT i, n, segCount; - -- if (len < 8) -- ERROR("invalid cmap subtable"); -+ if (len < 8) { -+ WARN("invalid format 4 TT cmap subtable"); -+ return NULL; -+ } - - map = NEW(1, struct cmap4); - -@@ -288,19 +297,19 @@ - * Last segment maps 0xffff to gid 0 (?) - */ - i = segCount = map->segCountX2 / 2; -- while (i-- > 0 && cc <= map->endCount[i]) { -+ while (i-- > 0 && cc <= map->endCount[i]) { - if (cc >= map->startCount[i]) { - if (map->idRangeOffset[i] == 0) { -- gid = (cc + map->idDelta[i]) & 0xffff; -+ gid = (cc + map->idDelta[i]) & 0xffff; - } else if (cc == 0xffff && map->idRangeOffset[i] == 0xffff) { -- /* this is for protection against some old broken fonts... */ -- gid = 0; -+ /* this is for protection against some old broken fonts... */ -+ gid = 0; - } else { -- j = map->idRangeOffset[i] - (segCount - i) * 2; -- j = (cc - map->startCount[i]) + (j / 2); -- gid = map->glyphIndexArray[j]; -- if (gid != 0) -- gid = (gid + map->idDelta[i]) & 0xffff; -+ j = map->idRangeOffset[i] - (segCount - i) * 2; -+ j = (cc - map->startCount[i]) + (j / 2); -+ gid = map->glyphIndexArray[j]; -+ if (gid != 0) -+ gid = (gid + map->idDelta[i]) & 0xffff; - } - break; - } -@@ -323,14 +332,15 @@ - struct cmap6 *map; - USHORT i; - -- if (len < 4) -- ERROR("invalid cmap subtable"); -+ if (len < 4) { -+ WARN("invalid format 6 TT cmap subtable"); -+ return NULL; -+ } - - map = NEW(1, struct cmap6); - map->firstCode = sfnt_get_ushort(sfont); - map->entryCount = sfnt_get_ushort(sfont); -- map->glyphIndexArray = NEW(map->entryCount, USHORT); -- -+ map->glyphIndexArray = NEW(map->entryCount, USHORT); - for (i = 0; i < map->entryCount; i++) - map->glyphIndexArray[i] = sfnt_get_ushort(sfont); - -@@ -390,13 +400,14 @@ - struct cmap12 *map; - ULONG i; - -- if (len < 4) -- ERROR("invalid cmap subtable"); -+ if (len < 4) { -+ WARN("invalid format 12 TT cmap subtable"); -+ return NULL; -+ } - - map = NEW(1, struct cmap12); - map->nGroups = sfnt_get_ulong(sfont); - map->groups = NEW(map->nGroups, struct charGroup); -- - for (i = 0; i < map->nGroups; i++) { - map->groups[i].startCharCode = sfnt_get_ulong(sfont); - map->groups[i].endCharCode = sfnt_get_ulong(sfont); -@@ -427,8 +438,8 @@ - cccc <= map->groups[i].endCharCode) { - if (cccc >= map->groups[i].startCharCode) { - gid = (USHORT) ((cccc - -- map->groups[i].startCharCode + -- map->groups[i].startGlyphID) & 0xffff); -+ map->groups[i].startCharCode + -+ map->groups[i].startGlyphID) & 0xffff); - break; - } - } -@@ -510,6 +521,7 @@ - WARN("Unrecognized OpenType/TrueType cmap format."); - tt_cmap_release(cmap); - return NULL; -+ break; - } - - if (!cmap->map) { -@@ -526,24 +538,25 @@ - - if (cmap) { - if (cmap->map) { -- switch(cmap->format) { -+ switch (cmap->format) { - case 0: -- release_cmap0(cmap->map); -- break; -+ release_cmap0(cmap->map); -+ break; - case 2: -- release_cmap2(cmap->map); -- break; -+ release_cmap2(cmap->map); -+ break; - case 4: -- release_cmap4(cmap->map); -- break; -+ release_cmap4(cmap->map); -+ break; - case 6: -- release_cmap6(cmap->map); -- break; -+ release_cmap6(cmap->map); -+ break; - case 12: -- release_cmap12(cmap->map); -- break; -+ release_cmap12(cmap->map); -+ break; - default: -- ERROR("Unrecognized OpenType/TrueType cmap format."); -+ WARN("Unrecognized OpenType/TrueType cmap format: %d", cmap->format); -+ break; - } - } - RELEASE(cmap); -@@ -582,129 +595,20 @@ - gid = lookup_cmap12(cmap->map, (ULONG) cc); - break; - default: -- ERROR("Unrecognized OpenType/TrueType cmap subtable format"); -+ WARN("Unrecognized OpenType/TrueType cmap subtable format: %d", cmap->format); - break; - } - - return gid; - } - --/* Sorry for placing this here. -- * We need to rewrite TrueType font support code... -- */ - --#define WBUF_SIZE 1024 --static unsigned char wbuf[WBUF_SIZE]; - - static unsigned char srange_min[2] = {0x00, 0x00}; - static unsigned char srange_max[2] = {0xff, 0xff}; - static unsigned char lrange_min[4] = {0x00, 0x00, 0x00, 0x00}; - static unsigned char lrange_max[4] = {0x7f, 0xff, 0xff, 0xff}; - --static void --load_cmap4 (struct cmap4 *map, -- unsigned char *GIDToCIDMap, -- otl_gsub *gsub_vert, otl_gsub *gsub_list, -- CMap *cmap, CMap *tounicode_add) --{ -- USHORT c0, c1, gid, cid; -- USHORT j, d, segCount; -- USHORT ch; -- int i; -- -- segCount = map->segCountX2 / 2; -- for (i = segCount - 1; i >= 0 ; i--) { -- c0 = map->startCount[i]; -- c1 = map->endCount[i]; -- d = map->idRangeOffset[i] / 2 - (segCount - i); -- for (j = 0; j <= c1 - c0; j++) { -- ch = c0 + j; -- if (map->idRangeOffset[i] == 0) { -- gid = (ch + map->idDelta[i]) & 0xffff; -- } else if (c0 == 0xffff && c1 == 0xffff && -- map->idRangeOffset[i] == 0xffff) { -- /* this is for protection against some old broken fonts... */ -- gid = 0; -- } else { -- gid = (map->glyphIndexArray[j+d] + map->idDelta[i]) & 0xffff; -- } -- if (gid != 0 && gid != 0xffff) { -- if (gsub_list) -- otl_gsub_apply_chain(gsub_list, &gid); -- if (gsub_vert) -- otl_gsub_apply(gsub_vert, &gid); -- if (GIDToCIDMap) { -- cid = ((GIDToCIDMap[2*gid] << 8)|GIDToCIDMap[2*gid+1]); -- if (cid == 0) -- WARN("GID %u does not have corresponding CID %u.", gid, cid); -- } else { -- cid = gid; -- } -- wbuf[0] = 0; -- wbuf[1] = 0; -- wbuf[2] = (ch >> 8) & 0xff; -- wbuf[3] = ch & 0xff; -- wbuf[4] = (cid >> 8) & 0xff; -- wbuf[5] = cid & 0xff; -- CMap_add_cidchar(cmap, wbuf, 4, cid); -- if (tounicode_add) { -- unsigned char *p = wbuf + 6; -- size_t uc_len; -- uc_len = UC_UTF16BE_encode_char(ch, &p, wbuf + WBUF_SIZE -1 ); -- CMap_add_bfchar(tounicode_add, wbuf+4, 2, wbuf+6, uc_len); -- } -- } -- } -- } -- -- return; --} -- --static void --load_cmap12 (struct cmap12 *map, -- unsigned char *GIDToCIDMap, -- otl_gsub *gsub_vert, otl_gsub *gsub_list, -- CMap *cmap, CMap *tounicode_add) --{ -- ULONG i, ch; /* LONG ? */ -- USHORT gid, cid; -- -- for (i = 0; i < map->nGroups; i++) { -- for (ch = map->groups[i].startCharCode; -- ch <= map->groups[i].endCharCode; -- ch++) { -- int d = ch - map->groups[i].startCharCode; -- gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff); -- if (gsub_list) -- otl_gsub_apply_chain(gsub_list, &gid); -- if (gsub_vert) -- otl_gsub_apply(gsub_vert, &gid); -- if (GIDToCIDMap) { -- cid = ((GIDToCIDMap[2*gid] << 8)|GIDToCIDMap[2*gid+1]); -- if (cid == 0) -- WARN("GID %u does not have corresponding CID %u.", gid, cid); -- } else { -- cid = gid; -- } -- wbuf[0] = (ch >> 24) & 0xff; -- wbuf[1] = (ch >> 16) & 0xff; -- wbuf[2] = (ch >> 8) & 0xff; -- wbuf[3] = ch & 0xff; -- wbuf[4] = (cid >> 8) & 0xff; -- wbuf[5] = cid & 0xff; -- CMap_add_cidchar(cmap, wbuf, 4, cid); -- if (tounicode_add) { -- unsigned char *p = wbuf + 6; -- size_t uc_len; -- uc_len = UC_UTF16BE_encode_char(ch, &p, wbuf + WBUF_SIZE -1 ); -- CMap_add_bfchar(tounicode_add, wbuf+4, 2, wbuf+6, uc_len); -- } -- } -- } -- -- return; --} -- - /* OpenType CIDFont: - * - * We don't use GID for them. OpenType cmap table is for -@@ -717,78 +621,37 @@ - #include "cff_dict.h" - #include "cff.h" - --static int --handle_CIDFont (sfnt *sfont, -- unsigned char **GIDToCIDMap, CIDSysInfo *csi) --{ -- cff_font *cffont; -- int offset, i; -- card16 num_glyphs, gid; -- cff_charsets *charset; -- unsigned char *map; -- struct tt_maxp_table *maxp; -- -- ASSERT(csi); -- -- offset = sfnt_find_table_pos(sfont, "CFF "); -- if (offset == 0) { -- csi->registry = NULL; -- csi->ordering = NULL; -- *GIDToCIDMap = NULL; -- return 0; -- } -- -- maxp = tt_read_maxp_table(sfont); -- num_glyphs = (card16) maxp->numGlyphs; -- RELEASE(maxp); -- if (num_glyphs < 1) -- ERROR("No glyph contained in this font..."); -- -- cffont = cff_open(sfont->stream, offset, 0); -- if (!cffont) -- ERROR("Could not open CFF font..."); -- -- -- if (!(cffont->flag & FONTTYPE_CIDFONT)) { -- cff_close(cffont); -- csi->registry = NULL; -- csi->ordering = NULL; -- *GIDToCIDMap = NULL; -- return 0; -- } -+/* This should be moved to cff.c */ -+static void -+create_GIDToCIDMap (uint16_t *GIDToCIDMap, uint16_t num_glyphs, cff_font *cffont) -+{ -+ cff_charsets *charset; -+ uint16_t gid, i; - -- if (!cff_dict_known(cffont->topdict, "ROS")) { -- ERROR("No CIDSystemInfo???"); -- } else { -- card16 reg, ord; -+ ASSERT(GIDToCIDMap); - -- reg = (card16) cff_dict_get(cffont->topdict, "ROS", 0); -- ord = (card16) cff_dict_get(cffont->topdict, "ROS", 1); -+ if (!cffont || !(cffont->flag & FONTTYPE_CIDFONT)) { -+ for (gid = 0; gid < num_glyphs; gid++) { -+ GIDToCIDMap[gid] = gid; -+ } - -- csi->registry = cff_get_string(cffont, reg); -- csi->ordering = cff_get_string(cffont, ord); -- csi->supplement = (int) cff_dict_get(cffont->topdict, "ROS", 2); -+ return; - } - -- cff_read_charsets(cffont); -- charset = cffont->charsets; -- if (!charset) { -- ERROR("No CFF charset data???"); -- } -+ memset(GIDToCIDMap, 0, num_glyphs*sizeof(uint16_t)); - -- map = NEW(65536 * 2, unsigned char); -- memset(map, 0, 65536 * 2); -+ charset = cffont->charsets; -+ if (!charset) -+ return; - switch (charset->format) { - case 0: - { - s_SID *cids; /* CID... */ -- -+ - cids = charset->data.glyphs; -- for (gid = 1, i = 0; -- i < charset->num_entries; i++) { -- map[2*gid ] = (cids[i] >> 8) & 0xff; -- map[2*gid+1] = cids[i] & 0xff; -- gid++; -+ for (gid = 1, i = 0; i < charset->num_entries; i++) { -+ GIDToCIDMap[gid] = cids[i]; -+ gid++; - } - } - break; -@@ -798,16 +661,14 @@ - card16 cid, count; - - ranges = charset->data.range1; -- for (gid = 1, i = 0; -- i < charset->num_entries; i++) { -- cid = ranges[i].first; -- count = ranges[i].n_left + 1; /* card8 */ -- while (count-- > 0 && -- gid <= num_glyphs) { -- map[2*gid ] = (cid >> 8) & 0xff; -- map[2*gid + 1] = cid & 0xff; -- gid++; cid++; -- } -+ for (gid = 1, i = 0; i < charset->num_entries; i++) { -+ cid = ranges[i].first; -+ count = ranges[i].n_left + 1; /* card8 */ -+ while (count-- > 0 && gid <= num_glyphs) { -+ GIDToCIDMap[gid] = cid; -+ gid++; -+ cid++; -+ } - } - } - break; -@@ -817,55 +678,52 @@ - card16 cid, count; - - ranges = charset->data.range2; -- if (charset->num_entries == 1 && -- ranges[0].first == 1) { -- /* "Complete" CIDFont */ -- RELEASE(map); map = NULL; -+ if (charset->num_entries == 1 && ranges[0].first == 1) { -+ /* "Complete" CIDFont */ -+ for (gid = 0; gid < num_glyphs; gid++) { -+ GIDToCIDMap[gid] = gid; -+ } - } else { -- /* Not trivial mapping */ -- for (gid = 1, i = 0; -- i < charset->num_entries; i++) { -- cid = ranges[i].first; -- count = ranges[i].n_left + 1; -- while (count-- > 0 && -- gid <= num_glyphs) { -- map[2*gid] = (cid >> 8) & 0xff; -- map[2*gid+1] = cid & 0xff; -- gid++; cid++; -- } -- } -+ /* Not trivial mapping */ -+ for (gid = 1, i = 0; i < charset->num_entries; i++) { -+ cid = ranges[i].first; -+ count = ranges[i].n_left + 1; -+ while (count-- > 0 && gid <= num_glyphs) { -+ GIDToCIDMap[gid] = cid; -+ gid++; -+ cid++; -+ } -+ } - } - } - break; - default: -- RELEASE(map); map = NULL; -- ERROR("Unknown CFF charset format...: %d", charset->format); -+ WARN("Unknown CFF charset format...: %d", charset->format); - break; - } -- cff_close(cffont); - -- *GIDToCIDMap = map; -- return 1; -+ return; - } - - static int is_PUA_or_presentation (unsigned int uni) - { - /* Some of CJK Radicals Supplement and Kangxi Radicals - * are commonly double encoded, lower the priority. -+ * CJK Compatibility Ideographs & Supplement added. - */ - return ((uni >= 0x2E80 && uni <= 0x2EF3) || (uni >= 0x2F00 && uni <= 0x2FD5) || - (uni >= 0xE000 && uni <= 0xF8FF) || (uni >= 0xFB00 && uni <= 0xFB4F) || -+ (uni >= 0xF900 && uni <= 0xFAFF) || (uni >= 0x2F800 && uni <= 0x2FA1F) || - (uni >= 0xF0000 && uni <= 0xFFFFD) || (uni >= 0x100000 && uni <= 0x10FFFD)); - } - --static char* --sfnt_get_glyphname(struct tt_post_table *post, cff_font *cffont, USHORT gid) -+static char * -+lookup_glyph_name (struct tt_post_table *post, cff_font *cffont, USHORT gid) - { -- char* name = NULL; -+ char *name = NULL; - - if (post) - name = tt_get_glyphname(post, gid); -- - if (!name && cffont) - name = cff_get_glyphname(cffont, gid); - -@@ -881,94 +739,82 @@ - #define is_used_char2(b,c) (((b)[(c)/8]) & (1 << (7-((c)%8)))) - #endif - --static USHORT --handle_subst_glyphs (CMap *cmap, -- CMap *cmap_add, -- const char *used_glyphs, -- sfnt *sfont, -- cff_font *cffont) -+static int32_t -+handle_subst_glyphs (CMap *cmap, CMap *cmap_add, char *used_chars) - { -- USHORT count; -- USHORT i; -- struct tt_post_table *post = NULL; -- -- if (!cmap_add) -- post = tt_read_post_table(sfont); -- -- for (count = 0, i = 0; i < 8192; i++) { -- int j; -- int32_t len; -- int inbytesleft, outbytesleft; -- const unsigned char *inbuf; -- unsigned char *outbuf; -+ int32_t count = 0; -+ int32_t cid; - -- if (used_glyphs[i] == 0) -+ for (cid = 0; cid < 65536; cid++) { -+ if (!is_used_char2(used_chars, cid)) - continue; -+ else { -+ unsigned char buf[256]; -+ int inbytesleft = 2, outbytesleft = 254; -+ size_t len; -+ unsigned char *outbuf = buf + 2; -+ const unsigned char *inbuf = buf; -+ -+ buf[0] = (cid >> 8) & 0xff; -+ buf[1] = cid & 0xff; -+ CMap_decode(cmap_add, &inbuf, &inbytesleft, &outbuf, &outbytesleft); -+ if (inbytesleft == 0) { -+ len = 254 - outbytesleft; -+ CMap_add_bfchar(cmap, buf, 2, buf + 2, len); -+ used_chars[cid / 8] &= ~(1 << (7 - (cid % 8))); -+ count++; -+ } -+ } -+ } - -- for (j = 0; j < 8; j++) { -- USHORT gid = 8 * i + j; -+ return count; -+} - -- if (!is_used_char2(used_glyphs, gid)) -- continue; -+static int32_t -+add_ToUnicode_via_glyph_name (CMap *cmap, char *used_chars, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap, -+ sfnt *sfont, cff_font *cffont) -+{ -+ int32_t count = 0; -+ USHORT gid; -+ struct tt_post_table *post = NULL; - -- if (!cmap_add) { --#define MAX_UNICODES 16 -- /* try to look up Unicode values from the glyph name... */ -- char* name; -- int32_t unicodes[MAX_UNICODES]; -- int unicode_count = -1; -- name = sfnt_get_glyphname(post, cffont, gid); -- if (name) { -- unicode_count = agl_get_unicodes(name, unicodes, MAX_UNICODES); -- } -+ post = tt_read_post_table(sfont); -+ if (!post && !cffont) -+ return count; -+ -+ for (gid = 0; gid < num_glyphs; gid++) { -+ uint16_t cid = GIDToCIDMap[gid]; -+ if (is_used_char2(used_chars, cid)) { -+#define MAX_UNICODES 32 -+ char *name; -+ int32_t unicodes[MAX_UNICODES]; -+ int unicode_count = -1; -+ -+ name = lookup_glyph_name(post, cffont, gid); -+ if (name) { -+ unicode_count = agl_get_unicodes(name, unicodes, MAX_UNICODES); - #undef MAX_UNICODES -- if (unicode_count == -1) { -- if(dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { -- if (name) -- MESG("No Unicode mapping available: GID=%u, name=%s\n", gid, name); -- else -- MESG("No Unicode mapping available: GID=%u\n", gid); -- } -- } else { -- /* the Unicode characters go into wbuf[2] and following, in UTF16BE */ -- /* we rely on WBUF_SIZE being more than adequate for MAX_UNICODES */ -- unsigned char* p = wbuf + 2; -- int k; -- len = 0; -+ RELEASE(name); -+ if (unicode_count > 0) { -+ unsigned char *buf; -+ unsigned char *p, *endptr; -+ int k; -+ size_t len = 0; -+ -+ buf = NEW(unicode_count*4+2, unsigned char); -+ p = buf + 2; -+ endptr = buf + (unicode_count * 4 + 2); - for (k = 0; k < unicode_count; ++k) { -- len += UC_UTF16BE_encode_char(unicodes[k], &p, wbuf+WBUF_SIZE); -+ len += UC_UTF16BE_encode_char(unicodes[k], &p, endptr); - } -- wbuf[0] = (gid >> 8) & 0xff; -- wbuf[1] = gid & 0xff; -- CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len); -- } -- RELEASE(name); -- } else { -- wbuf[0] = (gid >> 8) & 0xff; -- wbuf[1] = gid & 0xff; -- -- inbuf = wbuf; -- inbytesleft = 2; -- outbuf = wbuf + 2; -- outbytesleft = WBUF_SIZE - 2; -- CMap_decode(cmap_add, &inbuf, &inbytesleft, &outbuf, &outbytesleft); -- -- if (inbytesleft != 0) { -- WARN("CMap conversion failed..."); -- } else { -- len = WBUF_SIZE - 2 - outbytesleft; -- CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len); -+ buf[0] = (cid >> 8) & 0xff; -+ buf[1] = cid & 0xff; -+ CMap_add_bfchar(cmap, buf, 2, buf + 2, len); -+ used_chars[cid / 8] &= ~(1 << (7 - (cid % 8))); - count++; - -- if (dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { -- int _i; -- -- MESG("otf_cmap>> Additional ToUnicode mapping: <%04X> <", gid); -- for (_i = 0; _i < len; _i++) { -- MESG("%02X", wbuf[2 + _i]); -- } -- MESG(">\n"); -- } -+ RELEASE(buf); - } - } - } -@@ -980,70 +826,11 @@ - return count; - } - --static cff_font * --prepare_CIDFont_from_sfnt(sfnt* sfont) --{ -- cff_font *cffont; -- unsigned offset = 0; -- -- if (sfont->type != SFNT_TYPE_POSTSCRIPT || -- sfnt_read_table_directory(sfont, 0) < 0 || -- (offset = sfnt_find_table_pos(sfont, "CFF ")) == 0) { -- return NULL; -- } -- -- cffont = cff_open(sfont->stream, offset, 0); -- if (!cffont) -- return NULL; -- -- cff_read_charsets(cffont); -- return cffont; --} -- --static USHORT --add_to_cmap_if_used (CMap *cmap, -- cff_font *cffont, -- char *used_chars, -- USHORT gid, -- ULONG ch) --{ -- USHORT count = 0; -- USHORT cid = cffont ? cff_charsets_lookup_inverse(cffont, gid) : gid; -- if (is_used_char2(used_chars, cid)) { -- int len; -- unsigned char *p = wbuf + 2; -- -- count++; -- -- wbuf[0] = (cid >> 8) & 0xff; -- wbuf[1] = (cid & 0xff); -- len = UC_UTF16BE_encode_char((int32_t) ch, &p, wbuf + WBUF_SIZE); -- CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len); -- -- /* Skip PUA characters and alphabetic presentation forms, allowing -- * handle_subst_glyphs() as it might find better mapping. Fixes the -- * mapping of ligatures encoded in PUA in fonts like Linux Libertine -- * and old Adobe fonts. -- */ -- if (!is_PUA_or_presentation(ch)) { -- /* Avoid duplicate entry -- * There are problem when two Unicode code is mapped to -- * single glyph... -- */ -- used_chars[cid / 8] &= ~(1 << (7 - (cid % 8))); -- } -- } -- -- return count; --} -- --static USHORT --create_ToUnicode_cmap4 (CMap *cmap, -- struct cmap4 *map, -- char *used_chars, -- cff_font *cffont) -+static void -+create_inverse_cmap4 (int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ struct cmap4 *map) - { -- USHORT count = 0, segCount = map->segCountX2 / 2; -+ USHORT segCount = map->segCountX2 / 2; - USHORT i, j; - - for (i = 0; i < segCount; i++) { -@@ -1062,32 +849,33 @@ - } else { - gid = (map->glyphIndexArray[j + d] + map->idDelta[i]) & 0xffff; - } -- -- count += add_to_cmap_if_used(cmap, cffont, used_chars, gid, ch); -+ if (is_PUA_or_presentation(ch)) { -+ map_sub[gid] = ch; -+ } else { -+ map_base[gid] = ch; -+ } - } - } -- -- return count; - } - --static USHORT --create_ToUnicode_cmap12 (CMap *cmap, -- struct cmap12 *map, -- char *used_chars, -- cff_font *cffont) -+static void -+create_inverse_cmap12 (int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ struct cmap12 *map) - { -- ULONG i, ch, count = 0; -+ ULONG i, ch; - - for (i = 0; i < map->nGroups; i++) { - for (ch = map->groups[i].startCharCode; - ch <= map->groups[i].endCharCode; ch++) { - int d = ch - map->groups[i].startCharCode; - USHORT gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff); -- count += add_to_cmap_if_used(cmap, cffont, used_chars, gid, ch); -+ if (is_PUA_or_presentation(ch)) { -+ map_sub[gid] = ch; -+ } else { -+ map_base[gid] = ch; -+ } - } - } -- -- return count; - } - - /* NOTE: Reverse mapping code which had been placed here is removed since: -@@ -1096,60 +884,163 @@ - * Especially, the second one causes problems. - */ - static pdf_obj * --create_ToUnicode_cmap (tt_cmap *ttcmap, -+create_ToUnicode_cmap (tt_cmap *ttcmap, - const char *cmap_name, -- CMap *cmap_add, -+ CMap *cmap_add, - const char *used_chars, -- sfnt *sfont) -+ sfnt *sfont) - { -- pdf_obj *stream = NULL; -- CMap *cmap; -- USHORT count = 0; -- cff_font *cffont = prepare_CIDFont_from_sfnt(sfont); -- char is_cidfont = cffont && (cffont->flag & FONTTYPE_CIDFONT); -- -- cmap = CMap_new(); -- CMap_set_name (cmap, cmap_name); -- CMap_set_wmode(cmap, 0); -- CMap_set_type (cmap, CMAP_TYPE_TO_UNICODE); -- CMap_set_CIDSysInfo(cmap, &CSI_UNICODE); -- CMap_add_codespacerange(cmap, srange_min, srange_max, 2); -+ pdf_obj *stream = NULL; -+ int32_t *map_base = NULL, *map_sub = NULL; -+ USHORT gid, num_glyphs = 0; - -- /* cmap_add here stores information about all unencoded glyphs which can be -- * accessed only through OT Layout GSUB table. -- */ -- { -- char used_chars_copy[8192]; -- memcpy(used_chars_copy, used_chars, 8192); -+ ASSERT(ttcmap); - -- /* For create_ToUnicode_cmap{4,12}(), cffont is for GID -> CID lookup, -- * so it is only needed for CID fonts. */ -- switch (ttcmap->format) { -- case 4: -- count = create_ToUnicode_cmap4(cmap, ttcmap->map, used_chars_copy, -- is_cidfont ? cffont : NULL); -- break; -- case 12: -- count = create_ToUnicode_cmap12(cmap, ttcmap->map, used_chars_copy, -- is_cidfont ? cffont : NULL); -- break; -+ /* Get num_glyphs from maxp talbe */ -+ { -+ struct tt_maxp_table *maxp; -+ -+ maxp = tt_read_maxp_table(sfont); -+ if (maxp) { -+ num_glyphs = maxp->numGlyphs; -+ RELEASE(maxp); - } -+ } - -- /* For handle_subst_glyphs(), cffont is for GID -> glyph name lookup, so -- * it is only needed for non-CID fonts. */ -- count += handle_subst_glyphs(cmap, cmap_add, used_chars_copy, sfont, -- is_cidfont ? NULL : cffont); -+ /* Initialize GID to Unicode mapping table */ -+ map_base = NEW(num_glyphs, int32_t); -+ map_sub = NEW(num_glyphs, int32_t); -+ for (gid = 0; gid < num_glyphs; gid++) { -+ map_base[gid] = -1; -+ map_sub [gid] = -1; - } - -- if (count < 1) -- stream = NULL; -- else { -- stream = CMap_create_stream(cmap); -+ /* Create "base" mapping from inverse mapping of OpenType cmap */ -+ switch (ttcmap->format) { -+ case 4: -+ create_inverse_cmap4(map_base, map_sub, num_glyphs, ttcmap->map); -+ break; -+ case 12: -+ create_inverse_cmap12(map_base, map_sub, num_glyphs, ttcmap->map); -+ break; - } -- CMap_release(cmap); - -- if (cffont) -- cff_close(cffont); -+ /* Now create ToUnicode CMap stream */ -+ { -+ CMap *cmap; -+ int32_t count; -+ cff_font *cffont = NULL; -+ char is_cidfont = 0; -+ uint16_t *GIDToCIDMap = NULL; -+ char *used_chars_copy = NULL; -+ -+ if (sfont->type == SFNT_TYPE_POSTSCRIPT) { -+ ULONG offset; -+ offset = sfnt_find_table_pos(sfont, "CFF "); -+ cffont = cff_open(sfont->stream, offset, 0); -+ cff_read_charsets(cffont); -+ } -+ is_cidfont = cffont && (cffont->flag & FONTTYPE_CIDFONT); -+ -+ /* GIT to CID mapping info. */ -+ GIDToCIDMap = NEW(num_glyphs, uint16_t); -+ if (is_cidfont) { -+ create_GIDToCIDMap(GIDToCIDMap, num_glyphs, cffont); -+ } else { -+ for (gid = 0; gid < num_glyphs; gid++) { -+ GIDToCIDMap[gid] = gid; -+ } -+ } -+ cmap = CMap_new(); -+ CMap_set_name (cmap, cmap_name); -+ CMap_set_wmode(cmap, 0); -+ CMap_set_type (cmap, CMAP_TYPE_TO_UNICODE); -+ CMap_set_CIDSysInfo(cmap, &CSI_UNICODE); -+ CMap_add_codespacerange(cmap, srange_min, srange_max, 2); -+ -+ count = 0; -+ used_chars_copy = NEW(8192, char); -+ memcpy(used_chars_copy, used_chars, 8192); -+ for (gid = 0; gid < num_glyphs; gid++) { -+ uint16_t cid = GIDToCIDMap[gid]; -+ if (is_used_char2(used_chars_copy, cid)) { -+ int32_t ch; -+ unsigned char src[2], dst[4]; -+ unsigned char *p = dst, *endptr = dst + 4; -+ size_t len; -+ -+ ch = map_base[gid]; -+ if (UC_is_valid(ch)) { -+ src[0] = (cid >> 8) & 0xff; -+ src[1] = cid & 0xff; -+ len = UC_UTF16BE_encode_char(ch, &p, endptr); -+ CMap_add_bfchar(cmap, src, 2, dst, len); -+ used_chars_copy[cid / 8] &= ~(1 << (7 - (cid % 8))); -+ count++; -+ } -+ } -+ } -+ -+ /* cmap_add here stores information about all unencoded glyphs which can be -+ * accessed only through OT Layout GSUB table. -+ * This is only availabel when encoding is "unicode". -+ */ -+ if (cmap_add) { -+ count += handle_subst_glyphs(cmap, cmap_add, used_chars_copy); -+ } else { -+ /* Else, try gathering information from GSUB tables */ -+ count += otl_gsub_add_ToUnicode(cmap, used_chars_copy, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, sfont); -+ } -+ /* Find Unicode mapping via PostScript glyph names... */ -+ count += add_ToUnicode_via_glyph_name(cmap, used_chars_copy, num_glyphs, -+ GIDToCIDMap, sfont, is_cidfont ? NULL : cffont); -+ if (cffont) -+ cff_close(cffont); -+ -+ /* Finaly, PUA and presentation forms... */ -+ for (gid = 0; gid < num_glyphs; gid++) { -+ uint16_t cid = GIDToCIDMap[gid]; -+ if (is_used_char2(used_chars_copy, cid)) { -+ int32_t ch; -+ unsigned char src[2], dst[4]; -+ unsigned char *p = dst, *endptr = dst + 4; -+ size_t len; -+ -+ ch = map_sub[gid]; -+ if (UC_is_valid(ch)) { -+ src[0] = (cid >> 8) & 0xff; -+ src[1] = cid & 0xff; -+ len = UC_UTF16BE_encode_char(ch, &p, endptr); -+ CMap_add_bfchar(cmap, src, 2, dst, len); -+ used_chars_copy[cid / 8] &= ~(1 << (7 - (cid % 8))); -+ count++; -+ } -+ } -+ } -+ -+ /* Check for missing mapping */ -+ if (dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { -+ for (gid = 0; gid < num_glyphs; gid++) { -+ uint16_t cid = GIDToCIDMap[gid]; -+ if (is_used_char2(used_chars_copy, cid)) { -+ WARN("Unable to find ToUnicode mapping for glyph CID=%u (GID=%u)", cid, gid); -+ } -+ } -+ } -+ RELEASE(GIDToCIDMap); -+ RELEASE(used_chars_copy); -+ -+ if (count < 1) -+ stream = NULL; -+ else { -+ stream = CMap_create_stream(cmap); -+ } -+ CMap_release(cmap); -+ } -+ RELEASE(map_base); -+ RELEASE(map_sub); - - return stream; - } -@@ -1169,29 +1060,27 @@ - - pdf_obj * - otf_create_ToUnicode_stream (const char *font_name, -- int ttc_index, /* 0 for non-TTC */ -+ int ttc_index, /* 0 for non-TTC */ - const char *basefont, - const char *used_chars) - { -- pdf_obj *cmap_ref = NULL; -- int res_id; -- pdf_obj *cmap_obj = NULL; -- CMap *cmap_add; -- int cmap_add_id; -- tt_cmap *ttcmap; -- char *cmap_name, *cmap_add_name; -- FILE *fp = NULL; -- sfnt *sfont; -- ULONG offset = 0; -- int i; -+ pdf_obj *cmap_ref = NULL; /* returned value */ -+ CMap *cmap_add = NULL; -+ char *cmap_name; -+ FILE *fp = NULL; -+ sfnt *sfont; -+ ULONG offset = 0; -+ tt_cmap *ttcmap; -+ int cmap_id, cmap_add_id; -+ int i; - - cmap_name = NEW(strlen(basefont)+strlen("-UTF16")+1, char); - sprintf(cmap_name, "%s-UTF16", basefont); - -- res_id = pdf_findresource("CMap", cmap_name); -- if (res_id >= 0) { -+ cmap_id = pdf_findresource("CMap", cmap_name); -+ if (cmap_id >= 0) { - RELEASE(cmap_name); -- cmap_ref = pdf_get_resource_reference(res_id); -+ cmap_ref = pdf_get_resource_reference(cmap_id); - return cmap_ref; - } - -@@ -1212,7 +1101,10 @@ - } - - if (!sfont) { -- ERROR("Could not open OpenType/TrueType font file \"%s\"", font_name); -+ WARN("Could not open OpenType/TrueType font file \"%s\"", font_name); -+ RELEASE(cmap_name); -+ DPXFCLOSE(fp); -+ return NULL; - } - - switch (sfont->type) { -@@ -1222,7 +1114,11 @@ - case SFNT_TYPE_TTC: - offset = ttc_read_offset(sfont, ttc_index); - if (offset == 0) { -- ERROR("Invalid TTC index"); -+ WARN("Invalid TTC index for font: %s", font_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ RELEASE(cmap_name); -+ return NULL; - } - break; - default: -@@ -1231,111 +1127,180 @@ - } - - if (sfnt_read_table_directory(sfont, offset) < 0) { -- ERROR("Could not read OpenType/TrueType table directory."); -+ WARN("Could not read OpenType/TrueType table directory: %s", font_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ RELEASE(cmap_name); -+ return NULL; - } - -- cmap_add_name = NEW(strlen(font_name)+strlen(",000-UCS32-Add")+1, char); -- sprintf(cmap_add_name, "%s,%03d-UCS32-Add", font_name, ttc_index); -- cmap_add_id = CMap_cache_find(cmap_add_name); -- RELEASE(cmap_add_name); -- if (cmap_add_id < 0) { -- cmap_add = NULL; -- } else { -- cmap_add = CMap_cache_get(cmap_add_id); -+ /* cmap_add is used for storing information on ToUnicode mapping for -+ * unencoded glyphs which can be reached only through GSUB substitution. -+ * This is available only when "unicode" is specified in the encoding -+ * field of fontmap. We remember the inverse mapping via cmap_add in this -+ * case. -+ */ -+ { -+ char *cmap_add_name; -+ -+ cmap_add_name = NEW(strlen(font_name)+strlen(",000-UCS32-Add")+1, char); -+ sprintf(cmap_add_name, "%s,%03d-UCS32-Add", font_name, ttc_index); -+ cmap_add_id = CMap_cache_find(cmap_add_name); -+ RELEASE(cmap_add_name); -+ if (cmap_add_id < 0) { -+ cmap_add = NULL; -+ } else { -+ cmap_add = CMap_cache_get(cmap_add_id); -+ } - } - -- CMap_set_silent(1); /* many warnings without this... */ -+ ttcmap = NULL; - for (i = 0; i < sizeof(cmap_plat_encs) / sizeof(cmap_plat_enc_rec); ++i) { - ttcmap = tt_cmap_read(sfont, cmap_plat_encs[i].platform, cmap_plat_encs[i].encoding); - if (!ttcmap) - continue; - - if (ttcmap->format == 4 || ttcmap->format == 12) { -- cmap_obj = create_ToUnicode_cmap(ttcmap, cmap_name, cmap_add, used_chars, sfont); - break; -+ } else { -+ tt_cmap_release(ttcmap); -+ ttcmap = NULL; - } - } --#if defined(LIBDPX) -- if (cmap_obj == NULL && dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) --#else -- if (cmap_obj == NULL) --#endif /* LIBDPX */ -- WARN("Unable to read OpenType/TrueType Unicode cmap table."); -- tt_cmap_release(ttcmap); -- CMap_set_silent(0); -- -- if (cmap_obj) { -- res_id = pdf_defineresource("CMap", cmap_name, -- cmap_obj, PDF_RES_FLUSH_IMMEDIATE); -- cmap_ref = pdf_get_resource_reference(res_id); -- } else { -- cmap_ref = NULL; -+ if (ttcmap) { -+ pdf_obj *cmap_obj; -+ -+ CMap_set_silent(1); /* many warnings without this... */ -+ cmap_obj = create_ToUnicode_cmap(ttcmap, cmap_name, cmap_add, used_chars, sfont); -+ CMap_set_silent(0); -+ if (cmap_obj) { -+ cmap_id = pdf_defineresource("CMap", cmap_name, -+ cmap_obj, PDF_RES_FLUSH_IMMEDIATE); -+ cmap_ref = pdf_get_resource_reference(cmap_id); -+ } -+ tt_cmap_release(ttcmap); - } -- RELEASE(cmap_name); - -+ /* Cleanup */ -+ RELEASE(cmap_name); - sfnt_close(sfont); -- if (fp) -- DPXFCLOSE(fp); -+ DPXFCLOSE(fp); -+ -+#ifndef LIBDPX -+ if (!cmap_ref) { -+ WARN("Creating ToUnicode CMap failed for \"%s\"", font_name); -+ } -+#endif - - return cmap_ref; - } - --static int --load_base_CMap (const char *cmap_name, CMap *tounicode_add, int wmode, -- CIDSysInfo *csi, unsigned char *GIDToCIDMap, -- otl_gsub *gsub_vert, otl_gsub *gsub_list, -- tt_cmap *ttcmap) --{ -- int cmap_id; - -- cmap_id = CMap_cache_find(cmap_name); -- if (cmap_id < 0) { -- CMap *cmap; -+/* Creating input CMaps from OT cmap table */ - -- cmap = CMap_new(); -- CMap_set_name (cmap, cmap_name); -- CMap_set_type (cmap, CMAP_TYPE_CODE_TO_CID); -- CMap_set_wmode(cmap, wmode); -- CMap_add_codespacerange(cmap, lrange_min, lrange_max, 4); -+static void -+load_cmap4 (struct cmap4 *map, uint16_t *GIDToCIDMap, USHORT num_glyphs, -+ otl_gsub *gsub_vert, otl_gsub *gsub_list, -+ CMap *cmap, int32_t *map_base, int32_t *map_sub) -+{ -+ USHORT c0, c1, gid, cid; -+ USHORT j, d, segCount; -+ USHORT ch; -+ int i; -+ unsigned char buf[4]; - -- if (csi) { /* CID */ -- CMap_set_CIDSysInfo(cmap, csi); -- } else { -- CMap_set_CIDSysInfo(cmap, &CSI_IDENTITY); -+ segCount = map->segCountX2 / 2; -+ for (i = segCount - 1; i >= 0 ; i--) { -+ c0 = map->startCount[i]; -+ c1 = map->endCount[i]; -+ d = map->idRangeOffset[i] / 2 - (segCount - i); -+ for (j = 0; j <= c1 - c0; j++) { -+ ch = c0 + j; -+ if (map->idRangeOffset[i] == 0) { -+ gid = (ch + map->idDelta[i]) & 0xffff; -+ } else if (c0 == 0xffff && c1 == 0xffff && map->idRangeOffset[i] == 0xffff) { -+ /* this is for protection against some old broken fonts... */ -+ gid = 0; -+ } else { -+ gid = (map->glyphIndexArray[j+d] + map->idDelta[i]) & 0xffff; -+ } -+ if (gid != 0 && gid != 0xffff) { -+ /* Apply GSUB features */ -+ if (gsub_list) -+ otl_gsub_apply_chain(gsub_list, &gid); -+ if (gsub_vert) -+ otl_gsub_apply(gsub_vert, &gid); -+ cid = (gid < num_glyphs) ? GIDToCIDMap[gid] : 0; -+ buf[0] = 0; -+ buf[1] = 0; -+ buf[2] = (ch >> 8) & 0xff; -+ buf[3] = ch & 0xff; -+ CMap_add_cidchar(cmap, buf, 4, cid); -+ /* For ToUnicode creation */ -+ if (map_base && map_sub) { -+ if (is_PUA_or_presentation(ch)) { -+ map_sub[gid] = ch; -+ } else { -+ map_base[gid] = ch; -+ } -+ } -+ } - } -+ } - -- if (ttcmap->format == 12) { -- load_cmap12(ttcmap->map, GIDToCIDMap, gsub_vert, gsub_list, -- cmap, tounicode_add); -- } else if (ttcmap->format == 4) { -- load_cmap4(ttcmap->map, GIDToCIDMap, gsub_vert, gsub_list, -- cmap, tounicode_add); -- } -+ return; -+} - -- cmap_id = CMap_cache_add(cmap); -+static void -+load_cmap12 (struct cmap12 *map, uint16_t *GIDToCIDMap, USHORT num_glyphs, -+ otl_gsub *gsub_vert, otl_gsub *gsub_list, -+ CMap *cmap, int32_t *map_base, int32_t *map_sub) -+{ -+ ULONG i, ch; -+ USHORT gid, cid; -+ unsigned char buf[4]; -+ -+ for (i = 0; i < map->nGroups; i++) { -+ for (ch = map->groups[i].startCharCode; -+ ch <= map->groups[i].endCharCode; ch++) { -+ int d = ch - map->groups[i].startCharCode; -+ gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff); -+ if (gsub_list) -+ otl_gsub_apply_chain(gsub_list, &gid); -+ if (gsub_vert) -+ otl_gsub_apply(gsub_vert, &gid); -+ cid = (gid < num_glyphs) ? GIDToCIDMap[gid] : 0; -+ buf[0] = (ch >> 24) & 0xff; -+ buf[1] = (ch >> 16) & 0xff; -+ buf[2] = (ch >> 8) & 0xff; -+ buf[3] = ch & 0xff; -+ CMap_add_cidchar(cmap, buf, 4, cid); -+ if (map_base && map_sub) { -+ if (is_PUA_or_presentation(ch)) { -+ map_sub[gid] = ch; -+ } else { -+ map_base[gid] = ch; -+ } -+ } -+ } - } - -- return cmap_id; -+ return; - } - - int - otf_load_Unicode_CMap (const char *map_name, int ttc_index, /* 0 for non-TTC font */ -- const char *otl_tags, int wmode) -+ const char *otl_tags, int wmode) - { -- int cmap_id = -1; -- /* Additional ToUncidoe mappings required by OTL GSUB substitusion */ -- int tounicode_add_id = -1; -- CMap *tounicode_add = NULL; -- char *tounicode_add_name = NULL; -- int is_cidfont = 0; -- sfnt *sfont; -- ULONG offset = 0; -- char *cmap_name = NULL; -- FILE *fp = NULL; -- otl_gsub *gsub_vert = NULL, *gsub_list = NULL; -- tt_cmap *ttcmap; -- CIDSysInfo csi = {NULL, NULL, 0}; -- unsigned char *GIDToCIDMap = NULL; -+ int cmap_id = -1; -+ char *cmap_name = NULL; -+ sfnt *sfont = NULL; -+ ULONG offset = 0; -+ uint16_t num_glyphs = 0; -+ FILE *fp = NULL; -+ tt_cmap *ttcmap = NULL; -+ CIDSysInfo csi = {NULL, NULL, 0}; -+ uint16_t *GIDToCIDMap = NULL; - - if (!map_name) - return -1; -@@ -1359,11 +1324,6 @@ - sprintf(cmap_name, "%s,%03d-UCS4-H", map_name, ttc_index); - } - } -- if (dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { -- MESG("\n"); -- MESG("otf_cmap>> Unicode charmap for font=\"%s\" layout=\"%s\"\n", -- map_name, (otl_tags ? otl_tags : "none")); -- } - cmap_id = CMap_cache_find(cmap_name); - if (cmap_id >= 0) { - RELEASE(cmap_name); -@@ -1374,6 +1334,12 @@ - } - - /* CMap not found */ -+ if (dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { -+ MESG("\n"); -+ MESG("otf_cmap>> Creating Unicode charmap for font=\"%s\" layout=\"%s\"\n", -+ map_name, (otl_tags ? otl_tags : "none")); -+ } -+ - fp = DPXFOPEN(map_name, DPX_RES_TYPE_TTFONT); - if (!fp) { - fp = DPXFOPEN(map_name, DPX_RES_TYPE_OTFONT); -@@ -1390,13 +1356,20 @@ - } - - if (!sfont) { -- ERROR("Could not open OpenType/TrueType/dfont font file \"%s\"", map_name); -+ WARN("Could not open OpenType/TrueType/dfont font file \"%s\"", map_name); -+ RELEASE(cmap_name); -+ DPXFCLOSE(fp); -+ return -1; - } - switch (sfont->type) { - case SFNT_TYPE_TTC: - offset = ttc_read_offset(sfont, ttc_index); - if (offset == 0) { -- ERROR("Invalid TTC index"); -+ WARN("Offset=0 returned for font=%s, TTC_index=%d", map_name, ttc_index); -+ RELEASE(cmap_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ return -1; - } - break; - case SFNT_TYPE_TRUETYPE: -@@ -1407,41 +1380,79 @@ - offset = sfont->offset; - break; - default: -- ERROR("Not a OpenType/TrueType/TTC font?: %s", map_name); -+ WARN("Not a OpenType/TrueType/TTC font?: %s", map_name); -+ RELEASE(cmap_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ return -1; - break; - } - -- if (sfnt_read_table_directory(sfont, offset) < 0) -- ERROR("Could not read OpenType/TrueType table directory."); -+ if (sfnt_read_table_directory(sfont, offset) < 0) { -+ WARN("Could not read OpenType/TrueType table directory: %s", map_name); -+ RELEASE(cmap_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ return -1; -+ } - -+ { -+ struct tt_maxp_table *maxp; - -- if (otl_tags) { -- /* tounicode_add here is later refered by otf_create_ToUnicode_stream() -- * for finding additional CID to Unicode mapping entries required by -- * OTL gsub substitution. -- */ -- tounicode_add_name = NEW(strlen(map_name)+strlen(",000-UCS32-Add")+1, char); -- sprintf(tounicode_add_name, "%s,%03d-UCS32-Add", map_name, ttc_index); -- tounicode_add_id = CMap_cache_find(tounicode_add_name); -- if (tounicode_add_id >= 0) -- tounicode_add = CMap_cache_get(tounicode_add_id); -- else { -- tounicode_add = CMap_new(); -- CMap_set_name (tounicode_add, tounicode_add_name); -- CMap_set_type (tounicode_add, CMAP_TYPE_TO_UNICODE); -- CMap_set_wmode(tounicode_add, 0); -- CMap_add_codespacerange(tounicode_add, srange_min, srange_max, 2); -- CMap_set_CIDSysInfo(tounicode_add, &CSI_UNICODE); -- CMap_add_bfchar(tounicode_add, srange_min, 2, srange_max, 2); -- tounicode_add_id = CMap_cache_add(tounicode_add); -- } -- RELEASE(tounicode_add_name); -+ maxp = tt_read_maxp_table(sfont); -+ num_glyphs = (card16) maxp->numGlyphs; -+ RELEASE(maxp); - } - -+ GIDToCIDMap = NEW(num_glyphs, uint16_t); -+ memset(GIDToCIDMap, 0, num_glyphs*sizeof(uint16_t)); - if (sfont->type == SFNT_TYPE_POSTSCRIPT) { -- is_cidfont = handle_CIDFont(sfont, &GIDToCIDMap, &csi); -+ cff_font *cffont; -+ card16 gid; -+ -+ offset = sfnt_find_table_pos(sfont, "CFF "); -+ cffont = cff_open(sfont->stream, offset, 0); -+ if (!cffont) { -+ RELEASE(cmap_name); -+ RELEASE(GIDToCIDMap); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ return -1; -+ } -+ if (!(cffont->flag & FONTTYPE_CIDFONT)) { -+ csi.registry = strdup("Adobe"); -+ csi.ordering = strdup("Identity"); -+ csi.supplement = 0; -+ for (gid = 0; gid < num_glyphs; gid++) { -+ GIDToCIDMap[gid] = gid; -+ } -+ } else { -+ if (!cff_dict_known(cffont->topdict, "ROS")) { -+ csi.registry = strdup("Adobe"); -+ csi.ordering = strdup("Identity"); -+ csi.supplement = 0; -+ } else { -+ card16 reg, ord; -+ -+ reg = (card16) cff_dict_get(cffont->topdict, "ROS", 0); -+ ord = (card16) cff_dict_get(cffont->topdict, "ROS", 1); -+ csi.registry = cff_get_string(cffont, reg); -+ csi.ordering = cff_get_string(cffont, ord); -+ csi.supplement = (int) cff_dict_get(cffont->topdict, "ROS", 2); -+ } -+ cff_read_charsets(cffont); -+ create_GIDToCIDMap(GIDToCIDMap, num_glyphs, cffont); -+ } -+ cff_close(cffont); - } else { -- is_cidfont = 0; -+ uint16_t gid; -+ -+ csi.registry = strdup("Adobe"); -+ csi.ordering = strdup("Identity"); -+ csi.supplement = 0; -+ for (gid = 0; gid < num_glyphs; gid++) { -+ GIDToCIDMap[gid] = gid; -+ } - } - - ttcmap = tt_cmap_read(sfont, 3, 10); /* Microsoft UCS4 */ -@@ -1449,63 +1460,122 @@ - ttcmap = tt_cmap_read(sfont, 3, 1); /* Microsoft UCS2 */ - if (!ttcmap) { - ttcmap = tt_cmap_read(sfont, 0, 3); /* Unicode 2.0 or later */ --#if defined(LIBDPX) -- if (!ttcmap && dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { --#else -- if (!ttcmap) { --#endif /* LIBDPX */ -- ERROR("Unable to read OpenType/TrueType Unicode cmap table."); -- } - } - } -- if (wmode == 1) { -- gsub_vert = otl_gsub_new(); -- if (otl_gsub_add_feat(gsub_vert, "*", "*", "vrt2", sfont) < 0) { -- if (otl_gsub_add_feat(gsub_vert, "*", "*", "vert", sfont) < 0) { -- WARN("GSUB feature vrt2/vert not found."); -- otl_gsub_release(gsub_vert); -- gsub_vert = NULL; -+ -+ if (ttcmap) { -+ CMap *cmap = NULL; -+ int32_t *map_base, *map_sub; -+ otl_gsub *gsub_vert = NULL; -+ otl_gsub *gsub_list = NULL; -+ uint32_t gid; -+ -+ if (wmode == 1) { -+ gsub_vert = otl_gsub_new(); -+ if (otl_gsub_add_feat(gsub_vert, "*", "*", "vrt2", sfont) < 0) { -+ if (otl_gsub_add_feat(gsub_vert, "*", "*", "vert", sfont) < 0) { -+ WARN("GSUB feature vrt2/vert not found."); -+ otl_gsub_release(gsub_vert); -+ gsub_vert = NULL; -+ } else { -+ otl_gsub_select(gsub_vert, "*", "*", "vert"); -+ } - } else { -- otl_gsub_select(gsub_vert, "*", "*", "vert"); -+ otl_gsub_select(gsub_vert, "*", "*", "vrt2"); - } - } else { -- otl_gsub_select(gsub_vert, "*", "*", "vrt2"); -+ gsub_vert = NULL; - } -- } else { -- gsub_vert = NULL; -- } -- if (otl_tags) { -- gsub_list = otl_gsub_new(); -- if (otl_gsub_add_feat_list(gsub_list, otl_tags, sfont) < 0) { -- WARN("Readin GSUB feature table(s) failed for \"%s\"", otl_tags); -+ if (otl_tags) { -+ gsub_list = otl_gsub_new(); -+ if (otl_gsub_add_feat_list(gsub_list, otl_tags, sfont) < 0) { -+ WARN("Reading GSUB feature table(s) failed for \"%s\"", otl_tags); -+ } else { -+ otl_gsub_set_chain(gsub_list, otl_tags); -+ } - } else { -- otl_gsub_set_chain(gsub_list, otl_tags); -+ gsub_list = NULL; - } -- } else { -- gsub_list = NULL; -+ cmap = CMap_new(); -+ CMap_set_name(cmap, cmap_name); -+ CMap_set_type(cmap, CMAP_TYPE_CODE_TO_CID); -+ CMap_set_wmode(cmap, wmode); -+ CMap_add_codespacerange(cmap, lrange_min, lrange_max, 4); -+ CMap_set_CIDSysInfo(cmap, &csi); -+ map_base = NEW(num_glyphs, int32_t); -+ map_sub = NEW(num_glyphs, int32_t); -+ for (gid = 0; gid < num_glyphs; gid++) { -+ map_base[gid] = -1; -+ map_sub[gid] = -1; -+ } -+ switch (ttcmap->format) { -+ case 12: -+ load_cmap12(ttcmap->map, GIDToCIDMap, num_glyphs, -+ gsub_vert, gsub_list, -+ cmap, map_base, map_sub); -+ break; -+ case 4: -+ load_cmap4(ttcmap->map, GIDToCIDMap, num_glyphs, -+ gsub_vert, gsub_list, -+ cmap, map_base, map_sub); -+ break; -+ } -+ if (gsub_vert) -+ otl_gsub_release(gsub_vert); -+ if (gsub_list) -+ otl_gsub_release(gsub_list); -+ tt_cmap_release(ttcmap); -+ -+ if (otl_tags) { -+ CMap *tounicode = NULL; -+ char *tounicode_name; -+ int tounicode_id; -+ -+ tounicode_name = NEW(strlen(map_name)+strlen(",000-UCS32-Add")+1, char); -+ sprintf(tounicode_name, "%s,%03d-UCS32-Add", map_name, ttc_index); -+ tounicode_id = CMap_cache_find(tounicode_name); -+ if (tounicode_id >= 0) -+ tounicode = CMap_cache_get(tounicode_id); -+ else { -+ tounicode = CMap_new(); -+ CMap_set_name (tounicode, tounicode_name); -+ CMap_set_type (tounicode, CMAP_TYPE_TO_UNICODE); -+ CMap_set_wmode(tounicode, 0); -+ CMap_add_codespacerange(tounicode, srange_min, srange_max, 2); -+ CMap_set_CIDSysInfo(tounicode, &CSI_UNICODE); -+ CMap_add_bfchar(tounicode, srange_min, 2, srange_max, 2); -+ tounicode_id = CMap_cache_add(tounicode); -+ } -+ RELEASE(tounicode_name); -+ -+ for (gid = 0; gid < num_glyphs; gid++) { -+ uint16_t cid = GIDToCIDMap[gid]; -+ unsigned char src[2], dst[4]; -+ if (cid > 0) { -+ int32_t ch = UC_is_valid(map_base[gid]) ? map_base[gid] : map_sub[gid]; -+ if (UC_is_valid(ch)) { -+ unsigned char *p = dst; -+ unsigned char *endptr = dst + 4; -+ size_t len; -+ src[0] = (cid >> 8) & 0xff; -+ src[1] = cid & 0xff; -+ len = UC_UTF16BE_encode_char(ch, &p, endptr); -+ if (len > 0) { -+ CMap_add_bfchar(tounicode, src, 2, dst, len); -+ } -+ } -+ } -+ } -+ } -+ cmap_id = CMap_cache_add(cmap); - } -- cmap_id = load_base_CMap(cmap_name, tounicode_add, wmode, -- (is_cidfont ? &csi : NULL), GIDToCIDMap, -- gsub_vert, gsub_list, ttcmap); -- if (cmap_id < 0) -- ERROR("Failed to read OpenType/TrueType cmap table."); -- if (gsub_vert) -- otl_gsub_release(gsub_vert); -- gsub_vert = NULL; -- if (gsub_list) -- otl_gsub_release(gsub_list); -- gsub_list = NULL; - - RELEASE(cmap_name); -- if (GIDToCIDMap) -- RELEASE(GIDToCIDMap); -- if (is_cidfont) { -- if (csi.registry) -- RELEASE(csi.registry); -- if (csi.ordering) -- RELEASE(csi.ordering); -- } -- tt_cmap_release(ttcmap); -+ RELEASE(GIDToCIDMap); -+ if (csi.registry) -+ RELEASE(csi.registry); -+ if (csi.ordering) -+ RELEASE(csi.ordering); - sfnt_close(sfont); - DPXFCLOSE(fp); - -@@ -1515,14 +1585,11 @@ - int - otf_try_load_GID_to_CID_map (const char *map_name, int ttc_index, int wmode) - { -- int cmap_id = -1; -- sfnt *sfont; -- ULONG offset = 0; -- char *cmap_name = NULL; -- FILE *fp = NULL; -- CIDSysInfo csi = {NULL, NULL, 0}; -- int is_cidfont = 0; -- unsigned char *GIDToCIDMap = NULL; -+ int cmap_id = -1; -+ sfnt *sfont = NULL; -+ ULONG offset = 0; -+ char *cmap_name = NULL; -+ FILE *fp = NULL; - - if (!map_name) - return -1; -@@ -1559,13 +1626,20 @@ - } - - if (!sfont) { -- ERROR("Could not open OpenType/TrueType/dfont font file \"%s\"", map_name); -+ WARN("Could not open OpenType/TrueType/dfont font file \"%s\"", map_name); -+ RELEASE(cmap_name); -+ DPXFCLOSE(fp); -+ return -1; - } - switch (sfont->type) { - case SFNT_TYPE_TTC: - offset = ttc_read_offset(sfont, ttc_index); - if (offset == 0) { -- ERROR("Invalid TTC index"); -+ WARN("Invalid TTC index for font \"%s\": %d", map_name, ttc_index); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ RELEASE(cmap_name); -+ return -1; - } - break; - case SFNT_TYPE_TRUETYPE: -@@ -1576,12 +1650,20 @@ - offset = sfont->offset; - break; - default: -- ERROR("Not a OpenType/TrueType/TTC font?: %s", map_name); -- break; -+ WARN("Not a OpenType/TrueType/TTC font?: %s", map_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ RELEASE(cmap_name); -+ return -1; - } - -- if (sfnt_read_table_directory(sfont, offset) < 0) -- ERROR("Could not read OpenType/TrueType table directory."); -+ if (sfnt_read_table_directory(sfont, offset) < 0) { -+ WARN("Could not read OpenType/TrueType table directory: %s", map_name); -+ sfnt_close(sfont); -+ DPXFCLOSE(fp); -+ RELEASE(cmap_name); -+ return -1; -+ } - if (sfont->type != SFNT_TYPE_POSTSCRIPT) { - RELEASE(cmap_name); - sfnt_close(sfont); -@@ -1590,41 +1672,71 @@ - } - - /* Read GID-to-CID mapping if CFF OpenType is found. */ -- is_cidfont = handle_CIDFont(sfont, &GIDToCIDMap, &csi); -- if (is_cidfont) { -- if (GIDToCIDMap) { -- CMap *cmap; -- int32_t gid; -- const unsigned char csrange[4] = {0x00, 0x00, 0xff, 0xff}; -+ if (sfont->type == SFNT_TYPE_POSTSCRIPT) { -+ cff_font *cffont; -+ struct tt_maxp_table *maxp; -+ const unsigned char csrange[4] = {0x00, 0x00, 0xff, 0xff}; -+ uint16_t num_glyphs = 0; -+ -+ maxp = tt_read_maxp_table(sfont); -+ num_glyphs = (card16) maxp->numGlyphs; -+ RELEASE(maxp); -+ -+ offset = sfnt_find_table_pos(sfont, "CFF "); -+ cffont = cff_open(sfont->stream, offset, 0); -+ if (cffont && cffont->flag & FONTTYPE_CIDFONT) { -+ CMap *cmap; -+ uint16_t gid; -+ uint16_t *GIDToCIDMap = NULL; -+ CIDSysInfo csi = {NULL, NULL, 0}; -+ -+ if (!cff_dict_known(cffont->topdict, "ROS")) { -+ csi.registry = strdup("Adobe"); -+ csi.ordering = strdup("Identity"); -+ csi.supplement = 0; -+ } else { -+ card16 reg, ord; - -+ reg = (card16) cff_dict_get(cffont->topdict, "ROS", 0); -+ ord = (card16) cff_dict_get(cffont->topdict, "ROS", 1); -+ csi.registry = cff_get_string(cffont, reg); -+ csi.ordering = cff_get_string(cffont, ord); -+ csi.supplement = (int) cff_dict_get(cffont->topdict, "ROS", 2); -+ } -+ cff_read_charsets(cffont); -+ GIDToCIDMap = NEW(num_glyphs, uint16_t); -+ memset(GIDToCIDMap, 0, num_glyphs*sizeof(uint16_t)); -+ create_GIDToCIDMap(GIDToCIDMap, num_glyphs, cffont); - cmap = CMap_new(); - CMap_set_name (cmap, cmap_name); - CMap_set_type (cmap, CMAP_TYPE_CODE_TO_CID); - CMap_set_wmode(cmap, wmode); - CMap_add_codespacerange(cmap, &csrange[0], &csrange[2], 2); - CMap_set_CIDSysInfo(cmap, &csi); -- -- for (gid = 0; gid < 65536; gid++) { -- unsigned char src[2]; -+ for (gid = 0; gid < num_glyphs; gid++) { -+ unsigned char src[2], dst[2]; - src[0] = (gid >> 8) & 0xff; - src[1] = gid & 0xff; -- CMap_add_bfchar(cmap, src, 2, &GIDToCIDMap[gid*2], 2); -+ dst[0] = (GIDToCIDMap[gid] >> 8) & 0xff; -+ dst[1] = GIDToCIDMap[gid] & 0xff; -+ CMap_add_bfchar(cmap, src, 2, dst, 2); - } - cmap_id = CMap_cache_add(cmap); - if (dpx_conf.verbose_level > VERBOSE_LEVEL_MIN) { - MESG("\n"); - MESG("otf_cmap>> Creating GID-to-CID mapping for font=\"%s\"\n", map_name); - } -+ RELEASE(GIDToCIDMap); -+ if (csi.registry) -+ RELEASE(csi.registry); -+ if (csi.ordering) -+ RELEASE(csi.ordering); - } -- /* Identity mapping for null GIDToCIDMap */ -+ if (cffont) -+ cff_close(cffont); - } -+ - RELEASE(cmap_name); -- if (GIDToCIDMap) -- RELEASE(GIDToCIDMap); -- if (csi.registry) -- RELEASE(csi.registry); -- if (csi.ordering) -- RELEASE(csi.ordering); - sfnt_close(sfont); - DPXFCLOSE(fp); - -diff -Naur a/texk/dvipdfm-x/tt_gsub.c b/texk/dvipdfm-x/tt_gsub.c ---- a/texk/dvipdfm-x/tt_gsub.c 2018-12-21 03:39:51.000000000 +0000 -+++ b/texk/dvipdfm-x/tt_gsub.c 2019-05-31 22:00:04.009964032 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2002-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2002-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - This program is free software; you can redistribute it and/or modify -@@ -977,10 +977,11 @@ - - sfnt_seek_set(sfont, offset); - clt_read_feature_table(&feature_table, sfont); -+#if 0 - if (feature_table.FeatureParams != 0) { - ERROR("unrecognized FeatureParams"); - } -- -+#endif - /* Lookup table */ - for (i = 0; i < feature_table.LookupListIndex.count; i++) { - struct clt_lookup_table lookup_table; -@@ -1680,98 +1681,303 @@ - return retval; - } - --#if 0 -+#if 1 -+#include "unicode.h" -+ -+#ifndef is_used_char2 -+#define is_used_char2(b,c) (((b)[(c)/8]) & (1 << (7-((c)%8)))) -+#endif -+ -+static int -+add_glyph_if_valid (CMap *cmap, char *used_chars, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap, USHORT gid, USHORT gid_sub) -+{ -+ int count = 0; -+ unsigned char src[2], dst[4]; -+ unsigned char *p = dst, *endptr = dst + 4; -+ size_t len; -+ uint16_t cid_sub; -+ -+ if (gid_sub >= num_glyphs || gid >= num_glyphs) -+ return 0; -+ -+ cid_sub = GIDToCIDMap[gid_sub]; -+ if (is_used_char2(used_chars, cid_sub)) { -+ int32_t ch = map_base[gid]; -+ if (UC_is_valid(ch)) { -+ src[0] = (cid_sub >> 8) & 0xff; -+ src[1] = cid_sub & 0xff; -+ len = UC_UTF16BE_encode_char(ch, &p, endptr); -+ CMap_add_bfchar(cmap, src, 2, dst, len); -+ used_chars[cid_sub / 8] &= ~(1 << (7 - (cid_sub % 8))); -+ count = 1; -+ } else { -+ ch = map_sub[gid]; -+ if (UC_is_valid(ch)) { -+ src[0] = (cid_sub >> 8) & 0xff; -+ src[1] = cid_sub & 0xff; -+ len = UC_UTF16BE_encode_char(ch, &p, endptr); -+ CMap_add_bfchar(cmap, src, 2, dst, len); -+ used_chars[cid_sub / 8] &= ~(1 << (7 - (cid_sub % 8))); -+ count = 1; -+ } -+ } -+ } -+ return count; -+} -+ - static int --otl_gsub_dump_single (struct otl_gsub_subtab *subtab) -+add_ToUnicode_single (CMap *cmap, char *used_chars, -+ struct otl_gsub_subtab *subtab, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap) - { -- int gid, idx; -+ int count = 0; -+ USHORT i, idx, gid; -+ USHORT gid_sub; - - ASSERT(subtab); - - if (subtab->SubstFormat == 1) { - struct otl_gsub_single1 *data; -+ struct clt_coverage *cov; - - data = (subtab->table).single1; -- for (gid = 0; gid < 0x10000; gid++) { -- idx = clt_lookup_coverage(&data->coverage, gid); -- if (idx >= 0) { -- fprintf(stdout, "substitute \\%u by \\%u;\n", -- (USHORT) gid, (USHORT) (gid + data->DeltaGlyphID)); -+ cov = &data->coverage; -+ switch (cov->format) { -+ case 1: /* list */ -+ for (idx = 0; idx < cov->count; idx++) { -+ gid = cov->list[idx]; -+ gid_sub = gid + data->DeltaGlyphID; -+ count += add_glyph_if_valid(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, gid_sub); - } -+ break; -+ case 2: /* range */ -+ for (i = 0; i < cov->count; i++) { -+ for (gid = cov->range[i].Start; -+ gid <= cov->range[i].End && gid < num_glyphs; gid++) { -+ idx = cov->range[i].StartCoverageIndex + gid - cov->range[i].Start; -+ gid_sub = gid + data->DeltaGlyphID; -+ count += add_glyph_if_valid(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, gid_sub); -+ } -+ } -+ break; - } - } else if (subtab->SubstFormat == 2) { - struct otl_gsub_single2 *data; -+ struct clt_coverage *cov; - - data = (subtab->table).single2; -- for (gid = 0; gid < 0x10000; gid++) { -- idx = clt_lookup_coverage(&data->coverage, gid); -- if (idx >= 0 && -- idx < data->GlyphCount) { -- fprintf(stdout, "substitute \\%u by \\%u;\n", -- (USHORT) gid, (data->Substitute)[idx]); -+ cov = &data->coverage; -+ switch (cov->format) { -+ case 1: /* list */ -+ for (idx = 0; idx < cov->count; idx++) { -+ gid = cov->list[idx]; -+ if (idx >= 0 && idx < data->GlyphCount) { -+ gid_sub = (data->Substitute)[idx]; -+ count += add_glyph_if_valid(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, gid_sub); -+ } - } -+ break; -+ case 2: /* range */ -+ for (i = 0; i < cov->count; i++) { -+ for (gid = cov->range[i].Start; -+ gid <= cov->range[i].End && gid < num_glyphs; gid++) { -+ idx = cov->range[i].StartCoverageIndex + gid - cov->range[i].Start; -+ if (idx >= 0 && idx < data->GlyphCount) { -+ gid_sub = (data->Substitute)[idx]; -+ count += add_glyph_if_valid(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, gid_sub); -+ } -+ } -+ } -+ break; - } - } - -- return 0; -+ return count; - } - --static int --otl_gsub_dump_alternate (struct otl_gsub_subtab *subtab) -+static int32_t -+add_alternate1_inverse_map (CMap *cmap, char *used_chars, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap, USHORT gid, int idx, -+ struct otl_gsub_alternate1 *data) - { -- int gid, idx; -+ int32_t count = 0; -+ -+ if (idx >= 0 && idx < data->AlternateSetCount) { -+ struct otl_gsub_altset *altset; -+ USHORT i; -+ -+ altset = &(data->AlternateSet[idx]); -+ if (altset->GlyphCount == 0) -+ return count; -+ for (i = 0; i < altset->GlyphCount; i++) { -+ USHORT gid_alt = altset->Alternate[i]; -+ count += add_glyph_if_valid(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, gid_alt); -+ } -+ } -+ return count; -+} -+ -+static int32_t -+add_ToUnicode_alternate (CMap *cmap, char *used_chars, -+ struct otl_gsub_subtab *subtab, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap) -+{ -+ int32_t count = 0; -+ USHORT i, gid, idx; - - ASSERT(subtab); - - if (subtab->SubstFormat == 1) { - struct otl_gsub_alternate1 *data; -- -+ struct clt_coverage *cov; - data = subtab->table.alternate1; -- for (gid = 0; gid < 0x10000; gid++) { -- idx = clt_lookup_coverage(&data->coverage, gid); -- if (idx >= 0 && idx < data->AlternateSetCount) { -- struct otl_gsub_altset *altset; -- USHORT i; -- altset = &(data->AlternateSet[idx]); -- if (altset->GlyphCount == 0) -- continue; -- fprintf(stdout, "substitute \\%u from [", (USHORT) gid); -- for (i = 0; i < altset->GlyphCount; i++) { -- fprintf(stdout, " \\%u", altset->Alternate[i]); -+ cov = &data->coverage; -+ switch (cov->format) { -+ case 1: /* list */ -+ for (idx = 0; idx < cov->count; idx++) { -+ gid = cov->list[idx]; -+ if (gid < num_glyphs) { -+ count += add_alternate1_inverse_map(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, idx, data); -+ } -+ } -+ break; -+ case 2: /* range */ -+ for (i = 0; i < cov->count; i++) { -+ for (gid = cov->range[i].Start; -+ gid <= cov->range[i].End && gid < num_glyphs; gid++) { -+ idx = cov->range[i].StartCoverageIndex + gid - cov->range[i].Start; -+ count += add_alternate1_inverse_map(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, idx, data); - } -- fprintf(stdout, " ];\n"); - } -+ break; - } - } -+ return count; -+} - -- return 0; -+static int32_t -+add_ligature1_inverse_map (CMap *cmap, char *used_chars, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap, USHORT gid_1, int idx, -+ struct otl_gsub_ligature1 *data) -+{ -+ int32_t count = 0; -+ -+ if (idx >= 0 && idx < data->LigSetCount) { -+ struct otl_gsub_ligset *ligset; -+ USHORT i, j; -+ -+ ligset = &(data->LigatureSet[idx]); -+ for (j = 0; j < ligset->LigatureCount; j++) { -+ USHORT gid_sub = ligset->Ligature[j].LigGlyph; -+ if (gid_sub < num_glyphs) { -+ uint16_t cid = GIDToCIDMap[gid_sub]; -+ if (is_used_char2(used_chars, cid)) { -+ int32_t ch, *ucv; -+ USHORT comp_count = ligset->Ligature[j].CompCount; -+ int fail_count = 0; -+ -+ ucv = NEW(comp_count, int32_t); -+ ch = UC_is_valid(map_base[gid_1]) ? map_base[gid_1] : map_sub[gid_1]; -+ ucv[0] = ch; -+ fail_count += UC_is_valid(ch) ? 0 : 1; -+ for (i = 0; i < ligset->Ligature[j].CompCount - 1; i++) { -+ USHORT gid = ligset->Ligature[j].Component[i]; -+ if (gid < num_glyphs) { -+ ch = UC_is_valid(map_base[gid]) ? map_base[gid] : map_sub[gid]; -+ ucv[i+1] = ch; -+ fail_count += UC_is_valid(ch) ? 0 : 1; -+ } else { -+ fail_count += 1; -+ } -+ } -+ if (fail_count == 0) { -+ unsigned char src[2], *dst; -+ unsigned char *p, *endptr; -+ size_t len = 0; -+ -+ src[0] = (cid >> 8) & 0xff; -+ src[1] = cid & 0xff; -+ dst = NEW(comp_count*4, unsigned char); -+ p = dst; -+ endptr = dst + comp_count * 4; -+ for (i = 0; i < comp_count; i++) { -+ len += UC_UTF16BE_encode_char(ucv[i], &p, endptr); -+ } -+ CMap_add_bfchar(cmap, src, 2, dst, len); -+ used_chars[cid / 8] &= ~(1 << (7 - (cid % 8))); -+ count++; -+ RELEASE(dst); -+ } -+ RELEASE(ucv); -+ } -+ } -+ } -+ } -+ -+ return count; - } - --static int --otl_gsub_dump_ligature (struct otl_gsub_subtab *subtab) -+static int32_t -+add_ToUnicode_ligature (CMap *cmap, char *used_chars, -+ struct otl_gsub_subtab *subtab, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap) - { -- int gid, idx; -+ int32_t count = 0; -+ USHORT i, idx, gid; - - ASSERT(subtab); - - if (subtab->SubstFormat == 1) { - struct otl_gsub_ligature1 *data; -+ struct clt_coverage *cov; - - data = subtab->table.ligature1; -- for (gid = 0; gid < 0x10000; gid++) { -- idx = clt_lookup_coverage(&data->coverage, gid); -- if (idx >= 0 && idx < data->LigSetCount) { -- struct otl_gsub_ligset *ligset; -- USHORT i, j; -- ligset = &(data->LigatureSet[idx]); -- for (j = 0; j < ligset->LigatureCount; j++) { -- fprintf(stdout, "substitute \\%u", (USHORT) gid); -- for (i = 0; i < ligset->Ligature[j].CompCount - 1; i++) { -- fprintf(stdout, " \\%u", ligset->Ligature[j].Component[i]); -+ cov = &data->coverage; -+ switch (cov->format) { -+ case 1: /* list */ -+ for (idx = 0; idx < cov->count; idx++) { -+ gid = cov->list[idx]; -+ if (gid < num_glyphs) { -+ count += add_ligature1_inverse_map(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, idx, data); -+ } -+ } -+ break; -+ case 2: /* range */ -+ for (i = 0; i < cov->count; i++) { -+ for (gid = cov->range[i].Start; -+ gid <= cov->range[i].End && gid < num_glyphs; gid++) { -+ idx = cov->range[i].StartCoverageIndex + gid - cov->range[i].Start; -+ if (gid < num_glyphs) { -+ count += add_ligature1_inverse_map(cmap, used_chars, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap, gid, idx, data); - } -- fprintf(stdout, " by \\%u;\n", ligset->Ligature[j].LigGlyph); - } - } -+ break; - } - } - -@@ -1779,48 +1985,44 @@ - } - - int --otl_gsub_dump (otl_gsub *gsub_list, -- const char *script, const char *language, const char *feature) -+otl_gsub_add_ToUnicode (CMap *cmap, char *used_chars, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap, sfnt *sfont) - { -- int error = -1; -+ int count = 0; -+ otl_gsub *gsub_list; - struct otl_gsub_tab *gsub; - struct otl_gsub_subtab *subtab; -- int sel, i, j; -- -- if (!gsub_list) -- return -1; -+ int i, j; - -- sel = gsub_list->select; -- error = otl_gsub_select(gsub_list, script, language, feature); -- if (error < 0) { -- ERROR("GSUB feature %s.%s.%s not found.", script, language, feature); -- } -- -- i = gsub_list->select; -- if (i < 0 || i >= gsub_list->num_gsubs) { -- ERROR("GSUB not selected..."); -- return -1; -- } -- gsub = &(gsub_list->gsubs[i]); -+ gsub_list = otl_gsub_new(); -+ otl_gsub_add_feat(gsub_list, "*", "*", "*", sfont); - -- for (j = 0; -- !error && -- j < gsub->num_subtables; j++) { -- subtab = &(gsub->subtables[j]); -- switch ((int) subtab->LookupType){ -- case OTL_GSUB_TYPE_SINGLE: -- error = otl_gsub_dump_single(subtab); -- break; -- case OTL_GSUB_TYPE_ALTERNATE: -- error = otl_gsub_dump_alternate(subtab); -- break; -- case OTL_GSUB_TYPE_LIGATURE: -- error = otl_gsub_dump_ligature(subtab); -- break; -+ for (i = 0; i < gsub_list->num_gsubs; i++) { -+ gsub = &(gsub_list->gsubs[i]); -+ for (j = 0; j < gsub->num_subtables; j++) { -+ subtab = &(gsub->subtables[j]); -+ switch ((int) subtab->LookupType){ -+ case OTL_GSUB_TYPE_SINGLE: -+ count += add_ToUnicode_single(cmap, used_chars, subtab, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap); -+ break; -+ case OTL_GSUB_TYPE_ALTERNATE: -+ count += add_ToUnicode_alternate(cmap, used_chars, subtab, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap); -+ break; -+ case OTL_GSUB_TYPE_LIGATURE: -+ count += add_ToUnicode_ligature(cmap, used_chars, subtab, -+ map_base, map_sub, num_glyphs, -+ GIDToCIDMap); -+ break; -+ } - } - } -- gsub_list->select = sel; -+ otl_gsub_release(gsub_list); - -- return error; -+ return count; - } - #endif -diff -Naur a/texk/dvipdfm-x/tt_gsub.h b/texk/dvipdfm-x/tt_gsub.h ---- a/texk/dvipdfm-x/tt_gsub.h 2018-09-14 04:34:50.000000000 +0100 -+++ b/texk/dvipdfm-x/tt_gsub.h 2019-05-31 22:00:04.009964032 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2002-2018 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2002-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - This program is free software; you can redistribute it and/or modify -@@ -23,6 +23,7 @@ - - #include "sfnt.h" - #include "otl_opt.h" -+#include "cmap.h" - - typedef struct otl_gsub otl_gsub; - -@@ -59,11 +60,7 @@ - extern int otl_gsub_set_chain (otl_gsub *gsub_list, const char *otl_tags); - extern int otl_gsub_apply_chain (otl_gsub *gsub_list, USHORT *gid); - --#if 0 --extern int otl_gsub_dump (otl_gsub *gsub_list, -- const char *script, -- const char *language, -- const char *feature); --#endif -- -+extern int otl_gsub_add_ToUnicode (CMap *cmap, char *used_chars, -+ int32_t *map_base, int32_t *map_sub, USHORT num_glyphs, -+ uint16_t *GIDToCIDMap, sfnt *sfont); - #endif /* _TT_GSUB_H_ */ -diff -Naur a/texk/dvipdfm-x/unicode.c b/texk/dvipdfm-x/unicode.c ---- a/texk/dvipdfm-x/unicode.c 2016-01-06 10:13:28.000000000 +0000 -+++ b/texk/dvipdfm-x/unicode.c 2019-05-31 22:00:04.009964032 +0100 -@@ -1,6 +1,6 @@ - /* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. - -- Copyright (C) 2002-2016 by Jin-Hwan Cho and Shunsaku Hirata, -+ Copyright (C) 2002-2019 by Jin-Hwan Cho and Shunsaku Hirata, - the dvipdfmx project team. - - Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu> -@@ -123,7 +123,7 @@ - unsigned char *p = *pp; - - if (ucv >= 0 && ucv <= 0xFFFF) { -- if (p + 2 >= endptr) -+ if (p + 2 > endptr) - return 0; - p[0] = (ucv >> 8) & 0xff; - p[1] = ucv & 0xff; -@@ -131,7 +131,7 @@ - } else if (ucv >= 0x010000 && ucv <= 0x10FFFF) { - unsigned short high, low; - -- if (p + 4 >= endptr) -+ if (p + 4 > endptr) - return 0; - ucv -= 0x00010000; - high = (ucv >> UC_SUR_SHIFT) + UC_SUR_HIGH_START; -@@ -142,7 +142,7 @@ - p[3] = (low & 0xff); - count = 4; - } else { -- if (p + 2 >= endptr) -+ if (p + 2 > endptr) - return 0; - p[0] = (UC_REPLACEMENT_CHAR >> 8) & 0xff; - p[1] = (UC_REPLACEMENT_CHAR & 0xff); -@@ -207,25 +207,25 @@ - return 0; - - if (ucv < 0x7f) { -- if (p >= endptr - 1) -+ if (p + 1 > endptr) - return 0; - p[0] = (unsigned char) ucv; - count = 1; - } else if (ucv <= 0x7ff) { -- if (p >= endptr -2) -+ if (p + 2 > endptr) - return 0; - p[0] = (unsigned char) (0xc0 | (ucv >> 6)); - p[1] = (unsigned char) (0x80 | (ucv & 0x3f)); - count = 2; - } else if (ucv <= 0xffff) { -- if (p >= endptr - 3) -+ if (p + 3 > endptr) - return 0; - p[0] = (unsigned char) (0xe0 | (ucv >> 12)); - p[1] = (unsigned char) (0x80 | ((ucv >> 6) & 0x3f)); - p[2] = (unsigned char) (0x80 | (ucv & 0x3f)); - count = 3; - } else if (ucv <= 0x1fffff) { -- if (p >= endptr - 4) -+ if (p + 4 > endptr) - return 0; - p[0] = (unsigned char) (0xf0 | (ucv >> 18)); - p[1] = (unsigned char) (0x80 | ((ucv >> 12) & 0x3f)); -@@ -233,7 +233,7 @@ - p[3] = (unsigned char) (0x80 | (ucv & 0x3f)); - count = 4; - } else if (ucv <= 0x3ffffff) { -- if (p >= endptr - 5) -+ if (p + 5 > endptr) - return 0; - p[0] = (unsigned char) (0xf8 | (ucv >> 24)); - p[1] = (unsigned char) (0x80 | ((ucv >> 18) & 0x3f)); -@@ -242,7 +242,7 @@ - p[4] = (unsigned char) (0x80 | (ucv & 0x3f)); - count = 5; - } else if (ucv <= 0x7fffffff) { -- if (p >= endptr - 6) -+ if (p + 6 > endptr) - return 0; - p[0] = (unsigned char) (0xfc | (ucv >> 30)); - p[1] = (unsigned char) (0x80 | ((ucv >> 24) & 0x3f)); -diff -Naur a/texk/dvipsk/ChangeLog b/texk/dvipsk/ChangeLog ---- a/texk/dvipsk/ChangeLog 2019-04-07 02:42:55.000000000 +0100 -+++ b/texk/dvipsk/ChangeLog 2019-05-31 22:00:04.009964032 +0100 -@@ -1,3 +1,9 @@ -+2019-04-30 Karl Berry <karl@tug.org> -+ -+ * dosection.c (dosection): close PostScript string constant -+ for long filenames. tex-k mail from Arnaud Blouin, -+ 24 Apr 2019 13:54:10. -+ - 2019-04-07 Karl Berry <karl@freefriends.org> - - * TeX Live 2019. -diff -Naur a/texk/dvipsk/dosection.c b/texk/dvipsk/dosection.c ---- a/texk/dvipsk/dosection.c 2019-03-30 01:50:10.000000000 +0000 -+++ b/texk/dvipsk/dosection.c 2019-05-31 22:00:04.009964032 +0100 -@@ -23,7 +23,7 @@ - int np; - int k; - integer thispage = 0; -- char buf[104]; -+ char buf[300]; /* really 253 */ - - dopsfont(s); - #ifdef HPS -@@ -40,7 +40,9 @@ - doubleout(mag); - numout((integer)DPI); - numout((integer)VDPI); -- snprintf(buf, sizeof(buf), "(%.500s)", fulliname); -+ /* possibly lines in eps files are supposed to be <= 255; -+ not worth testing the limits merely to output a long file name. */ -+ snprintf(buf, sizeof(buf), "(%.250s)", fulliname); - cmdout(buf); - newline(); - cmdout("@start"); -diff -Naur a/texk/web2c/ptexdir/ChangeLog b/texk/web2c/ptexdir/ChangeLog ---- a/texk/web2c/ptexdir/ChangeLog 2019-02-06 11:01:31.000000000 +0000 -+++ b/texk/web2c/ptexdir/ChangeLog 2019-05-31 22:00:04.010964033 +0100 -@@ -1,3 +1,11 @@ -+2019-05-06 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp> -+ -+ * ptex-base.ch: -+ Make appropriate comparison of U+0100 by \if in upTeX. -+ https://github.com/texjporg/tex-jp-build/issues/68 -+ Re-eval kcatcode of Japanese character token in \if and \ifcat. -+ https://github.com/texjporg/ptex-manual/issues/4 -+ - 2019-02-03 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp> - - * ptex-base.ch: Ignore newline char after Japanese control -diff -Naur a/texk/web2c/ptexdir/ptex-base.ch b/texk/web2c/ptexdir/ptex-base.ch ---- a/texk/web2c/ptexdir/ptex-base.ch 2019-02-06 11:00:54.000000000 +0000 -+++ b/texk/web2c/ptexdir/ptex-base.ch 2019-05-31 22:00:04.010964033 +0100 -@@ -59,6 +59,7 @@ - % (2017-09-07) HK pTeX p3.7.2 More restrictions on direction change commands. - % (2018-01-21) HK Added \ptexversion primitive and co. pTeX p3.8. - % (2018-04-14) HK pTeX p3.8.1 Bug fix for discontinuous KINSOKU table. -+% (2019-02-03) HK pTeX p3.8.2 Change \inhibitglue, add \disinhibitglue. - % - - @x -@@ -324,6 +325,13 @@ - wterm(')'); - @z - -+@x -+@d max_halfword==@"FFFFFFF {largest allowable value in a |halfword|} -+@y -+@d max_halfword==@"FFFFFFF {largest allowable value in a |halfword|} -+@d max_cjk_val=@"10000 -+@z -+ - @x [8.111] l.2436 - pTeX: check hi/ho - (mem_top+sup_main_memory>=max_halfword) then bad:=14; - @y -@@ -2533,19 +2541,19 @@ - end; - @y - if (cur_cmd=kanji)or(cur_cmd=kana)or(cur_cmd=other_kchar) then -- begin m:=cur_cmd; n:=cur_chr; -+ begin n:=cur_chr; m:=kcat_code(kcatcodekey(n)); - end - else if (cur_cmd>active_char)or(cur_chr>255) then -- begin m:=relax; n:=256; -+ begin m:=relax; n:=max_cjk_val; - end - else begin m:=cur_cmd; n:=cur_chr; - end; - get_x_token_or_active_char; - if (cur_cmd=kanji)or(cur_cmd=kana)or(cur_cmd=other_kchar) then -- begin cur_cmd:=cur_cmd; -- end {dummy} -+ begin cur_cmd:=kcat_code(kcatcodekey(cur_chr)); -+ end - else if (cur_cmd>active_char)or(cur_chr>255) then -- begin cur_cmd:=relax; cur_chr:=256; -+ begin cur_cmd:=relax; cur_chr:=max_cjk_val; - end; - @z - -diff -Naur a/texk/web2c/uptexdir/ChangeLog b/texk/web2c/uptexdir/ChangeLog ---- a/texk/web2c/uptexdir/ChangeLog 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/ChangeLog 2019-05-31 22:00:04.010964033 +0100 -@@ -1,3 +1,28 @@ -+2019-05-25 TANAKA Takuji <ttk@t-lab.opal.ne.jp> -+ -+ * uptex-m.ch: -+ Correct upTeX_revision ".25", upTeX_version_string "-u1.25". -+ -+2019-05-06 TANAKA Takuji <ttk@t-lab.opal.ne.jp> -+ -+ * uptex-m.ch, upbibtex.ch, updvitype.ch, uppltotf.ch, uptftopl.ch, -+ uptex_version.h: upTeX version u1.25. -+ * kanji.c, kanji.h: -+ Fix bug of kcatcode at Fullwidth ASCII variants and -+ Halfwidth Katakana variants from Yusuke Terada san: -+ https://github.com/texjporg/tex-jp-build/pull/79 -+ Set default internal encoding EUC/SJIS if a command name is -+ with prefix of "p" or "ep", intending to be compatible with -+ pTeX family (ptex, eptex, pbibtex, pdvitype, ppltotf, ptftopl) -+ (experimental). -+ -+2019-05-06 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp> -+ -+ * uptex-m.ch: -+ Make appropreate comparison of U+0100 by \if. -+ https://github.com/texjporg/tex-jp-build/issues/68 -+ * tests/test_if.tex: Test case. -+ - 2019-02-23 TANAKA Takuji <ttk@t-lab.opal.ne.jp> - - * uptex-m.ch, upbibtex.ch, updvitype.ch, uppltotf.ch, uptftopl.ch, -@@ -24,7 +49,7 @@ - 2018-09-16 TANAKA Takuji <ttk@t-lab.opal.ne.jp> - - * upbibtex.ch: Fix bug of substring$ -- from Takashi Sakai: -+ from Takashi Sakai san: - https://github.com/texjporg/tex-jp-build/issues/64 - https://github.com/texjporg/tex-jp-build/pull/66 - -diff -Naur a/texk/web2c/uptexdir/kanji.c b/texk/web2c/uptexdir/kanji.c ---- a/texk/web2c/uptexdir/kanji.c 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/kanji.c 2019-05-31 22:00:04.010964033 +0100 -@@ -444,7 +444,7 @@ - || (LATIN_SMALL_LETTER_O_WITH_STROKE <=c && c<=LATIN_SMALL_LETTER_Y_WITH_DIAERESIS ) ) - return 0x1FD; - } -- if (block==0xa0) { -+ if (block==0xa1) { - /* Fullwidth ASCII variants except for U+FF01..FF0F, U+FF1A..FF20, U+FF3B..FF40, U+FF5B..FF5E */ - if ( (FULLWIDTH_DIGIT_0 <=c && c<=FULLWIDTH_DIGIT_9 ) - || (FULLWIDTH_CAPITAL_A<=c && c<=FULLWIDTH_CAPITAL_Z) -@@ -485,8 +485,6 @@ - { - char *p; - -- enable_UPTEX (true); /* enable */ -- - init_kanji (file_str, internal_str); - - p = getenv ("PTEX_KANJI_ENC"); -@@ -504,3 +502,33 @@ - } - #endif - } -+ -+void init_default_kanji_select(void) -+{ -+ char *base; -+ -+ base = kpse_program_basename (argv[0]); -+ -+ if (FILESTRNCASEEQ(base, "p", 1) || FILESTRNCASEEQ(base, "ep", 2)) { -+ -+ enable_UPTEX (false); /* disable */ -+#if defined(WIN32) -+/* pBibTeX is EUC only */ -+ if (FILESTRNCASEEQ(base, "pbibtex", 7)) { -+ init_default_kanji(NULL, "euc"); -+ } else { -+/* for pTeX, e-pTeX, pDVItype, pPLtoTF, and pTFtoPL */ -+ init_default_kanji(NULL, "sjis"); -+ } -+#else -+ init_default_kanji(NULL, "euc"); -+#endif -+ -+ } else { -+ -+/* for upTeX, e-upTeX, upBibTeX, upDVItype, upPLtoTF, and upTFtoPL */ -+ enable_UPTEX (true); /* enable */ -+ init_default_kanji ("utf8", "uptex"); -+ -+ } -+} -diff -Naur a/texk/web2c/uptexdir/kanji.h b/texk/web2c/uptexdir/kanji.h ---- a/texk/web2c/uptexdir/kanji.h 2019-02-06 11:01:31.000000000 +0000 -+++ b/texk/web2c/uptexdir/kanji.h 2019-05-31 22:00:04.010964033 +0100 -@@ -38,8 +38,9 @@ - extern integer multilenbuffchar (integer c); - - extern void init_default_kanji (const_string file_str, const_string internal_str); -+extern void init_default_kanji_select (void); - /* for upTeX, e-upTeX, upBibTeX, upDVItype, upPLtoTF, and upTFtoPL */ --#define initkanji() init_default_kanji("utf8", "uptex") -+#define initkanji() init_default_kanji_select() - /* for upDVItype */ - #define setpriorfileenc() set_prior_file_enc() - -diff -Naur a/texk/web2c/uptexdir/tests/test_if.tex b/texk/web2c/uptexdir/tests/test_if.tex ---- a/texk/web2c/uptexdir/tests/test_if.tex 1970-01-01 01:00:00.000000000 +0100 -+++ b/texk/web2c/uptexdir/tests/test_if.tex 2019-05-31 22:00:04.010964033 +0100 -@@ -0,0 +1,29 @@ -+\kcatcode`あ=18 -+\def\xA{あ}\let\yA=あ -+\kcatcode`あ=17 -+\def\xB{あ}\let\yB=あ -+\kcatcode`あ=16 -+ -+\message{\ifcat あ\xA Y\else N\fi} -+\message{\ifcat あ\yA Y\else N\fi} -+\message{\ifcat あ\xB Y\else N\fi} -+\message{\ifcat あ\yB Y\else N\fi} -+ -+\message{\if あ\xA Y\else N\fi} -+\message{\if あ\yA Y\else N\fi} -+\message{\if い\xA Y\else N\fi} -+\message{\if い\yA Y\else N\fi} -+ -+\ifx\ucs\undefined\else -+ \kcatcode"100=16 -+ \message{upTeX} -+ \def\xA{Ā}% U+0100 -+ \def\xB{ā}% U+0101 -+ \message{\if \xA\relax Y\else N\fi} -+ \message{\if \xB\relax Y\else N\fi} -+ \message{\ifcat\xA\relax Y\else N\fi} -+ \message{\ifcat\xB\relax Y\else N\fi} -+\fi -+\end -+ -+ -diff -Naur a/texk/web2c/uptexdir/upbibtex.ch b/texk/web2c/uptexdir/upbibtex.ch ---- a/texk/web2c/uptexdir/upbibtex.ch 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/upbibtex.ch 2019-05-31 22:00:04.010964033 +0100 -@@ -3,7 +3,7 @@ - @d banner=='This is pBibTeX, Version 0.99d-j0.33' - @y - @d my_name=='upbibtex' --@d banner=='This is upBibTeX, Version 0.99d-j0.33-u1.24' -+@d banner=='This is upBibTeX, Version 0.99d-j0.33-u1.25' - @z - - @x -diff -Naur a/texk/web2c/uptexdir/updvitype.ch b/texk/web2c/uptexdir/updvitype.ch ---- a/texk/web2c/uptexdir/updvitype.ch 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/updvitype.ch 2019-05-31 22:00:04.010964033 +0100 -@@ -3,7 +3,7 @@ - @d banner=='This is pDVItype, Version 3.6-p0.4' - @y - @d my_name=='updvitype' --@d banner=='This is upDVItype, Version 3.6-p0.4-u1.24' -+@d banner=='This is upDVItype, Version 3.6-p0.4-u1.25' - @z - - @x procedure initialize -diff -Naur a/texk/web2c/uptexdir/uppltotf.ch b/texk/web2c/uptexdir/uppltotf.ch ---- a/texk/web2c/uptexdir/uppltotf.ch 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/uppltotf.ch 2019-05-31 22:00:04.010964033 +0100 -@@ -3,7 +3,7 @@ - @d banner=='This is pPLtoTF, Version 3.6-p2.0' - @y - @d my_name=='uppltotf' --@d banner=='This is upPLtoTF, Version 3.6-p2.0-u1.24' -+@d banner=='This is upPLtoTF, Version 3.6-p2.0-u1.25' - @z - - @x -diff -Naur a/texk/web2c/uptexdir/uptex-m.ch b/texk/web2c/uptexdir/uptex-m.ch ---- a/texk/web2c/uptexdir/uptex-m.ch 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/uptex-m.ch 2019-05-31 22:00:04.010964033 +0100 -@@ -1,4 +1,4 @@ --% This is a change file for upTeX u1.24 -+% This is a change file for upTeX u1.25 - % By Takuji Tanaka. - % - % (02/26/2007) TTK upTeX u0.01 -@@ -39,6 +39,8 @@ - % (2018-01-21) HK Added \uptexversion primitive and co. - % (2018-02-24) TTK upTeX u1.23 - % (2019-02-23) TTK upTeX u1.24 -+% (2019-05-06) HK Hironori Kitagawa fixed a bug in \if. -+% (2019-05-06) TTK upTeX u1.25 - - @x upTeX: banner - {printed when \pTeX\ starts} -@@ -46,8 +48,8 @@ - {printed when \pTeX\ starts} - @# - @d upTeX_version=1 --@d upTeX_revision==".24" --@d upTeX_version_string=='-u1.24' {current u\pTeX\ version} -+@d upTeX_revision==".25" -+@d upTeX_version_string=='-u1.25' {current u\pTeX\ version} - @# - @d upTeX_banner=='This is upTeX, Version 3.14159265',pTeX_version_string,upTeX_version_string - @d upTeX_banner_k==upTeX_banner -@@ -142,6 +144,7 @@ - @d max_quarterword=255 {largest allowable value in a |quarterword|} - @d min_halfword==-@"FFFFFFF {smallest allowable value in a |halfword|} - @d max_halfword==@"FFFFFFF {largest allowable value in a |halfword|} -+@d max_cjk_val=@"10000 - @y - @d min_quarterword=0 {smallest allowable value in a |quarterword|} - @d max_quarterword=@"FFFF {largest allowable value in a |quarterword|} -@@ -699,16 +702,24 @@ - - @x - if (cur_cmd=kanji)or(cur_cmd=kana)or(cur_cmd=other_kchar) then -+ begin n:=cur_chr; m:=kcat_code(kcatcodekey(n)); -+ end - @y - if (cur_cmd>=kanji)and(cur_cmd<=hangul) then -+ begin m:=cur_cmd; n:=cur_chr; -+ end - @z - - @x - get_x_token_or_active_char; - if (cur_cmd=kanji)or(cur_cmd=kana)or(cur_cmd=other_kchar) then -+ begin cur_cmd:=kcat_code(kcatcodekey(cur_chr)); -+ end - @y - get_x_token_or_active_char; - if (cur_cmd>=kanji)and(cur_cmd<=hangul) then -+ begin cur_cmd:=cur_cmd; -+ end {dummy} - @z - - @x -diff -Naur a/texk/web2c/uptexdir/uptex_version.h b/texk/web2c/uptexdir/uptex_version.h ---- a/texk/web2c/uptexdir/uptex_version.h 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/uptex_version.h 2019-05-31 22:00:04.010964033 +0100 -@@ -1 +1 @@ --#define UPTEX_VERSION "u1.24" -+#define UPTEX_VERSION "u1.25" -diff -Naur a/texk/web2c/uptexdir/uptftopl.ch b/texk/web2c/uptexdir/uptftopl.ch ---- a/texk/web2c/uptexdir/uptftopl.ch 2019-02-23 01:59:36.000000000 +0000 -+++ b/texk/web2c/uptexdir/uptftopl.ch 2019-05-31 22:00:04.010964033 +0100 -@@ -3,7 +3,7 @@ - @d banner=='This is pTFtoPL, Version 3.3-p2.0' - @y - @d my_name=='uptftopl' --@d banner=='This is upTFtoPL, Version 3.3-p2.0-u1.24' -+@d banner=='This is upTFtoPL, Version 3.3-p2.0-u1.25' - @z - - @x -diff -Naur a/texk/web2c/xetexdir/ChangeLog b/texk/web2c/xetexdir/ChangeLog ---- a/texk/web2c/xetexdir/ChangeLog 2019-01-02 22:41:45.000000000 +0000 -+++ b/texk/web2c/xetexdir/ChangeLog 2019-05-31 22:02:30.345042172 +0100 -@@ -1,3 +1,8 @@ -+2019-05-30 Khaled Hosny <dr.khaled.hosny@gmail.com> -+ -+ * XeTeXLayoutInterface.cpp: Do not use hb-icu if HarfBuzz -+ version is 2.5.0 or newer. -+ - 2019-01-03 Akira Kakuto <kakuto@fuk.kindai.ac.jp> - - * NEWS, xetex_version.h, xetex.web: Sync with the upstream. -diff -Naur a/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp b/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp ---- a/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp 2017-03-12 08:47:36.000000000 +0000 -+++ b/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp 2019-05-31 22:05:06.636170781 +0100 -@@ -2,7 +2,7 @@ - Part of the XeTeX typesetting system - Copyright (c) 1994-2008 by SIL International - Copyright (c) 2009-2012 by Jonathan Kew -- Copyright (c) 2012-2015 by Khaled Hosny -+ Copyright (c) 2012-2019 by Khaled Hosny - - SIL Author(s): Jonathan Kew - -@@ -39,8 +39,11 @@ - - #include <graphite2/Font.h> - #include <graphite2/Segment.h> -+#include <hb.h> - #include <hb-graphite2.h> -+#if !HB_VERSION_ATLEAST(2,5,0) - #include <hb-icu.h> -+#endif - #include <hb-ot.h> - - #include "XeTeX_web.h" -@@ -661,6 +664,7 @@ - free(engine->shaper); - } - -+#if !HB_VERSION_ATLEAST(2,5,0) - static unsigned int - _decompose_compat(hb_unicode_funcs_t* ufuncs, - hb_codepoint_t u, -@@ -677,8 +681,7 @@ - hb_unicode_funcs_set_decompose_compatibility_func(ufuncs, _decompose_compat, NULL, NULL); - return ufuncs; - } -- --static hb_unicode_funcs_t* hbUnicodeFuncs = NULL; -+#endif - - int - layoutChars(XeTeXLayoutEngine engine, uint16_t chars[], int32_t offset, int32_t count, int32_t max, -@@ -699,11 +702,15 @@ - - script = hb_ot_tag_to_script (engine->script); - -+ hb_buffer_reset(engine->hbBuffer); -+ -+#if !HB_VERSION_ATLEAST(2,5,0) -+ static hb_unicode_funcs_t* hbUnicodeFuncs = NULL; - if (hbUnicodeFuncs == NULL) - hbUnicodeFuncs = _get_unicode_funcs(); -- -- hb_buffer_reset(engine->hbBuffer); - hb_buffer_set_unicode_funcs(engine->hbBuffer, hbUnicodeFuncs); -+#endif -+ - hb_buffer_add_utf16(engine->hbBuffer, chars, max, offset, count); - hb_buffer_set_direction(engine->hbBuffer, direction); - hb_buffer_set_script(engine->hbBuffer, script); diff --git a/office/texlive/prep/texmf_get.sh b/office/texlive/prep/texmf_get.sh deleted file mode 100644 index e5494a26cd..0000000000 --- a/office/texlive/prep/texmf_get.sh +++ /dev/null @@ -1,1106 +0,0 @@ -#!/bin/bash - -# texmf_get.sh (c) 2016 - 2019 Johannes Schoepfer, Germany, slackbuilds[at]schoepfer[dot]info -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# V 15.0.3 -# -# Prepare xz-compressed tarballs of texlive-texmf-trees based on texlive.tlpdb -# This script takes care of dependencies(as far as these are present in texlive.tlpdb) -# of collections and packages, and that every texlive-package is included only once. -# The editions(base/extra/docs) should contain no binaries(exception biber) -# -base: the most usefull stuff, most binaries/scripts, -# manpages for compiled binaries 65mb 2017-11-07 -# -docs: -base documentation only, no manpages/GNU infofiles -# -extra: remaining stuff and corresponding docs -# -# texlive netarchive policy: Every package is included as dependency -# in exactly one collection. A package may have dependencies on other -# packages from any collection. - -# package source: http://mirror.ctan.org/systems/texlive/tlnet/archive/ - -#set -e -MAJORVERSION=2019 -mirror="http://mirror.ctan.org/systems/texlive/tlnet/" -TMP=$PWD/tmp - -# Globally excluded packages, which are/contain -# -useless without tlmgr-installer -# -non-linux -# -covered by an external package, e.g. asymptote on SBo -# -obsolete, e.g. omega -# -java dependend packages -# -binaries provided already by texlive.Slackbuild -# -binaries provided already other system packages, e.g. texlive-scripts.ARCH -# -only sources, or hyphen directives, e.g. metatype1, patch, ... -# -only hyphen directives, e.g. hyphen-farsi ... - -global_exclude=" - aleph - antomega - asymptote - bibtexu - cslatex - dviout.win32 - hyphen-arabic - hyphen-farsi - lambda - metatype1 - ocherokee - oinuit - omega - omegaware - otibet - patch - texlive-common - texlive-docindex - texlive-msg-translations - texlive-scripts - texlive.infra - texliveonfly - texosquery - texworks - tlcockpit - tlshell - wintools.win32 - dvisvgm - " - - # special packages, move their type1 fonts(if metafonts are present) - # and/or docs to -extra -special_packages=" - koma-script - velthuis - armtex - montex - vntex - pl - cc-pl - cs - musixtex-fonts - tipa - cbfonts - ptex-fonts - uptex-fonts - " -#Todo: split type1 fonts, or keep subset of type1 fonts in base -# cm-super - -# keep precompiled binaries, list binary, not package name -keep_precompiled=" - biber - " - -texmf_editions () { - - # "excludes from -base", also dependencies are excluded - PACKAGES=" - cm-super - biber - bib2gls - knitting - pgfornament - pgfplots - pst-cox - pst-poker - pst-vectorian - pst-geo - bclogo - $(grep ^"name .*biblatex" $db | cut -d' ' -f2 ) - " texmfget extra || exit 1 - - # packages/collections and their dependencies for -base - PACKAGES=" - $(cat $corepackages) - etoolbox - xcolor - memoir - velthuis - wasy - ptex - platex - revtex - uptex - uplatex - ucs - collection-basic - collection-latex - collection-metapost - collection-plaingeneric - collection-luatex - collection-context - collection-fontutils - collection-langczechslovak - collection-langeuropean - collection-langenglish - collection-langfrench - collection-langitalian - collection-langpolish - collection-langportuguese - collection-langspanish - collection-latexrecommended - $(collection_by_size fontsextra 70000 || exit 1) - $(collection_by_size publishers 10000 || exit 1) - " texmfget base - - # packages/collections and their dependencies for -extra - PACKAGES=" - amiri - arabi - arabi-add - arara - arev - bangorcsthesis - beamer2thesis - beamertheme-detlevcm - beamertheme-epyt - beamertheme-npbt - beamertheme-saintpetersburg - beebe - bhcexam - bxtexlogo - churchslavonic - collection-fontsextra - collection-langchinese - collection-langcjk - collection-langjapanese - collection-langkorean - collection-publishers - collection-texworks - collection-wintools - ctan-o-mat - ctanify - ctanupload - dad - duckuments - ethiop-t1 - fibeamer - fithesis - ghsystem - gregoriotex - hustthesis - ijsra - iwhdp - jpsj - kerkis - ketcindy - kpfonts - langsci - latex2nemeth - libertine - lilyglyphs - lni - luatexko - media9 - musuos - mwe - newtx - nwejm - padauk - pdfwin - pdfx - powerdot-tuliplab - powerdot-FUBerlin - quran - quran-de - realhats - resumecls - sanskrit-t1 - sapthesis - sduthesis - seuthesix - simurgh - skaknew - stellenbosch - suanpan - tudscr - uantwerpendocs - ucs - udesoftec - universalis - uowthesis - wasy2-ps - xduthesis - xetexko - xq - " texmfget extra || exit 1 - - # What's left, for base again - PACKAGES=" - collection-fontsrecommended - collection-xetex - collection-langcyrillic - collection-langarabic - collection-langgerman - collection-langgreek - collection-langother - collection-humanities - collection-mathscience - collection-pictures - collection-pstricks - collection-music - collection-games - collection-binextra - collection-bibtexextra - collection-formatsextra - collection-latexextra - " texmfget base || exit 1 - -} - -# ==== Nothing to edit beyond this line ==== - -usage () { - echo - echo "Generate texmf trees/editions based on collections/packages" - echo "and their (hard)dependencies." - echo "./texmf_get.sh [base|docs|extra|lint]" - echo - echo "-base: texfiles, no docs" - echo "-docs: docs of -base" - echo "-extra: remaining texfiles and docs" - echo "[lint]: compare filename contents of all generated editions," - echo " to detect overlapping files" - echo - echo "Only new/updated/missing tex packages are downloaded." - echo "The first run takes \"long\", tex packages(about 2500Mb)" - echo "need to be downloaded." - echo "To check out a new version/release, delete" - echo "$db" - echo "A new ascii index file/database(texlive.tlpdb) is will be" - echo "pulled on the next run, and a new version yymmdd will be set." - echo - echo "All generated tarballs, logs etc. are going to" - echo "$TMP" - echo -} - -collection_by_size () { - # from collection $1, pull packages smaller $2 bytes - start_n="$(grep -n ^"name collection-$1"$ $db | cut -d':' -f1)" - # find end of package/collection - for emptyline in $emptylines - do - if [ "$emptyline" -gt "$start_n" ] - then - end_n=$emptyline - break - fi - done - extrapackages="$(sed "${start_n},${end_n}!d" $db | grep ^"depend " | grep -v ^"depend collection" | sed "s/^depend//g" )" - - # add if smaller than ... - for checksize in $extrapackages - do - package_meta $checksize || exit 1 - size=$(grep ^"containersize " $texmf/$checksize.meta | cut -d' ' -f2) - # for $2, e.g. 3000 means 3kb - [ $size -lt $2 ] && echo $checksize - done -} - -package_meta () { - if [ ! -s "$texmf/$1.meta" ] - then - # collection start linenumer - start_n="$(grep -n ^"name ${1}"$ $db | cut -d':' -f1)" - [ -z "$start_n" ] && echo "$1 was not found in $db, bye." && exit 1 - # find end of package/collection - for emptyline in $emptylines - do - if [ "$emptyline" -gt "$start_n" ] - then - end_n=$emptyline - break - fi - done - # Don't handle collections as dependency of other collections - sed "${start_n},${end_n}!d;/^depend collection/d" $db > $texmf/$1.meta - fi -} - -download () { - # Download packages, if not already available. Not every packages has a corresponding .doc package. - # Try three times if package isn't present, with -t1 to get another mirror the second time - cd $texmf - if [ ! -s "${1}${flavour}.tar.xz" ] - then - for run in {1..10} - do - wget -q --show-progress -t1 -c ${mirror}archive/${1}${flavour}.tar.xz - [ -s "${1}${flavour}.tar.xz" ] && break - done - fi - # If no success by downloading, write error log - [ ! -s ${1}${flavour}.tar.xz ] && echo "Downloading ${1}${flavour}.tar.xz did not work, writing to $errorlog" && echo "$VERSION" >> $errorlog && echo "Error downloading ${1}${flavour}.tar.xz" >> $errorlog && exit 1 - - # check sha512, give three tries for downloading again(diffrent mirrors are used automatically) - if [ "$flavour" = ".doc" ] - then - sha512="$(grep ^doccontainerchecksum $texmf/$1.meta | cut -d' ' -f2 )" - else - sha512="$(grep ^containerchecksum $texmf/$1.meta | cut -d' ' -f2 )" - fi - - for run in {1..10} - do - if [ "$(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 )" != "$sha512" ] - then - # Download (hopefully) newer file - rm ${1}${flavour}.tar.xz - wget -q --show-progress -t1 -c ${mirror}archive/${1}${flavour}.tar.xz - else - break - fi - done - # check sha512 again, exit if it fails - if [ "$(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 )" != "$sha512" ] - then - echo "sha512sum $(sha512sum ${1}${flavour}.tar.xz | cut -d' ' -f1 ) of" - echo "${package}${flavour}.tar.xz doesn't match with $db" - # delete metafile on failure to get generated again on next run, where new $db may be in use - rm $texmf/$1.meta - echo "sha512sum $sha512" - echo "Delete ${db}* to be current again, and try again." - exit 1 - fi -} - -untar () { - # leave if $1 has no content - if [ -s "$1" ] - then - while read package - do - echo "untar $package" - # untar all packages, check for relocation, "relocate 1" -> untar in texmf-dist - download $package || exit 1 - # untar package, relocate to texmf-dist if necessary, binary packages always need relocation - relocated='.' - [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" -o -n "$(grep ^"binfiles " $texmf/$package.meta)" ] && relocated="texmf-dist" - # if not .doc package, investigate files for dependencies/provides - if [ -n "$flavour" ] - then - tar xf ${package}${flavour}.tar.xz --exclude tlpkg -C $relocated || exit 1 - else - tar vxf ${package}${flavour}.tar.xz --exclude tlpkg -C $relocated | grep -E '\.sty$|\.bbx$|\.cls$' > $texmf/$package.deps - if [ -n "$texmf/$package.deps" ] - then - unset provide - unset depends - for depfile in $(cat $texmf/$package.deps) - do - filename="$( echo $depfile | rev | cut -d'.' -f2- | cut -d'/' -f1 | rev)" - # always add $filename as "ProvidesPackage", if it's a .sty - echo $depfile | grep '\.sty'$ &>/dev/null - [ $? = 0 ] && provide+="${filename}," - # remove comments, if there are backslashes ignore that content, except it is \filename - #provide+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -n "s/.*\\\ProvidesPackage{\([^}]*\)}.*/\1/p" | sed "s/\\\filename/$filename/g;/\\\/d" | sort -u | tr '\n' ',')" - #sed -z "s/.*\\\Provides\(Package\|ExplPackage\|File\|Class\)*.\n//g" | sed "s/[[:space:]]// - #provide+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -z "s/.*\\\Provides\(Package\|ExplPackage\|File\|Class\)*.\n//g" | sed "s/[[:space:]]// | sed -n "s/.*\\\Provides\(Package\|ExplPackage\|File\|Class\){\([^}]*\)}.*/\2/p" | sed "s/\\\filename/$filename/g;s/\\\ExplFileName/$filename/g;/\\\/d" | sed "s/\(\.sty$\|\.cls$\)//g" | sort -u | tr '\n' ',')" - provide+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -z "s/\(Package\|ExplPackage\|File\|Class\)\n/\1/g" | sed "s/[[:space:]]//" | sed -n "s/.*\\\Provides\(Package\|ExplPackage\|File\|Class\){\([^}]*\)}.*/\2/p" | sed "s/\\\filename/$filename/g;s/\\\ExplFileName/$filename/g" | sed "s/\(\.sty$\|\.cls$\)//g" | sort -u | tr '\n' ',')" - #depends+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -n "s/.*\(\\\require\|\\\use\)package{\([^}]*\)}.*/\2/p" | sed "/\\\/d" | sort -u | tr '\n' ',')" - depends+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -n "s/.*\(\\\require\|\\\use\)package{\([^}]*\)}.*/\2/p" | sort -u | tr '\n' ',')" - #depends+="$(sed "s/%.*//g" $texmf/$relocated/$depfile | sed -n "s/.*\\\\(require\|use\)package{\([^}]*\)}.*/\2/p" | sed "/\\\/d" | sort -u | tr '\n' ',')" - done - if [ -n "$provide" ] - then - echo "$package $provide" >> $TMP/provides.run.$edition - fi - if [ -n "$depends" ] - then - echo "$package $depends" >> $TMP/depends.run.$edition - fi - fi - fi - - # Delete binaries, these are provided - # by texlive.Slackbuild, keep symlinks and scripts - - for arch in $platforms - do - if [ -d $texmf/texmf-dist/bin/$arch ] - then - [ ! -d $texmf/texmf-dist/linked_scripts ] \ - && mkdir $texmf/texmf-dist/linked_scripts - # rewrite link target to fit systemwide installation - for link in $(find $texmf/texmf-dist/bin/$arch -type l) - do - ln -sf $(readlink $link | sed "s/^..\/..\(.*\)/..\/share\1/" ) $link || exit 1 - done - # move symlinks to linked_scripts - find $texmf/texmf-dist/bin/$arch -type l -exec mv '{}' $texmf/texmf-dist/linked_scripts/ \; - - # keep only binaries of special packages - # remove xindy.mem(gzip compresses data) to prevent overwriting - for bin in $(find $texmf/texmf-dist/bin/$arch -type f -exec file '{}' + | \ - grep -e "executable" -e "shared object" -e "gzip compressed data" | \ - grep -e ELF -e "gzip compressed data" | cut -f 1 -d : ) - do - for binary in $keep_precompiled - do - if [ "$(echo $bin | rev | cut -d'/' -f1 | rev)" != "$binary" ] - then - rm $bin - echo $bin | rev | cut -d'/' -f1 | rev >> $binary_removed.$edition - fi - done - done - # move scripts to linked-scripts - scripts="$(find $texmf/texmf-dist/bin/$arch -type f -exec file '{}' + | grep -wv ELF | cut -f 1 -d : )" - for script in $scripts - do - mv $script $texmf/texmf-dist/linked_scripts/ - done - fi - done - - if [ "$flavour" = ".doc" ] - then - size=$(grep ^doccontainersize $texmf/$package.meta | cut -d' ' -f2) - else - size=$(grep ^containersize $texmf/$package.meta | cut -d' ' -f2) - # add maps to updmap.cfg, don't add special_packages map files to -base - add_map=yes - if [ $edition = base ] - then - for no_map in $special_packages - do - [ $no_map = $package ] && add_map=no && break - done - fi - [ $add_map = yes ] && grep ^'execute ' $texmf/$package.meta | grep Map | cut -d' ' -f2- | sed "s/^add//g" >> $updmap.$edition - fi - shortdesc="$(grep ^shortdesc $texmf/$package.meta | cut -d' ' -f2- )" - echo "$size byte, $package$flavour: $shortdesc" >> $output.meta - # make index of uncompressed size of each package - echo "$(xz -l --verbose ${package}${flavour}.tar.xz | grep "Uncompressed size" | \ - cut -d'(' -f2 | cut -d' ' -f1 ) byte, $package$flavour: $shortdesc" >> $output.meta.uncompressed - done < $1 - - # copy packages index to texmf-dist, so included packages are known in later installation - # don't list binary packages, as the binaries itself are not contained, only the symlinks. - cat $output.meta | grep -v '\-linux:' >> $output.$edition.meta - cat $output.meta.uncompressed | grep -v '\-linux:' >> $output.$edition.meta.uncompressed - - # cleanup - [ -f $output.meta ] && rm $output.meta - [ -f $output.meta.uncompressed ] && rm $output.meta.uncompressed - fi -} - -remove_cruft () { - # Remove m$-stuff, ConTeXt single-user-system stuff, source leftovers and pdf-versions of manpages - rm -rf texmf-dist/source - rm -rf texmf-dist/scripts/context/stubs/source/ - find texmf-dist/ -type d -name 'win32' -exec rm -rf {} + - find texmf-dist/ -type d -name 'win64' -exec rm -rf {} + - find texmf-dist/ -type d -name 'mswin' -exec rm -rf {} + - find texmf-dist/ -type d -name 'win' -exec rm -rf {} + - find texmf-dist/ -type d -name 'setup' -exec rm -rf {} + - find texmf-dist/ -type d -name 'install' -exec rm -rf {} + - find texmf-dist/ -type f -name 'uninstall*.sh' -delete - find texmf-dist/ -type f -name '*.bat' -delete - find texmf-dist/ -type f -name '*.bat.w95' -delete - find texmf-dist/ -type f -name '*win32*' -delete - find texmf-dist/ -type f -name 'winansi*' -delete - find texmf-dist/ -type f -name '*man1.pdf' -delete - find texmf-dist/ -type f -name '*man5.pdf' -delete - # Remove zero-length files, as these appear e.g. in hyph-utf8 tex-package. - # find texmf-dist/ -type f -size 0c -delete - find texmf-dist/ -type f -empty -delete - # Remove empty directories recursively - find texmf-dist/ -type d -empty -delete -} - -texmfget () { - # make sure no package is added more than once. - echo "Preparing index of packages to be added to -${1} ..." - echo "$PACKAGES" | sed "s/[[:space:]]//g;/^$/d" > $collections_tobedone - # Remove outputfile if already present - >$output - >$output_doc - - # Only do something if $collection wasn't already done before - while [ -s $collections_tobedone ] - do - collection=$(tail -n1 $collections_tobedone) - - # continue with next collection if collection was already done - if [ -s "$collections_done" ] - then - grep -w "^${collection}$" $collections_done &> /dev/null - if [ $? = 0 ] - then - # remove from $collections_tobedone - sed -i "/^$collection$/d" $collections_tobedone - if [ -n "$(grep "^${collection} added to" $logfile)" ] - then - echo "$collection already added " >> $logfile - fi - continue - fi - fi - - package_meta $collection || exit 1 - - # If $collection is a singel package(not a collection-), add it here - if [ -n "$(head -n1 $texmf/$collection.meta | grep -v "name collection" )" ] - then - addpackage=no - # if package contains docs, add to docpackages - if [ -n "$(grep ^docfiles $texmf/$collection.meta)" ] - then - echo "$collection" >> $output_doc - echo "$collection added to docs $1" >> $logfile - addpackage=yes - fi - if [ -n "$(grep ^runfiles $texmf/$collection.meta)" -o -n "$(grep ^binfiles $texmf/$collection.meta)" ] - then - echo "$collection" >> $output - echo "$collection added to -$1" >> $logfile - addpackage=yes - fi - # every package should be added to one dedicated edition, abort if that didn't work - if [ $addpackage = no ] - then - echo "$collection doesn't contain any docfiles/runfiles/binfiles" - echo "Please exclude package/report to upstream mailinglist tex-live@tug.org, bye." - exit 1 - fi - fi - - # Don't handle collections as dependency of other collections, as this destroys control over what packages to be added - # add dependend packages, but no binary(ARCH) and no packages conataining a '.'. Packges with dot indicate binary/texlive-manager/windows packages - - grep ^"depend " $texmf/$collection.meta | cut -d' ' -f2- > $dependencies - - if [ -s "$dependencies" ] - then - # check for .ARCH packages which may be binaries, scripts or links - # Binaries should all come from the sourcebuild(exception biber) - for dependency in $(cat $dependencies) - do - echo $dependency | grep '\.ARCH'$ &>/dev/null - if [ $? = 0 ] - then - for arch in $platforms - do - archpackage="$(echo $dependency | sed "s/\.ARCH$/\.$arch/")" - grep ^"name $archpackage"$ $db &>/dev/null && echo "$archpackage" >> $dependencies.verified_arch - done - else - echo $dependency >> $dependencies.verified_arch - fi - done - if [ -f $dependencies.verified_arch ] - then - mv $dependencies.verified_arch $dependencies - else - rm $dependencies - fi - fi - - if [ -s "$dependencies" ] - then - echo "----------------" >> $logfile - echo "Dependencies of $collection: $(cat $dependencies | tr '\n' ' ')" >> $logfile - for dependency in $(cat $dependencies) - do - if [ -n "$(grep ^"${dependency}"$ $collections_done)" ] - then - sed -i "/^${dependency}$/d" $dependencies - continue - else - for exclude in $global_exclude - do - if [ "$exclude" = "$dependency" ] - then - sed -i "/^${exclude}$/d" $dependencies - echo "$exclude excluded, see \$global_exclude" >> $logfile - fi - done - fi - done - cat $dependencies >> $collections_tobedone - echo "----------------" >> $logfile - fi - - sed -i "/^${collection}$/d" $collections_tobedone - echo "$collection" >> $collections_done - done - # handle package index list per edition - cat $output >> $TMP/packages.$1 - # handle doc package index, one for each edition - cat $output_doc >> $TMP/packages.$1.doc - - # untar only one $edition, untar docs together with -extra edition - if [ "$1" = $edition -o docs = $edition ] - then - cd $texmf - # Cleanup tar-directory - [ -d $texmf/texmf-dist ] && rm -rf $texmf/texmf-dist - mkdir $texmf/texmf-dist - - # Make tarball/checksum reproducible by setting mtime(clamp-mtime), owner, group and sort content - # --clamp-mtime --mtime doesn't work with tar 1.13, when makepkg creates the tarball: - # tar-1.13: time_t value 9223372036854775808 too large (max=68719476735) - echo "Adding files to $( echo $tarball | rev | cut -d'/' -f1 | rev ) ..." - case $edition in - base) - unset flavour - untar $output || exit 1 - remove_cruft || exit 1 - tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 - rm -rf texmf-dist - ;; - extra) - unset flavour - untar $output || exit 1 - export flavour=".doc" - untar $output_doc || exit 1 - remove_cruft || exit 1 - #tar vrf $tarball --clamp-mtime --mtime --owner=0 --group=0 --sort=name texmf-dist || exit 1 - tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 - rm -rf texmf-dist - ;; - docs) - export flavour=".doc" - # only add -base docs to -docs - if [ $1 = base ] - then - untar $output_doc || exit 1 - remove_cruft || exit 1 - #tar vrf $tarball --clamp-mtime --mtime --owner=0 --group=0 --sort=name texmf-dist || exit 1 - tar rf $tarball --owner=0 --group=0 --sort=name texmf-dist || exit 1 - rm -rf texmf-dist - fi - ;; - esac - fi -} - -lint () { - -echo "Comparing content of all editions, this may take a while ..." -cd $TMP -# check if all editions of same VERSION are there, take -base as reference -lint_version=$( ls texlive-base-*tar.xz | head -n1 | cut -d'.' -f2 || exit 1) -if [ -s texlive-extra-$MAJORVERSION.$lint_version.tar.xz \ - -a -s texlive-docs-$MAJORVERSION.$lint_version.tar.xz ] -then - for edition in base extra docs - do - echo "Extracting index of texlive-${edition}-$MAJORVERSION.$lint_version.tar.xz ..." - # don't list directories - tar tf texlive-${edition}-$MAJORVERSION.$lint_version.tar.xz | grep -v '/'$ > $TMP/packages.$edition.lint - done - - # compare content - for edition in base extra docs - do - >$TMP/packages.$edition.lint.dup - if [ $edition = base ] - then - echo "check if files of base are present in another edition" - while read line - do - grep ^"$line"$ $TMP/packages.extra.lint >> $TMP/packages.base.lint.dup - grep ^"$line"$ $TMP/packages.docs.lint >> $TMP/packages.base.lint.dup - done < $TMP/packages.$edition.lint - fi - done -else - echo "Not all editions are present to lint them. Create them first by" - echo "$0 [base|docs|extra]" - echo "bye." - exit 1 -fi - -exit 0 - -} - -# Main - -LANG=C -output=$TMP/packages -output_doc=$TMP/packages.doc.tmp -errorlog=$TMP/error.log -texmf=$TMP/texmf -db=$TMP/texlive.tlpdb -tmpfile=$TMP/tmpfile -collections_done=$TMP/done -collections_tobedone=$TMP/tobedone -corepackages=$TMP/corepackages -allcollections=$TMP/allcollections -binary_removed=$TMP/binaries.removed -manpages=$TMP/manpages -dependencies=$TMP/deps -packages_base=$TMP/packages.base -packages_extra=$TMP/packages.extra -packages_manpages=$TMP/packages.manpages -updmap=$TMP/updmap.cfg -files_split=$TMP/files.split -platforms="x86_64-linux i386-linux" - -mkdir -p $texmf -cd $TMP - -case "$1" in - base|docs|extra) edition=$1;; - lint) lint ;; - *) usage; exit 0 ;; -esac - -echo "Building $edition tarball ..." - -# Set VERSION, get texlive.tlpdb and keep unshorten $db.orig -if [ ! -s ${db}.orig -o ! -s $db -o ! -s VERSION ] -then - echo $MAJORVERSION.$(date +%y%m%d) > VERSION - wget -q --show-progress -c -O ${db}.orig ${mirror}tlpkg/texlive.tlpdb - # remove most content from $db to be faster on later processing. - # keep dependencies/manpages/binfiles/shortdesc/sizes - grep -E \ - '^\S|^ RELOC/doc/man|^ texmf-dist/doc/man/man|^ RELOC/doc/info/|^ texmf-dist/doc/info/|^ bin|^$' \ - ${db}.orig | grep -v ^longdesc > $db - - # As $db might be renewed, remove the meta-files to be created again - rm -rf $texmf/*.meta -fi - -# Get linenumbers of empty lines from $db -emptylines="$(grep -n ^$ $db | cut -d':' -f1)" - -# Provide TLCore packages for -base, as these packages(and their dependencies) should be present in any case. -grep -B1 ^'category TLCore' $db | grep -v ^'category TLCore' | grep -v ^-- | grep -v '\.' | cut -d' ' -f2 > $corepackages - -# Make a list of all collections -grep ^"name collection-" $db | cut -d' ' -f2 > $allcollections - -# translate .ARCH to platforms in excludes, to make .ARCH packages excludeable by $global_exclude -for exclude in $global_exclude -do - if [ -n "$(echo $exclude | grep '\.ARCH'$ )" ] - then - for arch in $platforms - do - global_exclude+=" $(echo $exclude | sed "s/\.ARCH$/\.$arch/")" - done - global_exclude=${global_exclude/$exclude/} - fi -done -# globally exclude from $corepackages -for exclude in $global_exclude -do - sed -i "/^${exclude}$/d" $corepackages -done - -VERSION=$(cat $TMP/VERSION) -tarball=$TMP/texlive-$edition-$VERSION.tar -# set logfile -logfile=$TMP/$VERSION.log - -# reset some files ->$logfile ->$tarball ->$collections_done ->$files_split ->$manpages ->$packages_manpages ->$updmap.$edition ->$packages_base ->$packages_extra ->$packages_base.doc ->$packages_extra.doc ->$TMP/packages.$edition.meta ->$TMP/packages.$edition.meta.uncompressed ->$TMP/provides.run.$edition ->$TMP/depends.run.$edition ->$binary_removed.$edition - -# put the editions base/extra together -texmf_editions || exit 1 - -# Check if all collections are part in at least one edition -while read collection -do - grep -w "$collection" $collections_done &> /dev/null - if [ $? != 0 ] - then - echo "Error: $collection was not handled." - echo "Edit packages/collections in the texmfget function." | tee -a $logfile - exit 1 - fi -done < $allcollections - -# cleanup -rm $allcollections -rm $corepackages -rm $collections_done -rm $collections_tobedone -rm $output -rm $output_doc -rm $dependencies - -# untar special- and manpage packages to be splitted/moved to other editions -# splitting special packages, files index -echo "Prepare index of to be splitted/moved files from -base" -[ ! -d texmf-dist ] && mkdir texmf-dist -for package in $special_packages -do - echo "Splitting $package" - # special packages have to be in -base, as only here are special - # tasks done to reduce size of -base edition - if [ -z "$( grep ^"$package"$ $packages_base )" ] - then - echo "$package was not found to be part of -base" - echo "Edit \$special_packages in $0," - echo "it should contain only packages from -base, bye." - exit 1 - fi - unset relocated - pathprefix="texmf-dist/" - [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" ] && \ - relocated="-C texmf-dist" && unset pathprefix - # avoid big pdf docs which are also present as html - # move (big)type1 fonts to -extra - # $files_split lists files to be moved from -base to -extra - if [ $package = "cm-super" ] - then - # cm-super minimal for -base, create index of extended cm-super - tar tf $texmf/$package.tar.xz | sed \ - "/1000\.pfb$/d;/^tlpkg/d;/\.sty$/d;/\.enc$/d;/\.GS$/d" \ - | tee -a $files_split > $files_split.tmp - else - tar tf $texmf/${package}.tar.xz | sed \ - -ne "/.*doc\/latex\/.*\.pdf$/p" \ - -ne "/.*fonts\/map\/.*\.map$/p" \ - -ne "/.*fonts\/enc\/.*\.enc$/p" \ - -ne "/.*fonts\/afm\/.*\.\(afm\|afm\.gz\)$/p" \ - -ne "/.*fonts\/type1\/.*\.pfb$/p" \ - -ne "/.*fonts\/vf\/.*\.vf$/p" \ - | tee -a $files_split > $files_split.tmp - fi - - if [ $edition = base ] - then - # Calculate package-minimal size, uncompressed and compressed - mkdir -p calculate/texmf-dist - tar xf $texmf/$package.tar.xz -C calculate/texmf-dist --exclude-from=$files_split.tmp - tar cf calculate/calc.tar.xz -I 'xz -9' calculate/texmf-dist - size_minimal=$(du -bc calculate/calc.tar.xz | tail -n1 | sed "s/[[:space:]].*//") - size_minimal_uncompressed="$(xz -l --verbose calculate/calc.tar.xz | grep "Uncompressed size" | cut -d'(' -f2 | cut -d' ' -f1 )" - sed -i \ - -e "s/^[0-9]* byte, $package: /$size_minimal byte, $package-minimal: /" \ - $output.base.meta - sed -i \ - -e "s/^[0-9]* byte, $package: /$size_minimal_uncompressed byte, $package-minimal: /" \ - $output.base.meta.uncompressed - rm -rf calculate - fi - - if [ $edition = extra ] - then - mkdir -p calculate/texmf-dist - tar xf $texmf/${package}.tar.xz -C calculate/texmf-dist $(paste $files_split.tmp) - tar cf calculate/calc.tar.xz -I 'xz -9' calculate/texmf-dist - size_extended=$(du -bc calculate/calc.tar.xz | tail -n1 | sed "s/[[:space:]].*//") - size_extended_uncompressed="$(xz -l --verbose calculate/calc.tar.xz | \ - grep "Uncompressed size" | cut -d'(' -f2 | cut -d' ' -f1 )" - - # put new sizes in package index uncompressed - sed -i \ - -e "s/^[0-9]* byte, $package: /$size_extended byte, $package-extended: /" \ - $output.extra.meta - sed -i \ - -e "s/^[0-9]* byte, $package: /$size_extended_uncompressed byte, $package-extended: /" \ - $output.extra.meta.uncompressed - rm -rf calculate - - # put map files from splitted packages in -extra - mkdir meta_tmp - tar xf $texmf/${package}.tar.xz -C meta_tmp tlpkg/tlpobj/$package.tlpobj - grep ^'execute ' meta_tmp/tlpkg/tlpobj/$package.tlpobj | grep Map | cut -d' ' -f2- | sed "s/^add//g" >> $updmap.$edition - rm -rf meta_tmp - fi - - # untar to provide files for -extra - tar xf $texmf/${package}.tar.xz $relocated $(paste $files_split.tmp) - if [ $package = "cm-super" ] - then - # create cm-super- minimal config/maps with 10pt glyphs only - sed "s/cm-super/cm-super-minimal/g" $texmf/texmf-dist/dvips/cm-super/config.cm-super \ - > $texmf/texmf-dist/dvips/cm-super/config-minimal.cm-super - for map in t1 t2a t2b t2c ts1 x2 - do - grep 1000 $texmf/texmf-dist/fonts/map/dvips/cm-super/cm-super-$map.map \ - > $texmf/texmf-dist/fonts/map/dvips/cm-super/cm-super-minimal-$map.map - sed -i "/.*1000\.pfb/d" $texmf/texmf-dist/fonts/map/dvips/cm-super/cm-super-$map.map - done - fi -done - -# cleanup -rm $files_split.tmp -# fix relocation in index for splitted packages -sed -i \ - -e "s|^doc|texmf-dist\/doc|g" \ - -e "s|^fonts|texmf-dist\/fonts|g" \ - -e "s|^dvips|texmf-dist\/dvips|g" \ - $files_split - -# sort meta data about added packages -sort -n $output.$edition.meta > $tmpfile -mv $tmpfile $output.$edition.meta -sort -n $output.$edition.meta.uncompressed > $tmpfile -mv $tmpfile $output.$edition.meta.uncompressed - -sort -u $binary_removed.$edition > $tmpfile -mv $tmpfile $binary_removed.$edition - -# include manpages/GNU infofiles in -base, write index for later exclusion from other editions. -# In -extra/-docs there should not be any manpage left. -echo "Looking for manpages/GNU infofiles to be included in -base ..." -for package in $(paste -s $packages_base.doc | sort -u) -do - if [ -n "$(grep -E "(doc/man/man|doc/info/)" $texmf/$package.meta )" ] - then - echo "Adding manpage from $package.doc to -base" - flavour=".doc" download $package || exit 1 - unset relocated - pathprefix="texmf-dist/" - [ -n "$(grep -w ^"relocated 1" $texmf/$package.meta)" ] \ - && relocated="-C texmf-dist" && unset pathprefix - tar tf $texmf/${package}.doc.tar.xz | sed \ - -ne "/.*doc\/man\/.*\.1$/p" \ - -ne "/.*doc\/man\/.*\.5$/p" \ - -ne "/.*doc\/info\/.*\.info$/p" \ - | tee -a $manpages > $manpages.tmp - # untar to provide files for -/extra/-docs - tar xf $texmf/${package}.doc.tar.xz $relocated $(paste $manpages.tmp) - echo "$package" >> $packages_manpages - fi -done -# cleanup -rm $manpages.tmp -sed -i \ - -e "s/^doc/texmf-dist\/doc/g" \ - $manpages - -case $edition in - base) - # Content info - cat << EOF | gzip -9 >> $texmf/texmf-dist/packages.$edition.gz -Content of -$edition: -$(sed "/-linux$/d" $packages_base | sort) -EOF - # create texdoc cache file - if [ $(command -v texdoc) ] - then - mkdir -p texmf-dist/scripts/texdoc || exit 1 - TEXMFVAR=$texmf/texmf-dist \ - texdoc -c texlive_tlpdb=$TMP/texlive.tlpdb.orig \ - -DlM texlive-en >/dev/null 2>&1 - mv texmf-dist/texdoc/cache-tlpdb.lua \ - texmf-dist/scripts/texdoc/Data.tlpdb.lua || exit 1 - # add cache to tarball - tar rf $tarball --owner=0 --group=0 --sort=name \ - texmf-dist/scripts/texdoc/Data.tlpdb.lua || exit 1 - else - echo "WARNING: texdoc binary(comming with texlive) is not installed, the texdoc cache" - echo "Data.tlpdb.lua can't be created and wont't be available." - echo "Texdoc will not wotk without this." - echo "" - echo "Continue with any key or abort with ctrl-c" - read -n1 - fi - - # prepare updmap.cfg - tar xf $tarball texmf-dist/web2c/updmap.cfg - end_n="$(grep -n 'end of updmap-hdr' texmf-dist/web2c/updmap.cfg | cut -d':' -f1)" - - sed "1,${end_n}!d" texmf-dist/web2c/updmap.cfg > $TMP/updmap.cfg.tmp - cat $updmap.$edition >> $TMP/updmap.cfg.tmp - mv $TMP/updmap.cfg.tmp texmf-dist/web2c/updmap.cfg - tar f $tarball --delete texmf-dist/web2c/updmap.cfg - tar rf $tarball --owner=0 --group=0 --sort=name \ - texmf-dist/web2c/updmap.cfg - -# add manpages/GNU infofiles to the tarball - tar rf $tarball --owner=0 --group=0 --sort=name \ - texmf-dist/doc/man/ texmf-dist/doc/info/ \ - texmf-dist/packages.$edition.gz \ - || exit 1 -# # add cm-super minimal maps/config -# tar rf $tarball --owner=0 --group=0 --sort=name \ -# texmf-dist/dvips/cm-super/config-minimal.cm-super \ -# --wildcards texmf-dist/fonts/map/dvips/cm-super/cm-super-minimal-*.map \ -# || exit 1 - echo "Removing files -from base, splitted from special packages to be included in -extra" - tar f $tarball --delete $(paste $files_split) || exit 1 - ;; - extra) - echo "Removing manpages from $edition which now reside in -base" - tar f $tarball --delete $(paste $manpages) 2>/dev/null - # content info - echo "Content of -$edition, including documentation:" > $texmf/texmf-dist/packages.$edition - sed "/-linux$/d" $TMP/packages.$edition | sort >> $texmf/texmf-dist/packages.$edition - gzip -9 $texmf/texmf-dist/packages.$edition -# # remove cm-super minimal config, which resides in -base -# rm \ -# $texmf/texmf-dist/dvips/cm-super/config-minimal.cm-super \ -# $texmf/texmf-dist/fonts/map/dvips/cm-super/cm-super-minimal-*.map - - # add -extra updmap.cfg - mkdir -p $texmf/texmf-dist/web2c - mv $updmap.$edition $texmf/texmf-dist/web2c - tar rf $tarball --owner=0 --group=0 --sort=name \ - --exclude texmf-dist/doc \ - texmf-dist \ - || exit 1 - ;; - docs) - # add docs splittet from base from special packages, add packages index - # content info, this edition contains all docs from -base - echo "Content of -$edition, documentation for -base:" > $texmf/texmf-dist/packages.$edition - sort $packages_base.doc >> $texmf/texmf-dist/packages.$edition - gzip -9 $texmf/texmf-dist/packages.$edition - tar rf $tarball --owner=0 --group=0 --sort=name \ - texmf-dist/doc/ \ - texmf-dist/packages.$edition.gz \ - || exit 1 - echo "Removing manpages from $edition which now reside in -base" - tar f $tarball --delete $(paste $manpages) || exit 1 - ;; -esac - -rm -rf texmf-dist -[ -f $updmap.$edition ] && rm $updmap.$edition - -# compress the tarball as everything is in place now -echo "Compressing $tarball ..." -[ -f $tarball.xz ] && rm $tarball.xz -xz -9 -T0 $tarball || exit 1 -md5sum $tarball.xz -ls -lh $tarball.xz -echo "Logfile: $logfile" diff --git a/office/texlive/slack-desc b/office/texlive/slack-desc deleted file mode 100644 index 4e573a1608..0000000000 --- a/office/texlive/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -texlive: texlive (TeX binaries, support files, and formats) -texlive: -texlive: This package contains binaries, support files, TeX formats and -texlive: packages,and other files included in the TeXLive TeX distribution. -texlive: Included are input files for TeX, runtime configuration files, -texlive: hyphenation tables, manpages, and the computer modern fonts. -texlive: -texlive: SlackBuilds.org has more texmf files and documentation in the -texlive: texlive-extra and texlive-docs packages. -texlive: -texlive: diff --git a/office/texlive/texlive.SlackBuild b/office/texlive/texlive.SlackBuild deleted file mode 100644 index a29afb9ab1..0000000000 --- a/office/texlive/texlive.SlackBuild +++ /dev/null @@ -1,249 +0,0 @@ -#!/bin/sh - -# TeXLive build script for Slackware - -# Copyright 2009, 2017 - 2019 Patrick J. Volkerding, Sebeka, MN, USA -# Copyright 2009 - 2014 Robby Workman, Northport, AL, USA -# Copyright 2016 - 2017 Johannes Schoepfer, Germany -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# URL: ftp://tug.org/historic/systems/texlive/ -# Testrelease: ftp://tug.org/texlive/Images/test/ -# Upstream stable fixes: svn://tug.org/texlive/branches/branch2019/Build/source - -PRGNAM=texlive -SOURCEVERSION=20190410 -VERSION=${VERSION:-2019.190626} -BUILD=${BUILD:-2} -TAG=${TAG:-_SBo} - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-texlive -OUTPUT=${OUTPUT:-/tmp} - -set -e - -if [ -z "$ARCH" ]; then - case "$( uname -m )" in - i?86) ARCH=i586 ;; - arm*) ARCH=arm ;; - *) ARCH=$( uname -m ) ;; - esac -fi - -if [ "$ARCH" = "i586" ]; then - SLKCFLAGS="-O2 -march=i586 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "x86_64" ]; then - SLKCFLAGS="-O2 -fPIC" - LIBDIRSUFFIX="64" -else - SLKCFLAGS="-O2" - LIBDIRSUFFIX="" -fi - -# NOTE: Using the system version of poppler will require texlive to be -# recompiled with pretty much every poppler update, as they almost always -# bump the shared library version. But sometimes you do what you have -# to do... -SYSTEMPOPPLER=${SYSTEMPOPPLER:-NO} -if [ "$SYSTEMPOPPLER" = "NO" ]; then - POPPLER="--without-system-poppler --without-system-xpdf" -else - POPPLER="--with-system-poppler --with-system-xpdf" -fi - -rm -rf $PKG -mkdir -p $TMP $PKG $OUTPUT -cd $TMP -rm -rf texlive-$SOURCEVERSION-source -tar xvf $CWD/texlive-${SOURCEVERSION}-source.tar.xz || exit 1 -cd texlive-$SOURCEVERSION-source || exit 1 -chown -R root:root . -chmod -R u+w,go-w,a+rX-st . - -export LANG=C -export PATH="$PKG/usr/bin:$PATH" -export LD_LIBRARY_PATH="$PKG/usr/lib${LIBDIRSUFFIX}:$LD_LIBRARY_PATH" - -# set TEXMFROOT and TEXMFLOCAL -sed -i \ - -e 's|^TEXMFROOT.*|TEXMFROOT = $SELFAUTODIR/share|' \ - -e 's|^TEXMFLOCAL.*|TEXMFLOCAL = $TEXMFROOT/texmf-local|' \ - texk/kpathsea/texmf.cnf - -# Upstream stable fixes -patch -Np1 -i $CWD/patches/texlive-20190410-source-upstream_fixes-1.patch || exit 1 - -# prevent compiling Xdvi with libXp -sed -i 's|-lXp ||' texk/xdvik/configure - -mkdir build -cd build - CFLAGS="$SLKCFLAGS" \ - CXXFLAGS="$SLKCFLAGS -fpermissive" \ - ../configure \ - --prefix=/usr \ - --libdir=/usr/lib${LIBDIRSUFFIX} \ - --mandir=/usr/man \ - --infodir=/usr/info \ - --with-banner-add=' on Slackware (SlackBuilds.org)' \ - --disable-native-texlive-build \ - --enable-largefile \ - --enable-shared \ - --disable-static \ - --disable-missing \ - --disable-multiplatform \ - --disable-debug \ - --disable-dialog \ - --disable-bibtexu \ - --disable-xz \ - --with-x \ - --disable-dvisvgm \ - --enable-xindy \ - --disable-xindy-docs \ - --disable-xindy-rules \ - --with-clisp-runtime=system \ - --enable-gc=system \ - --with-system-zlib \ - --with-system-libpng \ - --with-system-t1lib \ - --with-system-gd \ - --with-system-freetype2 \ - --with-system-libgs \ - --with-system-icu \ - --with-system-pixman \ - --with-system-cairo \ - --with-system-gmp \ - --with-system-mpfr \ - --with-system-fontconfig \ - --with-system-ncurses \ - --without-system-harfbuzz \ - --disable-aleph \ - --disable-dump-share \ - --disable-linked-scripts \ - $POPPLER \ - --build=$ARCH-slackware-linux || exit 1 - - make || exit 1 - # make check || exit 1 - make install-strip DESTDIR=$PKG || exit 1 - -cd .. - -# Don't ship .la files: -rm -f $PKG/usr/lib${LIBDIRSUFFIX}/*.la - -# Remove all files which are covered by tlnet -rm -rf $PKG/usr/share $PKG/usr/man $PKG/usr/info - -# install the tlnet stuff -mkdir -p $PKG/usr/share -tar xvf $CWD/texlive-base-$VERSION.tar.xz -C $PKG/usr/share || exit 1 -chown -R root:root $PKG -chmod -R u+w,go-w,a+rX-st $PKG - -# use symlinks/scripts from tlnet -mv $PKG/usr/share/texmf-dist/linked_scripts/* $PKG/usr/bin -rmdir $PKG/usr/share/texmf-dist/linked_scripts - -# set some paths -sed -i \ - -e 's|^TEXMFROOT.*|TEXMFROOT = $SELFAUTODIR/share|' \ - -e 's|^TEXMFLOCAL.*|TEXMFLOCAL = $TEXMFROOT/texmf-local|' \ - -e 's|^OSFONTDIR.*|OSFONTDIR = ~/.fonts:/usr/share/fonts|' \ - $PKG/usr/share/texmf-dist/web2c/texmf.cnf - -# disable obsolete aleph/lamed/cslatex/pdfcslatex -sed -i \ - -e 's|^aleph|#! aleph|' \ - -e 's|^lamed|#! lamed|' \ - -e 's|^cslatex|#! cslatex|' \ - -e 's|^pdfcslatex|#! pdfcslatex|' \ - $PKG/usr/share/texmf-dist/web2c/fmtutil.cnf - -# make ConTeXt work, and remove unused settings -sed -i \ - -e 's|selfautoparent:|/usr/share/|g' \ - -e 's|\(TEXMFLOCAL[ ]*=[ ]*\)[^,]*|\1"/usr/share/texmf-local"|' \ - -e '/selfautodir/d' \ - -e '/texmflocal/d' \ - $PKG/usr/share/texmf-dist/web2c/texmfcnf.lua - -# provide texlive fonts optionally for other system apps -mkdir -p $PKG/etc/fonts/conf.avail -cat > $PKG/etc/fonts/conf.avail/09-texlive.conf << EOF -<?xml version='1.0'?> -<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'> -<fontconfig> - <dir>/usr/share/texmf-dist/fonts/opentype</dir> - <dir>/usr/share/texmf-dist/fonts/truetype</dir> -</fontconfig> -EOF - -# Install the docs while we're still here -mkdir -p $PKG/usr/doc/texlive-$VERSION -cp -a ChangeLog README* $PKG/usr/doc/texlive-$VERSION -# Install index of provided tex packages to the docs -mv $PKG/usr/share/texmf-dist/packages.base.gz $PKG/usr/doc/texlive-$VERSION - -# Put a symlink to /usr/share/texmf-dist/doc in our Slackware docdir -ln -s ../../share/texmf-dist/doc $PKG/usr/doc/texlive-$VERSION/doc - -# We won't make tlmgr easily available; it's still there, but -# we'll make it harder to void the warranty :-) -rm -f $PKG/usr/bin/tlmgr -cat $CWD/README.tlpkg > $PKG/usr/doc/texlive-$VERSION/README.tlpkg - -# Create some directories to make it clear that they're owned by this package -mkdir -p $PKG/usr/share/{texmf-config,texmf-var,texmf-local} - -# Use patch for tabu.sty from https://github.com/tabu-fixed/tabu to fix -# breakage when compiling doxygen: -( cd $PKG/usr/share/texmf-dist/tex/latex/tabu - cat $CWD/patches/tabu.sty.diff | patch -p1 --verbose || exit 1 - ) || exit 1 - -# Add some perl modules, at least one of which is required by updmap -mkdir -p $PKG/usr/share/perl5 -mv texk/tests/TeXLive $PKG/usr/share/perl5/ - -# Move manual pages to the correct place -mkdir $PKG/usr/man -mv $PKG/usr/share/texmf-dist/doc/man/man1 $PKG/usr/man -mv $PKG/usr/share/texmf-dist/doc/man/man5 $PKG/usr/man -rmdir $PKG/usr/share/texmf-dist/doc/man -mv $PKG/usr/share/texmf-dist/doc/info $PKG/usr - -# Handle the man pages -find $PKG/usr/man -type f -exec gzip -9 {} \; -for i in $(find $PKG/usr/man -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done - -# Handle the GNU info pages -rm -f $PKG/usr/info/dir -gzip -9 $PKG/usr/info/* - -mkdir -p $PKG/install -cat $CWD/doinst.sh > $PKG/install/doinst.sh -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -p -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/office/texlive/texlive.info b/office/texlive/texlive.info deleted file mode 100644 index 6d337e6f80..0000000000 --- a/office/texlive/texlive.info +++ /dev/null @@ -1,12 +0,0 @@ -PRGNAM="texlive" -VERSION="2019.190626" -HOMEPAGE="https://tug.org/texlive/" -DOWNLOAD="http://slackware.schoepfer.info/slackbuilds/texlive/2019/texlive-20190410-source.tar.xz \ - http://slackware.schoepfer.info/slackbuilds/texlive/2019/texlive-base-2019.190626.tar.xz" -MD5SUM="be4b20aa60861bc510bcbc5b228bcb51 \ - 0a6a69d6e921989287a8a24471150b28" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="" -MAINTAINER="Johannes Schoepfer" -EMAIL="slackbuilds@schoepfer.info" |