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.