texlive[73682] Build/source/texk/dvipdfm-x: dvipdfm-x: fix issues
commits+ymorimi at tug.org
commits+ymorimi at tug.org
Sun Feb 2 09:04:51 CET 2025
Revision: 73682
https://tug.org/svn/texlive?view=revision&revision=73682
Author: ymorimi
Date: 2025-02-02 09:04:50 +0100 (Sun, 02 Feb 2025)
Log Message:
-----------
dvipdfm-x: fix issues with TrueType fonts
Modified Paths:
--------------
trunk/Build/source/texk/dvipdfm-x/ChangeLog
trunk/Build/source/texk/dvipdfm-x/Makefile.am
trunk/Build/source/texk/dvipdfm-x/Makefile.in
trunk/Build/source/texk/dvipdfm-x/configure
trunk/Build/source/texk/dvipdfm-x/configure.ac
trunk/Build/source/texk/dvipdfm-x/truetype.c
Added Paths:
-----------
trunk/Build/source/texk/dvipdfm-x/dvipdfmx-ttf0.test
trunk/Build/source/texk/dvipdfm-x/tests/cprm00.dvi
trunk/Build/source/texk/dvipdfm-x/tests/cprm00.tex
Modified: trunk/Build/source/texk/dvipdfm-x/ChangeLog
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/ChangeLog 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/ChangeLog 2025-02-02 08:04:50 UTC (rev 73682)
@@ -1,3 +1,15 @@
+2025-02-02 Yukimasa Morimi <h20y6m at yahoo.co.jp>
+
+ * truetype.c: Fixed issues in embedded TrueType fonts (not CIDFont)
+ where incorrect character widths occurred when using 127 or more
+ glyphs, and where the 256th glyph was not displayed when using
+ full 256 glyphs.
+ * dvipdfmx-ttf0.test, cprm00.{dvi,tex}:
+ Add tests for TrueType fonts
+ from TANAKA Takuji <ttk at t-lab.opal.ne.jp>.
+ https://github.com/texjporg/tex-jp-build/issues/172
+ * configure.ac: version 20250202.
+
2024-11-18 Karl Berry <karl at freefriends.org>
* Makefile.am (bin_links): no longer make symlinks for ebb and
Modified: trunk/Build/source/texk/dvipdfm-x/Makefile.am
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/Makefile.am 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/Makefile.am 2025-02-02 08:04:50 UTC (rev 73682)
@@ -247,11 +247,13 @@
TESTS += xdvipdfm-rev.test xdvipdfm-ttc.test
TESTS += dvipdfmx-upjf.test dvipdfmx-upjf2.test dvipdfmx-upjf3.test dvipdfmx-incl.test
TESTS += dvipdfmx-lmr0.test dvipdfmx-lmr1.test
+TESTS += dvipdfmx-ttf0.test
xdvipdfmx.log xdvipdfm-ann.log xdvipdfm-bad.log xdvipdfm-bb.log \
xdvipdfm-bkm.log xdvipdfm-psz.log xdvipdfm-ptx.log xdvipdfm-res.log \
xdvipdfm-rev.log xdvipdfm-ttc.log \
dvipdfmx-upjf.log dvipdfmx-upjf2.log dvipdfmx-upjf3.log dvipdfmx-incl.log \
- dvipdfmx-lmr0.log dvipdfmx-lmr1.log: \
+ dvipdfmx-lmr0.log dvipdfmx-lmr1.log \
+ dvipdfmx-ttf0.log: \
xdvipdfmx$(EXEEXT)
EXTRA_DIST = $(TESTS)
## xdvipdfmx.test
@@ -329,5 +331,8 @@
## dvipdfmx-lmr0.test, dvipdfmx-lmr1.test
EXTRA_DIST += tests/lmr0.tex tests/lmr0-al.dvi tests/lmr0-up.dvi
DISTCLEANFILES += lmr0-*.pdf
+## dvipdfmx-ttf0.test
+EXTRA_DIST += tests/cprm00.tex tests/cprm00.dvi
+DISTCLEANFILES += cprm*.pdf
##
EXTRA_DIST += tests/fullmap.dvi tests/fullmap.tex
Modified: trunk/Build/source/texk/dvipdfm-x/Makefile.in
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/Makefile.in 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/Makefile.in 2025-02-02 08:04:50 UTC (rev 73682)
@@ -831,13 +831,13 @@
bookm*.pdf paper*.pdf ptex*.pdf resrc*.pdf reverse.pdf \
ttc*.pdf upjf.vf upjv.vf upjf-*.ofm upjv-*.ofm upjf-*.tfm \
upjf_*.pdf upjf1_*.pdf upjf2_*.pdf upjf3_*.pdf multi_incl.pdf \
- lmr0-*.pdf
+ lmr0-*.pdf cprm*.pdf
TESTS = xdvipdfmx.test xdvipdfm-ann.test xdvipdfm-bad.test \
xdvipdfm-bb.test xdvipdfm-bkm.test xdvipdfm-psz.test \
xdvipdfm-ptx.test xdvipdfm-res.test xdvipdfm-rev.test \
xdvipdfm-ttc.test dvipdfmx-upjf.test dvipdfmx-upjf2.test \
dvipdfmx-upjf3.test dvipdfmx-incl.test dvipdfmx-lmr0.test \
- dvipdfmx-lmr1.test
+ dvipdfmx-lmr1.test dvipdfmx-ttf0.test
EXTRA_DIST = $(TESTS) tests/dvipdfmx.cfg tests/psfonts.map \
tests/cmr10.pfb tests/cmr10.tfm tests/image.dvi \
tests/image.tex tests/xbmc.dvi tests/xbmc.tex \
@@ -875,7 +875,7 @@
tests/upjf-noto.map tests/upjf-ipa.map tests/multi_incl.dvi \
tests/multi_incl.tex tests/sue-mp.pdf tests/lmr0.tex \
tests/lmr0-al.dvi tests/lmr0-up.dvi tests/fullmap.dvi \
- tests/fullmap.tex
+ tests/cprm00.tex tests/cprm00.dvi tests/fullmap.tex
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -2059,7 +2059,7 @@
xdvipdfm-bkm.log xdvipdfm-psz.log xdvipdfm-ptx.log xdvipdfm-res.log \
xdvipdfm-rev.log xdvipdfm-ttc.log \
dvipdfmx-upjf.log dvipdfmx-upjf2.log dvipdfmx-upjf3.log dvipdfmx-incl.log \
- dvipdfmx-lmr0.log dvipdfmx-lmr1.log: \
+ dvipdfmx-lmr0.log dvipdfmx-lmr1.log dvipdfmx-ttf0.log: \
xdvipdfmx$(EXEEXT)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
Modified: trunk/Build/source/texk/dvipdfm-x/configure
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/configure 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/configure 2025-02-02 08:04:50 UTC (rev 73682)
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for dvipdfm-x (TeX Live) 20250125.
+# Generated by GNU Autoconf 2.72 for dvipdfm-x (TeX Live) 20250202.
#
# Report bugs to <dvipdfmx at tug.org>.
#
@@ -614,8 +614,8 @@
# Identity of this package.
PACKAGE_NAME='dvipdfm-x (TeX Live)'
PACKAGE_TARNAME='dvipdfm-x--tex-live-'
-PACKAGE_VERSION='20250125'
-PACKAGE_STRING='dvipdfm-x (TeX Live) 20250125'
+PACKAGE_VERSION='20250202'
+PACKAGE_STRING='dvipdfm-x (TeX Live) 20250202'
PACKAGE_BUGREPORT='dvipdfmx at tug.org'
PACKAGE_URL=''
@@ -1387,7 +1387,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) 20250125 to adapt to many kinds of systems.
+'configure' configures dvipdfm-x (TeX Live) 20250202 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1459,7 +1459,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of dvipdfm-x (TeX Live) 20250125:";;
+ short | recursive ) echo "Configuration of dvipdfm-x (TeX Live) 20250202:";;
esac
cat <<\_ACEOF
@@ -1590,7 +1590,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-dvipdfm-x (TeX Live) configure 20250125
+dvipdfm-x (TeX Live) configure 20250202
generated by GNU Autoconf 2.72
Copyright (C) 2023 Free Software Foundation, Inc.
@@ -2371,7 +2371,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 20250125, which was
+It was created by dvipdfm-x (TeX Live) $as_me 20250202, which was
generated by GNU Autoconf 2.72. Invocation command line was
$ $0$ac_configure_args_raw
@@ -9263,7 +9263,7 @@
# Define the identity of the package.
PACKAGE='dvipdfm-x--tex-live-'
- VERSION='20250125'
+ VERSION='20250202'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -16931,7 +16931,7 @@
Report bugs to <bug-libtool at gnu.org>."
lt_cl_version="\
-dvipdfm-x (TeX Live) config.lt 20250125
+dvipdfm-x (TeX Live) config.lt 20250202
configured by $0, generated by GNU Autoconf 2.72.
Copyright (C) 2024 Free Software Foundation, Inc.
@@ -18885,7 +18885,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 20250125, which was
+This file was extended by dvipdfm-x (TeX Live) $as_me 20250202, which was
generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -18957,7 +18957,7 @@
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-dvipdfm-x (TeX Live) config.status 20250125
+dvipdfm-x (TeX Live) config.status 20250202
configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\"
Modified: trunk/Build/source/texk/dvipdfm-x/configure.ac
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/configure.ac 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/configure.ac 2025-02-02 08:04:50 UTC (rev 73682)
@@ -8,7 +8,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)], [20250125], [dvipdfmx at tug.org])
+AC_INIT([dvipdfm-x (TeX Live)], [20250202], [dvipdfmx at tug.org])
AC_PREREQ([2.65])
AC_CONFIG_SRCDIR([agl.c])
AC_CONFIG_AUX_DIR([../../build-aux])
Added: trunk/Build/source/texk/dvipdfm-x/dvipdfmx-ttf0.test
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/dvipdfmx-ttf0.test (rev 0)
+++ trunk/Build/source/texk/dvipdfm-x/dvipdfmx-ttf0.test 2025-02-02 08:04:50 UTC (rev 73682)
@@ -0,0 +1,69 @@
+#! /bin/sh -vx
+# $Id$
+# Copyright 2024 Japanese TeX Development Community <issue at texjp.org>
+# You may freely use, modify and/or distribute this file.
+
+KpsDir=${KpsDir:-../kpathsea}
+BinDir=${BinDir:-.}
+ExeExt=${ExeExt:-}
+_kpsewhich=$KpsDir/kpsewhich$ExeExt
+_xdvipdfmx=$BinDir/xdvipdfmx$ExeExt
+
+if type kpsewhich > /dev/null 2>&1; then
+ ttfpath=".//;"`kpsewhich -show-path='truetype fonts'`
+ ttfpath=`echo $ttfpath | sed -e 's,!!,,g'`
+ tfmpath=".//;"`kpsewhich -show-path='tfm'`
+ tfmpath=`echo $tfmpath | sed -e 's,!!,,g'`
+ encpath=".//;"`kpsewhich -show-path='enc files'`
+ encpath=`echo $encpath | sed -e 's,!!,,g'`
+fi
+
+TEXMFCNF=$srcdir/../kpathsea
+T1FONTS="$srcdir/tests;$srcdir/data"
+TEXFONTMAPS="$srcdir/tests;$srcdir/data"
+DVIPDFMXINPUTS="$srcdir/tests;$srcdir/data"
+TEXPICTS=$srcdir/tests
+TEXFONTS=".;$srcdir/tests"
+SOURCE_DATE_EPOCH=1588474800
+export TEXMFCNF T1FONTS TEXFONTMAPS DVIPDFMXINPUTS TEXPICTS TEXFONTS SOURCE_DATE_EPOCH
+
+if type kpsewhich > /dev/null 2>&1; then
+ echo $ttfpath
+ echo $tfmpath
+ echo $encpath
+else
+ ttfpath=".//;"`$_kpsewhich -show-path='truetype fonts'`
+ echo $ttfpath
+ tfmpath=".//;"`$_kpsewhich -show-path='tfm'`
+ echo $tfmpath
+ encpath=".//;"`$_kpsewhich -show-path='enc files'`
+ echo $encpath
+fi
+TTFONTS=`$_kpsewhich "--cnf-line=TTFONTS=$ttfpath" -show-path='truetype fonts'`
+export TTFONTS
+echo "TTFONTS::" $TTFONTS
+TFMFONTS=`$_kpsewhich "--cnf-line=TFMFONTS=$tfmpath" -show-path='tfm'`
+export TFMFONTS
+echo "TFMFONTS::" $TFMFONTS
+ENCFONTS=`$_kpsewhich "--cnf-line=ENCFONTS=$encpath" -show-path='enc files'`
+export ENCFONTS
+echo "ENCFONTS::" $ENCFONTS
+
+failed=
+
+##### following tests require Cuprum fonts #####
+
+$_kpsewhich Cuprum-Regular.ttf || exit 77
+$_kpsewhich cprmn8t.tfm || exit 77
+$_kpsewhich T1-WGL4.enc || exit 77
+
+echo "*** dvipdfmx: test for cprm00.pdf" && echo \
+ && $_xdvipdfmx --dvipdfmx -vv -o cprm00.pdf $srcdir/tests/cprm00.dvi \
+ && echo && echo "dvipdfmx-ttf0 tests OK" && echo \
+ || failed="$failed dvipdfmx-ttf0"
+
+
+test -z "$failed" && exit 0
+echo
+echo "failed tests:$failed"
+exit 1
Added: trunk/Build/source/texk/dvipdfm-x/tests/cprm00.dvi
===================================================================
(Binary files differ)
Index: trunk/Build/source/texk/dvipdfm-x/tests/cprm00.dvi
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/tests/cprm00.dvi 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/tests/cprm00.dvi 2025-02-02 08:04:50 UTC (rev 73682)
Property changes on: trunk/Build/source/texk/dvipdfm-x/tests/cprm00.dvi
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/Build/source/texk/dvipdfm-x/tests/cprm00.tex
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/tests/cprm00.tex (rev 0)
+++ trunk/Build/source/texk/dvipdfm-x/tests/cprm00.tex 2025-02-02 08:04:50 UTC (rev 73682)
@@ -0,0 +1,11 @@
+% plain TeX
+\special{pdf:mapline cprmn8t T1-WGL4 Cuprum-Regular.ttf}
+\font\testfont=cprmn8t \relax
+\def\TEST#1{\vrule width 4pt{\testfont {#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}{#1}}\vrule width 4pt \par}
+\newcount\cnt \cnt="00
+\loop\ifnum\cnt<"100
+ \the\cnt : \TEST{\char\cnt}
+ \advance\cnt1
+\repeat
+\end
+
Property changes on: trunk/Build/source/texk/dvipdfm-x/tests/cprm00.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/texk/dvipdfm-x/truetype.c
===================================================================
--- trunk/Build/source/texk/dvipdfm-x/truetype.c 2025-02-02 00:46:37 UTC (rev 73681)
+++ trunk/Build/source/texk/dvipdfm-x/truetype.c 2025-02-02 08:04:50 UTC (rev 73682)
@@ -294,6 +294,8 @@
USHORT gid, idx;
int code, count;
double widths[256];
+ USHORT code_to_idx[256] = {0};
+ int cmap_old_format = 0;
ttcm = tt_cmap_read(sfont, TT_MAC, TT_MAC_ROMAN);
if (!ttcm) {
@@ -301,16 +303,52 @@
return -1;
}
- cmap_table = NEW(274, char);
- memset(cmap_table, 0, 274);
- sfnt_put_ushort(cmap_table, 0); /* Version */
- sfnt_put_ushort(cmap_table+2, 1); /* Number of subtables */
- sfnt_put_ushort(cmap_table+4, TT_MAC); /* Platform ID */
- sfnt_put_ushort(cmap_table+6, TT_MAC_ROMAN); /* Encoding ID */
- sfnt_put_ulong (cmap_table+8, 12); /* Offset */
- sfnt_put_ushort(cmap_table+12, 0); /* Format */
- sfnt_put_ushort(cmap_table+14, 262); /* Length */
- sfnt_put_ushort(cmap_table+16, 0); /* Language */
+ if (cmap_old_format) {
+ cmap_table = NEW(274, char);
+ memset(cmap_table, 0, 274);
+ sfnt_put_ushort(cmap_table, 0); /* Version */
+ sfnt_put_ushort(cmap_table+2, 1); /* Number of subtables */
+ sfnt_put_ushort(cmap_table+4, TT_MAC); /* Platform ID */
+ sfnt_put_ushort(cmap_table+6, TT_MAC_ROMAN); /* Encoding ID */
+ sfnt_put_ulong (cmap_table+8, 12); /* Offset */
+ sfnt_put_ushort(cmap_table+12, 0); /* Format */
+ sfnt_put_ushort(cmap_table+14, 262); /* Length */
+ sfnt_put_ushort(cmap_table+16, 0); /* Language */
+ } else {
+ cmap_table = NEW(1086, char); /* = 20 + 522 + 544 */
+ memset(cmap_table, 0, 1086);
+ sfnt_put_ushort(cmap_table, 0); /* Version */
+ sfnt_put_ushort(cmap_table+2, 2); /* Number of subtables */
+ sfnt_put_ushort(cmap_table+4, TT_MAC); /* Platform ID */
+ sfnt_put_ushort(cmap_table+6, TT_MAC_ROMAN); /* Encoding ID */
+ sfnt_put_ulong (cmap_table+8, 20); /* Offset */
+ sfnt_put_ushort(cmap_table+12, TT_WIN); /* Platform ID */
+ sfnt_put_ushort(cmap_table+14, TT_WIN_SYMBOL);/* Encoding ID */
+ sfnt_put_ulong (cmap_table+16, 542); /* Offset = 20 + 522 */
+ /* (1, 0) subtable */
+ sfnt_put_ushort(cmap_table+20, 6); /* format */
+ sfnt_put_ushort(cmap_table+22, 522); /* length = 10 + 512 */
+ sfnt_put_ushort(cmap_table+24, 0); /* language */
+ sfnt_put_ushort(cmap_table+26, 0); /* firstCode */
+ sfnt_put_ushort(cmap_table+28, 256); /* entryCount */
+ /* (3, 0) subtable */
+ sfnt_put_ushort(cmap_table+542, 4); /* format */
+ sfnt_put_ushort(cmap_table+544, 544); /* length = 16 + 8 * 2 + 512 */
+ sfnt_put_ushort(cmap_table+546, 0); /* language */
+ sfnt_put_ushort(cmap_table+548, 4); /* segCountX2 */
+ sfnt_put_ushort(cmap_table+550, 4); /* searchRange */
+ sfnt_put_ushort(cmap_table+552, 1); /* entrySelector */
+ sfnt_put_ushort(cmap_table+554, 0); /* rangeShift */
+ sfnt_put_ushort(cmap_table+556, 0xf0ff) /* endCode[0] */
+ sfnt_put_ushort(cmap_table+558, 0xffff) /* endCode[1] */
+ sfnt_put_ushort(cmap_table+560, 0); /* reservedPad */
+ sfnt_put_ushort(cmap_table+562, 0xf000); /* startCode[0] */
+ sfnt_put_ushort(cmap_table+564, 0xffff); /* startCode[1] */
+ sfnt_put_short (cmap_table+566, 0); /* idDelta[0] */
+ sfnt_put_short (cmap_table+568, 1); /* idDelta[1] */
+ sfnt_put_ushort(cmap_table+570, 4); /* idRangeOffset[0] */
+ sfnt_put_ushort(cmap_table+572, 0); /* idRangeOffset[1] */
+ }
glyphs = tt_build_init();
@@ -335,7 +373,19 @@
if (idx == 0)
idx = tt_add_glyph(glyphs, (USHORT)gid, (USHORT)count); /* count returned. */
}
- cmap_table[18+code] = idx & 0xff; /* bug here */
+ code_to_idx[code] = idx;
+ if (cmap_old_format) {
+ if (idx >= 256) {
+ WARN("Font font-file=\"%s\" uses more than 255 glyphs", font->filename);
+ WARN(">> Glyph for character code=0x%02x will be inaccessible.", code);
+ cmap_table[18 + code] = 0;
+ } else {
+ cmap_table[18 + code] = (char)(BYTE)idx;
+ }
+ } else {
+ sfnt_put_ushort(cmap_table + 30 + 2 * code, idx);
+ sfnt_put_ushort(cmap_table + 574 + 2 * code, idx);
+ }
count++;
}
tt_cmap_release(ttcm);
@@ -352,7 +402,7 @@
for (code = 0; code < 256; code++) {
if (usedchars[code]) {
- idx = tt_get_index(glyphs, (USHORT) cmap_table[18+code]);
+ idx = tt_get_index(glyphs, code_to_idx[code]);
widths[code] = PDFUNIT(glyphs->gd[idx].advw);
} else {
widths[code] = 0.0;
@@ -365,7 +415,11 @@
tt_build_finish(glyphs);
- sfnt_set_table(sfont, "cmap", cmap_table, 274);
+ if (cmap_old_format) {
+ sfnt_set_table(sfont, "cmap", cmap_table, 274);
+ } else {
+ sfnt_set_table(sfont, "cmap", cmap_table, 1086);
+ }
return 0;
}
@@ -780,7 +834,9 @@
double widths[256];
struct glyph_mapper gm;
USHORT idx, gid;
+ USHORT code_to_idx[256] = {0};
int error = 0;
+ int cmap_old_format = 0;
ASSERT(font && encoding && usedchars && sfont);
@@ -791,16 +847,52 @@
return -1;
}
- cmap_table = NEW(274, char);
- memset(cmap_table, 0, 274);
- sfnt_put_ushort(cmap_table, 0); /* Version */
- sfnt_put_ushort(cmap_table+2, 1); /* Number of subtables */
- sfnt_put_ushort(cmap_table+4, TT_MAC); /* Platform ID */
- sfnt_put_ushort(cmap_table+6, TT_MAC_ROMAN); /* Encoding ID */
- sfnt_put_ulong (cmap_table+8, 12); /* Offset */
- sfnt_put_ushort(cmap_table+12, 0); /* Format */
- sfnt_put_ushort(cmap_table+14, 262); /* Length */
- sfnt_put_ushort(cmap_table+16, 0); /* Language */
+ if (cmap_old_format) {
+ cmap_table = NEW(274, char);
+ memset(cmap_table, 0, 274);
+ sfnt_put_ushort(cmap_table, 0); /* Version */
+ sfnt_put_ushort(cmap_table+2, 1); /* Number of subtables */
+ sfnt_put_ushort(cmap_table+4, TT_MAC); /* Platform ID */
+ sfnt_put_ushort(cmap_table+6, TT_MAC_ROMAN); /* Encoding ID */
+ sfnt_put_ulong (cmap_table+8, 12); /* Offset */
+ sfnt_put_ushort(cmap_table+12, 0); /* Format */
+ sfnt_put_ushort(cmap_table+14, 262); /* Length */
+ sfnt_put_ushort(cmap_table+16, 0); /* Language */
+ } else {
+ cmap_table = NEW(1086, char); /* = 20 + 522 + 544 */
+ memset(cmap_table, 0, 1086);
+ sfnt_put_ushort(cmap_table, 0); /* Version */
+ sfnt_put_ushort(cmap_table+2, 2); /* Number of subtables */
+ sfnt_put_ushort(cmap_table+4, TT_MAC); /* Platform ID */
+ sfnt_put_ushort(cmap_table+6, TT_MAC_ROMAN); /* Encoding ID */
+ sfnt_put_ulong (cmap_table+8, 20); /* Offset */
+ sfnt_put_ushort(cmap_table+12, TT_WIN); /* Platform ID */
+ sfnt_put_ushort(cmap_table+14, TT_WIN_SYMBOL);/* Encoding ID */
+ sfnt_put_ulong (cmap_table+16, 542); /* Offset = 20 + 522 */
+ /* (1, 0) subtable */
+ sfnt_put_ushort(cmap_table+20, 6); /* format */
+ sfnt_put_ushort(cmap_table+22, 522); /* length = 10 + 512 */
+ sfnt_put_ushort(cmap_table+24, 0); /* language */
+ sfnt_put_ushort(cmap_table+26, 0); /* firstCode */
+ sfnt_put_ushort(cmap_table+28, 256); /* entryCount */
+ /* (3, 0) subtable */
+ sfnt_put_ushort(cmap_table+542, 4); /* format */
+ sfnt_put_ushort(cmap_table+544, 544); /* length = 16 + 8 * 2 + 512 */
+ sfnt_put_ushort(cmap_table+546, 0); /* language */
+ sfnt_put_ushort(cmap_table+548, 4); /* segCountX2 */
+ sfnt_put_ushort(cmap_table+550, 4); /* searchRange */
+ sfnt_put_ushort(cmap_table+552, 1); /* entrySelector */
+ sfnt_put_ushort(cmap_table+554, 0); /* rangeShift */
+ sfnt_put_ushort(cmap_table+556, 0xf0ff) /* endCode[0] */
+ sfnt_put_ushort(cmap_table+558, 0xffff) /* endCode[1] */
+ sfnt_put_ushort(cmap_table+560, 0); /* reservedPad */
+ sfnt_put_ushort(cmap_table+562, 0xf000); /* startCode[0] */
+ sfnt_put_ushort(cmap_table+564, 0xffff); /* startCode[1] */
+ sfnt_put_short (cmap_table+566, 0); /* idDelta[0] */
+ sfnt_put_short (cmap_table+568, 1); /* idDelta[1] */
+ sfnt_put_ushort(cmap_table+570, 4); /* idRangeOffset[0] */
+ sfnt_put_ushort(cmap_table+572, 0); /* idRangeOffset[1] */
+ }
glyphs = tt_build_init();
@@ -837,7 +929,19 @@
count++;
}
}
- cmap_table[18 + code] = idx & 0xff; /* bug here */
+ code_to_idx[code] = idx;
+ if (cmap_old_format) {
+ if (idx >= 256) {
+ WARN("Font font-file=\"%s\" uses more than 255 glyphs", font->filename);
+ WARN(">> Glyph glyph-name=\"%s\" will be inaccessible.", encoding[code]);
+ cmap_table[18 + code] = 0;
+ } else {
+ cmap_table[18 + code] = (char)(BYTE)idx;
+ }
+ } else {
+ sfnt_put_ushort(cmap_table + 30 + 2 * code, idx);
+ sfnt_put_ushort(cmap_table + 574 + 2 * code, idx);
+ }
}
clean_glyph_mapper(&gm);
@@ -850,7 +954,7 @@
for (code = 0; code < 256; code++) {
if (usedchars[code]) {
- idx = tt_get_index(glyphs, (USHORT) cmap_table[18+code]);
+ idx = tt_get_index(glyphs, code_to_idx[code]);
widths[code] = PDFUNIT(glyphs->gd[idx].advw);
} else {
widths[code] = 0.0;
@@ -863,7 +967,11 @@
tt_build_finish(glyphs);
- sfnt_set_table(sfont, "cmap", cmap_table, 274);
+ if (cmap_old_format) {
+ sfnt_set_table(sfont, "cmap", cmap_table, 274);
+ } else {
+ sfnt_set_table(sfont, "cmap", cmap_table, 1086);
+ }
return 0;
}
More information about the tex-live-commits
mailing list.