summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Kew <jfkthame@googlemail.com>2006-09-29 15:15:10 +0000
committerJonathan Kew <jfkthame@googlemail.com>2006-09-29 15:15:10 +0000
commit387cf3625583fb046baf756f72f188924f35cfe2 (patch)
tree6e09f2e03b9c590a9f14689dfdb4d77ed66e773d
parentfe77ff4cdab25604b424a273c726920830f63abc (diff)
adding xdvipdfmx sources
git-svn-id: svn://tug.org/texlive/trunk@2220 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Build/source/texk/xdvipdfmx/AUTHORS5
-rw-r--r--Build/source/texk/xdvipdfmx/BUGS29
-rw-r--r--Build/source/texk/xdvipdfmx/COPYING340
-rw-r--r--Build/source/texk/xdvipdfmx/ChangeLog1888
-rw-r--r--Build/source/texk/xdvipdfmx/INSTALL182
-rw-r--r--Build/source/texk/xdvipdfmx/Makefile.am1
-rw-r--r--Build/source/texk/xdvipdfmx/Makefile.in599
-rw-r--r--Build/source/texk/xdvipdfmx/NEWS0
-rw-r--r--Build/source/texk/xdvipdfmx/README516
-rw-r--r--Build/source/texk/xdvipdfmx/TODO56
-rw-r--r--Build/source/texk/xdvipdfmx/acinclude.m4275
-rw-r--r--Build/source/texk/xdvipdfmx/aclocal.m4892
-rwxr-xr-xBuild/source/texk/xdvipdfmx/compile142
-rwxr-xr-xBuild/source/texk/xdvipdfmx/config.guess1466
-rw-r--r--Build/source/texk/xdvipdfmx/config.h.in148
-rwxr-xr-xBuild/source/texk/xdvipdfmx/config.sub1579
-rwxr-xr-xBuild/source/texk/xdvipdfmx/configure10112
-rw-r--r--Build/source/texk/xdvipdfmx/configure.in151
-rw-r--r--Build/source/texk/xdvipdfmx/contrib/context/spec-dpx.tex841
-rw-r--r--Build/source/texk/xdvipdfmx/contrib/latex/color.sty.sample177
-rw-r--r--Build/source/texk/xdvipdfmx/contrib/latex/dvipdfmx.def.sample139
-rw-r--r--Build/source/texk/xdvipdfmx/contrib/latex/graphics.sty.sample473
-rw-r--r--Build/source/texk/xdvipdfmx/contrib/patches/glyphlist-cm-add.txt76
-rw-r--r--Build/source/texk/xdvipdfmx/contrib/patches/patch-ebb-artbox.diff103
-rw-r--r--Build/source/texk/xdvipdfmx/data/CMap/EUC-UCS26800
-rw-r--r--Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-H66
-rw-r--r--Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-V75
-rw-r--r--Build/source/texk/xdvipdfmx/data/Makefile.am25
-rw-r--r--Build/source/texk/xdvipdfmx/data/Makefile.in335
-rw-r--r--Build/source/texk/xdvipdfmx/data/config/cid-x.map3
-rw-r--r--Build/source/texk/xdvipdfmx/data/config/dvipdfmx.cfg193
-rw-r--r--Build/source/texk/xdvipdfmx/data/config/glyphlist.txt4291
-rw-r--r--Build/source/texk/xdvipdfmx/debian/changelog18
-rw-r--r--Build/source/texk/xdvipdfmx/debian/compat1
-rw-r--r--Build/source/texk/xdvipdfmx/debian/conffiles.ex7
-rw-r--r--Build/source/texk/xdvipdfmx/debian/control15
-rw-r--r--Build/source/texk/xdvipdfmx/debian/copyright36
-rw-r--r--Build/source/texk/xdvipdfmx/debian/dirs1
-rw-r--r--Build/source/texk/xdvipdfmx/debian/docs4
-rw-r--r--Build/source/texk/xdvipdfmx/debian/manpage.1.ex59
-rwxr-xr-xBuild/source/texk/xdvipdfmx/debian/rules107
-rw-r--r--Build/source/texk/xdvipdfmx/debian/watch.ex22
-rwxr-xr-xBuild/source/texk/xdvipdfmx/depcomp529
-rw-r--r--Build/source/texk/xdvipdfmx/doc/CJK-CID.txt76
-rw-r--r--Build/source/texk/xdvipdfmx/doc/images/dvipdfm-cjk.pngbin0 -> 26441 bytes
-rw-r--r--Build/source/texk/xdvipdfmx/doc/images/dvipdfmx-logo.pngbin0 -> 9097 bytes
-rw-r--r--Build/source/texk/xdvipdfmx/doc/images/dvipdfmx.pngbin0 -> 25301 bytes
-rw-r--r--Build/source/texk/xdvipdfmx/doc/images/right_triangle.pngbin0 -> 162 bytes
-rw-r--r--Build/source/texk/xdvipdfmx/doc/images/rightarrow.pngbin0 -> 224 bytes
-rw-r--r--Build/source/texk/xdvipdfmx/doc/tug2003.pdfbin0 -> 279575 bytes
-rw-r--r--Build/source/texk/xdvipdfmx/index.html640
-rwxr-xr-xBuild/source/texk/xdvipdfmx/install-sh251
-rwxr-xr-xBuild/source/texk/xdvipdfmx/missing360
-rwxr-xr-xBuild/source/texk/xdvipdfmx/mkinstalldirs40
-rw-r--r--Build/source/texk/xdvipdfmx/rpm/xdvipdfmx-0.3.spec67
-rw-r--r--Build/source/texk/xdvipdfmx/src/Makefile.am45
-rw-r--r--Build/source/texk/xdvipdfmx/src/Makefile.in1531
-rw-r--r--Build/source/texk/xdvipdfmx/src/agl.c848
-rw-r--r--Build/source/texk/xdvipdfmx/src/agl.h68
-rw-r--r--Build/source/texk/xdvipdfmx/src/agl_standard.c5895
-rw-r--r--Build/source/texk/xdvipdfmx/src/asl_charset.h364
-rw-r--r--Build/source/texk/xdvipdfmx/src/bmpimage.c466
-rw-r--r--Build/source/texk/xdvipdfmx/src/bmpimage.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff.c1458
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff.h155
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff_dict.c770
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff_dict.h48
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff_limits.h46
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff_stdstr.h109
-rw-r--r--Build/source/texk/xdvipdfmx/src/cff_types.h142
-rw-r--r--Build/source/texk/xdvipdfmx/src/cid.c826
-rw-r--r--Build/source/texk/xdvipdfmx/src/cid.h94
-rw-r--r--Build/source/texk/xdvipdfmx/src/cid_basefont.h463
-rw-r--r--Build/source/texk/xdvipdfmx/src/cid_p.h73
-rw-r--r--Build/source/texk/xdvipdfmx/src/cidtype0.c2073
-rw-r--r--Build/source/texk/xdvipdfmx/src/cidtype0.h47
-rw-r--r--Build/source/texk/xdvipdfmx/src/cidtype2.c1086
-rw-r--r--Build/source/texk/xdvipdfmx/src/cidtype2.h37
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap.c995
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap.h118
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap_p.h104
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap_read.c605
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap_read.h34
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap_write.c601
-rw-r--r--Build/source/texk/xdvipdfmx/src/cmap_write.h35
-rw-r--r--Build/source/texk/xdvipdfmx/src/cs_type2.c807
-rw-r--r--Build/source/texk/xdvipdfmx/src/cs_type2.h45
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxconf.c110
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxconf.h60
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxcrypt.c366
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxcrypt.h49
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxfile.c930
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxfile.h58
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxutil.c643
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxutil.h101
-rw-r--r--Build/source/texk/xdvipdfmx/src/dvi.c2632
-rw-r--r--Build/source/texk/xdvipdfmx/src/dvi.h92
-rw-r--r--Build/source/texk/xdvipdfmx/src/dvicodes.h131
-rw-r--r--Build/source/texk/xdvipdfmx/src/dvipdfmx.c898
-rw-r--r--Build/source/texk/xdvipdfmx/src/epdf.c523
-rw-r--r--Build/source/texk/xdvipdfmx/src/epdf.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/error.c94
-rw-r--r--Build/source/texk/xdvipdfmx/src/error.h46
-rw-r--r--Build/source/texk/xdvipdfmx/src/fontmap.c1527
-rw-r--r--Build/source/texk/xdvipdfmx/src/fontmap.h107
-rw-r--r--Build/source/texk/xdvipdfmx/src/jpegimage.c749
-rw-r--r--Build/source/texk/xdvipdfmx/src/jpegimage.h36
-rw-r--r--Build/source/texk/xdvipdfmx/src/mem.c94
-rw-r--r--Build/source/texk/xdvipdfmx/src/mem.h50
-rw-r--r--Build/source/texk/xdvipdfmx/src/mfileio.c127
-rw-r--r--Build/source/texk/xdvipdfmx/src/mfileio.h61
-rwxr-xr-xBuild/source/texk/xdvipdfmx/src/mk_agl_standard_c.pl51
-rw-r--r--Build/source/texk/xdvipdfmx/src/mpost.c1627
-rw-r--r--Build/source/texk/xdvipdfmx/src/mpost.h47
-rw-r--r--Build/source/texk/xdvipdfmx/src/numbers.c224
-rw-r--r--Build/source/texk/xdvipdfmx/src/numbers.h82
-rw-r--r--Build/source/texk/xdvipdfmx/src/otl_conf.c654
-rw-r--r--Build/source/texk/xdvipdfmx/src/otl_conf.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/otl_opt.c343
-rw-r--r--Build/source/texk/xdvipdfmx/src/otl_opt.h37
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfcolor.c1644
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfcolor.h98
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdev.c1820
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdev.h220
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdoc.c2362
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdoc.h138
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdraw.c1836
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfdraw.h160
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfencoding.c1178
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfencoding.h83
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfencrypt.c536
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfencrypt.h35
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdffont.c952
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdffont.h102
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdflimits.h34
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfnames.c486
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfnames.h52
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfobj.c2542
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfobj.h177
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfparse.c1071
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfparse.h55
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfresource.c373
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfresource.h43
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfximage.c807
-rw-r--r--Build/source/texk/xdvipdfmx/src/pdfximage.h86
-rw-r--r--Build/source/texk/xdvipdfmx/src/pkfont.c793
-rw-r--r--Build/source/texk/xdvipdfmx/src/pkfont.h35
-rw-r--r--Build/source/texk/xdvipdfmx/src/pngimage.c1006
-rw-r--r--Build/source/texk/xdvipdfmx/src/pngimage.h43
-rw-r--r--Build/source/texk/xdvipdfmx/src/pst.c179
-rw-r--r--Build/source/texk/xdvipdfmx/src/pst.h74
-rw-r--r--Build/source/texk/xdvipdfmx/src/pst_obj.c996
-rw-r--r--Build/source/texk/xdvipdfmx/src/pst_obj.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/sfnt.c594
-rw-r--r--Build/source/texk/xdvipdfmx/src/sfnt.h155
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_color.c220
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_color.h37
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_dvips.c395
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_dvips.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_html.c940
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_html.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_misc.c233
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_misc.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_pdfm.c2032
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_pdfm.h39
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_tpic.c1150
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_tpic.h41
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_util.c731
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_util.h44
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_xtx.c377
-rw-r--r--Build/source/texk/xdvipdfmx/src/spc_xtx.h42
-rw-r--r--Build/source/texk/xdvipdfmx/src/specials.c605
-rw-r--r--Build/source/texk/xdvipdfmx/src/specials.h78
-rw-r--r--Build/source/texk/xdvipdfmx/src/subfont.c654
-rw-r--r--Build/source/texk/xdvipdfmx/src/subfont.h33
-rw-r--r--Build/source/texk/xdvipdfmx/src/system.h53
-rw-r--r--Build/source/texk/xdvipdfmx/src/t1_char.c1590
-rw-r--r--Build/source/texk/xdvipdfmx/src/t1_char.h26
-rw-r--r--Build/source/texk/xdvipdfmx/src/t1_load.c1197
-rw-r--r--Build/source/texk/xdvipdfmx/src/t1_load.h11
-rw-r--r--Build/source/texk/xdvipdfmx/src/tfm.c1203
-rw-r--r--Build/source/texk/xdvipdfmx/src/tfm.h57
-rw-r--r--Build/source/texk/xdvipdfmx/src/truetype.c999
-rw-r--r--Build/source/texk/xdvipdfmx/src/truetype.h33
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_aux.c297
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_aux.h35
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_cmap.c1906
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_cmap.h80
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_glyf.c670
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_glyf.h60
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_gsub.c1666
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_gsub.h67
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_post.c265
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_post.h53
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_table.c479
-rw-r--r--Build/source/texk/xdvipdfmx/src/tt_table.h193
-rw-r--r--Build/source/texk/xdvipdfmx/src/type0.c685
-rw-r--r--Build/source/texk/xdvipdfmx/src/type0.h56
-rw-r--r--Build/source/texk/xdvipdfmx/src/type1.c811
-rw-r--r--Build/source/texk/xdvipdfmx/src/type1.h33
-rw-r--r--Build/source/texk/xdvipdfmx/src/type1c.c741
-rw-r--r--Build/source/texk/xdvipdfmx/src/type1c.h33
-rw-r--r--Build/source/texk/xdvipdfmx/src/unicode.c113
-rw-r--r--Build/source/texk/xdvipdfmx/src/unicode.h36
-rw-r--r--Build/source/texk/xdvipdfmx/src/vf.c1045
-rw-r--r--Build/source/texk/xdvipdfmx/src/vf.h35
-rw-r--r--Build/source/texk/xdvipdfmx/stamp-h.in1
-rw-r--r--Build/source/texk/xdvipdfmx/style_base.css367
-rw-r--r--Build/source/texk/xdvipdfmx/style_dflt.css95
-rw-r--r--Build/source/texk/xdvipdfmx/style_ie.css14
-rw-r--r--Build/source/texk/xdvipdfmx/style_plain.css77
211 files changed, 110519 insertions, 0 deletions
diff --git a/Build/source/texk/xdvipdfmx/AUTHORS b/Build/source/texk/xdvipdfmx/AUTHORS
new file mode 100644
index 00000000000..daf8e99c1d8
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/AUTHORS
@@ -0,0 +1,5 @@
+Authors of dvipdfmx: Jin-Hwan Cho and Shunsaku Hirata,
+the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>.
+
+The original dvipdfm was written by:
+Mark Wicks <mwicks@kettering.edu>, Kettering University, Flint, MI.
diff --git a/Build/source/texk/xdvipdfmx/BUGS b/Build/source/texk/xdvipdfmx/BUGS
new file mode 100644
index 00000000000..65f14244105
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/BUGS
@@ -0,0 +1,29 @@
+$Header: /home/cvsroot/dvipdfmx/BUGS,v 1.9 2004/06/15 17:26:29 hirata Exp $
+
+BUGS: The bug list for dvipdfmx
+===============================
+
+Last modified: June 16, 2004
+
+
+ o CID-Keyed Font (CIDFontType 0)
+
+ CID-Keyed font support is limited to CFF/OpenType format font.
+ Only Type 2 charstring is supported. The 'random' operator is not
+ implemented.
+
+ o TrueType (CIDFontType 2)
+
+ GSUB support:
+
+ Ignores Script and LangSys table. Only `vert' feature is supported.
+ `smple' and `trad' support for Chinese, `jp78', `jp83', and `jp90'
+ variant support for Japanese may be needed.
+
+ o Type 1
+
+ seac, ghost hint...
+
+ o Dvipdfmx don't handle include images correctly if images are
+ included multiple times but with different bounding box.
+
diff --git a/Build/source/texk/xdvipdfmx/COPYING b/Build/source/texk/xdvipdfmx/COPYING
new file mode 100644
index 00000000000..60549be514a
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/texk/xdvipdfmx/ChangeLog b/Build/source/texk/xdvipdfmx/ChangeLog
new file mode 100644
index 00000000000..407eeccab5f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/ChangeLog
@@ -0,0 +1,1888 @@
+$Header: /home/cvsroot/dvipdfmx/ChangeLog,v 1.140 2005/10/14 04:57:33 chofchof Exp $
+
+ChangeLog: Changes for dvipdfmx
+===============================
+
+2005-10-14 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * spc_tpic.c:
+ Fix a bug on spc_handler_tpic_bk() and spc_handler_tpic_wh();
+ reported by Akira Kakuto.
+
+2005-08-31 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfdoc.c, pdfdraw.c:
+ Stroke and fill color controls with gsave and grestore.
+
+2005-08-30 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfdraw.h, pdfdraw.c, mpost.c:
+ Fix a bug on MetaPost manipulation.
+
+ * pdfobj.c:
+ Allow PDF images generated from Mac OS X.
+
+ * truetype.c:
+ Fix a bug on PK Type3 font.
+
+2005-08-24 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * spc_pdfm.c:
+ Fix a bug on finding XObject.
+
+2005-08-23 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfdraw.h, pdfdraw.c:
+ Fix a bug on matrix concatenation and inverse matrix.
+
+ * spc_pdfm.c:
+ Fix a bug on giving object name in image.
+
+2005-08-15 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfdoc.c, spc_pdfm.c, specials.c:
+ Fix a bug on article|bead|thread specials.
+
+2005-08-14 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * spc_html.c, spc_pdfm.c, specials.c:
+ Fix a bug causing memory leak, and correct a typo.
+
+2005-08-12 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfdev.c, pdfdev.h, spc_dvips.c, spc_pdfm.c, spc_util.c:
+ Modified transform_info structure using pdf_tmatrix.
+
+2005-08-11 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfdoc.c, pdfdraw.c, pdfdraw.h, spc_pdfm.c:
+ Optimization of changing transform matrices.
+ The "pdf:literal" special works almost same as pdfTeX's
+ "\pdfliteral" primitive. But "pdf:literal direct" is slightly
+ different from pdfTeX's "\pdfliteral direct". It does not
+ affected by "pdf:literal".
+
+2005-08-08 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * spc_pdfm.c:
+ Test implementation of \special{pdf:literal ...}.
+
+ * spc_misc.c:
+ Ignores \special{pos: ...} too.
+
+ * spec-dpx.tex:
+ Modified to fit the changes introduced in 2005-08-08.
+
+2005-08-02 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * dvi.c, spc_pdfm.c:
+ Fixed a few bugs introduced by changes in 2005-08-01.
+
+ * dvipdfmx.def, spec-dpx.tex:
+ Modified to fit the changes introduced in 2005-08-01.
+ ConTeXt module still has a bug, e.g., \handleMPfshow.
+
+2005-08-01 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * specials.c, spc_html.c, spc_pdfm.c:
+ Various minor changes to specials.
+ Rewriting HTML special support.
+
+2005-07-31 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * specials.c:
+ Fixed a bug introduced by changes in 2005-07-30.
+ (@page1 not handled correctly)
+
+2005-07-30 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * colors.h: removed
+ Color definitions placed into spc_util.c.
+
+ * pdfdev.c, pdfdraw:
+ Various changes.
+
+ * pdfcolor, pdfdoc:
+ set_bgcolor pdfcolor --> pdfdoc.
+
+ * cid.c:
+ Force fixedpitch option for printer/acro fonts.
+
+ * spc_*, specials.c:
+
+ * And many others....
+
+2005-07-28 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfdev.c:
+ Simply use sprintf for printing numbers.................
+ Fixed an ancient bug causing very frequent (unnecessary)
+ font selection.
+
+2005-07-21 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfencoding.c: Fixed bugs.
+
+ * truetype.c: Update and various changes.
+ Apply ligature GSUB for glyph name "a_b" and glyph names
+ with AGL mapping to multiple Unicode character sequence.
+ Suffixes "liga", "dlig", "frac" ... are always recognized
+ as feature tag for glyph composition. But for "a_b.vert",
+ dvipdfmx first compose glyph "a_b" (by some way) and then
+ apply "vert" substitution to composed glyph. It may often
+ behaves unexpectedly. Suffixes like "aalt1" is treated as
+ alternate substitution; e.g., "a.salt1" is interpreted as
+ first stylistic alternate of default glyph for "a". Those
+ features are just for completeness. (esp. alternate GSUB)
+ Reorganized various process of finding glyphs, but still
+ complicated. TTC is supported (but index is always 0).
+
+2005-07-20 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdffont.c:
+ Minor changes.
+
+ * pkfont.c:
+ Mostly rewritten. Allow .enc file to be specified
+ in fontmap. But it is not for reencoding but to get
+ glyph names for ToUnicode creation.
+
+ * dpxfile.c:
+ Check file type.
+
+ * pdfcolor.c, vf.c: Don't use strcasecmp, strncmp.
+
+2005-07-18 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfximage.c:
+ Set image format conversion filter to NULL if empty
+ string "" is given. Put various system dependent things
+ into dpxfile.c.
+
+ * dpxfile.c:
+ Creation of temporary files, call other program
+ via system() to apply filter to file.
+
+ * dpxconf.c, dpxconf.h: new files
+ Currently paper format related codes.
+
+ * dvipdfmx.c: cleanup
+ Papersize handling --> dpxconf.c
+ Removed undocumented extension for page label.
+
+ * dvipdfmx.c:
+ 's' option for MPS-to-PDF conversion mode. Treat page
+ numbers as suffix. For "dvipdfmx -M -s 1-3 foo",
+ dvipdfmx first tries to open "foo". If "foo" exists,
+ it then start conversion of "foo" (ignore 's'), if not,
+ "foo.1", "foo.2", and "foo.3" is searched and multi-page
+ PDF file is generated.
+
+2005-07-17 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * spc_dvips.c:
+ Fixes in psfile special.
+
+2005-07-17 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dpxutil.c, dpxutil.h:
+ Added few functions to make fontmap.c independent
+ from pdfparse.c. Various parse_xxx from pdfparse.c.
+ mangle_name() removed.
+
+ * pdfparse.c, pdfparse.h, dpxutil.c, dpxutil.h, ...:
+ Several parsing routine moved to dpxutil.c.
+ parse_c_ident() is not really for "C" ident.
+ parse_c_string() is not really for "C" string.
+ And there are too many unclear parse_xxx routines
+ unrelated to PDF in "pdfparse".
+ There are many uncertainty in parsing \special too.
+
+ * spc_xxx:
+ skip_white() wrongly used in many places.
+ skip_white() skips from '%' to newline...
+
+ * pdf:tounicode, pdf:mapfile, and pdf:mapline
+ using very different syntax than other pdf:
+ prefix specials.
+
+ * dvi.c, pdffont.c:
+ Minor changes in debug and error message.
+
+ * psimage.c, psimage.h, t1crypt.c, t1crypt.h: Removed.
+
+ * t1_load.c: Merge t1crypt
+
+ * pdfximage.c, pdfximage.h: Merge psimage
+ psimage.c is not really for PostScript support.
+ It just call external program to do conversion form
+ PS to PDF. There are no reason to restrict this to
+ from-PS conversion.
+
+ * fontmap.c:
+ Do not use pdfparse.c. Added 'u' option to specify
+ "ToUnicode". This is for testing. Don't use this.
+
+ * pdffont.c:
+ Read ToUnicode CMap specified in fontmap.
+
+ * spc_util.c: HSB color...
+ Converted to RGB.
+
+ * cidtype0.c, cidtype2.c:
+ Do not use mangle_name in dpxutil.c.
+
+ * Various fixes related to pdflimits.h:
+ This only contains PDF_NAME_LEN_MAX.
+
+2005-07-16 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * fontmap.c, fontmap.h
+ Create fontmap entries for each subfont, containing
+ SFD mapping information and "link" to fontmap entry
+ "foo@SFD@". Removed pdf_lookup_fontmap_record2().
+
+ * dvi.c, mpost.c, pdfdev.c:
+ Modification needed by changes in fontmap handling.
+
+ * spc_pdfm.c:
+ Minor changes in fontmap specials. Fixed leak in
+ "append" fontmap.
+
+ * subfont.c, subfont.h:
+ Minor fixes and changes.
+
+ * mpost.c: Bug fix.
+ Fixed a bug (typo) in mp_setfont.
+
+2005-07-14 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * subfont.c, subfont.h:
+ xxx_sfd_yyy -> sfd_xxx_yyy
+ Added code for testing SFD file handling.
+ Added various comments.
+
+ * fontmap.c:
+ Check if subfont ID is valid before loading
+ SFD mapping table for subfonts.
+ Changes related to the above changes in subfont.c.
+
+2005-07-13 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dvipdfmx.c: minor fix
+ agl_set_verbose() called in pdffont.c too.
+
+ * fontmap.c:
+ Workaround for problems in subfont fontmap lookup.
+ Delete all conflicting explicit fontmap entries for
+ subfonts in pdf_insert_fontmap_record() when adding
+ fontmap entry with @SFD@ extension.
+
+ * subfont.c, subfont.h:
+ Scan SFD file for valid subfont IDs. (Required by
+ changes made to fontmap.c mentioned above.)
+ Removed unnecessary file static variables.
+ Simplified file reading and parsing.
+
+ * dvi.c: set_verbose() for subfont.c
+
+ * fontmap.c:
+ Correctly handle fontmap entry like "dmj@DNP@12".
+
+2005-07-11 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * agl.c: Fixed various small bugs
+
+2005-07-09 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * fontmap.c, fontmap.h, pdfdev.c: Fake-bold again
+ 'b' option. This is experimental feature.
+
+ * pdfdev.c:
+ Graphics state is not properly managed yet.
+ Fake-bold and set_rule changes linewidth without
+ using pdf_dev_setlinewidth().
+ Enclose set_rule with q and Q.
+
+ * agl.c: Removed unused variable
+
+2005-07-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_cmap.c: Bug fix
+ Format 12 cmap subtable support not working...
+
+ * fontmap.c: Test for UCS-4
+ 'p' option to specify UCS plane.
+ This is just for testing purpose. Don't use that.
+
+2005-07-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_cmap.c: Bug fix in ToUnicode creation
+ ToUnicode CMap creation (inversion of TrueType cmap) was
+ not working for format 12 cmap subtable.
+
+2005-06-27 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cid_basefont.h:
+ Add missing font definitions.
+
+ * data/config/dvipdfmx.cfg:
+ Forgot to mention that 'D "..."' line is commented.
+ Now there are no default setting for image converter,
+ so PS inclusion will always fail unless you modify
+ dvipdfmx.cfg.
+
+2005-06-26 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * data/config/cid-x.map: empty
+ Contained examples for fonts with unclear license.
+ Not maintained for a long time.
+
+ * data/CMap/Adobe-Identity-UCS2: removed
+ Wrongly named file. Content of this file is
+ actually identity mapping.
+
+ * type0.c:
+ Create dummy ToUnicode CMap "Adobe-Identity-UCS2".
+
+ * specials.c:
+ spc_push_object() always create label for objects.
+ Objects created with pdf:obj should always be written
+ to output.
+
+ * ainclude.m4, configure.in:
+ Define __TDS_VERSION__, require xbasename in kpathsea,
+ removed unused macros, simplified.
+
+ * dpxfile.c:
+ Use __TDS_VERSION__ instead of HAVE_KPSE_ENC_FORMAT
+ and others.
+
+ * dvipdfmx.c:
+ Alwyas use xbasename().
+
+ * fontmap.c, fontmap.h:
+ Fake bold and OTL options removed.
+
+ * otl_conf.c:
+ Deactivated.
+
+ * pdfdev.c:
+ Fake bold option removed. (undocumented)
+
+ * configure.in, acinclude.m4:
+ Various changes. Error if kpathsea library doesn't
+ have xbasename().
+ Define __TDS_VERSION__, removed HAVE_KPSE_XXX_FORMAT.
+
+ * configure and others: recreated
+
+2005-06-20 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_gsub.c, tt_gsub.h: Alternate substitution
+ LookupType 3 (Alternate Substitution) GSUB lookup.
+ Unused.
+
+2005-06-13 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_gsub.c:
+ Added support for LookupType 7 (Extension Substitution).
+ Large CJK fonts may want them. Not tested well.
+
+2005-06-09 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_glyf.c:
+ Set top-side bearing to (sTypoAscender - bbox.ury) for
+ fonts without vmtx table (vertOriginY = sTypoAscender).
+
+2005-06-09 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dpxfile.c:
+ Fixes for old kpathsea library.
+
+2005-06-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dpxfile.c, dpxfile.h:
+ Fallback to old path searching behaviour.
+ Warn about files found in old location.
+
+ * dvipdfmx.c:
+ set_verbose() for dpxfile.
+
+2005-06-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cid_basefont.h: Update for Adobe Reader 7
+
+ * cid.c, pdfobj.c: Accept version tag 1.6
+
+2005-06-06 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * acconfig.h: removed
+
+ * data/CMap/glyphlist.txt: --> data/config/
+ No appropriate place yet.
+
+ * cmap_read.c:
+ Fixed a bug in reading CIDSystemInfo dict.
+
+ * pdfencoding.c, pdfencoding.h:
+ pdf_load_ToUnicode_stream(). Load ToUnicode CMap from file and
+ then create ToUnicode stream object.
+ See also changes in truetype, type1, type1c, and pdffont.
+
+ * pdffont.c:
+ First try to load ToUnicode CMap with file name 'tfm_name'.
+ See also changes in truetype, type1, type1c, and pdfencoding.
+
+ * truetype.c, type1.c, type1c.c
+ Don't create ToUnicode if fontdict already have them.
+ See also changes in pdffont and pdfencoding.
+
+ * Makefile.am, data/Makefile.am, src/Makefile.am:
+ Fixes, simplified, updated...
+ There are problems in data/Makefile.am yet. Installation
+ directory for .map and .cmap is not correctly set.
+
+ * Makefile.in and others: recreated
+
+ * configure.in:
+
+2005-05-07 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * spc_color.c:
+ Color special without push/pop allowed?
+
+ * spc_pdfm.c:
+ pdf:literal broken for more than 2 years?
+ Fixed a bug in creating annot.
+
+ * data/config/dvipdfmx.cfg:
+ Comments...
+
+2005-05-04 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * README: update
+
+ * pdfparse.c:
+ There were several problems in handling broken PDF files.
+
+ * pdfobj.c:
+ There were several problems in handling broken PDF files.
+ Stream dict is freed twice when parsing stream object failed.
+
+ * tfm.c:
+ PK font creation was not working due to incorrect design size
+ value returned by tfm_get_desing_size().
+
+ * index.html:
+ Update and fixes for links. Many sentences doesn't make sense
+ when the document is printed. Stylesheet default to "plain"
+ style. Encoding set to "utf-8".
+
+ * style.css: renamed to style_dflt.css
+
+ * style_plain.css:
+ Plain style stylesheet.
+
+2005-03-07 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfcolor.c:
+ Color not correctly reset at page break?
+ Maybe more bugs...
+
+ * pdfdoc.c:
+ Encapsulating docxxx within single struct pdf_doc.
+
+2005-03-05 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * mpost.c:
+ Text handling was not correct for subfonts.
+
+ * pdfencoding.c:
+ Increased verbose level for ToUnicode warning.
+
+2005-02-03 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * otl_conf.c, spc_pdfm.c:
+ Fixed remaining bugs related to MiKTeX file searching.
+
+ * cvs tag: DVIPDFMX-20050201 (revised)
+
+2005-02-01 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * cidtype2.c:
+ Fixed a critical bug on the DW entry for CIDType2 fonts.
+
+ * cvs tag: DVIPDFMX-20050201
+
+2005-01-06 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * dvi.c: Fixed a bug on converting subfont character numbers.
+
+ * snapshot: two snapshots
+ DVIPDFMX-20040824 (release): before full update
+ DVIPDFMX-20040912 (current): with the bug fix on 2005-01-06
+
+2004-09-12 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * specials: rewriting...
+ All \special related files renamed to spc_xxxx and specials.
+ Use function pointer table rather than doing everything with
+ if-else or switch-case.
+
+ * pdfparse.c:
+ Few functions are expelled from pdfparse.c since they are not
+ related to PDF parse at all. pdfparse still contains dvipdfmx
+ only extension and they might be enabled even when parsing
+ ordinary PDF files.
+
+ * spc_pdfm, pdfparse:
+ tounicode special moved to spc_pdfm.
+
+2004-09-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * ttf, tt_*:
+ ttf.[ch] -> truetype.[ch], renamed few files, added tt_post.
+
+ * unicode, pdfencoding:
+ ToUnicode support migrated to pdfencoding.
+
+2004-09-05 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfencoding: encodings -> pdfencoding
+
+ * bug fixes.
+
+ * pdflimits: This was not pdflimits nor implementation limit
+ of PDF viewers at all.
+
+2004-09-02 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pngimage, jpegimage:
+ Improvement on embedded ICC profile support.
+ Profiles with same MD5 checksum are shared among images.
+
+ * pdfcolor:
+ Added something for managing color space resources.
+
+ * pkfont.c:
+ Depends on tfm.c again.
+
+2004-08-30 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfdoc, pdfdev:
+ Mostly independent from dvi interpreter.
+ pdfparse still depend on dvi.c through pdfspecial.c due to
+ pdf: special @xpos and @ypos.
+
+ * pdfdraw:
+ Primitive graphics drawing functions and graphics state
+ management: pdf_dev_moveto, pdf_dev_gsave, pdf_dev_lineto,
+ pdf_dev_flushpath, and so on (migrated from mpost.c).
+ PostScript, tpic, and all other graphics specials should not
+ directly access page content stream but must use those
+ functions instead. Text state and colors are still managed
+ completely differently.
+
+ * Added many comments in source and headers...
+
+ * Rearranged initialization process again.
+ pdf_init_fontmap: Initialize fontmapping database.
+ pdf_open_document: Open output file, initialize various
+ document resource handler, and set default media size...
+ pdf_init_device: Unit conversion, precision and others.
+ pdf_doc_begin_page: Initialize graphics state, etc.
+
+2004-08-27 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cidtype0.c:
+ Fixed several bugs in Type1 and CFF -> CID CFF converison.
+ There might be more bugs...
+
+ * doc/dpxunicode.pdf: Update.
+
+2004-08-24 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cid_basefont.h: Bug fix
+ Added missing '['.
+
+ * doc/dpxunicode.pdf: Update
+
+ * tt_cmap.c:
+
+2004-08-22 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * otl_conf.[ch]: New file
+ OTL feature is managed by configuration file.
+
+ * fontmap.c:
+ -S and -L option removed. Added option -l.
+
+ * doc/dpxunicode.pdf: Update.
+
+2004-08-16 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Unicode support for CID OpenType.
+
+2004-08-15 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * fontmap.c:
+ -f option changed to -S. Added -L for ligature substitution.
+
+ * tt_gsub.c and others: New fontmap option -L
+ Map ligatures not in Unicode to PUA.
+ ToUnicode support handle substituted glyphs.
+ See, doc/dpxunicode.pdf for details.
+
+2004-08-14 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * otl_opt.[ch]: New file
+ Handle fontmap options for OTL features.
+
+2004-08-11 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c: Bug fix.
+ The seac operator support was broken since 2004-8-02.
+
+ * fontmap.c: New fontmap option "-f tag" and "-b number".
+ Specify OpenType layout feature with -f option for "unicode"
+ endoding font. Glyph substituion specified by -f option is not
+ reflected in ToUnicode CMap yet. Only single substitution GSUB
+ subtable is supported.
+ The "-b" option specifies "boldness" parameter for fake-bold
+ (stroke line width of fill-then-stroke text).
+
+ * ...:
+ Changes for new features mentioned above.
+
+2004-08-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_cmap.c, cidtype0.c: Bug fixes
+
+2004-08-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Makefile.in, Makefile.am:
+ cmap_parse --> cmap_read.
+
+ * cmap_parse.[ch]: Remaned to cmap_read.[ch]
+
+ * cmap_write.[ch]: New file
+ Create CMap PDF stream object. Output is not efficient yet.
+
+ * dvi.c: Bug fix
+ Multiply pdf:pagesize special page height and page width by DVI
+ magnification factor.
+
+ * agl.[ch], unicode.[ch], ....:
+ Use cmap_write.
+
+ * dpxfile.[ch]: New file
+ .....
+
+2004-08-07 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Type1 font accept "unicode" encoding.
+ Converted to CIDFontType 0 CIDFont.
+
+2004-08-02 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * New files: t1_load.[ch], t1_char.[ch]
+ type1.c --> type1.c, t1_load.c, t1_char.c.
+ t1_load: load Type1 font (PFB) into cff_font structure.
+ t1_char: type 1 charstring interpreter and type 1 to type 2
+ charstring converter (type 2 encoder). There are many duplicated
+ code in cs_type2 and t1_char.
+
+2004-07-31 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * New files: pdfdraw.[ch], pdfcolor.[ch]
+
+ * mpost.c, tpic.c:
+ Use pdfdraw and pdfcolor.
+
+ * pdfdev.c:
+ CTM affects box calculation in dev_expand_box(). Special
+ bann/eann set correct bounding box for rotated text.
+
+ * New keyword "unicode" in fontmap:
+ The keyword "unicode" can be specified as encoding in fontmap.
+ With this option dvipdfmx creates Unicode-to-GID mapping CMap
+ and GID to Unicode (ToUnicode) CMap from TrueType cmap table
+ (format 4 Windows-UCS2 and format 12 Windows-UCS4 subtable is
+ supported) for TrueType font. All font with encoding "unicode"
+ is treated as Type0 font.
+ Currently supported only for Unicode TrueType font.
+
+
+2004-07-27 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Many bug fixes.
+
+ * fontmap.c: Bug fix.
+ Do not increment num_fontmap when replacing duplicate
+ entries.
+
+ * mpost.c:
+ Support PS operator findfont etc. Not compatible with dvips.
+
+2004-07-18 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * fontmap.c:
+ Add/replace/remove fontmap entries.
+ Added fontmap_add_map_record(). Scan single mapfile line.
+
+ * fontmap.c, pdfdev.c:
+ fontmap_tex_name(), ... abort if invalid value is passed.
+
+ * psspecial.c: bmpfile special
+ This is not PS special...
+
+ * pdfobj.[ch], pdfspecial.c:
+ Added pdf_copy_object(): Copy object data without changing
+ object label. Dvipdfmx now can handle pdf specials like:
+
+ \special{pdf:obj @foo << /Bar @bar >>}
+ \special{pdf:obj @bar << /Foo @foo >>}
+
+ Object reference can appear before definition of object.
+
+2004-07-15 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cidtype2.c, type0.c:
+ Write CID glyph metrics for non-embedded TrueType fonts.
+
+ * dvipdfmx.c, cidtype0.[ch], cidtype2.[ch], cid.[ch]:
+ Treat all CIDFont as fixed pitch font if bit 0x0004 is set
+ in "-C" option. (for backward compatibility)
+
+2004-07-14 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * New files: bmpimage.c, bmpimage.h
+ Windows BMP image format support. (not tested well...)
+ 1/4/8/24-bits per pixel images, uncompressed or 4-bit/8-bit RLE
+ compressed images are supported.
+
+ * pdfparse.c:
+ Added dictionary key "T" to the list of strings to be
+ converted to Unicode...
+
+2004-07-12 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dvipdfmx.c:
+ Added new option "-C".
+ Thumbnail support available again.
+
+ * tpic.c, tpic.h:
+ Spline path ("sp" command) was not handled correctly.
+ Use (semi-)transparent color for shading, enabled by option
+ -C 2. (not enabled by default since it requires PDF version
+ 1.4+) Apply shading only to closed paths.
+
+ * psspecial.c:
+ epsbox support was broken.
+
+ * pdfdoc.c: Thumbnail supported again
+
+2004-07-04 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * configure, ...:
+ HAVE_KPSE_OPENTYPE_FORMAT and HAVE_KPSE_ENC_FORMAT is not
+ correctly set when compiled with gcc3.
+
+2004-06-28 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfximage.c:
+ Do not clip PDF images when "clip" option is not given.
+
+2004-06-27 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Workaround for "three dot leader" problem.
+
+2004-06-16 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Do not adjust refernece point of included images if users do
+ not supply bounding box.
+
+ * Look for .ofm first.
+ Workaround for incompatibility introduced on change 2004-01-20.
+
+ * pdfdoc.c: Fixed bug that dvipdfmx crushes with null string key in
+ name tree.
+
+2004-06-02 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * pdfspecial.c: Bug fix on cropbox in do_bxobj().
+
+2004-05-03 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * jpegimage.c: Uninitialized variable.
+
+2004-04-09 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * README, index.html: update
+
+ * contrib/patches/glyphlist-cm-add.txt: new file
+ Additional glyphlist for Computer Modern font.
+
+ * NEWS: new file
+ Empty.
+
+ * pdfdev.c:
+ Do not increase line width.
+
+2004-04-03 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * README: update
+
+2004-03-25 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * jpegimage.c: ICC profile
+ Added APP2 ICC_PROFILE support.
+ ICC profile is not deleted from JPEG stream.
+
+ * Embedded ICC profile support for JPEG and PNG enabled.
+ ICC profiles are not cached. Alternate color space?
+
+2004-03-24 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Thumbnail support removed.
+
+ * index.html:
+ Quick check against WCAG 1.0. Lowercasified all HTML tags for
+ migration to XHTML.
+
+ * pdfdoc.c:
+ Dvipdfm/dvipdfmx copyright notice remved from PDF Docinfo's
+ /Producer string, simplified to "dvipdfmx (VERSION)".
+
+ * configure.in, configure:
+ Minor change.
+
+2004-03-22 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pngimage.c: Minor changes.
+
+ Remaining things for complete PNG 1.1 support is:
+ Complete iCCP support. Support tEXt and other metadata chunks
+ using XML Metadata stream. pHYS (and oFFs) support (in ebb).
+ Preserve filter (PNG predictor) if possible, but some softwares
+ using filters very inefficiently. 16-bit RGB/Gray (PDF-1.5).
+
+ JPEG (JFIF) can also store ICC profile with APP2. Implementing
+ very basic ICC profile support might be useful.
+
+2004-03-21 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * README: updated
+
+ * data/config/cid-x.map:
+ "slant" option -s supported in vertical mode.
+
+ * pngimage.c: Fixed a serious bug, more chunks supported.
+
+ Gamma obtained by png_get_gAMA() is inverse of screen gamma
+ that the image is prepared. Gamma is sometimes inverted...
+
+ Approximated CalRGB color space used along with /Intent if
+ sRGB chunk is found (not sure how to treat it).
+
+ Experimental iCCP support --enable-iccp.
+ Doesn't validate ICC profile embedded in PNG.
+ Range? Rendering Intent?
+
+ * pdfdev.c:
+ A line width of zero means thinnest line drawable in target
+ device. dev_rule() was wrongly changed to increase line width
+ if the width is too thin.
+
+2004-03-20 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * unicode.c, agl.c, type0.c: ToUnicode CMap support
+
+ Always create ToUnicode CMap for simple fonts regardless of
+ the existence of glyph list file. If 10% of glyph names can
+ not be converted to Unicode, ToUnicode CMap is not embedded.
+ The reason for the (non-zero) limit 10% is; ToUnicode CMap
+ is shared among fonts using same .enc file. In this case,
+ Unicode mapping is created for all glyphs in the .enc file
+ where non-standard glyph names like "visiblespace" is often
+ expected. But those glyphs are usually not used in the TeX's
+ output and hence it should be simply ignored if mapping is
+ not available.
+ Sharing ToUnicode CMap is not so efficient as expected for
+ simple fonts, "subsetted" ToUnicode CMap might be better.
+
+ type0.c search ToUnicode CMap named as REGISTRY-ORDERING-UCS2
+ or FONTNAME-UCS2, the latter case is for CIDFontType 2 font
+ using font's internal glyph ordering. It does not care about
+ the content of CMap at all, especially usecmap is not checked.
+ Don't use it.
+
+ * README, data/config/cid-x.map:
+
+ Description about -m option removed from README.
+ This option is no longer necessary for usual cases, and use
+ of it is not recommended as the original dvipdfm fails to read
+ fontmap file with this option.
+
+ * cmap.c:
+
+ Increment n-1 th byte if n-th byte overflow in bfrange like:
+
+ <00> <01> <00 FF>
+
+ The dstCode string is treated like an integer, but the number
+ of bytes required for that character code is not increased.
+ Acrobat's "ToUnicode" CMap contains such bfrange entries and
+ causing a serious problem in Korean TrueType fonts.
+
+2004-03-18 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfspecial.c:
+ pdf:literal direct should not translate origin.
+
+2004-03-17 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c, type1c.c, cmap.c, ...: Memory leak.
+
+2004-03-16 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * mpost.c, psspecialc.: Fixed bugs.
+
+2004-03-14 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dvipdfmx.c:
+ Scan first page's paper size special first.
+
+ * pdfparse.c: \x in PDF string - broken
+
+ This (undocumented) extension to the PDF string object disturbs
+ and interrupts PDF object parsing and subsequent text re-encoding
+ specified by tounicode special (another extension). And it makes
+ impossible to separate parsing and re-encoding process ("x" after
+ backslash representing Unicode hex value...).
+
+ Support for this extension was removed since it is desirable to
+ move (or isolate) tounicode special to the appropriate place, not
+ pdfparse but pdfspecial, if possible.
+
+ Note that this kind of extension might be incompatible with all
+ other PDF applications, "\x" should be treated as a single "x" in
+ literal strings (like PostScript).
+
+ * pdfspecial.c: Special image/uxobj is partially broken.
+
+ Special uxobj doesn't work for external images after the change
+ made on 2003-08-12. It only works for the grabbed page contents
+ created by special bxobj/exobj.
+
+ Access to XObject reference (but can't be placed in the document)
+ is now available again. Supporting uxobj is usually not necessary
+ for external images because they are always reused as a document
+ resource but allowing access to the (form) XObject's indirect
+ reference by name like @foo is usefull for using them as an entry
+ of appearance dictionary in annotations.
+
+ * pdfspecial.c, pdfdev.c:
+
+ Special bann/eann does not take account of current transformation
+ matrix correctly. It result in incorrect /Rect for all annotations
+ created by special bann/eann if transformation is applied.
+
+ Not fixed yet.
+
+ * pdfparse.c: "ToUnicode" special
+
+ Illegal PDF string is expected within pdf: specials. Many users
+ try to use raw Shift-JIS text without properly escaping backslash
+ appears in the 2nd byte of double-byte character. The same problem
+ occurs in many other encodings.
+
+ As a workaround for this problem, backslashes are not treated as
+ "escape" in some situation when the current "ToUnicode" CMap name
+ contains a substring RKSJ, B5, GBK, or KSC.
+
+ * cmap.c, ...:
+
+
+2004-03-12 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * mpost.c:
+ Skip until %%EndProlog.
+
+ * pdfspecial.c, pdfdev.c, pdfdoc.c:
+ pdf_doc_set_mediasize()/pdf_doc_get_mediasize().
+
+ * tfm.c
+ tfm.c was highly wasteful and inflexible.
+ Preparing for 31-bits character code support.
+
+2004-03-11 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dvipdfmx.c, dvi.[ch], pdfdev.[ch], pdfdoc.[ch],...:
+ An effort to eliminate complicated initilization chain...
+
+ * pdfximage.c, pdfximage.h: New file.
+ An effort to make image support more flexible.
+ Included images and grabbed page contents (forms) should be managed by
+ pdf_ximage as document resource (like font).
+
+ * pdfspecial.c, psspecial.c:
+ Image support moved to pdfximage. (might be broken)
+
+ * mpost.[ch], epdf.[ch], pngimage.[ch], jpegimage.[ch], psimage.[ch]:
+ Image support moved to pdfximage.
+
+ * dvipdfmx.c, mpost.[ch]:
+ Experimental "mpspdfmx" mode -M.
+
+ * pdfspecial.c, pdfdev.c, pdfdoc.c:
+ Hard to explain... There are many misleading/illogical things.
+
+ * dvipdfmx.c, dvi.[ch]:
+ DVI specials related to page/paper size is pre-scanned.
+
+ * dvipdfmx.c:
+ Page selection option "-s" accept page labels.
+ For example, command line option "-s 1-10/r,11-12/D:2:empty-page-,13-"
+ set page labels for page 1-10 to lowercase roman numerals, page 11-12
+ to arabic numerals starting with 2 and with prefix "empty-page-",...
+
+ * dvipdfmx.c:
+ An option for "bookmark open lavel" -O.
+
+ * pdfdoc.c:
+ Undocumented watermark/page decoration feature. Not completed yet.
+
+ * thumbnail.c:
+ I can hardly think that thumbnail support is useful. Acrobat Reader
+ can create thumbnail image and other PDF viewers like gs* and Xpdf
+ doesn't support it. Currently broken due to changes in pngimage.c.
+
+ * dvipdfmx.c, pdfdev.c:
+ The default precision set back to 2 fractional digits. Most sensitive
+ part is dev_set_string() but the accuracy of this part is essentially
+ limited to 0.01 point in the most cases. Increasing precision above 2
+ does not give good result (except DVI rules) but merely increases file
+ size.
+
+2004-03-05 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfdoc.c:
+ Fixed a critical bug introduced on change 2004-02-29:
+ Consistency check was done after pages are free-ed.
+
+ * pdfdoc.c, pdfspecial.c:
+ special pdf:names. Add name tree entry.
+
+ * pdfobj.c, pdfparse.c:
+ Few functions added for manipulating PDF array.
+
+2004-03-04 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfparse.c: Added missing () in macro PDF_TOKEN_END()
+
+ * pdffont.c: Compiler warning on uninitialized variable.
+
+2004-03-02 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Groff support:
+ Groff support was essentially broken. Dvipdfm(x) generated
+ very inaccurate result due to incorrect choice of scale/unit.
+ It should be fixed now.
+
+2004-02-29 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfspecial, pdfdoc, pdfobj, pdfparse:
+ Partially rewrote...
+
+ * pdfdoc.c:
+ Moved static ... to static struct { ... } docXXX.
+ Removed (strange) optimization.
+ Outline item open/close.
+
+ * tfm.c:
+ Partially rewote...
+
+2004-02-25 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Too many warnings when compiled with -Wshadow...
+ pdfdoc.c need to be fixed.
+
+ * -Wmissing-prototypes, -Wmissing-declarations
+
+2004-02-21 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type0.c:
+ Changes for New TDS/kpathsea.
+ Fixed a bug in get_tounicode_cmap()...
+
+2004-02-19 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cidtype0.c, type0.c:
+ Write CID glyph metrics for non-embedded CFF/OpenType fonts.
+
+2004-02-18 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tpic.c:
+ Ignore unpainted path in flush_path().
+ show_path() output 'n' operator for path without stroking nor filling
+ to avoid Acrobat error (bug?) "Illegal operation inside a path.".
+
+2004-02-17 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pkfont.c, pkfont.h, pdfdev.c:
+ Removed dependency to TFM in pkfont.
+
+ * type1.[ch], type1c.[ch], type0.[ch], ttf.[ch]:
+ No longer need to know font resource name and remap.
+
+ * pdffont.c, pdffont.h:
+ Added new file.
+
+ * type1.[ch], type1c.[ch], ttf.[ch], pkfont.[ch], pdfdev.c, dvipdfmx.c:
+ Simple font support will be unified to pdffont.c
+
+2004-02-16 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c, type1c.c, cidtype0.c:
+ Remove UniqueID and XUID from CFF Top dict.
+
+ * type1.c:
+ Keep original FontBBox instead of replacing it with tight one obtained
+ from glyph's charstrings to prevent Acrobat 4 from greeking text.
+ Acrobat 4 may display text drawn with fonts which only contain small
+ glyphs like period and minus-sign with greeked text.
+
+ * tt_build.c:
+ TrueType output slightly optimized.
+
+ * ttf.c, cidtype2.c:
+ Preserve 'name' table when embedding TrueType font.
+
+2004-02-15 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1c.c, cs_type2.c, cs_type2.h, cidtype0.c:
+ Dependency to TFM removed. Widths are obtained from font file.
+
+ * type1c.c:
+ Delete unused strings from CFF string index.
+
+ * tfm.c, tfm.h:
+ Added tfm_get_codingscheme(). CODINGSCHEME from TFM header.
+
+ * agl.c, agl.h, unicode.c, unicode.h, ttf.c:
+ Handle decomposed (in Unicode) glyphs in AGL and glyph names of a form
+ XXX_YYY_ZZZ in ToUnicode CMap. The glyph name with suffix, like "x.y",
+ is sotred as a glyph "x" with a suffix that implies a variant "y" of
+ "x" in AGL table, not as "x.y" glyph. (for future use)
+
+2004-02-13 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c:
+ Bug fix. Skip first four bytes of encrypted PFB section.
+ Not warn about "dotsection" operator which exist only for
+ compatibility to Type 1 font rasterizer that can't do hint
+ replacement.
+
+ * tfm.c, tfm.h:
+ Fixed a bug that calculation of tfm_string_height() was incorrect.
+ ASCII pTeX specific things are put within #ifndef WITHOUT_ASCII_PTEX.
+
+2004-02-12 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c:
+ Another bug in flex handling. hmoveto and vmoveto allowed.
+
+ * type1c.c, cmap.c, cidtype0.c, encodings.c, fontmap.c:
+ Changes for new TDS and teTeX/kpathsea.
+
+ * encodings.c, encodings.h, pdfdev.c:
+ Removed get_encoding().
+
+2004-02-10 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c:
+ Bug fix. Compression of vhcurveto-hvcurveto was not actually done.
+ One more bug in flex handling.
+
+2004-02-08 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dvipdfmx.c:
+ paperinit() and paperdone().
+
+ * tfm.c:
+ Bug fix. Read OFM level 1 header, required by get_design_size().
+
+ * dvi.c, dvi.h, vf.c:
+ DVI specials in virtual fonts (patch by P. TJ MacPhee).
+
+2004-02-05 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cid.c, cidtype2.c:
+ Use font's internal glyph ordering if CSI Adobe-Identity is
+ specified for TrueType font. This feature is intended to be
+ used with Identity CMap and /I option in fontmap.
+
+ * configure, acinclude.m4, acconfig.h, config.h.in,...:
+ Check kpse_{enc,cmap,sfd,opentype}_format.
+
+ * type1.c:
+ Fixed a bug in flex handling.
+
+2004-02-04 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * dvipdfmx.c:
+ libpaper support.
+
+ * configure, acinclude.m4, acconfig.h, config.h.in:
+ --with-paper added for configure option. HAVE_LIBPAPER in config.h.
+
+ * pdfspecial.c: Added "bp" and "truebp" in units[].
+
+ * Accept w<unit>,h<unit> for papersize option.
+
+2004-02-03 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c:
+ Counter control (othersubr #12 and #13) supported.
+
+2004-02-01 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_build.c, tt_build.h, cidtype2.c, ttf.c:
+ Workaround for Ghostscript's bug.
+ Ghostscript doesn't handle CIDToGIDMap correctly.
+ Use Identity CIDToGIDMap.
+
+ * ttf.c:
+ Removed dependency to TFM. Glyph metric is obtained from font file.
+
+ * type1.c:
+ Warn about "seac" operator.
+
+2004-01-31 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c: Bug fix.
+
+ * Added many 'const'.
+
+2004-01-29 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * type1.c: Type 1 -> Type 1C conversion
+ PostScript Type 1 font is converted to Type 1C (CFF).
+ There are few limitations: Ghost hint is not converted to edge
+ hint. The Type 1 charstring operator "dotsection" is ignored.
+ The ExpertEncoding is not supported. The "seac" operator is not
+ supported. Counter control is not supported.
+
+ * Makefile.in, Makefile.am, standardenc.h: standardenc.h removed.
+
+ * pst.c:
+ Fixed a bug in skip_comments() that cause infinite loop.
+
+2004-01-27 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cff.c, cff.h, cff_dict.c, cff_dict.h:
+ Added few functions for Type 1 -> Type 1C conversion.
+
+2004-01-24 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pkfont.c:
+ Acrobat and MacOS X's Preview have some problem with Type 3 font.
+ Acrobat cannot handle non-invertible transformation matrix which
+ happens when PK glyph with width and/or height equals to zero is
+ embedded as Type 3 font. The preview app. of MacOS X 10.3 cannot
+ display few glyphs generated by dvipdfm with unknown reasons.
+
+2004-01-21 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * cs_type2.c: Don't use rint().
+
+2004-01-21 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * psimage.c, configure.in, config.h.in:
+ Use mkstemp() if available.
+
+2004-01-20 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * tt_table.[ch], tt_build.[ch], cidtype[02].c:
+ CIDFont glyph metrics for embedded font.
+
+2004-01-17 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * pdfobj.[ch], pdfparse.[ch], mpost.c, pdfencrypt.c, pngimage.c:
+ Removed pdf_*_stringx().
+
+ * pdfobj.c, pdfparse.c: Changes for PDF-1.3 compliance.
+
+2004-01-14 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * ToUnicode support for CFF/OpenType + built-in encoding.
+
+ * Bug fix in cff.c, type1c.c
+
+ * Workaround for Shift-JIS string parsing in pdfparse.c.
+
+ * pngimage.c don't require PNG-write/MNG-feature/progressive-read.
+
+ * Unicode: unsigned short --> long.
+
+ * Removed winansi.h
+
+2004-01-07 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * IMPORTANT CHANGE:
+ Searching order is reversed in fontmap.c.
+ Last match takes precedence in font mapping now.
+
+ * Fixed bug in cff.c, cmap.c, and type1c.c.
+
+2003-12-28 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Bug fixes in pdfparse.c and cid_basefont.h.
+
+2003-12-15 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Minor fixes.
+
+ * Added PDF special "fstream" - create PDF stream object from file.
+ This allows users to attach files in PDF.
+
+2003-12-07 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * JPEG moved to jpegimage.c.
+
+ * Bug fixes.
+
+2003-12-06 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Changes in pdfspecail.c.
+
+ * Fixed a bug in mpost.c.
+
+2003-12-02 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Added a patch for dvipdfm's ebb.c. (PDF ArtBox support)
+
+2003-11-29 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Bug fixes.
+
+ * CFF/OpenType support for single-byte font.
+
+2003-11-26 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Little enhancement to epdf.c.
+
+ * Merged epsbox.sty patch by Noda.
+
+2003-11-25 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Many part of font/encoding related code rewrote.
+
+ * Unicode support for single-byte font.
+
+2003-11-10 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug on the algorithm converting arc to cubic bezier
+ curves in arc() (tpic.c), which is reported by Werner Lemberg.
+
+2003-11-04 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * PNG support completely rewritten. Color pallete images are
+ now not converted to 24-bit RGB, colorspace Indexed is used
+ instead. Added tRNS and alpha chunnel (transparency) support.
+ Experimental gAMA, cHRM and sRGB support.
+
+2003-11-03 Shunsaku Hirata <hirata@project.ktug.or.kr>
+
+ * Fixed bug that dvipdfmx stops with error "Invalid Subr Index"
+ when embedding CFF OpenType font.
+
+2003-10-09 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Add a missing line including pdfparse.h in dvi.c, which is
+ reported by Akira Kakuto.
+
+ * Changed the default font map files for teTeX 2.x as suggested
+ by Haruhiko Okumura.
+
+2003-10-08 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * A bug on the paper size checking routine of dvi_paper_size()
+ in dvi.c is fixed, which is reported by Haruhiko Okumura.
+
+2003-10-06 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * A bug on the kerning routine of dev_set_string() in pdfdev.c is
+ fixed, which is reported by Edward G.J. Lee.
+
+2003-08-12 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Changed to embed images only one time.
+
+ * Updated configure.in and config.h.in to support WORDS_BIGENDIAN
+ and SIZEOF_SHORT, SIZEOF_INT, SIZEOF_LONG.
+
+2003-08-11 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * A faked font name was used for TrueType fonts without any PS
+ font name as suggested by Hin-Tak Leung.
+
+2003-08-05 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Built-in codes (originally from libgcrypt-1.1.42) was used
+ for PDF encryption instead of the OpenSSL library as suggested
+ by Thomas Esser.
+
+2003-07-28 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * A significant bug reported from Haruhiko Okumura is fixed.
+ The bug occurs only if compiled with gcc 3.x, not gcc 2.x.
+
+2003-03-26 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * New feature, hexadecimal Unicode, suggested by iNOUE Koich!
+ and Akira Kakuto is implemented.
+
+2003-03-13 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed bugs on reading and writing OpenType fonts.
+
+2003-03-12 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Applied changes for MiKTeX in ps_include() (psimage.c).
+
+2003-03-11 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug in cff_charsets_lookup() (cff.c).
+
+2003-02-06 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug in string_mode() (pdfdev.c) reported by iNOUE Koich!.
+
+2002-12-30 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug in writing null array.
+
+ * Fixed a bug in reading CMap and encoding files in MiKTeX.
+
+2002-11-28 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Support color shading feature in ConTeXt.
+
+2002-11-25 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * New feature pdfdecimaldigits (default=3) is implemented.
+
+ * Fixed a missing line in dvipdfmx.c.
+
+ * Fixed a bug in page attribute boxes, e.g., CropBox, TrimBox.
+
+2002-11-11 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * The "pdf: dest" special reads pdf_object not pdf_array.
+
+ * Fixed a bug in finding encoding files with extension.
+
+ * Look up the entries in miktex.ini while finding files.
+
+2002-10-31 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug in finding files with the kpathsea library 3.3.7.
+
+2002-10-28 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * The project name was changed to dvipdfmx from dvipdfm-cjk.
+
+ * Changed the way of finding files (MiKTeX and KPATHSEA)
+ (contributed by Akira Kakuto).
+
+ * Support embedded MetaPost graphics in ConTeXt using new PDF
+ special \special{pdf:literal [direct|reverse] ...}.
+
+2002-10-25 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Removed all files related to the original dvipdfm,
+ and all CMap files from Adobe.
+
+ * Changed the executable file dvipdfm to dvipdfmx,
+ the configuration file config to dvipdfmx.cfg,
+ the Type0 map file cid.map to cid-x.map.
+
+2002-10-24 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * It is possible to change the size of each page with the
+ special command \special{pdf:pagesize ...}. Override the
+ previous changes if there are two such commands in a page.
+
+2002-10-17 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug in parsing an array in two lines. (mpost.c)
+
+ * Changed not to lookup the header to find fonts. (mpost.c)
+
+2002-10-09 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Duplication is allowed for named_references[]. (pdfspecial.c)
+
+2002-06-05 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed a bug in parse_key_val() found by Yasuhiro Okazaki.
+
+2002-05-31 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Bug fixed for ToUnicode conversion in PDF outlines(bookmarks),
+ docinfo, and text annotations (contributed by Akira Kakuto).
+
+ * Included the ToUnicode CMap, EUC-UCS2.
+
+2002-05-22 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Support CJK characters in PDF outlines(bookmarks), docinfo, and
+ text annotations (contributed by Akira Kakuto).
+
+2002-05-15 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * PDF encryption support with the OpenSSL library.
+
+2002-04-30 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * ToUnicode CMap (only Unicode) support for Identity-H(V).
+
+ * Included the ToUnicode CMap, Adobe-Identity-UCS2.
+
+2002-04-22 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Included two CMaps, UniKSCms-UCS2-H(V) which fix a bug in
+ UniKS-UCS-H(V).
+
+2002-04-17 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Changed xxx_set_debug() to #ifdef DEBUG.
+
+2002-04-16 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Improved reading PNG image files.
+
+ * Rearranged all files to work with GNU autotools.
+
+ * Removed HAVE_TTF_FORMATS and HAVE_OFM_FORMATS.
+
+2002-04-09 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Minor fix on 'source/pkfont.c'.
+
+2002-04-07 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Fixed all warning messages generated with MSVC++.
+
+ * Rewrote the functions 'xxx_locate_font()' again.
+
+2002-04-04 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Changed the order of loading virtual and physical fonts as
+ suggested by Akira Kakuto <kakuto@fsci.fuk.kindai.ac.jp>.
+ If map entries are found, virtual fonts will not be used anymore.
+
+2002-04-02 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Implemented no-embedding and stylistic variants for CIDFontType0.
+
+2002-03-31 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Added two CMaps, ETenms-B5-H and ETenms-B5-V.
+
+2002-03-30 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor fix on the patch by Takanori Uchiyama.
+
+2002-03-29 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Applied the patch by Takanori Uchiyama <uchiyama@appi.keio.ac.jp>,
+ supporting the direction command of ASCII pTeX's extension in
+ virtual fonts.
+
+ * Two CMaps, Identity-H and Identity-V are hard-coded in cmap.c.
+
+2002-03-20 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Applied the patch by Jungshik Shin, not embedding the unnecessary
+ character /.notdef in type1 fonts.
+
+2002-03-20 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Modified cid_basefont.h.
+
+2002-03-05 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Support for UTF8 encoding through Identity CMap.
+
+2002-02-25 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Implemented no-embedding feature for CIDFontType2.
+
+ * Implemented Bold, Italic, BoldItalic attributes for CIDFontType2
+ and CID predefined fonts.
+
+2002-02-22 Jin-Hwan Cho <chofchof@ktug.or.kr>
+
+ * Implemented subfont approach for CJK and HLaTeX.
+
+2002-01-07 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed bug introduced on 2002-01-05.
+
+2002-01-05 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Workaround for some bad TrueType fonts that does not have US-English
+ PostScript font name.
+
+2001-12-27 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Changed to parse all charstrings. Check for the SEAC character.
+
+ * Minor changes in CFF related codes.
+
+2001-12-26 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Merged cmap and cmap_parse.
+
+2001-12-25 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Cleaned up TrueType and CFF related codes.
+
+ * Minor bug fixes.
+
+2001-12-23 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed bug that always requires Private DICT(s) which may not exist.
+
+ * Cleaned up TrueType and CFF related things.
+
+2001-12-18 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Biased subroutine number is signed in cs_type2.c.
+
+2001-12-14 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * macglyphs.h regenerated from apple's TTRefMan.
+
+2001-12-13 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor cleanups.
+
+ * Fixed typo (yacture -> yacute, Islash -> lslash) in macglyphs.h.
+
+ * Fixed signedness of TureType cmap subtable format 0 data.
+
+2001-12-11 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor fixes.
+
+ * Fixed bug that interpretion of hmtx table is still wrong.
+
+ * Fixed fixed().
+
+ * More improved FontDescriptor for TrueType/OpenType fonts.
+
+ * Support for PostScript glyph name in TrueType post table.
+ Full subsettting is also available for non-CJK TrueType fonts.
+ Cyrillic and other TrueType fonts can be used.
+ Requires post table with version 2.0.
+
+2001-12-09 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Bug fixes.
+
+2001-12-05 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed bug that last entry of the loca table may not be read.
+
+ * DW is set to that of missing glyph (CIDFontType 2).
+
+ * Bug fixes.
+
+2001-12-04 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixes.
+
+2001-12-03 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor charnges, cleanups.
+
+ * Write CIDSet.
+
+2001-12-02 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Initial CFF CID-Keyed Font support.
+ Only Type 2 charstring is supported.
+
+2001-11-27 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor fixes, cleanups.
+
+2001-11-26 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed (serious) bug that hmtx table is incorrectly interpreted.
+
+ * Fixed bug that encoding ID of RPC and BIG5 are interchanged.
+
+ * Added missing cast in cidtype2.c.
+
+2001-11-25 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Bug fix.
+
+2001-11-24 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Added missing free() (RELEASE) in cidtype2.c.
+
+ * Minor fixes.
+
+ * Fixed typos.
+
+2001-11-22 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Clean up.
+
+ * Allow `Preview & Print' licensed fonts to be embedded.
+ TrueType OS/2 table is preserved.
+
+2001-11-20 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor cleanups. Fixed typos.
+
+ * Strip out bad strings form PostScript names;
+ -WIN-RKSJ-H, -WINP-RKSJ-H, -WING-RKSJ-H, and -90pv-RKSJ-H.
+ Some font uses PostScript name one of above strings appended,
+ even if Shift-JIS encoding is not used.
+
+2001-11-18 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Workaround for Omega: Omega uses setxxx (single-byte char) command
+ while double-byte font is in use. Pass character type to
+ dev_set_string() to distinguish single-byte and double-byte.
+ Maybe, it works with CJK-LaTeX by preparing set of CMaps.
+
+ * Write double-byte strings as hex strings.
+ This makes bit faster and tend to generate smaller PDF in most cases.
+
+ * CMap parser uses wrok_buffer in mfileio.
+
+ * Reserved w_array and w2_array in struct cid_font for future use.
+
+ * Now write /W array for TrueType, proportional latin and kana works
+ properly. The metric information are taken from font file, not from
+ TFM, to ensure we always have correct widths. The default width (DW)
+ is set to 1000.
+
+ * Changed sizeof() appeared in sfnt_put_xxx() to expected values in
+ sfnt.h. I do not assume LONG to be exactly 32-bit long, ....
+
+2001-11-17 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Added Chinese and Korean related stuff again. Chinese and Korean
+ languages are supported through Omega, or by achieving Ascii pTeX
+ compatibility.
+
+ * Closing CMaps is missing. Added cmap_close_all(), which is invoked by
+ dev_close_all_fonts() in pdfdev.c.
+
+ * Check length of output string for Type 0 font. It must be multiple of
+ 2. Omega uses 8-bit and 16-bit mixed string even for double-byte
+ fonts. This causes problems.
+
+ * Abort if missing/invalid character is used.
+
+2001-11-15 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Bug fixes.
+
+2001-11-12 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * (nearly) Completely rewritten.
+
+ * Force Identity CMap. (double-byte character codes are mapped to CID)
+
+ * Added CMap parser. (mkcidcct.pl is no longer needed)
+
+ * Sync with jpatch.
+
+2001-10-01 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Should return -1 when encoding_id >= 0 in type0_font().
+
+2001-08-08 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed a bug that raster images show up incorrectly in vertical
+ writing mode.
+
+2001-08-07 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Removed dev_set_string2(), use dev_set_string() instead.
+
+ * set_dev_vwmode() is renamed to set_dev_wmode().
+ Added dev_wmode() and mp_mode flag in pdfdev.c.
+
+ * Support for Japanized MetaPost (pdfparse.h, mpost.c).
+
+2001-07-21 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed a bug that do not reset text state in vertical writing.
+
+2001-07-20 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed wrong positioning for slanted non-CJK font in vertical writing.
+
+2001-07-19 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Support OS/2 table version 0x0002.
+
+2001-07-17 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Support multiple parents for a single CID-keyed font
+ (incomplete).
+
+ TODO:
+ check the consistency of charcter collections.
+
+ * Removed entries for unsupported CMaps.
+
+ * Updated cid.map.
+
+2001-07-15 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Better font metric info for CIDFontType2.
+
+ * Added (partial) support for vertical writing.
+ Added wmode flag to struct a_type0_font and dev_font.
+
+ TODO:
+ GSUB support in CIDFontType2.
+ /W2 and /DW2.
+
+ * Added support for vertical version of CMaps in mkcidcct.pl
+
+2001-07-07 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Minor fixes.
+
+ * Updated out2uni.c
+
+2001-06-30 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * --> dvipdfm-0.13.2c
+
+2001-06-29 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Fixed a bug that select incorrect indexToLocaFormat
+ (cidtype2.c).
+
+ * Fixed several bugs in cidtype2.c.
+
+2001-06-27 Shunsaku Hirata <hira4scp@mbox.nc.kyushu-u.ac.jp>
+
+ * Added support for CJK-TrueType font embedding.
+
+ * Cleaned up Type0 and CID font handling code.
diff --git a/Build/source/texk/xdvipdfmx/INSTALL b/Build/source/texk/xdvipdfmx/INSTALL
new file mode 100644
index 00000000000..b42a17ac464
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/INSTALL
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/Build/source/texk/xdvipdfmx/Makefile.am b/Build/source/texk/xdvipdfmx/Makefile.am
new file mode 100644
index 00000000000..3da2d71a61f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = data src
diff --git a/Build/source/texk/xdvipdfmx/Makefile.in b/Build/source/texk/xdvipdfmx/Makefile.in
new file mode 100644
index 00000000000..106c12f2ef1
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/Makefile.in
@@ -0,0 +1,599 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+ TODO compile config.guess config.sub depcomp install-sh \
+ missing mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/../../libs/libpng/withenable.ac \
+ $(top_srcdir)/../../libs/libpng/libpng.ac \
+ $(top_srcdir)/../../libs/zlib/withenable.ac \
+ $(top_srcdir)/../../libs/zlib/zlib.ac \
+ $(top_srcdir)/../../libs/freetype2/withenable.ac \
+ $(top_srcdir)/../../libs/freetype2/freetype2.ac \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FREETYPE2CPPFLAGS = @FREETYPE2CPPFLAGS@
+FREETYPE2DEP = @FREETYPE2DEP@
+FT2CPPFLAGS = @FT2CPPFLAGS@
+FT2DEP = @FT2DEP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LDFREETYPE2 = @LDFREETYPE2@
+LDFT2 = @LDFT2@
+LDLIBPNG = @LDLIBPNG@
+LDZLIB = @LDZLIB@
+LIBOBJS = @LIBOBJS@
+LIBPNGCPPFLAGS = @LIBPNGCPPFLAGS@
+LIBPNGDEP = @LIBPNGDEP@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TDS_VERSION_11_FALSE = @TDS_VERSION_11_FALSE@
+TDS_VERSION_11_TRUE = @TDS_VERSION_11_TRUE@
+VERSION = @VERSION@
+ZLIBCPPFLAGS = @ZLIBCPPFLAGS@
+ZLIBDEP = @ZLIBDEP@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+dvipdfmx_LDFLAGS = @dvipdfmx_LDFLAGS@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xdvipdfmx_LDFLAGS = @xdvipdfmx_LDFLAGS@
+SUBDIRS = data src
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/../../libs/freetype2 $(distdir)/../../libs/libpng $(distdir)/../../libs/zlib
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-generic \
+ distclean-hdr distclean-recursive distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \
+ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+ uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/xdvipdfmx/NEWS b/Build/source/texk/xdvipdfmx/NEWS
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/NEWS
diff --git a/Build/source/texk/xdvipdfmx/README b/Build/source/texk/xdvipdfmx/README
new file mode 100644
index 00000000000..d382ec22aeb
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/README
@@ -0,0 +1,516 @@
+README for xdvipdfmx
+====================
+
+xdvipdfmx is an extended version of dvipdfmx; see below for further details.
+
+The extensions provided by xdvipdfmx provide support for the Extended DVI
+(.xdv) format used by xetex, including support for platform-native fonts
+and the xetex graphics primitives, as well as Unicode/OpenType text.
+
+The implementation of .xdv support was done by Jin-Hwan Cho and Jonathan Kew.
+
+Like its direct ancestor dvipdfmx, this is free software and may be
+redistributed under the terms of the GNU General Public License,
+version 2 or (at your option) any later version.
+
+
+The dvipdfmx Project
+====================
+
+Last modified: April 20, 2005
+
+
+Copyright (C) 2002-2004 by Jin-Hwan Cho and Shunsaku Hirata,
+the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+
+
+Contents
+--------
+
+1. Introduction
+
+2. Installation
+
+ 2.1. Compiling and Installation
+
+ 2.2. TeX Directory Structure (TDS)
+
+ 2.3. Auxiliary Files
+
+3. CJK Support
+
+ 3.1. Quick Test of Installation
+
+ 3.2. CJK-LaTeX and HLaTeX
+
+ 3.3. Omega and Other Extended TeX
+
+ 3.4. Vertical Typesetting
+
+4. Unicode Support
+
+ 4.1. Unicode Support in General
+
+ 4.2. ToUnicode CMap Support
+
+ 4.3. OpenType Support and Unicode
+
+ 4.4. Type1 Font Support and Unicode
+
+5. Graphics and Image Format
+
+ 5.1. Supported Graphics File Format
+
+ 5.2. Graphics Extension
+
+ 5.3. Using External Programs for Format Conversion
+
+6. DVI Specials
+
+ 6.1. Compatibility
+
+ 6.2. Additions to Dvipdfm's pdf: Special
+
+7. Font Mapping
+
+8. Incompatible Changes From Dvipdfm
+
+9. Other Improvement Over Dvipdfm
+
+10. Font Licensing and Embedding
+
+
+
+1. Introduction
+ ------------
+
+ The dvipdfmx (formerly dvipdfm-cjk) project provides an eXtended version
+ of the dvipdfm, a DVI to PDF translator developed by Mark A. Wicks.
+
+ The primary goal of this project is to support multi-byte character
+ encodings and large character sets for East Asian languages. The secondary
+ goal is to support as many features as pdfTeX developed by Han The Thanh.
+
+ This project is a combined work of the dvipdfm-jpn project by Shunsaku
+ Hirata and its modified one, dvipdfm-kor, by Jin-Hwan Cho.
+
+
+2. Installation
+ -----------------------
+
+ Typical usage and installation steps are not different from the original dvipdfm.
+ Please refer documents from dvipdfm distribution for detailed instruction on how
+ to install and how to use dvipdfm.
+
+
+2.1. Compiling and Installation
+
+
+ If you have obtained older version, please use latest version unless you have a
+ clear reason to choose older versions. The latest snapshot of dvipdfmx source is
+ available at:
+
+ http://project.ktug.or.kr/dvipdfmx/snapshot/
+
+ And the CVS repository for this project can be obtained through anonymous CVS
+ access with the following command:
+
+ cvs -d:pserver:anonymous@cvs.ktug.or.kr:/home/cvsroot login
+ cvs -d:pserver:anonymous@cvs.ktug.or.kr:/home/cvsroot co dvipdfmx
+
+ When prompted for a password, simply press the Enter key.
+
+
+ The kpathsea library is required to compile and install dvipdfmx in UNIX or
+ UNIX-like platforms. It is usually included for most of TeX distributions.
+ If you already have installed dvipdfm (the original) by yourself, you should
+ already have kpathsea library and it's headers. And zlib library is highly
+ recommended as dvipdfmx can't compress data without this.
+
+
+ Before starting things, you must check the location of your TeX installation.
+ If other TeX related programs are installed under, e.g., '/usr/local/TeX/bin',
+ you should specify directory '/usr/local/TeX' as an for ./configure script as
+
+ ./configure --prefix=/usr/local/TeX --with-kpathsea=/usr/local/TeX
+
+ If you are using libpaper to handle paper sizes for various program, you can
+ use --with-paper option to ./configure. The location of libpaper library can
+ be specified with this option as
+
+ --with-paper=DIR
+
+ Please note thath dvipdfmx uses JIS paper size for B-series paper instead of
+ ISO's one for historical reason. (too late to change the default behavior)
+ The most easiest way to fix this is to use libpaper if you already have that,
+ otherwise define ISO_PAPERSIZE macro at compilation time.
+
+ Dvipdfmx requires libpng library available from
+
+ http://www.libpng.org/pub/png/libpng.html
+
+ to read PNG format images. To tell dvipdfmx the location of libpng header
+ and library, use configure option
+
+ --with-png=DIR
+
+ After you have finished ./configure, just type
+
+ make && make install
+
+ then dvipdfmx will be installed under the directory specified by the --prefix
+ option to ./configure script. After you have successfully installed dvipdfmx,
+ you may need to install various auxiliary files and slightly adjust location
+ of files or configuration. Amount of additional files and modification depends
+ on your environment, and briefly described in the sections follows.
+
+
+2.2. TeX Directory Structure (TDS)
+
+
+ If your TeX installation is conforming with TDS version 1.1 described in
+
+ http://www.tug.org/ftp/tex/tds-1.1/
+
+ , then you'll need to adjust your dvipdfmx installtion. This also applies when
+ you have updated programs without modifying existing platform independent files
+ (files in texmf directory). Dvipdfmx installs few files in addition to dvipdfmx
+ program itself, dvipdfmx.cnf, cid-x.map and others, but it currently does not
+ choose installation directory as appropriate for TDS 1.1.
+
+ If your 'kpsewhich' program recognizes '.sfd' file format, i.e.,
+
+ kpsewhich --show-path --format=.sfd
+
+ does not answer as 'unknown format', then you should move several files under
+ appropriate locations or should modify texmf.cnf as follows:
+
+ * Subfont Definition (SFD) Files
+
+ Recommended location of SFD files (.sfd) is
+
+ $TEXMF/fonts/sfd/
+
+ and environmental variable for specifying additional search path for this
+ file format files is
+
+ SFDFONTS
+
+ . To make those files visible to dvipdfmx under TDS 1.1 installation, you
+ must move all .sfd files to the directory mentioned above or set SFDFONTS
+ variable in texmf.cnf. As some programs may not be updated to follow this
+ convention yet, it is recommended to preserve old installation directory.
+ If you have .sfd files under "$TEXMF/dvipdfm/", please do not use that,
+ please move all files to the directory mentioned above.
+
+ * PostScript CMap Resources
+
+ Recommended location of CMap files (no suffix or with suffix .cmap) is
+
+ $TEXMF/fonts/cmap/
+
+ and environmental variable for adding extra search path for this format files
+ is
+
+ CMAPFONTS
+
+ You may want to set CMAPFONTS to include GhostScript's Resource path, e.g.,
+
+ /usr/share/ghostscript/Resource/CMap//
+
+ in your texmf.cnf file as this resource can be used by various programs that
+ manipulates PS/PDF files. Dvipdfmx installs few additional files into the
+ directory "$TEXMF/dvipdfm/CMap", please move this files to the directory for
+ CMap files. But please note that file "Adobe-Identity-UCS2" is not meaningful
+ to other programs at all, so you should place at least this file in different
+ location than CMap files. (Or you can just remove this unless you see problems
+ in copy-and-pasting text from dvipdfmx output PDF.)
+
+ * Font Mapping Files
+
+ Suggested place for dvipdfm's font mapping files (.map) is
+
+ $TEXMF/fonts/map/dvipdfm/
+
+ and environmental variable for this format files is
+
+ TEXFONTMAPS
+
+ For files containing dvipdfmx extension to dvipdfm format, place them into
+
+ $TEXMF/fonts/map/dvipdfmx/
+
+ instead of sub-directory 'dvipdfm'.
+
+ * OpenType Fonts
+
+ Appropriate place for OpenType font with PostScript outline (.otf) is
+
+ $TEXMF/fonts/opentype/supplier/typeface/
+
+ where 'supplier' and 'typeface' should be replaced with font's supplier and
+ typeface identifier strings.
+
+
+2.3. Auxiliary Files
+
+
+ 1) CMap PostScript Resources
+
+ Dvipdfmx internally identifies glyphs in a font with identifier represented
+ as numbers ranging from 0 to 65535. CMap PostScript Resources defines how the
+ input character codes are translated to those ID's (CID). CID's should be
+ uniquely assigned to every glyphs contained in a collection of glyphs. Adobe
+ has defined several "character collection"s; Adobe-GB1 (Simplified Chinese),
+ Adobe-CNS1 (Traditional Chinese), Adobe-Japan1 (Japanese), and Adobe-Korea1
+ (Korean), which contains much of glyphs necessary for publishing for each
+ languages. Details on Adobe's character collections can be found at Adobe's
+ developer site:
+
+ http://partners.adobe.com/public/developer/font/index.html
+
+ Please install CMap resource files under the directory
+
+ ${TEXMF}/fonts/cmap
+
+ , or set CMAPFONTS variable to point the directory containing CMap resource
+ in texmf.cnf. If your TeX installation does not conforming TDS 1.1, then you
+ should set CMAPINPUTS variable to make those files visible to dvipdfmx. For
+ examples,
+
+ CMAPINPUTS= .;$TEXMF/fonts/cmap//
+
+ Adobe's "CMaps for PDF 1.4 CJK Fonts" are available from:
+
+ http://partners.adobe.com/public/developer/acrobat/index_advanced.html
+
+ or
+
+ ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+
+ You can find a short explanation of each CMap files in cid2code.txt contained
+ in the archive files found at the above FTP site.
+
+
+ 2) SubFont Definition Files
+
+ .....
+
+
+ 3) Adobe Glyph List and ToUnicode Mapping Files
+
+ The Adobe glyph list (AGL) file describes correspondence between PostScript
+ glyph names (e.g., AE, Aacute, ...) and it's Unicode character sequences.
+ Most features described in the section "Unicode Support" requires this file.
+
+ Dvipdfmx looks for file "glyphlist.txt" when conversion from PostScript glyph
+ names to Unicode is necessary. This conversion is done in various situations;
+ when creating ToUnicode CMap for 8bit encoded fonts, finding glyph description
+ from TrueType/OpenType fonts supporting Unicode when the font itself does not
+ provide the mapping from PostScript glyph names to glyph indices (version 2.0
+ "post" table), and when encoding "unicode" is specified for Type 1 font.
+
+ The "glyphlist.txt" file written by Adobe is found at
+
+ http://partners.adobe.com/asn/tech/type/glyphlist.txt
+
+ You should place file "glyphlist.txt" in a directory shown by
+
+ kpsewhich --progname=dvipdfm --show-path="other text files"
+
+ Please check kpathsea library can find this file by 'kpsewhich' command:
+
+ kpsewhich --progname=dvipdfm --format="other text files" glyphlist.txt
+
+ The 'progname' is not dvipdfmx but dvipdfm here.
+
+ ToUnicode mapping is similar to glyph list file but describes correspondence
+ between CID numbers and Unicode values. The content of this file look like a
+ CMap files and is contained in "CMaps for PDF 1.4 CJK Fonts" from Adobe (see
+ "CMap PostScript Resources" above). This file is required to support TrueType
+ font (including OpenType fonts with TrueType outline). Those files should be
+ installed same directory as ordinary CMap files.
+
+
+3. CJK Support
+
+3.1. Quick Test of Installation
+
+3.2. CJK-LaTeX and HLaTeX
+
+3.3. Omega and Other Extended TeX
+
+
+4. Unicode Support
+
+4.1. Unicode Support in General
+
+4.2. ToUnicode CMap Support
+
+4.3. OpenType Support and Unicode
+
+4.4. Type1 Font Support and Unicode
+
+
+5. Graphics and Image Format
+
+5.1. Supported Graphics File Format
+
+5.2. Graphics Extension
+
+5.3. Using External Programs for Format Conversion
+
+
+6. DVI Specials
+
+6.1. Compatibility
+
+6.2. Additions to Dvipdfm's pdf: Special
+
+
+7. Font Mapping
+
+
+7.1. Options for CJK Font
+
+ Few options are available in dvipdfmx (for CID-keyed fonts) in addition
+ to the original dvipdfm.
+
+
+ 1) TTC Index
+
+ You can specify TrueType Collection index number with :n: option in front
+ of TrueType font name.
+
+ min10 H :1:mincho
+
+ In this example, the option :1: tells dvipdfmx to select TrueType font #1
+ from TrueType collection font "mincho.ttc".
+
+
+ 2) No-embed Switch
+
+ It is possible to block embedding glyph data with the character `!'
+ in front of the font name in the font mapping file.
+
+ This feature reduces the size of the final PDF output, but the PDF file
+ may not be viewed exactly in other systems on which appropriate fonts
+ are not installed.
+
+ Use of this option is not recommended for fonts that contains unusual
+ characters (and characters having different width from default value).
+ Please note that glyph metric information is not written in the output
+ PDF file for TrueType fonts without embedding. It will be treated as
+ fixed-pitch with all widths equal to the default value (will be fixed
+ someday).
+
+
+ 3) Stylistic Variants
+
+ Keywords ",Bold", ",Italic", and ",BoldItalic" can be used to create
+ synthetic bold, italic, and bolditalic style variants from other font
+ using PDF viewer's (or OS's) function.
+
+ jbtmo@UKS@ UniKSCms-UCS2-H :0:!batang,Italic
+ jbtb@Unicode@ Identity-H !batang/UCS,Bold
+
+ Availability of this feature highly depends on the implementation of PDF
+ viewers. This feature is not supported for embedded fonts in the most of
+ PDF viewers, like Adobe Acrobat Reader and GNU Ghostscript.
+
+ Notice that this option automatically disable font embedding.
+
+
+
+8. Incompatible Changes From Dvipdfm
+
+
+
+9. Other Improvement Over Dvipdfm
+
+
+9.1. Encryption
+
+
+9.2. Font
+
+
+
+10. Font Licensing and Embedding
+
+ In OpenType format, information regarding how the font should be treated
+ when creating documents can be recorded. Dvipdfmx uses this information
+ to decide whether embedding font into the document is permitted.
+
+ This font embedding information is indicated by a flag called as "fsType"
+ flag; each bit representing different restrictions on font embedding.
+ If multiple flag bits are set in fsType, the least restrictive license
+ granted takes precedence in dvipdfmx. The fsType flag bits recognized by
+ dvipdfmx is as follows:
+
+ * Installable embedding
+
+ All font with this type of license can be embedded.
+
+ * Editable embedding
+
+ All font with this type of license can be embedded.
+
+ * Embedding for Preview & Print only
+
+ Dvipdfmx give the following warning message for fonts with this
+ type of license:
+
+ This document contains `Preview & Print' only licensed font
+
+ For the font with this type of licensing, font embedding is allowed
+ solely for the purpose of (on-screen) viewing and/or printing the
+ document; further editing of the document or extracting an embedded
+ font data for other purpose is not allowed. To ensure this condition,
+ you must at least protect your document with non-empty password.
+
+ All other flags are treated as more restrictive license than any of the
+ above flags and treated as "No embedding allowed"; e.g., if both of the
+ editable-embedding flag and unrecognized license flag is set, the font
+ is treated as editable-embedding allowed, however, if only unrecognized
+ flags are set, the font is not embedded.
+
+ Embedding flags are preserved in embedded font if the font is embedded
+ as a TrueType font or a CIDFontType 2 CIDFont. For all font embedded as
+ a PostScript font (CFF, CIDFontType 0 CIDFont), they are not preserved.
+ Only /Copyright and /Notice in the FontInfo dictionary are preserved in
+ this case.
+
+ Some font vendors put different embedding restrictions for different
+ condition; e.g., font embedding might be not permitted for commercial
+ materials unless you acquire "commercial license" separately.
+ Please read EULA carefully before making decision on font usage.
+
+
+ Adobe provide a font licensing FAQ and a list of embedding permissions
+ for Adobe Type Library fonts:
+
+ http://www.adobe.com/type/browser/legal/
+
+ For Japanese font in general, embedding permission tend to be somewhat
+ restrictive. Japanese users should read the statement regarding font
+ embedding from Japan Typography Association (in Japanese):
+
+ http://www.typo.or.jp/info/morals/moral4.html
+
+
+
diff --git a/Build/source/texk/xdvipdfmx/TODO b/Build/source/texk/xdvipdfmx/TODO
new file mode 100644
index 00000000000..ace8bd25088
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/TODO
@@ -0,0 +1,56 @@
+$Header: /home/cvsroot/dvipdfmx/TODO,v 1.9 2004/08/22 10:26:24 hirata Exp $
+
+TODO: The todo list for dvipdfmx
+================================
+
+Last modified: August 17, 2004
+
+
+o XObject and Metadata.
+
+o XML Metadata.
+
+o pdf: specials to manipulate trees for tagged PDF(?)
+
+
+Jin-Hwan Cho
+------------
+
+o Stylistic variants for Type1 and TrueType for non CIDFonts
+
+o No-embedding option for Type1 and TrueType for non CIDFonts
+
+
+Shunsaku Hirata
+---------------
+
+o Font
+
+ * Rewrite.
+
+ * GSUB.
+
+ * BASE:
+ BASE support is required for vertical wrting to obtain x-origins of the
+ /W2 glyph metrics.
+
+ * Better compression with JBIG2, CCITT, or Flate with predictor for PK(?)
+
+ * Complete Unicode support for Type1 font.
+
+o CMap, Encoding and Unicode
+
+ * Many...
+
+ * Reencode text (not only fonts). Remove remap option.
+
+o Graphics
+
+ * Make PDF output independent from DVI input.
+
+ * Downsampling
+
+ * JPEG2000
+
+ * Enhance PS code support
+
diff --git a/Build/source/texk/xdvipdfmx/acinclude.m4 b/Build/source/texk/xdvipdfmx/acinclude.m4
new file mode 100644
index 00000000000..7c6fe1be39f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/acinclude.m4
@@ -0,0 +1,275 @@
+
+#
+# Check for kpathsea
+#
+AC_DEFUN([AC_CHECK_KPSE_SUPPORT], [
+ AC_MSG_CHECKING([whether you have kpathsea headers and they know about the required file formats])
+ AC_TRY_COMPILE(
+ [
+#include <stdio.h>
+#include <kpathsea/kpathsea.h>
+ ], [
+kpse_tex_ps_header_format;
+kpse_type1_format;
+kpse_vf_format;
+kpse_ofm_format;
+kpse_ovf_format;
+kpse_truetype_format;
+ ],
+ [ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(kpathsea, xbasename,
+ [],
+ [ AC_MSG_ERROR([
+This version of dvipdfmx requires xbasename() in kpathsea library.
+ ]) ]
+ )
+ ],
+ [ AC_MSG_RESULT(no);
+ AC_MSG_ERROR([
+This version of dvipdfmx requires that kpathsea and its headers be installed.
+If you are sure they are installed and in a standard place, maybe you need a
+newer version of kpathsea? You also might try setting the environment
+variable CPPFLAGS (or CFLAGS) with -I pointing to the directory containing
+the file "tex-file.h"
+ ]) ]
+ )
+])
+
+
+#
+# Check for enc, cmap, sfd formats
+#
+AC_DEFUN([AC_CHECK_KPSE_TDS_VERSION], [
+ AC_MSG_CHECKING([whether kpathsea library supports TDS version 1.1 installation])
+ AC_TRY_COMPILE(
+ [
+#include <stdio.h>
+#include <kpathsea/kpathsea.h>
+#include <kpathsea/tex-file.h>
+ ], [
+kpse_enc_format;
+kpse_cmap_format;
+kpse_sfd_format;
+kpse_opentype_format;
+ ],
+ [ AC_MSG_RESULT(yes);
+ AC_DEFINE([__TDS_VERSION__], 0x200406L, [Define if your libkpathsea supports enc formats])
+ AM_CONDITIONAL(TDS_VERSION_11, true)
+ ],
+ [ AC_MSG_RESULT(no);
+ AC_DEFINE([__TDS_VERSION__], 0x200302L, [Define if your libkpathsea supports enc formats])
+ AM_CONDITIONAL(TDS_VERSION_11, false)
+ ]
+ )
+])
+
+
+#
+# Check for zlib
+#
+AC_DEFUN([AC_HAS_ZLIB], [
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ AC_ARG_WITH(zlib,
+ [ --with-zlib=DIR use zlib include/library files from DIR],
+ [
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+ ]
+ )
+ AC_MSG_CHECKING([for zlib header files])
+ AC_TRY_COMPILE(
+ [
+#include <zlib.h>
+ ], [
+z_stream p;
+ ],
+ [ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(z, compress, [
+ AC_DEFINE(HAVE_ZLIB, 1, [Define if you have zlib and its headers])
+ LIBS="$LIBS -lz"
+ AC_CHECK_LIB(z, compress2, [
+ AC_DEFINE(HAVE_ZLIB_COMPRESS2, 1, [Define if your zlib has the compress2 function])
+ ])
+ ])
+ ],
+ [CPPFLAGS=$_cppflags LDDFLAGS=$_ldflags AC_MSG_RESULT(no)]
+ )
+])
+
+#
+# Check for libpng
+#
+AC_DEFUN([AC_HAS_LIBPNG], [
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ AC_ARG_WITH(png,
+ [ --with-png=DIR use png include/library files from DIR],
+ [
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+ ]
+ )
+ AC_CHECK_FUNC(pow, , AC_CHECK_LIB(m, pow, LIBS="$LIBS -lm"))
+ AC_MSG_CHECKING([for png header files])
+ AC_TRY_COMPILE(
+ [
+#include <png.h>
+ ], [
+png_infop p;
+ ],
+ [ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(png, png_get_image_width,
+ [ AC_DEFINE(HAVE_LIBPNG, 1, [Define if you have libpng])
+ LIBS="$LIBS -lpng" ], , -lz
+ )
+ ],
+ [ AC_MSG_RESULT(no) ]
+ )
+])
+
+#
+# Check for libpaper
+#
+AC_DEFUN([AC_HAS_LIBPAPER], [
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ AC_ARG_WITH(paper,
+ [ --with-paper=DIR use paper include/library files from DIR],
+ [
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+ ]
+ )
+ AC_MSG_CHECKING([for paper header files])
+ AC_TRY_COMPILE(
+ [
+#include <paper.h>
+ ], [
+struct paper *p;
+ ],
+ [ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(paper, paperpswidth, [
+ AC_DEFINE(HAVE_LIBPAPER, 1, [Define if you have libpaper])
+ LIBS="$LIBS -lpaper"
+ ])
+ ],
+ [ AC_MSG_RESULT(no) ]
+ )
+])
+
+#
+# Check for libfontconfig
+#
+AC_DEFUN([AC_HAS_LIBFONTCONFIG], [
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ AC_ARG_WITH(fontconfig,
+ [ --with-fontconfig=DIR use fontconfig include/library files from DIR],
+ [
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+ ]
+ )
+ AC_MSG_CHECKING([for fontconfig header files])
+ AC_TRY_COMPILE(
+ [
+#include <fontconfig/fontconfig.h>
+ ], [
+FcObjectSet *os;
+ ],
+ [ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(fontconfig, FcInit, [
+ AC_DEFINE(HAVE_LIBFONTCONFIG, 1, [Define if you have libfontconfig])
+ LIBS="$LIBS -lfontconfig"
+ ])
+ ],
+ [ AC_MSG_RESULT(no) ]
+ )
+])
+
+#
+# Check for libfreetype, fail with error if not found
+#
+AC_DEFUN([AC_CHECK_LIBFREETYPE], [
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ using_installed_freetype=yes
+ AC_ARG_WITH(ft2lib,
+ [ --with-ft2lib=LIB use freetype2 library LIB],
+ [
+ if test x"$withval" != x; then
+ LIBS="$LIBS $withval"
+ using_installed_freetype=no
+ fi
+ ]
+ )
+ AC_ARG_WITH(ft2include,
+ [ --with-ft2include=DIR use freetype2 include files from DIR],
+ [
+ if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval"
+ fi
+ ]
+ )
+ AC_ARG_WITH(freetype2,
+ [ --with-freetype2=DIR use installed freetype2 include & lib files from DIR],
+ [
+ if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include/freetype2"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ fi
+ ]
+ )
+ AC_MSG_CHECKING([for freetype2 header files and library])
+ AC_TRY_COMPILE(
+ [
+#include "ft2build.h"
+#include FT_FREETYPE_H
+ ],
+ [
+FT_Face face;
+ ],
+ [ AC_MSG_RESULT(yes)
+ if test x"$using_installed_freetype" = xyes; then
+ AC_CHECK_LIB(freetype, FT_Init_FreeType, [
+ AC_DEFINE(HAVE_LIBFREETYPE, 1, [Define if you have libfreetype])
+ LIBS="$LIBS -lfreetype"
+ ])
+ else
+ AC_DEFINE(HAVE_LIBFREETYPE, 1, [Define if you have libfreetype])
+ fi
+ ],
+ [ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([
+This version of xdvipdfmx requires that FreeType2 and its headers be available.
+You can use the --with-freetype2 option to indicate the location of the installed
+freetype2, or --with-ft2lib and --with-ft2include to point to the libfreetype.a
+library and the FreeType2 include files.])
+ ]
+ )
+])
+
+#
+# Check for ApplicationServices
+#
+AC_DEFUN([AC_HAS_APP_SERVICES], [
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ AC_MSG_CHECKING([for Mac OS X ApplicationServices framework])
+ AC_TRY_COMPILE(
+ [
+#include <ApplicationServices/ApplicationServices.h>
+ ], [
+ATSFontRef fontRef;
+ ],
+ [ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_APP_SERVICES, 1, [Define if you have ApplicationServices (Mac OS X)])
+ LIBS="$LIBS -framework ApplicationServices"
+ ],
+ [ AC_MSG_RESULT(no) ]
+ )
+])
+
diff --git a/Build/source/texk/xdvipdfmx/aclocal.m4 b/Build/source/texk/xdvipdfmx/aclocal.m4
new file mode 100644
index 00000000000..0e90944648f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/aclocal.m4
@@ -0,0 +1,892 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([acinclude.m4])
diff --git a/Build/source/texk/xdvipdfmx/compile b/Build/source/texk/xdvipdfmx/compile
new file mode 100755
index 00000000000..1b1d2321695
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as `compile cc -o foo foo.c'.
+ # So we strip `-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no `-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # `.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/texk/xdvipdfmx/config.guess b/Build/source/texk/xdvipdfmx/config.guess
new file mode 100755
index 00000000000..ad5281e66e9
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/config.guess
@@ -0,0 +1,1466 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-08-03'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ *86) UNAME_PROCESSOR=i686 ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/texk/xdvipdfmx/config.h.in b/Build/source/texk/xdvipdfmx/config.h.in
new file mode 100644
index 00000000000..9044106da02
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/config.h.in
@@ -0,0 +1,148 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the `basename' function. */
+#undef HAVE_BASENAME
+
+/* Define to 1 if you have the `close' function. */
+#undef HAVE_CLOSE
+
+/* Define to 1 if you have the `getenv' function. */
+#undef HAVE_GETENV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `kpathsea' library (-lkpathsea). */
+#undef HAVE_LIBKPATHSEA
+
+/* Define if you have libpaper */
+#undef HAVE_LIBPAPER
+
+/* Define if you have libpng */
+#undef HAVE_LIBPNG
+
+/* Define if you have libfontconfig */
+#undef HAVE_LIBFONTCONFIG
+
+/* Define if you have libfreetype */
+#undef HAVE_LIBFREETYPE
+
+/* Define if you have Mac OS X ApplicationServices framework */
+#undef HAVE_APP_SERVICES
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the `open' function. */
+#undef HAVE_OPEN
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if `tm_zone' is member of `struct tm'. */
+#undef HAVE_STRUCT_TM_TM_ZONE
+
+/* Define to 1 if you have the `system' function. */
+#undef HAVE_SYSTEM
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
+ `HAVE_STRUCT_TM_TM_ZONE' instead. */
+#undef HAVE_TM_ZONE
+
+/* Define to 1 if you don't have `tm_zone' but do have the external array
+ `tzname'. */
+#undef HAVE_TZNAME
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have zlib and its headers */
+#undef HAVE_ZLIB
+
+/* Define if your zlib has the compress2 function */
+#undef HAVE_ZLIB_COMPRESS2
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of a `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of a `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define if your libkpathsea supports enc formats */
+#undef __TDS_VERSION__
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
+
+#ifdef HAVE_APP_SERVICES
+#define XETEX
+#define XETEX_MAC
+#else
+#ifdef HAVE_LIBFONTCONFIG
+#define XETEX
+#endif
+#endif
diff --git a/Build/source/texk/xdvipdfmx/config.sub b/Build/source/texk/xdvipdfmx/config.sub
new file mode 100755
index 00000000000..1c366dfde9a
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/config.sub
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | ms1 \
+ | msp430 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | ms1-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/Build/source/texk/xdvipdfmx/configure b/Build/source/texk/xdvipdfmx/configure
new file mode 100755
index 00000000000..5a60c2118ce
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/configure
@@ -0,0 +1,10112 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="src/dvipdfmx.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE LN_S xdvipdfmx_LDFLAGS TDS_VERSION_11_TRUE TDS_VERSION_11_FALSE CPP EGREP LIBOBJS LIBPNGCPPFLAGS LDLIBPNG LIBPNGDEP ZLIBCPPFLAGS LDZLIB ZLIBDEP FREETYPE2CPPFLAGS LDFREETYPE2 FREETYPE2DEP FT2CPPFLAGS LDFT2 FT2DEP dvipdfmx_LDFLAGS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # 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 this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-tetex-build build as part of a teTeX installation
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-kpathsea=DIR use kpathsea include/library files from DIR
+ --with-ft2lib=LIB use freetype2 library LIB
+ --with-ft2include=DIR use freetype2 include files from DIR
+ --with-freetype2=DIR use installed freetype2 include & lib files from DIR
+ --with-system-pnglib use installed pnglib library
+ --with-pnglib-libdir=DIR
+ Specify directory where the png library (libpng.a) resides.
+ --with-pnglib-include=DIR
+ Specify the pnglib header files location.
+ --with-system-zlib use installed zlib library
+ --with-zlib-libdir=DIR
+ Specify directory where the zlib.a resides.
+ --with-zlib-include=DIR
+ Specify the zlib header files location.
+ --with-system-freetype2 use installed freetype2 library
+ --with-freetype2-libdir=DIR
+ Specify directory where the freetype2 library resides.
+ --with-freetype2-include=DIR
+ Specify the freetype2 header files location.
+ --with-paper=DIR use paper include/library files from DIR
+ --with-zlib=DIR use zlib include/library files from DIR
+ --with-png=DIR use png include/library files from DIR
+ --with-fontconfig=DIR use fontconfig include/library files from DIR
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=xdvipdfmx
+ VERSION=0.3
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+ ac_config_headers="$ac_config_headers config.h"
+
+echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi;
+ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+# Building inside teTeX or TeX Live?
+# Check whether --enable-tetex-build or --disable-tetex-build was given.
+if test "${enable_tetex_build+set}" = set; then
+ enableval="$enable_tetex_build"
+
+fi;
+
+
+if test "x$enable_tetex_build" = xyes; then
+ # In teTeX and TeX Live, LDFLAGS is passed by texk/Makefile and
+ # reserved for the user. Therefore we need another variable for the
+ # loader flags to find the local kpathsea. We use xdvipdfmx_LDFLAGS
+ # since Automake already sets that up in the link command.
+ xdvipdfmx_LDFLAGS=
+
+
+ if test ! -d $srcdir/../../texk/kpathsea; then
+ { { echo "$as_me:$LINENO: error:
+=========================================
+
+You specified --enable-tetex-build, but I can't find the kpathsea
+directory. I expected it to be in $srcdir/../../texk/kpathsea.
+
+=========================================" >&5
+echo "$as_me: error:
+=========================================
+
+You specified --enable-tetex-build, but I can't find the kpathsea
+directory. I expected it to be in $srcdir/../../texk/kpathsea.
+
+=========================================" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ CPPFLAGS="$CPPFLAGS -I\$(top_builddir)/../../texk -I\$(top_srcdir)/../../texk"
+ xdvipdfmx_LDFLAGS="-L\$(top_builddir)/../../texk/kpathsea/.libs"
+
+
+
+if true; then
+ TDS_VERSION_11_TRUE=
+ TDS_VERSION_11_FALSE='#'
+else
+ TDS_VERSION_11_TRUE='#'
+ TDS_VERSION_11_FALSE=
+fi
+
+ cat >>confdefs.h <<\_ACEOF
+#define __TDS_VERSION__ 0x200406L
+_ACEOF
+
+else
+
+# Check whether --with-kpathsea or --without-kpathsea was given.
+if test "${with_kpathsea+set}" = set; then
+ withval="$with_kpathsea"
+
+ if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ fi
+
+else
+
+ if test -d "$prefix"; then
+ CPPFLAGS="$CPPFLAGS -I$prefix/include"
+ LDFLAGS="$LDFLAGS -L$prefix/lib"
+ else
+ CPPFLAGS="$CPPFLAGS -I$ac_default_prefix/include"
+ LDFLAGS="$LDFLAGS -L$ac_default_prefix/lib"
+ fi
+
+fi;
+
+
+echo "$as_me:$LINENO: checking for kpse_find_file in -lkpathsea" >&5
+echo $ECHO_N "checking for kpse_find_file in -lkpathsea... $ECHO_C" >&6
+if test "${ac_cv_lib_kpathsea_kpse_find_file+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkpathsea $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char kpse_find_file ();
+int
+main ()
+{
+kpse_find_file ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_kpathsea_kpse_find_file=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_kpathsea_kpse_find_file=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_kpathsea_kpse_find_file" >&5
+echo "${ECHO_T}$ac_cv_lib_kpathsea_kpse_find_file" >&6
+if test $ac_cv_lib_kpathsea_kpse_find_file = yes; then
+ LIBS="-lkpathsea $LIBS"
+else
+ { { echo "$as_me:$LINENO: error: kpathsea library not found
+This version of xdvipdfmx requires the kpathsea library and its headers. If
+you know where it is you might try setting the LDFLAGS environment variable
+with -L pointing to the directory containing libkpathsea.a.
+ " >&5
+echo "$as_me: error: kpathsea library not found
+This version of xdvipdfmx requires the kpathsea library and its headers. If
+you know where it is you might try setting the LDFLAGS environment variable
+with -L pointing to the directory containing libkpathsea.a.
+ " >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+
+
+
+ echo "$as_me:$LINENO: checking whether you have kpathsea headers and they know about the required file formats" >&5
+echo $ECHO_N "checking whether you have kpathsea headers and they know about the required file formats... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <kpathsea/kpathsea.h>
+
+int
+main ()
+{
+
+kpse_tex_ps_header_format;
+kpse_type1_format;
+kpse_vf_format;
+kpse_ofm_format;
+kpse_ovf_format;
+kpse_truetype_format;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+echo "$as_me:$LINENO: checking for xbasename in -lkpathsea" >&5
+echo $ECHO_N "checking for xbasename in -lkpathsea... $ECHO_C" >&6
+if test "${ac_cv_lib_kpathsea_xbasename+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkpathsea $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char xbasename ();
+int
+main ()
+{
+xbasename ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_kpathsea_xbasename=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_kpathsea_xbasename=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_kpathsea_xbasename" >&5
+echo "${ECHO_T}$ac_cv_lib_kpathsea_xbasename" >&6
+if test $ac_cv_lib_kpathsea_xbasename = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBKPATHSEA 1
+_ACEOF
+
+ LIBS="-lkpathsea $LIBS"
+
+else
+ { { echo "$as_me:$LINENO: error:
+This version of dvipdfmx requires xbasename() in kpathsea library.
+ " >&5
+echo "$as_me: error:
+This version of dvipdfmx requires xbasename() in kpathsea library.
+ " >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6;
+ { { echo "$as_me:$LINENO: error:
+This version of dvipdfmx requires that kpathsea and its headers be installed.
+If you are sure they are installed and in a standard place, maybe you need a
+newer version of kpathsea? You also might try setting the environment
+variable CPPFLAGS (or CFLAGS) with -I pointing to the directory containing
+the file \"tex-file.h\"
+ " >&5
+echo "$as_me: error:
+This version of dvipdfmx requires that kpathsea and its headers be installed.
+If you are sure they are installed and in a standard place, maybe you need a
+newer version of kpathsea? You also might try setting the environment
+variable CPPFLAGS (or CFLAGS) with -I pointing to the directory containing
+the file \"tex-file.h\"
+ " >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+ echo "$as_me:$LINENO: checking whether kpathsea library supports TDS version 1.1 installation" >&5
+echo $ECHO_N "checking whether kpathsea library supports TDS version 1.1 installation... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <kpathsea/kpathsea.h>
+#include <kpathsea/tex-file.h>
+
+int
+main ()
+{
+
+kpse_enc_format;
+kpse_cmap_format;
+kpse_sfd_format;
+kpse_opentype_format;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6;
+
+cat >>confdefs.h <<\_ACEOF
+#define __TDS_VERSION__ 0x200406L
+_ACEOF
+
+
+
+if true; then
+ TDS_VERSION_11_TRUE=
+ TDS_VERSION_11_FALSE='#'
+else
+ TDS_VERSION_11_TRUE='#'
+ TDS_VERSION_11_FALSE=
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6;
+
+cat >>confdefs.h <<\_ACEOF
+#define __TDS_VERSION__ 0x200302L
+_ACEOF
+
+
+
+if false; then
+ TDS_VERSION_11_TRUE=
+ TDS_VERSION_11_FALSE='#'
+else
+ TDS_VERSION_11_TRUE='#'
+ TDS_VERSION_11_FALSE=
+fi
+
+
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ using_installed_freetype=yes
+
+# Check whether --with-ft2lib or --without-ft2lib was given.
+if test "${with_ft2lib+set}" = set; then
+ withval="$with_ft2lib"
+
+ if test x"$withval" != x; then
+ LIBS="$LIBS $withval"
+ using_installed_freetype=no
+ fi
+
+
+fi;
+
+# Check whether --with-ft2include or --without-ft2include was given.
+if test "${with_ft2include+set}" = set; then
+ withval="$with_ft2include"
+
+ if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval"
+ fi
+
+
+fi;
+
+# Check whether --with-freetype2 or --without-freetype2 was given.
+if test "${with_freetype2+set}" = set; then
+ withval="$with_freetype2"
+
+ if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include/freetype2"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ fi
+
+
+fi;
+ echo "$as_me:$LINENO: checking for freetype2 header files and library" >&5
+echo $ECHO_N "checking for freetype2 header files and library... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include "ft2build.h"
+#include FT_FREETYPE_H
+
+int
+main ()
+{
+
+FT_Face face;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ if test x"$using_installed_freetype" = xyes; then
+ echo "$as_me:$LINENO: checking for FT_Init_FreeType in -lfreetype" >&5
+echo $ECHO_N "checking for FT_Init_FreeType in -lfreetype... $ECHO_C" >&6
+if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lfreetype $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char FT_Init_FreeType ();
+int
+main ()
+{
+FT_Init_FreeType ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_freetype_FT_Init_FreeType=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_freetype_FT_Init_FreeType=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5
+echo "${ECHO_T}$ac_cv_lib_freetype_FT_Init_FreeType" >&6
+if test $ac_cv_lib_freetype_FT_Init_FreeType = yes; then
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBFREETYPE 1
+_ACEOF
+
+ LIBS="$LIBS -lfreetype"
+
+fi
+
+ else
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBFREETYPE 1
+_ACEOF
+
+ fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ { { echo "$as_me:$LINENO: error:
+This version of xdvipdfmx requires that FreeType2 and its headers be available.
+You can use the --with-freetype2 option to indicate the location of the installed
+freetype2, or --with-ft2lib and --with-ft2include to point to the libfreetype.a
+library and the FreeType2 include files." >&5
+echo "$as_me: error:
+This version of xdvipdfmx requires that FreeType2 and its headers be available.
+You can use the --with-freetype2 option to indicate the location of the installed
+freetype2, or --with-ft2lib and --with-ft2include to point to the libfreetype.a
+library and the FreeType2 include files." >&2;}
+ { (exit 1); exit 1; }; }
+
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+for ac_header in stdint.h inttypes.h sys/types.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking for working memcmp" >&5
+echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
+if test "${ac_cv_func_memcmp_working+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_memcmp_working=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Some versions of memcmp are not 8-bit clean. */
+ char c0 = 0x40, c1 = 0x80, c2 = 0x81;
+ if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0)
+ exit (1);
+
+ /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
+ or more and with at least one buffer not starting on a 4-byte boundary.
+ William Lewis provided this test program. */
+ {
+ char foo[21];
+ char bar[21];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ char *a = foo + i;
+ char *b = bar + i;
+ strcpy (a, "--------01111111");
+ strcpy (b, "--------10000000");
+ if (memcmp (a, b, 16) >= 0)
+ exit (1);
+ }
+ exit (0);
+ }
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_memcmp_working=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_memcmp_working=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5
+echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6
+test $ac_cv_func_memcmp_working = no && case $LIBOBJS in
+ "memcmp.$ac_objext" | \
+ *" memcmp.$ac_objext" | \
+ "memcmp.$ac_objext "* | \
+ *" memcmp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;;
+esac
+
+
+
+
+
+
+
+
+for ac_func in open close system getenv mkstemp basename
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5
+echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6
+if test "${ac_cv_struct_tm+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <time.h>
+
+int
+main ()
+{
+struct tm *tp; tp->tm_sec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_struct_tm=time.h
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5
+echo "${ECHO_T}$ac_cv_struct_tm" >&6
+if test $ac_cv_struct_tm = sys/time.h; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TM_IN_SYS_TIME 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for struct tm.tm_zone" >&5
+echo $ECHO_N "checking for struct tm.tm_zone... $ECHO_C" >&6
+if test "${ac_cv_member_struct_tm_tm_zone+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+
+
+int
+main ()
+{
+static struct tm ac_aggr;
+if (ac_aggr.tm_zone)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_tm_tm_zone=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+
+
+int
+main ()
+{
+static struct tm ac_aggr;
+if (sizeof ac_aggr.tm_zone)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member_struct_tm_tm_zone=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member_struct_tm_tm_zone=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member_struct_tm_tm_zone" >&5
+echo "${ECHO_T}$ac_cv_member_struct_tm_tm_zone" >&6
+if test $ac_cv_member_struct_tm_tm_zone = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_TM_TM_ZONE 1
+_ACEOF
+
+
+fi
+
+if test "$ac_cv_member_struct_tm_tm_zone" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TM_ZONE 1
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: checking for tzname" >&5
+echo $ECHO_N "checking for tzname... $ECHO_C" >&6
+if test "${ac_cv_var_tzname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <time.h>
+#ifndef tzname /* For SGI. */
+extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+#endif
+
+int
+main ()
+{
+atoi(*tzname);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_var_tzname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_var_tzname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_var_tzname" >&5
+echo "${ECHO_T}$ac_cv_var_tzname" >&6
+ if test $ac_cv_var_tzname = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TZNAME 1
+_ACEOF
+
+ fi
+fi
+
+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+if test "${ac_cv_c_bigendian+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_bigendian=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_bigendian=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+# It does not; compile a test program.
+if test "$cross_compiling" = yes; then
+ # try to guess the endianness by grepping values into an object file
+ ac_cv_c_bigendian=unknown
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
+int
+main ()
+{
+ _ascii (); _ebcdic ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
+ ac_cv_c_bigendian=yes
+fi
+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int
+main ()
+{
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long l;
+ char c[sizeof (long)];
+ } u;
+ u.l = 1;
+ exit (u.c[sizeof (long) - 1] == 1);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_bigendian=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+case $ac_cv_c_bigendian in
+ yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+ ;;
+ no)
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+
+
+echo "$as_me:$LINENO: checking for char" >&5
+echo $ECHO_N "checking for char... $ECHO_C" >&6
+if test "${ac_cv_type_char+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((char *) 0)
+ return 0;
+if (sizeof (char))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_char=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_char=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
+echo "${ECHO_T}$ac_cv_type_char" >&6
+
+echo "$as_me:$LINENO: checking size of char" >&5
+echo $ECHO_N "checking size of char... $ECHO_C" >&6
+if test "${ac_cv_sizeof_char+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_char" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_char=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (char)); }
+unsigned long ulongval () { return (long) (sizeof (char)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (char))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (char))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (char))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_char=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_char=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_char" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CHAR $ac_cv_sizeof_char
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6
+if test "${ac_cv_type_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((short *) 0)
+ return 0;
+if (sizeof (short))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_short=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_short=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6
+
+echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6
+if test "${ac_cv_sizeof_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_short" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_short=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (short)); }
+unsigned long ulongval () { return (long) (sizeof (short)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (short))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (short))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (short))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_short=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_short=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6
+if test "${ac_cv_type_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((int *) 0)
+ return 0;
+if (sizeof (int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6
+
+echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_int" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (int)); }
+unsigned long ulongval () { return (long) (sizeof (int)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (int))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6
+if test "${ac_cv_type_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long *) 0)
+ return 0;
+if (sizeof (long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6
+
+echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long)); }
+unsigned long ulongval () { return (long) (sizeof (long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+
+if test "x$enable_tetex_build" = xyes; then
+ # Get these common libraries from the sources, too.
+ # Seems like it would be simpler to treat kpathsea this way too, but
+ # we're just starting from what lcdf-typetools did.
+
+# Check whether --with-system-pnglib or --without-system-pnglib was given.
+if test "${with_system_pnglib+set}" = set; then
+ withval="$with_system_pnglib"
+
+fi;
+
+
+# Check whether --with-pnglib_libdir or --without-pnglib_libdir was given.
+if test "${with_pnglib_libdir+set}" = set; then
+ withval="$with_pnglib_libdir"
+
+fi;
+
+
+# Check whether --with-pnglib_include or --without-pnglib_include was given.
+if test "${with_pnglib_include+set}" = set; then
+ withval="$with_pnglib_include"
+
+fi;
+
+ if test "$needs_pnglib" = no; then
+ LIBPNGCPPFLAGS=
+ LDLIBPNG=
+ LIBPNGDEP=
+else
+ EXTRA_LIBPNG_INCLUDE=
+ EXTRA_LIBPNG_LIBDIR=
+
+ if test "$with_system_pnglib" = yes; then
+ if test "x$with_pnglib_libdir" != x; then
+ EXTRA_LIBPNG_LIBDIR="-L$with_pnglib_libdir"
+ fi
+ if test "x$with_pnglib_include" != x; then
+ EXTRA_LIBPNG_INCLUDE="-I$with_pnglib_include"
+ fi
+ fi
+
+ OLD_LDFLAGS=$LDFLAGS
+ OLD_CPP=$CPP
+ OLD_LIBS=$LIBS
+
+ LDFLAGS="$LDFLAGS $EXTRA_LIBPNG_LIBDIR"
+ CPP="$CPP $EXTRA_LIBPNG_INCLUDE"
+
+ if test "$with_system_pnglib" = yes; then
+ echo "$as_me:$LINENO: checking for png_set_read_fn in -lpng" >&5
+echo $ECHO_N "checking for png_set_read_fn in -lpng... $ECHO_C" >&6
+if test "${ac_cv_lib_png_png_set_read_fn+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpng -lz -lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char png_set_read_fn ();
+int
+main ()
+{
+png_set_read_fn ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_png_png_set_read_fn=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_png_png_set_read_fn=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_set_read_fn" >&5
+echo "${ECHO_T}$ac_cv_lib_png_png_set_read_fn" >&6
+if test $ac_cv_lib_png_png_set_read_fn = yes; then
+ pnglib=-lpng
+else
+ { echo "$as_me:$LINENO: WARNING: Standard PNG library not found. Compiling my own." >&5
+echo "$as_me: WARNING: Standard PNG library not found. Compiling my own." >&2;}
+ with_system_pnglib=no
+fi
+
+ fi
+
+ LDFLAGS=$OLD_LDFLAGS
+ CPP=$OLD_CPP
+ LIBS=$OLD_LIBS
+
+ if test "$with_system_pnglib" != yes; then
+ LIBPNGCPPFLAGS='-I$(LIBPNGDIR) -I$(LIBPNGSRCDIR)'
+ LDLIBPNG='$(LIBPNGDIR)/libpng.a'
+ LIBPNGDEP='$(LIBPNGDIR)/libpng.a'
+ using_system_pnglib=no
+ else
+ LIBPNGCPPFLAGS="$EXTRA_LIBPNG_INCLUDE"
+ LDLIBPNG="$EXTRA_LIBPNG_LIBDIR -lpng"
+ LIBPNGDEP=
+ using_system_pnglib=yes
+ fi
+fi
+
+
+
+
+
+
+
+# Check whether --with-system_zlib or --without-system_zlib was given.
+if test "${with_system_zlib+set}" = set; then
+ withval="$with_system_zlib"
+
+fi;
+
+
+# Check whether --with-zlib_libdir or --without-zlib_libdir was given.
+if test "${with_zlib_libdir+set}" = set; then
+ withval="$with_zlib_libdir"
+
+fi;
+
+
+# Check whether --with-zlib_include or --without-zlib_include was given.
+if test "${with_zlib_include+set}" = set; then
+ withval="$with_zlib_include"
+
+fi;
+
+ if test "$needs_zlib" = no; then
+ ZLIBCPPFLAGS=
+ LDZLIB=
+ ZLIBDEP=
+else
+ EXTRA_ZLIB_INCLUDE=
+ EXTRA_ZLIB_LIBDIR=
+
+ if test "$with_system_zlib" = yes; then
+ if test "x$with_zlib_libdir" != x; then
+ EXTRA_ZLIB_LIBDIR="-L$with_zlib_libdir"
+ fi
+ if test "x$with_zlib_include" != x; then
+ EXTRA_ZLIB_INCLUDE="-I$with_zlib_include"
+ fi
+ fi
+
+ OLD_LDFLAGS=$LDFLAGS
+ OLD_CPP=$CPP
+ OLD_LIBS=$LIBS
+
+ LDFLAGS="$LDFLAGS $EXTRA_ZLIB_LIBDIR"
+ CPP="$CPP $EXTRA_ZLIB_INCLUDE"
+
+ if test "$with_system_zlib" = yes; then
+
+echo "$as_me:$LINENO: checking for inflate in -lz" >&5
+echo $ECHO_N "checking for inflate in -lz... $ECHO_C" >&6
+if test "${ac_cv_lib_z_inflate+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char inflate ();
+int
+main ()
+{
+inflate ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_z_inflate=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_z_inflate=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_z_inflate" >&5
+echo "${ECHO_T}$ac_cv_lib_z_inflate" >&6
+if test $ac_cv_lib_z_inflate = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBZ 1
+_ACEOF
+
+ LIBS="-lz $LIBS"
+
+else
+ { echo "$as_me:$LINENO: WARNING: Standard ZLIB library not found. Compiling my own." >&5
+echo "$as_me: WARNING: Standard ZLIB library not found. Compiling my own." >&2;}
+ with_system_zlib=no
+fi
+
+ fi
+
+ if test "$with_system_zlib" = yes; then
+
+for ac_header in zlib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ if test "$ac_cv_header_zlib_h" != yes; then
+ { echo "$as_me:$LINENO: WARNING: zlib.h not found. Using my own zlib sources." >&5
+echo "$as_me: WARNING: zlib.h not found. Using my own zlib sources." >&2;}
+ with_system_zlib=no
+ fi
+ fi
+
+ LDFLAGS=$OLD_LDFLAGS
+ CPP=$OLD_CPP
+ LIBS=$OLD_LIBS
+
+ if test "$with_system_zlib" != yes; then
+ ZLIBCPPFLAGS='-I$(ZLIBDIR) -I$(ZLIBSRCDIR)'
+ LDZLIB='$(ZLIBDIR)/libz.a'
+ ZLIBDEP='$(ZLIBDIR)/libz.a'
+ using_system_zlib=no
+ else
+ ZLIBCPPFLAGS="$EXTRA_ZLIB_INCLUDE"
+ LDZLIB="$EXTRA_ZLIB_LIBDIR -lz"
+ ZLIBDEP=
+ using_system_zlib=yes
+ fi
+fi
+
+
+
+
+
+
+
+# Check whether --with-system_freetype2 or --without-system_freetype2 was given.
+if test "${with_system_freetype2+set}" = set; then
+ withval="$with_system_freetype2"
+
+fi;
+
+
+# Check whether --with-freetype2_libdir or --without-freetype2_libdir was given.
+if test "${with_freetype2_libdir+set}" = set; then
+ withval="$with_freetype2_libdir"
+
+fi;
+
+
+# Check whether --with-freetype2_include or --without-freetype2_include was given.
+if test "${with_freetype2_include+set}" = set; then
+ withval="$with_freetype2_include"
+
+fi;
+
+ if test "$needs_freetype2" = no; then
+ FREETYPE2CPPFLAGS=
+ LDFREETYPE2=
+ FREETYPE2DEP=
+else
+ EXTRA_FREETYPE2_INCLUDE=
+ EXTRA_FREETYPE2_LIBDIR=
+
+ if test "$with_system_freetype2" = yes; then
+ if test "x$with_freetype2_libdir" != x; then
+ EXTRA_FREETYPE2_LIBDIR="-L$with_freetype2_libdir"
+ fi
+ if test "x$with_freetype2_include" != x; then
+ EXTRA_FREETYPE2_INCLUDE="-I$with_freetype2_include"
+ fi
+ fi
+
+ OLD_LDFLAGS=$LDFLAGS
+ OLD_CPP=$CPP
+ OLD_LIBS=$LIBS
+
+ LDFLAGS="$LDFLAGS $EXTRA_FREETYPE2_LIBDIR"
+ CPP="$CPP $EXTRA_FREETYPE2_INCLUDE"
+
+ if test "$with_system_freetype2" = yes; then
+
+echo "$as_me:$LINENO: checking for FT_Init_FreeType in -lfreetype" >&5
+echo $ECHO_N "checking for FT_Init_FreeType in -lfreetype... $ECHO_C" >&6
+if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lfreetype $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char FT_Init_FreeType ();
+int
+main ()
+{
+FT_Init_FreeType ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_freetype_FT_Init_FreeType=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_freetype_FT_Init_FreeType=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5
+echo "${ECHO_T}$ac_cv_lib_freetype_FT_Init_FreeType" >&6
+if test $ac_cv_lib_freetype_FT_Init_FreeType = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBFREETYPE 1
+_ACEOF
+
+ LIBS="-lfreetype $LIBS"
+
+else
+ { echo "$as_me:$LINENO: WARNING: Standard FreeType2 library not found. Compiling my own." >&5
+echo "$as_me: WARNING: Standard FreeType2 library not found. Compiling my own." >&2;}
+ with_system_freetype2=no
+fi
+
+ fi
+
+ if test "$with_system_freetype2" = yes; then
+
+for ac_header in ft2build.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ if test "$ac_cv_header_ft2build_h" != yes; then
+ { echo "$as_me:$LINENO: WARNING: ft2build.h not found. Using my own freetype2 sources." >&5
+echo "$as_me: WARNING: ft2build.h not found. Using my own freetype2 sources." >&2;}
+ with_system_freetype2=no
+ fi
+ fi
+
+ LDFLAGS=$OLD_LDFLAGS
+ CPP=$OLD_CPP
+ LIBS=$OLD_LIBS
+
+ if test "$with_system_freetype2" != yes; then
+ FREETYPE2CPPFLAGS='-I$(FREETYPE2SRCDIR)/include'
+ LDFREETYPE2='$(FREETYPE2DIR)/.libs/libfreetype.a'
+ FREETYPE2DEP='$(FREETYPE2DIR)/.libs/libfreetype.a'
+ using_system_freetype2=no
+ else
+ FREETYPE2CPPFLAGS="$EXTRA_FREETYPE2_INCLUDE"
+ LDFREETYPE2="$EXTRA_FREETYPE2_LIBDIR -lfreetype"
+ FREETYPE2DEP=
+ using_system_freetype2=yes
+ fi
+fi
+
+
+
+
+
+
+ # yes, we have zlib and png.
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_ZLIB 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBPNG 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_FREETYPE2 1
+_ACEOF
+
+
+ # You must define HAVE_ZLIB_COMPRESS2 to enable '-z' option for controlling
+ # zlib compression level, but zlib.ac included above does not do this test.
+ # We assume zlib always has compress2() here although that's not always true.
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ZLIB_COMPRESS2 1
+_ACEOF
+
+
+ # tetex/tex live build; this always has kpathsea, xbasename, etc.,
+ # as we're building from current sources. Do this stuff at the end so
+ # other configure tests don't try to link with kpathsea (which doesn't
+ # exist at configure time).
+ LIBS="-lkpathsea -lm $LIBS"
+ { echo "$as_me:$LINENO: tetex build enabled, LIBS now: $LIBS" >&5
+echo "$as_me: tetex build enabled, LIBS now: $LIBS" >&6;}
+else
+
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+
+# Check whether --with-paper or --without-paper was given.
+if test "${with_paper+set}" = set; then
+ withval="$with_paper"
+
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+
+
+fi;
+ echo "$as_me:$LINENO: checking for paper header files" >&5
+echo $ECHO_N "checking for paper header files... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <paper.h>
+
+int
+main ()
+{
+
+struct paper *p;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ echo "$as_me:$LINENO: checking for paperpswidth in -lpaper" >&5
+echo $ECHO_N "checking for paperpswidth in -lpaper... $ECHO_C" >&6
+if test "${ac_cv_lib_paper_paperpswidth+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpaper $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char paperpswidth ();
+int
+main ()
+{
+paperpswidth ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_paper_paperpswidth=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_paper_paperpswidth=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_paper_paperpswidth" >&5
+echo "${ECHO_T}$ac_cv_lib_paper_paperpswidth" >&6
+if test $ac_cv_lib_paper_paperpswidth = yes; then
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBPAPER 1
+_ACEOF
+
+ LIBS="$LIBS -lpaper"
+
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+
+# Check whether --with-zlib or --without-zlib was given.
+if test "${with_zlib+set}" = set; then
+ withval="$with_zlib"
+
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+
+
+fi;
+ echo "$as_me:$LINENO: checking for zlib header files" >&5
+echo $ECHO_N "checking for zlib header files... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <zlib.h>
+
+int
+main ()
+{
+
+z_stream p;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ echo "$as_me:$LINENO: checking for compress in -lz" >&5
+echo $ECHO_N "checking for compress in -lz... $ECHO_C" >&6
+if test "${ac_cv_lib_z_compress+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char compress ();
+int
+main ()
+{
+compress ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_z_compress=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_z_compress=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_z_compress" >&5
+echo "${ECHO_T}$ac_cv_lib_z_compress" >&6
+if test $ac_cv_lib_z_compress = yes; then
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ZLIB 1
+_ACEOF
+
+ LIBS="$LIBS -lz"
+ echo "$as_me:$LINENO: checking for compress2 in -lz" >&5
+echo $ECHO_N "checking for compress2 in -lz... $ECHO_C" >&6
+if test "${ac_cv_lib_z_compress2+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char compress2 ();
+int
+main ()
+{
+compress2 ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_z_compress2=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_z_compress2=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_z_compress2" >&5
+echo "${ECHO_T}$ac_cv_lib_z_compress2" >&6
+if test $ac_cv_lib_z_compress2 = yes; then
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ZLIB_COMPRESS2 1
+_ACEOF
+
+
+fi
+
+
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+CPPFLAGS=$_cppflags LDDFLAGS=$_ldflags echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+
+# Check whether --with-png or --without-png was given.
+if test "${with_png+set}" = set; then
+ withval="$with_png"
+
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+
+
+fi;
+ echo "$as_me:$LINENO: checking for pow" >&5
+echo $ECHO_N "checking for pow... $ECHO_C" >&6
+if test "${ac_cv_func_pow+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define pow to an innocuous variant, in case <limits.h> declares pow.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define pow innocuous_pow
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char pow (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef pow
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pow ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_pow) || defined (__stub___pow)
+choke me
+#else
+char (*f) () = pow;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != pow;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_pow=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_pow=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_pow" >&5
+echo "${ECHO_T}$ac_cv_func_pow" >&6
+if test $ac_cv_func_pow = yes; then
+ :
+else
+ echo "$as_me:$LINENO: checking for pow in -lm" >&5
+echo $ECHO_N "checking for pow in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_pow+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pow ();
+int
+main ()
+{
+pow ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_pow=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_pow=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_pow" >&5
+echo "${ECHO_T}$ac_cv_lib_m_pow" >&6
+if test $ac_cv_lib_m_pow = yes; then
+ LIBS="$LIBS -lm"
+fi
+
+fi
+
+ echo "$as_me:$LINENO: checking for png header files" >&5
+echo $ECHO_N "checking for png header files... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <png.h>
+
+int
+main ()
+{
+
+png_infop p;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ echo "$as_me:$LINENO: checking for png_get_image_width in -lpng" >&5
+echo $ECHO_N "checking for png_get_image_width in -lpng... $ECHO_C" >&6
+if test "${ac_cv_lib_png_png_get_image_width+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpng -lz
+ $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char png_get_image_width ();
+int
+main ()
+{
+png_get_image_width ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_png_png_get_image_width=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_png_png_get_image_width=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_get_image_width" >&5
+echo "${ECHO_T}$ac_cv_lib_png_png_get_image_width" >&6
+if test $ac_cv_lib_png_png_get_image_width = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBPNG 1
+_ACEOF
+
+ LIBS="$LIBS -lpng"
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+
+
+
+
+
+
+
+
+
+fi
+
+
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+
+# Check whether --with-fontconfig or --without-fontconfig was given.
+if test "${with_fontconfig+set}" = set; then
+ withval="$with_fontconfig"
+
+if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+fi
+
+
+fi;
+ echo "$as_me:$LINENO: checking for fontconfig header files" >&5
+echo $ECHO_N "checking for fontconfig header files... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <fontconfig/fontconfig.h>
+
+int
+main ()
+{
+
+FcObjectSet *os;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ echo "$as_me:$LINENO: checking for FcInit in -lfontconfig" >&5
+echo $ECHO_N "checking for FcInit in -lfontconfig... $ECHO_C" >&6
+if test "${ac_cv_lib_fontconfig_FcInit+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lfontconfig $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char FcInit ();
+int
+main ()
+{
+FcInit ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_fontconfig_FcInit=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_fontconfig_FcInit=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_fontconfig_FcInit" >&5
+echo "${ECHO_T}$ac_cv_lib_fontconfig_FcInit" >&6
+if test $ac_cv_lib_fontconfig_FcInit = yes; then
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBFONTCONFIG 1
+_ACEOF
+
+ LIBS="$LIBS -lfontconfig"
+
+fi
+
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ _cppflags=$CPPFLAGS _ldflags=$LDFLAGS
+ echo "$as_me:$LINENO: checking for Mac OS X ApplicationServices framework" >&5
+echo $ECHO_N "checking for Mac OS X ApplicationServices framework... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <ApplicationServices/ApplicationServices.h>
+
+int
+main ()
+{
+
+ATSFontRef fontRef;
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_APP_SERVICES 1
+_ACEOF
+
+ LIBS="$LIBS -framework ApplicationServices"
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+ ac_config_files="$ac_config_files Makefile data/Makefile src/Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${TDS_VERSION_11_TRUE}" && test -z "${TDS_VERSION_11_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"TDS_VERSION_11\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"TDS_VERSION_11\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${TDS_VERSION_11_TRUE}" && test -z "${TDS_VERSION_11_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"TDS_VERSION_11\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"TDS_VERSION_11\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${TDS_VERSION_11_TRUE}" && test -z "${TDS_VERSION_11_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"TDS_VERSION_11\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"TDS_VERSION_11\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "data/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
+ "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@LN_S@,$LN_S,;t t
+s,@xdvipdfmx_LDFLAGS@,$xdvipdfmx_LDFLAGS,;t t
+s,@TDS_VERSION_11_TRUE@,$TDS_VERSION_11_TRUE,;t t
+s,@TDS_VERSION_11_FALSE@,$TDS_VERSION_11_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LIBPNGCPPFLAGS@,$LIBPNGCPPFLAGS,;t t
+s,@LDLIBPNG@,$LDLIBPNG,;t t
+s,@LIBPNGDEP@,$LIBPNGDEP,;t t
+s,@ZLIBCPPFLAGS@,$ZLIBCPPFLAGS,;t t
+s,@LDZLIB@,$LDZLIB,;t t
+s,@ZLIBDEP@,$ZLIBDEP,;t t
+s,@FREETYPE2CPPFLAGS@,$FREETYPE2CPPFLAGS,;t t
+s,@LDFREETYPE2@,$LDFREETYPE2,;t t
+s,@FREETYPE2DEP@,$FREETYPE2DEP,;t t
+s,@FT2CPPFLAGS@,$FT2CPPFLAGS,;t t
+s,@LDFT2@,$LDFT2,;t t
+s,@FT2DEP@,$FT2DEP,;t t
+s,@dvipdfmx_LDFLAGS@,$dvipdfmx_LDFLAGS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/Build/source/texk/xdvipdfmx/configure.in b/Build/source/texk/xdvipdfmx/configure.in
new file mode 100644
index 00000000000..53c07f49042
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/configure.in
@@ -0,0 +1,151 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(src/dvipdfmx.c)
+AM_INIT_AUTOMAKE(xdvipdfmx, 0.3)
+AM_CONFIG_HEADER(config.h)
+AM_MAINTAINER_MODE
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+
+# Building inside teTeX or TeX Live?
+AC_ARG_ENABLE(tetex-build, [ --enable-tetex-build build as part of a teTeX installation])
+
+
+dnl Check for kpathsea library. (required)
+if test "x$enable_tetex_build" = xyes; then
+ # In teTeX and TeX Live, LDFLAGS is passed by texk/Makefile and
+ # reserved for the user. Therefore we need another variable for the
+ # loader flags to find the local kpathsea. We use xdvipdfmx_LDFLAGS
+ # since Automake already sets that up in the link command.
+ xdvipdfmx_LDFLAGS=
+ AC_SUBST(xdvipdfmx_LDFLAGS)
+
+ if test ! -d $srcdir/../../texk/kpathsea; then
+ AC_MSG_ERROR([
+=========================================
+
+You specified --enable-tetex-build, but I can't find the kpathsea
+directory. I expected it to be in $srcdir/../../texk/kpathsea.
+
+=========================================])
+ fi
+ CPPFLAGS="$CPPFLAGS -I\$(top_builddir)/../../texk -I\$(top_srcdir)/../../texk"
+ xdvipdfmx_LDFLAGS="-L\$(top_builddir)/../../texk/kpathsea/.libs"
+
+ AM_CONDITIONAL(TDS_VERSION_11, true)
+ AC_DEFINE([__TDS_VERSION__], 0x200406L)
+else
+ dnl Don't bother going further if we don't have kpse installed.
+ AC_ARG_WITH(kpathsea,
+ [ --with-kpathsea=DIR use kpathsea include/library files from DIR], [
+ if test -d "$withval"; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ fi
+ ], [
+ if test -d "$prefix"; then
+ CPPFLAGS="$CPPFLAGS -I$prefix/include"
+ LDFLAGS="$LDFLAGS -L$prefix/lib"
+ else
+ CPPFLAGS="$CPPFLAGS -I$ac_default_prefix/include"
+ LDFLAGS="$LDFLAGS -L$ac_default_prefix/lib"
+ fi
+ ])
+
+ AC_CHECK_LIB(kpathsea, kpse_find_file, [LIBS="-lkpathsea $LIBS"],
+ AC_MSG_ERROR([kpathsea library not found
+This version of xdvipdfmx requires the kpathsea library and its headers. If
+you know where it is you might try setting the LDFLAGS environment variable
+with -L pointing to the directory containing libkpathsea.a.
+ ])
+ )
+
+ dnl Check kpathsea support for required formats and funcs.
+ AC_CHECK_KPSE_SUPPORT
+
+ dnl Check for TDS version kpathsea library supports.
+ AC_CHECK_KPSE_TDS_VERSION
+
+ dnl Check for libfreetype, required for xdvipdfmx features
+ AC_CHECK_LIBFREETYPE
+fi
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(unistd.h)
+AC_CHECK_HEADERS(stdint.h inttypes.h sys/types.h)
+
+dnl Checks for library functions.
+AC_FUNC_MEMCMP
+AC_CHECK_FUNCS(open close system getenv mkstemp basename)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_INLINE
+AC_TYPE_SIZE_T
+AC_STRUCT_TM
+AC_STRUCT_TIMEZONE
+AC_C_BIGENDIAN
+
+AC_CHECK_SIZEOF(char)
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+
+dnl Check for additonal libraries.
+if test "x$enable_tetex_build" = xyes; then
+ # Get these common libraries from the sources, too.
+ # Seems like it would be simpler to treat kpathsea this way too, but
+ # we're just starting from what lcdf-typetools did.
+ sinclude(../../libs/libpng/withenable.ac)
+ sinclude(../../libs/libpng/libpng.ac)
+
+ sinclude(../../libs/zlib/withenable.ac)
+ sinclude(../../libs/zlib/zlib.ac)
+
+ sinclude(../../libs/freetype2/withenable.ac)
+ sinclude(../../libs/freetype2/freetype2.ac)
+
+ # yes, we have zlib and png.
+ AC_DEFINE(HAVE_ZLIB)
+ AC_DEFINE(HAVE_LIBPNG)
+ AC_DEFINE(HAVE_FREETYPE2)
+
+ # You must define HAVE_ZLIB_COMPRESS2 to enable '-z' option for controlling
+ # zlib compression level, but zlib.ac included above does not do this test.
+ # We assume zlib always has compress2() here although that's not always true.
+ AC_DEFINE(HAVE_ZLIB_COMPRESS2, 1, [Define if your zlib has the compress2 function])
+
+ # tetex/tex live build; this always has kpathsea, xbasename, etc.,
+ # as we're building from current sources. Do this stuff at the end so
+ # other configure tests don't try to link with kpathsea (which doesn't
+ # exist at configure time).
+ LIBS="-lkpathsea -lm $LIBS"
+ AC_MSG_NOTICE([tetex build enabled, LIBS now: $LIBS])
+else
+ AC_HAS_LIBPAPER
+ AC_HAS_ZLIB
+ AC_HAS_LIBPNG
+
+dnl these variables are defined in the tetex case and used in src/Makefile.am.
+dnl just let them be empty.
+ AC_SUBST(LIBPNGCPPFLAGS)
+ AC_SUBST(LDLIBPNG)
+ AC_SUBST(LIBPNGDEP)
+ AC_SUBST(ZLIBCPPFLAGS)
+ AC_SUBST(LDZLIB)
+ AC_SUBST(ZLIBDEP)
+ AC_SUBST(FT2CPPFLAGS)
+ AC_SUBST(LDFT2)
+ AC_SUBST(FT2DEP)
+ AC_SUBST(dvipdfmx_LDFLAGS)
+fi
+
+dnl Check for additonal libraries.
+AC_HAS_LIBFONTCONFIG
+AC_HAS_APP_SERVICES
+
+AC_OUTPUT(Makefile data/Makefile src/Makefile)
diff --git a/Build/source/texk/xdvipdfmx/contrib/context/spec-dpx.tex b/Build/source/texk/xdvipdfmx/contrib/context/spec-dpx.tex
new file mode 100644
index 00000000000..0feffbf0b90
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/contrib/context/spec-dpx.tex
@@ -0,0 +1,841 @@
+%D \module
+%D [ file=spec-dpx,
+%D version=2005.08.12,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=DVIPDFMx support,
+%D author=Jin-Hwan Cho,
+%D date=\currentdate,
+%D copyright={Jin-Hwan Cho \& Hans Hagen}]
+%C
+%C DVIPDFMx is an eXtended version of the DVIPDFM, a DVI to PDF
+%C translator, still under construction by Jin-Hwan Cho and
+%C Shunsaku Hirata.
+%C
+%C It supports multi-byte character encodings and large character
+%C sets for East Asian languages by CID-keyed font technology,
+%C and many features including PDF encryption, PDF bookmarks and
+%C annotations with Chinese, Japanese, Korean characters, etc.
+%C
+%C DVIPDFMx (and information) can be downloaded from:
+%C
+%C http://project.ktug.or.kr/dvipdfmx/
+
+\unprotect
+
+%D This driver is built on top of the general \PDF\ macros,
+%D as defined in \type{spec-fdf}, so we inherit that one.
+
+\startspecials[dpx][reset,fdf]
+
+%D 1. Modified codes from \type{spec-dpm}
+
+%D \macros
+%D {jobsuffix}
+%D
+%D Because no intermediate output format is used, we set the
+%D jobsuffix to \PDF.
+
+\setjobsuffix{pdf}
+
+%D Map files (experimental)
+
+\definespecial\doloadmapfile#1#2%
+ {\flushatshipout{\special{pdf:mapfile +#2}}}
+
+%D DVIPDFMx supports the special command \type{pdf: literal ...}
+%D since the version \type{dvipdfmx-20021028}.
+%D
+%D 1. \type{pdf: literal #1} puts the given PDF commands \#1
+%D after changing the text matrix with \type{"1 0 0 1 x y cm"}
+%D to set the current DVI position $(x,y)$ to the origin.
+%D
+%D 2. \type{pdf: literal reverse #1} puts the given PDF commands \#1
+%D after changing the text matrix with \type{"1 0 0 1 -x -y cm"}.
+%D
+%D 3. \type{pdf: literal direct #1} puts directly the given PDF
+%D commands \#1 without changing the text matrix.
+%D
+%D Since the version \type{dvipdfmx-20050812}, the role of the special
+%D command \type{pdf:literal} is changed so that
+%D
+%D 1. \type{pdf:literal #1} puts the given PDF commands \#1
+%D after changing the text matrix with \type{"1 0 0 1 x y cm"}
+%D to set the current DVI position $(x,y)$ to the origin. After that
+%D it restores the previous setting by changing the text matrix with
+%D \type{"1 0 0 1 -x -y cm"}.
+%D
+%D 2. \type{pdf:literal direct #1} puts directly the given PDF commands
+%D #1 without changing the text matrix.
+%D
+%D Literal \PDF\ inclusion is implemented as:
+
+\def\PDFcode #1{\special{pdf:literal #1}}
+\def\PDFcontentcode#1{\special{pdf:content #1}}
+\def\PDFdirectcode #1{\special{pdf:literal direct #1}}
+
+%D \type{\dosetuppaper} in \type{spec-dpm} did not work properly
+%D because DVIPDFM did not permit changing the page size.
+%D
+%D However, DVIPDFMx permits different page size in each page
+%D since the version \type{dvipdfmx-20021028}.
+%D
+%D \macros
+%D {dosetuppaper}
+%D
+%D A simple one.
+
+\definespecial\dosetuppaper#1#2#3%
+ {\bgroup
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \special{pdf:pagesize width \width height \height}%
+ \egroup}
+
+%D \macros
+%D {doinsertfile}
+%D
+%D Only \METAPOST, \BMP\ \JPG\ \PNG\ and \PDF\ inclusion are supported.
+
+\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9%
+ {\dodoinsertfile{dpx}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}
+
+%D Even though DVIPDFM supports \METAPOST directly, the funtionality
+%D is not good. It conflicts much with \CONTEXT.
+%D
+%D So, \METAPOST will be treated as the same way as PDFTeX using
+%D MPtoPDF in DVIPDFMx since the version \type{dvipdfmx-20021028}.
+
+%\definefileinsertion{dpx}{mps}#1#2#3#4#5#6#7#8#9%
+% {\hbox
+% {%\convertMPcolors{#1}% plugged in supp-mpe
+% \scratchdimen#3\points \PointsToReal{.01\scratchdimen}\xscale
+% \scratchdimen#4\points \PointsToReal{.01\scratchdimen}\yscale
+% \convertMPtoPDF{#1}\xscale\yscale
+% \global\let\PDFimagereference\empty}}
+
+%D DVIPDFM (and DVIPDFMx too) supports the image files with
+%D the extension, \PDF, \JPG, \PNG, \BMP, and \EPS.
+
+\def\handleepsimage#1#2#3#4#5#6#7#8#9%
+ {\PointsToWholeBigPoints{#7}\width
+ \PointsToWholeBigPoints{#8}\height
+ \special
+ {PSfile="#1"\space
+ llx=\EPSllx\space lly=\EPSlly\space
+ urx=\EPSurx\space ury=\EPSury\space
+ rwi=\width0\space rhi=\height0}}
+
+\definefileinsertion{dpx}{mps}{\handleepsimage}
+\definefileinsertion{dpx}{eps}{\handleepsimage} % unstable
+
+\def\handlebmpimage#1#2#3#4#5#6#7#8#9%
+ {\bgroup
+ \scratchdimen#7\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#8\edef\height{\the\scratchdimen\space}%
+ \special{pdf: image width \width height \height (#1)}%
+ \egroup}
+
+\definefileinsertion{dpx}{pdf}{\handlebmpimage}
+\definefileinsertion{dpx}{jpg}{\handlebmpimage}
+\definefileinsertion{dpx}{png}{\handlebmpimage}
+\definefileinsertion{dpx}{bmp}{\handlebmpimage}
+
+\definefileinsertion{dpx}{mov}{\doPDFinsertmov}
+\definefileinsertion{dpx}{avi}{\doPDFinsertmov}
+
+%D \macros
+%D {doinsertsoundtrack}
+%D
+%D Sounds are supported too.
+
+\definespecial\doinsertsoundtrack{\doPDFinsertsoundtrack}
+
+%D \type{\doPDFovalbox} in \type{spec-fdf} was modifed because
+%D the definition of \type{\PDFcode} was changed in this module.
+%D
+%D \macros
+%D {doPDFovalbox}
+%D
+%D For drawing ovals we use quite raw \PDF\ code. The next
+%D implementation does not differ that much from the one
+%D implemented in the \POSTSCRIPT\ driver.
+
+\def\doPDFovalbox#1#2#3#4#5#6#7% todo: \scratchdimen/\scatchbox
+ {\bgroup
+ \dimen0=#4\divide\dimen0 2
+ \doPDFovalcalc{0pt}{+\dimen0}\xmin
+ \doPDFovalcalc{#1}{-\dimen0}\xmax
+ \doPDFovalcalc{#2}{-\dimen0}\ymax
+ \doPDFovalcalc{-#3}{+\dimen0}\ymin
+ \advance\dimen0 by #5%
+ \doPDFovalcalc{0pt}{+\dimen0}\xxmin
+ \doPDFovalcalc{#1}{-\dimen0}\xxmax
+ \doPDFovalcalc{#2}{-\dimen0}\yymax
+ \doPDFovalcalc{-#3}{+\dimen0}\yymin
+ \doPDFovalcalc{#4}{\zeropoint}\stroke
+ \doPDFovalcalc{#5}{\zeropoint}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \setbox0\hbox
+ {\ifnum\dostroke\dofill>0
+ \ifPDFstrokecolor\else\ifnum\dostroke=1
+ \writestatus\m!colors{pdf stroke color will fail}\wait
+ \fi\fi
+ \special{pdf:content
+ \stroke\space w
+ \xxmin\space \ymin\space m
+ \xxmax\space \ymin\space l
+ \xmax \space \ymin\space \xmax\space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax\space \xxmax\space \ymax\space y
+ \xxmin\space \ymax\space l
+ \xmin \space \ymax\space \xmin\space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin\space \xxmin\space \ymin\space y
+ \ifnum\dostroke=1 S \fi
+ \ifnum\dofill=1 f \fi}%
+ \fi}%
+ \wd0=#1\ht0=#2\dp0=#3\box0
+ \egroup}
+
+%D \macros
+%D {doovalbox}
+
+\definespecial\doovalbox{\doPDFovalbox}
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,
+%D dostopcolormode,
+%D dostartrotation,dostoprotation,
+%D dostartscaling,dostopscaling,
+%D dostartmirroring,dostopmirroring,
+%D dostartnegative,dostopnegative}
+%D
+%D Unfortunately the direct \PDF\ inclusion is not suited
+%D for the next macros, which means that we cannot use the
+%D \type {\doPDF..} alternatives. Since \CONTEXT\ maintains
+%D its own colorstack, we use the \DVIPS\ alternatives.
+
+\definespecial\dostartgraymode {\doPDFstartgraymode}
+\definespecial\dostopgraymode {\doPDFstopgraymode}
+\definespecial\dostartrgbcolormode {\doPDFstartrgbcolormode}
+\definespecial\dostartcmykcolormode{\doPDFstartcmykcolormode}
+\definespecial\dostartgraycolormode{\doPDFstartgraycolormode}
+\definespecial\dostartspotcolormode{\doPDFstartspotcolormode}
+\definespecial\dostopcolormode {\doPDFstopcolormode}
+
+\definespecial\doregistercmykspotcolor{\doPDFregistercmykspotcolor}
+\definespecial\doregisterrgbspotcolor {\doPDFregisterrgbspotcolor}
+\definespecial\doregistergrayspotcolor{\doPDFregistergrayspotcolor}
+
+\definespecial\doregistercmykindexcolor{\doPDFregistercmykindexcolor}
+\definespecial\doregisterrgbindexcolor {\doPDFregisterrgbindexcolor}
+\definespecial\doregistergrayindexcolor{\doPDFregistergrayindexcolor}
+
+\definespecial\doregisterfigurecolor{\doPDFregisterfigurecolor}
+
+\definespecial\dostartnonecolormode{\doPDFstartnonecolormode}
+\definespecial\doregisternonecolor {\doPDFregisternonecolor}
+
+\definespecial\dostartrotation #1{\special{pdf:btrans rotate #1}}
+\definespecial\dostoprotation {\special{pdf:etrans}}
+\definespecial\dostartscaling#1#2{\special{pdf:btrans xscale #1 yscale #2}}
+\definespecial\dostopscaling {\special{pdf:etrans}}
+\definespecial\dostartmirroring {\special{pdf:btrans xscale -1}}
+\definespecial\dostopmirroring {\special{pdf:etrans}}
+
+%D Negation is not (yet) supported:
+\definespecial\dostartnegative {\doPDFstartnegative}
+\definespecial\dostopnegative {\doPDFstopnegative}
+\definespecial\dostartoverprint {\doPDFstartoverprint}
+\definespecial\dostopoverprint {\doPDFstopoverprint}
+
+\definespecial\dostarttransparency{\doPDFstarttransparency}
+\definespecial\dostoptransparency {\doPDFstoptransparency}
+
+\PDFtransparencysupportedtrue
+
+\def\@@PDT{@PDT@}
+
+\ifx\PDFcurrenttransparency\undefined
+ \newcount\PDFcurrenttransparency \PDFcurrenttransparency=0 % -1
+\fi
+
+\def\assignPDFtransparency#1#2%
+ {\def\PDFtransparencyidentifier{/Tr#1}%
+ %\def\PDFtransparencyreference{\PDFobjref{#2}}}
+ \def\PDFtransparencyreference{@TR:#2}}
+
+\def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \executeifdefined{\@@PDT#1:#2}{\dopresetPDFtransparency{#1}{#2}}}
+
+\def\dopresetPDFtransparency#1#2%
+ {\global\advance\PDFcurrenttransparency \plusone
+ %\immediate\pdfobj{\PDFtransparancydictionary{#1}{#2}{}}%
+% \special{pdf: object @TR:\the\PDFcurrenttransparency\space \PDFtransparancydictionary{#1}{#2}{}}%
+ \doPDFreserveDPXobject{TR:\the\PDFcurrenttransparency}{<< >>}%
+ \special{pdf:\doPDFcheckedDPXobject{TR:\the\PDFcurrenttransparency}\PDFtransparancydictionary{#1}{#2}{}}%
+ \edef\PDFtransparencyidentifier{/Tr\the\PDFcurrenttransparency}%
+ %\edef\PDFtransparencyreference {\PDFobjref\pdflastobj}%
+ \edef\PDFtransparencyreference {@TR:\the\PDFcurrenttransparency}%
+ \setxvalue{\@@PDT#1:#2}%
+ {\noexpand\assignPDFtransparency{\the\PDFcurrenttransparency}{\the\PDFcurrenttransparency}}%
+ \appendtoPDFdocumentextgstates
+ {\PDFtransparencyidentifier\space
+ \PDFtransparencyreference\space}}
+
+\def\initializePDFtransparency
+ %{\immediate\pdfobj{\PDFtransparancydictionary{1}{1}{/AIS false}}%
+% {\special{pdf: object @TR:0 \PDFtransparancydictionary{1}{1}{/AIS false}}%
+ {\doPDFreserveDPXobject{TR:0}{<< >>}%
+ \special{pdf:\doPDFcheckedDPXobject{TR:0}\PDFtransparancydictionary{1}{1}{/AIS false}}%
+ \xdef\PDFtransparencyresetidentifier{/Tr0}%
+ %\xdef\PDFtransparencyresetreference{\PDFobjref\pdflastobj}%
+ \xdef\PDFtransparencyresetreference{@TR:0}%
+ \setxvalue{\@@PDT0:0}%
+ %{\noexpand\assignPDFtransparency{0}{\the\pdflastobj}}%
+ {\noexpand\assignPDFtransparency{0}{0}}%
+ \appendtoPDFdocumentextgstates
+ {\PDFtransparencyresetidentifier\space
+ \PDFtransparencyresetreference\space}%
+ \global\let\initializePDFtransparency\relax}
+
+%D \macros
+%D {dosetupinteraction,
+%D dosetupopenaction,dosetupcloseaction}
+
+\definespecial\dosetupinteraction
+ {\showmessage\m!interactions{21}{DVIPDFMx}}
+
+\definespecial\dosetupopenaction {\doPDFsetupopenaction}
+\definespecial\dosetupcloseaction{\doPDFsetupcloseaction}
+
+%D \macros
+%D {doresetgotowhereever,
+%D dostartthisisrealpage,dostartthisislocation,
+%D dostartgotorealpage,dostartgotolocation,dostartgotoJS}
+
+\definespecial\doresetgotowhereever {\doPDFresetgotowhereever}
+\definespecial\dostartthisislocation{\doPDFstartthisislocation}
+
+\definespecial\dostartgotolocation{\doPDFstartgotolocation}
+\definespecial\dostartgotorealpage{\doPDFstartgotorealpage}
+\definespecial\dostartgotoJS {\doPDFstartgotoJS}
+
+%D \macros
+%D {doflushJSpreamble}
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \let\compositeJScode\empty
+ \def\docommando##1%
+ {\edef\sanitizedJScode{\getJSpreamble{##1}}%
+ \@EA\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode
+ \special{pdf:object @JS:##1 <</S /JavaScript /JS (\sanitizedJScode)>>}%
+ \edef\compositeJScode{\compositeJScode\space (##1) @JS:##1}}%
+ \processcommalist[#1]\docommando
+ \special{pdf:names /JavaScript [\compositeJScode]}%
+ \egroup}
+
+%D \macros
+%D {dostarthide,dostophide}
+
+\definespecial\dostarthide{}
+\definespecial\dostophide {}
+
+%D \macros
+%D {dosetupscreen}
+
+\definespecial\dosetupscreen {\doPDFsetupscreen \printpaperheight}
+
+\definespecial\dosetupartbox {\doPDFsetupartbox \printpaperheight}
+\definespecial\dosetupcropbox {\doPDFsetupcropbox \printpaperheight}
+\definespecial\dosetupbleedbox{\doPDFsetupbleedbox\printpaperheight}
+\definespecial\dosetuptrimbox {\doPDFsetuptrimbox \printpaperheight}
+
+%D \macros
+%D {dostartexecutecommand}
+
+\definespecial\dostartexecutecommand{\doPDFstartexecutecommand}
+
+%D \macros
+%D {dosetupidentity}
+
+\definespecial\dosetupidentity{\doPDFsetupidentity}
+
+%D \macros
+%D {dostartrunprogam}
+
+\definespecial\dostartrunprogram{\doPDFstartrunprogram}
+
+%D \macros
+%D {dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile, doendofprofile}
+
+\definespecial\dostartgotoprofile{\doPDFstartgotoprofile}
+
+\definespecial\dobeginofprofile#1#2#3#4%
+ {\bgroup
+ \setPDFdestination{#1}%
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \doifsomething{\PDFdestination}
+ {\special
+ {pdf:thread @ART::\PDFdestination\space
+ width \width height \height
+ <</Title (\PDFdestination)>>}}%
+ \egroup}
+
+\definespecial\doendofprofile
+ {}
+
+%D \macros
+%D {doinsertbookmark}
+
+\definespecial\doinsertbookmark{\doPDFinsertbookmark}
+
+%D \macros
+%D {dostartobject,dostopobject,doinsertobject}
+%D
+%D Modified to support the color shading feature since version
+%D \type{dvipdfmx-20021128}.
+
+% wd nextbox > #3 ivm offset
+
+\definespecial\dostartobject#1#2#3#4#5%
+ {\bgroup
+ \dowithnextbox
+ {\dosetobjectreference{#1}{#2}{@#1::#2}%
+ \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+ \setbox\nextbox\vbox
+ {\special{pdf:bxobj @#1::#2 width \width height \height}%
+ % we need to compensate for the box offset (ugly, sigh)
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-#4\relax
+ \nextboxdp\zeropoint
+ \nextboxht\zeropoint
+ \hbox to #3{\hss\lower.5\scratchdimen\box\nextbox\hss}%
+ \ifx\currentPDFresources\empty
+ \else
+ \special{pdf:put @resources
+ <<\currentPDFresources\the\pdfpageresources>>}%
+ \global\let\currentPDFresources\empty
+ \fi
+ \special{pdf:exobj}}%
+ \smashbox\nextbox
+ \flushatshipout{\box\nextbox}%
+ \egroup}%
+ \hbox\bgroup}
+
+\definespecial\dostopobject
+ {\egroup}
+
+\definespecial\doinsertobject#1#2%
+ {\hbox
+ {\doPDFgetobjectreference{#1}{#2}\PDFobjectreference
+ \ifx\PDFobjectreference\empty \else
+ \special{pdf:uxobj @#1::#2}%
+ \fi}}
+
+%D \macros
+%D {dosetpagetransition}
+
+\definespecial\dosetpagetransition{\doPDFsetpagetransition}
+
+%D \macros
+%D {doinsertcomment, doflushcomments}
+
+\definespecial\doinsertcomment{\doPDFinsertcomment}
+\definespecial\doflushcomments{\doPDFflushcomments}
+
+%D \macros
+%D {dopresetlinefield,dopresettextfield,
+%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
+%D dopresetpushfield,dopresetcheckfield,
+%D dopresetradiofield,dopresetradiorecord}
+
+\definespecial\dopresetlinefield {\doFDFpresetlinefield}
+\definespecial\dopresettextfield {\doFDFpresettextfield}
+\definespecial\dopresetchoicefield{\doFDFpresetchoicefield}
+\definespecial\dopresetpopupfield {\doFDFpresetpopupfield}
+\definespecial\dopresetcombofield {\doFDFpresetcombofield}
+\definespecial\dopresetpushfield {\doFDFpresetpushfield}
+\definespecial\dopresetcheckfield {\doFDFpresetcheckfield}
+\definespecial\dopresetradiofield {\doFDFpresetradiofield}
+\definespecial\dopresetradiorecord{\doFDFpresetradiorecord}
+
+%D \macros
+%D {dodefinefieldset,dogetfieldset,doiffieldset}
+
+\definespecial\dodefinefieldset{\doFDFdefinefieldset}
+\definespecial\dogetfieldset {\doFDFgetfieldset}
+\definespecial\doiffieldset {\doFDFiffieldset}
+
+%D \macros
+%D {doregistercalculationset}
+
+\definespecial\doregistercalculationset{\doFDFregistercalculationset}
+
+%D \type{\doPDFdestination} in \type{spec-dpm} had a bug.
+%D
+%D \macros
+%D {doPDFdestination}
+
+\def\doPDFdestination name #1%
+ {\special{pdf:names /Dests (#1) [@thispage \PDFpageviewwrd]}}
+
+%D \macros
+%D {doPDFaction,doPDFannotation,ifsharePDFactions}
+%D
+%D Sharing is not yet supported.
+
+\newif\ifsharePDFactions \sharePDFactionsfalse
+
+\def\dodoPDFaction#1#2#3#4%
+ {\ifcollectreferenceactions
+ \xdef\lastPDFaction{#4}%
+ \else
+ \bgroup
+ % this is yet untested
+ %\ifsharePDFactions
+ % \ifcase\similarreference\relax
+ % \xdef\lastPDFaction{<<#4>>}%
+ % \or
+ % \global\advance\nofPDFsimilar by 1
+ % \special{pdf: object @PDF::sim:\the\nofPDFsimilar\space<<#4>>}%
+ % \xdef\lastPDFaction{@PDF::sim:\the\nofPDFsimilar}%
+ % \else
+ % % leave \lastPDFaction untouched
+ % \fi
+ %\else
+ \xdef\lastPDFaction{<<#4>>}%
+ %\fi
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \special{pdf:ann #1 width \width height \height
+ <</Subtype /Link /Border [0 0 0]
+ \ifhighlighthyperlinks \else /H /N \fi
+ /A \lastPDFaction\space>>}%
+ \egroup
+ \fi}
+
+\def\doPDFaction width #1 height #2 action #3%
+ {\dodoPDFaction\empty{#1}{#2}{#3}}
+
+%D \type{\doPDFannotation} in \type{spec-dpm} had a bug.
+%D
+%D \type{\doPDFannotation} conflicts with \type{\doPDFinsertmov},
+%D since width and height also defined in \type{\doPDFinsertmov}.
+
+\def\doPDFannotation width #1 height #2 data #3%
+ {\bgroup
+ \edef\data{#3}%
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
+ \special{pdf:ann width \width height \height <<\data>>}%
+ \egroup}
+
+%D \macros
+%D {doPDFannotationobject,doPDFactionobject}
+
+\def\doPDFannotationobject class #1 name #2 width #3 height #4 data #5%
+ {\bgroup
+ \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+ \special{pdf:ann @#1::#2 width \width height \height <<#5>>}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}%
+ \egroup}
+
+\def\doPDFactionobject class #1 name #2 width #3 height #4 action #5%
+ {\dodoPDFaction{@#1::#2}{#3}{#4}{#5}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}}
+
+%D \macros
+%D {doPDFaddtocatalog,doPDFaddtoinfo,
+%D doPDFpageattribute,doPDFpagesattribute}
+
+% we could move much more to spec-fdf
+
+% \ifx\pdfcatalog \undefined \newtoks\pdfcatalog \fi
+% \ifx\pdfinfo \undefined \newtoks\pdfinfo \fi
+% \ifx\pdfpageattr \undefined \newtoks\pdfpageattr \fi
+% \ifx\pdfpageresources\undefined \newtoks\pdfpageresources \fi
+% \ifx\pdfpagesattr \undefined \newtoks\pdfpagesattr \fi
+
+% \def\doPDFaddtocatalog #1{\expanded{\global\pdfcatalog {#1\the\pdfcatalog }}}
+% \def\doPDFaddtoinfo #1{\expanded{\global\pdfinfo {#1\the\pdfinfo }}}
+% \def\doPDFpageattribute #1{\expanded{\global\pdfpageattr {#1\the\pdfpageattr }}}
+% \def\doPDFpageresource #1{\expanded{\global\pdfpageresources{#1\the\pdfpageresources}}}
+% \def\doPDFpagesattribute#1{\expanded{\global\pdfpagesattr {#1\the\pdfpagesattr }}}
+
+% \def\doPDFresetpageattributes{\global\pdfpageattr\emptytoks}
+% \def\doPDFresetpageresources {\global\pdfpageresources\emptytoks}
+
+% \appendtoks
+% \special{pdf: put @catalog <<#1>>}%
+% \special{pdf: docinfo <<#1>>}%
+% \special{pdf: put @pages <<#1>>}%
+% \to \everylastshipout
+
+% \appendtoks
+% \special{pdf: put @thispage <<#1>>}%
+% \to\everyshipout
+
+\def\doPDFaddtocatalog#1%
+ {\special{pdf:put @catalog <<#1>>}}
+
+\def\doPDFaddtoinfo#1%
+ {\special{pdf:put @docinfo <<#1>>}}
+
+\def\doPDFpageattribute#1%
+ {\special{pdf:put @thispage <<#1>>}}
+
+\def\doPDFpagesattribute#1%
+ {\special{pdf:put @pages <<#1>>}}
+
+\def\doPDFpageresource#1%
+ {\special{pdf:put @resources <<#1>>}}
+
+\let\doPDFresetpageresources \relax
+\let\doPDFresetpageattributes\relax
+
+%D \type{\doPDFbookmark} in \type{spec-dpm} had a bug.
+%D The openbookmark option \#5 is not supported yet.
+%D
+%D \macros
+%D {doPDFbookmark}
+
+\def\doPDFbookmark level #1 n #2 text #3 page #4 open #5%
+ {\ifcase#1\else
+ %\scratchcounter#4\advance\scratchcounter\minusone
+ \special{pdf:outline #1 %\ifcase#5 opened\fi
+ % <</Title (#3) /A <</S /GoTo /D (page:\the\scratchcounter)>>>>}%
+ <</Title (#3) /A <</S /GoTo /D [@page\number#4\space\PDFpageviewwrd]>> >>}%
+ \fi}
+
+%D \macros
+%D {doPDFdictionaryobject,doPDFarrayobject}
+
+% Dvipdfmx can't handle
+%
+% \special{pdf:put @foo << /Bar @bar >>}
+% \special{pdf:put @bar << /Foo @foo >>}
+%
+% Objects must be defined before they are used.
+%
+% \special{pdf:obj @foo << >>}
+% \special{pdf:obj @bar << >>}
+% \special{pdf:put @foo << /Bar @bar >>}
+% \special{pdf:put @bar << /Foo @foo >>}
+%
+% However, this only works for dictionary and array.
+
+\def\doPDFreserveDPXobject#1#2%
+ {\ifundefined{r:pdx:d:#1}%
+ % we need a \flushatshipoutprep (prepended, normally appended)
+ \flushatshipout{\special{pdf:object @#1 #2}}%
+ \global\letvalue{r:pdx:d:#1}\empty
+ \fi}
+
+\def\doPDFreserveDPXobjectfirst#1#2%
+ {\ifundefined{r:pdx:d:#1}%
+ \doglobal\prependtoks\special{pdf:object @#1 #2}\to\everyfirstshipout
+ \global\letvalue{r:pdx:d:#1}\empty
+ \fi}
+
+\def\doPDFcheckedDPXobject#1{\ifundefined{r:pdx:d:#1}object\else put\fi\space @#1\space}
+
+% todo when etex is fixed, \everyPDFpresets, leeg voor pdftex, nodig voor dvipdfmx
+
+\doPDFreserveDPXobjectfirst{FDF::docuextgstates}{<< >>}
+
+\def\doPDFdictionaryobject class #1 name #2 data #3%
+ {\flushatshipout
+ {\special{pdf:\doPDFcheckedDPXobject{#1::#2}<<#3>>}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}}}
+
+\def\doPDFarrayobject class #1 name #2 data #3%
+ {\flushatshipout
+ {\special{pdf:\doPDFcheckedDPXobject{#1::#2}[#3]}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}}}
+
+%D \macros
+%D {defaultobjectreference,doPDFgetobjectreference}
+
+\def\defaultobjectreference#1#2{@#1::#2}
+
+%D \type{\doPDFgetobjectreference} in \type{spec-dpm} had a bug.
+
+\def\doPDFgetobjectreference#1#2#3%
+ {\dogetobjectreference{#1}{#2}#3%
+ \ifx#3\empty\else\edef#3{#3}\fi}
+
+% \def\doPDFgetobjectpage #1#2#3{..}
+% \def\doPDFgetobjectpagereference#1#2#3{..}
+
+\def\doPDFgetpagereference#1#2%
+ {\edef#2{@page#1}}
+
+%D Done.
+
+% %D 2. Modified codes from \type{spec-fdf}
+%
+% \definespecial\dostartgraphicgroup{\special{pdf: literal direct q}}
+% \definespecial\dostopgraphicgroup {\special{pdf: literal direct Q}}
+
+%D 3. Copied codes from \type{spec-tpd}
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping in \PDFTEX\ is rather trivial. We can even hook
+%D in \METAPOST\ without problems.
+
+\definespecial\dostartclipping#1#2#3%
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
+ \grabMPclippath{#1}{1}\width\height
+ {0 0 m \width\space 0 l \width \height l 0 \height l}%
+ \PDFcode
+ {q 0 w \MPclippath\space W n}}
+
+\definespecial\dostopclipping
+ {\PDFcode{Q n}}
+
+%D 4. Modified codes from \type{supp-mpe}
+
+\def\stopMPshading
+ {\global\advance\currentPDFshade \plusone
+ \setxvalue{obj:Sh:\currentMPspecial}%
+ {/Sh\the\currentPDFshade\space @obj:Sh:\currentMPspecial\space}%
+ \setxvalue{mps:Sh:\currentMPspecial}%
+ {\the\currentPDFshade}}
+
+\defineMPspecial{30}
+ {\startMPshading{14}% type 2
+ \setMPshadingcolors{4}{5}{6}{9}{10}{11}%
+ \special{pdf:object @ftn:Sh:\currentMPspecial\space
+ <</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \special{pdf:object @obj:Sh:\currentMPspecial\space
+ <</ShadingType 2
+ /ColorSpace /\MPshadeC\space
+ /Function @ftn:Sh:\currentMPspecial\space
+ /Coords [\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}]
+ /Extend [true true]>>}%
+ \stopMPshading}
+
+\defineMPspecial{31}
+ {\startMPshading{16}% type 3
+ \setMPshadingcolors{4}{5}{6}{10}{11}{12}%
+ \special{pdf:object @ftn:Sh:\currentMPspecial\space
+ <</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \special{pdf:object @obj:Sh:\currentMPspecial\space
+ <</ShadingType 3
+ /ColorSpace /\MPshadeC\space
+ /Function @ftn:Sh:\currentMPspecial\space
+ /Coords [\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}]
+ /Extend [true true]>>}%
+ \stopMPshading}
+
+\def\handleMPfigurespecial#1#2#3#4#5#6#7% toto : combine with ext fig
+ {\doiffileelse{#7}
+ {\vbox to \zeropoint
+ {\vss
+ \hbox to \zeropoint
+ {\special{pdf:btrans matrix #1 #2 #3 #4 #5 #6}%
+ \rlap{\special{pdf:image width 1bp height 1bp (#7)}}
+ \special{pdf:etrans}\hss}}}
+ {\message{[unknown figure #7]}}}
+
+%D 5. Modified codes from \type{supp-pdf}
+
+\let\handleMPfshow\dohandleMPfshow
+
+\newcounter\MPPDFcounter
+
+\def\setMPPDFobject#1#2%
+ {\ifx\currentPDFresources\empty\else\doPDFpageresource{#1}\fi
+ \def\getMPPDFobject{\box#2}}
+
+\let\getMPPDFobject\relax
+
+\definespecial\doinsertMPfile#1%
+ {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
+
+%D Experimental (untested):
+
+\definespecial\dostartfonteffect#1#2#3%
+ {\ifdim#2>\zeropoint
+ \PointsToBigPoints{#2}\ascii
+ \PDFdirectcode{\ascii\space w}%
+ \fi
+ \ifdim#3\points=\onepoint\else
+ \scratchdimen#3\points
+ \PDFdirectcode{\withoutpt{\the\scratchdimen}\space Tc}%
+ \fi
+ \PDFdirectcode{\purenumber#1 Tr}}
+
+\definespecial\dostopfonteffect
+ {\PDFdirectcode{1 w 0 Tc 0 Tr}}
+
+%D 6. Modified codes from \type{core-obj}
+%D
+%D In the viewpoint of TeX, the special command \type{pdf:uxobj @obj}
+%D generates a box with zero point width and zero point height so that
+%D it must be careful to place the box at the reference point.
+
+\def\dogetobject#1#2#3#4#5#6#7% don't change this, should work for dvi & pdf
+ {\initializepaper
+ \forgetall
+ \dontshowcomposition
+ \setbox\scratchbox\vbox
+ {\doinsertobject{#1}{#2}}%
+ \setbox\scratchbox#3%
+ {\vbox to #5\scaledpoint
+ {\ifdim\ht\scratchbox>#5\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else\ifdim\wd\scratchbox>#4\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else
+ %\vss\box\scratchbox
+ \vss\hbox to #4\scaledpoint{\box\scratchbox\hss}
+ \fi\fi}}%
+ \box\scratchbox
+ \elabelgroup}
+
+%D 7. Copied codes from \type{spec-dvi}
+
+\definespecial\dosetposition#1%
+ {\special{pos:pxy "#1"}}
+
+\definespecial\dosetpositionwhd#1#2#3#4%
+ {\special{pos:pxywhd "#1" #2 #3 #4}}
+
+\definespecial\dosetpositionplus#1#2#3#4#5%
+ {\special{pos:pxyplus "#1" #2 #3 #4 #5}}
+
+\let\flushDVIpositionpapersize\relax
+
+\definespecial\dosetpositionpapersize#1#2%
+ {\xdef\flushDVIpositionpapersize%
+ {\special{pos:papersize #1 #2}%
+ \noexpand\installprogram{dvipos \jobname}%
+ \global\noexpand\let\noexpand\flushDVIpositionpapersize\relax}}
+
+\prependtoksonce \flushDVIpositionpapersize \to \everyshipout
+
+\stopspecials
+
+\protect \endinput
diff --git a/Build/source/texk/xdvipdfmx/contrib/latex/color.sty.sample b/Build/source/texk/xdvipdfmx/contrib/latex/color.sty.sample
new file mode 100644
index 00000000000..27009a3fe86
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/contrib/latex/color.sty.sample
@@ -0,0 +1,177 @@
+%%
+%% This is file `color.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% color.dtx (with options: `package')
+%%
+%% color.dtx Copyright (C) 1994--1999 David Carlisle
+%%
+%% This file is part of the Standard LaTeX `Graphics Bundle'.
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%%
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{color}
+ [1999/02/16 v1.0i Standard LaTeX Color (DPC)]
+\edef\Gin@codes{%
+ \catcode`\noexpand\^^A\the\catcode`\^^A\relax
+ \catcode`\noexpand\"\the\catcode`\"\relax
+ \catcode`\noexpand\*\the\catcode`\*\relax
+ \catcode`\noexpand\!\the\catcode`\!\relax
+ \catcode`\noexpand\:\the\catcode`\:\relax}
+\catcode`\^^A=\catcode`\%
+\catcode`\"=12
+\catcode`\*=11
+\catcode`\!=12
+\catcode`\:=12
+\providecommand\Gin@driver{}
+\def\c@lor@error#1{%
+ \@latex@error{Undefined color #1}\@ehd}
+\DeclareOption{monochrome}{%
+ \def\c@lor@error#1{\PackageInfo{color}{Undefined color #1}}%
+ \AtEndOfPackage{%
+ \colors@false
+ \def\set@color{%
+ \c@lor@special\m@ne
+ {color push \current@color}\aftergroup\reset@color}%
+ \def\reset@color{\c@lor@special\m@ne{color pop}}%
+ \def\set@page@color{%
+ \c@lor@special\m@ne{background \current@color}}%
+ \def\define@color#1#2{%
+ \c@lor@special\m@ne{define #1 #2}}}}
+\DeclareOption{debugshow}{\catcode`\^^A=9 \let\GDebug\typeout}
+\DeclareOption{dvips}{\def\Gin@driver{dvips.def}%
+ \def\c@lor@namefile{dvipsnam.def}}
+\DeclareOption{xdvi}{\ExecuteOptions{dvips,monochrome}}
+\DeclareOption{dvipdf}{\def\Gin@driver{dvipdf.def}}
+\DeclareOption{dvipdfm}{\def\Gin@driver{dvipdfm.def}}
+\DeclareOption{dvipdfmx}{\def\Gin@driver{dvipdfmx.def}}
+\DeclareOption{pdftex}{\def\Gin@driver{pdftex.def}}
+\DeclareOption{dvipsone}{\def\Gin@driver{dvipsone.def}}
+\DeclareOption{dviwindo}{\ExecuteOptions{dvipsone}}
+\DeclareOption{emtex}{\def\Gin@driver{emtex.def}}
+\DeclareOption{dviwin}{\def\Gin@driver{dviwin.def}}
+\DeclareOption{oztex}{\ExecuteOptions{dvips}}
+\DeclareOption{textures}{\def\Gin@driver{textures.def}}
+\DeclareOption{pctexps}{\def\Gin@driver{pctexps.def}}
+\DeclareOption{pctexwin}{\def\Gin@driver{pctexwin.def}}
+\DeclareOption{pctexhp}{\def\Gin@driver{pctexhp.def}}
+\DeclareOption{pctex32}{\def\Gin@driver{pctex32.def}}
+\DeclareOption{truetex}{\def\Gin@driver{truetex.def}}
+\DeclareOption{tcidvi}{\def\Gin@driver{tcidvi.def}}
+\DeclareOption{vtex}{\def\Gin@driver{vtex.def}}
+\DeclareOption{dvipsnames}{\def\c@lor@namefile{dvipsnam.def}}
+\DeclareOption{nodvipsnames}{\let\c@lor@namefile\relax}
+\let\c@lor@usename\@gobble
+\DeclareOption{usenames}{%
+ \def\c@lor@usename#1{%
+ \expandafter\color@named\csname\string\color @#1\endcsname{#1}}}
+\DeclareRobustCommand\color{%
+ \@ifnextchar[\@undeclaredcolor\@declaredcolor}
+\def\@undeclaredcolor[#1]#2{%
+ \@ifundefined{color@#1}%
+ {\c@lor@error{model `#1'}}%
+ {\csname color@#1\endcsname\current@color{#2}%
+ \set@color}%
+ \ignorespaces}
+\def\@declaredcolor#1{%
+ \@ifundefined{\string\color @#1}%
+ {\c@lor@error{`#1'}}%
+ {\expandafter\let\expandafter\current@color
+ \csname\string\color @#1\endcsname
+ \set@color}%
+ \ignorespaces}
+\def\textcolor#1#{\@textcolor{#1}}
+\def\@textcolor#1#2#3{\protect\leavevmode{\color#1{#2}#3}}
+\def\pagecolor{%
+ \begingroup
+ \let\ignorespaces\endgroup
+ \let\set@color\set@page@color
+ \color}
+\def\definecolor#1#2#3{%
+ \@ifundefined{color@#2}%
+ {\c@lor@error{model `#2'}}%
+ {\@ifundefined{\string\color @#1}{}%
+ {\PackageInfo{color}{Redefining color #1}}%
+ \csname color@#2\expandafter\endcsname
+ \csname\string\color @#1\endcsname{#3}}}
+\def\DefineNamedColor#1#2#3#4{%
+ \@ifundefined{define@color@#1}%
+ {\c@lor@error{model `#1'}}%
+ {\@ifundefined{color@#3}%
+ {\c@lor@error{model `#3'}}%
+ {\@ifundefined{c@lor@#1@#2}{}%
+ {\PackageInfo{color}{Redefining color #2 in named color model}}%
+ \csname color@#3\endcsname\@tempa{#4}%
+ \csname define@color@#1\endcsname{#2}\@tempa
+ \c@lor@usename{#2}}}}
+\@onlypreamble\DefineNamedColor
+\newif\ifcolors@
+\colors@true
+\def\c@lor@special#1#2{%
+ \edef\@tempa{\write#1{#2}}\@tempa}
+\InputIfFileExists{color.cfg}{}{}
+\ProcessOptions
+\if!\Gin@driver!
+ \PackageError{color}
+ {No driver specified}
+ {You should make a default driver option in a file \MessageBreak
+ color.cfg\MessageBreak
+ eg: \protect\ExecuteOptions{dvips}%
+ }
+\else
+ \PackageInfo{color}{Driver file: \Gin@driver}
+ \@ifundefined{ver@\Gin@driver}{\input{\Gin@driver}}{}
+\fi
+\@ifundefined{c@lor@namefile}{}{\input{\c@lor@namefile}}
+\def\normalcolor{\let\current@color\default@color\set@color}
+\AtBeginDocument{\let\default@color\current@color}
+\def\color@block#1#2#3{%
+ {\set@color\rlap{\ifcolors@\vrule\@width#1\@height#2\@depth#3\fi}}}
+\def\colorbox#1#{\color@box{#1}}
+\def\color@box#1#2{\color@b@x\relax{\color#1{#2}}}
+\def\fcolorbox#1#{\color@fbox{#1}}
+\def\color@fbox#1#2#3{%
+ \color@b@x{\fboxsep\z@\color#1{#2}\fbox}{\color#1{#3}}}
+
+\long\def\color@b@x#1#2#3{%
+ \leavevmode
+ \setbox\z@\hbox{\kern\fboxsep{\set@color#3}\kern\fboxsep}%
+ \dimen@\ht\z@\advance\dimen@\fboxsep\ht\z@\dimen@
+ \dimen@\dp\z@\advance\dimen@\fboxsep\dp\z@\dimen@
+ {#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}%
+ \box\z@}}}
+\def\color@setgroup{\begingroup\set@color}
+\let\color@begingroup\begingroup
+\def\color@endgroup{\endgraf\endgroup}
+\def\color@hbox{\hbox\bgroup\color@begingroup}
+\def\color@vbox{\vbox\bgroup\color@begingroup}
+\def\color@endbox{\color@endgroup\egroup}
+\ifx\color@gray\@undefined
+ \ifx\color@rgb\@undefined
+ \else
+ \definecolor{black}{rgb}{0,0,0}
+ \definecolor{white}{rgb}{1,1,1}
+ \fi
+\else
+ \definecolor{black}{gray}{0}
+ \definecolor{white}{gray}{1}
+\fi
+\ifx\color@rgb\@undefined\else
+ \definecolor{red}{rgb}{1,0,0}
+ \definecolor{green}{rgb}{0,1,0}
+ \definecolor{blue}{rgb}{0,0,1}
+\fi
+\ifx\color@cmyk\@undefined\else
+ \definecolor{cyan}{cmyk}{1,0,0,0}
+ \definecolor{magenta}{cmyk}{0,1,0,0}
+ \definecolor{yellow}{cmyk}{0,0,1,0}
+\fi
+\Gin@codes
+\let\Gin@codes\relax
+\endinput
+%%
+%% End of file `color.sty'.
diff --git a/Build/source/texk/xdvipdfmx/contrib/latex/dvipdfmx.def.sample b/Build/source/texk/xdvipdfmx/contrib/latex/dvipdfmx.def.sample
new file mode 100644
index 00000000000..e67d195de3d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/contrib/latex/dvipdfmx.def.sample
@@ -0,0 +1,139 @@
+%% This is file `dvipdfmx.def' for DVIPDFMx by J.-H. Cho and S. Hirata
+%% which is written based on `dvipdf.def' in the LaTeX `Graphics Bundle'.
+%%
+%% This is file `dvipdf.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% drivers.dtx (with options: `dvipdf,color1,psrulesZ')
+%%
+%% drivers.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
+%% Copyright (C) 1995 1996 1997 1998 1999 David Carlisle
+%%
+%% This file is part of the Standard LaTeX `Graphics Bundle'.
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%%
+\ProvidesFile{dvipdfmx.def}
+ [1999/02/16 v3.0i Driver-dependant file (DPC,SPQR)]
+\def\c@lor@arg#1{%
+ \dimen@#1\p@
+ \ifdim\dimen@<\z@\dimen@\maxdimen\fi
+ \ifdim\dimen@>\p@
+ \PackageError{color}{Argument `#1' not in range [0,1]}\@ehd
+ \fi}
+\def\color@gray#1#2{%
+ \c@lor@arg{#2}%
+ \edef#1{[#2]}%
+ }
+\def\color@cmyk#1#2{\c@lor@@cmyk#2\@@#1}
+\def\c@lor@@cmyk#1,#2,#3,#4\@@#5{%
+ \c@lor@arg{#4}%
+ \c@lor@arg{#1}%
+ \c@lor@arg{#2}%
+ \c@lor@arg{#3}%
+ \edef#5{[#1 #2 #3 #4]}%
+ }
+\def\color@rgb#1#2{\c@lor@@rgb#2\@@#1}
+\def\c@lor@@rgb#1,#2,#3\@@#4{%
+ \c@lor@arg{#1}%
+ \c@lor@arg{#2}%
+ \c@lor@arg{#3}%
+ \edef#4{[#1 #2 #3]}%
+ }
+\def\color@RGB#1#2{\c@lor@@RGB#2\@@#1}
+\def\c@lor@@RGB#1,#2,#3\@@#4{%
+ \c@lor@RGB@rgb{#1}\@tempa
+ \c@lor@RGB@rgb{#2}\@tempb
+ \c@lor@RGB@rgb{#3}\@tempc
+ \c@lor@@rgb\@tempa,\@tempb,\@tempc\@@#4%
+ }
+\def\c@lor@RGB@rgb#1#2{%
+ \dimen@#1\p@
+ \divide\dimen@\@cclv
+ \edef#2{\strip@pt\dimen@}}
+\def\color@hsb#1#2{\c@lor@@hsb#2\@@#1}
+\def\c@lor@@hsb#1,#2,#3\@@#4{%
+ \c@lor@arg{#1}%
+ \c@lor@arg{#2}%
+ \c@lor@arg{#3}%
+ \edef#4{[#1 #2 #3] hsb}%
+ }
+\def\color@named#1#2{\c@lor@@named#2,,\@@#1}
+\def\c@lor@@named#1,#2,#3\@@#4{%
+ \@ifundefined{col@#1}%
+ {\PackageError{color}{Undefined color `#1'}\@ehd}%
+ {\edef#4{ #1}}%
+ }
+\def\c@lor@to@ps#1 #2\@@{\csname c@lor@ps@#1\endcsname#2 \@@}
+\def\c@lor@ps@#1 #2\@@{TeXDict begin #1 end}
+\def\c@lor@ps@rgb#1\@@{#1 setrgbcolor}
+\def\c@lor@ps@hsb#1\@@{#1 sethsbcolor}
+\def\c@lor@ps@cmyk#1\@@{#1 setcmykcolor}
+\def\c@lor@ps@gray#1\@@{#1 setgray}
+\def\current@color{[0]}
+\def\set@color{%
+ \special{pdf:bcolor \current@color
+ }\aftergroup\reset@color}
+\def\reset@color{\special{%
+ pdf:ecolor}}
+\def\set@page@color{\special{%
+ pdf:bgcolor \current@color}}
+\def\define@color@named#1#2{%
+ \expandafter\let\csname col@#1\endcsname\@nnil}
+\def\Ginclude@eps#1{%
+ \message{<#1>}%
+ \bgroup
+ \def\@tempa{!}%
+ \dimen@\Gin@req@width
+ \dimen@ii.1bp%
+ \divide\dimen@\dimen@ii
+ \@tempdima\Gin@req@height
+ \divide\@tempdima\dimen@ii
+ \special{PSfile="#1"\space
+ llx=\Gin@llx\space
+ lly=\Gin@lly\space
+ urx=\Gin@urx\space
+ ury=\Gin@ury\space
+ \ifx\Gin@scalex\@tempa\else rwi=\number\dimen@\space\fi
+ \ifx\Gin@scaley\@tempa\else rhi=\number\@tempdima\space\fi
+ \ifGin@clip clip\fi}%
+ \egroup}
+\def\Ginclude@bmp#1{%
+ \message{<#1>}%
+ \bgroup
+ \def\@tempa{!}%
+ \special{pdf:image\space
+ width \the\Gin@req@width\space
+ height \the\Gin@req@height\space
+ (#1)}%
+ \egroup}
+\def\Grot@start{%
+\special{pdf:btrans rotate \Grot@angle}}
+\def\Grot@end{\special{pdf:etrans}}
+\def\Gscale@start{%
+\special{pdf:btrans xscale \Gscale@x\space yscale \Gscale@y}}
+\def\Gscale@end{\special{pdf:etrans}}
+\def\Gin@PS@raw#1{\special{ps: #1}}
+\def\Gin@PS@restored#1{\special{" #1}}
+\def\Gin@PS@literal@header#1{\AtBeginDvi{\special{! #1}}}
+\def\Gin@PS@file@header#1{\AtBeginDvi{\special{header=#1}}}
+\@namedef{Gin@rule@.jpg}#1{{bmp}{.bb}{#1}}
+\@namedef{Gin@rule@.jpeg}#1{{bmp}{.bb}{#1}}
+\@namedef{Gin@rule@.png}#1{{bmp}{.bb}{#1}}
+\@namedef{Gin@rule@.bmp}#1{{bmp}{.bb}{#1}}
+\def\Gin@extensions{.eps,.ps,.eps.gz,.ps.gz,.eps.Z}
+\@namedef{Gin@rule@.pdf}#1{{eps}{.bb}{#1}}
+\@namedef{Gin@rule@.ps}#1{{eps}{.ps}{#1}}
+\@namedef{Gin@rule@.eps}#1{{eps}{.eps}{#1}}
+\@namedef{Gin@rule@.pz}#1{{eps}{.bb}{`gunzip -c #1}}
+\@namedef{Gin@rule@.eps.Z}#1{{eps}{.eps.bb}{`gunzip -c #1}}
+\@namedef{Gin@rule@.ps.Z}#1{{eps}{.ps.bb}{`gunzip -c #1}}
+\@namedef{Gin@rule@.ps.gz}#1{{eps}{.ps.bb}{`gunzip -c #1}}
+\@namedef{Gin@rule@.eps.gz}#1{{eps}{.eps.bb}{`gunzip -c #1}}
+\@namedef{Gin@rule@*}#1{{eps}{\Gin@ext}{#1}}
+\endinput
+%%
+%% End of file `dvipdfmx.def'.
diff --git a/Build/source/texk/xdvipdfmx/contrib/latex/graphics.sty.sample b/Build/source/texk/xdvipdfmx/contrib/latex/graphics.sty.sample
new file mode 100644
index 00000000000..57c92cff620
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/contrib/latex/graphics.sty.sample
@@ -0,0 +1,473 @@
+%%
+%% This is file `graphics.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% graphics.dtx (with options: `package')
+%%
+%% graphics.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
+%% Copyright (C) 1995--1999 2001 David Carlisle
+%%
+%% This file is part of the Standard LaTeX `Graphics Bundle'.
+%% It may be distributed under the terms of the LaTeX Project Public
+%% License, as described in lppl.txt in the base LaTeX distribution.
+%% Either version 1.0 or, at your option, any later version.
+%%
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{graphics}
+ [2001/07/07 v1.0n Standard LaTeX Graphics (DPC,SPQR)]
+\edef\Gin@codes{%
+ \catcode`\noexpand\^^A\the\catcode`\^^A\relax
+ \catcode`\noexpand\"\the\catcode`\"\relax
+ \catcode`\noexpand\*\the\catcode`\*\relax
+ \catcode`\noexpand\!\the\catcode`\!\relax
+ \catcode`\noexpand\:\the\catcode`\:\relax}
+\catcode`\^^A=\catcode`\%
+\@makeother\"%
+\catcode`\*=11
+\@makeother\!%
+\@makeother\:%
+\RequirePackage{trig}
+\providecommand\Grot@start{\@latex@error{Rotation not supported}\@ehc
+ \global\let\Grot@start\relax}
+\providecommand\Grot@end{}
+\providecommand\Gscale@start{\@latex@error{Scaling not supported}\@ehc
+ \global\let\Gscale@start\relax}
+\providecommand\Gscale@end{}
+\edef\Gread@BBox{\@percentchar\@percentchar BoundingBox}
+\DeclareOption{draft}{\Gin@drafttrue}
+\DeclareOption{final}{\Gin@draftfalse}
+\newif\ifGin@draft
+\DeclareOption{hiresbb}{%
+ \edef\Gread@BBox{\@percentchar\@percentchar HiResBoundingBox}}
+\providecommand\Gin@driver{}
+\DeclareOption{dvips}{\def\Gin@driver{dvips.def}}
+\DeclareOption{xdvi}{\ExecuteOptions{dvips}}
+\DeclareOption{dvipdf}{\def\Gin@driver{dvipdf.def}}
+\DeclareOption{dvipdfm}{\def\Gin@driver{dvipdfm.def}}
+\DeclareOption{dvipdfmx}{\def\Gin@driver{dvipdfmx.def}}
+\DeclareOption{pdftex}{\def\Gin@driver{pdftex.def}}
+\DeclareOption{dvipsone}{\def\Gin@driver{dvipsone.def}}
+\DeclareOption{dviwindo}{\ExecuteOptions{dvipsone}}
+\DeclareOption{emtex}{\def\Gin@driver{emtex.def}}
+\DeclareOption{dviwin}{\def\Gin@driver{dviwin.def}}
+\DeclareOption{oztex}{\ExecuteOptions{dvips}}
+\DeclareOption{textures}{\def\Gin@driver{textures.def}}
+\DeclareOption{pctexps}{\def\Gin@driver{pctexps.def}}
+\DeclareOption{pctexwin}{\def\Gin@driver{pctexwin.def}}
+\DeclareOption{pctexhp}{\def\Gin@driver{pctexhp.def}}
+\DeclareOption{pctex32}{\def\Gin@driver{pctex32.def}}
+\DeclareOption{truetex}{\def\Gin@driver{truetex.def}}
+\DeclareOption{tcidvi}{\def\Gin@driver{tcidvi.def}}
+\DeclareOption{vtex}{\def\Gin@driver{vtex.def}}
+\DeclareOption{debugshow}{\catcode`\^^A=9 \let\GDebug\typeout}
+\InputIfFileExists{graphics.cfg}{}{}
+\DeclareOption{hiderotate}{%
+ \def\Grot@start{\begingroup\setbox\z@\hbox\bgroup}
+ \def\Grot@end{\egroup\endgroup}}
+\DeclareOption{hidescale}{%
+ \def\Gscale@start{\begingroup\setbox\z@\hbox\bgroup}
+ \def\Gscale@end{\egroup\endgroup}}
+\ProcessOptions
+\if!\Gin@driver!
+ \PackageError{graphics}
+ {No driver specified}
+ {You should make a default driver option in a file \MessageBreak
+ graphics.cfg\MessageBreak
+ eg: \protect\ExecuteOptions{textures}%
+ }
+\else
+ \PackageInfo{graphics}{Driver file: \Gin@driver}
+ \@ifundefined{ver@\Gin@driver}{\input{\Gin@driver}}{}
+\fi
+\def\Gin@llx{0}
+\let\Gin@lly\Gin@llx
+\let\Gin@urx\Gin@llx
+\let\Gin@ury\Gin@llx
+\let\Gin@nat@width\leftmarginv
+\let\Gin@nat@height\leftmarginvi
+\newif\ifGin@clip
+\newcommand\DeclareGraphicsExtensions[1]{%
+ \edef\Gin@extensions{\zap@space#1 \@empty}}
+\providecommand\Gin@extensions{}
+\def\includegraphics{%
+ \@ifstar
+ {\Gin@cliptrue\Gin@i}%
+ {\Gin@clipfalse\Gin@i}}
+\def\Gin@i{%
+ \@ifnextchar[%]
+ \Gin@ii
+ {\Gin@bboxfalse\Ginclude@graphics}}
+\def\Gin@ii[#1]{%
+ \@ifnextchar[%]
+ {\Gin@iii[#1]}
+ {\Gin@iii[0,0][#1]}}
+\def\Gin@iii[#1,#2][#3,#4]#5{%
+ \begingroup
+ \Gin@bboxtrue
+ \Gin@defaultbp\Gin@llx{#1}%
+ \Gin@defaultbp\Gin@lly{#2}%
+ \Gin@defaultbp\Gin@urx{#3}%
+ \Gin@defaultbp\Gin@ury{#4}%
+ \Ginclude@graphics{#5}%
+ \endgroup}
+\def\Gin@defaultbp#1#2{%
+ \afterassignment\Gin@def@bp\dimen@#2bp\relax{#1}{#2}}
+\def\Gin@def@bp#1\relax#2#3{%
+ \if!#1!%
+ \def#2{#3}%
+ \else
+ \dimen@.99626\dimen@
+ \edef#2{\strip@pt\dimen@}%
+ \fi}
+\def\DeclareGraphicsRule#1#2#3#4{%
+ \edef\@tempa{\string *}\def\@tempb{#3}%
+ \expandafter\edef\csname Gin@rule@#1\endcsname##1%
+ {{#2}%
+ {\ifx\@tempa\@tempb\noexpand\Gin@ext\else#3\fi}%
+ {\ifx\indent#4\indent##1\else#4\fi}}}
+\def\graphicspath#1{\def\Ginput@path{#1}}
+\ifx\Ginput@path\@undefined
+ \let\Ginput@path\input@path
+\fi
+\def\Gin@getbase#1{%
+ \edef\Gin@tempa{%
+ \def\noexpand\@tempa####1#1\space{%
+ \def\noexpand\Gin@base{####1}}}%
+ \IfFileExists{\filename@area\filename@base#1}%
+ {\Gin@tempa
+ \expandafter\@tempa\@filef@und
+ \edef\Gin@ext{#1}}{}}%
+\let\Gin@ext\relax
+\def\Gin@sepdefault{.}
+\def\Ginclude@graphics#1{%
+ \begingroup
+ \let\input@path\Ginput@path
+ \filename@parse{#1}%
+ \ifx\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \else
+ \Gin@getbase{\Gin@sepdefault\filename@ext}%
+ \ifx\Gin@ext\relax
+ \@warning{File `#1' not found}%
+ \def\Gin@base{\filename@area\filename@base}%
+ \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@latex@error{File `#1' not found}%
+ {I could not locate the file with any of these extensions:^^J%
+ \Gin@extensions^^J\@ehc}%
+ \else
+ \@ifundefined{Gin@rule@\Gin@ext}%
+ {\ifx\Gin@rule@*\@undefined
+ \@latex@error{Unknown graphics extension: \Gin@ext}\@ehc
+ \else
+ \expandafter\Gin@setfile\Gin@rule@*{\Gin@base\Gin@ext}%
+ \fi}%
+ {\expandafter\expandafter\expandafter\Gin@setfile
+ \csname Gin@rule@\Gin@ext\endcsname{\Gin@base\Gin@ext}}%
+ \fi
+ \endgroup}
+\newif\ifGread@\Gread@true
+\def\Gin@setfile#1#2#3{%
+ \ifx\\#2\\\Gread@false\fi
+ \ifGin@bbox\else
+ \ifGread@
+ \csname Gread@%
+ \expandafter\ifx\csname Gread@#1\endcsname\relax
+ eps%
+ \else
+ #1%
+ \fi
+ \endcsname{\Gin@base#2}%
+ \else
+ \Gin@nosize{#3}%
+ \fi
+ \fi
+ \Gin@viewport@code
+ \Gin@nat@height\Gin@ury bp%
+ \advance\Gin@nat@height-\Gin@lly bp%
+ \Gin@nat@width\Gin@urx bp%
+ \advance\Gin@nat@width-\Gin@llx bp%
+ \Gin@req@sizes
+ \expandafter\ifx\csname Ginclude@#1\endcsname\relax
+ \Gin@drafttrue
+ \expandafter\ifx\csname Gread@#1\endcsname\relax
+ \@latex@error{Can not include graphics of type: #1}\@ehc
+ \global\expandafter\let\csname Gread@#1\endcsname\@empty
+ \fi
+ \fi
+ \leavevmode
+ \ifGin@draft
+ \hb@xt@\Gin@req@width{%
+ \vrule\hss
+ \vbox to \Gin@req@height{%
+ \hrule \@width \Gin@req@width
+ \vss
+ \edef\@tempa{#3}%
+ \rlap{ \ttfamily\expandafter\strip@prefix\meaning\@tempa}%
+ \vss
+ \hrule}%
+ \hss\vrule}%
+ \else
+ \@addtofilelist{#3}%
+ \ProvidesFile{#3}[Graphic file (type #1)]%
+ \setbox\z@\hbox{\csname Ginclude@#1\endcsname{#3}}%
+ \dp\z@\z@
+ \ht\z@\Gin@req@height
+ \wd\z@\Gin@req@width
+ \box\z@
+ \fi}
+\def\Gin@exclamation{!}
+\let\Gin@req@sizes\relax
+\def\Gin@scalex{1}%
+\let\Gin@scaley\Gin@exclamation
+\let\Gin@req@height\Gin@nat@height
+\let\Gin@req@width\Gin@nat@width
+\let\Gin@viewport@code\relax
+\def\Gin@nosize#1{%
+ \@latex@error
+ {Cannot determine size of graphic in #1 (no size specifed)}%
+ \@ehc}
+\newif\ifGin@bbox
+\def\Gread@eps#1{%
+ \begingroup
+ \@tempcnta\z@
+ \loop\ifnum\@tempcnta<\@xxxii
+ \catcode\@tempcnta14 %
+ \advance\@tempcnta\@ne
+ \repeat
+ \catcode`\^^?14 %
+ \let\do\@makeother
+ \dospecials
+ \catcode`\ 10 %
+ \catcode`\^^I10 %
+ \catcode\endlinechar5 %
+ \@makeother\:%
+ \@makeother\-%
+ \immediate\openin\@inputcheck#1 %
+ \ifeof\@inputcheck
+ \@latex@error{File `#1' not found}\@ehc
+ \else
+ \Gread@true
+ \let\@tempb\Gread@false
+ \loop
+ \read\@inputcheck to\@tempa
+ \ifeof\@inputcheck
+ \Gread@false
+ \else
+ \expandafter\Gread@find@bb\@tempa:.\\%
+ \fi
+ \ifGread@
+ \repeat
+ \immediate\closein\@inputcheck
+ \fi
+ \ifGin@bbox\else
+ \@latex@error
+ {Cannot determine size of graphic in #1 (no BoundingBox)}%
+ \@ehc
+ \gdef\@gtempa{0 0 72 72 }%
+ \fi
+ \endgroup
+ \expandafter\Gread@parse@bb\@gtempa\\}
+\long\def\Gread@find@bb#1:#2#3\\{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\Gread@BBox
+ \Gread@test@atend#2#3()\\%
+ \fi}
+\def\Gread@test@atend#1(#2)#3\\{%
+ \def\@tempa{#2}%
+ \ifx\@tempa\Gread@atend
+ \Gread@true
+ \let\@tempb\relax
+ \else
+ \gdef\@gtempa{#1}%
+ \@tempb
+ \Gin@bboxtrue
+ \fi}
+\def\Gread@parse@bb#1 #2 #3 #4 #5\\{%
+ \Gin@defaultbp\Gin@llx{#1}%
+ \Gin@defaultbp\Gin@lly{#2}%
+ \Gin@defaultbp\Gin@urx{#3}%
+ \Gin@defaultbp\Gin@ury{#4}}%
+\def\Gread@atend{atend}
+\let\Grot@height\@ovxx
+\let\Grot@left\@ovyy
+\let\Grot@right\@ovdx
+\let\Grot@depth\@ovdy
+\let\Grot@l\@ovro
+\let\Grot@r\@ovri
+\let\Grot@h\@xdim
+\let\Grot@d\@ydim
+\let\Grot@x\@linelen
+\let\Grot@y\@dashdim
+\long\def\rotatebox#1#2{%
+ \leavevmode
+ \Grot@setangle{#1}%
+ \setbox\z@\hbox{{#2}}%
+ \Grot@x\z@
+ \Grot@y\z@
+ \Grot@box}
+\def\Grot@setangle#1{\edef\Grot@angle{#1}}
+\def\Grot@Px#1#2#3{%
+ #1\Grot@cos#2%
+ \advance#1-\Grot@sin#3}
+\def\Grot@Py#1#2#3{%
+ #1\Grot@sin#2%
+ \advance#1\Grot@cos#3}
+\def\Grot@box{%
+ \begingroup
+ \CalculateSin\Grot@angle
+ \CalculateCos\Grot@angle
+ \edef\Grot@sin{\UseSin\Grot@angle}%
+ \edef\Grot@cos{\UseCos\Grot@angle}%
+^^A \GDebug{Rotate: angle \Grot@angle, sine is \Grot@sin,
+^^A cosine is \Grot@cos}%
+ \Grot@r\wd\z@ \advance\Grot@r-\Grot@x
+ \Grot@l\z@ \advance\Grot@l-\Grot@x
+ \Grot@h\ht\z@ \advance\Grot@h-\Grot@y
+ \Grot@d-\dp\z@ \advance\Grot@d-\Grot@y
+ \ifdim\Grot@sin\p@>\z@
+ \ifdim\Grot@cos\p@>\z@
+ \Grot@Py\Grot@height \Grot@r\Grot@h%B
+ \Grot@Px\Grot@right \Grot@r\Grot@d%E
+ \Grot@Px\Grot@left \Grot@l\Grot@h%C
+ \Grot@Py\Grot@depth \Grot@l\Grot@d%D
+ \else
+ \Grot@Py\Grot@height \Grot@r\Grot@d%E
+ \Grot@Px\Grot@right \Grot@l\Grot@d%D
+ \Grot@Px\Grot@left \Grot@r\Grot@h%B
+ \Grot@Py\Grot@depth \Grot@l\Grot@h%C
+ \fi
+ \else
+ \ifdim\Grot@cos\p@<\z@
+ \Grot@Py\Grot@height \Grot@l\Grot@d%D
+ \Grot@Px\Grot@right \Grot@l\Grot@h%C
+ \Grot@Px\Grot@left \Grot@r\Grot@d%E
+ \Grot@Py\Grot@depth \Grot@r\Grot@h%B
+ \else
+ \Grot@Py\Grot@height \Grot@l\Grot@h%C
+ \Grot@Px\Grot@right \Grot@r\Grot@h%B
+ \Grot@Px\Grot@left \Grot@l\Grot@d%D
+ \Grot@Py\Grot@depth \Grot@r\Grot@d%E
+ \fi
+ \fi
+ \advance\Grot@height\Grot@y
+ \advance\Grot@depth\Grot@y
+ \Grot@Px\dimen@ \Grot@x\Grot@y
+ \Grot@Py\dimen@ii \Grot@x\Grot@y
+ \dimen@-\dimen@ \advance\dimen@-\Grot@left
+ \dimen@ii-\dimen@ii \advance\dimen@ii\Grot@y
+^^A \GDebug{Rotate: (l,r,h,d)^^J%
+^^A Original \the\Grot@l,\the\Grot@r,\the\Grot@h,\the\Grot@d,^^J%
+^^A New..... \the\Grot@left,\the\Grot@right,%
+^^A \the\Grot@height,\the\Grot@depth}%
+ \setbox\z@\hbox{%
+ \kern\dimen@
+ \raise\dimen@ii\hbox{\Grot@start\box\z@\Grot@end}}%
+ \ht\z@\Grot@height
+ \dp\z@-\Grot@depth
+ \advance\Grot@right-\Grot@left\wd\z@\Grot@right
+ \leavevmode\box\z@
+ \endgroup}
+\def\scalebox#1{%
+ \@ifnextchar[{\Gscale@box{#1}}{\Gscale@box{#1}[#1]}}
+\long\def\Gscale@box#1[#2]#3{%
+ \leavevmode
+ \def\Gscale@x{#1}\def\Gscale@y{#2}%
+ \setbox\z@\hbox{{#3}}%
+ \setbox\tw@\hbox{\Gscale@start\rlap{\copy\z@}\Gscale@end}%
+ \ifdim#2\p@<\z@
+ \ht\tw@-#2\dp\z@
+ \dp\tw@-#2\ht\z@
+ \else
+ \ht\tw@#2\ht\z@
+ \dp\tw@#2\dp\z@
+ \fi
+ \ifdim#1\p@<\z@
+ \hb@xt@-#1\wd\z@{\kern-#1\wd\z@\box\tw@\hss}%
+ \else
+ \wd\tw@#1\wd\z@
+ \box\tw@
+ \fi}
+\def\reflectbox{\Gscale@box-1[1]}
+\def\resizebox{%
+ \leavevmode
+ \@ifstar{\Gscale@@box\totalheight}{\Gscale@@box\height}}
+\def\Gscale@@box#1#2#3{%
+ \let\@tempa\Gin@exclamation
+ \expandafter\def\expandafter\@tempb\expandafter{\string#2}%
+ \expandafter\def\expandafter\@tempc\expandafter{\string#3}%
+ \ifx\@tempb\@tempa
+ \ifx\@tempc\@tempa
+ \toks@{\mbox}%
+ \else
+ \toks@{\Gscale@box@dd{#3}#1}%
+ \fi
+ \else
+ \ifx\@tempc\@tempa
+ \toks@{\Gscale@box@dd{#2}\width}%
+ \else
+ \toks@{\Gscale@box@dddd{#2}\width{#3}#1}%
+ \fi
+ \fi
+ \the\toks@}
+\long\def\Gscale@box@dd#1#2#3{%
+ \@begin@tempboxa\hbox{#3}%
+ \setlength\@tempdima{#1}%
+ \setlength\@tempdimb{#2}%
+ \Gscale@div\@tempa\@tempdima\@tempdimb
+ \Gscale@box\@tempa[\@tempa]{\box\@tempboxa}%
+ \@end@tempboxa}
+\long\def\Gscale@box@dddd#1#2#3#4#5{%
+ \@begin@tempboxa\hbox{#5}%
+ \setlength\@tempdima{#1}%
+ \setlength\@tempdimb{#2}%
+ \Gscale@div\@tempa\@tempdima\@tempdimb
+ \setlength\@tempdima{#3}%
+ \setlength\@tempdimb{#4}%
+ \Gscale@div\@tempb\@tempdima\@tempdimb
+ \ifGin@iso
+ \ifdim\@tempa\p@>\@tempb\p@
+ \let\@tempa\@tempb
+ \else
+ \let\@tempb\@tempa
+ \fi
+ \fi
+ \Gscale@box\@tempa[\@tempb]{\box\@tempboxa}%
+ \@end@tempboxa}
+\newif\ifGin@iso
+\def\Gscale@div#1#2#3{%
+ \setlength\dimen@{#3}%
+ \ifdim\dimen@=\z@
+ \PackageError{graphics}{Division by 0}\@eha
+ \dimen@#2%
+ \fi
+ \edef\@tempd{\the\dimen@}%
+ \setlength\dimen@{#2}%
+ \count@65536\relax
+ \ifdim\dimen@<\z@
+ \dimen@-\dimen@
+ \count@-\count@
+ \fi
+ \ifdim\dimen@>\z@
+ \loop
+ \ifdim\dimen@<8192\p@
+ \dimen@\tw@\dimen@
+ \divide\count@\tw@
+ \repeat
+ \dimen@ii\@tempd\relax
+ \divide\dimen@ii\count@
+ \divide\dimen@\dimen@ii
+ \fi
+ \edef#1{\strip@pt\dimen@}}
+\Gin@codes
+\let\Gin@codes\relax
+\endinput
+%%
+%% End of file `graphics.sty'.
diff --git a/Build/source/texk/xdvipdfmx/contrib/patches/glyphlist-cm-add.txt b/Build/source/texk/xdvipdfmx/contrib/patches/glyphlist-cm-add.txt
new file mode 100644
index 00000000000..ba8497776e6
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/contrib/patches/glyphlist-cm-add.txt
@@ -0,0 +1,76 @@
+# Additional entries for CMR10, CMMI10, CMSY10
+#
+# CMR10
+# suppress -> COMBINING SHORT SOLIDUS OVERLAY
+#supress;0337
+# CMMI10
+# tie -> COMBINING INVERTED BREVE
+# vector -> COMBINING RIGHT ARROW ABOVE
+# arrowhookleft, arrowhookright missing
+#
+pi1;03D6
+rho1;03F1
+arrowlefttophalf;21BC
+arrowleftbothalf;21BD
+arrowrighttophalf;21C0
+arrowrightbothalf;21C1
+triangleright;25C3
+triangleleft;25B9
+flat;266D
+natural;266E
+sharp;266F
+slurbelow;2323
+slurabove;2322
+lscript;2113
+vector;20D7
+epsilon1;03F5
+star;22C6
+#tie;0311
+# CMSY10
+# owner -> CONTAINS AS MEMBER
+# circlecopyrt -> COMBINING ENCLOSING CIRCLE
+# mapsto + [RIGHTWARDS ARROW] -> [RIGHTWARDS ARROW FROM BAR]
+arrownortheast;2197
+arrowsoutheast;2198
+similarequal;2245
+arrownorthwest;2196
+arrowsouthwest;2199
+prime;2032
+owner;220B
+triangle;25B3
+triangleinv;25BD
+negationslash;0338
+#mapsto;21A6
+Rfractur;211C
+Ifractur;2111
+latticetop;22A4
+unionmulti;228E
+turnstileleft;22A2
+turnstileright;22A3
+floorleft;230A
+floorright;230B
+ceilingleft;2308
+ceilingright;2309
+angbracketleft;2329
+angbracketright;232A
+bardbl;2225
+arrowbothv;2195
+arrowdblbothv;21D5
+wreathproduct;2240
+coproduct;2210
+unionsq;2294
+intersectionsq;2293
+subsetsqequal;2286
+supersetsqequal;2287
+diamondmath;22C4
+circleminus;2296
+circledivide;2298
+circledot;2299
+circlecopyrt;20DD
+equivasymptotic;2243
+precedesequal;227C
+followsequal;227D
+lessmuch;226A
+greatermuch;226B
+follows;227B
+#--end
diff --git a/Build/source/texk/xdvipdfmx/contrib/patches/patch-ebb-artbox.diff b/Build/source/texk/xdvipdfmx/contrib/patches/patch-ebb-artbox.diff
new file mode 100644
index 00000000000..7c9ff45c660
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/contrib/patches/patch-ebb-artbox.diff
@@ -0,0 +1,103 @@
+--- ebb.c.orig Fri Jun 29 04:55:26 2001
++++ ebb.c Tue Dec 2 11:48:16 2003
+@@ -40,7 +40,7 @@
+ #endif
+
+ #define EBB_PROGRAM "ebb"
+-#define EBB_VERSION "Version 0.5.2"
++#define EBB_VERSION "Version 0.5.2 (+ArtBox)"
+
+ static void usage (void)
+ {
+@@ -51,11 +51,13 @@
+ fprintf (stderr, "under certain conditions. Details are distributed with the software.\n");
+ fprintf (stderr, "\nUsage: [-v] [-b] ebb [files]\n");
+ fprintf (stderr, "\t-b\t\tWrite .bb file in binary mode\n");
++ fprintf (stderr, "\t-c\t\tUse MediaBox/CropBox for BoundingBox. (PDF)\n");
+ fprintf (stderr, "\t-v\t\tVerbose\n");
+ exit(1);
+ }
+
+ static char verbose = 0;
++static char compat = 0;
+
+ static void do_time(FILE *file)
+ {
+@@ -189,7 +191,7 @@
+
+ void do_pdf (FILE *file, char *filename)
+ {
+- pdf_obj *trailer, *catalog, *page_tree, *media_box, *crop_box;
++ pdf_obj *trailer, *catalog, *page_tree, *media_box, *crop_box, *rotate;
+ pdf_obj *kids_ref, *kids, *tmp1;
+ if (verbose) {
+ fprintf (stderr, "%s looks like a PDF file...", filename);
+@@ -211,6 +213,7 @@
+ /* Media box can be inherited so start looking for it now */
+ media_box = pdf_deref_obj (pdf_lookup_dict (page_tree, "MediaBox"));
+ crop_box = pdf_deref_obj (pdf_lookup_dict (page_tree, "CropBox"));
++ rotate = pdf_deref_obj(pdf_lookup_dict(page_tree, "Rotate"));
+ while ((kids_ref = pdf_lookup_dict (page_tree, "Kids")) != NULL) {
+ kids = pdf_deref_obj (kids_ref);
+ pdf_release_obj (page_tree);
+@@ -228,15 +231,43 @@
+ pdf_release_obj (crop_box);
+ if (tmp1)
+ crop_box = tmp1;
++ tmp1 = pdf_deref_obj(pdf_lookup_dict(page_tree, "Rotate"));
++ if (tmp1 && rotate)
++ pdf_release_obj (rotate);
++ if (tmp1)
++ rotate = tmp1;
+ }
++
++ if (crop_box) {
++ pdf_release_obj(media_box);
++ media_box = crop_box;
++ }
++
++ if (!compat) {
++ pdf_obj *tmp;
++
++ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "TrimBox")))) {
++ if (media_box)
++ pdf_release_obj(media_box);
++ media_box = tmp;
++ }
++ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "BleedBox")))) {
++ if (media_box)
++ pdf_release_obj(media_box);
++ media_box = tmp;
++ }
++ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "ArtBox")))) {
++ if (media_box)
++ pdf_release_obj(media_box);
++ media_box = tmp;
++ }
++ if (rotate && pdf_number_value(rotate) != 0.0)
++ fprintf(stderr, "\n<< /Rotate %d >> found.\n", (int)pdf_number_value(rotate));
++ }
++
+ /* At this point, we should have the media box for the first page */
+ {
+ pdf_obj *bbllx, *bblly, *bburx, *bbury;
+- if (crop_box) {
+- pdf_release_obj (media_box);
+- media_box = crop_box;
+- crop_box = NULL;
+- }
+ if ((bbllx = pdf_get_array (media_box, 0)) == NULL ||
+ (bblly = pdf_get_array (media_box, 1)) == NULL ||
+ (bburx = pdf_get_array (media_box, 2)) == NULL ||
+@@ -267,6 +298,11 @@
+ bb_file_mode = FOPEN_WBIN_MODE;
+ case 'v':
+ verbose = 1;
++ argc -= 1;
++ argv += 1;
++ break;
++ case 'c':
++ compat = 1;
+ argc -= 1;
+ argv += 1;
+ break;
diff --git a/Build/source/texk/xdvipdfmx/data/CMap/EUC-UCS2 b/Build/source/texk/xdvipdfmx/data/CMap/EUC-UCS2
new file mode 100644
index 00000000000..d7a91685ad5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/CMap/EUC-UCS2
@@ -0,0 +1,6800 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (EUC-UCS2)
+%%Title: (EUC-UCS2)
+%%Version: 1.0
+%%Copyright:
+%% Copyright (C) 2002 by Jin-Hwan Cho <chofchof@ktug.or.kr>
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by
+%% the Free Software Foundation; either version 2 of the License, or
+%% (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software
+%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (EUC_UCS2) def
+ /Supplement 1 def
+end def
+
+/CMapName /EUC-UCS2 def
+/CMapVersion 1.0 def
+/CMapType 1 def
+/WMode 0 def
+
+3 begincodespacerange
+<00> <7E>
+<8EA0> <8EDF>
+<A1A1> <FEFE>
+endcodespacerange
+
+17 beginbfrange
+<00> <5B> <0000>
+<5D> <7D> <005D>
+<8EA0> <8EDF> <FF60>
+<A1D2> <A1DB> <3008>
+<A3B0> <A3B9> <FF10>
+<A3C1> <A3DA> <FF21>
+<A3E1> <A3FA> <FF41>
+<A4A1> <A4F3> <3041>
+<A5A1> <A5F6> <30A1>
+<A6A1> <A6B1> <0391>
+<A6B2> <A6B8> <03A3>
+<A6C1> <A6D1> <03B1>
+<A6D2> <A6D8> <03C3>
+<A7A1> <A7A6> <0410>
+<A7A8> <A7C1> <0416>
+<A7D1> <A7D6> <0430>
+<A7D8> <A7F1> <0436>
+endbfrange
+
+99 beginbfchar
+<5C> <00A5>
+<7E> <203E>
+<A1A1> <3000>
+<A1A2> <3001>
+<A1A3> <3002>
+<A1A4> <FF0C>
+<A1A5> <FF0E>
+<A1A6> <30FB>
+<A1A7> <FF1A>
+<A1A8> <FF1B>
+<A1A9> <FF1F>
+<A1AA> <FF01>
+<A1AB> <309B>
+<A1AC> <309C>
+<A1AD> <00B4>
+<A1AE> <FF40>
+<A1AF> <00A8>
+<A1B0> <FF3E>
+<A1B1> <203E>
+<A1B2> <FF3F>
+<A1B3> <30FD>
+<A1B4> <30FE>
+<A1B5> <309D>
+<A1B6> <309E>
+<A1B7> <3003>
+<A1B8> <4EDD>
+<A1B9> <3005>
+<A1BA> <3006>
+<A1BB> <3007>
+<A1BC> <30FC>
+<A1BD> <2015>
+<A1BE> <2010>
+<A1BF> <FF0F>
+<A1C0> <FF3C>
+<A1C1> <FF5E>
+<A1C2> <2016>
+<A1C3> <FF5C>
+<A1C4> <2026>
+<A1C5> <2025>
+<A1C6> <2018>
+<A1C7> <2019>
+<A1C8> <201C>
+<A1C9> <201D>
+<A1CA> <FF08>
+<A1CB> <FF09>
+<A1CC> <3014>
+<A1CD> <3015>
+<A1CE> <FF3B>
+<A1CF> <FF3D>
+<A1D0> <FF5B>
+<A1D1> <FF5D>
+<A1DC> <FF0B>
+<A1DD> <FF0D>
+<A1DE> <00B1>
+<A1DF> <00D7>
+<A1E0> <00F7>
+<A1E1> <FF1D>
+<A1E2> <2260>
+<A1E3> <FF1C>
+<A1E4> <FF1E>
+<A1E5> <2266>
+<A1E6> <2267>
+<A1E7> <221E>
+<A1E8> <2234>
+<A1E9> <2642>
+<A1EA> <2640>
+<A1EB> <00B0>
+<A1EC> <2032>
+<A1ED> <2033>
+<A1EE> <2103>
+<A1EF> <FFE5>
+<A1F0> <FF04>
+<A1F1> <00A2>
+<A1F2> <00A3>
+<A1F3> <FF05>
+<A1F4> <FF03>
+<A1F5> <FF06>
+<A1F6> <FF0A>
+<A1F7> <FF20>
+<A1F8> <00A7>
+<A1F9> <2606>
+<A1FA> <2605>
+<A1FB> <25CB>
+<A1FC> <25CF>
+<A1FD> <25CE>
+<A1FE> <25C7>
+<A2A1> <25C6>
+<A2A2> <25A1>
+<A2A3> <25A0>
+<A2A4> <25B3>
+<A2A5> <25B2>
+<A2A6> <25BD>
+<A2A7> <25BC>
+<A2A8> <203B>
+<A2A9> <3012>
+<A2AA> <2192>
+<A2AB> <2190>
+<A2AC> <2191>
+<A2AD> <2193>
+endbfchar
+
+100 beginbfchar
+<A2AE> <3013>
+<A2BA> <2208>
+<A2BB> <220B>
+<A2BC> <2286>
+<A2BD> <2287>
+<A2BE> <2282>
+<A2BF> <2283>
+<A2C0> <222A>
+<A2C1> <2229>
+<A2CA> <2227>
+<A2CB> <2228>
+<A2CC> <00AC>
+<A2CD> <21D2>
+<A2CE> <21D4>
+<A2CF> <2200>
+<A2D0> <2203>
+<A2DC> <2220>
+<A2DD> <22A5>
+<A2DE> <2312>
+<A2DF> <2202>
+<A2E0> <2207>
+<A2E1> <2261>
+<A2E2> <2252>
+<A2E3> <226A>
+<A2E4> <226B>
+<A2E5> <221A>
+<A2E6> <223D>
+<A2E7> <221D>
+<A2E8> <2235>
+<A2E9> <222B>
+<A2EA> <222C>
+<A2F2> <212B>
+<A2F3> <2030>
+<A2F4> <266F>
+<A2F5> <266D>
+<A2F6> <266A>
+<A2F7> <2020>
+<A2F8> <2021>
+<A2F9> <00B6>
+<A2FE> <25EF>
+<A7A7> <0401>
+<A7D7> <0451>
+<A8A1> <2500>
+<A8A2> <2502>
+<A8A3> <250C>
+<A8A4> <2510>
+<A8A5> <2518>
+<A8A6> <2514>
+<A8A7> <251C>
+<A8A8> <252C>
+<A8A9> <2524>
+<A8AA> <2534>
+<A8AB> <253C>
+<A8AC> <2501>
+<A8AD> <2503>
+<A8AE> <250F>
+<A8AF> <2513>
+<A8B0> <251B>
+<A8B1> <2517>
+<A8B2> <2523>
+<A8B3> <2533>
+<A8B4> <252B>
+<A8B5> <253B>
+<A8B6> <254B>
+<A8B7> <2520>
+<A8B8> <252F>
+<A8B9> <2528>
+<A8BA> <2537>
+<A8BB> <253F>
+<A8BC> <251D>
+<A8BD> <2530>
+<A8BE> <2525>
+<A8BF> <2538>
+<A8C0> <2542>
+<B0A1> <4E9C>
+<B0A2> <5516>
+<B0A3> <5A03>
+<B0A4> <963F>
+<B0A5> <54C0>
+<B0A6> <611B>
+<B0A7> <6328>
+<B0A8> <59F6>
+<B0A9> <9022>
+<B0AA> <8475>
+<B0AB> <831C>
+<B0AC> <7A50>
+<B0AD> <60AA>
+<B0AE> <63E1>
+<B0AF> <6E25>
+<B0B0> <65ED>
+<B0B1> <8466>
+<B0B2> <82A6>
+<B0B3> <9BF5>
+<B0B4> <6893>
+<B0B5> <5727>
+<B0B6> <65A1>
+<B0B7> <6271>
+<B0B8> <5B9B>
+<B0B9> <59D0>
+<B0BA> <867B>
+endbfchar
+
+100 beginbfchar
+<B0BB> <98F4>
+<B0BC> <7D62>
+<B0BD> <7DBE>
+<B0BE> <9B8E>
+<B0BF> <6216>
+<B0C0> <7C9F>
+<B0C1> <88B7>
+<B0C2> <5B89>
+<B0C3> <5EB5>
+<B0C4> <6309>
+<B0C5> <6697>
+<B0C6> <6848>
+<B0C7> <95C7>
+<B0C8> <978D>
+<B0C9> <674F>
+<B0CA> <4EE5>
+<B0CB> <4F0A>
+<B0CC> <4F4D>
+<B0CD> <4F9D>
+<B0CE> <5049>
+<B0CF> <56F2>
+<B0D0> <5937>
+<B0D1> <59D4>
+<B0D2> <5A01>
+<B0D3> <5C09>
+<B0D4> <60DF>
+<B0D5> <610F>
+<B0D6> <6170>
+<B0D7> <6613>
+<B0D8> <6905>
+<B0D9> <70BA>
+<B0DA> <754F>
+<B0DB> <7570>
+<B0DC> <79FB>
+<B0DD> <7DAD>
+<B0DE> <7DEF>
+<B0DF> <80C3>
+<B0E0> <840E>
+<B0E1> <8863>
+<B0E2> <8B02>
+<B0E3> <9055>
+<B0E4> <907A>
+<B0E5> <533B>
+<B0E6> <4E95>
+<B0E7> <4EA5>
+<B0E8> <57DF>
+<B0E9> <80B2>
+<B0EA> <90C1>
+<B0EB> <78EF>
+<B0EC> <4E00>
+<B0ED> <58F1>
+<B0EE> <6EA2>
+<B0EF> <9038>
+<B0F0> <7A32>
+<B0F1> <8328>
+<B0F2> <828B>
+<B0F3> <9C2F>
+<B0F4> <5141>
+<B0F5> <5370>
+<B0F6> <54BD>
+<B0F7> <54E1>
+<B0F8> <56E0>
+<B0F9> <59FB>
+<B0FA> <5F15>
+<B0FB> <98F2>
+<B0FC> <6DEB>
+<B0FD> <80E4>
+<B0FE> <852D>
+<B1A1> <9662>
+<B1A2> <9670>
+<B1A3> <96A0>
+<B1A4> <97FB>
+<B1A5> <540B>
+<B1A6> <53F3>
+<B1A7> <5B87>
+<B1A8> <70CF>
+<B1A9> <7FBD>
+<B1AA> <8FC2>
+<B1AB> <96E8>
+<B1AC> <536F>
+<B1AD> <9D5C>
+<B1AE> <7ABA>
+<B1AF> <4E11>
+<B1B0> <7893>
+<B1B1> <81FC>
+<B1B2> <6E26>
+<B1B3> <5618>
+<B1B4> <5504>
+<B1B5> <6B1D>
+<B1B6> <851A>
+<B1B7> <9C3B>
+<B1B8> <59E5>
+<B1B9> <53A9>
+<B1BA> <6D66>
+<B1BB> <74DC>
+<B1BC> <958F>
+<B1BD> <5642>
+<B1BE> <4E91>
+<B1BF> <904B>
+<B1C0> <96F2>
+endbfchar
+
+100 beginbfchar
+<B1C1> <834F>
+<B1C2> <990C>
+<B1C3> <53E1>
+<B1C4> <55B6>
+<B1C5> <5B30>
+<B1C6> <5F71>
+<B1C7> <6620>
+<B1C8> <66F3>
+<B1C9> <6804>
+<B1CA> <6C38>
+<B1CB> <6CF3>
+<B1CC> <6D29>
+<B1CD> <745B>
+<B1CE> <76C8>
+<B1CF> <7A4E>
+<B1D0> <9834>
+<B1D1> <82F1>
+<B1D2> <885B>
+<B1D3> <8A60>
+<B1D4> <92ED>
+<B1D5> <6DB2>
+<B1D6> <75AB>
+<B1D7> <76CA>
+<B1D8> <99C5>
+<B1D9> <60A6>
+<B1DA> <8B01>
+<B1DB> <8D8A>
+<B1DC> <95B2>
+<B1DD> <698E>
+<B1DE> <53AD>
+<B1DF> <5186>
+<B1E0> <5712>
+<B1E1> <5830>
+<B1E2> <5944>
+<B1E3> <5BB4>
+<B1E4> <5EF6>
+<B1E5> <6028>
+<B1E6> <63A9>
+<B1E7> <63F4>
+<B1E8> <6CBF>
+<B1E9> <6F14>
+<B1EA> <708E>
+<B1EB> <7114>
+<B1EC> <7159>
+<B1ED> <71D5>
+<B1EE> <733F>
+<B1EF> <7E01>
+<B1F0> <8276>
+<B1F1> <82D1>
+<B1F2> <8597>
+<B1F3> <9060>
+<B1F4> <925B>
+<B1F5> <9D1B>
+<B1F6> <5869>
+<B1F7> <65BC>
+<B1F8> <6C5A>
+<B1F9> <7525>
+<B1FA> <51F9>
+<B1FB> <592E>
+<B1FC> <5965>
+<B1FD> <5F80>
+<B1FE> <5FDC>
+<B2A1> <62BC>
+<B2A2> <65FA>
+<B2A3> <6A2A>
+<B2A4> <6B27>
+<B2A5> <6BB4>
+<B2A6> <738B>
+<B2A7> <7FC1>
+<B2A8> <8956>
+<B2A9> <9D2C>
+<B2AA> <9D0E>
+<B2AB> <9EC4>
+<B2AC> <5CA1>
+<B2AD> <6C96>
+<B2AE> <837B>
+<B2AF> <5104>
+<B2B0> <5C4B>
+<B2B1> <61B6>
+<B2B2> <81C6>
+<B2B3> <6876>
+<B2B4> <7261>
+<B2B5> <4E59>
+<B2B6> <4FFA>
+<B2B7> <5378>
+<B2B8> <6069>
+<B2B9> <6E29>
+<B2BA> <7A4F>
+<B2BB> <97F3>
+<B2BC> <4E0B>
+<B2BD> <5316>
+<B2BE> <4EEE>
+<B2BF> <4F55>
+<B2C0> <4F3D>
+<B2C1> <4FA1>
+<B2C2> <4F73>
+<B2C3> <52A0>
+<B2C4> <53EF>
+<B2C5> <5609>
+<B2C6> <590F>
+endbfchar
+
+100 beginbfchar
+<B2C7> <5AC1>
+<B2C8> <5BB6>
+<B2C9> <5BE1>
+<B2CA> <79D1>
+<B2CB> <6687>
+<B2CC> <679C>
+<B2CD> <67B6>
+<B2CE> <6B4C>
+<B2CF> <6CB3>
+<B2D0> <706B>
+<B2D1> <73C2>
+<B2D2> <798D>
+<B2D3> <79BE>
+<B2D4> <7A3C>
+<B2D5> <7B87>
+<B2D6> <82B1>
+<B2D7> <82DB>
+<B2D8> <8304>
+<B2D9> <8377>
+<B2DA> <83EF>
+<B2DB> <83D3>
+<B2DC> <8766>
+<B2DD> <8AB2>
+<B2DE> <5629>
+<B2DF> <8CA8>
+<B2E0> <8FE6>
+<B2E1> <904E>
+<B2E2> <971E>
+<B2E3> <868A>
+<B2E4> <4FC4>
+<B2E5> <5CE8>
+<B2E6> <6211>
+<B2E7> <7259>
+<B2E8> <753B>
+<B2E9> <81E5>
+<B2EA> <82BD>
+<B2EB> <86FE>
+<B2EC> <8CC0>
+<B2ED> <96C5>
+<B2EE> <9913>
+<B2EF> <99D5>
+<B2F0> <4ECB>
+<B2F1> <4F1A>
+<B2F2> <89E3>
+<B2F3> <56DE>
+<B2F4> <584A>
+<B2F5> <58CA>
+<B2F6> <5EFB>
+<B2F7> <5FEB>
+<B2F8> <602A>
+<B2F9> <6094>
+<B2FA> <6062>
+<B2FB> <61D0>
+<B2FC> <6212>
+<B2FD> <62D0>
+<B2FE> <6539>
+<B3A1> <9B41>
+<B3A2> <6666>
+<B3A3> <68B0>
+<B3A4> <6D77>
+<B3A5> <7070>
+<B3A6> <754C>
+<B3A7> <7686>
+<B3A8> <7D75>
+<B3A9> <82A5>
+<B3AA> <87F9>
+<B3AB> <958B>
+<B3AC> <968E>
+<B3AD> <8C9D>
+<B3AE> <51F1>
+<B3AF> <52BE>
+<B3B0> <5916>
+<B3B1> <54B3>
+<B3B2> <5BB3>
+<B3B3> <5D16>
+<B3B4> <6168>
+<B3B5> <6982>
+<B3B6> <6DAF>
+<B3B7> <788D>
+<B3B8> <84CB>
+<B3B9> <8857>
+<B3BA> <8A72>
+<B3BB> <93A7>
+<B3BC> <9AB8>
+<B3BD> <6D6C>
+<B3BE> <99A8>
+<B3BF> <86D9>
+<B3C0> <57A3>
+<B3C1> <67FF>
+<B3C2> <86CE>
+<B3C3> <920E>
+<B3C4> <5283>
+<B3C5> <5687>
+<B3C6> <5404>
+<B3C7> <5ED3>
+<B3C8> <62E1>
+<B3C9> <64B9>
+<B3CA> <683C>
+<B3CB> <6838>
+<B3CC> <6BBB>
+endbfchar
+
+100 beginbfchar
+<B3CD> <7372>
+<B3CE> <78BA>
+<B3CF> <7A6B>
+<B3D0> <899A>
+<B3D1> <89D2>
+<B3D2> <8D6B>
+<B3D3> <8F03>
+<B3D4> <90ED>
+<B3D5> <95A3>
+<B3D6> <9694>
+<B3D7> <9769>
+<B3D8> <5B66>
+<B3D9> <5CB3>
+<B3DA> <697D>
+<B3DB> <984D>
+<B3DC> <984E>
+<B3DD> <639B>
+<B3DE> <7B20>
+<B3DF> <6A2B>
+<B3E0> <6A7F>
+<B3E1> <68B6>
+<B3E2> <9C0D>
+<B3E3> <6F5F>
+<B3E4> <5272>
+<B3E5> <559D>
+<B3E6> <6070>
+<B3E7> <62EC>
+<B3E8> <6D3B>
+<B3E9> <6E07>
+<B3EA> <6ED1>
+<B3EB> <845B>
+<B3EC> <8910>
+<B3ED> <8F44>
+<B3EE> <4E14>
+<B3EF> <9C39>
+<B3F0> <53F6>
+<B3F1> <691B>
+<B3F2> <6A3A>
+<B3F3> <9784>
+<B3F4> <682A>
+<B3F5> <515C>
+<B3F6> <7AC3>
+<B3F7> <84B2>
+<B3F8> <91DC>
+<B3F9> <938C>
+<B3FA> <565B>
+<B3FB> <9D28>
+<B3FC> <6822>
+<B3FD> <8305>
+<B3FE> <8431>
+<B4A1> <7CA5>
+<B4A2> <5208>
+<B4A3> <82C5>
+<B4A4> <74E6>
+<B4A5> <4E7E>
+<B4A6> <4F83>
+<B4A7> <51A0>
+<B4A8> <5BD2>
+<B4A9> <520A>
+<B4AA> <52D8>
+<B4AB> <52E7>
+<B4AC> <5DFB>
+<B4AD> <559A>
+<B4AE> <582A>
+<B4AF> <59E6>
+<B4B0> <5B8C>
+<B4B1> <5B98>
+<B4B2> <5BDB>
+<B4B3> <5E72>
+<B4B4> <5E79>
+<B4B5> <60A3>
+<B4B6> <611F>
+<B4B7> <6163>
+<B4B8> <61BE>
+<B4B9> <63DB>
+<B4BA> <6562>
+<B4BB> <67D1>
+<B4BC> <6853>
+<B4BD> <68FA>
+<B4BE> <6B3E>
+<B4BF> <6B53>
+<B4C0> <6C57>
+<B4C1> <6F22>
+<B4C2> <6F97>
+<B4C3> <6F45>
+<B4C4> <74B0>
+<B4C5> <7518>
+<B4C6> <76E3>
+<B4C7> <770B>
+<B4C8> <7AFF>
+<B4C9> <7BA1>
+<B4CA> <7C21>
+<B4CB> <7DE9>
+<B4CC> <7F36>
+<B4CD> <7FF0>
+<B4CE> <809D>
+<B4CF> <8266>
+<B4D0> <839E>
+<B4D1> <89B3>
+<B4D2> <8ACC>
+endbfchar
+
+100 beginbfchar
+<B4D3> <8CAB>
+<B4D4> <9084>
+<B4D5> <9451>
+<B4D6> <9593>
+<B4D7> <9591>
+<B4D8> <95A2>
+<B4D9> <9665>
+<B4DA> <97D3>
+<B4DB> <9928>
+<B4DC> <8218>
+<B4DD> <4E38>
+<B4DE> <542B>
+<B4DF> <5CB8>
+<B4E0> <5DCC>
+<B4E1> <73A9>
+<B4E2> <764C>
+<B4E3> <773C>
+<B4E4> <5CA9>
+<B4E5> <7FEB>
+<B4E6> <8D0B>
+<B4E7> <96C1>
+<B4E8> <9811>
+<B4E9> <9854>
+<B4EA> <9858>
+<B4EB> <4F01>
+<B4EC> <4F0E>
+<B4ED> <5371>
+<B4EE> <559C>
+<B4EF> <5668>
+<B4F0> <57FA>
+<B4F1> <5947>
+<B4F2> <5B09>
+<B4F3> <5BC4>
+<B4F4> <5C90>
+<B4F5> <5E0C>
+<B4F6> <5E7E>
+<B4F7> <5FCC>
+<B4F8> <63EE>
+<B4F9> <673A>
+<B4FA> <65D7>
+<B4FB> <65E2>
+<B4FC> <671F>
+<B4FD> <68CB>
+<B4FE> <68C4>
+<B5A1> <6A5F>
+<B5A2> <5E30>
+<B5A3> <6BC5>
+<B5A4> <6C17>
+<B5A5> <6C7D>
+<B5A6> <757F>
+<B5A7> <7948>
+<B5A8> <5B63>
+<B5A9> <7A00>
+<B5AA> <7D00>
+<B5AB> <5FBD>
+<B5AC> <898F>
+<B5AD> <8A18>
+<B5AE> <8CB4>
+<B5AF> <8D77>
+<B5B0> <8ECC>
+<B5B1> <8F1D>
+<B5B2> <98E2>
+<B5B3> <9A0E>
+<B5B4> <9B3C>
+<B5B5> <4E80>
+<B5B6> <507D>
+<B5B7> <5100>
+<B5B8> <5993>
+<B5B9> <5B9C>
+<B5BA> <622F>
+<B5BB> <6280>
+<B5BC> <64EC>
+<B5BD> <6B3A>
+<B5BE> <72A0>
+<B5BF> <7591>
+<B5C0> <7947>
+<B5C1> <7FA9>
+<B5C2> <87FB>
+<B5C3> <8ABC>
+<B5C4> <8B70>
+<B5C5> <63AC>
+<B5C6> <83CA>
+<B5C7> <97A0>
+<B5C8> <5409>
+<B5C9> <5403>
+<B5CA> <55AB>
+<B5CB> <6854>
+<B5CC> <6A58>
+<B5CD> <8A70>
+<B5CE> <7827>
+<B5CF> <6775>
+<B5D0> <9ECD>
+<B5D1> <5374>
+<B5D2> <5BA2>
+<B5D3> <811A>
+<B5D4> <8650>
+<B5D5> <9006>
+<B5D6> <4E18>
+<B5D7> <4E45>
+<B5D8> <4EC7>
+endbfchar
+
+100 beginbfchar
+<B5D9> <4F11>
+<B5DA> <53CA>
+<B5DB> <5438>
+<B5DC> <5BAE>
+<B5DD> <5F13>
+<B5DE> <6025>
+<B5DF> <6551>
+<B5E0> <673D>
+<B5E1> <6C42>
+<B5E2> <6C72>
+<B5E3> <6CE3>
+<B5E4> <7078>
+<B5E5> <7403>
+<B5E6> <7A76>
+<B5E7> <7AAE>
+<B5E8> <7B08>
+<B5E9> <7D1A>
+<B5EA> <7CFE>
+<B5EB> <7D66>
+<B5EC> <65E7>
+<B5ED> <725B>
+<B5EE> <53BB>
+<B5EF> <5C45>
+<B5F0> <5DE8>
+<B5F1> <62D2>
+<B5F2> <62E0>
+<B5F3> <6319>
+<B5F4> <6E20>
+<B5F5> <865A>
+<B5F6> <8A31>
+<B5F7> <8DDD>
+<B5F8> <92F8>
+<B5F9> <6F01>
+<B5FA> <79A6>
+<B5FB> <9B5A>
+<B5FC> <4EA8>
+<B5FD> <4EAB>
+<B5FE> <4EAC>
+<B6A1> <4F9B>
+<B6A2> <4FA0>
+<B6A3> <50D1>
+<B6A4> <5147>
+<B6A5> <7AF6>
+<B6A6> <5171>
+<B6A7> <51F6>
+<B6A8> <5354>
+<B6A9> <5321>
+<B6AA> <537F>
+<B6AB> <53EB>
+<B6AC> <55AC>
+<B6AD> <5883>
+<B6AE> <5CE1>
+<B6AF> <5F37>
+<B6B0> <5F4A>
+<B6B1> <602F>
+<B6B2> <6050>
+<B6B3> <606D>
+<B6B4> <631F>
+<B6B5> <6559>
+<B6B6> <6A4B>
+<B6B7> <6CC1>
+<B6B8> <72C2>
+<B6B9> <72ED>
+<B6BA> <77EF>
+<B6BB> <80F8>
+<B6BC> <8105>
+<B6BD> <8208>
+<B6BE> <854E>
+<B6BF> <90F7>
+<B6C0> <93E1>
+<B6C1> <97FF>
+<B6C2> <9957>
+<B6C3> <9A5A>
+<B6C4> <4EF0>
+<B6C5> <51DD>
+<B6C6> <5C2D>
+<B6C7> <6681>
+<B6C8> <696D>
+<B6C9> <5C40>
+<B6CA> <66F2>
+<B6CB> <6975>
+<B6CC> <7389>
+<B6CD> <6850>
+<B6CE> <7C81>
+<B6CF> <50C5>
+<B6D0> <52E4>
+<B6D1> <5747>
+<B6D2> <5DFE>
+<B6D3> <9326>
+<B6D4> <65A4>
+<B6D5> <6B23>
+<B6D6> <6B3D>
+<B6D7> <7434>
+<B6D8> <7981>
+<B6D9> <79BD>
+<B6DA> <7B4B>
+<B6DB> <7DCA>
+<B6DC> <82B9>
+<B6DD> <83CC>
+<B6DE> <887F>
+endbfchar
+
+100 beginbfchar
+<B6DF> <895F>
+<B6E0> <8B39>
+<B6E1> <8FD1>
+<B6E2> <91D1>
+<B6E3> <541F>
+<B6E4> <9280>
+<B6E5> <4E5D>
+<B6E6> <5036>
+<B6E7> <53E5>
+<B6E8> <533A>
+<B6E9> <72D7>
+<B6EA> <7396>
+<B6EB> <77E9>
+<B6EC> <82E6>
+<B6ED> <8EAF>
+<B6EE> <99C6>
+<B6EF> <99C8>
+<B6F0> <99D2>
+<B6F1> <5177>
+<B6F2> <611A>
+<B6F3> <865E>
+<B6F4> <55B0>
+<B6F5> <7A7A>
+<B6F6> <5076>
+<B6F7> <5BD3>
+<B6F8> <9047>
+<B6F9> <9685>
+<B6FA> <4E32>
+<B6FB> <6ADB>
+<B6FC> <91E7>
+<B6FD> <5C51>
+<B6FE> <5C48>
+<B7A1> <6398>
+<B7A2> <7A9F>
+<B7A3> <6C93>
+<B7A4> <9774>
+<B7A5> <8F61>
+<B7A6> <7AAA>
+<B7A7> <718A>
+<B7A8> <9688>
+<B7A9> <7C82>
+<B7AA> <6817>
+<B7AB> <7E70>
+<B7AC> <6851>
+<B7AD> <936C>
+<B7AE> <52F2>
+<B7AF> <541B>
+<B7B0> <85AB>
+<B7B1> <8A13>
+<B7B2> <7FA4>
+<B7B3> <8ECD>
+<B7B4> <90E1>
+<B7B5> <5366>
+<B7B6> <8888>
+<B7B7> <7941>
+<B7B8> <4FC2>
+<B7B9> <50BE>
+<B7BA> <5211>
+<B7BB> <5144>
+<B7BC> <5553>
+<B7BD> <572D>
+<B7BE> <73EA>
+<B7BF> <578B>
+<B7C0> <5951>
+<B7C1> <5F62>
+<B7C2> <5F84>
+<B7C3> <6075>
+<B7C4> <6176>
+<B7C5> <6167>
+<B7C6> <61A9>
+<B7C7> <63B2>
+<B7C8> <643A>
+<B7C9> <656C>
+<B7CA> <666F>
+<B7CB> <6842>
+<B7CC> <6E13>
+<B7CD> <7566>
+<B7CE> <7A3D>
+<B7CF> <7CFB>
+<B7D0> <7D4C>
+<B7D1> <7D99>
+<B7D2> <7E4B>
+<B7D3> <7F6B>
+<B7D4> <830E>
+<B7D5> <834A>
+<B7D6> <86CD>
+<B7D7> <8A08>
+<B7D8> <8A63>
+<B7D9> <8B66>
+<B7DA> <8EFD>
+<B7DB> <981A>
+<B7DC> <9D8F>
+<B7DD> <82B8>
+<B7DE> <8FCE>
+<B7DF> <9BE8>
+<B7E0> <5287>
+<B7E1> <621F>
+<B7E2> <6483>
+<B7E3> <6FC0>
+<B7E4> <9699>
+endbfchar
+
+100 beginbfchar
+<B7E5> <6841>
+<B7E6> <5091>
+<B7E7> <6B20>
+<B7E8> <6C7A>
+<B7E9> <6F54>
+<B7EA> <7A74>
+<B7EB> <7D50>
+<B7EC> <8840>
+<B7ED> <8A23>
+<B7EE> <6708>
+<B7EF> <4EF6>
+<B7F0> <5039>
+<B7F1> <5026>
+<B7F2> <5065>
+<B7F3> <517C>
+<B7F4> <5238>
+<B7F5> <5263>
+<B7F6> <55A7>
+<B7F7> <570F>
+<B7F8> <5805>
+<B7F9> <5ACC>
+<B7FA> <5EFA>
+<B7FB> <61B2>
+<B7FC> <61F8>
+<B7FD> <62F3>
+<B7FE> <6372>
+<B8A1> <691C>
+<B8A2> <6A29>
+<B8A3> <727D>
+<B8A4> <72AC>
+<B8A5> <732E>
+<B8A6> <7814>
+<B8A7> <786F>
+<B8A8> <7D79>
+<B8A9> <770C>
+<B8AA> <80A9>
+<B8AB> <898B>
+<B8AC> <8B19>
+<B8AD> <8CE2>
+<B8AE> <8ED2>
+<B8AF> <9063>
+<B8B0> <9375>
+<B8B1> <967A>
+<B8B2> <9855>
+<B8B3> <9A13>
+<B8B4> <9E78>
+<B8B5> <5143>
+<B8B6> <539F>
+<B8B7> <53B3>
+<B8B8> <5E7B>
+<B8B9> <5F26>
+<B8BA> <6E1B>
+<B8BB> <6E90>
+<B8BC> <7384>
+<B8BD> <73FE>
+<B8BE> <7D43>
+<B8BF> <8237>
+<B8C0> <8A00>
+<B8C1> <8AFA>
+<B8C2> <9650>
+<B8C3> <4E4E>
+<B8C4> <500B>
+<B8C5> <53E4>
+<B8C6> <547C>
+<B8C7> <56FA>
+<B8C8> <59D1>
+<B8C9> <5B64>
+<B8CA> <5DF1>
+<B8CB> <5EAB>
+<B8CC> <5F27>
+<B8CD> <6238>
+<B8CE> <6545>
+<B8CF> <67AF>
+<B8D0> <6E56>
+<B8D1> <72D0>
+<B8D2> <7CCA>
+<B8D3> <88B4>
+<B8D4> <80A1>
+<B8D5> <80E1>
+<B8D6> <83F0>
+<B8D7> <864E>
+<B8D8> <8A87>
+<B8D9> <8DE8>
+<B8DA> <9237>
+<B8DB> <96C7>
+<B8DC> <9867>
+<B8DD> <9F13>
+<B8DE> <4E94>
+<B8DF> <4E92>
+<B8E0> <4F0D>
+<B8E1> <5348>
+<B8E2> <5449>
+<B8E3> <543E>
+<B8E4> <5A2F>
+<B8E5> <5F8C>
+<B8E6> <5FA1>
+<B8E7> <609F>
+<B8E8> <68A7>
+<B8E9> <6A8E>
+<B8EA> <745A>
+endbfchar
+
+100 beginbfchar
+<B8EB> <7881>
+<B8EC> <8A9E>
+<B8ED> <8AA4>
+<B8EE> <8B77>
+<B8EF> <9190>
+<B8F0> <4E5E>
+<B8F1> <9BC9>
+<B8F2> <4EA4>
+<B8F3> <4F7C>
+<B8F4> <4FAF>
+<B8F5> <5019>
+<B8F6> <5016>
+<B8F7> <5149>
+<B8F8> <516C>
+<B8F9> <529F>
+<B8FA> <52B9>
+<B8FB> <52FE>
+<B8FC> <539A>
+<B8FD> <53E3>
+<B8FE> <5411>
+<B9A1> <540E>
+<B9A2> <5589>
+<B9A3> <5751>
+<B9A4> <57A2>
+<B9A5> <597D>
+<B9A6> <5B54>
+<B9A7> <5B5D>
+<B9A8> <5B8F>
+<B9A9> <5DE5>
+<B9AA> <5DE7>
+<B9AB> <5DF7>
+<B9AC> <5E78>
+<B9AD> <5E83>
+<B9AE> <5E9A>
+<B9AF> <5EB7>
+<B9B0> <5F18>
+<B9B1> <6052>
+<B9B2> <614C>
+<B9B3> <6297>
+<B9B4> <62D8>
+<B9B5> <63A7>
+<B9B6> <653B>
+<B9B7> <6602>
+<B9B8> <6643>
+<B9B9> <66F4>
+<B9BA> <676D>
+<B9BB> <6821>
+<B9BC> <6897>
+<B9BD> <69CB>
+<B9BE> <6C5F>
+<B9BF> <6D2A>
+<B9C0> <6D69>
+<B9C1> <6E2F>
+<B9C2> <6E9D>
+<B9C3> <7532>
+<B9C4> <7687>
+<B9C5> <786C>
+<B9C6> <7A3F>
+<B9C7> <7CE0>
+<B9C8> <7D05>
+<B9C9> <7D18>
+<B9CA> <7D5E>
+<B9CB> <7DB1>
+<B9CC> <8015>
+<B9CD> <8003>
+<B9CE> <80AF>
+<B9CF> <80B1>
+<B9D0> <8154>
+<B9D1> <818F>
+<B9D2> <822A>
+<B9D3> <8352>
+<B9D4> <884C>
+<B9D5> <8861>
+<B9D6> <8B1B>
+<B9D7> <8CA2>
+<B9D8> <8CFC>
+<B9D9> <90CA>
+<B9DA> <9175>
+<B9DB> <9271>
+<B9DC> <783F>
+<B9DD> <92FC>
+<B9DE> <95A4>
+<B9DF> <964D>
+<B9E0> <9805>
+<B9E1> <9999>
+<B9E2> <9AD8>
+<B9E3> <9D3B>
+<B9E4> <525B>
+<B9E5> <52AB>
+<B9E6> <53F7>
+<B9E7> <5408>
+<B9E8> <58D5>
+<B9E9> <62F7>
+<B9EA> <6FE0>
+<B9EB> <8C6A>
+<B9EC> <8F5F>
+<B9ED> <9EB9>
+<B9EE> <514B>
+<B9EF> <523B>
+<B9F0> <544A>
+endbfchar
+
+100 beginbfchar
+<B9F1> <56FD>
+<B9F2> <7A40>
+<B9F3> <9177>
+<B9F4> <9D60>
+<B9F5> <9ED2>
+<B9F6> <7344>
+<B9F7> <6F09>
+<B9F8> <8170>
+<B9F9> <7511>
+<B9FA> <5FFD>
+<B9FB> <60DA>
+<B9FC> <9AA8>
+<B9FD> <72DB>
+<B9FE> <8FBC>
+<BAA1> <6B64>
+<BAA2> <9803>
+<BAA3> <4ECA>
+<BAA4> <56F0>
+<BAA5> <5764>
+<BAA6> <58BE>
+<BAA7> <5A5A>
+<BAA8> <6068>
+<BAA9> <61C7>
+<BAAA> <660F>
+<BAAB> <6606>
+<BAAC> <6839>
+<BAAD> <68B1>
+<BAAE> <6DF7>
+<BAAF> <75D5>
+<BAB0> <7D3A>
+<BAB1> <826E>
+<BAB2> <9B42>
+<BAB3> <4E9B>
+<BAB4> <4F50>
+<BAB5> <53C9>
+<BAB6> <5506>
+<BAB7> <5D6F>
+<BAB8> <5DE6>
+<BAB9> <5DEE>
+<BABA> <67FB>
+<BABB> <6C99>
+<BABC> <7473>
+<BABD> <7802>
+<BABE> <8A50>
+<BABF> <9396>
+<BAC0> <88DF>
+<BAC1> <5750>
+<BAC2> <5EA7>
+<BAC3> <632B>
+<BAC4> <50B5>
+<BAC5> <50AC>
+<BAC6> <518D>
+<BAC7> <6700>
+<BAC8> <54C9>
+<BAC9> <585E>
+<BACA> <59BB>
+<BACB> <5BB0>
+<BACC> <5F69>
+<BACD> <624D>
+<BACE> <63A1>
+<BACF> <683D>
+<BAD0> <6B73>
+<BAD1> <6E08>
+<BAD2> <707D>
+<BAD3> <91C7>
+<BAD4> <7280>
+<BAD5> <7815>
+<BAD6> <7826>
+<BAD7> <796D>
+<BAD8> <658E>
+<BAD9> <7D30>
+<BADA> <83DC>
+<BADB> <88C1>
+<BADC> <8F09>
+<BADD> <969B>
+<BADE> <5264>
+<BADF> <5728>
+<BAE0> <6750>
+<BAE1> <7F6A>
+<BAE2> <8CA1>
+<BAE3> <51B4>
+<BAE4> <5742>
+<BAE5> <962A>
+<BAE6> <583A>
+<BAE7> <698A>
+<BAE8> <80B4>
+<BAE9> <54B2>
+<BAEA> <5D0E>
+<BAEB> <57FC>
+<BAEC> <7895>
+<BAED> <9DFA>
+<BAEE> <4F5C>
+<BAEF> <524A>
+<BAF0> <548B>
+<BAF1> <643E>
+<BAF2> <6628>
+<BAF3> <6714>
+<BAF4> <67F5>
+<BAF5> <7A84>
+<BAF6> <7B56>
+endbfchar
+
+100 beginbfchar
+<BAF7> <7D22>
+<BAF8> <932F>
+<BAF9> <685C>
+<BAFA> <9BAD>
+<BAFB> <7B39>
+<BAFC> <5319>
+<BAFD> <518A>
+<BAFE> <5237>
+<BBA1> <5BDF>
+<BBA2> <62F6>
+<BBA3> <64AE>
+<BBA4> <64E6>
+<BBA5> <672D>
+<BBA6> <6BBA>
+<BBA7> <85A9>
+<BBA8> <96D1>
+<BBA9> <7690>
+<BBAA> <9BD6>
+<BBAB> <634C>
+<BBAC> <9306>
+<BBAD> <9BAB>
+<BBAE> <76BF>
+<BBAF> <6652>
+<BBB0> <4E09>
+<BBB1> <5098>
+<BBB2> <53C2>
+<BBB3> <5C71>
+<BBB4> <60E8>
+<BBB5> <6492>
+<BBB6> <6563>
+<BBB7> <685F>
+<BBB8> <71E6>
+<BBB9> <73CA>
+<BBBA> <7523>
+<BBBB> <7B97>
+<BBBC> <7E82>
+<BBBD> <8695>
+<BBBE> <8B83>
+<BBBF> <8CDB>
+<BBC0> <9178>
+<BBC1> <9910>
+<BBC2> <65AC>
+<BBC3> <66AB>
+<BBC4> <6B8B>
+<BBC5> <4ED5>
+<BBC6> <4ED4>
+<BBC7> <4F3A>
+<BBC8> <4F7F>
+<BBC9> <523A>
+<BBCA> <53F8>
+<BBCB> <53F2>
+<BBCC> <55E3>
+<BBCD> <56DB>
+<BBCE> <58EB>
+<BBCF> <59CB>
+<BBD0> <59C9>
+<BBD1> <59FF>
+<BBD2> <5B50>
+<BBD3> <5C4D>
+<BBD4> <5E02>
+<BBD5> <5E2B>
+<BBD6> <5FD7>
+<BBD7> <601D>
+<BBD8> <6307>
+<BBD9> <652F>
+<BBDA> <5B5C>
+<BBDB> <65AF>
+<BBDC> <65BD>
+<BBDD> <65E8>
+<BBDE> <679D>
+<BBDF> <6B62>
+<BBE0> <6B7B>
+<BBE1> <6C0F>
+<BBE2> <7345>
+<BBE3> <7949>
+<BBE4> <79C1>
+<BBE5> <7CF8>
+<BBE6> <7D19>
+<BBE7> <7D2B>
+<BBE8> <80A2>
+<BBE9> <8102>
+<BBEA> <81F3>
+<BBEB> <8996>
+<BBEC> <8A5E>
+<BBED> <8A69>
+<BBEE> <8A66>
+<BBEF> <8A8C>
+<BBF0> <8AEE>
+<BBF1> <8CC7>
+<BBF2> <8CDC>
+<BBF3> <96CC>
+<BBF4> <98FC>
+<BBF5> <6B6F>
+<BBF6> <4E8B>
+<BBF7> <4F3C>
+<BBF8> <4F8D>
+<BBF9> <5150>
+<BBFA> <5B57>
+<BBFB> <5BFA>
+<BBFC> <6148>
+endbfchar
+
+100 beginbfchar
+<BBFD> <6301>
+<BBFE> <6642>
+<BCA1> <6B21>
+<BCA2> <6ECB>
+<BCA3> <6CBB>
+<BCA4> <723E>
+<BCA5> <74BD>
+<BCA6> <75D4>
+<BCA7> <78C1>
+<BCA8> <793A>
+<BCA9> <800C>
+<BCAA> <8033>
+<BCAB> <81EA>
+<BCAC> <8494>
+<BCAD> <8F9E>
+<BCAE> <6C50>
+<BCAF> <9E7F>
+<BCB0> <5F0F>
+<BCB1> <8B58>
+<BCB2> <9D2B>
+<BCB3> <7AFA>
+<BCB4> <8EF8>
+<BCB5> <5B8D>
+<BCB6> <96EB>
+<BCB7> <4E03>
+<BCB8> <53F1>
+<BCB9> <57F7>
+<BCBA> <5931>
+<BCBB> <5AC9>
+<BCBC> <5BA4>
+<BCBD> <6089>
+<BCBE> <6E7F>
+<BCBF> <6F06>
+<BCC0> <75BE>
+<BCC1> <8CEA>
+<BCC2> <5B9F>
+<BCC3> <8500>
+<BCC4> <7BE0>
+<BCC5> <5072>
+<BCC6> <67F4>
+<BCC7> <829D>
+<BCC8> <5C61>
+<BCC9> <854A>
+<BCCA> <7E1E>
+<BCCB> <820E>
+<BCCC> <5199>
+<BCCD> <5C04>
+<BCCE> <6368>
+<BCCF> <8D66>
+<BCD0> <659C>
+<BCD1> <716E>
+<BCD2> <793E>
+<BCD3> <7D17>
+<BCD4> <8005>
+<BCD5> <8B1D>
+<BCD6> <8ECA>
+<BCD7> <906E>
+<BCD8> <86C7>
+<BCD9> <90AA>
+<BCDA> <501F>
+<BCDB> <52FA>
+<BCDC> <5C3A>
+<BCDD> <6753>
+<BCDE> <707C>
+<BCDF> <7235>
+<BCE0> <914C>
+<BCE1> <91C8>
+<BCE2> <932B>
+<BCE3> <82E5>
+<BCE4> <5BC2>
+<BCE5> <5F31>
+<BCE6> <60F9>
+<BCE7> <4E3B>
+<BCE8> <53D6>
+<BCE9> <5B88>
+<BCEA> <624B>
+<BCEB> <6731>
+<BCEC> <6B8A>
+<BCED> <72E9>
+<BCEE> <73E0>
+<BCEF> <7A2E>
+<BCF0> <816B>
+<BCF1> <8DA3>
+<BCF2> <9152>
+<BCF3> <9996>
+<BCF4> <5112>
+<BCF5> <53D7>
+<BCF6> <546A>
+<BCF7> <5BFF>
+<BCF8> <6388>
+<BCF9> <6A39>
+<BCFA> <7DAC>
+<BCFB> <9700>
+<BCFC> <56DA>
+<BCFD> <53CE>
+<BCFE> <5468>
+<BDA1> <5B97>
+<BDA2> <5C31>
+<BDA3> <5DDE>
+<BDA4> <4FEE>
+endbfchar
+
+100 beginbfchar
+<BDA5> <6101>
+<BDA6> <62FE>
+<BDA7> <6D32>
+<BDA8> <79C0>
+<BDA9> <79CB>
+<BDAA> <7D42>
+<BDAB> <7E4D>
+<BDAC> <7FD2>
+<BDAD> <81ED>
+<BDAE> <821F>
+<BDAF> <8490>
+<BDB0> <8846>
+<BDB1> <8972>
+<BDB2> <8B90>
+<BDB3> <8E74>
+<BDB4> <8F2F>
+<BDB5> <9031>
+<BDB6> <914B>
+<BDB7> <916C>
+<BDB8> <96C6>
+<BDB9> <919C>
+<BDBA> <4EC0>
+<BDBB> <4F4F>
+<BDBC> <5145>
+<BDBD> <5341>
+<BDBE> <5F93>
+<BDBF> <620E>
+<BDC0> <67D4>
+<BDC1> <6C41>
+<BDC2> <6E0B>
+<BDC3> <7363>
+<BDC4> <7E26>
+<BDC5> <91CD>
+<BDC6> <9283>
+<BDC7> <53D4>
+<BDC8> <5919>
+<BDC9> <5BBF>
+<BDCA> <6DD1>
+<BDCB> <795D>
+<BDCC> <7E2E>
+<BDCD> <7C9B>
+<BDCE> <587E>
+<BDCF> <719F>
+<BDD0> <51FA>
+<BDD1> <8853>
+<BDD2> <8FF0>
+<BDD3> <4FCA>
+<BDD4> <5CFB>
+<BDD5> <6625>
+<BDD6> <77AC>
+<BDD7> <7AE3>
+<BDD8> <821C>
+<BDD9> <99FF>
+<BDDA> <51C6>
+<BDDB> <5FAA>
+<BDDC> <65EC>
+<BDDD> <696F>
+<BDDE> <6B89>
+<BDDF> <6DF3>
+<BDE0> <6E96>
+<BDE1> <6F64>
+<BDE2> <76FE>
+<BDE3> <7D14>
+<BDE4> <5DE1>
+<BDE5> <9075>
+<BDE6> <9187>
+<BDE7> <9806>
+<BDE8> <51E6>
+<BDE9> <521D>
+<BDEA> <6240>
+<BDEB> <6691>
+<BDEC> <66D9>
+<BDED> <6E1A>
+<BDEE> <5EB6>
+<BDEF> <7DD2>
+<BDF0> <7F72>
+<BDF1> <66F8>
+<BDF2> <85AF>
+<BDF3> <85F7>
+<BDF4> <8AF8>
+<BDF5> <52A9>
+<BDF6> <53D9>
+<BDF7> <5973>
+<BDF8> <5E8F>
+<BDF9> <5F90>
+<BDFA> <6055>
+<BDFB> <92E4>
+<BDFC> <9664>
+<BDFD> <50B7>
+<BDFE> <511F>
+<BEA1> <52DD>
+<BEA2> <5320>
+<BEA3> <5347>
+<BEA4> <53EC>
+<BEA5> <54E8>
+<BEA6> <5546>
+<BEA7> <5531>
+<BEA8> <5617>
+<BEA9> <5968>
+<BEAA> <59BE>
+endbfchar
+
+100 beginbfchar
+<BEAB> <5A3C>
+<BEAC> <5BB5>
+<BEAD> <5C06>
+<BEAE> <5C0F>
+<BEAF> <5C11>
+<BEB0> <5C1A>
+<BEB1> <5E84>
+<BEB2> <5E8A>
+<BEB3> <5EE0>
+<BEB4> <5F70>
+<BEB5> <627F>
+<BEB6> <6284>
+<BEB7> <62DB>
+<BEB8> <638C>
+<BEB9> <6377>
+<BEBA> <6607>
+<BEBB> <660C>
+<BEBC> <662D>
+<BEBD> <6676>
+<BEBE> <677E>
+<BEBF> <68A2>
+<BEC0> <6A1F>
+<BEC1> <6A35>
+<BEC2> <6CBC>
+<BEC3> <6D88>
+<BEC4> <6E09>
+<BEC5> <6E58>
+<BEC6> <713C>
+<BEC7> <7126>
+<BEC8> <7167>
+<BEC9> <75C7>
+<BECA> <7701>
+<BECB> <785D>
+<BECC> <7901>
+<BECD> <7965>
+<BECE> <79F0>
+<BECF> <7AE0>
+<BED0> <7B11>
+<BED1> <7CA7>
+<BED2> <7D39>
+<BED3> <8096>
+<BED4> <83D6>
+<BED5> <848B>
+<BED6> <8549>
+<BED7> <885D>
+<BED8> <88F3>
+<BED9> <8A1F>
+<BEDA> <8A3C>
+<BEDB> <8A54>
+<BEDC> <8A73>
+<BEDD> <8C61>
+<BEDE> <8CDE>
+<BEDF> <91A4>
+<BEE0> <9266>
+<BEE1> <937E>
+<BEE2> <9418>
+<BEE3> <969C>
+<BEE4> <9798>
+<BEE5> <4E0A>
+<BEE6> <4E08>
+<BEE7> <4E1E>
+<BEE8> <4E57>
+<BEE9> <5197>
+<BEEA> <5270>
+<BEEB> <57CE>
+<BEEC> <5834>
+<BEED> <58CC>
+<BEEE> <5B22>
+<BEEF> <5E38>
+<BEF0> <60C5>
+<BEF1> <64FE>
+<BEF2> <6761>
+<BEF3> <6756>
+<BEF4> <6D44>
+<BEF5> <72B6>
+<BEF6> <7573>
+<BEF7> <7A63>
+<BEF8> <84B8>
+<BEF9> <8B72>
+<BEFA> <91B8>
+<BEFB> <9320>
+<BEFC> <5631>
+<BEFD> <57F4>
+<BEFE> <98FE>
+<BFA1> <62ED>
+<BFA2> <690D>
+<BFA3> <6B96>
+<BFA4> <71ED>
+<BFA5> <7E54>
+<BFA6> <8077>
+<BFA7> <8272>
+<BFA8> <89E6>
+<BFA9> <98DF>
+<BFAA> <8755>
+<BFAB> <8FB1>
+<BFAC> <5C3B>
+<BFAD> <4F38>
+<BFAE> <4FE1>
+<BFAF> <4FB5>
+<BFB0> <5507>
+endbfchar
+
+100 beginbfchar
+<BFB1> <5A20>
+<BFB2> <5BDD>
+<BFB3> <5BE9>
+<BFB4> <5FC3>
+<BFB5> <614E>
+<BFB6> <632F>
+<BFB7> <65B0>
+<BFB8> <664B>
+<BFB9> <68EE>
+<BFBA> <699B>
+<BFBB> <6D78>
+<BFBC> <6DF1>
+<BFBD> <7533>
+<BFBE> <75B9>
+<BFBF> <771F>
+<BFC0> <795E>
+<BFC1> <79E6>
+<BFC2> <7D33>
+<BFC3> <81E3>
+<BFC4> <82AF>
+<BFC5> <85AA>
+<BFC6> <89AA>
+<BFC7> <8A3A>
+<BFC8> <8EAB>
+<BFC9> <8F9B>
+<BFCA> <9032>
+<BFCB> <91DD>
+<BFCC> <9707>
+<BFCD> <4EBA>
+<BFCE> <4EC1>
+<BFCF> <5203>
+<BFD0> <5875>
+<BFD1> <58EC>
+<BFD2> <5C0B>
+<BFD3> <751A>
+<BFD4> <5C3D>
+<BFD5> <814E>
+<BFD6> <8A0A>
+<BFD7> <8FC5>
+<BFD8> <9663>
+<BFD9> <976D>
+<BFDA> <7B25>
+<BFDB> <8ACF>
+<BFDC> <9808>
+<BFDD> <9162>
+<BFDE> <56F3>
+<BFDF> <53A8>
+<BFE0> <9017>
+<BFE1> <5439>
+<BFE2> <5782>
+<BFE3> <5E25>
+<BFE4> <63A8>
+<BFE5> <6C34>
+<BFE6> <708A>
+<BFE7> <7761>
+<BFE8> <7C8B>
+<BFE9> <7FE0>
+<BFEA> <8870>
+<BFEB> <9042>
+<BFEC> <9154>
+<BFED> <9310>
+<BFEE> <9318>
+<BFEF> <968F>
+<BFF0> <745E>
+<BFF1> <9AC4>
+<BFF2> <5D07>
+<BFF3> <5D69>
+<BFF4> <6570>
+<BFF5> <67A2>
+<BFF6> <8DA8>
+<BFF7> <96DB>
+<BFF8> <636E>
+<BFF9> <6749>
+<BFFA> <6919>
+<BFFB> <83C5>
+<BFFC> <9817>
+<BFFD> <96C0>
+<BFFE> <88FE>
+<C0A1> <6F84>
+<C0A2> <647A>
+<C0A3> <5BF8>
+<C0A4> <4E16>
+<C0A5> <702C>
+<C0A6> <755D>
+<C0A7> <662F>
+<C0A8> <51C4>
+<C0A9> <5236>
+<C0AA> <52E2>
+<C0AB> <59D3>
+<C0AC> <5F81>
+<C0AD> <6027>
+<C0AE> <6210>
+<C0AF> <653F>
+<C0B0> <6574>
+<C0B1> <661F>
+<C0B2> <6674>
+<C0B3> <68F2>
+<C0B4> <6816>
+<C0B5> <6B63>
+<C0B6> <6E05>
+endbfchar
+
+100 beginbfchar
+<C0B7> <7272>
+<C0B8> <751F>
+<C0B9> <76DB>
+<C0BA> <7CBE>
+<C0BB> <8056>
+<C0BC> <58F0>
+<C0BD> <88FD>
+<C0BE> <897F>
+<C0BF> <8AA0>
+<C0C0> <8A93>
+<C0C1> <8ACB>
+<C0C2> <901D>
+<C0C3> <9192>
+<C0C4> <9752>
+<C0C5> <9759>
+<C0C6> <6589>
+<C0C7> <7A0E>
+<C0C8> <8106>
+<C0C9> <96BB>
+<C0CA> <5E2D>
+<C0CB> <60DC>
+<C0CC> <621A>
+<C0CD> <65A5>
+<C0CE> <6614>
+<C0CF> <6790>
+<C0D0> <77F3>
+<C0D1> <7A4D>
+<C0D2> <7C4D>
+<C0D3> <7E3E>
+<C0D4> <810A>
+<C0D5> <8CAC>
+<C0D6> <8D64>
+<C0D7> <8DE1>
+<C0D8> <8E5F>
+<C0D9> <78A9>
+<C0DA> <5207>
+<C0DB> <62D9>
+<C0DC> <63A5>
+<C0DD> <6442>
+<C0DE> <6298>
+<C0DF> <8A2D>
+<C0E0> <7A83>
+<C0E1> <7BC0>
+<C0E2> <8AAC>
+<C0E3> <96EA>
+<C0E4> <7D76>
+<C0E5> <820C>
+<C0E6> <8749>
+<C0E7> <4ED9>
+<C0E8> <5148>
+<C0E9> <5343>
+<C0EA> <5360>
+<C0EB> <5BA3>
+<C0EC> <5C02>
+<C0ED> <5C16>
+<C0EE> <5DDD>
+<C0EF> <6226>
+<C0F0> <6247>
+<C0F1> <64B0>
+<C0F2> <6813>
+<C0F3> <6834>
+<C0F4> <6CC9>
+<C0F5> <6D45>
+<C0F6> <6D17>
+<C0F7> <67D3>
+<C0F8> <6F5C>
+<C0F9> <714E>
+<C0FA> <717D>
+<C0FB> <65CB>
+<C0FC> <7A7F>
+<C0FD> <7BAD>
+<C0FE> <7DDA>
+<C1A1> <7E4A>
+<C1A2> <7FA8>
+<C1A3> <817A>
+<C1A4> <821B>
+<C1A5> <8239>
+<C1A6> <85A6>
+<C1A7> <8A6E>
+<C1A8> <8CCE>
+<C1A9> <8DF5>
+<C1AA> <9078>
+<C1AB> <9077>
+<C1AC> <92AD>
+<C1AD> <9291>
+<C1AE> <9583>
+<C1AF> <9BAE>
+<C1B0> <524D>
+<C1B1> <5584>
+<C1B2> <6F38>
+<C1B3> <7136>
+<C1B4> <5168>
+<C1B5> <7985>
+<C1B6> <7E55>
+<C1B7> <81B3>
+<C1B8> <7CCE>
+<C1B9> <564C>
+<C1BA> <5851>
+<C1BB> <5CA8>
+<C1BC> <63AA>
+endbfchar
+
+100 beginbfchar
+<C1BD> <66FE>
+<C1BE> <66FD>
+<C1BF> <695A>
+<C1C0> <72D9>
+<C1C1> <758F>
+<C1C2> <758E>
+<C1C3> <790E>
+<C1C4> <7956>
+<C1C5> <79DF>
+<C1C6> <7C97>
+<C1C7> <7D20>
+<C1C8> <7D44>
+<C1C9> <8607>
+<C1CA> <8A34>
+<C1CB> <963B>
+<C1CC> <9061>
+<C1CD> <9F20>
+<C1CE> <50E7>
+<C1CF> <5275>
+<C1D0> <53CC>
+<C1D1> <53E2>
+<C1D2> <5009>
+<C1D3> <55AA>
+<C1D4> <58EE>
+<C1D5> <594F>
+<C1D6> <723D>
+<C1D7> <5B8B>
+<C1D8> <5C64>
+<C1D9> <531D>
+<C1DA> <60E3>
+<C1DB> <60F3>
+<C1DC> <635C>
+<C1DD> <6383>
+<C1DE> <633F>
+<C1DF> <63BB>
+<C1E0> <64CD>
+<C1E1> <65E9>
+<C1E2> <66F9>
+<C1E3> <5DE3>
+<C1E4> <69CD>
+<C1E5> <69FD>
+<C1E6> <6F15>
+<C1E7> <71E5>
+<C1E8> <4E89>
+<C1E9> <75E9>
+<C1EA> <76F8>
+<C1EB> <7A93>
+<C1EC> <7CDF>
+<C1ED> <7DCF>
+<C1EE> <7D9C>
+<C1EF> <8061>
+<C1F0> <8349>
+<C1F1> <8358>
+<C1F2> <846C>
+<C1F3> <84BC>
+<C1F4> <85FB>
+<C1F5> <88C5>
+<C1F6> <8D70>
+<C1F7> <9001>
+<C1F8> <906D>
+<C1F9> <9397>
+<C1FA> <971C>
+<C1FB> <9A12>
+<C1FC> <50CF>
+<C1FD> <5897>
+<C1FE> <618E>
+<C2A1> <81D3>
+<C2A2> <8535>
+<C2A3> <8D08>
+<C2A4> <9020>
+<C2A5> <4FC3>
+<C2A6> <5074>
+<C2A7> <5247>
+<C2A8> <5373>
+<C2A9> <606F>
+<C2AA> <6349>
+<C2AB> <675F>
+<C2AC> <6E2C>
+<C2AD> <8DB3>
+<C2AE> <901F>
+<C2AF> <4FD7>
+<C2B0> <5C5E>
+<C2B1> <8CCA>
+<C2B2> <65CF>
+<C2B3> <7D9A>
+<C2B4> <5352>
+<C2B5> <8896>
+<C2B6> <5176>
+<C2B7> <63C3>
+<C2B8> <5B58>
+<C2B9> <5B6B>
+<C2BA> <5C0A>
+<C2BB> <640D>
+<C2BC> <6751>
+<C2BD> <905C>
+<C2BE> <4ED6>
+<C2BF> <591A>
+<C2C0> <592A>
+<C2C1> <6C70>
+<C2C2> <8A51>
+endbfchar
+
+100 beginbfchar
+<C2C3> <553E>
+<C2C4> <5815>
+<C2C5> <59A5>
+<C2C6> <60F0>
+<C2C7> <6253>
+<C2C8> <67C1>
+<C2C9> <8235>
+<C2CA> <6955>
+<C2CB> <9640>
+<C2CC> <99C4>
+<C2CD> <9A28>
+<C2CE> <4F53>
+<C2CF> <5806>
+<C2D0> <5BFE>
+<C2D1> <8010>
+<C2D2> <5CB1>
+<C2D3> <5E2F>
+<C2D4> <5F85>
+<C2D5> <6020>
+<C2D6> <614B>
+<C2D7> <6234>
+<C2D8> <66FF>
+<C2D9> <6CF0>
+<C2DA> <6EDE>
+<C2DB> <80CE>
+<C2DC> <817F>
+<C2DD> <82D4>
+<C2DE> <888B>
+<C2DF> <8CB8>
+<C2E0> <9000>
+<C2E1> <902E>
+<C2E2> <968A>
+<C2E3> <9EDB>
+<C2E4> <9BDB>
+<C2E5> <4EE3>
+<C2E6> <53F0>
+<C2E7> <5927>
+<C2E8> <7B2C>
+<C2E9> <918D>
+<C2EA> <984C>
+<C2EB> <9DF9>
+<C2EC> <6EDD>
+<C2ED> <7027>
+<C2EE> <5353>
+<C2EF> <5544>
+<C2F0> <5B85>
+<C2F1> <6258>
+<C2F2> <629E>
+<C2F3> <62D3>
+<C2F4> <6CA2>
+<C2F5> <6FEF>
+<C2F6> <7422>
+<C2F7> <8A17>
+<C2F8> <9438>
+<C2F9> <6FC1>
+<C2FA> <8AFE>
+<C2FB> <8338>
+<C2FC> <51E7>
+<C2FD> <86F8>
+<C2FE> <53EA>
+<C3A1> <53E9>
+<C3A2> <4F46>
+<C3A3> <9054>
+<C3A4> <8FB0>
+<C3A5> <596A>
+<C3A6> <8131>
+<C3A7> <5DFD>
+<C3A8> <7AEA>
+<C3A9> <8FBF>
+<C3AA> <68DA>
+<C3AB> <8C37>
+<C3AC> <72F8>
+<C3AD> <9C48>
+<C3AE> <6A3D>
+<C3AF> <8AB0>
+<C3B0> <4E39>
+<C3B1> <5358>
+<C3B2> <5606>
+<C3B3> <5766>
+<C3B4> <62C5>
+<C3B5> <63A2>
+<C3B6> <65E6>
+<C3B7> <6B4E>
+<C3B8> <6DE1>
+<C3B9> <6E5B>
+<C3BA> <70AD>
+<C3BB> <77ED>
+<C3BC> <7AEF>
+<C3BD> <7BAA>
+<C3BE> <7DBB>
+<C3BF> <803D>
+<C3C0> <80C6>
+<C3C1> <86CB>
+<C3C2> <8A95>
+<C3C3> <935B>
+<C3C4> <56E3>
+<C3C5> <58C7>
+<C3C6> <5F3E>
+<C3C7> <65AD>
+<C3C8> <6696>
+endbfchar
+
+100 beginbfchar
+<C3C9> <6A80>
+<C3CA> <6BB5>
+<C3CB> <7537>
+<C3CC> <8AC7>
+<C3CD> <5024>
+<C3CE> <77E5>
+<C3CF> <5730>
+<C3D0> <5F1B>
+<C3D1> <6065>
+<C3D2> <667A>
+<C3D3> <6C60>
+<C3D4> <75F4>
+<C3D5> <7A1A>
+<C3D6> <7F6E>
+<C3D7> <81F4>
+<C3D8> <8718>
+<C3D9> <9045>
+<C3DA> <99B3>
+<C3DB> <7BC9>
+<C3DC> <755C>
+<C3DD> <7AF9>
+<C3DE> <7B51>
+<C3DF> <84C4>
+<C3E0> <9010>
+<C3E1> <79E9>
+<C3E2> <7A92>
+<C3E3> <8336>
+<C3E4> <5AE1>
+<C3E5> <7740>
+<C3E6> <4E2D>
+<C3E7> <4EF2>
+<C3E8> <5B99>
+<C3E9> <5FE0>
+<C3EA> <62BD>
+<C3EB> <663C>
+<C3EC> <67F1>
+<C3ED> <6CE8>
+<C3EE> <866B>
+<C3EF> <8877>
+<C3F0> <8A3B>
+<C3F1> <914E>
+<C3F2> <92F3>
+<C3F3> <99D0>
+<C3F4> <6A17>
+<C3F5> <7026>
+<C3F6> <732A>
+<C3F7> <82E7>
+<C3F8> <8457>
+<C3F9> <8CAF>
+<C3FA> <4E01>
+<C3FB> <5146>
+<C3FC> <51CB>
+<C3FD> <558B>
+<C3FE> <5BF5>
+<C4A1> <5E16>
+<C4A2> <5E33>
+<C4A3> <5E81>
+<C4A4> <5F14>
+<C4A5> <5F35>
+<C4A6> <5F6B>
+<C4A7> <5FB4>
+<C4A8> <61F2>
+<C4A9> <6311>
+<C4AA> <66A2>
+<C4AB> <671D>
+<C4AC> <6F6E>
+<C4AD> <7252>
+<C4AE> <753A>
+<C4AF> <773A>
+<C4B0> <8074>
+<C4B1> <8139>
+<C4B2> <8178>
+<C4B3> <8776>
+<C4B4> <8ABF>
+<C4B5> <8ADC>
+<C4B6> <8D85>
+<C4B7> <8DF3>
+<C4B8> <929A>
+<C4B9> <9577>
+<C4BA> <9802>
+<C4BB> <9CE5>
+<C4BC> <52C5>
+<C4BD> <6357>
+<C4BE> <76F4>
+<C4BF> <6715>
+<C4C0> <6C88>
+<C4C1> <73CD>
+<C4C2> <8CC3>
+<C4C3> <93AE>
+<C4C4> <9673>
+<C4C5> <6D25>
+<C4C6> <589C>
+<C4C7> <690E>
+<C4C8> <69CC>
+<C4C9> <8FFD>
+<C4CA> <939A>
+<C4CB> <75DB>
+<C4CC> <901A>
+<C4CD> <585A>
+<C4CE> <6802>
+endbfchar
+
+100 beginbfchar
+<C4CF> <63B4>
+<C4D0> <69FB>
+<C4D1> <4F43>
+<C4D2> <6F2C>
+<C4D3> <67D8>
+<C4D4> <8FBB>
+<C4D5> <8526>
+<C4D6> <7DB4>
+<C4D7> <9354>
+<C4D8> <693F>
+<C4D9> <6F70>
+<C4DA> <576A>
+<C4DB> <58F7>
+<C4DC> <5B2C>
+<C4DD> <7D2C>
+<C4DE> <722A>
+<C4DF> <540A>
+<C4E0> <91E3>
+<C4E1> <9DB4>
+<C4E2> <4EAD>
+<C4E3> <4F4E>
+<C4E4> <505C>
+<C4E5> <5075>
+<C4E6> <5243>
+<C4E7> <8C9E>
+<C4E8> <5448>
+<C4E9> <5824>
+<C4EA> <5B9A>
+<C4EB> <5E1D>
+<C4EC> <5E95>
+<C4ED> <5EAD>
+<C4EE> <5EF7>
+<C4EF> <5F1F>
+<C4F0> <608C>
+<C4F1> <62B5>
+<C4F2> <633A>
+<C4F3> <63D0>
+<C4F4> <68AF>
+<C4F5> <6C40>
+<C4F6> <7887>
+<C4F7> <798E>
+<C4F8> <7A0B>
+<C4F9> <7DE0>
+<C4FA> <8247>
+<C4FB> <8A02>
+<C4FC> <8AE6>
+<C4FD> <8E44>
+<C4FE> <9013>
+<C5A1> <90B8>
+<C5A2> <912D>
+<C5A3> <91D8>
+<C5A4> <9F0E>
+<C5A5> <6CE5>
+<C5A6> <6458>
+<C5A7> <64E2>
+<C5A8> <6575>
+<C5A9> <6EF4>
+<C5AA> <7684>
+<C5AB> <7B1B>
+<C5AC> <9069>
+<C5AD> <93D1>
+<C5AE> <6EBA>
+<C5AF> <54F2>
+<C5B0> <5FB9>
+<C5B1> <64A4>
+<C5B2> <8F4D>
+<C5B3> <8FED>
+<C5B4> <9244>
+<C5B5> <5178>
+<C5B6> <586B>
+<C5B7> <5929>
+<C5B8> <5C55>
+<C5B9> <5E97>
+<C5BA> <6DFB>
+<C5BB> <7E8F>
+<C5BC> <751C>
+<C5BD> <8CBC>
+<C5BE> <8EE2>
+<C5BF> <985B>
+<C5C0> <70B9>
+<C5C1> <4F1D>
+<C5C2> <6BBF>
+<C5C3> <6FB1>
+<C5C4> <7530>
+<C5C5> <96FB>
+<C5C6> <514E>
+<C5C7> <5410>
+<C5C8> <5835>
+<C5C9> <5857>
+<C5CA> <59AC>
+<C5CB> <5C60>
+<C5CC> <5F92>
+<C5CD> <6597>
+<C5CE> <675C>
+<C5CF> <6E21>
+<C5D0> <767B>
+<C5D1> <83DF>
+<C5D2> <8CED>
+<C5D3> <9014>
+<C5D4> <90FD>
+endbfchar
+
+100 beginbfchar
+<C5D5> <934D>
+<C5D6> <7825>
+<C5D7> <783A>
+<C5D8> <52AA>
+<C5D9> <5EA6>
+<C5DA> <571F>
+<C5DB> <5974>
+<C5DC> <6012>
+<C5DD> <5012>
+<C5DE> <515A>
+<C5DF> <51AC>
+<C5E0> <51CD>
+<C5E1> <5200>
+<C5E2> <5510>
+<C5E3> <5854>
+<C5E4> <5858>
+<C5E5> <5957>
+<C5E6> <5B95>
+<C5E7> <5CF6>
+<C5E8> <5D8B>
+<C5E9> <60BC>
+<C5EA> <6295>
+<C5EB> <642D>
+<C5EC> <6771>
+<C5ED> <6843>
+<C5EE> <68BC>
+<C5EF> <68DF>
+<C5F0> <76D7>
+<C5F1> <6DD8>
+<C5F2> <6E6F>
+<C5F3> <6D9B>
+<C5F4> <706F>
+<C5F5> <71C8>
+<C5F6> <5F53>
+<C5F7> <75D8>
+<C5F8> <7977>
+<C5F9> <7B49>
+<C5FA> <7B54>
+<C5FB> <7B52>
+<C5FC> <7CD6>
+<C5FD> <7D71>
+<C5FE> <5230>
+<C6A1> <8463>
+<C6A2> <8569>
+<C6A3> <85E4>
+<C6A4> <8A0E>
+<C6A5> <8B04>
+<C6A6> <8C46>
+<C6A7> <8E0F>
+<C6A8> <9003>
+<C6A9> <900F>
+<C6AA> <9419>
+<C6AB> <9676>
+<C6AC> <982D>
+<C6AD> <9A30>
+<C6AE> <95D8>
+<C6AF> <50CD>
+<C6B0> <52D5>
+<C6B1> <540C>
+<C6B2> <5802>
+<C6B3> <5C0E>
+<C6B4> <61A7>
+<C6B5> <649E>
+<C6B6> <6D1E>
+<C6B7> <77B3>
+<C6B8> <7AE5>
+<C6B9> <80F4>
+<C6BA> <8404>
+<C6BB> <9053>
+<C6BC> <9285>
+<C6BD> <5CE0>
+<C6BE> <9D07>
+<C6BF> <533F>
+<C6C0> <5F97>
+<C6C1> <5FB3>
+<C6C2> <6D9C>
+<C6C3> <7279>
+<C6C4> <7763>
+<C6C5> <79BF>
+<C6C6> <7BE4>
+<C6C7> <6BD2>
+<C6C8> <72EC>
+<C6C9> <8AAD>
+<C6CA> <6803>
+<C6CB> <6A61>
+<C6CC> <51F8>
+<C6CD> <7A81>
+<C6CE> <6934>
+<C6CF> <5C4A>
+<C6D0> <9CF6>
+<C6D1> <82EB>
+<C6D2> <5BC5>
+<C6D3> <9149>
+<C6D4> <701E>
+<C6D5> <5678>
+<C6D6> <5C6F>
+<C6D7> <60C7>
+<C6D8> <6566>
+<C6D9> <6C8C>
+<C6DA> <8C5A>
+endbfchar
+
+100 beginbfchar
+<C6DB> <9041>
+<C6DC> <9813>
+<C6DD> <5451>
+<C6DE> <66C7>
+<C6DF> <920D>
+<C6E0> <5948>
+<C6E1> <90A3>
+<C6E2> <5185>
+<C6E3> <4E4D>
+<C6E4> <51EA>
+<C6E5> <8599>
+<C6E6> <8B0E>
+<C6E7> <7058>
+<C6E8> <637A>
+<C6E9> <934B>
+<C6EA> <6962>
+<C6EB> <99B4>
+<C6EC> <7E04>
+<C6ED> <7577>
+<C6EE> <5357>
+<C6EF> <6960>
+<C6F0> <8EDF>
+<C6F1> <96E3>
+<C6F2> <6C5D>
+<C6F3> <4E8C>
+<C6F4> <5C3C>
+<C6F5> <5F10>
+<C6F6> <8FE9>
+<C6F7> <5302>
+<C6F8> <8CD1>
+<C6F9> <8089>
+<C6FA> <8679>
+<C6FB> <5EFF>
+<C6FC> <65E5>
+<C6FD> <4E73>
+<C6FE> <5165>
+<C7A1> <5982>
+<C7A2> <5C3F>
+<C7A3> <97EE>
+<C7A4> <4EFB>
+<C7A5> <598A>
+<C7A6> <5FCD>
+<C7A7> <8A8D>
+<C7A8> <6FE1>
+<C7A9> <79B0>
+<C7AA> <7962>
+<C7AB> <5BE7>
+<C7AC> <8471>
+<C7AD> <732B>
+<C7AE> <71B1>
+<C7AF> <5E74>
+<C7B0> <5FF5>
+<C7B1> <637B>
+<C7B2> <649A>
+<C7B3> <71C3>
+<C7B4> <7C98>
+<C7B5> <4E43>
+<C7B6> <5EFC>
+<C7B7> <4E4B>
+<C7B8> <57DC>
+<C7B9> <56A2>
+<C7BA> <60A9>
+<C7BB> <6FC3>
+<C7BC> <7D0D>
+<C7BD> <80FD>
+<C7BE> <8133>
+<C7BF> <81BF>
+<C7C0> <8FB2>
+<C7C1> <8997>
+<C7C2> <86A4>
+<C7C3> <5DF4>
+<C7C4> <628A>
+<C7C5> <64AD>
+<C7C6> <8987>
+<C7C7> <6777>
+<C7C8> <6CE2>
+<C7C9> <6D3E>
+<C7CA> <7436>
+<C7CB> <7834>
+<C7CC> <5A46>
+<C7CD> <7F75>
+<C7CE> <82AD>
+<C7CF> <99AC>
+<C7D0> <4FF3>
+<C7D1> <5EC3>
+<C7D2> <62DD>
+<C7D3> <6392>
+<C7D4> <6557>
+<C7D5> <676F>
+<C7D6> <76C3>
+<C7D7> <724C>
+<C7D8> <80CC>
+<C7D9> <80BA>
+<C7DA> <8F29>
+<C7DB> <914D>
+<C7DC> <500D>
+<C7DD> <57F9>
+<C7DE> <5A92>
+<C7DF> <6885>
+<C7E0> <6973>
+endbfchar
+
+100 beginbfchar
+<C7E1> <7164>
+<C7E2> <72FD>
+<C7E3> <8CB7>
+<C7E4> <58F2>
+<C7E5> <8CE0>
+<C7E6> <966A>
+<C7E7> <9019>
+<C7E8> <877F>
+<C7E9> <79E4>
+<C7EA> <77E7>
+<C7EB> <8429>
+<C7EC> <4F2F>
+<C7ED> <5265>
+<C7EE> <535A>
+<C7EF> <62CD>
+<C7F0> <67CF>
+<C7F1> <6CCA>
+<C7F2> <767D>
+<C7F3> <7B94>
+<C7F4> <7C95>
+<C7F5> <8236>
+<C7F6> <8584>
+<C7F7> <8FEB>
+<C7F8> <66DD>
+<C7F9> <6F20>
+<C7FA> <7206>
+<C7FB> <7E1B>
+<C7FC> <83AB>
+<C7FD> <99C1>
+<C7FE> <9EA6>
+<C8A1> <51FD>
+<C8A2> <7BB1>
+<C8A3> <7872>
+<C8A4> <7BB8>
+<C8A5> <8087>
+<C8A6> <7B48>
+<C8A7> <6AE8>
+<C8A8> <5E61>
+<C8A9> <808C>
+<C8AA> <7551>
+<C8AB> <7560>
+<C8AC> <516B>
+<C8AD> <9262>
+<C8AE> <6E8C>
+<C8AF> <767A>
+<C8B0> <9197>
+<C8B1> <9AEA>
+<C8B2> <4F10>
+<C8B3> <7F70>
+<C8B4> <629C>
+<C8B5> <7B4F>
+<C8B6> <95A5>
+<C8B7> <9CE9>
+<C8B8> <567A>
+<C8B9> <5859>
+<C8BA> <86E4>
+<C8BB> <96BC>
+<C8BC> <4F34>
+<C8BD> <5224>
+<C8BE> <534A>
+<C8BF> <53CD>
+<C8C0> <53DB>
+<C8C1> <5E06>
+<C8C2> <642C>
+<C8C3> <6591>
+<C8C4> <677F>
+<C8C5> <6C3E>
+<C8C6> <6C4E>
+<C8C7> <7248>
+<C8C8> <72AF>
+<C8C9> <73ED>
+<C8CA> <7554>
+<C8CB> <7E41>
+<C8CC> <822C>
+<C8CD> <85E9>
+<C8CE> <8CA9>
+<C8CF> <7BC4>
+<C8D0> <91C6>
+<C8D1> <7169>
+<C8D2> <9812>
+<C8D3> <98EF>
+<C8D4> <633D>
+<C8D5> <6669>
+<C8D6> <756A>
+<C8D7> <76E4>
+<C8D8> <78D0>
+<C8D9> <8543>
+<C8DA> <86EE>
+<C8DB> <532A>
+<C8DC> <5351>
+<C8DD> <5426>
+<C8DE> <5983>
+<C8DF> <5E87>
+<C8E0> <5F7C>
+<C8E1> <60B2>
+<C8E2> <6249>
+<C8E3> <6279>
+<C8E4> <62AB>
+<C8E5> <6590>
+<C8E6> <6BD4>
+endbfchar
+
+100 beginbfchar
+<C8E7> <6CCC>
+<C8E8> <75B2>
+<C8E9> <76AE>
+<C8EA> <7891>
+<C8EB> <79D8>
+<C8EC> <7DCB>
+<C8ED> <7F77>
+<C8EE> <80A5>
+<C8EF> <88AB>
+<C8F0> <8AB9>
+<C8F1> <8CBB>
+<C8F2> <907F>
+<C8F3> <975E>
+<C8F4> <98DB>
+<C8F5> <6A0B>
+<C8F6> <7C38>
+<C8F7> <5099>
+<C8F8> <5C3E>
+<C8F9> <5FAE>
+<C8FA> <6787>
+<C8FB> <6BD8>
+<C8FC> <7435>
+<C8FD> <7709>
+<C8FE> <7F8E>
+<C9A1> <9F3B>
+<C9A2> <67CA>
+<C9A3> <7A17>
+<C9A4> <5339>
+<C9A5> <758B>
+<C9A6> <9AED>
+<C9A7> <5F66>
+<C9A8> <819D>
+<C9A9> <83F1>
+<C9AA> <8098>
+<C9AB> <5F3C>
+<C9AC> <5FC5>
+<C9AD> <7562>
+<C9AE> <7B46>
+<C9AF> <903C>
+<C9B0> <6867>
+<C9B1> <59EB>
+<C9B2> <5A9B>
+<C9B3> <7D10>
+<C9B4> <767E>
+<C9B5> <8B2C>
+<C9B6> <4FF5>
+<C9B7> <5F6A>
+<C9B8> <6A19>
+<C9B9> <6C37>
+<C9BA> <6F02>
+<C9BB> <74E2>
+<C9BC> <7968>
+<C9BD> <8868>
+<C9BE> <8A55>
+<C9BF> <8C79>
+<C9C0> <5EDF>
+<C9C1> <63CF>
+<C9C2> <75C5>
+<C9C3> <79D2>
+<C9C4> <82D7>
+<C9C5> <9328>
+<C9C6> <92F2>
+<C9C7> <849C>
+<C9C8> <86ED>
+<C9C9> <9C2D>
+<C9CA> <54C1>
+<C9CB> <5F6C>
+<C9CC> <658C>
+<C9CD> <6D5C>
+<C9CE> <7015>
+<C9CF> <8CA7>
+<C9D0> <8CD3>
+<C9D1> <983B>
+<C9D2> <654F>
+<C9D3> <74F6>
+<C9D4> <4E0D>
+<C9D5> <4ED8>
+<C9D6> <57E0>
+<C9D7> <592B>
+<C9D8> <5A66>
+<C9D9> <5BCC>
+<C9DA> <51A8>
+<C9DB> <5E03>
+<C9DC> <5E9C>
+<C9DD> <6016>
+<C9DE> <6276>
+<C9DF> <6577>
+<C9E0> <65A7>
+<C9E1> <666E>
+<C9E2> <6D6E>
+<C9E3> <7236>
+<C9E4> <7B26>
+<C9E5> <8150>
+<C9E6> <819A>
+<C9E7> <8299>
+<C9E8> <8B5C>
+<C9E9> <8CA0>
+<C9EA> <8CE6>
+<C9EB> <8D74>
+<C9EC> <961C>
+endbfchar
+
+100 beginbfchar
+<C9ED> <9644>
+<C9EE> <4FAE>
+<C9EF> <64AB>
+<C9F0> <6B66>
+<C9F1> <821E>
+<C9F2> <8461>
+<C9F3> <856A>
+<C9F4> <90E8>
+<C9F5> <5C01>
+<C9F6> <6953>
+<C9F7> <98A8>
+<C9F8> <847A>
+<C9F9> <8557>
+<C9FA> <4F0F>
+<C9FB> <526F>
+<C9FC> <5FA9>
+<C9FD> <5E45>
+<C9FE> <670D>
+<CAA1> <798F>
+<CAA2> <8179>
+<CAA3> <8907>
+<CAA4> <8986>
+<CAA5> <6DF5>
+<CAA6> <5F17>
+<CAA7> <6255>
+<CAA8> <6CB8>
+<CAA9> <4ECF>
+<CAAA> <7269>
+<CAAB> <9B92>
+<CAAC> <5206>
+<CAAD> <543B>
+<CAAE> <5674>
+<CAAF> <58B3>
+<CAB0> <61A4>
+<CAB1> <626E>
+<CAB2> <711A>
+<CAB3> <596E>
+<CAB4> <7C89>
+<CAB5> <7CDE>
+<CAB6> <7D1B>
+<CAB7> <96F0>
+<CAB8> <6587>
+<CAB9> <805E>
+<CABA> <4E19>
+<CABB> <4F75>
+<CABC> <5175>
+<CABD> <5840>
+<CABE> <5E63>
+<CABF> <5E73>
+<CAC0> <5F0A>
+<CAC1> <67C4>
+<CAC2> <4E26>
+<CAC3> <853D>
+<CAC4> <9589>
+<CAC5> <965B>
+<CAC6> <7C73>
+<CAC7> <9801>
+<CAC8> <50FB>
+<CAC9> <58C1>
+<CACA> <7656>
+<CACB> <78A7>
+<CACC> <5225>
+<CACD> <77A5>
+<CACE> <8511>
+<CACF> <7B86>
+<CAD0> <504F>
+<CAD1> <5909>
+<CAD2> <7247>
+<CAD3> <7BC7>
+<CAD4> <7DE8>
+<CAD5> <8FBA>
+<CAD6> <8FD4>
+<CAD7> <904D>
+<CAD8> <4FBF>
+<CAD9> <52C9>
+<CADA> <5A29>
+<CADB> <5F01>
+<CADC> <97AD>
+<CADD> <4FDD>
+<CADE> <8217>
+<CADF> <92EA>
+<CAE0> <5703>
+<CAE1> <6355>
+<CAE2> <6B69>
+<CAE3> <752B>
+<CAE4> <88DC>
+<CAE5> <8F14>
+<CAE6> <7A42>
+<CAE7> <52DF>
+<CAE8> <5893>
+<CAE9> <6155>
+<CAEA> <620A>
+<CAEB> <66AE>
+<CAEC> <6BCD>
+<CAED> <7C3F>
+<CAEE> <83E9>
+<CAEF> <5023>
+<CAF0> <4FF8>
+<CAF1> <5305>
+<CAF2> <5446>
+endbfchar
+
+100 beginbfchar
+<CAF3> <5831>
+<CAF4> <5949>
+<CAF5> <5B9D>
+<CAF6> <5CF0>
+<CAF7> <5CEF>
+<CAF8> <5D29>
+<CAF9> <5E96>
+<CAFA> <62B1>
+<CAFB> <6367>
+<CAFC> <653E>
+<CAFD> <65B9>
+<CAFE> <670B>
+<CBA1> <6CD5>
+<CBA2> <6CE1>
+<CBA3> <70F9>
+<CBA4> <7832>
+<CBA5> <7E2B>
+<CBA6> <80DE>
+<CBA7> <82B3>
+<CBA8> <840C>
+<CBA9> <84EC>
+<CBAA> <8702>
+<CBAB> <8912>
+<CBAC> <8A2A>
+<CBAD> <8C4A>
+<CBAE> <90A6>
+<CBAF> <92D2>
+<CBB0> <98FD>
+<CBB1> <9CF3>
+<CBB2> <9D6C>
+<CBB3> <4E4F>
+<CBB4> <4EA1>
+<CBB5> <508D>
+<CBB6> <5256>
+<CBB7> <574A>
+<CBB8> <59A8>
+<CBB9> <5E3D>
+<CBBA> <5FD8>
+<CBBB> <5FD9>
+<CBBC> <623F>
+<CBBD> <66B4>
+<CBBE> <671B>
+<CBBF> <67D0>
+<CBC0> <68D2>
+<CBC1> <5192>
+<CBC2> <7D21>
+<CBC3> <80AA>
+<CBC4> <81A8>
+<CBC5> <8B00>
+<CBC6> <8C8C>
+<CBC7> <8CBF>
+<CBC8> <927E>
+<CBC9> <9632>
+<CBCA> <5420>
+<CBCB> <982C>
+<CBCC> <5317>
+<CBCD> <50D5>
+<CBCE> <535C>
+<CBCF> <58A8>
+<CBD0> <64B2>
+<CBD1> <6734>
+<CBD2> <7267>
+<CBD3> <7766>
+<CBD4> <7A46>
+<CBD5> <91E6>
+<CBD6> <52C3>
+<CBD7> <6CA1>
+<CBD8> <6B86>
+<CBD9> <5800>
+<CBDA> <5E4C>
+<CBDB> <5954>
+<CBDC> <672C>
+<CBDD> <7FFB>
+<CBDE> <51E1>
+<CBDF> <76C6>
+<CBE0> <6469>
+<CBE1> <78E8>
+<CBE2> <9B54>
+<CBE3> <9EBB>
+<CBE4> <57CB>
+<CBE5> <59B9>
+<CBE6> <6627>
+<CBE7> <679A>
+<CBE8> <6BCE>
+<CBE9> <54E9>
+<CBEA> <69D9>
+<CBEB> <5E55>
+<CBEC> <819C>
+<CBED> <6795>
+<CBEE> <9BAA>
+<CBEF> <67FE>
+<CBF0> <9C52>
+<CBF1> <685D>
+<CBF2> <4EA6>
+<CBF3> <4FE3>
+<CBF4> <53C8>
+<CBF5> <62B9>
+<CBF6> <672B>
+<CBF7> <6CAB>
+<CBF8> <8FC4>
+endbfchar
+
+100 beginbfchar
+<CBF9> <4FAD>
+<CBFA> <7E6D>
+<CBFB> <9EBF>
+<CBFC> <4E07>
+<CBFD> <6162>
+<CBFE> <6E80>
+<CCA1> <6F2B>
+<CCA2> <8513>
+<CCA3> <5473>
+<CCA4> <672A>
+<CCA5> <9B45>
+<CCA6> <5DF3>
+<CCA7> <7B95>
+<CCA8> <5CAC>
+<CCA9> <5BC6>
+<CCAA> <871C>
+<CCAB> <6E4A>
+<CCAC> <84D1>
+<CCAD> <7A14>
+<CCAE> <8108>
+<CCAF> <5999>
+<CCB0> <7C8D>
+<CCB1> <6C11>
+<CCB2> <7720>
+<CCB3> <52D9>
+<CCB4> <5922>
+<CCB5> <7121>
+<CCB6> <725F>
+<CCB7> <77DB>
+<CCB8> <9727>
+<CCB9> <9D61>
+<CCBA> <690B>
+<CCBB> <5A7F>
+<CCBC> <5A18>
+<CCBD> <51A5>
+<CCBE> <540D>
+<CCBF> <547D>
+<CCC0> <660E>
+<CCC1> <76DF>
+<CCC2> <8FF7>
+<CCC3> <9298>
+<CCC4> <9CF4>
+<CCC5> <59EA>
+<CCC6> <725D>
+<CCC7> <6EC5>
+<CCC8> <514D>
+<CCC9> <68C9>
+<CCCA> <7DBF>
+<CCCB> <7DEC>
+<CCCC> <9762>
+<CCCD> <9EBA>
+<CCCE> <6478>
+<CCCF> <6A21>
+<CCD0> <8302>
+<CCD1> <5984>
+<CCD2> <5B5F>
+<CCD3> <6BDB>
+<CCD4> <731B>
+<CCD5> <76F2>
+<CCD6> <7DB2>
+<CCD7> <8017>
+<CCD8> <8499>
+<CCD9> <5132>
+<CCDA> <6728>
+<CCDB> <9ED9>
+<CCDC> <76EE>
+<CCDD> <6762>
+<CCDE> <52FF>
+<CCDF> <9905>
+<CCE0> <5C24>
+<CCE1> <623B>
+<CCE2> <7C7E>
+<CCE3> <8CB0>
+<CCE4> <554F>
+<CCE5> <60B6>
+<CCE6> <7D0B>
+<CCE7> <9580>
+<CCE8> <5301>
+<CCE9> <4E5F>
+<CCEA> <51B6>
+<CCEB> <591C>
+<CCEC> <723A>
+<CCED> <8036>
+<CCEE> <91CE>
+<CCEF> <5F25>
+<CCF0> <77E2>
+<CCF1> <5384>
+<CCF2> <5F79>
+<CCF3> <7D04>
+<CCF4> <85AC>
+<CCF5> <8A33>
+<CCF6> <8E8D>
+<CCF7> <9756>
+<CCF8> <67F3>
+<CCF9> <85AE>
+<CCFA> <9453>
+<CCFB> <6109>
+<CCFC> <6108>
+<CCFD> <6CB9>
+<CCFE> <7652>
+endbfchar
+
+100 beginbfchar
+<CDA1> <8AED>
+<CDA2> <8F38>
+<CDA3> <552F>
+<CDA4> <4F51>
+<CDA5> <512A>
+<CDA6> <52C7>
+<CDA7> <53CB>
+<CDA8> <5BA5>
+<CDA9> <5E7D>
+<CDAA> <60A0>
+<CDAB> <6182>
+<CDAC> <63D6>
+<CDAD> <6709>
+<CDAE> <67DA>
+<CDAF> <6E67>
+<CDB0> <6D8C>
+<CDB1> <7336>
+<CDB2> <7337>
+<CDB3> <7531>
+<CDB4> <7950>
+<CDB5> <88D5>
+<CDB6> <8A98>
+<CDB7> <904A>
+<CDB8> <9091>
+<CDB9> <90F5>
+<CDBA> <96C4>
+<CDBB> <878D>
+<CDBC> <5915>
+<CDBD> <4E88>
+<CDBE> <4F59>
+<CDBF> <4E0E>
+<CDC0> <8A89>
+<CDC1> <8F3F>
+<CDC2> <9810>
+<CDC3> <50AD>
+<CDC4> <5E7C>
+<CDC5> <5996>
+<CDC6> <5BB9>
+<CDC7> <5EB8>
+<CDC8> <63DA>
+<CDC9> <63FA>
+<CDCA> <64C1>
+<CDCB> <66DC>
+<CDCC> <694A>
+<CDCD> <69D8>
+<CDCE> <6D0B>
+<CDCF> <6EB6>
+<CDD0> <7194>
+<CDD1> <7528>
+<CDD2> <7AAF>
+<CDD3> <7F8A>
+<CDD4> <8000>
+<CDD5> <8449>
+<CDD6> <84C9>
+<CDD7> <8981>
+<CDD8> <8B21>
+<CDD9> <8E0A>
+<CDDA> <9065>
+<CDDB> <967D>
+<CDDC> <990A>
+<CDDD> <617E>
+<CDDE> <6291>
+<CDDF> <6B32>
+<CDE0> <6C83>
+<CDE1> <6D74>
+<CDE2> <7FCC>
+<CDE3> <7FFC>
+<CDE4> <6DC0>
+<CDE5> <7F85>
+<CDE6> <87BA>
+<CDE7> <88F8>
+<CDE8> <6765>
+<CDE9> <83B1>
+<CDEA> <983C>
+<CDEB> <96F7>
+<CDEC> <6D1B>
+<CDED> <7D61>
+<CDEE> <843D>
+<CDEF> <916A>
+<CDF0> <4E71>
+<CDF1> <5375>
+<CDF2> <5D50>
+<CDF3> <6B04>
+<CDF4> <6FEB>
+<CDF5> <85CD>
+<CDF6> <862D>
+<CDF7> <89A7>
+<CDF8> <5229>
+<CDF9> <540F>
+<CDFA> <5C65>
+<CDFB> <674E>
+<CDFC> <68A8>
+<CDFD> <7406>
+<CDFE> <7483>
+<CEA1> <75E2>
+<CEA2> <88CF>
+<CEA3> <88E1>
+<CEA4> <91CC>
+<CEA5> <96E2>
+<CEA6> <9678>
+endbfchar
+
+100 beginbfchar
+<CEA7> <5F8B>
+<CEA8> <7387>
+<CEA9> <7ACB>
+<CEAA> <844E>
+<CEAB> <63A0>
+<CEAC> <7565>
+<CEAD> <5289>
+<CEAE> <6D41>
+<CEAF> <6E9C>
+<CEB0> <7409>
+<CEB1> <7559>
+<CEB2> <786B>
+<CEB3> <7C92>
+<CEB4> <9686>
+<CEB5> <7ADC>
+<CEB6> <9F8D>
+<CEB7> <4FB6>
+<CEB8> <616E>
+<CEB9> <65C5>
+<CEBA> <865C>
+<CEBB> <4E86>
+<CEBC> <4EAE>
+<CEBD> <50DA>
+<CEBE> <4E21>
+<CEBF> <51CC>
+<CEC0> <5BEE>
+<CEC1> <6599>
+<CEC2> <6881>
+<CEC3> <6DBC>
+<CEC4> <731F>
+<CEC5> <7642>
+<CEC6> <77AD>
+<CEC7> <7A1C>
+<CEC8> <7CE7>
+<CEC9> <826F>
+<CECA> <8AD2>
+<CECB> <907C>
+<CECC> <91CF>
+<CECD> <9675>
+<CECE> <9818>
+<CECF> <529B>
+<CED0> <7DD1>
+<CED1> <502B>
+<CED2> <5398>
+<CED3> <6797>
+<CED4> <6DCB>
+<CED5> <71D0>
+<CED6> <7433>
+<CED7> <81E8>
+<CED8> <8F2A>
+<CED9> <96A3>
+<CEDA> <9C57>
+<CEDB> <9E9F>
+<CEDC> <7460>
+<CEDD> <5841>
+<CEDE> <6D99>
+<CEDF> <7D2F>
+<CEE0> <985E>
+<CEE1> <4EE4>
+<CEE2> <4F36>
+<CEE3> <4F8B>
+<CEE4> <51B7>
+<CEE5> <52B1>
+<CEE6> <5DBA>
+<CEE7> <601C>
+<CEE8> <73B2>
+<CEE9> <793C>
+<CEEA> <82D3>
+<CEEB> <9234>
+<CEEC> <96B7>
+<CEED> <96F6>
+<CEEE> <970A>
+<CEEF> <9E97>
+<CEF0> <9F62>
+<CEF1> <66A6>
+<CEF2> <6B74>
+<CEF3> <5217>
+<CEF4> <52A3>
+<CEF5> <70C8>
+<CEF6> <88C2>
+<CEF7> <5EC9>
+<CEF8> <604B>
+<CEF9> <6190>
+<CEFA> <6F23>
+<CEFB> <7149>
+<CEFC> <7C3E>
+<CEFD> <7DF4>
+<CEFE> <806F>
+<CFA1> <84EE>
+<CFA2> <9023>
+<CFA3> <932C>
+<CFA4> <5442>
+<CFA5> <9B6F>
+<CFA6> <6AD3>
+<CFA7> <7089>
+<CFA8> <8CC2>
+<CFA9> <8DEF>
+<CFAA> <9732>
+<CFAB> <52B4>
+<CFAC> <5A41>
+endbfchar
+
+100 beginbfchar
+<CFAD> <5ECA>
+<CFAE> <5F04>
+<CFAF> <6717>
+<CFB0> <697C>
+<CFB1> <6994>
+<CFB2> <6D6A>
+<CFB3> <6F0F>
+<CFB4> <7262>
+<CFB5> <72FC>
+<CFB6> <7BED>
+<CFB7> <8001>
+<CFB8> <807E>
+<CFB9> <874B>
+<CFBA> <90CE>
+<CFBB> <516D>
+<CFBC> <9E93>
+<CFBD> <7984>
+<CFBE> <808B>
+<CFBF> <9332>
+<CFC0> <8AD6>
+<CFC1> <502D>
+<CFC2> <548C>
+<CFC3> <8A71>
+<CFC4> <6B6A>
+<CFC5> <8CC4>
+<CFC6> <8107>
+<CFC7> <60D1>
+<CFC8> <67A0>
+<CFC9> <9DF2>
+<CFCA> <4E99>
+<CFCB> <4E98>
+<CFCC> <9C10>
+<CFCD> <8A6B>
+<CFCE> <85C1>
+<CFCF> <8568>
+<CFD0> <6900>
+<CFD1> <6E7E>
+<CFD2> <7897>
+<CFD3> <8155>
+<D0A1> <5F0C>
+<D0A2> <4E10>
+<D0A3> <4E15>
+<D0A4> <4E2A>
+<D0A5> <4E31>
+<D0A6> <4E36>
+<D0A7> <4E3C>
+<D0A8> <4E3F>
+<D0A9> <4E42>
+<D0AA> <4E56>
+<D0AB> <4E58>
+<D0AC> <4E82>
+<D0AD> <4E85>
+<D0AE> <8C6B>
+<D0AF> <4E8A>
+<D0B0> <8212>
+<D0B1> <5F0D>
+<D0B2> <4E8E>
+<D0B3> <4E9E>
+<D0B4> <4E9F>
+<D0B5> <4EA0>
+<D0B6> <4EA2>
+<D0B7> <4EB0>
+<D0B8> <4EB3>
+<D0B9> <4EB6>
+<D0BA> <4ECE>
+<D0BB> <4ECD>
+<D0BC> <4EC4>
+<D0BD> <4EC6>
+<D0BE> <4EC2>
+<D0BF> <4ED7>
+<D0C0> <4EDE>
+<D0C1> <4EED>
+<D0C2> <4EDF>
+<D0C3> <4EF7>
+<D0C4> <4F09>
+<D0C5> <4F5A>
+<D0C6> <4F30>
+<D0C7> <4F5B>
+<D0C8> <4F5D>
+<D0C9> <4F57>
+<D0CA> <4F47>
+<D0CB> <4F76>
+<D0CC> <4F88>
+<D0CD> <4F8F>
+<D0CE> <4F98>
+<D0CF> <4F7B>
+<D0D0> <4F69>
+<D0D1> <4F70>
+<D0D2> <4F91>
+<D0D3> <4F6F>
+<D0D4> <4F86>
+<D0D5> <4F96>
+<D0D6> <5118>
+<D0D7> <4FD4>
+<D0D8> <4FDF>
+<D0D9> <4FCE>
+<D0DA> <4FD8>
+<D0DB> <4FDB>
+<D0DC> <4FD1>
+<D0DD> <4FDA>
+endbfchar
+
+100 beginbfchar
+<D0DE> <4FD0>
+<D0DF> <4FE4>
+<D0E0> <4FE5>
+<D0E1> <501A>
+<D0E2> <5028>
+<D0E3> <5014>
+<D0E4> <502A>
+<D0E5> <5025>
+<D0E6> <5005>
+<D0E7> <4F1C>
+<D0E8> <4FF6>
+<D0E9> <5021>
+<D0EA> <5029>
+<D0EB> <502C>
+<D0EC> <4FFE>
+<D0ED> <4FEF>
+<D0EE> <5011>
+<D0EF> <5006>
+<D0F0> <5043>
+<D0F1> <5047>
+<D0F2> <6703>
+<D0F3> <5055>
+<D0F4> <5050>
+<D0F5> <5048>
+<D0F6> <505A>
+<D0F7> <5056>
+<D0F8> <506C>
+<D0F9> <5078>
+<D0FA> <5080>
+<D0FB> <509A>
+<D0FC> <5085>
+<D0FD> <50B4>
+<D0FE> <50B2>
+<D1A1> <50C9>
+<D1A2> <50CA>
+<D1A3> <50B3>
+<D1A4> <50C2>
+<D1A5> <50D6>
+<D1A6> <50DE>
+<D1A7> <50E5>
+<D1A8> <50ED>
+<D1A9> <50E3>
+<D1AA> <50EE>
+<D1AB> <50F9>
+<D1AC> <50F5>
+<D1AD> <5109>
+<D1AE> <5101>
+<D1AF> <5102>
+<D1B0> <5116>
+<D1B1> <5115>
+<D1B2> <5114>
+<D1B3> <511A>
+<D1B4> <5121>
+<D1B5> <513A>
+<D1B6> <5137>
+<D1B7> <513C>
+<D1B8> <513B>
+<D1B9> <513F>
+<D1BA> <5140>
+<D1BB> <5152>
+<D1BC> <514C>
+<D1BD> <5154>
+<D1BE> <5162>
+<D1BF> <7AF8>
+<D1C0> <5169>
+<D1C1> <516A>
+<D1C2> <516E>
+<D1C3> <5180>
+<D1C4> <5182>
+<D1C5> <56D8>
+<D1C6> <518C>
+<D1C7> <5189>
+<D1C8> <518F>
+<D1C9> <5191>
+<D1CA> <5193>
+<D1CB> <5195>
+<D1CC> <5196>
+<D1CD> <51A4>
+<D1CE> <51A6>
+<D1CF> <51A2>
+<D1D0> <51A9>
+<D1D1> <51AA>
+<D1D2> <51AB>
+<D1D3> <51B3>
+<D1D4> <51B1>
+<D1D5> <51B2>
+<D1D6> <51B0>
+<D1D7> <51B5>
+<D1D8> <51BD>
+<D1D9> <51C5>
+<D1DA> <51C9>
+<D1DB> <51DB>
+<D1DC> <51E0>
+<D1DD> <8655>
+<D1DE> <51E9>
+<D1DF> <51ED>
+<D1E0> <51F0>
+<D1E1> <51F5>
+<D1E2> <51FE>
+<D1E3> <5204>
+endbfchar
+
+100 beginbfchar
+<D1E4> <520B>
+<D1E5> <5214>
+<D1E6> <520E>
+<D1E7> <5227>
+<D1E8> <522A>
+<D1E9> <522E>
+<D1EA> <5233>
+<D1EB> <5239>
+<D1EC> <524F>
+<D1ED> <5244>
+<D1EE> <524B>
+<D1EF> <524C>
+<D1F0> <525E>
+<D1F1> <5254>
+<D1F2> <526A>
+<D1F3> <5274>
+<D1F4> <5269>
+<D1F5> <5273>
+<D1F6> <527F>
+<D1F7> <527D>
+<D1F8> <528D>
+<D1F9> <5294>
+<D1FA> <5292>
+<D1FB> <5271>
+<D1FC> <5288>
+<D1FD> <5291>
+<D1FE> <8FA8>
+<D2A1> <8FA7>
+<D2A2> <52AC>
+<D2A3> <52AD>
+<D2A4> <52BC>
+<D2A5> <52B5>
+<D2A6> <52C1>
+<D2A7> <52CD>
+<D2A8> <52D7>
+<D2A9> <52DE>
+<D2AA> <52E3>
+<D2AB> <52E6>
+<D2AC> <98ED>
+<D2AD> <52E0>
+<D2AE> <52F3>
+<D2AF> <52F5>
+<D2B0> <52F8>
+<D2B1> <52F9>
+<D2B2> <5306>
+<D2B3> <5308>
+<D2B4> <7538>
+<D2B5> <530D>
+<D2B6> <5310>
+<D2B7> <530F>
+<D2B8> <5315>
+<D2B9> <531A>
+<D2BA> <5323>
+<D2BB> <532F>
+<D2BC> <5331>
+<D2BD> <5333>
+<D2BE> <5338>
+<D2BF> <5340>
+<D2C0> <5346>
+<D2C1> <5345>
+<D2C2> <4E17>
+<D2C3> <5349>
+<D2C4> <534D>
+<D2C5> <51D6>
+<D2C6> <535E>
+<D2C7> <5369>
+<D2C8> <536E>
+<D2C9> <5918>
+<D2CA> <537B>
+<D2CB> <5377>
+<D2CC> <5382>
+<D2CD> <5396>
+<D2CE> <53A0>
+<D2CF> <53A6>
+<D2D0> <53A5>
+<D2D1> <53AE>
+<D2D2> <53B0>
+<D2D3> <53B6>
+<D2D4> <53C3>
+<D2D5> <7C12>
+<D2D6> <96D9>
+<D2D7> <53DF>
+<D2D8> <66FC>
+<D2D9> <71EE>
+<D2DA> <53EE>
+<D2DB> <53E8>
+<D2DC> <53ED>
+<D2DD> <53FA>
+<D2DE> <5401>
+<D2DF> <543D>
+<D2E0> <5440>
+<D2E1> <542C>
+<D2E2> <542D>
+<D2E3> <543C>
+<D2E4> <542E>
+<D2E5> <5436>
+<D2E6> <5429>
+<D2E7> <541D>
+<D2E8> <544E>
+<D2E9> <548F>
+endbfchar
+
+100 beginbfchar
+<D2EA> <5475>
+<D2EB> <548E>
+<D2EC> <545F>
+<D2ED> <5471>
+<D2EE> <5477>
+<D2EF> <5470>
+<D2F0> <5492>
+<D2F1> <547B>
+<D2F2> <5480>
+<D2F3> <5476>
+<D2F4> <5484>
+<D2F5> <5490>
+<D2F6> <5486>
+<D2F7> <54C7>
+<D2F8> <54A2>
+<D2F9> <54B8>
+<D2FA> <54A5>
+<D2FB> <54AC>
+<D2FC> <54C4>
+<D2FD> <54C8>
+<D2FE> <54A8>
+<D3A1> <54AB>
+<D3A2> <54C2>
+<D3A3> <54A4>
+<D3A4> <54BE>
+<D3A5> <54BC>
+<D3A6> <54D8>
+<D3A7> <54E5>
+<D3A8> <54E6>
+<D3A9> <550F>
+<D3AA> <5514>
+<D3AB> <54FD>
+<D3AC> <54EE>
+<D3AD> <54ED>
+<D3AE> <54FA>
+<D3AF> <54E2>
+<D3B0> <5539>
+<D3B1> <5540>
+<D3B2> <5563>
+<D3B3> <554C>
+<D3B4> <552E>
+<D3B5> <555C>
+<D3B6> <5545>
+<D3B7> <5556>
+<D3B8> <5557>
+<D3B9> <5538>
+<D3BA> <5533>
+<D3BB> <555D>
+<D3BC> <5599>
+<D3BD> <5580>
+<D3BE> <54AF>
+<D3BF> <558A>
+<D3C0> <559F>
+<D3C1> <557B>
+<D3C2> <557E>
+<D3C3> <5598>
+<D3C4> <559E>
+<D3C5> <55AE>
+<D3C6> <557C>
+<D3C7> <5583>
+<D3C8> <55A9>
+<D3C9> <5587>
+<D3CA> <55A8>
+<D3CB> <55DA>
+<D3CC> <55C5>
+<D3CD> <55DF>
+<D3CE> <55C4>
+<D3CF> <55DC>
+<D3D0> <55E4>
+<D3D1> <55D4>
+<D3D2> <5614>
+<D3D3> <55F7>
+<D3D4> <5616>
+<D3D5> <55FE>
+<D3D6> <55FD>
+<D3D7> <561B>
+<D3D8> <55F9>
+<D3D9> <564E>
+<D3DA> <5650>
+<D3DB> <71DF>
+<D3DC> <5634>
+<D3DD> <5636>
+<D3DE> <5632>
+<D3DF> <5638>
+<D3E0> <566B>
+<D3E1> <5664>
+<D3E2> <562F>
+<D3E3> <566C>
+<D3E4> <566A>
+<D3E5> <5686>
+<D3E6> <5680>
+<D3E7> <568A>
+<D3E8> <56A0>
+<D3E9> <5694>
+<D3EA> <568F>
+<D3EB> <56A5>
+<D3EC> <56AE>
+<D3ED> <56B6>
+<D3EE> <56B4>
+<D3EF> <56C2>
+endbfchar
+
+100 beginbfchar
+<D3F0> <56BC>
+<D3F1> <56C1>
+<D3F2> <56C3>
+<D3F3> <56C0>
+<D3F4> <56C8>
+<D3F5> <56CE>
+<D3F6> <56D1>
+<D3F7> <56D3>
+<D3F8> <56D7>
+<D3F9> <56EE>
+<D3FA> <56F9>
+<D3FB> <5700>
+<D3FC> <56FF>
+<D3FD> <5704>
+<D3FE> <5709>
+<D4A1> <5708>
+<D4A2> <570B>
+<D4A3> <570D>
+<D4A4> <5713>
+<D4A5> <5718>
+<D4A6> <5716>
+<D4A7> <55C7>
+<D4A8> <571C>
+<D4A9> <5726>
+<D4AA> <5737>
+<D4AB> <5738>
+<D4AC> <574E>
+<D4AD> <573B>
+<D4AE> <5740>
+<D4AF> <574F>
+<D4B0> <5769>
+<D4B1> <57C0>
+<D4B2> <5788>
+<D4B3> <5761>
+<D4B4> <577F>
+<D4B5> <5789>
+<D4B6> <5793>
+<D4B7> <57A0>
+<D4B8> <57B3>
+<D4B9> <57A4>
+<D4BA> <57AA>
+<D4BB> <57B0>
+<D4BC> <57C3>
+<D4BD> <57C6>
+<D4BE> <57D4>
+<D4BF> <57D2>
+<D4C0> <57D3>
+<D4C1> <580A>
+<D4C2> <57D6>
+<D4C3> <57E3>
+<D4C4> <580B>
+<D4C5> <5819>
+<D4C6> <581D>
+<D4C7> <5872>
+<D4C8> <5821>
+<D4C9> <5862>
+<D4CA> <584B>
+<D4CB> <5870>
+<D4CC> <6BC0>
+<D4CD> <5852>
+<D4CE> <583D>
+<D4CF> <5879>
+<D4D0> <5885>
+<D4D1> <58B9>
+<D4D2> <589F>
+<D4D3> <58AB>
+<D4D4> <58BA>
+<D4D5> <58DE>
+<D4D6> <58BB>
+<D4D7> <58B8>
+<D4D8> <58AE>
+<D4D9> <58C5>
+<D4DA> <58D3>
+<D4DB> <58D1>
+<D4DC> <58D7>
+<D4DD> <58D9>
+<D4DE> <58D8>
+<D4DF> <58E5>
+<D4E0> <58DC>
+<D4E1> <58E4>
+<D4E2> <58DF>
+<D4E3> <58EF>
+<D4E4> <58FA>
+<D4E5> <58F9>
+<D4E6> <58FB>
+<D4E7> <58FC>
+<D4E8> <58FD>
+<D4E9> <5902>
+<D4EA> <590A>
+<D4EB> <5910>
+<D4EC> <591B>
+<D4ED> <68A6>
+<D4EE> <5925>
+<D4EF> <592C>
+<D4F0> <592D>
+<D4F1> <5932>
+<D4F2> <5938>
+<D4F3> <593E>
+<D4F4> <7AD2>
+<D4F5> <5955>
+endbfchar
+
+100 beginbfchar
+<D4F6> <5950>
+<D4F7> <594E>
+<D4F8> <595A>
+<D4F9> <5958>
+<D4FA> <5962>
+<D4FB> <5960>
+<D4FC> <5967>
+<D4FD> <596C>
+<D4FE> <5969>
+<D5A1> <5978>
+<D5A2> <5981>
+<D5A3> <599D>
+<D5A4> <4F5E>
+<D5A5> <4FAB>
+<D5A6> <59A3>
+<D5A7> <59B2>
+<D5A8> <59C6>
+<D5A9> <59E8>
+<D5AA> <59DC>
+<D5AB> <598D>
+<D5AC> <59D9>
+<D5AD> <59DA>
+<D5AE> <5A25>
+<D5AF> <5A1F>
+<D5B0> <5A11>
+<D5B1> <5A1C>
+<D5B2> <5A09>
+<D5B3> <5A1A>
+<D5B4> <5A40>
+<D5B5> <5A6C>
+<D5B6> <5A49>
+<D5B7> <5A35>
+<D5B8> <5A36>
+<D5B9> <5A62>
+<D5BA> <5A6A>
+<D5BB> <5A9A>
+<D5BC> <5ABC>
+<D5BD> <5ABE>
+<D5BE> <5ACB>
+<D5BF> <5AC2>
+<D5C0> <5ABD>
+<D5C1> <5AE3>
+<D5C2> <5AD7>
+<D5C3> <5AE6>
+<D5C4> <5AE9>
+<D5C5> <5AD6>
+<D5C6> <5AFA>
+<D5C7> <5AFB>
+<D5C8> <5B0C>
+<D5C9> <5B0B>
+<D5CA> <5B16>
+<D5CB> <5B32>
+<D5CC> <5AD0>
+<D5CD> <5B2A>
+<D5CE> <5B36>
+<D5CF> <5B3E>
+<D5D0> <5B43>
+<D5D1> <5B45>
+<D5D2> <5B40>
+<D5D3> <5B51>
+<D5D4> <5B55>
+<D5D5> <5B5A>
+<D5D6> <5B5B>
+<D5D7> <5B65>
+<D5D8> <5B69>
+<D5D9> <5B70>
+<D5DA> <5B73>
+<D5DB> <5B75>
+<D5DC> <5B78>
+<D5DD> <6588>
+<D5DE> <5B7A>
+<D5DF> <5B80>
+<D5E0> <5B83>
+<D5E1> <5BA6>
+<D5E2> <5BB8>
+<D5E3> <5BC3>
+<D5E4> <5BC7>
+<D5E5> <5BC9>
+<D5E6> <5BD4>
+<D5E7> <5BD0>
+<D5E8> <5BE4>
+<D5E9> <5BE6>
+<D5EA> <5BE2>
+<D5EB> <5BDE>
+<D5EC> <5BE5>
+<D5ED> <5BEB>
+<D5EE> <5BF0>
+<D5EF> <5BF6>
+<D5F0> <5BF3>
+<D5F1> <5C05>
+<D5F2> <5C07>
+<D5F3> <5C08>
+<D5F4> <5C0D>
+<D5F5> <5C13>
+<D5F6> <5C20>
+<D5F7> <5C22>
+<D5F8> <5C28>
+<D5F9> <5C38>
+<D5FA> <5C39>
+<D5FB> <5C41>
+endbfchar
+
+100 beginbfchar
+<D5FC> <5C46>
+<D5FD> <5C4E>
+<D5FE> <5C53>
+<D6A1> <5C50>
+<D6A2> <5C4F>
+<D6A3> <5B71>
+<D6A4> <5C6C>
+<D6A5> <5C6E>
+<D6A6> <4E62>
+<D6A7> <5C76>
+<D6A8> <5C79>
+<D6A9> <5C8C>
+<D6AA> <5C91>
+<D6AB> <5C94>
+<D6AC> <599B>
+<D6AD> <5CAB>
+<D6AE> <5CBB>
+<D6AF> <5CB6>
+<D6B0> <5CBC>
+<D6B1> <5CB7>
+<D6B2> <5CC5>
+<D6B3> <5CBE>
+<D6B4> <5CC7>
+<D6B5> <5CD9>
+<D6B6> <5CE9>
+<D6B7> <5CFD>
+<D6B8> <5CFA>
+<D6B9> <5CED>
+<D6BA> <5D8C>
+<D6BB> <5CEA>
+<D6BC> <5D0B>
+<D6BD> <5D15>
+<D6BE> <5D17>
+<D6BF> <5D5C>
+<D6C0> <5D1F>
+<D6C1> <5D1B>
+<D6C2> <5D11>
+<D6C3> <5D14>
+<D6C4> <5D22>
+<D6C5> <5D1A>
+<D6C6> <5D19>
+<D6C7> <5D18>
+<D6C8> <5D4C>
+<D6C9> <5D52>
+<D6CA> <5D4E>
+<D6CB> <5D4B>
+<D6CC> <5D6C>
+<D6CD> <5D73>
+<D6CE> <5D76>
+<D6CF> <5D87>
+<D6D0> <5D84>
+<D6D1> <5D82>
+<D6D2> <5DA2>
+<D6D3> <5D9D>
+<D6D4> <5DAC>
+<D6D5> <5DAE>
+<D6D6> <5DBD>
+<D6D7> <5D90>
+<D6D8> <5DB7>
+<D6D9> <5DBC>
+<D6DA> <5DC9>
+<D6DB> <5DCD>
+<D6DC> <5DD3>
+<D6DD> <5DD2>
+<D6DE> <5DD6>
+<D6DF> <5DDB>
+<D6E0> <5DEB>
+<D6E1> <5DF2>
+<D6E2> <5DF5>
+<D6E3> <5E0B>
+<D6E4> <5E1A>
+<D6E5> <5E19>
+<D6E6> <5E11>
+<D6E7> <5E1B>
+<D6E8> <5E36>
+<D6E9> <5E37>
+<D6EA> <5E44>
+<D6EB> <5E43>
+<D6EC> <5E40>
+<D6ED> <5E4E>
+<D6EE> <5E57>
+<D6EF> <5E54>
+<D6F0> <5E5F>
+<D6F1> <5E62>
+<D6F2> <5E64>
+<D6F3> <5E47>
+<D6F4> <5E75>
+<D6F5> <5E76>
+<D6F6> <5E7A>
+<D6F7> <9EBC>
+<D6F8> <5E7F>
+<D6F9> <5EA0>
+<D6FA> <5EC1>
+<D6FB> <5EC2>
+<D6FC> <5EC8>
+<D6FD> <5ED0>
+<D6FE> <5ECF>
+<D7A1> <5ED6>
+<D7A2> <5EE3>
+<D7A3> <5EDD>
+endbfchar
+
+100 beginbfchar
+<D7A4> <5EDA>
+<D7A5> <5EDB>
+<D7A6> <5EE2>
+<D7A7> <5EE1>
+<D7A8> <5EE8>
+<D7A9> <5EE9>
+<D7AA> <5EEC>
+<D7AB> <5EF1>
+<D7AC> <5EF3>
+<D7AD> <5EF0>
+<D7AE> <5EF4>
+<D7AF> <5EF8>
+<D7B0> <5EFE>
+<D7B1> <5F03>
+<D7B2> <5F09>
+<D7B3> <5F5D>
+<D7B4> <5F5C>
+<D7B5> <5F0B>
+<D7B6> <5F11>
+<D7B7> <5F16>
+<D7B8> <5F29>
+<D7B9> <5F2D>
+<D7BA> <5F38>
+<D7BB> <5F41>
+<D7BC> <5F48>
+<D7BD> <5F4C>
+<D7BE> <5F4E>
+<D7BF> <5F2F>
+<D7C0> <5F51>
+<D7C1> <5F56>
+<D7C2> <5F57>
+<D7C3> <5F59>
+<D7C4> <5F61>
+<D7C5> <5F6D>
+<D7C6> <5F73>
+<D7C7> <5F77>
+<D7C8> <5F83>
+<D7C9> <5F82>
+<D7CA> <5F7F>
+<D7CB> <5F8A>
+<D7CC> <5F88>
+<D7CD> <5F91>
+<D7CE> <5F87>
+<D7CF> <5F9E>
+<D7D0> <5F99>
+<D7D1> <5F98>
+<D7D2> <5FA0>
+<D7D3> <5FA8>
+<D7D4> <5FAD>
+<D7D5> <5FBC>
+<D7D6> <5FD6>
+<D7D7> <5FFB>
+<D7D8> <5FE4>
+<D7D9> <5FF8>
+<D7DA> <5FF1>
+<D7DB> <5FDD>
+<D7DC> <60B3>
+<D7DD> <5FFF>
+<D7DE> <6021>
+<D7DF> <6060>
+<D7E0> <6019>
+<D7E1> <6010>
+<D7E2> <6029>
+<D7E3> <600E>
+<D7E4> <6031>
+<D7E5> <601B>
+<D7E6> <6015>
+<D7E7> <602B>
+<D7E8> <6026>
+<D7E9> <600F>
+<D7EA> <603A>
+<D7EB> <605A>
+<D7EC> <6041>
+<D7ED> <606A>
+<D7EE> <6077>
+<D7EF> <605F>
+<D7F0> <604A>
+<D7F1> <6046>
+<D7F2> <604D>
+<D7F3> <6063>
+<D7F4> <6043>
+<D7F5> <6064>
+<D7F6> <6042>
+<D7F7> <606C>
+<D7F8> <606B>
+<D7F9> <6059>
+<D7FA> <6081>
+<D7FB> <608D>
+<D7FC> <60E7>
+<D7FD> <6083>
+<D7FE> <609A>
+<D8A1> <6084>
+<D8A2> <609B>
+<D8A3> <6096>
+<D8A4> <6097>
+<D8A5> <6092>
+<D8A6> <60A7>
+<D8A7> <608B>
+<D8A8> <60E1>
+<D8A9> <60B8>
+endbfchar
+
+100 beginbfchar
+<D8AA> <60E0>
+<D8AB> <60D3>
+<D8AC> <60B4>
+<D8AD> <5FF0>
+<D8AE> <60BD>
+<D8AF> <60C6>
+<D8B0> <60B5>
+<D8B1> <60D8>
+<D8B2> <614D>
+<D8B3> <6115>
+<D8B4> <6106>
+<D8B5> <60F6>
+<D8B6> <60F7>
+<D8B7> <6100>
+<D8B8> <60F4>
+<D8B9> <60FA>
+<D8BA> <6103>
+<D8BB> <6121>
+<D8BC> <60FB>
+<D8BD> <60F1>
+<D8BE> <610D>
+<D8BF> <610E>
+<D8C0> <6147>
+<D8C1> <613E>
+<D8C2> <6128>
+<D8C3> <6127>
+<D8C4> <614A>
+<D8C5> <613F>
+<D8C6> <613C>
+<D8C7> <612C>
+<D8C8> <6134>
+<D8C9> <613D>
+<D8CA> <6142>
+<D8CB> <6144>
+<D8CC> <6173>
+<D8CD> <6177>
+<D8CE> <6158>
+<D8CF> <6159>
+<D8D0> <615A>
+<D8D1> <616B>
+<D8D2> <6174>
+<D8D3> <616F>
+<D8D4> <6165>
+<D8D5> <6171>
+<D8D6> <615F>
+<D8D7> <615D>
+<D8D8> <6153>
+<D8D9> <6175>
+<D8DA> <6199>
+<D8DB> <6196>
+<D8DC> <6187>
+<D8DD> <61AC>
+<D8DE> <6194>
+<D8DF> <619A>
+<D8E0> <618A>
+<D8E1> <6191>
+<D8E2> <61AB>
+<D8E3> <61AE>
+<D8E4> <61CC>
+<D8E5> <61CA>
+<D8E6> <61C9>
+<D8E7> <61F7>
+<D8E8> <61C8>
+<D8E9> <61C3>
+<D8EA> <61C6>
+<D8EB> <61BA>
+<D8EC> <61CB>
+<D8ED> <7F79>
+<D8EE> <61CD>
+<D8EF> <61E6>
+<D8F0> <61E3>
+<D8F1> <61F6>
+<D8F2> <61FA>
+<D8F3> <61F4>
+<D8F4> <61FF>
+<D8F5> <61FD>
+<D8F6> <61FC>
+<D8F7> <61FE>
+<D8F8> <6200>
+<D8F9> <6208>
+<D8FA> <6209>
+<D8FB> <620D>
+<D8FC> <620C>
+<D8FD> <6214>
+<D8FE> <621B>
+<D9A1> <621E>
+<D9A2> <6221>
+<D9A3> <622A>
+<D9A4> <622E>
+<D9A5> <6230>
+<D9A6> <6232>
+<D9A7> <6233>
+<D9A8> <6241>
+<D9A9> <624E>
+<D9AA> <625E>
+<D9AB> <6263>
+<D9AC> <625B>
+<D9AD> <6260>
+<D9AE> <6268>
+<D9AF> <627C>
+endbfchar
+
+100 beginbfchar
+<D9B0> <6282>
+<D9B1> <6289>
+<D9B2> <627E>
+<D9B3> <6292>
+<D9B4> <6293>
+<D9B5> <6296>
+<D9B6> <62D4>
+<D9B7> <6283>
+<D9B8> <6294>
+<D9B9> <62D7>
+<D9BA> <62D1>
+<D9BB> <62BB>
+<D9BC> <62CF>
+<D9BD> <62FF>
+<D9BE> <62C6>
+<D9BF> <64D4>
+<D9C0> <62C8>
+<D9C1> <62DC>
+<D9C2> <62CC>
+<D9C3> <62CA>
+<D9C4> <62C2>
+<D9C5> <62C7>
+<D9C6> <629B>
+<D9C7> <62C9>
+<D9C8> <630C>
+<D9C9> <62EE>
+<D9CA> <62F1>
+<D9CB> <6327>
+<D9CC> <6302>
+<D9CD> <6308>
+<D9CE> <62EF>
+<D9CF> <62F5>
+<D9D0> <6350>
+<D9D1> <633E>
+<D9D2> <634D>
+<D9D3> <641C>
+<D9D4> <634F>
+<D9D5> <6396>
+<D9D6> <638E>
+<D9D7> <6380>
+<D9D8> <63AB>
+<D9D9> <6376>
+<D9DA> <63A3>
+<D9DB> <638F>
+<D9DC> <6389>
+<D9DD> <639F>
+<D9DE> <63B5>
+<D9DF> <636B>
+<D9E0> <6369>
+<D9E1> <63BE>
+<D9E2> <63E9>
+<D9E3> <63C0>
+<D9E4> <63C6>
+<D9E5> <63E3>
+<D9E6> <63C9>
+<D9E7> <63D2>
+<D9E8> <63F6>
+<D9E9> <63C4>
+<D9EA> <6416>
+<D9EB> <6434>
+<D9EC> <6406>
+<D9ED> <6413>
+<D9EE> <6426>
+<D9EF> <6436>
+<D9F0> <651D>
+<D9F1> <6417>
+<D9F2> <6428>
+<D9F3> <640F>
+<D9F4> <6467>
+<D9F5> <646F>
+<D9F6> <6476>
+<D9F7> <644E>
+<D9F8> <652A>
+<D9F9> <6495>
+<D9FA> <6493>
+<D9FB> <64A5>
+<D9FC> <64A9>
+<D9FD> <6488>
+<D9FE> <64BC>
+<DAA1> <64DA>
+<DAA2> <64D2>
+<DAA3> <64C5>
+<DAA4> <64C7>
+<DAA5> <64BB>
+<DAA6> <64D8>
+<DAA7> <64C2>
+<DAA8> <64F1>
+<DAA9> <64E7>
+<DAAA> <8209>
+<DAAB> <64E0>
+<DAAC> <64E1>
+<DAAD> <62AC>
+<DAAE> <64E3>
+<DAAF> <64EF>
+<DAB0> <652C>
+<DAB1> <64F6>
+<DAB2> <64F4>
+<DAB3> <64F2>
+<DAB4> <64FA>
+<DAB5> <6500>
+endbfchar
+
+100 beginbfchar
+<DAB6> <64FD>
+<DAB7> <6518>
+<DAB8> <651C>
+<DAB9> <6505>
+<DABA> <6524>
+<DABB> <6523>
+<DABC> <652B>
+<DABD> <6534>
+<DABE> <6535>
+<DABF> <6537>
+<DAC0> <6536>
+<DAC1> <6538>
+<DAC2> <754B>
+<DAC3> <6548>
+<DAC4> <6556>
+<DAC5> <6555>
+<DAC6> <654D>
+<DAC7> <6558>
+<DAC8> <655E>
+<DAC9> <655D>
+<DACA> <6572>
+<DACB> <6578>
+<DACC> <6582>
+<DACD> <6583>
+<DACE> <8B8A>
+<DACF> <659B>
+<DAD0> <659F>
+<DAD1> <65AB>
+<DAD2> <65B7>
+<DAD3> <65C3>
+<DAD4> <65C6>
+<DAD5> <65C1>
+<DAD6> <65C4>
+<DAD7> <65CC>
+<DAD8> <65D2>
+<DAD9> <65DB>
+<DADA> <65D9>
+<DADB> <65E0>
+<DADC> <65E1>
+<DADD> <65F1>
+<DADE> <6772>
+<DADF> <660A>
+<DAE0> <6603>
+<DAE1> <65FB>
+<DAE2> <6773>
+<DAE3> <6635>
+<DAE4> <6636>
+<DAE5> <6634>
+<DAE6> <661C>
+<DAE7> <664F>
+<DAE8> <6644>
+<DAE9> <6649>
+<DAEA> <6641>
+<DAEB> <665E>
+<DAEC> <665D>
+<DAED> <6664>
+<DAEE> <6667>
+<DAEF> <6668>
+<DAF0> <665F>
+<DAF1> <6662>
+<DAF2> <6670>
+<DAF3> <6683>
+<DAF4> <6688>
+<DAF5> <668E>
+<DAF6> <6689>
+<DAF7> <6684>
+<DAF8> <6698>
+<DAF9> <669D>
+<DAFA> <66C1>
+<DAFB> <66B9>
+<DAFC> <66C9>
+<DAFD> <66BE>
+<DAFE> <66BC>
+<DBA1> <66C4>
+<DBA2> <66B8>
+<DBA3> <66D6>
+<DBA4> <66DA>
+<DBA5> <66E0>
+<DBA6> <663F>
+<DBA7> <66E6>
+<DBA8> <66E9>
+<DBA9> <66F0>
+<DBAA> <66F5>
+<DBAB> <66F7>
+<DBAC> <670F>
+<DBAD> <6716>
+<DBAE> <671E>
+<DBAF> <6726>
+<DBB0> <6727>
+<DBB1> <9738>
+<DBB2> <672E>
+<DBB3> <673F>
+<DBB4> <6736>
+<DBB5> <6741>
+<DBB6> <6738>
+<DBB7> <6737>
+<DBB8> <6746>
+<DBB9> <675E>
+<DBBA> <6760>
+<DBBB> <6759>
+endbfchar
+
+100 beginbfchar
+<DBBC> <6763>
+<DBBD> <6764>
+<DBBE> <6789>
+<DBBF> <6770>
+<DBC0> <67A9>
+<DBC1> <677C>
+<DBC2> <676A>
+<DBC3> <678C>
+<DBC4> <678B>
+<DBC5> <67A6>
+<DBC6> <67A1>
+<DBC7> <6785>
+<DBC8> <67B7>
+<DBC9> <67EF>
+<DBCA> <67B4>
+<DBCB> <67EC>
+<DBCC> <67B3>
+<DBCD> <67E9>
+<DBCE> <67B8>
+<DBCF> <67E4>
+<DBD0> <67DE>
+<DBD1> <67DD>
+<DBD2> <67E2>
+<DBD3> <67EE>
+<DBD4> <67B9>
+<DBD5> <67CE>
+<DBD6> <67C6>
+<DBD7> <67E7>
+<DBD8> <6A9C>
+<DBD9> <681E>
+<DBDA> <6846>
+<DBDB> <6829>
+<DBDC> <6840>
+<DBDD> <684D>
+<DBDE> <6832>
+<DBDF> <684E>
+<DBE0> <68B3>
+<DBE1> <682B>
+<DBE2> <6859>
+<DBE3> <6863>
+<DBE4> <6877>
+<DBE5> <687F>
+<DBE6> <689F>
+<DBE7> <688F>
+<DBE8> <68AD>
+<DBE9> <6894>
+<DBEA> <689D>
+<DBEB> <689B>
+<DBEC> <6883>
+<DBED> <6AAE>
+<DBEE> <68B9>
+<DBEF> <6874>
+<DBF0> <68B5>
+<DBF1> <68A0>
+<DBF2> <68BA>
+<DBF3> <690F>
+<DBF4> <688D>
+<DBF5> <687E>
+<DBF6> <6901>
+<DBF7> <68CA>
+<DBF8> <6908>
+<DBF9> <68D8>
+<DBFA> <6922>
+<DBFB> <6926>
+<DBFC> <68E1>
+<DBFD> <690C>
+<DBFE> <68CD>
+<DCA1> <68D4>
+<DCA2> <68E7>
+<DCA3> <68D5>
+<DCA4> <6936>
+<DCA5> <6912>
+<DCA6> <6904>
+<DCA7> <68D7>
+<DCA8> <68E3>
+<DCA9> <6925>
+<DCAA> <68F9>
+<DCAB> <68E0>
+<DCAC> <68EF>
+<DCAD> <6928>
+<DCAE> <692A>
+<DCAF> <691A>
+<DCB0> <6923>
+<DCB1> <6921>
+<DCB2> <68C6>
+<DCB3> <6979>
+<DCB4> <6977>
+<DCB5> <695C>
+<DCB6> <6978>
+<DCB7> <696B>
+<DCB8> <6954>
+<DCB9> <697E>
+<DCBA> <696E>
+<DCBB> <6939>
+<DCBC> <6974>
+<DCBD> <693D>
+<DCBE> <6959>
+<DCBF> <6930>
+<DCC0> <6961>
+<DCC1> <695E>
+endbfchar
+
+100 beginbfchar
+<DCC2> <695D>
+<DCC3> <6981>
+<DCC4> <696A>
+<DCC5> <69B2>
+<DCC6> <69AE>
+<DCC7> <69D0>
+<DCC8> <69BF>
+<DCC9> <69C1>
+<DCCA> <69D3>
+<DCCB> <69BE>
+<DCCC> <69CE>
+<DCCD> <5BE8>
+<DCCE> <69CA>
+<DCCF> <69DD>
+<DCD0> <69BB>
+<DCD1> <69C3>
+<DCD2> <69A7>
+<DCD3> <6A2E>
+<DCD4> <6991>
+<DCD5> <69A0>
+<DCD6> <699C>
+<DCD7> <6995>
+<DCD8> <69B4>
+<DCD9> <69DE>
+<DCDA> <69E8>
+<DCDB> <6A02>
+<DCDC> <6A1B>
+<DCDD> <69FF>
+<DCDE> <6B0A>
+<DCDF> <69F9>
+<DCE0> <69F2>
+<DCE1> <69E7>
+<DCE2> <6A05>
+<DCE3> <69B1>
+<DCE4> <6A1E>
+<DCE5> <69ED>
+<DCE6> <6A14>
+<DCE7> <69EB>
+<DCE8> <6A0A>
+<DCE9> <6A12>
+<DCEA> <6AC1>
+<DCEB> <6A23>
+<DCEC> <6A13>
+<DCED> <6A44>
+<DCEE> <6A0C>
+<DCEF> <6A72>
+<DCF0> <6A36>
+<DCF1> <6A78>
+<DCF2> <6A47>
+<DCF3> <6A62>
+<DCF4> <6A59>
+<DCF5> <6A66>
+<DCF6> <6A48>
+<DCF7> <6A38>
+<DCF8> <6A22>
+<DCF9> <6A90>
+<DCFA> <6A8D>
+<DCFB> <6AA0>
+<DCFC> <6A84>
+<DCFD> <6AA2>
+<DCFE> <6AA3>
+<DDA1> <6A97>
+<DDA2> <8617>
+<DDA3> <6ABB>
+<DDA4> <6AC3>
+<DDA5> <6AC2>
+<DDA6> <6AB8>
+<DDA7> <6AB3>
+<DDA8> <6AAC>
+<DDA9> <6ADE>
+<DDAA> <6AD1>
+<DDAB> <6ADF>
+<DDAC> <6AAA>
+<DDAD> <6ADA>
+<DDAE> <6AEA>
+<DDAF> <6AFB>
+<DDB0> <6B05>
+<DDB1> <8616>
+<DDB2> <6AFA>
+<DDB3> <6B12>
+<DDB4> <6B16>
+<DDB5> <9B31>
+<DDB6> <6B1F>
+<DDB7> <6B38>
+<DDB8> <6B37>
+<DDB9> <76DC>
+<DDBA> <6B39>
+<DDBB> <98EE>
+<DDBC> <6B47>
+<DDBD> <6B43>
+<DDBE> <6B49>
+<DDBF> <6B50>
+<DDC0> <6B59>
+<DDC1> <6B54>
+<DDC2> <6B5B>
+<DDC3> <6B5F>
+<DDC4> <6B61>
+<DDC5> <6B78>
+<DDC6> <6B79>
+<DDC7> <6B7F>
+endbfchar
+
+100 beginbfchar
+<DDC8> <6B80>
+<DDC9> <6B84>
+<DDCA> <6B83>
+<DDCB> <6B8D>
+<DDCC> <6B98>
+<DDCD> <6B95>
+<DDCE> <6B9E>
+<DDCF> <6BA4>
+<DDD0> <6BAA>
+<DDD1> <6BAB>
+<DDD2> <6BAF>
+<DDD3> <6BB2>
+<DDD4> <6BB1>
+<DDD5> <6BB3>
+<DDD6> <6BB7>
+<DDD7> <6BBC>
+<DDD8> <6BC6>
+<DDD9> <6BCB>
+<DDDA> <6BD3>
+<DDDB> <6BDF>
+<DDDC> <6BEC>
+<DDDD> <6BEB>
+<DDDE> <6BF3>
+<DDDF> <6BEF>
+<DDE0> <9EBE>
+<DDE1> <6C08>
+<DDE2> <6C13>
+<DDE3> <6C14>
+<DDE4> <6C1B>
+<DDE5> <6C24>
+<DDE6> <6C23>
+<DDE7> <6C5E>
+<DDE8> <6C55>
+<DDE9> <6C62>
+<DDEA> <6C6A>
+<DDEB> <6C82>
+<DDEC> <6C8D>
+<DDED> <6C9A>
+<DDEE> <6C81>
+<DDEF> <6C9B>
+<DDF0> <6C7E>
+<DDF1> <6C68>
+<DDF2> <6C73>
+<DDF3> <6C92>
+<DDF4> <6C90>
+<DDF5> <6CC4>
+<DDF6> <6CF1>
+<DDF7> <6CD3>
+<DDF8> <6CBD>
+<DDF9> <6CD7>
+<DDFA> <6CC5>
+<DDFB> <6CDD>
+<DDFC> <6CAE>
+<DDFD> <6CB1>
+<DDFE> <6CBE>
+<DEA1> <6CBA>
+<DEA2> <6CDB>
+<DEA3> <6CEF>
+<DEA4> <6CD9>
+<DEA5> <6CEA>
+<DEA6> <6D1F>
+<DEA7> <884D>
+<DEA8> <6D36>
+<DEA9> <6D2B>
+<DEAA> <6D3D>
+<DEAB> <6D38>
+<DEAC> <6D19>
+<DEAD> <6D35>
+<DEAE> <6D33>
+<DEAF> <6D12>
+<DEB0> <6D0C>
+<DEB1> <6D63>
+<DEB2> <6D93>
+<DEB3> <6D64>
+<DEB4> <6D5A>
+<DEB5> <6D79>
+<DEB6> <6D59>
+<DEB7> <6D8E>
+<DEB8> <6D95>
+<DEB9> <6FE4>
+<DEBA> <6D85>
+<DEBB> <6DF9>
+<DEBC> <6E15>
+<DEBD> <6E0A>
+<DEBE> <6DB5>
+<DEBF> <6DC7>
+<DEC0> <6DE6>
+<DEC1> <6DB8>
+<DEC2> <6DC6>
+<DEC3> <6DEC>
+<DEC4> <6DDE>
+<DEC5> <6DCC>
+<DEC6> <6DE8>
+<DEC7> <6DD2>
+<DEC8> <6DC5>
+<DEC9> <6DFA>
+<DECA> <6DD9>
+<DECB> <6DE4>
+<DECC> <6DD5>
+<DECD> <6DEA>
+endbfchar
+
+100 beginbfchar
+<DECE> <6DEE>
+<DECF> <6E2D>
+<DED0> <6E6E>
+<DED1> <6E2E>
+<DED2> <6E19>
+<DED3> <6E72>
+<DED4> <6E5F>
+<DED5> <6E3E>
+<DED6> <6E23>
+<DED7> <6E6B>
+<DED8> <6E2B>
+<DED9> <6E76>
+<DEDA> <6E4D>
+<DEDB> <6E1F>
+<DEDC> <6E43>
+<DEDD> <6E3A>
+<DEDE> <6E4E>
+<DEDF> <6E24>
+<DEE0> <6EFF>
+<DEE1> <6E1D>
+<DEE2> <6E38>
+<DEE3> <6E82>
+<DEE4> <6EAA>
+<DEE5> <6E98>
+<DEE6> <6EC9>
+<DEE7> <6EB7>
+<DEE8> <6ED3>
+<DEE9> <6EBD>
+<DEEA> <6EAF>
+<DEEB> <6EC4>
+<DEEC> <6EB2>
+<DEED> <6ED4>
+<DEEE> <6ED5>
+<DEEF> <6E8F>
+<DEF0> <6EA5>
+<DEF1> <6EC2>
+<DEF2> <6E9F>
+<DEF3> <6F41>
+<DEF4> <6F11>
+<DEF5> <704C>
+<DEF6> <6EEC>
+<DEF7> <6EF8>
+<DEF8> <6EFE>
+<DEF9> <6F3F>
+<DEFA> <6EF2>
+<DEFB> <6F31>
+<DEFC> <6EEF>
+<DEFD> <6F32>
+<DEFE> <6ECC>
+<DFA1> <6F3E>
+<DFA2> <6F13>
+<DFA3> <6EF7>
+<DFA4> <6F86>
+<DFA5> <6F7A>
+<DFA6> <6F78>
+<DFA7> <6F81>
+<DFA8> <6F80>
+<DFA9> <6F6F>
+<DFAA> <6F5B>
+<DFAB> <6FF3>
+<DFAC> <6F6D>
+<DFAD> <6F82>
+<DFAE> <6F7C>
+<DFAF> <6F58>
+<DFB0> <6F8E>
+<DFB1> <6F91>
+<DFB2> <6FC2>
+<DFB3> <6F66>
+<DFB4> <6FB3>
+<DFB5> <6FA3>
+<DFB6> <6FA1>
+<DFB7> <6FA4>
+<DFB8> <6FB9>
+<DFB9> <6FC6>
+<DFBA> <6FAA>
+<DFBB> <6FDF>
+<DFBC> <6FD5>
+<DFBD> <6FEC>
+<DFBE> <6FD4>
+<DFBF> <6FD8>
+<DFC0> <6FF1>
+<DFC1> <6FEE>
+<DFC2> <6FDB>
+<DFC3> <7009>
+<DFC4> <700B>
+<DFC5> <6FFA>
+<DFC6> <7011>
+<DFC7> <7001>
+<DFC8> <700F>
+<DFC9> <6FFE>
+<DFCA> <701B>
+<DFCB> <701A>
+<DFCC> <6F74>
+<DFCD> <701D>
+<DFCE> <7018>
+<DFCF> <701F>
+<DFD0> <7030>
+<DFD1> <703E>
+<DFD2> <7032>
+<DFD3> <7051>
+endbfchar
+
+100 beginbfchar
+<DFD4> <7063>
+<DFD5> <7099>
+<DFD6> <7092>
+<DFD7> <70AF>
+<DFD8> <70F1>
+<DFD9> <70AC>
+<DFDA> <70B8>
+<DFDB> <70B3>
+<DFDC> <70AE>
+<DFDD> <70DF>
+<DFDE> <70CB>
+<DFDF> <70DD>
+<DFE0> <70D9>
+<DFE1> <7109>
+<DFE2> <70FD>
+<DFE3> <711C>
+<DFE4> <7119>
+<DFE5> <7165>
+<DFE6> <7155>
+<DFE7> <7188>
+<DFE8> <7166>
+<DFE9> <7162>
+<DFEA> <714C>
+<DFEB> <7156>
+<DFEC> <716C>
+<DFED> <718F>
+<DFEE> <71FB>
+<DFEF> <7184>
+<DFF0> <7195>
+<DFF1> <71A8>
+<DFF2> <71AC>
+<DFF3> <71D7>
+<DFF4> <71B9>
+<DFF5> <71BE>
+<DFF6> <71D2>
+<DFF7> <71C9>
+<DFF8> <71D4>
+<DFF9> <71CE>
+<DFFA> <71E0>
+<DFFB> <71EC>
+<DFFC> <71E7>
+<DFFD> <71F5>
+<DFFE> <71FC>
+<E0A1> <71F9>
+<E0A2> <71FF>
+<E0A3> <720D>
+<E0A4> <7210>
+<E0A5> <721B>
+<E0A6> <7228>
+<E0A7> <722D>
+<E0A8> <722C>
+<E0A9> <7230>
+<E0AA> <7232>
+<E0AB> <723B>
+<E0AC> <723C>
+<E0AD> <723F>
+<E0AE> <7240>
+<E0AF> <7246>
+<E0B0> <724B>
+<E0B1> <7258>
+<E0B2> <7274>
+<E0B3> <727E>
+<E0B4> <7282>
+<E0B5> <7281>
+<E0B6> <7287>
+<E0B7> <7292>
+<E0B8> <7296>
+<E0B9> <72A2>
+<E0BA> <72A7>
+<E0BB> <72B9>
+<E0BC> <72B2>
+<E0BD> <72C3>
+<E0BE> <72C6>
+<E0BF> <72C4>
+<E0C0> <72CE>
+<E0C1> <72D2>
+<E0C2> <72E2>
+<E0C3> <72E0>
+<E0C4> <72E1>
+<E0C5> <72F9>
+<E0C6> <72F7>
+<E0C7> <500F>
+<E0C8> <7317>
+<E0C9> <730A>
+<E0CA> <731C>
+<E0CB> <7316>
+<E0CC> <731D>
+<E0CD> <7334>
+<E0CE> <732F>
+<E0CF> <7329>
+<E0D0> <7325>
+<E0D1> <733E>
+<E0D2> <734E>
+<E0D3> <734F>
+<E0D4> <9ED8>
+<E0D5> <7357>
+<E0D6> <736A>
+<E0D7> <7368>
+<E0D8> <7370>
+<E0D9> <7378>
+endbfchar
+
+100 beginbfchar
+<E0DA> <7375>
+<E0DB> <737B>
+<E0DC> <737A>
+<E0DD> <73C8>
+<E0DE> <73B3>
+<E0DF> <73CE>
+<E0E0> <73BB>
+<E0E1> <73C0>
+<E0E2> <73E5>
+<E0E3> <73EE>
+<E0E4> <73DE>
+<E0E5> <74A2>
+<E0E6> <7405>
+<E0E7> <746F>
+<E0E8> <7425>
+<E0E9> <73F8>
+<E0EA> <7432>
+<E0EB> <743A>
+<E0EC> <7455>
+<E0ED> <743F>
+<E0EE> <745F>
+<E0EF> <7459>
+<E0F0> <7441>
+<E0F1> <745C>
+<E0F2> <7469>
+<E0F3> <7470>
+<E0F4> <7463>
+<E0F5> <746A>
+<E0F6> <7476>
+<E0F7> <747E>
+<E0F8> <748B>
+<E0F9> <749E>
+<E0FA> <74A7>
+<E0FB> <74CA>
+<E0FC> <74CF>
+<E0FD> <74D4>
+<E0FE> <73F1>
+<E1A1> <74E0>
+<E1A2> <74E3>
+<E1A3> <74E7>
+<E1A4> <74E9>
+<E1A5> <74EE>
+<E1A6> <74F2>
+<E1A7> <74F0>
+<E1A8> <74F1>
+<E1A9> <74F8>
+<E1AA> <74F7>
+<E1AB> <7504>
+<E1AC> <7503>
+<E1AD> <7505>
+<E1AE> <750C>
+<E1AF> <750E>
+<E1B0> <750D>
+<E1B1> <7515>
+<E1B2> <7513>
+<E1B3> <751E>
+<E1B4> <7526>
+<E1B5> <752C>
+<E1B6> <753C>
+<E1B7> <7544>
+<E1B8> <754D>
+<E1B9> <754A>
+<E1BA> <7549>
+<E1BB> <755B>
+<E1BC> <7546>
+<E1BD> <755A>
+<E1BE> <7569>
+<E1BF> <7564>
+<E1C0> <7567>
+<E1C1> <756B>
+<E1C2> <756D>
+<E1C3> <7578>
+<E1C4> <7576>
+<E1C5> <7586>
+<E1C6> <7587>
+<E1C7> <7574>
+<E1C8> <758A>
+<E1C9> <7589>
+<E1CA> <7582>
+<E1CB> <7594>
+<E1CC> <759A>
+<E1CD> <759D>
+<E1CE> <75A5>
+<E1CF> <75A3>
+<E1D0> <75C2>
+<E1D1> <75B3>
+<E1D2> <75C3>
+<E1D3> <75B5>
+<E1D4> <75BD>
+<E1D5> <75B8>
+<E1D6> <75BC>
+<E1D7> <75B1>
+<E1D8> <75CD>
+<E1D9> <75CA>
+<E1DA> <75D2>
+<E1DB> <75D9>
+<E1DC> <75E3>
+<E1DD> <75DE>
+<E1DE> <75FE>
+<E1DF> <75FF>
+endbfchar
+
+100 beginbfchar
+<E1E0> <75FC>
+<E1E1> <7601>
+<E1E2> <75F0>
+<E1E3> <75FA>
+<E1E4> <75F2>
+<E1E5> <75F3>
+<E1E6> <760B>
+<E1E7> <760D>
+<E1E8> <7609>
+<E1E9> <761F>
+<E1EA> <7627>
+<E1EB> <7620>
+<E1EC> <7621>
+<E1ED> <7622>
+<E1EE> <7624>
+<E1EF> <7634>
+<E1F0> <7630>
+<E1F1> <763B>
+<E1F2> <7647>
+<E1F3> <7648>
+<E1F4> <7646>
+<E1F5> <765C>
+<E1F6> <7658>
+<E1F7> <7661>
+<E1F8> <7662>
+<E1F9> <7668>
+<E1FA> <7669>
+<E1FB> <766A>
+<E1FC> <7667>
+<E1FD> <766C>
+<E1FE> <7670>
+<E2A1> <7672>
+<E2A2> <7676>
+<E2A3> <7678>
+<E2A4> <767C>
+<E2A5> <7680>
+<E2A6> <7683>
+<E2A7> <7688>
+<E2A8> <768B>
+<E2A9> <768E>
+<E2AA> <7696>
+<E2AB> <7693>
+<E2AC> <7699>
+<E2AD> <769A>
+<E2AE> <76B0>
+<E2AF> <76B4>
+<E2B0> <76B8>
+<E2B1> <76B9>
+<E2B2> <76BA>
+<E2B3> <76C2>
+<E2B4> <76CD>
+<E2B5> <76D6>
+<E2B6> <76D2>
+<E2B7> <76DE>
+<E2B8> <76E1>
+<E2B9> <76E5>
+<E2BA> <76E7>
+<E2BB> <76EA>
+<E2BC> <862F>
+<E2BD> <76FB>
+<E2BE> <7708>
+<E2BF> <7707>
+<E2C0> <7704>
+<E2C1> <7729>
+<E2C2> <7724>
+<E2C3> <771E>
+<E2C4> <7725>
+<E2C5> <7726>
+<E2C6> <771B>
+<E2C7> <7737>
+<E2C8> <7738>
+<E2C9> <7747>
+<E2CA> <775A>
+<E2CB> <7768>
+<E2CC> <776B>
+<E2CD> <775B>
+<E2CE> <7765>
+<E2CF> <777F>
+<E2D0> <777E>
+<E2D1> <7779>
+<E2D2> <778E>
+<E2D3> <778B>
+<E2D4> <7791>
+<E2D5> <77A0>
+<E2D6> <779E>
+<E2D7> <77B0>
+<E2D8> <77B6>
+<E2D9> <77B9>
+<E2DA> <77BF>
+<E2DB> <77BC>
+<E2DC> <77BD>
+<E2DD> <77BB>
+<E2DE> <77C7>
+<E2DF> <77CD>
+<E2E0> <77D7>
+<E2E1> <77DA>
+<E2E2> <77DC>
+<E2E3> <77E3>
+<E2E4> <77EE>
+<E2E5> <77FC>
+endbfchar
+
+100 beginbfchar
+<E2E6> <780C>
+<E2E7> <7812>
+<E2E8> <7926>
+<E2E9> <7820>
+<E2EA> <792A>
+<E2EB> <7845>
+<E2EC> <788E>
+<E2ED> <7874>
+<E2EE> <7886>
+<E2EF> <787C>
+<E2F0> <789A>
+<E2F1> <788C>
+<E2F2> <78A3>
+<E2F3> <78B5>
+<E2F4> <78AA>
+<E2F5> <78AF>
+<E2F6> <78D1>
+<E2F7> <78C6>
+<E2F8> <78CB>
+<E2F9> <78D4>
+<E2FA> <78BE>
+<E2FB> <78BC>
+<E2FC> <78C5>
+<E2FD> <78CA>
+<E2FE> <78EC>
+<E3A1> <78E7>
+<E3A2> <78DA>
+<E3A3> <78FD>
+<E3A4> <78F4>
+<E3A5> <7907>
+<E3A6> <7912>
+<E3A7> <7911>
+<E3A8> <7919>
+<E3A9> <792C>
+<E3AA> <792B>
+<E3AB> <7940>
+<E3AC> <7960>
+<E3AD> <7957>
+<E3AE> <795F>
+<E3AF> <795A>
+<E3B0> <7955>
+<E3B1> <7953>
+<E3B2> <797A>
+<E3B3> <797F>
+<E3B4> <798A>
+<E3B5> <799D>
+<E3B6> <79A7>
+<E3B7> <9F4B>
+<E3B8> <79AA>
+<E3B9> <79AE>
+<E3BA> <79B3>
+<E3BB> <79B9>
+<E3BC> <79BA>
+<E3BD> <79C9>
+<E3BE> <79D5>
+<E3BF> <79E7>
+<E3C0> <79EC>
+<E3C1> <79E1>
+<E3C2> <79E3>
+<E3C3> <7A08>
+<E3C4> <7A0D>
+<E3C5> <7A18>
+<E3C6> <7A19>
+<E3C7> <7A20>
+<E3C8> <7A1F>
+<E3C9> <7980>
+<E3CA> <7A31>
+<E3CB> <7A3B>
+<E3CC> <7A3E>
+<E3CD> <7A37>
+<E3CE> <7A43>
+<E3CF> <7A57>
+<E3D0> <7A49>
+<E3D1> <7A61>
+<E3D2> <7A62>
+<E3D3> <7A69>
+<E3D4> <9F9D>
+<E3D5> <7A70>
+<E3D6> <7A79>
+<E3D7> <7A7D>
+<E3D8> <7A88>
+<E3D9> <7A97>
+<E3DA> <7A95>
+<E3DB> <7A98>
+<E3DC> <7A96>
+<E3DD> <7AA9>
+<E3DE> <7AC8>
+<E3DF> <7AB0>
+<E3E0> <7AB6>
+<E3E1> <7AC5>
+<E3E2> <7AC4>
+<E3E3> <7ABF>
+<E3E4> <9083>
+<E3E5> <7AC7>
+<E3E6> <7ACA>
+<E3E7> <7ACD>
+<E3E8> <7ACF>
+<E3E9> <7AD5>
+<E3EA> <7AD3>
+<E3EB> <7AD9>
+endbfchar
+
+100 beginbfchar
+<E3EC> <7ADA>
+<E3ED> <7ADD>
+<E3EE> <7AE1>
+<E3EF> <7AE2>
+<E3F0> <7AE6>
+<E3F1> <7AED>
+<E3F2> <7AF0>
+<E3F3> <7B02>
+<E3F4> <7B0F>
+<E3F5> <7B0A>
+<E3F6> <7B06>
+<E3F7> <7B33>
+<E3F8> <7B18>
+<E3F9> <7B19>
+<E3FA> <7B1E>
+<E3FB> <7B35>
+<E3FC> <7B28>
+<E3FD> <7B36>
+<E3FE> <7B50>
+<E4A1> <7B7A>
+<E4A2> <7B04>
+<E4A3> <7B4D>
+<E4A4> <7B0B>
+<E4A5> <7B4C>
+<E4A6> <7B45>
+<E4A7> <7B75>
+<E4A8> <7B65>
+<E4A9> <7B74>
+<E4AA> <7B67>
+<E4AB> <7B70>
+<E4AC> <7B71>
+<E4AD> <7B6C>
+<E4AE> <7B6E>
+<E4AF> <7B9D>
+<E4B0> <7B98>
+<E4B1> <7B9F>
+<E4B2> <7B8D>
+<E4B3> <7B9C>
+<E4B4> <7B9A>
+<E4B5> <7B8B>
+<E4B6> <7B92>
+<E4B7> <7B8F>
+<E4B8> <7B5D>
+<E4B9> <7B99>
+<E4BA> <7BCB>
+<E4BB> <7BC1>
+<E4BC> <7BCC>
+<E4BD> <7BCF>
+<E4BE> <7BB4>
+<E4BF> <7BC6>
+<E4C0> <7BDD>
+<E4C1> <7BE9>
+<E4C2> <7C11>
+<E4C3> <7C14>
+<E4C4> <7BE6>
+<E4C5> <7BE5>
+<E4C6> <7C60>
+<E4C7> <7C00>
+<E4C8> <7C07>
+<E4C9> <7C13>
+<E4CA> <7BF3>
+<E4CB> <7BF7>
+<E4CC> <7C17>
+<E4CD> <7C0D>
+<E4CE> <7BF6>
+<E4CF> <7C23>
+<E4D0> <7C27>
+<E4D1> <7C2A>
+<E4D2> <7C1F>
+<E4D3> <7C37>
+<E4D4> <7C2B>
+<E4D5> <7C3D>
+<E4D6> <7C4C>
+<E4D7> <7C43>
+<E4D8> <7C54>
+<E4D9> <7C4F>
+<E4DA> <7C40>
+<E4DB> <7C50>
+<E4DC> <7C58>
+<E4DD> <7C5F>
+<E4DE> <7C64>
+<E4DF> <7C56>
+<E4E0> <7C65>
+<E4E1> <7C6C>
+<E4E2> <7C75>
+<E4E3> <7C83>
+<E4E4> <7C90>
+<E4E5> <7CA4>
+<E4E6> <7CAD>
+<E4E7> <7CA2>
+<E4E8> <7CAB>
+<E4E9> <7CA1>
+<E4EA> <7CA8>
+<E4EB> <7CB3>
+<E4EC> <7CB2>
+<E4ED> <7CB1>
+<E4EE> <7CAE>
+<E4EF> <7CB9>
+<E4F0> <7CBD>
+<E4F1> <7CC0>
+endbfchar
+
+100 beginbfchar
+<E4F2> <7CC5>
+<E4F3> <7CC2>
+<E4F4> <7CD8>
+<E4F5> <7CD2>
+<E4F6> <7CDC>
+<E4F7> <7CE2>
+<E4F8> <9B3B>
+<E4F9> <7CEF>
+<E4FA> <7CF2>
+<E4FB> <7CF4>
+<E4FC> <7CF6>
+<E4FD> <7CFA>
+<E4FE> <7D06>
+<E5A1> <7D02>
+<E5A2> <7D1C>
+<E5A3> <7D15>
+<E5A4> <7D0A>
+<E5A5> <7D45>
+<E5A6> <7D4B>
+<E5A7> <7D2E>
+<E5A8> <7D32>
+<E5A9> <7D3F>
+<E5AA> <7D35>
+<E5AB> <7D46>
+<E5AC> <7D73>
+<E5AD> <7D56>
+<E5AE> <7D4E>
+<E5AF> <7D72>
+<E5B0> <7D68>
+<E5B1> <7D6E>
+<E5B2> <7D4F>
+<E5B3> <7D63>
+<E5B4> <7D93>
+<E5B5> <7D89>
+<E5B6> <7D5B>
+<E5B7> <7D8F>
+<E5B8> <7D7D>
+<E5B9> <7D9B>
+<E5BA> <7DBA>
+<E5BB> <7DAE>
+<E5BC> <7DA3>
+<E5BD> <7DB5>
+<E5BE> <7DC7>
+<E5BF> <7DBD>
+<E5C0> <7DAB>
+<E5C1> <7E3D>
+<E5C2> <7DA2>
+<E5C3> <7DAF>
+<E5C4> <7DDC>
+<E5C5> <7DB8>
+<E5C6> <7D9F>
+<E5C7> <7DB0>
+<E5C8> <7DD8>
+<E5C9> <7DDD>
+<E5CA> <7DE4>
+<E5CB> <7DDE>
+<E5CC> <7DFB>
+<E5CD> <7DF2>
+<E5CE> <7DE1>
+<E5CF> <7E05>
+<E5D0> <7E0A>
+<E5D1> <7E23>
+<E5D2> <7E21>
+<E5D3> <7E12>
+<E5D4> <7E31>
+<E5D5> <7E1F>
+<E5D6> <7E09>
+<E5D7> <7E0B>
+<E5D8> <7E22>
+<E5D9> <7E46>
+<E5DA> <7E66>
+<E5DB> <7E3B>
+<E5DC> <7E35>
+<E5DD> <7E39>
+<E5DE> <7E43>
+<E5DF> <7E37>
+<E5E0> <7E32>
+<E5E1> <7E3A>
+<E5E2> <7E67>
+<E5E3> <7E5D>
+<E5E4> <7E56>
+<E5E5> <7E5E>
+<E5E6> <7E59>
+<E5E7> <7E5A>
+<E5E8> <7E79>
+<E5E9> <7E6A>
+<E5EA> <7E69>
+<E5EB> <7E7C>
+<E5EC> <7E7B>
+<E5ED> <7E83>
+<E5EE> <7DD5>
+<E5EF> <7E7D>
+<E5F0> <8FAE>
+<E5F1> <7E7F>
+<E5F2> <7E88>
+<E5F3> <7E89>
+<E5F4> <7E8C>
+<E5F5> <7E92>
+<E5F6> <7E90>
+<E5F7> <7E93>
+endbfchar
+
+100 beginbfchar
+<E5F8> <7E94>
+<E5F9> <7E96>
+<E5FA> <7E8E>
+<E5FB> <7E9B>
+<E5FC> <7E9C>
+<E5FD> <7F38>
+<E5FE> <7F3A>
+<E6A1> <7F45>
+<E6A2> <7F4C>
+<E6A3> <7F4D>
+<E6A4> <7F4E>
+<E6A5> <7F50>
+<E6A6> <7F51>
+<E6A7> <7F55>
+<E6A8> <7F54>
+<E6A9> <7F58>
+<E6AA> <7F5F>
+<E6AB> <7F60>
+<E6AC> <7F68>
+<E6AD> <7F69>
+<E6AE> <7F67>
+<E6AF> <7F78>
+<E6B0> <7F82>
+<E6B1> <7F86>
+<E6B2> <7F83>
+<E6B3> <7F88>
+<E6B4> <7F87>
+<E6B5> <7F8C>
+<E6B6> <7F94>
+<E6B7> <7F9E>
+<E6B8> <7F9D>
+<E6B9> <7F9A>
+<E6BA> <7FA3>
+<E6BB> <7FAF>
+<E6BC> <7FB2>
+<E6BD> <7FB9>
+<E6BE> <7FAE>
+<E6BF> <7FB6>
+<E6C0> <7FB8>
+<E6C1> <8B71>
+<E6C2> <7FC5>
+<E6C3> <7FC6>
+<E6C4> <7FCA>
+<E6C5> <7FD5>
+<E6C6> <7FD4>
+<E6C7> <7FE1>
+<E6C8> <7FE6>
+<E6C9> <7FE9>
+<E6CA> <7FF3>
+<E6CB> <7FF9>
+<E6CC> <98DC>
+<E6CD> <8006>
+<E6CE> <8004>
+<E6CF> <800B>
+<E6D0> <8012>
+<E6D1> <8018>
+<E6D2> <8019>
+<E6D3> <801C>
+<E6D4> <8021>
+<E6D5> <8028>
+<E6D6> <803F>
+<E6D7> <803B>
+<E6D8> <804A>
+<E6D9> <8046>
+<E6DA> <8052>
+<E6DB> <8058>
+<E6DC> <805A>
+<E6DD> <805F>
+<E6DE> <8062>
+<E6DF> <8068>
+<E6E0> <8073>
+<E6E1> <8072>
+<E6E2> <8070>
+<E6E3> <8076>
+<E6E4> <8079>
+<E6E5> <807D>
+<E6E6> <807F>
+<E6E7> <8084>
+<E6E8> <8086>
+<E6E9> <8085>
+<E6EA> <809B>
+<E6EB> <8093>
+<E6EC> <809A>
+<E6ED> <80AD>
+<E6EE> <5190>
+<E6EF> <80AC>
+<E6F0> <80DB>
+<E6F1> <80E5>
+<E6F2> <80D9>
+<E6F3> <80DD>
+<E6F4> <80C4>
+<E6F5> <80DA>
+<E6F6> <80D6>
+<E6F7> <8109>
+<E6F8> <80EF>
+<E6F9> <80F1>
+<E6FA> <811B>
+<E6FB> <8129>
+<E6FC> <8123>
+<E6FD> <812F>
+endbfchar
+
+100 beginbfchar
+<E6FE> <814B>
+<E7A1> <968B>
+<E7A2> <8146>
+<E7A3> <813E>
+<E7A4> <8153>
+<E7A5> <8151>
+<E7A6> <80FC>
+<E7A7> <8171>
+<E7A8> <816E>
+<E7A9> <8165>
+<E7AA> <8166>
+<E7AB> <8174>
+<E7AC> <8183>
+<E7AD> <8188>
+<E7AE> <818A>
+<E7AF> <8180>
+<E7B0> <8182>
+<E7B1> <81A0>
+<E7B2> <8195>
+<E7B3> <81A4>
+<E7B4> <81A3>
+<E7B5> <815F>
+<E7B6> <8193>
+<E7B7> <81A9>
+<E7B8> <81B0>
+<E7B9> <81B5>
+<E7BA> <81BE>
+<E7BB> <81B8>
+<E7BC> <81BD>
+<E7BD> <81C0>
+<E7BE> <81C2>
+<E7BF> <81BA>
+<E7C0> <81C9>
+<E7C1> <81CD>
+<E7C2> <81D1>
+<E7C3> <81D9>
+<E7C4> <81D8>
+<E7C5> <81C8>
+<E7C6> <81DA>
+<E7C7> <81DF>
+<E7C8> <81E0>
+<E7C9> <81E7>
+<E7CA> <81FA>
+<E7CB> <81FB>
+<E7CC> <81FE>
+<E7CD> <8201>
+<E7CE> <8202>
+<E7CF> <8205>
+<E7D0> <8207>
+<E7D1> <820A>
+<E7D2> <820D>
+<E7D3> <8210>
+<E7D4> <8216>
+<E7D5> <8229>
+<E7D6> <822B>
+<E7D7> <8238>
+<E7D8> <8233>
+<E7D9> <8240>
+<E7DA> <8259>
+<E7DB> <8258>
+<E7DC> <825D>
+<E7DD> <825A>
+<E7DE> <825F>
+<E7DF> <8264>
+<E7E0> <8262>
+<E7E1> <8268>
+<E7E2> <826A>
+<E7E3> <826B>
+<E7E4> <822E>
+<E7E5> <8271>
+<E7E6> <8277>
+<E7E7> <8278>
+<E7E8> <827E>
+<E7E9> <828D>
+<E7EA> <8292>
+<E7EB> <82AB>
+<E7EC> <829F>
+<E7ED> <82BB>
+<E7EE> <82AC>
+<E7EF> <82E1>
+<E7F0> <82E3>
+<E7F1> <82DF>
+<E7F2> <82D2>
+<E7F3> <82F4>
+<E7F4> <82F3>
+<E7F5> <82FA>
+<E7F6> <8393>
+<E7F7> <8303>
+<E7F8> <82FB>
+<E7F9> <82F9>
+<E7FA> <82DE>
+<E7FB> <8306>
+<E7FC> <82DC>
+<E7FD> <8309>
+<E7FE> <82D9>
+<E8A1> <8335>
+<E8A2> <8334>
+<E8A3> <8316>
+<E8A4> <8332>
+<E8A5> <8331>
+endbfchar
+
+100 beginbfchar
+<E8A6> <8340>
+<E8A7> <8339>
+<E8A8> <8350>
+<E8A9> <8345>
+<E8AA> <832F>
+<E8AB> <832B>
+<E8AC> <8317>
+<E8AD> <8318>
+<E8AE> <8385>
+<E8AF> <839A>
+<E8B0> <83AA>
+<E8B1> <839F>
+<E8B2> <83A2>
+<E8B3> <8396>
+<E8B4> <8323>
+<E8B5> <838E>
+<E8B6> <8387>
+<E8B7> <838A>
+<E8B8> <837C>
+<E8B9> <83B5>
+<E8BA> <8373>
+<E8BB> <8375>
+<E8BC> <83A0>
+<E8BD> <8389>
+<E8BE> <83A8>
+<E8BF> <83F4>
+<E8C0> <8413>
+<E8C1> <83EB>
+<E8C2> <83CE>
+<E8C3> <83FD>
+<E8C4> <8403>
+<E8C5> <83D8>
+<E8C6> <840B>
+<E8C7> <83C1>
+<E8C8> <83F7>
+<E8C9> <8407>
+<E8CA> <83E0>
+<E8CB> <83F2>
+<E8CC> <840D>
+<E8CD> <8422>
+<E8CE> <8420>
+<E8CF> <83BD>
+<E8D0> <8438>
+<E8D1> <8506>
+<E8D2> <83FB>
+<E8D3> <846D>
+<E8D4> <842A>
+<E8D5> <843C>
+<E8D6> <855A>
+<E8D7> <8484>
+<E8D8> <8477>
+<E8D9> <846B>
+<E8DA> <84AD>
+<E8DB> <846E>
+<E8DC> <8482>
+<E8DD> <8469>
+<E8DE> <8446>
+<E8DF> <842C>
+<E8E0> <846F>
+<E8E1> <8479>
+<E8E2> <8435>
+<E8E3> <84CA>
+<E8E4> <8462>
+<E8E5> <84B9>
+<E8E6> <84BF>
+<E8E7> <849F>
+<E8E8> <84D9>
+<E8E9> <84CD>
+<E8EA> <84BB>
+<E8EB> <84DA>
+<E8EC> <84D0>
+<E8ED> <84C1>
+<E8EE> <84C6>
+<E8EF> <84D6>
+<E8F0> <84A1>
+<E8F1> <8521>
+<E8F2> <84FF>
+<E8F3> <84F4>
+<E8F4> <8517>
+<E8F5> <8518>
+<E8F6> <852C>
+<E8F7> <851F>
+<E8F8> <8515>
+<E8F9> <8514>
+<E8FA> <84FC>
+<E8FB> <8540>
+<E8FC> <8563>
+<E8FD> <8558>
+<E8FE> <8548>
+<E9A1> <8541>
+<E9A2> <8602>
+<E9A3> <854B>
+<E9A4> <8555>
+<E9A5> <8580>
+<E9A6> <85A4>
+<E9A7> <8588>
+<E9A8> <8591>
+<E9A9> <858A>
+<E9AA> <85A8>
+<E9AB> <856D>
+endbfchar
+
+100 beginbfchar
+<E9AC> <8594>
+<E9AD> <859B>
+<E9AE> <85EA>
+<E9AF> <8587>
+<E9B0> <859C>
+<E9B1> <8577>
+<E9B2> <857E>
+<E9B3> <8590>
+<E9B4> <85C9>
+<E9B5> <85BA>
+<E9B6> <85CF>
+<E9B7> <85B9>
+<E9B8> <85D0>
+<E9B9> <85D5>
+<E9BA> <85DD>
+<E9BB> <85E5>
+<E9BC> <85DC>
+<E9BD> <85F9>
+<E9BE> <860A>
+<E9BF> <8613>
+<E9C0> <860B>
+<E9C1> <85FE>
+<E9C2> <85FA>
+<E9C3> <8606>
+<E9C4> <8622>
+<E9C5> <861A>
+<E9C6> <8630>
+<E9C7> <863F>
+<E9C8> <864D>
+<E9C9> <4E55>
+<E9CA> <8654>
+<E9CB> <865F>
+<E9CC> <8667>
+<E9CD> <8671>
+<E9CE> <8693>
+<E9CF> <86A3>
+<E9D0> <86A9>
+<E9D1> <86AA>
+<E9D2> <868B>
+<E9D3> <868C>
+<E9D4> <86B6>
+<E9D5> <86AF>
+<E9D6> <86C4>
+<E9D7> <86C6>
+<E9D8> <86B0>
+<E9D9> <86C9>
+<E9DA> <8823>
+<E9DB> <86AB>
+<E9DC> <86D4>
+<E9DD> <86DE>
+<E9DE> <86E9>
+<E9DF> <86EC>
+<E9E0> <86DF>
+<E9E1> <86DB>
+<E9E2> <86EF>
+<E9E3> <8712>
+<E9E4> <8706>
+<E9E5> <8708>
+<E9E6> <8700>
+<E9E7> <8703>
+<E9E8> <86FB>
+<E9E9> <8711>
+<E9EA> <8709>
+<E9EB> <870D>
+<E9EC> <86F9>
+<E9ED> <870A>
+<E9EE> <8734>
+<E9EF> <873F>
+<E9F0> <8737>
+<E9F1> <873B>
+<E9F2> <8725>
+<E9F3> <8729>
+<E9F4> <871A>
+<E9F5> <8760>
+<E9F6> <875F>
+<E9F7> <8778>
+<E9F8> <874C>
+<E9F9> <874E>
+<E9FA> <8774>
+<E9FB> <8757>
+<E9FC> <8768>
+<E9FD> <876E>
+<E9FE> <8759>
+<EAA1> <8753>
+<EAA2> <8763>
+<EAA3> <876A>
+<EAA4> <8805>
+<EAA5> <87A2>
+<EAA6> <879F>
+<EAA7> <8782>
+<EAA8> <87AF>
+<EAA9> <87CB>
+<EAAA> <87BD>
+<EAAB> <87C0>
+<EAAC> <87D0>
+<EAAD> <96D6>
+<EAAE> <87AB>
+<EAAF> <87C4>
+<EAB0> <87B3>
+<EAB1> <87C7>
+endbfchar
+
+100 beginbfchar
+<EAB2> <87C6>
+<EAB3> <87BB>
+<EAB4> <87EF>
+<EAB5> <87F2>
+<EAB6> <87E0>
+<EAB7> <880F>
+<EAB8> <880D>
+<EAB9> <87FE>
+<EABA> <87F6>
+<EABB> <87F7>
+<EABC> <880E>
+<EABD> <87D2>
+<EABE> <8811>
+<EABF> <8816>
+<EAC0> <8815>
+<EAC1> <8822>
+<EAC2> <8821>
+<EAC3> <8831>
+<EAC4> <8836>
+<EAC5> <8839>
+<EAC6> <8827>
+<EAC7> <883B>
+<EAC8> <8844>
+<EAC9> <8842>
+<EACA> <8852>
+<EACB> <8859>
+<EACC> <885E>
+<EACD> <8862>
+<EACE> <886B>
+<EACF> <8881>
+<EAD0> <887E>
+<EAD1> <889E>
+<EAD2> <8875>
+<EAD3> <887D>
+<EAD4> <88B5>
+<EAD5> <8872>
+<EAD6> <8882>
+<EAD7> <8897>
+<EAD8> <8892>
+<EAD9> <88AE>
+<EADA> <8899>
+<EADB> <88A2>
+<EADC> <888D>
+<EADD> <88A4>
+<EADE> <88B0>
+<EADF> <88BF>
+<EAE0> <88B1>
+<EAE1> <88C3>
+<EAE2> <88C4>
+<EAE3> <88D4>
+<EAE4> <88D8>
+<EAE5> <88D9>
+<EAE6> <88DD>
+<EAE7> <88F9>
+<EAE8> <8902>
+<EAE9> <88FC>
+<EAEA> <88F4>
+<EAEB> <88E8>
+<EAEC> <88F2>
+<EAED> <8904>
+<EAEE> <890C>
+<EAEF> <890A>
+<EAF0> <8913>
+<EAF1> <8943>
+<EAF2> <891E>
+<EAF3> <8925>
+<EAF4> <892A>
+<EAF5> <892B>
+<EAF6> <8941>
+<EAF7> <8944>
+<EAF8> <893B>
+<EAF9> <8936>
+<EAFA> <8938>
+<EAFB> <894C>
+<EAFC> <891D>
+<EAFD> <8960>
+<EAFE> <895E>
+<EBA1> <8966>
+<EBA2> <8964>
+<EBA3> <896D>
+<EBA4> <896A>
+<EBA5> <896F>
+<EBA6> <8974>
+<EBA7> <8977>
+<EBA8> <897E>
+<EBA9> <8983>
+<EBAA> <8988>
+<EBAB> <898A>
+<EBAC> <8993>
+<EBAD> <8998>
+<EBAE> <89A1>
+<EBAF> <89A9>
+<EBB0> <89A6>
+<EBB1> <89AC>
+<EBB2> <89AF>
+<EBB3> <89B2>
+<EBB4> <89BA>
+<EBB5> <89BD>
+<EBB6> <89BF>
+<EBB7> <89C0>
+endbfchar
+
+100 beginbfchar
+<EBB8> <89DA>
+<EBB9> <89DC>
+<EBBA> <89DD>
+<EBBB> <89E7>
+<EBBC> <89F4>
+<EBBD> <89F8>
+<EBBE> <8A03>
+<EBBF> <8A16>
+<EBC0> <8A10>
+<EBC1> <8A0C>
+<EBC2> <8A1B>
+<EBC3> <8A1D>
+<EBC4> <8A25>
+<EBC5> <8A36>
+<EBC6> <8A41>
+<EBC7> <8A5B>
+<EBC8> <8A52>
+<EBC9> <8A46>
+<EBCA> <8A48>
+<EBCB> <8A7C>
+<EBCC> <8A6D>
+<EBCD> <8A6C>
+<EBCE> <8A62>
+<EBCF> <8A85>
+<EBD0> <8A82>
+<EBD1> <8A84>
+<EBD2> <8AA8>
+<EBD3> <8AA1>
+<EBD4> <8A91>
+<EBD5> <8AA5>
+<EBD6> <8AA6>
+<EBD7> <8A9A>
+<EBD8> <8AA3>
+<EBD9> <8AC4>
+<EBDA> <8ACD>
+<EBDB> <8AC2>
+<EBDC> <8ADA>
+<EBDD> <8AEB>
+<EBDE> <8AF3>
+<EBDF> <8AE7>
+<EBE0> <8AE4>
+<EBE1> <8AF1>
+<EBE2> <8B14>
+<EBE3> <8AE0>
+<EBE4> <8AE2>
+<EBE5> <8AF7>
+<EBE6> <8ADE>
+<EBE7> <8ADB>
+<EBE8> <8B0C>
+<EBE9> <8B07>
+<EBEA> <8B1A>
+<EBEB> <8AE1>
+<EBEC> <8B16>
+<EBED> <8B10>
+<EBEE> <8B17>
+<EBEF> <8B20>
+<EBF0> <8B33>
+<EBF1> <97AB>
+<EBF2> <8B26>
+<EBF3> <8B2B>
+<EBF4> <8B3E>
+<EBF5> <8B28>
+<EBF6> <8B41>
+<EBF7> <8B4C>
+<EBF8> <8B4F>
+<EBF9> <8B4E>
+<EBFA> <8B49>
+<EBFB> <8B56>
+<EBFC> <8B5B>
+<EBFD> <8B5A>
+<EBFE> <8B6B>
+<ECA1> <8B5F>
+<ECA2> <8B6C>
+<ECA3> <8B6F>
+<ECA4> <8B74>
+<ECA5> <8B7D>
+<ECA6> <8B80>
+<ECA7> <8B8C>
+<ECA8> <8B8E>
+<ECA9> <8B92>
+<ECAA> <8B93>
+<ECAB> <8B96>
+<ECAC> <8B99>
+<ECAD> <8B9A>
+<ECAE> <8C3A>
+<ECAF> <8C41>
+<ECB0> <8C3F>
+<ECB1> <8C48>
+<ECB2> <8C4C>
+<ECB3> <8C4E>
+<ECB4> <8C50>
+<ECB5> <8C55>
+<ECB6> <8C62>
+<ECB7> <8C6C>
+<ECB8> <8C78>
+<ECB9> <8C7A>
+<ECBA> <8C82>
+<ECBB> <8C89>
+<ECBC> <8C85>
+<ECBD> <8C8A>
+endbfchar
+
+100 beginbfchar
+<ECBE> <8C8D>
+<ECBF> <8C8E>
+<ECC0> <8C94>
+<ECC1> <8C7C>
+<ECC2> <8C98>
+<ECC3> <621D>
+<ECC4> <8CAD>
+<ECC5> <8CAA>
+<ECC6> <8CBD>
+<ECC7> <8CB2>
+<ECC8> <8CB3>
+<ECC9> <8CAE>
+<ECCA> <8CB6>
+<ECCB> <8CC8>
+<ECCC> <8CC1>
+<ECCD> <8CE4>
+<ECCE> <8CE3>
+<ECCF> <8CDA>
+<ECD0> <8CFD>
+<ECD1> <8CFA>
+<ECD2> <8CFB>
+<ECD3> <8D04>
+<ECD4> <8D05>
+<ECD5> <8D0A>
+<ECD6> <8D07>
+<ECD7> <8D0F>
+<ECD8> <8D0D>
+<ECD9> <8D10>
+<ECDA> <9F4E>
+<ECDB> <8D13>
+<ECDC> <8CCD>
+<ECDD> <8D14>
+<ECDE> <8D16>
+<ECDF> <8D67>
+<ECE0> <8D6D>
+<ECE1> <8D71>
+<ECE2> <8D73>
+<ECE3> <8D81>
+<ECE4> <8D99>
+<ECE5> <8DC2>
+<ECE6> <8DBE>
+<ECE7> <8DBA>
+<ECE8> <8DCF>
+<ECE9> <8DDA>
+<ECEA> <8DD6>
+<ECEB> <8DCC>
+<ECEC> <8DDB>
+<ECED> <8DCB>
+<ECEE> <8DEA>
+<ECEF> <8DEB>
+<ECF0> <8DDF>
+<ECF1> <8DE3>
+<ECF2> <8DFC>
+<ECF3> <8E08>
+<ECF4> <8E09>
+<ECF5> <8DFF>
+<ECF6> <8E1D>
+<ECF7> <8E1E>
+<ECF8> <8E10>
+<ECF9> <8E1F>
+<ECFA> <8E42>
+<ECFB> <8E35>
+<ECFC> <8E30>
+<ECFD> <8E34>
+<ECFE> <8E4A>
+<EDA1> <8E47>
+<EDA2> <8E49>
+<EDA3> <8E4C>
+<EDA4> <8E50>
+<EDA5> <8E48>
+<EDA6> <8E59>
+<EDA7> <8E64>
+<EDA8> <8E60>
+<EDA9> <8E2A>
+<EDAA> <8E63>
+<EDAB> <8E55>
+<EDAC> <8E76>
+<EDAD> <8E72>
+<EDAE> <8E7C>
+<EDAF> <8E81>
+<EDB0> <8E87>
+<EDB1> <8E85>
+<EDB2> <8E84>
+<EDB3> <8E8B>
+<EDB4> <8E8A>
+<EDB5> <8E93>
+<EDB6> <8E91>
+<EDB7> <8E94>
+<EDB8> <8E99>
+<EDB9> <8EAA>
+<EDBA> <8EA1>
+<EDBB> <8EAC>
+<EDBC> <8EB0>
+<EDBD> <8EC6>
+<EDBE> <8EB1>
+<EDBF> <8EBE>
+<EDC0> <8EC5>
+<EDC1> <8EC8>
+<EDC2> <8ECB>
+<EDC3> <8EDB>
+endbfchar
+
+100 beginbfchar
+<EDC4> <8EE3>
+<EDC5> <8EFC>
+<EDC6> <8EFB>
+<EDC7> <8EEB>
+<EDC8> <8EFE>
+<EDC9> <8F0A>
+<EDCA> <8F05>
+<EDCB> <8F15>
+<EDCC> <8F12>
+<EDCD> <8F19>
+<EDCE> <8F13>
+<EDCF> <8F1C>
+<EDD0> <8F1F>
+<EDD1> <8F1B>
+<EDD2> <8F0C>
+<EDD3> <8F26>
+<EDD4> <8F33>
+<EDD5> <8F3B>
+<EDD6> <8F39>
+<EDD7> <8F45>
+<EDD8> <8F42>
+<EDD9> <8F3E>
+<EDDA> <8F4C>
+<EDDB> <8F49>
+<EDDC> <8F46>
+<EDDD> <8F4E>
+<EDDE> <8F57>
+<EDDF> <8F5C>
+<EDE0> <8F62>
+<EDE1> <8F63>
+<EDE2> <8F64>
+<EDE3> <8F9C>
+<EDE4> <8F9F>
+<EDE5> <8FA3>
+<EDE6> <8FAD>
+<EDE7> <8FAF>
+<EDE8> <8FB7>
+<EDE9> <8FDA>
+<EDEA> <8FE5>
+<EDEB> <8FE2>
+<EDEC> <8FEA>
+<EDED> <8FEF>
+<EDEE> <9087>
+<EDEF> <8FF4>
+<EDF0> <9005>
+<EDF1> <8FF9>
+<EDF2> <8FFA>
+<EDF3> <9011>
+<EDF4> <9015>
+<EDF5> <9021>
+<EDF6> <900D>
+<EDF7> <901E>
+<EDF8> <9016>
+<EDF9> <900B>
+<EDFA> <9027>
+<EDFB> <9036>
+<EDFC> <9035>
+<EDFD> <9039>
+<EDFE> <8FF8>
+<EEA1> <904F>
+<EEA2> <9050>
+<EEA3> <9051>
+<EEA4> <9052>
+<EEA5> <900E>
+<EEA6> <9049>
+<EEA7> <903E>
+<EEA8> <9056>
+<EEA9> <9058>
+<EEAA> <905E>
+<EEAB> <9068>
+<EEAC> <906F>
+<EEAD> <9076>
+<EEAE> <96A8>
+<EEAF> <9072>
+<EEB0> <9082>
+<EEB1> <907D>
+<EEB2> <9081>
+<EEB3> <9080>
+<EEB4> <908A>
+<EEB5> <9089>
+<EEB6> <908F>
+<EEB7> <90A8>
+<EEB8> <90AF>
+<EEB9> <90B1>
+<EEBA> <90B5>
+<EEBB> <90E2>
+<EEBC> <90E4>
+<EEBD> <6248>
+<EEBE> <90DB>
+<EEBF> <9102>
+<EEC0> <9112>
+<EEC1> <9119>
+<EEC2> <9132>
+<EEC3> <9130>
+<EEC4> <914A>
+<EEC5> <9156>
+<EEC6> <9158>
+<EEC7> <9163>
+<EEC8> <9165>
+<EEC9> <9169>
+endbfchar
+
+100 beginbfchar
+<EECA> <9173>
+<EECB> <9172>
+<EECC> <918B>
+<EECD> <9189>
+<EECE> <9182>
+<EECF> <91A2>
+<EED0> <91AB>
+<EED1> <91AF>
+<EED2> <91AA>
+<EED3> <91B5>
+<EED4> <91B4>
+<EED5> <91BA>
+<EED6> <91C0>
+<EED7> <91C1>
+<EED8> <91C9>
+<EED9> <91CB>
+<EEDA> <91D0>
+<EEDB> <91D6>
+<EEDC> <91DF>
+<EEDD> <91E1>
+<EEDE> <91DB>
+<EEDF> <91FC>
+<EEE0> <91F5>
+<EEE1> <91F6>
+<EEE2> <921E>
+<EEE3> <91FF>
+<EEE4> <9214>
+<EEE5> <922C>
+<EEE6> <9215>
+<EEE7> <9211>
+<EEE8> <925E>
+<EEE9> <9257>
+<EEEA> <9245>
+<EEEB> <9249>
+<EEEC> <9264>
+<EEED> <9248>
+<EEEE> <9295>
+<EEEF> <923F>
+<EEF0> <924B>
+<EEF1> <9250>
+<EEF2> <929C>
+<EEF3> <9296>
+<EEF4> <9293>
+<EEF5> <929B>
+<EEF6> <925A>
+<EEF7> <92CF>
+<EEF8> <92B9>
+<EEF9> <92B7>
+<EEFA> <92E9>
+<EEFB> <930F>
+<EEFC> <92FA>
+<EEFD> <9344>
+<EEFE> <932E>
+<EFA1> <9319>
+<EFA2> <9322>
+<EFA3> <931A>
+<EFA4> <9323>
+<EFA5> <933A>
+<EFA6> <9335>
+<EFA7> <933B>
+<EFA8> <935C>
+<EFA9> <9360>
+<EFAA> <937C>
+<EFAB> <936E>
+<EFAC> <9356>
+<EFAD> <93B0>
+<EFAE> <93AC>
+<EFAF> <93AD>
+<EFB0> <9394>
+<EFB1> <93B9>
+<EFB2> <93D6>
+<EFB3> <93D7>
+<EFB4> <93E8>
+<EFB5> <93E5>
+<EFB6> <93D8>
+<EFB7> <93C3>
+<EFB8> <93DD>
+<EFB9> <93D0>
+<EFBA> <93C8>
+<EFBB> <93E4>
+<EFBC> <941A>
+<EFBD> <9414>
+<EFBE> <9413>
+<EFBF> <9403>
+<EFC0> <9407>
+<EFC1> <9410>
+<EFC2> <9436>
+<EFC3> <942B>
+<EFC4> <9435>
+<EFC5> <9421>
+<EFC6> <943A>
+<EFC7> <9441>
+<EFC8> <9452>
+<EFC9> <9444>
+<EFCA> <945B>
+<EFCB> <9460>
+<EFCC> <9462>
+<EFCD> <945E>
+<EFCE> <946A>
+<EFCF> <9229>
+endbfchar
+
+100 beginbfchar
+<EFD0> <9470>
+<EFD1> <9475>
+<EFD2> <9477>
+<EFD3> <947D>
+<EFD4> <945A>
+<EFD5> <947C>
+<EFD6> <947E>
+<EFD7> <9481>
+<EFD8> <947F>
+<EFD9> <9582>
+<EFDA> <9587>
+<EFDB> <958A>
+<EFDC> <9594>
+<EFDD> <9596>
+<EFDE> <9598>
+<EFDF> <9599>
+<EFE0> <95A0>
+<EFE1> <95A8>
+<EFE2> <95A7>
+<EFE3> <95AD>
+<EFE4> <95BC>
+<EFE5> <95BB>
+<EFE6> <95B9>
+<EFE7> <95BE>
+<EFE8> <95CA>
+<EFE9> <6FF6>
+<EFEA> <95C3>
+<EFEB> <95CD>
+<EFEC> <95CC>
+<EFED> <95D5>
+<EFEE> <95D4>
+<EFEF> <95D6>
+<EFF0> <95DC>
+<EFF1> <95E1>
+<EFF2> <95E5>
+<EFF3> <95E2>
+<EFF4> <9621>
+<EFF5> <9628>
+<EFF6> <962E>
+<EFF7> <962F>
+<EFF8> <9642>
+<EFF9> <964C>
+<EFFA> <964F>
+<EFFB> <964B>
+<EFFC> <9677>
+<EFFD> <965C>
+<EFFE> <965E>
+<F0A1> <965D>
+<F0A2> <965F>
+<F0A3> <9666>
+<F0A4> <9672>
+<F0A5> <966C>
+<F0A6> <968D>
+<F0A7> <9698>
+<F0A8> <9695>
+<F0A9> <9697>
+<F0AA> <96AA>
+<F0AB> <96A7>
+<F0AC> <96B1>
+<F0AD> <96B2>
+<F0AE> <96B0>
+<F0AF> <96B4>
+<F0B0> <96B6>
+<F0B1> <96B8>
+<F0B2> <96B9>
+<F0B3> <96CE>
+<F0B4> <96CB>
+<F0B5> <96C9>
+<F0B6> <96CD>
+<F0B7> <894D>
+<F0B8> <96DC>
+<F0B9> <970D>
+<F0BA> <96D5>
+<F0BB> <96F9>
+<F0BC> <9704>
+<F0BD> <9706>
+<F0BE> <9708>
+<F0BF> <9713>
+<F0C0> <970E>
+<F0C1> <9711>
+<F0C2> <970F>
+<F0C3> <9716>
+<F0C4> <9719>
+<F0C5> <9724>
+<F0C6> <972A>
+<F0C7> <9730>
+<F0C8> <9739>
+<F0C9> <973D>
+<F0CA> <973E>
+<F0CB> <9744>
+<F0CC> <9746>
+<F0CD> <9748>
+<F0CE> <9742>
+<F0CF> <9749>
+<F0D0> <975C>
+<F0D1> <9760>
+<F0D2> <9764>
+<F0D3> <9766>
+<F0D4> <9768>
+<F0D5> <52D2>
+endbfchar
+
+100 beginbfchar
+<F0D6> <976B>
+<F0D7> <9771>
+<F0D8> <9779>
+<F0D9> <9785>
+<F0DA> <977C>
+<F0DB> <9781>
+<F0DC> <977A>
+<F0DD> <9786>
+<F0DE> <978B>
+<F0DF> <978F>
+<F0E0> <9790>
+<F0E1> <979C>
+<F0E2> <97A8>
+<F0E3> <97A6>
+<F0E4> <97A3>
+<F0E5> <97B3>
+<F0E6> <97B4>
+<F0E7> <97C3>
+<F0E8> <97C6>
+<F0E9> <97C8>
+<F0EA> <97CB>
+<F0EB> <97DC>
+<F0EC> <97ED>
+<F0ED> <9F4F>
+<F0EE> <97F2>
+<F0EF> <7ADF>
+<F0F0> <97F6>
+<F0F1> <97F5>
+<F0F2> <980F>
+<F0F3> <980C>
+<F0F4> <9838>
+<F0F5> <9824>
+<F0F6> <9821>
+<F0F7> <9837>
+<F0F8> <983D>
+<F0F9> <9846>
+<F0FA> <984F>
+<F0FB> <984B>
+<F0FC> <986B>
+<F0FD> <986F>
+<F0FE> <9870>
+<F1A1> <9871>
+<F1A2> <9874>
+<F1A3> <9873>
+<F1A4> <98AA>
+<F1A5> <98AF>
+<F1A6> <98B1>
+<F1A7> <98B6>
+<F1A8> <98C4>
+<F1A9> <98C3>
+<F1AA> <98C6>
+<F1AB> <98E9>
+<F1AC> <98EB>
+<F1AD> <9903>
+<F1AE> <9909>
+<F1AF> <9912>
+<F1B0> <9914>
+<F1B1> <9918>
+<F1B2> <9921>
+<F1B3> <991D>
+<F1B4> <991E>
+<F1B5> <9924>
+<F1B6> <9920>
+<F1B7> <992C>
+<F1B8> <992E>
+<F1B9> <993D>
+<F1BA> <993E>
+<F1BB> <9942>
+<F1BC> <9949>
+<F1BD> <9945>
+<F1BE> <9950>
+<F1BF> <994B>
+<F1C0> <9951>
+<F1C1> <9952>
+<F1C2> <994C>
+<F1C3> <9955>
+<F1C4> <9997>
+<F1C5> <9998>
+<F1C6> <99A5>
+<F1C7> <99AD>
+<F1C8> <99AE>
+<F1C9> <99BC>
+<F1CA> <99DF>
+<F1CB> <99DB>
+<F1CC> <99DD>
+<F1CD> <99D8>
+<F1CE> <99D1>
+<F1CF> <99ED>
+<F1D0> <99EE>
+<F1D1> <99F1>
+<F1D2> <99F2>
+<F1D3> <99FB>
+<F1D4> <99F8>
+<F1D5> <9A01>
+<F1D6> <9A0F>
+<F1D7> <9A05>
+<F1D8> <99E2>
+<F1D9> <9A19>
+<F1DA> <9A2B>
+<F1DB> <9A37>
+endbfchar
+
+100 beginbfchar
+<F1DC> <9A45>
+<F1DD> <9A42>
+<F1DE> <9A40>
+<F1DF> <9A43>
+<F1E0> <9A3E>
+<F1E1> <9A55>
+<F1E2> <9A4D>
+<F1E3> <9A5B>
+<F1E4> <9A57>
+<F1E5> <9A5F>
+<F1E6> <9A62>
+<F1E7> <9A65>
+<F1E8> <9A64>
+<F1E9> <9A69>
+<F1EA> <9A6B>
+<F1EB> <9A6A>
+<F1EC> <9AAD>
+<F1ED> <9AB0>
+<F1EE> <9ABC>
+<F1EF> <9AC0>
+<F1F0> <9ACF>
+<F1F1> <9AD1>
+<F1F2> <9AD3>
+<F1F3> <9AD4>
+<F1F4> <9ADE>
+<F1F5> <9ADF>
+<F1F6> <9AE2>
+<F1F7> <9AE3>
+<F1F8> <9AE6>
+<F1F9> <9AEF>
+<F1FA> <9AEB>
+<F1FB> <9AEE>
+<F1FC> <9AF4>
+<F1FD> <9AF1>
+<F1FE> <9AF7>
+<F2A1> <9AFB>
+<F2A2> <9B06>
+<F2A3> <9B18>
+<F2A4> <9B1A>
+<F2A5> <9B1F>
+<F2A6> <9B22>
+<F2A7> <9B23>
+<F2A8> <9B25>
+<F2A9> <9B27>
+<F2AA> <9B28>
+<F2AB> <9B29>
+<F2AC> <9B2A>
+<F2AD> <9B2E>
+<F2AE> <9B2F>
+<F2AF> <9B32>
+<F2B0> <9B44>
+<F2B1> <9B43>
+<F2B2> <9B4F>
+<F2B3> <9B4D>
+<F2B4> <9B4E>
+<F2B5> <9B51>
+<F2B6> <9B58>
+<F2B7> <9B74>
+<F2B8> <9B93>
+<F2B9> <9B83>
+<F2BA> <9B91>
+<F2BB> <9B96>
+<F2BC> <9B97>
+<F2BD> <9B9F>
+<F2BE> <9BA0>
+<F2BF> <9BA8>
+<F2C0> <9BB4>
+<F2C1> <9BC0>
+<F2C2> <9BCA>
+<F2C3> <9BB9>
+<F2C4> <9BC6>
+<F2C5> <9BCF>
+<F2C6> <9BD1>
+<F2C7> <9BD2>
+<F2C8> <9BE3>
+<F2C9> <9BE2>
+<F2CA> <9BE4>
+<F2CB> <9BD4>
+<F2CC> <9BE1>
+<F2CD> <9C3A>
+<F2CE> <9BF2>
+<F2CF> <9BF1>
+<F2D0> <9BF0>
+<F2D1> <9C15>
+<F2D2> <9C14>
+<F2D3> <9C09>
+<F2D4> <9C13>
+<F2D5> <9C0C>
+<F2D6> <9C06>
+<F2D7> <9C08>
+<F2D8> <9C12>
+<F2D9> <9C0A>
+<F2DA> <9C04>
+<F2DB> <9C2E>
+<F2DC> <9C1B>
+<F2DD> <9C25>
+<F2DE> <9C24>
+<F2DF> <9C21>
+<F2E0> <9C30>
+<F2E1> <9C47>
+endbfchar
+
+100 beginbfchar
+<F2E2> <9C32>
+<F2E3> <9C46>
+<F2E4> <9C3E>
+<F2E5> <9C5A>
+<F2E6> <9C60>
+<F2E7> <9C67>
+<F2E8> <9C76>
+<F2E9> <9C78>
+<F2EA> <9CE7>
+<F2EB> <9CEC>
+<F2EC> <9CF0>
+<F2ED> <9D09>
+<F2EE> <9D08>
+<F2EF> <9CEB>
+<F2F0> <9D03>
+<F2F1> <9D06>
+<F2F2> <9D2A>
+<F2F3> <9D26>
+<F2F4> <9DAF>
+<F2F5> <9D23>
+<F2F6> <9D1F>
+<F2F7> <9D44>
+<F2F8> <9D15>
+<F2F9> <9D12>
+<F2FA> <9D41>
+<F2FB> <9D3F>
+<F2FC> <9D3E>
+<F2FD> <9D46>
+<F2FE> <9D48>
+<F3A1> <9D5D>
+<F3A2> <9D5E>
+<F3A3> <9D64>
+<F3A4> <9D51>
+<F3A5> <9D50>
+<F3A6> <9D59>
+<F3A7> <9D72>
+<F3A8> <9D89>
+<F3A9> <9D87>
+<F3AA> <9DAB>
+<F3AB> <9D6F>
+<F3AC> <9D7A>
+<F3AD> <9D9A>
+<F3AE> <9DA4>
+<F3AF> <9DA9>
+<F3B0> <9DB2>
+<F3B1> <9DC4>
+<F3B2> <9DC1>
+<F3B3> <9DBB>
+<F3B4> <9DB8>
+<F3B5> <9DBA>
+<F3B6> <9DC6>
+<F3B7> <9DCF>
+<F3B8> <9DC2>
+<F3B9> <9DD9>
+<F3BA> <9DD3>
+<F3BB> <9DF8>
+<F3BC> <9DE6>
+<F3BD> <9DED>
+<F3BE> <9DEF>
+<F3BF> <9DFD>
+<F3C0> <9E1A>
+<F3C1> <9E1B>
+<F3C2> <9E1E>
+<F3C3> <9E75>
+<F3C4> <9E79>
+<F3C5> <9E7D>
+<F3C6> <9E81>
+<F3C7> <9E88>
+<F3C8> <9E8B>
+<F3C9> <9E8C>
+<F3CA> <9E92>
+<F3CB> <9E95>
+<F3CC> <9E91>
+<F3CD> <9E9D>
+<F3CE> <9EA5>
+<F3CF> <9EA9>
+<F3D0> <9EB8>
+<F3D1> <9EAA>
+<F3D2> <9EAD>
+<F3D3> <9761>
+<F3D4> <9ECC>
+<F3D5> <9ECE>
+<F3D6> <9ECF>
+<F3D7> <9ED0>
+<F3D8> <9ED4>
+<F3D9> <9EDC>
+<F3DA> <9EDE>
+<F3DB> <9EDD>
+<F3DC> <9EE0>
+<F3DD> <9EE5>
+<F3DE> <9EE8>
+<F3DF> <9EEF>
+<F3E0> <9EF4>
+<F3E1> <9EF6>
+<F3E2> <9EF7>
+<F3E3> <9EF9>
+<F3E4> <9EFB>
+<F3E5> <9EFC>
+<F3E6> <9EFD>
+<F3E7> <9F07>
+endbfchar
+
+29 beginbfchar
+<F3E8> <9F08>
+<F3E9> <76B7>
+<F3EA> <9F15>
+<F3EB> <9F21>
+<F3EC> <9F2C>
+<F3ED> <9F3E>
+<F3EE> <9F4A>
+<F3EF> <9F52>
+<F3F0> <9F54>
+<F3F1> <9F63>
+<F3F2> <9F5F>
+<F3F3> <9F60>
+<F3F4> <9F61>
+<F3F5> <9F66>
+<F3F6> <9F67>
+<F3F7> <9F6C>
+<F3F8> <9F6A>
+<F3F9> <9F77>
+<F3FA> <9F72>
+<F3FB> <9F76>
+<F3FC> <9F95>
+<F3FD> <9F9C>
+<F3FE> <9FA0>
+<F4A1> <582F>
+<F4A2> <69C7>
+<F4A3> <9059>
+<F4A4> <7464>
+<F4A5> <51DC>
+<F4A6> <7199>
+endbfchar
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-H b/Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-H
new file mode 100644
index 00000000000..91a234656e2
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-H
@@ -0,0 +1,66 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (UniKS-UCS2-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (UniKS-UCS2-H)
+%%BeginResource: CMap (UniKSCms-UCS2-H)
+%%Title: (UniKSCms-UCS2-H Adobe Korea1 1)
+%%Version: 1.0
+%%Copyright:
+%% Copyright (C) 2002 by Jin-Hwan Cho <chofchof@ktug.or.kr>
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by
+%% the Free Software Foundation; either version 2 of the License, or
+%% (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software
+%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/UniKS-UCS2-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Korea1) def
+ /Supplement 1 def
+end def
+
+/CMapName /UniKSCms-UCS2-H def
+/CMapVersion 1.0 def
+/CMapType 1 def
+
+/WMode 0 def
+
+9 begincidrange
+<00ad> <00ad> 109
+<00b7> <00b7> 104
+<02d0> <02d0> 210
+<2015> <2015> 110
+<2225> <2225> 111
+<223c> <223c> 113
+<226a> <226b> 176
+<2299> <2299> 227
+<ff5e> <ff5e> 200
+endcidrange
+
+endcmap
+
+CMapName currentdict /CMap defineresource pop
+
+end
+end
+%%EndResource
+%%EOF
diff --git a/Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-V b/Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-V
new file mode 100644
index 00000000000..9e5e61e5f95
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/CMap/UniKSCms-UCS2-V
@@ -0,0 +1,75 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (UniKSCms-UCS2-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (UniKSCms-UCS2-H)
+%%BeginResource: CMap (UniKSCms-UCS2-V)
+%%Title: (UniKSCms-UCS2-V Adobe Korea1 1)
+%%Version: 1.0
+%%Copyright:
+%% Copyright (C) 2002 by Jin-Hwan Cho <chofchof@ktug.or.kr>
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by
+%% the Free Software Foundation; either version 2 of the License, or
+%% (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software
+%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/UniKSCms-UCS2-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Korea1) def
+ /Supplement 1 def
+end def
+
+/CMapName /UniKSCms-UCS2-V def
+/CMapVersion 1.0 def
+/CMapType 1 def
+
+/WMode 1 def
+
+18 begincidrange
+<2013> <2014> 8059
+<2016> <2016> 8061
+<2025> <2025> 8058
+<3001> <3002> 8056
+<3008> <3011> 8065
+<3013> <3013> 8075
+<3014> <3015> 8063
+<ff01> <ff01> 8076
+<ff08> <ff09> 8077
+<ff0c> <ff0c> 8079
+<ff0e> <ff0e> 8080
+<ff1a> <ff1f> 8081
+<ff3b> <ff3b> 8087
+<ff3d> <ff3d> 8088
+<ff3f> <ff3f> 8089
+<ff5b> <ff5d> 8090
+<ff5e> <ff5e> 8062
+<ffe3> <ffe3> 8093
+endcidrange
+
+endcmap
+
+CMapName currentdict /CMap defineresource pop
+
+end
+end
+%%EndResource
+%%EOF
diff --git a/Build/source/texk/xdvipdfmx/data/Makefile.am b/Build/source/texk/xdvipdfmx/data/Makefile.am
new file mode 100644
index 00000000000..8e2485248b3
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/Makefile.am
@@ -0,0 +1,25 @@
+pkgdatadir = $(datadir)/texmf/dvipdfm
+pkgdata_DATA = CMap config
+EXTRA_DIST = $(pkgdata_DATA)
+
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+ @list='$(pkgdata_DATA)'; for adir in $$list; do \
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/$$adir; \
+ for p in $$adir/*; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
+ fi; fi; \
+ done; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(pkgdata_DATA)'; for p in $$list; do \
+ rm -rf $(DESTDIR)$(pkgdatadir)/$$p; \
+ done
diff --git a/Build/source/texk/xdvipdfmx/data/Makefile.in b/Build/source/texk/xdvipdfmx/data/Makefile.in
new file mode 100644
index 00000000000..4d3ee6be4b0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/Makefile.in
@@ -0,0 +1,335 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = data
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/../../libs/libpng/withenable.ac \
+ $(top_srcdir)/../../libs/libpng/libpng.ac \
+ $(top_srcdir)/../../libs/zlib/withenable.ac \
+ $(top_srcdir)/../../libs/zlib/zlib.ac \
+ $(top_srcdir)/../../libs/freetype2/withenable.ac \
+ $(top_srcdir)/../../libs/freetype2/freetype2.ac \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgdatadir)"
+pkgdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgdata_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+pkgdatadir = $(datadir)/texmf/dvipdfm
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FREETYPE2CPPFLAGS = @FREETYPE2CPPFLAGS@
+FREETYPE2DEP = @FREETYPE2DEP@
+FT2CPPFLAGS = @FT2CPPFLAGS@
+FT2DEP = @FT2DEP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LDFREETYPE2 = @LDFREETYPE2@
+LDFT2 = @LDFT2@
+LDLIBPNG = @LDLIBPNG@
+LDZLIB = @LDZLIB@
+LIBOBJS = @LIBOBJS@
+LIBPNGCPPFLAGS = @LIBPNGCPPFLAGS@
+LIBPNGDEP = @LIBPNGDEP@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TDS_VERSION_11_FALSE = @TDS_VERSION_11_FALSE@
+TDS_VERSION_11_TRUE = @TDS_VERSION_11_TRUE@
+VERSION = @VERSION@
+ZLIBCPPFLAGS = @ZLIBCPPFLAGS@
+ZLIBDEP = @ZLIBDEP@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+dvipdfmx_LDFLAGS = @dvipdfmx_LDFLAGS@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xdvipdfmx_LDFLAGS = @xdvipdfmx_LDFLAGS@
+pkgdata_DATA = CMap config
+EXTRA_DIST = $(pkgdata_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu data/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgdataDATA
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkgdataDATA install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+ uninstall-am uninstall-info-am uninstall-pkgdataDATA
+
+
+install-pkgdataDATA: $(pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+ @list='$(pkgdata_DATA)'; for adir in $$list; do \
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/$$adir; \
+ for p in $$adir/*; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
+ fi; fi; \
+ done; \
+ done
+
+uninstall-pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(pkgdata_DATA)'; for p in $$list; do \
+ rm -rf $(DESTDIR)$(pkgdatadir)/$$p; \
+ done
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/xdvipdfmx/data/config/cid-x.map b/Build/source/texk/xdvipdfmx/data/config/cid-x.map
new file mode 100644
index 00000000000..9baa046cd4f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/config/cid-x.map
@@ -0,0 +1,3 @@
+%% This file 'cid-x.map' is read by dvipdfmx for default
+%% dvipdfmx.cfg setting. Please append fontmap entries here.
+
diff --git a/Build/source/texk/xdvipdfmx/data/config/dvipdfmx.cfg b/Build/source/texk/xdvipdfmx/data/config/dvipdfmx.cfg
new file mode 100644
index 00000000000..64e09f37980
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/config/dvipdfmx.cfg
@@ -0,0 +1,193 @@
+%%
+%% ** PLEASE CHECK FILE ACCESS PERMISSION OF THIS FILE **
+%%
+%% With 'D' option dvipdfmx may invoke shell command via system()
+%% function call.
+%%
+%%
+%% PDF Version Setting
+%%
+%% PDF (minor) version stamp to use in output file.
+%% This also implies maximal version of PDF file allowed to be included.
+%% Dvipdfmx does not support 1.0, 1.1, 1.2 since TrueType font embedded
+%% as CIDFontType2 requires at least version 1.3. Transparent imaging
+%% model requires version 1.4. So if you want soft-masking support for
+%% PNG image with alpha channels, you should set version to 4 or higher.
+
+V 4
+
+%%
+%% Dvipdfmx Compatibility Flags
+%%
+%% 0x0002 Use semi-transparent filling for tpic shading command,
+%% instead of opaque gray color. (requires PDF 1.4)
+%% 0x0004 Treat all CIDFont as fixed-pitch font.
+%% This is only for backward compatibility. Don't use that.
+%% 0x0008 Do not replace duplicate fontmap entries.
+%% Dvipdfm's (not 'x') behaviour.
+
+%C 0x0000
+
+
+%%
+%% PDF Document Settings
+%%
+%% Papersize Option:
+%%
+%% p papersize-spec
+%%
+%% papersize-spec is 'paper-format' or length-pair, e.g., 'a4', 'letter',
+%% '20cm,30cm'. Recognized unit is 'cm', 'mm', 'bp', 'pt', 'in'.
+%%
+
+p a4
+
+%% Annotation Box Margin:
+%%
+%% g length
+%%
+%% Add margin to annotation rectangle created via various \specials. Many
+%% TeX macro packages set the annotation bounding box equal to the TeX box
+%% that encloses the material. That's not always what you want.
+%% Annotations created by pdf:bannot/pdf:eannot is also affected.
+%%
+%% Bookmark Open Level:
+%%
+%% O integer
+%%
+%% Mark bookmark (outline) item as initial state 'open' if the depth
+%% of that item (from root node) is less than or equal to the integer
+%% specified with this option.
+
+g 1
+O 0
+
+
+%%
+%% PDF Security (Encryption) Setting
+%%
+%% Those options won't take effects unless you use flag 'S'.
+%%
+%% Key bits for PDF encryption (40 - 128)
+
+K 40
+
+%% Permission flag for PDF encryption: Revision will be 3 if the key size
+%% is greater than 40 bits.
+%%
+%% 0x0004 (Revision 2) Print the document.
+%% (Revision 3) Print the document (possibly not at the highest quality
+%% level, depending on whether bit 12[0x0800] is also set).
+%% 0x0008 Modify the contents of the document by operations other than those
+%% controlled by bits 6[0x0020], 9[0x0100], and 11[0x0400].
+%% 0x0010 (Revision 2) Copy or otherwise extract text and graphics from the
+%% document, including extracting text and graphics (in support of
+%% accessibility to disabled users or for other purposes).
+%% (Revision 3) Copy or otherwise extract text and grphics from the
+%% document by operations other than that controlled by bit 10[0x0200].
+%% 0x0020 Add or modify text annotations, fill in interactive form fields,
+%% and, if bit 4[0x0008] is also set, create or modify interactive
+%% form fields (including signature fields).
+%%
+%% (Revision 3 only)
+%% 0x0100 Fill in existing interactive form fields (including signature
+%% fields), even if bit 6 is clear.
+%% 0x0200 Extract text and graphics (in support of accessibility to disabled
+%% users or for other purposes).
+%% 0x0400 Assemble the document (insert, rotate, or delete pages and create
+%% bookmarks or thumbnail images), even if bit 4 is clear.
+%% 0x0800 Print the document to a representation from which a faithful digital
+%% copy of the PDF content could be generated. When this bit is clear
+%% (and bit 3 is set), printing is limited to a low-level representation
+%% of the appearance, possibly of degraded quality.
+
+P 0x003C
+
+
+%%
+%% Image Handler
+%%
+%% Command-line template for a-to-b conversion:
+%%
+%% Supported target format ('b') is currently PDF.
+%% Percent sign '%' is special character:
+%%
+%% %i Input file name (FQPN). Name of file to be converted to PDF.
+%% %o Output file name (FQPN). Temporary file to store conversion
+%% result. Removed after inclusion is finished. (regardless of
+%% success or failure)
+%% %b The "base" name of the input file, e.g., "foo" instead of
+%% "foo.eps".
+%% %% Replaced with single '%'.
+
+%% *Examples* for GhostScript (PS-to-PDF)
+%%
+%% The following example decode all DCT (i.e., JPEG) encoded images
+%% and then recompress images with Flate (zlib, same as PNG) encode
+%% filter. If you are using recent version of gs, then please remove
+%% -dAutoFilterXXXImages and -dXXXImageFilter.
+%% /FlateEncode is introduced to avoid quality loss of "EPS JPEG"
+%% images.
+%%
+%% Also note that PAPERSIZE=a0 is specified below. This convert PS
+%% files (including EPS) to A0 papersize PDF. This is necessary to
+%% prevent gs from clipping PS figure at some papersize. (A0 above
+%% simply means large size paper)
+%%
+%% GhostScript (Unix/Linux):
+%D "gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile=%o %i -c quit"
+
+%% GhostScript (Win32):
+%D "gswin32c -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile=%o %i -c quit"
+
+%% Frank Siegert's PStill:
+%D "/usr/local/bin/pstill -c -o %o %i"
+
+%% Adobe Acrobat Distiller:
+%D "/usr/local/bin/distill -quiet -pairs %i %o"
+
+%% Batik + Fop (SVG-to-PDF):
+%% If you want both PS and SVG, you need to write a script or program
+%% that selectively invokes converters.
+%D "java -classpath classpaths -jar /path/to/batik-rasterizer.jar -m application/pdf -d %o %i"
+
+%% There are no way to directly know suggested size of (raster) images.
+%% You may want to use %b here, since you can try reading the ebb file
+%% to see what is natural (physical) size of images.
+%D "ras2pdf -r 300x300 -b %b.bb -o %o %i"
+
+%% ImageMagick:
+%% Easiest way to support various file formats.
+%D "convert %i epdf:%o"
+
+%% Other Options
+%%
+%% DPI for PK font creation
+%r 600
+
+%% Set number of fractional digit kept for various numbers in PDF page
+%% content output. By setting this to 2 (default), dvipdfmx rounds
+%% real numbers at 2nd fractional (decimal) digit; e.g., "3.14159" is
+%% written as "3.14". Increasing this to more than 2 isn't meaningful
+%% for old Acrobat due to implementation limit of Acrobat.
+%% Length 0.01 in unscaled coordinate system amount to width of 1 pixel
+%% in 7200ppi display.
+%d 5
+
+%%
+%% Font Map Files
+%%
+%% Lookup order is different than dvipdfm, see 'C' option above.
+%%
+%% teTeX 2.x using updmap
+
+f dvipdfm.map
+
+%% MiKTeX 2.2 and 2.3
+
+%f psfonts.map
+
+
+%% Put additonal fontmap files here
+f cid-x.map
+
diff --git a/Build/source/texk/xdvipdfmx/data/config/glyphlist.txt b/Build/source/texk/xdvipdfmx/data/config/glyphlist.txt
new file mode 100644
index 00000000000..a1a22702a8e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/data/config/glyphlist.txt
@@ -0,0 +1,4291 @@
+# Name: Adobe Glyph List
+# Table version: 2.0
+# Date: September 20, 2002
+#
+# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
+#
+# Format: Semicolon-delimited fields:
+# (1) glyph name
+# (2) Unicode scalar value
+A;0041
+AE;00C6
+AEacute;01FC
+AEmacron;01E2
+AEsmall;F7E6
+Aacute;00C1
+Aacutesmall;F7E1
+Abreve;0102
+Abreveacute;1EAE
+Abrevecyrillic;04D0
+Abrevedotbelow;1EB6
+Abrevegrave;1EB0
+Abrevehookabove;1EB2
+Abrevetilde;1EB4
+Acaron;01CD
+Acircle;24B6
+Acircumflex;00C2
+Acircumflexacute;1EA4
+Acircumflexdotbelow;1EAC
+Acircumflexgrave;1EA6
+Acircumflexhookabove;1EA8
+Acircumflexsmall;F7E2
+Acircumflextilde;1EAA
+Acute;F6C9
+Acutesmall;F7B4
+Acyrillic;0410
+Adblgrave;0200
+Adieresis;00C4
+Adieresiscyrillic;04D2
+Adieresismacron;01DE
+Adieresissmall;F7E4
+Adotbelow;1EA0
+Adotmacron;01E0
+Agrave;00C0
+Agravesmall;F7E0
+Ahookabove;1EA2
+Aiecyrillic;04D4
+Ainvertedbreve;0202
+Alpha;0391
+Alphatonos;0386
+Amacron;0100
+Amonospace;FF21
+Aogonek;0104
+Aring;00C5
+Aringacute;01FA
+Aringbelow;1E00
+Aringsmall;F7E5
+Asmall;F761
+Atilde;00C3
+Atildesmall;F7E3
+Aybarmenian;0531
+B;0042
+Bcircle;24B7
+Bdotaccent;1E02
+Bdotbelow;1E04
+Becyrillic;0411
+Benarmenian;0532
+Beta;0392
+Bhook;0181
+Blinebelow;1E06
+Bmonospace;FF22
+Brevesmall;F6F4
+Bsmall;F762
+Btopbar;0182
+C;0043
+Caarmenian;053E
+Cacute;0106
+Caron;F6CA
+Caronsmall;F6F5
+Ccaron;010C
+Ccedilla;00C7
+Ccedillaacute;1E08
+Ccedillasmall;F7E7
+Ccircle;24B8
+Ccircumflex;0108
+Cdot;010A
+Cdotaccent;010A
+Cedillasmall;F7B8
+Chaarmenian;0549
+Cheabkhasiancyrillic;04BC
+Checyrillic;0427
+Chedescenderabkhasiancyrillic;04BE
+Chedescendercyrillic;04B6
+Chedieresiscyrillic;04F4
+Cheharmenian;0543
+Chekhakassiancyrillic;04CB
+Cheverticalstrokecyrillic;04B8
+Chi;03A7
+Chook;0187
+Circumflexsmall;F6F6
+Cmonospace;FF23
+Coarmenian;0551
+Csmall;F763
+D;0044
+DZ;01F1
+DZcaron;01C4
+Daarmenian;0534
+Dafrican;0189
+Dcaron;010E
+Dcedilla;1E10
+Dcircle;24B9
+Dcircumflexbelow;1E12
+Dcroat;0110
+Ddotaccent;1E0A
+Ddotbelow;1E0C
+Decyrillic;0414
+Deicoptic;03EE
+Delta;2206
+Deltagreek;0394
+Dhook;018A
+Dieresis;F6CB
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;F7A8
+Digammagreek;03DC
+Djecyrillic;0402
+Dlinebelow;1E0E
+Dmonospace;FF24
+Dotaccentsmall;F6F7
+Dslash;0110
+Dsmall;F764
+Dtopbar;018B
+Dz;01F2
+Dzcaron;01C5
+Dzeabkhasiancyrillic;04E0
+Dzecyrillic;0405
+Dzhecyrillic;040F
+E;0045
+Eacute;00C9
+Eacutesmall;F7E9
+Ebreve;0114
+Ecaron;011A
+Ecedillabreve;1E1C
+Echarmenian;0535
+Ecircle;24BA
+Ecircumflex;00CA
+Ecircumflexacute;1EBE
+Ecircumflexbelow;1E18
+Ecircumflexdotbelow;1EC6
+Ecircumflexgrave;1EC0
+Ecircumflexhookabove;1EC2
+Ecircumflexsmall;F7EA
+Ecircumflextilde;1EC4
+Ecyrillic;0404
+Edblgrave;0204
+Edieresis;00CB
+Edieresissmall;F7EB
+Edot;0116
+Edotaccent;0116
+Edotbelow;1EB8
+Efcyrillic;0424
+Egrave;00C8
+Egravesmall;F7E8
+Eharmenian;0537
+Ehookabove;1EBA
+Eightroman;2167
+Einvertedbreve;0206
+Eiotifiedcyrillic;0464
+Elcyrillic;041B
+Elevenroman;216A
+Emacron;0112
+Emacronacute;1E16
+Emacrongrave;1E14
+Emcyrillic;041C
+Emonospace;FF25
+Encyrillic;041D
+Endescendercyrillic;04A2
+Eng;014A
+Enghecyrillic;04A4
+Enhookcyrillic;04C7
+Eogonek;0118
+Eopen;0190
+Epsilon;0395
+Epsilontonos;0388
+Ercyrillic;0420
+Ereversed;018E
+Ereversedcyrillic;042D
+Escyrillic;0421
+Esdescendercyrillic;04AA
+Esh;01A9
+Esmall;F765
+Eta;0397
+Etarmenian;0538
+Etatonos;0389
+Eth;00D0
+Ethsmall;F7F0
+Etilde;1EBC
+Etildebelow;1E1A
+Euro;20AC
+Ezh;01B7
+Ezhcaron;01EE
+Ezhreversed;01B8
+F;0046
+Fcircle;24BB
+Fdotaccent;1E1E
+Feharmenian;0556
+Feicoptic;03E4
+Fhook;0191
+Fitacyrillic;0472
+Fiveroman;2164
+Fmonospace;FF26
+Fourroman;2163
+Fsmall;F766
+G;0047
+GBsquare;3387
+Gacute;01F4
+Gamma;0393
+Gammaafrican;0194
+Gangiacoptic;03EA
+Gbreve;011E
+Gcaron;01E6
+Gcedilla;0122
+Gcircle;24BC
+Gcircumflex;011C
+Gcommaaccent;0122
+Gdot;0120
+Gdotaccent;0120
+Gecyrillic;0413
+Ghadarmenian;0542
+Ghemiddlehookcyrillic;0494
+Ghestrokecyrillic;0492
+Gheupturncyrillic;0490
+Ghook;0193
+Gimarmenian;0533
+Gjecyrillic;0403
+Gmacron;1E20
+Gmonospace;FF27
+Grave;F6CE
+Gravesmall;F760
+Gsmall;F767
+Gsmallhook;029B
+Gstroke;01E4
+H;0048
+H18533;25CF
+H18543;25AA
+H18551;25AB
+H22073;25A1
+HPsquare;33CB
+Haabkhasiancyrillic;04A8
+Hadescendercyrillic;04B2
+Hardsigncyrillic;042A
+Hbar;0126
+Hbrevebelow;1E2A
+Hcedilla;1E28
+Hcircle;24BD
+Hcircumflex;0124
+Hdieresis;1E26
+Hdotaccent;1E22
+Hdotbelow;1E24
+Hmonospace;FF28
+Hoarmenian;0540
+Horicoptic;03E8
+Hsmall;F768
+Hungarumlaut;F6CF
+Hungarumlautsmall;F6F8
+Hzsquare;3390
+I;0049
+IAcyrillic;042F
+IJ;0132
+IUcyrillic;042E
+Iacute;00CD
+Iacutesmall;F7ED
+Ibreve;012C
+Icaron;01CF
+Icircle;24BE
+Icircumflex;00CE
+Icircumflexsmall;F7EE
+Icyrillic;0406
+Idblgrave;0208
+Idieresis;00CF
+Idieresisacute;1E2E
+Idieresiscyrillic;04E4
+Idieresissmall;F7EF
+Idot;0130
+Idotaccent;0130
+Idotbelow;1ECA
+Iebrevecyrillic;04D6
+Iecyrillic;0415
+Ifraktur;2111
+Igrave;00CC
+Igravesmall;F7EC
+Ihookabove;1EC8
+Iicyrillic;0418
+Iinvertedbreve;020A
+Iishortcyrillic;0419
+Imacron;012A
+Imacroncyrillic;04E2
+Imonospace;FF29
+Iniarmenian;053B
+Iocyrillic;0401
+Iogonek;012E
+Iota;0399
+Iotaafrican;0196
+Iotadieresis;03AA
+Iotatonos;038A
+Ismall;F769
+Istroke;0197
+Itilde;0128
+Itildebelow;1E2C
+Izhitsacyrillic;0474
+Izhitsadblgravecyrillic;0476
+J;004A
+Jaarmenian;0541
+Jcircle;24BF
+Jcircumflex;0134
+Jecyrillic;0408
+Jheharmenian;054B
+Jmonospace;FF2A
+Jsmall;F76A
+K;004B
+KBsquare;3385
+KKsquare;33CD
+Kabashkircyrillic;04A0
+Kacute;1E30
+Kacyrillic;041A
+Kadescendercyrillic;049A
+Kahookcyrillic;04C3
+Kappa;039A
+Kastrokecyrillic;049E
+Kaverticalstrokecyrillic;049C
+Kcaron;01E8
+Kcedilla;0136
+Kcircle;24C0
+Kcommaaccent;0136
+Kdotbelow;1E32
+Keharmenian;0554
+Kenarmenian;053F
+Khacyrillic;0425
+Kheicoptic;03E6
+Khook;0198
+Kjecyrillic;040C
+Klinebelow;1E34
+Kmonospace;FF2B
+Koppacyrillic;0480
+Koppagreek;03DE
+Ksicyrillic;046E
+Ksmall;F76B
+L;004C
+LJ;01C7
+LL;F6BF
+Lacute;0139
+Lambda;039B
+Lcaron;013D
+Lcedilla;013B
+Lcircle;24C1
+Lcircumflexbelow;1E3C
+Lcommaaccent;013B
+Ldot;013F
+Ldotaccent;013F
+Ldotbelow;1E36
+Ldotbelowmacron;1E38
+Liwnarmenian;053C
+Lj;01C8
+Ljecyrillic;0409
+Llinebelow;1E3A
+Lmonospace;FF2C
+Lslash;0141
+Lslashsmall;F6F9
+Lsmall;F76C
+M;004D
+MBsquare;3386
+Macron;F6D0
+Macronsmall;F7AF
+Macute;1E3E
+Mcircle;24C2
+Mdotaccent;1E40
+Mdotbelow;1E42
+Menarmenian;0544
+Mmonospace;FF2D
+Msmall;F76D
+Mturned;019C
+Mu;039C
+N;004E
+NJ;01CA
+Nacute;0143
+Ncaron;0147
+Ncedilla;0145
+Ncircle;24C3
+Ncircumflexbelow;1E4A
+Ncommaaccent;0145
+Ndotaccent;1E44
+Ndotbelow;1E46
+Nhookleft;019D
+Nineroman;2168
+Nj;01CB
+Njecyrillic;040A
+Nlinebelow;1E48
+Nmonospace;FF2E
+Nowarmenian;0546
+Nsmall;F76E
+Ntilde;00D1
+Ntildesmall;F7F1
+Nu;039D
+O;004F
+OE;0152
+OEsmall;F6FA
+Oacute;00D3
+Oacutesmall;F7F3
+Obarredcyrillic;04E8
+Obarreddieresiscyrillic;04EA
+Obreve;014E
+Ocaron;01D1
+Ocenteredtilde;019F
+Ocircle;24C4
+Ocircumflex;00D4
+Ocircumflexacute;1ED0
+Ocircumflexdotbelow;1ED8
+Ocircumflexgrave;1ED2
+Ocircumflexhookabove;1ED4
+Ocircumflexsmall;F7F4
+Ocircumflextilde;1ED6
+Ocyrillic;041E
+Odblacute;0150
+Odblgrave;020C
+Odieresis;00D6
+Odieresiscyrillic;04E6
+Odieresissmall;F7F6
+Odotbelow;1ECC
+Ogoneksmall;F6FB
+Ograve;00D2
+Ogravesmall;F7F2
+Oharmenian;0555
+Ohm;2126
+Ohookabove;1ECE
+Ohorn;01A0
+Ohornacute;1EDA
+Ohorndotbelow;1EE2
+Ohorngrave;1EDC
+Ohornhookabove;1EDE
+Ohorntilde;1EE0
+Ohungarumlaut;0150
+Oi;01A2
+Oinvertedbreve;020E
+Omacron;014C
+Omacronacute;1E52
+Omacrongrave;1E50
+Omega;2126
+Omegacyrillic;0460
+Omegagreek;03A9
+Omegaroundcyrillic;047A
+Omegatitlocyrillic;047C
+Omegatonos;038F
+Omicron;039F
+Omicrontonos;038C
+Omonospace;FF2F
+Oneroman;2160
+Oogonek;01EA
+Oogonekmacron;01EC
+Oopen;0186
+Oslash;00D8
+Oslashacute;01FE
+Oslashsmall;F7F8
+Osmall;F76F
+Ostrokeacute;01FE
+Otcyrillic;047E
+Otilde;00D5
+Otildeacute;1E4C
+Otildedieresis;1E4E
+Otildesmall;F7F5
+P;0050
+Pacute;1E54
+Pcircle;24C5
+Pdotaccent;1E56
+Pecyrillic;041F
+Peharmenian;054A
+Pemiddlehookcyrillic;04A6
+Phi;03A6
+Phook;01A4
+Pi;03A0
+Piwrarmenian;0553
+Pmonospace;FF30
+Psi;03A8
+Psicyrillic;0470
+Psmall;F770
+Q;0051
+Qcircle;24C6
+Qmonospace;FF31
+Qsmall;F771
+R;0052
+Raarmenian;054C
+Racute;0154
+Rcaron;0158
+Rcedilla;0156
+Rcircle;24C7
+Rcommaaccent;0156
+Rdblgrave;0210
+Rdotaccent;1E58
+Rdotbelow;1E5A
+Rdotbelowmacron;1E5C
+Reharmenian;0550
+Rfraktur;211C
+Rho;03A1
+Ringsmall;F6FC
+Rinvertedbreve;0212
+Rlinebelow;1E5E
+Rmonospace;FF32
+Rsmall;F772
+Rsmallinverted;0281
+Rsmallinvertedsuperior;02B6
+S;0053
+SF010000;250C
+SF020000;2514
+SF030000;2510
+SF040000;2518
+SF050000;253C
+SF060000;252C
+SF070000;2534
+SF080000;251C
+SF090000;2524
+SF100000;2500
+SF110000;2502
+SF190000;2561
+SF200000;2562
+SF210000;2556
+SF220000;2555
+SF230000;2563
+SF240000;2551
+SF250000;2557
+SF260000;255D
+SF270000;255C
+SF280000;255B
+SF360000;255E
+SF370000;255F
+SF380000;255A
+SF390000;2554
+SF400000;2569
+SF410000;2566
+SF420000;2560
+SF430000;2550
+SF440000;256C
+SF450000;2567
+SF460000;2568
+SF470000;2564
+SF480000;2565
+SF490000;2559
+SF500000;2558
+SF510000;2552
+SF520000;2553
+SF530000;256B
+SF540000;256A
+Sacute;015A
+Sacutedotaccent;1E64
+Sampigreek;03E0
+Scaron;0160
+Scarondotaccent;1E66
+Scaronsmall;F6FD
+Scedilla;015E
+Schwa;018F
+Schwacyrillic;04D8
+Schwadieresiscyrillic;04DA
+Scircle;24C8
+Scircumflex;015C
+Scommaaccent;0218
+Sdotaccent;1E60
+Sdotbelow;1E62
+Sdotbelowdotaccent;1E68
+Seharmenian;054D
+Sevenroman;2166
+Shaarmenian;0547
+Shacyrillic;0428
+Shchacyrillic;0429
+Sheicoptic;03E2
+Shhacyrillic;04BA
+Shimacoptic;03EC
+Sigma;03A3
+Sixroman;2165
+Smonospace;FF33
+Softsigncyrillic;042C
+Ssmall;F773
+Stigmagreek;03DA
+T;0054
+Tau;03A4
+Tbar;0166
+Tcaron;0164
+Tcedilla;0162
+Tcircle;24C9
+Tcircumflexbelow;1E70
+Tcommaaccent;0162
+Tdotaccent;1E6A
+Tdotbelow;1E6C
+Tecyrillic;0422
+Tedescendercyrillic;04AC
+Tenroman;2169
+Tetsecyrillic;04B4
+Theta;0398
+Thook;01AC
+Thorn;00DE
+Thornsmall;F7FE
+Threeroman;2162
+Tildesmall;F6FE
+Tiwnarmenian;054F
+Tlinebelow;1E6E
+Tmonospace;FF34
+Toarmenian;0539
+Tonefive;01BC
+Tonesix;0184
+Tonetwo;01A7
+Tretroflexhook;01AE
+Tsecyrillic;0426
+Tshecyrillic;040B
+Tsmall;F774
+Twelveroman;216B
+Tworoman;2161
+U;0055
+Uacute;00DA
+Uacutesmall;F7FA
+Ubreve;016C
+Ucaron;01D3
+Ucircle;24CA
+Ucircumflex;00DB
+Ucircumflexbelow;1E76
+Ucircumflexsmall;F7FB
+Ucyrillic;0423
+Udblacute;0170
+Udblgrave;0214
+Udieresis;00DC
+Udieresisacute;01D7
+Udieresisbelow;1E72
+Udieresiscaron;01D9
+Udieresiscyrillic;04F0
+Udieresisgrave;01DB
+Udieresismacron;01D5
+Udieresissmall;F7FC
+Udotbelow;1EE4
+Ugrave;00D9
+Ugravesmall;F7F9
+Uhookabove;1EE6
+Uhorn;01AF
+Uhornacute;1EE8
+Uhorndotbelow;1EF0
+Uhorngrave;1EEA
+Uhornhookabove;1EEC
+Uhorntilde;1EEE
+Uhungarumlaut;0170
+Uhungarumlautcyrillic;04F2
+Uinvertedbreve;0216
+Ukcyrillic;0478
+Umacron;016A
+Umacroncyrillic;04EE
+Umacrondieresis;1E7A
+Umonospace;FF35
+Uogonek;0172
+Upsilon;03A5
+Upsilon1;03D2
+Upsilonacutehooksymbolgreek;03D3
+Upsilonafrican;01B1
+Upsilondieresis;03AB
+Upsilondieresishooksymbolgreek;03D4
+Upsilonhooksymbol;03D2
+Upsilontonos;038E
+Uring;016E
+Ushortcyrillic;040E
+Usmall;F775
+Ustraightcyrillic;04AE
+Ustraightstrokecyrillic;04B0
+Utilde;0168
+Utildeacute;1E78
+Utildebelow;1E74
+V;0056
+Vcircle;24CB
+Vdotbelow;1E7E
+Vecyrillic;0412
+Vewarmenian;054E
+Vhook;01B2
+Vmonospace;FF36
+Voarmenian;0548
+Vsmall;F776
+Vtilde;1E7C
+W;0057
+Wacute;1E82
+Wcircle;24CC
+Wcircumflex;0174
+Wdieresis;1E84
+Wdotaccent;1E86
+Wdotbelow;1E88
+Wgrave;1E80
+Wmonospace;FF37
+Wsmall;F777
+X;0058
+Xcircle;24CD
+Xdieresis;1E8C
+Xdotaccent;1E8A
+Xeharmenian;053D
+Xi;039E
+Xmonospace;FF38
+Xsmall;F778
+Y;0059
+Yacute;00DD
+Yacutesmall;F7FD
+Yatcyrillic;0462
+Ycircle;24CE
+Ycircumflex;0176
+Ydieresis;0178
+Ydieresissmall;F7FF
+Ydotaccent;1E8E
+Ydotbelow;1EF4
+Yericyrillic;042B
+Yerudieresiscyrillic;04F8
+Ygrave;1EF2
+Yhook;01B3
+Yhookabove;1EF6
+Yiarmenian;0545
+Yicyrillic;0407
+Yiwnarmenian;0552
+Ymonospace;FF39
+Ysmall;F779
+Ytilde;1EF8
+Yusbigcyrillic;046A
+Yusbigiotifiedcyrillic;046C
+Yuslittlecyrillic;0466
+Yuslittleiotifiedcyrillic;0468
+Z;005A
+Zaarmenian;0536
+Zacute;0179
+Zcaron;017D
+Zcaronsmall;F6FF
+Zcircle;24CF
+Zcircumflex;1E90
+Zdot;017B
+Zdotaccent;017B
+Zdotbelow;1E92
+Zecyrillic;0417
+Zedescendercyrillic;0498
+Zedieresiscyrillic;04DE
+Zeta;0396
+Zhearmenian;053A
+Zhebrevecyrillic;04C1
+Zhecyrillic;0416
+Zhedescendercyrillic;0496
+Zhedieresiscyrillic;04DC
+Zlinebelow;1E94
+Zmonospace;FF3A
+Zsmall;F77A
+Zstroke;01B5
+a;0061
+aabengali;0986
+aacute;00E1
+aadeva;0906
+aagujarati;0A86
+aagurmukhi;0A06
+aamatragurmukhi;0A3E
+aarusquare;3303
+aavowelsignbengali;09BE
+aavowelsigndeva;093E
+aavowelsigngujarati;0ABE
+abbreviationmarkarmenian;055F
+abbreviationsigndeva;0970
+abengali;0985
+abopomofo;311A
+abreve;0103
+abreveacute;1EAF
+abrevecyrillic;04D1
+abrevedotbelow;1EB7
+abrevegrave;1EB1
+abrevehookabove;1EB3
+abrevetilde;1EB5
+acaron;01CE
+acircle;24D0
+acircumflex;00E2
+acircumflexacute;1EA5
+acircumflexdotbelow;1EAD
+acircumflexgrave;1EA7
+acircumflexhookabove;1EA9
+acircumflextilde;1EAB
+acute;00B4
+acutebelowcmb;0317
+acutecmb;0301
+acutecomb;0301
+acutedeva;0954
+acutelowmod;02CF
+acutetonecmb;0341
+acyrillic;0430
+adblgrave;0201
+addakgurmukhi;0A71
+adeva;0905
+adieresis;00E4
+adieresiscyrillic;04D3
+adieresismacron;01DF
+adotbelow;1EA1
+adotmacron;01E1
+ae;00E6
+aeacute;01FD
+aekorean;3150
+aemacron;01E3
+afii00208;2015
+afii08941;20A4
+afii10017;0410
+afii10018;0411
+afii10019;0412
+afii10020;0413
+afii10021;0414
+afii10022;0415
+afii10023;0401
+afii10024;0416
+afii10025;0417
+afii10026;0418
+afii10027;0419
+afii10028;041A
+afii10029;041B
+afii10030;041C
+afii10031;041D
+afii10032;041E
+afii10033;041F
+afii10034;0420
+afii10035;0421
+afii10036;0422
+afii10037;0423
+afii10038;0424
+afii10039;0425
+afii10040;0426
+afii10041;0427
+afii10042;0428
+afii10043;0429
+afii10044;042A
+afii10045;042B
+afii10046;042C
+afii10047;042D
+afii10048;042E
+afii10049;042F
+afii10050;0490
+afii10051;0402
+afii10052;0403
+afii10053;0404
+afii10054;0405
+afii10055;0406
+afii10056;0407
+afii10057;0408
+afii10058;0409
+afii10059;040A
+afii10060;040B
+afii10061;040C
+afii10062;040E
+afii10063;F6C4
+afii10064;F6C5
+afii10065;0430
+afii10066;0431
+afii10067;0432
+afii10068;0433
+afii10069;0434
+afii10070;0435
+afii10071;0451
+afii10072;0436
+afii10073;0437
+afii10074;0438
+afii10075;0439
+afii10076;043A
+afii10077;043B
+afii10078;043C
+afii10079;043D
+afii10080;043E
+afii10081;043F
+afii10082;0440
+afii10083;0441
+afii10084;0442
+afii10085;0443
+afii10086;0444
+afii10087;0445
+afii10088;0446
+afii10089;0447
+afii10090;0448
+afii10091;0449
+afii10092;044A
+afii10093;044B
+afii10094;044C
+afii10095;044D
+afii10096;044E
+afii10097;044F
+afii10098;0491
+afii10099;0452
+afii10100;0453
+afii10101;0454
+afii10102;0455
+afii10103;0456
+afii10104;0457
+afii10105;0458
+afii10106;0459
+afii10107;045A
+afii10108;045B
+afii10109;045C
+afii10110;045E
+afii10145;040F
+afii10146;0462
+afii10147;0472
+afii10148;0474
+afii10192;F6C6
+afii10193;045F
+afii10194;0463
+afii10195;0473
+afii10196;0475
+afii10831;F6C7
+afii10832;F6C8
+afii10846;04D9
+afii299;200E
+afii300;200F
+afii301;200D
+afii57381;066A
+afii57388;060C
+afii57392;0660
+afii57393;0661
+afii57394;0662
+afii57395;0663
+afii57396;0664
+afii57397;0665
+afii57398;0666
+afii57399;0667
+afii57400;0668
+afii57401;0669
+afii57403;061B
+afii57407;061F
+afii57409;0621
+afii57410;0622
+afii57411;0623
+afii57412;0624
+afii57413;0625
+afii57414;0626
+afii57415;0627
+afii57416;0628
+afii57417;0629
+afii57418;062A
+afii57419;062B
+afii57420;062C
+afii57421;062D
+afii57422;062E
+afii57423;062F
+afii57424;0630
+afii57425;0631
+afii57426;0632
+afii57427;0633
+afii57428;0634
+afii57429;0635
+afii57430;0636
+afii57431;0637
+afii57432;0638
+afii57433;0639
+afii57434;063A
+afii57440;0640
+afii57441;0641
+afii57442;0642
+afii57443;0643
+afii57444;0644
+afii57445;0645
+afii57446;0646
+afii57448;0648
+afii57449;0649
+afii57450;064A
+afii57451;064B
+afii57452;064C
+afii57453;064D
+afii57454;064E
+afii57455;064F
+afii57456;0650
+afii57457;0651
+afii57458;0652
+afii57470;0647
+afii57505;06A4
+afii57506;067E
+afii57507;0686
+afii57508;0698
+afii57509;06AF
+afii57511;0679
+afii57512;0688
+afii57513;0691
+afii57514;06BA
+afii57519;06D2
+afii57534;06D5
+afii57636;20AA
+afii57645;05BE
+afii57658;05C3
+afii57664;05D0
+afii57665;05D1
+afii57666;05D2
+afii57667;05D3
+afii57668;05D4
+afii57669;05D5
+afii57670;05D6
+afii57671;05D7
+afii57672;05D8
+afii57673;05D9
+afii57674;05DA
+afii57675;05DB
+afii57676;05DC
+afii57677;05DD
+afii57678;05DE
+afii57679;05DF
+afii57680;05E0
+afii57681;05E1
+afii57682;05E2
+afii57683;05E3
+afii57684;05E4
+afii57685;05E5
+afii57686;05E6
+afii57687;05E7
+afii57688;05E8
+afii57689;05E9
+afii57690;05EA
+afii57694;FB2A
+afii57695;FB2B
+afii57700;FB4B
+afii57705;FB1F
+afii57716;05F0
+afii57717;05F1
+afii57718;05F2
+afii57723;FB35
+afii57793;05B4
+afii57794;05B5
+afii57795;05B6
+afii57796;05BB
+afii57797;05B8
+afii57798;05B7
+afii57799;05B0
+afii57800;05B2
+afii57801;05B1
+afii57802;05B3
+afii57803;05C2
+afii57804;05C1
+afii57806;05B9
+afii57807;05BC
+afii57839;05BD
+afii57841;05BF
+afii57842;05C0
+afii57929;02BC
+afii61248;2105
+afii61289;2113
+afii61352;2116
+afii61573;202C
+afii61574;202D
+afii61575;202E
+afii61664;200C
+afii63167;066D
+afii64937;02BD
+agrave;00E0
+agujarati;0A85
+agurmukhi;0A05
+ahiragana;3042
+ahookabove;1EA3
+aibengali;0990
+aibopomofo;311E
+aideva;0910
+aiecyrillic;04D5
+aigujarati;0A90
+aigurmukhi;0A10
+aimatragurmukhi;0A48
+ainarabic;0639
+ainfinalarabic;FECA
+aininitialarabic;FECB
+ainmedialarabic;FECC
+ainvertedbreve;0203
+aivowelsignbengali;09C8
+aivowelsigndeva;0948
+aivowelsigngujarati;0AC8
+akatakana;30A2
+akatakanahalfwidth;FF71
+akorean;314F
+alef;05D0
+alefarabic;0627
+alefdageshhebrew;FB30
+aleffinalarabic;FE8E
+alefhamzaabovearabic;0623
+alefhamzaabovefinalarabic;FE84
+alefhamzabelowarabic;0625
+alefhamzabelowfinalarabic;FE88
+alefhebrew;05D0
+aleflamedhebrew;FB4F
+alefmaddaabovearabic;0622
+alefmaddaabovefinalarabic;FE82
+alefmaksuraarabic;0649
+alefmaksurafinalarabic;FEF0
+alefmaksurainitialarabic;FEF3
+alefmaksuramedialarabic;FEF4
+alefpatahhebrew;FB2E
+alefqamatshebrew;FB2F
+aleph;2135
+allequal;224C
+alpha;03B1
+alphatonos;03AC
+amacron;0101
+amonospace;FF41
+ampersand;0026
+ampersandmonospace;FF06
+ampersandsmall;F726
+amsquare;33C2
+anbopomofo;3122
+angbopomofo;3124
+angkhankhuthai;0E5A
+angle;2220
+anglebracketleft;3008
+anglebracketleftvertical;FE3F
+anglebracketright;3009
+anglebracketrightvertical;FE40
+angleleft;2329
+angleright;232A
+angstrom;212B
+anoteleia;0387
+anudattadeva;0952
+anusvarabengali;0982
+anusvaradeva;0902
+anusvaragujarati;0A82
+aogonek;0105
+apaatosquare;3300
+aparen;249C
+apostrophearmenian;055A
+apostrophemod;02BC
+apple;F8FF
+approaches;2250
+approxequal;2248
+approxequalorimage;2252
+approximatelyequal;2245
+araeaekorean;318E
+araeakorean;318D
+arc;2312
+arighthalfring;1E9A
+aring;00E5
+aringacute;01FB
+aringbelow;1E01
+arrowboth;2194
+arrowdashdown;21E3
+arrowdashleft;21E0
+arrowdashright;21E2
+arrowdashup;21E1
+arrowdblboth;21D4
+arrowdbldown;21D3
+arrowdblleft;21D0
+arrowdblright;21D2
+arrowdblup;21D1
+arrowdown;2193
+arrowdownleft;2199
+arrowdownright;2198
+arrowdownwhite;21E9
+arrowheaddownmod;02C5
+arrowheadleftmod;02C2
+arrowheadrightmod;02C3
+arrowheadupmod;02C4
+arrowhorizex;F8E7
+arrowleft;2190
+arrowleftdbl;21D0
+arrowleftdblstroke;21CD
+arrowleftoverright;21C6
+arrowleftwhite;21E6
+arrowright;2192
+arrowrightdblstroke;21CF
+arrowrightheavy;279E
+arrowrightoverleft;21C4
+arrowrightwhite;21E8
+arrowtableft;21E4
+arrowtabright;21E5
+arrowup;2191
+arrowupdn;2195
+arrowupdnbse;21A8
+arrowupdownbase;21A8
+arrowupleft;2196
+arrowupleftofdown;21C5
+arrowupright;2197
+arrowupwhite;21E7
+arrowvertex;F8E6
+asciicircum;005E
+asciicircummonospace;FF3E
+asciitilde;007E
+asciitildemonospace;FF5E
+ascript;0251
+ascriptturned;0252
+asmallhiragana;3041
+asmallkatakana;30A1
+asmallkatakanahalfwidth;FF67
+asterisk;002A
+asteriskaltonearabic;066D
+asteriskarabic;066D
+asteriskmath;2217
+asteriskmonospace;FF0A
+asterisksmall;FE61
+asterism;2042
+asuperior;F6E9
+asymptoticallyequal;2243
+at;0040
+atilde;00E3
+atmonospace;FF20
+atsmall;FE6B
+aturned;0250
+aubengali;0994
+aubopomofo;3120
+audeva;0914
+augujarati;0A94
+augurmukhi;0A14
+aulengthmarkbengali;09D7
+aumatragurmukhi;0A4C
+auvowelsignbengali;09CC
+auvowelsigndeva;094C
+auvowelsigngujarati;0ACC
+avagrahadeva;093D
+aybarmenian;0561
+ayin;05E2
+ayinaltonehebrew;FB20
+ayinhebrew;05E2
+b;0062
+babengali;09AC
+backslash;005C
+backslashmonospace;FF3C
+badeva;092C
+bagujarati;0AAC
+bagurmukhi;0A2C
+bahiragana;3070
+bahtthai;0E3F
+bakatakana;30D0
+bar;007C
+barmonospace;FF5C
+bbopomofo;3105
+bcircle;24D1
+bdotaccent;1E03
+bdotbelow;1E05
+beamedsixteenthnotes;266C
+because;2235
+becyrillic;0431
+beharabic;0628
+behfinalarabic;FE90
+behinitialarabic;FE91
+behiragana;3079
+behmedialarabic;FE92
+behmeeminitialarabic;FC9F
+behmeemisolatedarabic;FC08
+behnoonfinalarabic;FC6D
+bekatakana;30D9
+benarmenian;0562
+bet;05D1
+beta;03B2
+betasymbolgreek;03D0
+betdagesh;FB31
+betdageshhebrew;FB31
+bethebrew;05D1
+betrafehebrew;FB4C
+bhabengali;09AD
+bhadeva;092D
+bhagujarati;0AAD
+bhagurmukhi;0A2D
+bhook;0253
+bihiragana;3073
+bikatakana;30D3
+bilabialclick;0298
+bindigurmukhi;0A02
+birusquare;3331
+blackcircle;25CF
+blackdiamond;25C6
+blackdownpointingtriangle;25BC
+blackleftpointingpointer;25C4
+blackleftpointingtriangle;25C0
+blacklenticularbracketleft;3010
+blacklenticularbracketleftvertical;FE3B
+blacklenticularbracketright;3011
+blacklenticularbracketrightvertical;FE3C
+blacklowerlefttriangle;25E3
+blacklowerrighttriangle;25E2
+blackrectangle;25AC
+blackrightpointingpointer;25BA
+blackrightpointingtriangle;25B6
+blacksmallsquare;25AA
+blacksmilingface;263B
+blacksquare;25A0
+blackstar;2605
+blackupperlefttriangle;25E4
+blackupperrighttriangle;25E5
+blackuppointingsmalltriangle;25B4
+blackuppointingtriangle;25B2
+blank;2423
+blinebelow;1E07
+block;2588
+bmonospace;FF42
+bobaimaithai;0E1A
+bohiragana;307C
+bokatakana;30DC
+bparen;249D
+bqsquare;33C3
+braceex;F8F4
+braceleft;007B
+braceleftbt;F8F3
+braceleftmid;F8F2
+braceleftmonospace;FF5B
+braceleftsmall;FE5B
+bracelefttp;F8F1
+braceleftvertical;FE37
+braceright;007D
+bracerightbt;F8FE
+bracerightmid;F8FD
+bracerightmonospace;FF5D
+bracerightsmall;FE5C
+bracerighttp;F8FC
+bracerightvertical;FE38
+bracketleft;005B
+bracketleftbt;F8F0
+bracketleftex;F8EF
+bracketleftmonospace;FF3B
+bracketlefttp;F8EE
+bracketright;005D
+bracketrightbt;F8FB
+bracketrightex;F8FA
+bracketrightmonospace;FF3D
+bracketrighttp;F8F9
+breve;02D8
+brevebelowcmb;032E
+brevecmb;0306
+breveinvertedbelowcmb;032F
+breveinvertedcmb;0311
+breveinverteddoublecmb;0361
+bridgebelowcmb;032A
+bridgeinvertedbelowcmb;033A
+brokenbar;00A6
+bstroke;0180
+bsuperior;F6EA
+btopbar;0183
+buhiragana;3076
+bukatakana;30D6
+bullet;2022
+bulletinverse;25D8
+bulletoperator;2219
+bullseye;25CE
+c;0063
+caarmenian;056E
+cabengali;099A
+cacute;0107
+cadeva;091A
+cagujarati;0A9A
+cagurmukhi;0A1A
+calsquare;3388
+candrabindubengali;0981
+candrabinducmb;0310
+candrabindudeva;0901
+candrabindugujarati;0A81
+capslock;21EA
+careof;2105
+caron;02C7
+caronbelowcmb;032C
+caroncmb;030C
+carriagereturn;21B5
+cbopomofo;3118
+ccaron;010D
+ccedilla;00E7
+ccedillaacute;1E09
+ccircle;24D2
+ccircumflex;0109
+ccurl;0255
+cdot;010B
+cdotaccent;010B
+cdsquare;33C5
+cedilla;00B8
+cedillacmb;0327
+cent;00A2
+centigrade;2103
+centinferior;F6DF
+centmonospace;FFE0
+centoldstyle;F7A2
+centsuperior;F6E0
+chaarmenian;0579
+chabengali;099B
+chadeva;091B
+chagujarati;0A9B
+chagurmukhi;0A1B
+chbopomofo;3114
+cheabkhasiancyrillic;04BD
+checkmark;2713
+checyrillic;0447
+chedescenderabkhasiancyrillic;04BF
+chedescendercyrillic;04B7
+chedieresiscyrillic;04F5
+cheharmenian;0573
+chekhakassiancyrillic;04CC
+cheverticalstrokecyrillic;04B9
+chi;03C7
+chieuchacirclekorean;3277
+chieuchaparenkorean;3217
+chieuchcirclekorean;3269
+chieuchkorean;314A
+chieuchparenkorean;3209
+chochangthai;0E0A
+chochanthai;0E08
+chochingthai;0E09
+chochoethai;0E0C
+chook;0188
+cieucacirclekorean;3276
+cieucaparenkorean;3216
+cieuccirclekorean;3268
+cieuckorean;3148
+cieucparenkorean;3208
+cieucuparenkorean;321C
+circle;25CB
+circlemultiply;2297
+circleot;2299
+circleplus;2295
+circlepostalmark;3036
+circlewithlefthalfblack;25D0
+circlewithrighthalfblack;25D1
+circumflex;02C6
+circumflexbelowcmb;032D
+circumflexcmb;0302
+clear;2327
+clickalveolar;01C2
+clickdental;01C0
+clicklateral;01C1
+clickretroflex;01C3
+club;2663
+clubsuitblack;2663
+clubsuitwhite;2667
+cmcubedsquare;33A4
+cmonospace;FF43
+cmsquaredsquare;33A0
+coarmenian;0581
+colon;003A
+colonmonetary;20A1
+colonmonospace;FF1A
+colonsign;20A1
+colonsmall;FE55
+colontriangularhalfmod;02D1
+colontriangularmod;02D0
+comma;002C
+commaabovecmb;0313
+commaaboverightcmb;0315
+commaaccent;F6C3
+commaarabic;060C
+commaarmenian;055D
+commainferior;F6E1
+commamonospace;FF0C
+commareversedabovecmb;0314
+commareversedmod;02BD
+commasmall;FE50
+commasuperior;F6E2
+commaturnedabovecmb;0312
+commaturnedmod;02BB
+compass;263C
+congruent;2245
+contourintegral;222E
+control;2303
+controlACK;0006
+controlBEL;0007
+controlBS;0008
+controlCAN;0018
+controlCR;000D
+controlDC1;0011
+controlDC2;0012
+controlDC3;0013
+controlDC4;0014
+controlDEL;007F
+controlDLE;0010
+controlEM;0019
+controlENQ;0005
+controlEOT;0004
+controlESC;001B
+controlETB;0017
+controlETX;0003
+controlFF;000C
+controlFS;001C
+controlGS;001D
+controlHT;0009
+controlLF;000A
+controlNAK;0015
+controlRS;001E
+controlSI;000F
+controlSO;000E
+controlSOT;0002
+controlSTX;0001
+controlSUB;001A
+controlSYN;0016
+controlUS;001F
+controlVT;000B
+copyright;00A9
+copyrightsans;F8E9
+copyrightserif;F6D9
+cornerbracketleft;300C
+cornerbracketlefthalfwidth;FF62
+cornerbracketleftvertical;FE41
+cornerbracketright;300D
+cornerbracketrighthalfwidth;FF63
+cornerbracketrightvertical;FE42
+corporationsquare;337F
+cosquare;33C7
+coverkgsquare;33C6
+cparen;249E
+cruzeiro;20A2
+cstretched;0297
+curlyand;22CF
+curlyor;22CE
+currency;00A4
+cyrBreve;F6D1
+cyrFlex;F6D2
+cyrbreve;F6D4
+cyrflex;F6D5
+d;0064
+daarmenian;0564
+dabengali;09A6
+dadarabic;0636
+dadeva;0926
+dadfinalarabic;FEBE
+dadinitialarabic;FEBF
+dadmedialarabic;FEC0
+dagesh;05BC
+dageshhebrew;05BC
+dagger;2020
+daggerdbl;2021
+dagujarati;0AA6
+dagurmukhi;0A26
+dahiragana;3060
+dakatakana;30C0
+dalarabic;062F
+dalet;05D3
+daletdagesh;FB33
+daletdageshhebrew;FB33
+dalethatafpatah;05D3 05B2
+dalethatafpatahhebrew;05D3 05B2
+dalethatafsegol;05D3 05B1
+dalethatafsegolhebrew;05D3 05B1
+dalethebrew;05D3
+dalethiriq;05D3 05B4
+dalethiriqhebrew;05D3 05B4
+daletholam;05D3 05B9
+daletholamhebrew;05D3 05B9
+daletpatah;05D3 05B7
+daletpatahhebrew;05D3 05B7
+daletqamats;05D3 05B8
+daletqamatshebrew;05D3 05B8
+daletqubuts;05D3 05BB
+daletqubutshebrew;05D3 05BB
+daletsegol;05D3 05B6
+daletsegolhebrew;05D3 05B6
+daletsheva;05D3 05B0
+daletshevahebrew;05D3 05B0
+dalettsere;05D3 05B5
+dalettserehebrew;05D3 05B5
+dalfinalarabic;FEAA
+dammaarabic;064F
+dammalowarabic;064F
+dammatanaltonearabic;064C
+dammatanarabic;064C
+danda;0964
+dargahebrew;05A7
+dargalefthebrew;05A7
+dasiapneumatacyrilliccmb;0485
+dblGrave;F6D3
+dblanglebracketleft;300A
+dblanglebracketleftvertical;FE3D
+dblanglebracketright;300B
+dblanglebracketrightvertical;FE3E
+dblarchinvertedbelowcmb;032B
+dblarrowleft;21D4
+dblarrowright;21D2
+dbldanda;0965
+dblgrave;F6D6
+dblgravecmb;030F
+dblintegral;222C
+dbllowline;2017
+dbllowlinecmb;0333
+dbloverlinecmb;033F
+dblprimemod;02BA
+dblverticalbar;2016
+dblverticallineabovecmb;030E
+dbopomofo;3109
+dbsquare;33C8
+dcaron;010F
+dcedilla;1E11
+dcircle;24D3
+dcircumflexbelow;1E13
+dcroat;0111
+ddabengali;09A1
+ddadeva;0921
+ddagujarati;0AA1
+ddagurmukhi;0A21
+ddalarabic;0688
+ddalfinalarabic;FB89
+dddhadeva;095C
+ddhabengali;09A2
+ddhadeva;0922
+ddhagujarati;0AA2
+ddhagurmukhi;0A22
+ddotaccent;1E0B
+ddotbelow;1E0D
+decimalseparatorarabic;066B
+decimalseparatorpersian;066B
+decyrillic;0434
+degree;00B0
+dehihebrew;05AD
+dehiragana;3067
+deicoptic;03EF
+dekatakana;30C7
+deleteleft;232B
+deleteright;2326
+delta;03B4
+deltaturned;018D
+denominatorminusonenumeratorbengali;09F8
+dezh;02A4
+dhabengali;09A7
+dhadeva;0927
+dhagujarati;0AA7
+dhagurmukhi;0A27
+dhook;0257
+dialytikatonos;0385
+dialytikatonoscmb;0344
+diamond;2666
+diamondsuitwhite;2662
+dieresis;00A8
+dieresisacute;F6D7
+dieresisbelowcmb;0324
+dieresiscmb;0308
+dieresisgrave;F6D8
+dieresistonos;0385
+dihiragana;3062
+dikatakana;30C2
+dittomark;3003
+divide;00F7
+divides;2223
+divisionslash;2215
+djecyrillic;0452
+dkshade;2593
+dlinebelow;1E0F
+dlsquare;3397
+dmacron;0111
+dmonospace;FF44
+dnblock;2584
+dochadathai;0E0E
+dodekthai;0E14
+dohiragana;3069
+dokatakana;30C9
+dollar;0024
+dollarinferior;F6E3
+dollarmonospace;FF04
+dollaroldstyle;F724
+dollarsmall;FE69
+dollarsuperior;F6E4
+dong;20AB
+dorusquare;3326
+dotaccent;02D9
+dotaccentcmb;0307
+dotbelowcmb;0323
+dotbelowcomb;0323
+dotkatakana;30FB
+dotlessi;0131
+dotlessj;F6BE
+dotlessjstrokehook;0284
+dotmath;22C5
+dottedcircle;25CC
+doubleyodpatah;FB1F
+doubleyodpatahhebrew;FB1F
+downtackbelowcmb;031E
+downtackmod;02D5
+dparen;249F
+dsuperior;F6EB
+dtail;0256
+dtopbar;018C
+duhiragana;3065
+dukatakana;30C5
+dz;01F3
+dzaltone;02A3
+dzcaron;01C6
+dzcurl;02A5
+dzeabkhasiancyrillic;04E1
+dzecyrillic;0455
+dzhecyrillic;045F
+e;0065
+eacute;00E9
+earth;2641
+ebengali;098F
+ebopomofo;311C
+ebreve;0115
+ecandradeva;090D
+ecandragujarati;0A8D
+ecandravowelsigndeva;0945
+ecandravowelsigngujarati;0AC5
+ecaron;011B
+ecedillabreve;1E1D
+echarmenian;0565
+echyiwnarmenian;0587
+ecircle;24D4
+ecircumflex;00EA
+ecircumflexacute;1EBF
+ecircumflexbelow;1E19
+ecircumflexdotbelow;1EC7
+ecircumflexgrave;1EC1
+ecircumflexhookabove;1EC3
+ecircumflextilde;1EC5
+ecyrillic;0454
+edblgrave;0205
+edeva;090F
+edieresis;00EB
+edot;0117
+edotaccent;0117
+edotbelow;1EB9
+eegurmukhi;0A0F
+eematragurmukhi;0A47
+efcyrillic;0444
+egrave;00E8
+egujarati;0A8F
+eharmenian;0567
+ehbopomofo;311D
+ehiragana;3048
+ehookabove;1EBB
+eibopomofo;311F
+eight;0038
+eightarabic;0668
+eightbengali;09EE
+eightcircle;2467
+eightcircleinversesansserif;2791
+eightdeva;096E
+eighteencircle;2471
+eighteenparen;2485
+eighteenperiod;2499
+eightgujarati;0AEE
+eightgurmukhi;0A6E
+eighthackarabic;0668
+eighthangzhou;3028
+eighthnotebeamed;266B
+eightideographicparen;3227
+eightinferior;2088
+eightmonospace;FF18
+eightoldstyle;F738
+eightparen;247B
+eightperiod;248F
+eightpersian;06F8
+eightroman;2177
+eightsuperior;2078
+eightthai;0E58
+einvertedbreve;0207
+eiotifiedcyrillic;0465
+ekatakana;30A8
+ekatakanahalfwidth;FF74
+ekonkargurmukhi;0A74
+ekorean;3154
+elcyrillic;043B
+element;2208
+elevencircle;246A
+elevenparen;247E
+elevenperiod;2492
+elevenroman;217A
+ellipsis;2026
+ellipsisvertical;22EE
+emacron;0113
+emacronacute;1E17
+emacrongrave;1E15
+emcyrillic;043C
+emdash;2014
+emdashvertical;FE31
+emonospace;FF45
+emphasismarkarmenian;055B
+emptyset;2205
+enbopomofo;3123
+encyrillic;043D
+endash;2013
+endashvertical;FE32
+endescendercyrillic;04A3
+eng;014B
+engbopomofo;3125
+enghecyrillic;04A5
+enhookcyrillic;04C8
+enspace;2002
+eogonek;0119
+eokorean;3153
+eopen;025B
+eopenclosed;029A
+eopenreversed;025C
+eopenreversedclosed;025E
+eopenreversedhook;025D
+eparen;24A0
+epsilon;03B5
+epsilontonos;03AD
+equal;003D
+equalmonospace;FF1D
+equalsmall;FE66
+equalsuperior;207C
+equivalence;2261
+erbopomofo;3126
+ercyrillic;0440
+ereversed;0258
+ereversedcyrillic;044D
+escyrillic;0441
+esdescendercyrillic;04AB
+esh;0283
+eshcurl;0286
+eshortdeva;090E
+eshortvowelsigndeva;0946
+eshreversedloop;01AA
+eshsquatreversed;0285
+esmallhiragana;3047
+esmallkatakana;30A7
+esmallkatakanahalfwidth;FF6A
+estimated;212E
+esuperior;F6EC
+eta;03B7
+etarmenian;0568
+etatonos;03AE
+eth;00F0
+etilde;1EBD
+etildebelow;1E1B
+etnahtafoukhhebrew;0591
+etnahtafoukhlefthebrew;0591
+etnahtahebrew;0591
+etnahtalefthebrew;0591
+eturned;01DD
+eukorean;3161
+euro;20AC
+evowelsignbengali;09C7
+evowelsigndeva;0947
+evowelsigngujarati;0AC7
+exclam;0021
+exclamarmenian;055C
+exclamdbl;203C
+exclamdown;00A1
+exclamdownsmall;F7A1
+exclammonospace;FF01
+exclamsmall;F721
+existential;2203
+ezh;0292
+ezhcaron;01EF
+ezhcurl;0293
+ezhreversed;01B9
+ezhtail;01BA
+f;0066
+fadeva;095E
+fagurmukhi;0A5E
+fahrenheit;2109
+fathaarabic;064E
+fathalowarabic;064E
+fathatanarabic;064B
+fbopomofo;3108
+fcircle;24D5
+fdotaccent;1E1F
+feharabic;0641
+feharmenian;0586
+fehfinalarabic;FED2
+fehinitialarabic;FED3
+fehmedialarabic;FED4
+feicoptic;03E5
+female;2640
+ff;FB00
+ffi;FB03
+ffl;FB04
+fi;FB01
+fifteencircle;246E
+fifteenparen;2482
+fifteenperiod;2496
+figuredash;2012
+filledbox;25A0
+filledrect;25AC
+finalkaf;05DA
+finalkafdagesh;FB3A
+finalkafdageshhebrew;FB3A
+finalkafhebrew;05DA
+finalkafqamats;05DA 05B8
+finalkafqamatshebrew;05DA 05B8
+finalkafsheva;05DA 05B0
+finalkafshevahebrew;05DA 05B0
+finalmem;05DD
+finalmemhebrew;05DD
+finalnun;05DF
+finalnunhebrew;05DF
+finalpe;05E3
+finalpehebrew;05E3
+finaltsadi;05E5
+finaltsadihebrew;05E5
+firsttonechinese;02C9
+fisheye;25C9
+fitacyrillic;0473
+five;0035
+fivearabic;0665
+fivebengali;09EB
+fivecircle;2464
+fivecircleinversesansserif;278E
+fivedeva;096B
+fiveeighths;215D
+fivegujarati;0AEB
+fivegurmukhi;0A6B
+fivehackarabic;0665
+fivehangzhou;3025
+fiveideographicparen;3224
+fiveinferior;2085
+fivemonospace;FF15
+fiveoldstyle;F735
+fiveparen;2478
+fiveperiod;248C
+fivepersian;06F5
+fiveroman;2174
+fivesuperior;2075
+fivethai;0E55
+fl;FB02
+florin;0192
+fmonospace;FF46
+fmsquare;3399
+fofanthai;0E1F
+fofathai;0E1D
+fongmanthai;0E4F
+forall;2200
+four;0034
+fourarabic;0664
+fourbengali;09EA
+fourcircle;2463
+fourcircleinversesansserif;278D
+fourdeva;096A
+fourgujarati;0AEA
+fourgurmukhi;0A6A
+fourhackarabic;0664
+fourhangzhou;3024
+fourideographicparen;3223
+fourinferior;2084
+fourmonospace;FF14
+fournumeratorbengali;09F7
+fouroldstyle;F734
+fourparen;2477
+fourperiod;248B
+fourpersian;06F4
+fourroman;2173
+foursuperior;2074
+fourteencircle;246D
+fourteenparen;2481
+fourteenperiod;2495
+fourthai;0E54
+fourthtonechinese;02CB
+fparen;24A1
+fraction;2044
+franc;20A3
+g;0067
+gabengali;0997
+gacute;01F5
+gadeva;0917
+gafarabic;06AF
+gaffinalarabic;FB93
+gafinitialarabic;FB94
+gafmedialarabic;FB95
+gagujarati;0A97
+gagurmukhi;0A17
+gahiragana;304C
+gakatakana;30AC
+gamma;03B3
+gammalatinsmall;0263
+gammasuperior;02E0
+gangiacoptic;03EB
+gbopomofo;310D
+gbreve;011F
+gcaron;01E7
+gcedilla;0123
+gcircle;24D6
+gcircumflex;011D
+gcommaaccent;0123
+gdot;0121
+gdotaccent;0121
+gecyrillic;0433
+gehiragana;3052
+gekatakana;30B2
+geometricallyequal;2251
+gereshaccenthebrew;059C
+gereshhebrew;05F3
+gereshmuqdamhebrew;059D
+germandbls;00DF
+gershayimaccenthebrew;059E
+gershayimhebrew;05F4
+getamark;3013
+ghabengali;0998
+ghadarmenian;0572
+ghadeva;0918
+ghagujarati;0A98
+ghagurmukhi;0A18
+ghainarabic;063A
+ghainfinalarabic;FECE
+ghaininitialarabic;FECF
+ghainmedialarabic;FED0
+ghemiddlehookcyrillic;0495
+ghestrokecyrillic;0493
+gheupturncyrillic;0491
+ghhadeva;095A
+ghhagurmukhi;0A5A
+ghook;0260
+ghzsquare;3393
+gihiragana;304E
+gikatakana;30AE
+gimarmenian;0563
+gimel;05D2
+gimeldagesh;FB32
+gimeldageshhebrew;FB32
+gimelhebrew;05D2
+gjecyrillic;0453
+glottalinvertedstroke;01BE
+glottalstop;0294
+glottalstopinverted;0296
+glottalstopmod;02C0
+glottalstopreversed;0295
+glottalstopreversedmod;02C1
+glottalstopreversedsuperior;02E4
+glottalstopstroke;02A1
+glottalstopstrokereversed;02A2
+gmacron;1E21
+gmonospace;FF47
+gohiragana;3054
+gokatakana;30B4
+gparen;24A2
+gpasquare;33AC
+gradient;2207
+grave;0060
+gravebelowcmb;0316
+gravecmb;0300
+gravecomb;0300
+gravedeva;0953
+gravelowmod;02CE
+gravemonospace;FF40
+gravetonecmb;0340
+greater;003E
+greaterequal;2265
+greaterequalorless;22DB
+greatermonospace;FF1E
+greaterorequivalent;2273
+greaterorless;2277
+greateroverequal;2267
+greatersmall;FE65
+gscript;0261
+gstroke;01E5
+guhiragana;3050
+guillemotleft;00AB
+guillemotright;00BB
+guilsinglleft;2039
+guilsinglright;203A
+gukatakana;30B0
+guramusquare;3318
+gysquare;33C9
+h;0068
+haabkhasiancyrillic;04A9
+haaltonearabic;06C1
+habengali;09B9
+hadescendercyrillic;04B3
+hadeva;0939
+hagujarati;0AB9
+hagurmukhi;0A39
+haharabic;062D
+hahfinalarabic;FEA2
+hahinitialarabic;FEA3
+hahiragana;306F
+hahmedialarabic;FEA4
+haitusquare;332A
+hakatakana;30CF
+hakatakanahalfwidth;FF8A
+halantgurmukhi;0A4D
+hamzaarabic;0621
+hamzadammaarabic;0621 064F
+hamzadammatanarabic;0621 064C
+hamzafathaarabic;0621 064E
+hamzafathatanarabic;0621 064B
+hamzalowarabic;0621
+hamzalowkasraarabic;0621 0650
+hamzalowkasratanarabic;0621 064D
+hamzasukunarabic;0621 0652
+hangulfiller;3164
+hardsigncyrillic;044A
+harpoonleftbarbup;21BC
+harpoonrightbarbup;21C0
+hasquare;33CA
+hatafpatah;05B2
+hatafpatah16;05B2
+hatafpatah23;05B2
+hatafpatah2f;05B2
+hatafpatahhebrew;05B2
+hatafpatahnarrowhebrew;05B2
+hatafpatahquarterhebrew;05B2
+hatafpatahwidehebrew;05B2
+hatafqamats;05B3
+hatafqamats1b;05B3
+hatafqamats28;05B3
+hatafqamats34;05B3
+hatafqamatshebrew;05B3
+hatafqamatsnarrowhebrew;05B3
+hatafqamatsquarterhebrew;05B3
+hatafqamatswidehebrew;05B3
+hatafsegol;05B1
+hatafsegol17;05B1
+hatafsegol24;05B1
+hatafsegol30;05B1
+hatafsegolhebrew;05B1
+hatafsegolnarrowhebrew;05B1
+hatafsegolquarterhebrew;05B1
+hatafsegolwidehebrew;05B1
+hbar;0127
+hbopomofo;310F
+hbrevebelow;1E2B
+hcedilla;1E29
+hcircle;24D7
+hcircumflex;0125
+hdieresis;1E27
+hdotaccent;1E23
+hdotbelow;1E25
+he;05D4
+heart;2665
+heartsuitblack;2665
+heartsuitwhite;2661
+hedagesh;FB34
+hedageshhebrew;FB34
+hehaltonearabic;06C1
+heharabic;0647
+hehebrew;05D4
+hehfinalaltonearabic;FBA7
+hehfinalalttwoarabic;FEEA
+hehfinalarabic;FEEA
+hehhamzaabovefinalarabic;FBA5
+hehhamzaaboveisolatedarabic;FBA4
+hehinitialaltonearabic;FBA8
+hehinitialarabic;FEEB
+hehiragana;3078
+hehmedialaltonearabic;FBA9
+hehmedialarabic;FEEC
+heiseierasquare;337B
+hekatakana;30D8
+hekatakanahalfwidth;FF8D
+hekutaarusquare;3336
+henghook;0267
+herutusquare;3339
+het;05D7
+hethebrew;05D7
+hhook;0266
+hhooksuperior;02B1
+hieuhacirclekorean;327B
+hieuhaparenkorean;321B
+hieuhcirclekorean;326D
+hieuhkorean;314E
+hieuhparenkorean;320D
+hihiragana;3072
+hikatakana;30D2
+hikatakanahalfwidth;FF8B
+hiriq;05B4
+hiriq14;05B4
+hiriq21;05B4
+hiriq2d;05B4
+hiriqhebrew;05B4
+hiriqnarrowhebrew;05B4
+hiriqquarterhebrew;05B4
+hiriqwidehebrew;05B4
+hlinebelow;1E96
+hmonospace;FF48
+hoarmenian;0570
+hohipthai;0E2B
+hohiragana;307B
+hokatakana;30DB
+hokatakanahalfwidth;FF8E
+holam;05B9
+holam19;05B9
+holam26;05B9
+holam32;05B9
+holamhebrew;05B9
+holamnarrowhebrew;05B9
+holamquarterhebrew;05B9
+holamwidehebrew;05B9
+honokhukthai;0E2E
+hookabovecomb;0309
+hookcmb;0309
+hookpalatalizedbelowcmb;0321
+hookretroflexbelowcmb;0322
+hoonsquare;3342
+horicoptic;03E9
+horizontalbar;2015
+horncmb;031B
+hotsprings;2668
+house;2302
+hparen;24A3
+hsuperior;02B0
+hturned;0265
+huhiragana;3075
+huiitosquare;3333
+hukatakana;30D5
+hukatakanahalfwidth;FF8C
+hungarumlaut;02DD
+hungarumlautcmb;030B
+hv;0195
+hyphen;002D
+hypheninferior;F6E5
+hyphenmonospace;FF0D
+hyphensmall;FE63
+hyphensuperior;F6E6
+hyphentwo;2010
+i;0069
+iacute;00ED
+iacyrillic;044F
+ibengali;0987
+ibopomofo;3127
+ibreve;012D
+icaron;01D0
+icircle;24D8
+icircumflex;00EE
+icyrillic;0456
+idblgrave;0209
+ideographearthcircle;328F
+ideographfirecircle;328B
+ideographicallianceparen;323F
+ideographiccallparen;323A
+ideographiccentrecircle;32A5
+ideographicclose;3006
+ideographiccomma;3001
+ideographiccommaleft;FF64
+ideographiccongratulationparen;3237
+ideographiccorrectcircle;32A3
+ideographicearthparen;322F
+ideographicenterpriseparen;323D
+ideographicexcellentcircle;329D
+ideographicfestivalparen;3240
+ideographicfinancialcircle;3296
+ideographicfinancialparen;3236
+ideographicfireparen;322B
+ideographichaveparen;3232
+ideographichighcircle;32A4
+ideographiciterationmark;3005
+ideographiclaborcircle;3298
+ideographiclaborparen;3238
+ideographicleftcircle;32A7
+ideographiclowcircle;32A6
+ideographicmedicinecircle;32A9
+ideographicmetalparen;322E
+ideographicmoonparen;322A
+ideographicnameparen;3234
+ideographicperiod;3002
+ideographicprintcircle;329E
+ideographicreachparen;3243
+ideographicrepresentparen;3239
+ideographicresourceparen;323E
+ideographicrightcircle;32A8
+ideographicsecretcircle;3299
+ideographicselfparen;3242
+ideographicsocietyparen;3233
+ideographicspace;3000
+ideographicspecialparen;3235
+ideographicstockparen;3231
+ideographicstudyparen;323B
+ideographicsunparen;3230
+ideographicsuperviseparen;323C
+ideographicwaterparen;322C
+ideographicwoodparen;322D
+ideographiczero;3007
+ideographmetalcircle;328E
+ideographmooncircle;328A
+ideographnamecircle;3294
+ideographsuncircle;3290
+ideographwatercircle;328C
+ideographwoodcircle;328D
+ideva;0907
+idieresis;00EF
+idieresisacute;1E2F
+idieresiscyrillic;04E5
+idotbelow;1ECB
+iebrevecyrillic;04D7
+iecyrillic;0435
+ieungacirclekorean;3275
+ieungaparenkorean;3215
+ieungcirclekorean;3267
+ieungkorean;3147
+ieungparenkorean;3207
+igrave;00EC
+igujarati;0A87
+igurmukhi;0A07
+ihiragana;3044
+ihookabove;1EC9
+iibengali;0988
+iicyrillic;0438
+iideva;0908
+iigujarati;0A88
+iigurmukhi;0A08
+iimatragurmukhi;0A40
+iinvertedbreve;020B
+iishortcyrillic;0439
+iivowelsignbengali;09C0
+iivowelsigndeva;0940
+iivowelsigngujarati;0AC0
+ij;0133
+ikatakana;30A4
+ikatakanahalfwidth;FF72
+ikorean;3163
+ilde;02DC
+iluyhebrew;05AC
+imacron;012B
+imacroncyrillic;04E3
+imageorapproximatelyequal;2253
+imatragurmukhi;0A3F
+imonospace;FF49
+increment;2206
+infinity;221E
+iniarmenian;056B
+integral;222B
+integralbottom;2321
+integralbt;2321
+integralex;F8F5
+integraltop;2320
+integraltp;2320
+intersection;2229
+intisquare;3305
+invbullet;25D8
+invcircle;25D9
+invsmileface;263B
+iocyrillic;0451
+iogonek;012F
+iota;03B9
+iotadieresis;03CA
+iotadieresistonos;0390
+iotalatin;0269
+iotatonos;03AF
+iparen;24A4
+irigurmukhi;0A72
+ismallhiragana;3043
+ismallkatakana;30A3
+ismallkatakanahalfwidth;FF68
+issharbengali;09FA
+istroke;0268
+isuperior;F6ED
+iterationhiragana;309D
+iterationkatakana;30FD
+itilde;0129
+itildebelow;1E2D
+iubopomofo;3129
+iucyrillic;044E
+ivowelsignbengali;09BF
+ivowelsigndeva;093F
+ivowelsigngujarati;0ABF
+izhitsacyrillic;0475
+izhitsadblgravecyrillic;0477
+j;006A
+jaarmenian;0571
+jabengali;099C
+jadeva;091C
+jagujarati;0A9C
+jagurmukhi;0A1C
+jbopomofo;3110
+jcaron;01F0
+jcircle;24D9
+jcircumflex;0135
+jcrossedtail;029D
+jdotlessstroke;025F
+jecyrillic;0458
+jeemarabic;062C
+jeemfinalarabic;FE9E
+jeeminitialarabic;FE9F
+jeemmedialarabic;FEA0
+jeharabic;0698
+jehfinalarabic;FB8B
+jhabengali;099D
+jhadeva;091D
+jhagujarati;0A9D
+jhagurmukhi;0A1D
+jheharmenian;057B
+jis;3004
+jmonospace;FF4A
+jparen;24A5
+jsuperior;02B2
+k;006B
+kabashkircyrillic;04A1
+kabengali;0995
+kacute;1E31
+kacyrillic;043A
+kadescendercyrillic;049B
+kadeva;0915
+kaf;05DB
+kafarabic;0643
+kafdagesh;FB3B
+kafdageshhebrew;FB3B
+kaffinalarabic;FEDA
+kafhebrew;05DB
+kafinitialarabic;FEDB
+kafmedialarabic;FEDC
+kafrafehebrew;FB4D
+kagujarati;0A95
+kagurmukhi;0A15
+kahiragana;304B
+kahookcyrillic;04C4
+kakatakana;30AB
+kakatakanahalfwidth;FF76
+kappa;03BA
+kappasymbolgreek;03F0
+kapyeounmieumkorean;3171
+kapyeounphieuphkorean;3184
+kapyeounpieupkorean;3178
+kapyeounssangpieupkorean;3179
+karoriisquare;330D
+kashidaautoarabic;0640
+kashidaautonosidebearingarabic;0640
+kasmallkatakana;30F5
+kasquare;3384
+kasraarabic;0650
+kasratanarabic;064D
+kastrokecyrillic;049F
+katahiraprolongmarkhalfwidth;FF70
+kaverticalstrokecyrillic;049D
+kbopomofo;310E
+kcalsquare;3389
+kcaron;01E9
+kcedilla;0137
+kcircle;24DA
+kcommaaccent;0137
+kdotbelow;1E33
+keharmenian;0584
+kehiragana;3051
+kekatakana;30B1
+kekatakanahalfwidth;FF79
+kenarmenian;056F
+kesmallkatakana;30F6
+kgreenlandic;0138
+khabengali;0996
+khacyrillic;0445
+khadeva;0916
+khagujarati;0A96
+khagurmukhi;0A16
+khaharabic;062E
+khahfinalarabic;FEA6
+khahinitialarabic;FEA7
+khahmedialarabic;FEA8
+kheicoptic;03E7
+khhadeva;0959
+khhagurmukhi;0A59
+khieukhacirclekorean;3278
+khieukhaparenkorean;3218
+khieukhcirclekorean;326A
+khieukhkorean;314B
+khieukhparenkorean;320A
+khokhaithai;0E02
+khokhonthai;0E05
+khokhuatthai;0E03
+khokhwaithai;0E04
+khomutthai;0E5B
+khook;0199
+khorakhangthai;0E06
+khzsquare;3391
+kihiragana;304D
+kikatakana;30AD
+kikatakanahalfwidth;FF77
+kiroguramusquare;3315
+kiromeetorusquare;3316
+kirosquare;3314
+kiyeokacirclekorean;326E
+kiyeokaparenkorean;320E
+kiyeokcirclekorean;3260
+kiyeokkorean;3131
+kiyeokparenkorean;3200
+kiyeoksioskorean;3133
+kjecyrillic;045C
+klinebelow;1E35
+klsquare;3398
+kmcubedsquare;33A6
+kmonospace;FF4B
+kmsquaredsquare;33A2
+kohiragana;3053
+kohmsquare;33C0
+kokaithai;0E01
+kokatakana;30B3
+kokatakanahalfwidth;FF7A
+kooposquare;331E
+koppacyrillic;0481
+koreanstandardsymbol;327F
+koroniscmb;0343
+kparen;24A6
+kpasquare;33AA
+ksicyrillic;046F
+ktsquare;33CF
+kturned;029E
+kuhiragana;304F
+kukatakana;30AF
+kukatakanahalfwidth;FF78
+kvsquare;33B8
+kwsquare;33BE
+l;006C
+labengali;09B2
+lacute;013A
+ladeva;0932
+lagujarati;0AB2
+lagurmukhi;0A32
+lakkhangyaothai;0E45
+lamaleffinalarabic;FEFC
+lamalefhamzaabovefinalarabic;FEF8
+lamalefhamzaaboveisolatedarabic;FEF7
+lamalefhamzabelowfinalarabic;FEFA
+lamalefhamzabelowisolatedarabic;FEF9
+lamalefisolatedarabic;FEFB
+lamalefmaddaabovefinalarabic;FEF6
+lamalefmaddaaboveisolatedarabic;FEF5
+lamarabic;0644
+lambda;03BB
+lambdastroke;019B
+lamed;05DC
+lameddagesh;FB3C
+lameddageshhebrew;FB3C
+lamedhebrew;05DC
+lamedholam;05DC 05B9
+lamedholamdagesh;05DC 05B9 05BC
+lamedholamdageshhebrew;05DC 05B9 05BC
+lamedholamhebrew;05DC 05B9
+lamfinalarabic;FEDE
+lamhahinitialarabic;FCCA
+laminitialarabic;FEDF
+lamjeeminitialarabic;FCC9
+lamkhahinitialarabic;FCCB
+lamlamhehisolatedarabic;FDF2
+lammedialarabic;FEE0
+lammeemhahinitialarabic;FD88
+lammeeminitialarabic;FCCC
+lammeemjeeminitialarabic;FEDF FEE4 FEA0
+lammeemkhahinitialarabic;FEDF FEE4 FEA8
+largecircle;25EF
+lbar;019A
+lbelt;026C
+lbopomofo;310C
+lcaron;013E
+lcedilla;013C
+lcircle;24DB
+lcircumflexbelow;1E3D
+lcommaaccent;013C
+ldot;0140
+ldotaccent;0140
+ldotbelow;1E37
+ldotbelowmacron;1E39
+leftangleabovecmb;031A
+lefttackbelowcmb;0318
+less;003C
+lessequal;2264
+lessequalorgreater;22DA
+lessmonospace;FF1C
+lessorequivalent;2272
+lessorgreater;2276
+lessoverequal;2266
+lesssmall;FE64
+lezh;026E
+lfblock;258C
+lhookretroflex;026D
+lira;20A4
+liwnarmenian;056C
+lj;01C9
+ljecyrillic;0459
+ll;F6C0
+lladeva;0933
+llagujarati;0AB3
+llinebelow;1E3B
+llladeva;0934
+llvocalicbengali;09E1
+llvocalicdeva;0961
+llvocalicvowelsignbengali;09E3
+llvocalicvowelsigndeva;0963
+lmiddletilde;026B
+lmonospace;FF4C
+lmsquare;33D0
+lochulathai;0E2C
+logicaland;2227
+logicalnot;00AC
+logicalnotreversed;2310
+logicalor;2228
+lolingthai;0E25
+longs;017F
+lowlinecenterline;FE4E
+lowlinecmb;0332
+lowlinedashed;FE4D
+lozenge;25CA
+lparen;24A7
+lslash;0142
+lsquare;2113
+lsuperior;F6EE
+ltshade;2591
+luthai;0E26
+lvocalicbengali;098C
+lvocalicdeva;090C
+lvocalicvowelsignbengali;09E2
+lvocalicvowelsigndeva;0962
+lxsquare;33D3
+m;006D
+mabengali;09AE
+macron;00AF
+macronbelowcmb;0331
+macroncmb;0304
+macronlowmod;02CD
+macronmonospace;FFE3
+macute;1E3F
+madeva;092E
+magujarati;0AAE
+magurmukhi;0A2E
+mahapakhhebrew;05A4
+mahapakhlefthebrew;05A4
+mahiragana;307E
+maichattawalowleftthai;F895
+maichattawalowrightthai;F894
+maichattawathai;0E4B
+maichattawaupperleftthai;F893
+maieklowleftthai;F88C
+maieklowrightthai;F88B
+maiekthai;0E48
+maiekupperleftthai;F88A
+maihanakatleftthai;F884
+maihanakatthai;0E31
+maitaikhuleftthai;F889
+maitaikhuthai;0E47
+maitholowleftthai;F88F
+maitholowrightthai;F88E
+maithothai;0E49
+maithoupperleftthai;F88D
+maitrilowleftthai;F892
+maitrilowrightthai;F891
+maitrithai;0E4A
+maitriupperleftthai;F890
+maiyamokthai;0E46
+makatakana;30DE
+makatakanahalfwidth;FF8F
+male;2642
+mansyonsquare;3347
+maqafhebrew;05BE
+mars;2642
+masoracirclehebrew;05AF
+masquare;3383
+mbopomofo;3107
+mbsquare;33D4
+mcircle;24DC
+mcubedsquare;33A5
+mdotaccent;1E41
+mdotbelow;1E43
+meemarabic;0645
+meemfinalarabic;FEE2
+meeminitialarabic;FEE3
+meemmedialarabic;FEE4
+meemmeeminitialarabic;FCD1
+meemmeemisolatedarabic;FC48
+meetorusquare;334D
+mehiragana;3081
+meizierasquare;337E
+mekatakana;30E1
+mekatakanahalfwidth;FF92
+mem;05DE
+memdagesh;FB3E
+memdageshhebrew;FB3E
+memhebrew;05DE
+menarmenian;0574
+merkhahebrew;05A5
+merkhakefulahebrew;05A6
+merkhakefulalefthebrew;05A6
+merkhalefthebrew;05A5
+mhook;0271
+mhzsquare;3392
+middledotkatakanahalfwidth;FF65
+middot;00B7
+mieumacirclekorean;3272
+mieumaparenkorean;3212
+mieumcirclekorean;3264
+mieumkorean;3141
+mieumpansioskorean;3170
+mieumparenkorean;3204
+mieumpieupkorean;316E
+mieumsioskorean;316F
+mihiragana;307F
+mikatakana;30DF
+mikatakanahalfwidth;FF90
+minus;2212
+minusbelowcmb;0320
+minuscircle;2296
+minusmod;02D7
+minusplus;2213
+minute;2032
+miribaarusquare;334A
+mirisquare;3349
+mlonglegturned;0270
+mlsquare;3396
+mmcubedsquare;33A3
+mmonospace;FF4D
+mmsquaredsquare;339F
+mohiragana;3082
+mohmsquare;33C1
+mokatakana;30E2
+mokatakanahalfwidth;FF93
+molsquare;33D6
+momathai;0E21
+moverssquare;33A7
+moverssquaredsquare;33A8
+mparen;24A8
+mpasquare;33AB
+mssquare;33B3
+msuperior;F6EF
+mturned;026F
+mu;00B5
+mu1;00B5
+muasquare;3382
+muchgreater;226B
+muchless;226A
+mufsquare;338C
+mugreek;03BC
+mugsquare;338D
+muhiragana;3080
+mukatakana;30E0
+mukatakanahalfwidth;FF91
+mulsquare;3395
+multiply;00D7
+mumsquare;339B
+munahhebrew;05A3
+munahlefthebrew;05A3
+musicalnote;266A
+musicalnotedbl;266B
+musicflatsign;266D
+musicsharpsign;266F
+mussquare;33B2
+muvsquare;33B6
+muwsquare;33BC
+mvmegasquare;33B9
+mvsquare;33B7
+mwmegasquare;33BF
+mwsquare;33BD
+n;006E
+nabengali;09A8
+nabla;2207
+nacute;0144
+nadeva;0928
+nagujarati;0AA8
+nagurmukhi;0A28
+nahiragana;306A
+nakatakana;30CA
+nakatakanahalfwidth;FF85
+napostrophe;0149
+nasquare;3381
+nbopomofo;310B
+nbspace;00A0
+ncaron;0148
+ncedilla;0146
+ncircle;24DD
+ncircumflexbelow;1E4B
+ncommaaccent;0146
+ndotaccent;1E45
+ndotbelow;1E47
+nehiragana;306D
+nekatakana;30CD
+nekatakanahalfwidth;FF88
+newsheqelsign;20AA
+nfsquare;338B
+ngabengali;0999
+ngadeva;0919
+ngagujarati;0A99
+ngagurmukhi;0A19
+ngonguthai;0E07
+nhiragana;3093
+nhookleft;0272
+nhookretroflex;0273
+nieunacirclekorean;326F
+nieunaparenkorean;320F
+nieuncieuckorean;3135
+nieuncirclekorean;3261
+nieunhieuhkorean;3136
+nieunkorean;3134
+nieunpansioskorean;3168
+nieunparenkorean;3201
+nieunsioskorean;3167
+nieuntikeutkorean;3166
+nihiragana;306B
+nikatakana;30CB
+nikatakanahalfwidth;FF86
+nikhahitleftthai;F899
+nikhahitthai;0E4D
+nine;0039
+ninearabic;0669
+ninebengali;09EF
+ninecircle;2468
+ninecircleinversesansserif;2792
+ninedeva;096F
+ninegujarati;0AEF
+ninegurmukhi;0A6F
+ninehackarabic;0669
+ninehangzhou;3029
+nineideographicparen;3228
+nineinferior;2089
+ninemonospace;FF19
+nineoldstyle;F739
+nineparen;247C
+nineperiod;2490
+ninepersian;06F9
+nineroman;2178
+ninesuperior;2079
+nineteencircle;2472
+nineteenparen;2486
+nineteenperiod;249A
+ninethai;0E59
+nj;01CC
+njecyrillic;045A
+nkatakana;30F3
+nkatakanahalfwidth;FF9D
+nlegrightlong;019E
+nlinebelow;1E49
+nmonospace;FF4E
+nmsquare;339A
+nnabengali;09A3
+nnadeva;0923
+nnagujarati;0AA3
+nnagurmukhi;0A23
+nnnadeva;0929
+nohiragana;306E
+nokatakana;30CE
+nokatakanahalfwidth;FF89
+nonbreakingspace;00A0
+nonenthai;0E13
+nonuthai;0E19
+noonarabic;0646
+noonfinalarabic;FEE6
+noonghunnaarabic;06BA
+noonghunnafinalarabic;FB9F
+noonhehinitialarabic;FEE7 FEEC
+nooninitialarabic;FEE7
+noonjeeminitialarabic;FCD2
+noonjeemisolatedarabic;FC4B
+noonmedialarabic;FEE8
+noonmeeminitialarabic;FCD5
+noonmeemisolatedarabic;FC4E
+noonnoonfinalarabic;FC8D
+notcontains;220C
+notelement;2209
+notelementof;2209
+notequal;2260
+notgreater;226F
+notgreaternorequal;2271
+notgreaternorless;2279
+notidentical;2262
+notless;226E
+notlessnorequal;2270
+notparallel;2226
+notprecedes;2280
+notsubset;2284
+notsucceeds;2281
+notsuperset;2285
+nowarmenian;0576
+nparen;24A9
+nssquare;33B1
+nsuperior;207F
+ntilde;00F1
+nu;03BD
+nuhiragana;306C
+nukatakana;30CC
+nukatakanahalfwidth;FF87
+nuktabengali;09BC
+nuktadeva;093C
+nuktagujarati;0ABC
+nuktagurmukhi;0A3C
+numbersign;0023
+numbersignmonospace;FF03
+numbersignsmall;FE5F
+numeralsigngreek;0374
+numeralsignlowergreek;0375
+numero;2116
+nun;05E0
+nundagesh;FB40
+nundageshhebrew;FB40
+nunhebrew;05E0
+nvsquare;33B5
+nwsquare;33BB
+nyabengali;099E
+nyadeva;091E
+nyagujarati;0A9E
+nyagurmukhi;0A1E
+o;006F
+oacute;00F3
+oangthai;0E2D
+obarred;0275
+obarredcyrillic;04E9
+obarreddieresiscyrillic;04EB
+obengali;0993
+obopomofo;311B
+obreve;014F
+ocandradeva;0911
+ocandragujarati;0A91
+ocandravowelsigndeva;0949
+ocandravowelsigngujarati;0AC9
+ocaron;01D2
+ocircle;24DE
+ocircumflex;00F4
+ocircumflexacute;1ED1
+ocircumflexdotbelow;1ED9
+ocircumflexgrave;1ED3
+ocircumflexhookabove;1ED5
+ocircumflextilde;1ED7
+ocyrillic;043E
+odblacute;0151
+odblgrave;020D
+odeva;0913
+odieresis;00F6
+odieresiscyrillic;04E7
+odotbelow;1ECD
+oe;0153
+oekorean;315A
+ogonek;02DB
+ogonekcmb;0328
+ograve;00F2
+ogujarati;0A93
+oharmenian;0585
+ohiragana;304A
+ohookabove;1ECF
+ohorn;01A1
+ohornacute;1EDB
+ohorndotbelow;1EE3
+ohorngrave;1EDD
+ohornhookabove;1EDF
+ohorntilde;1EE1
+ohungarumlaut;0151
+oi;01A3
+oinvertedbreve;020F
+okatakana;30AA
+okatakanahalfwidth;FF75
+okorean;3157
+olehebrew;05AB
+omacron;014D
+omacronacute;1E53
+omacrongrave;1E51
+omdeva;0950
+omega;03C9
+omega1;03D6
+omegacyrillic;0461
+omegalatinclosed;0277
+omegaroundcyrillic;047B
+omegatitlocyrillic;047D
+omegatonos;03CE
+omgujarati;0AD0
+omicron;03BF
+omicrontonos;03CC
+omonospace;FF4F
+one;0031
+onearabic;0661
+onebengali;09E7
+onecircle;2460
+onecircleinversesansserif;278A
+onedeva;0967
+onedotenleader;2024
+oneeighth;215B
+onefitted;F6DC
+onegujarati;0AE7
+onegurmukhi;0A67
+onehackarabic;0661
+onehalf;00BD
+onehangzhou;3021
+oneideographicparen;3220
+oneinferior;2081
+onemonospace;FF11
+onenumeratorbengali;09F4
+oneoldstyle;F731
+oneparen;2474
+oneperiod;2488
+onepersian;06F1
+onequarter;00BC
+oneroman;2170
+onesuperior;00B9
+onethai;0E51
+onethird;2153
+oogonek;01EB
+oogonekmacron;01ED
+oogurmukhi;0A13
+oomatragurmukhi;0A4B
+oopen;0254
+oparen;24AA
+openbullet;25E6
+option;2325
+ordfeminine;00AA
+ordmasculine;00BA
+orthogonal;221F
+oshortdeva;0912
+oshortvowelsigndeva;094A
+oslash;00F8
+oslashacute;01FF
+osmallhiragana;3049
+osmallkatakana;30A9
+osmallkatakanahalfwidth;FF6B
+ostrokeacute;01FF
+osuperior;F6F0
+otcyrillic;047F
+otilde;00F5
+otildeacute;1E4D
+otildedieresis;1E4F
+oubopomofo;3121
+overline;203E
+overlinecenterline;FE4A
+overlinecmb;0305
+overlinedashed;FE49
+overlinedblwavy;FE4C
+overlinewavy;FE4B
+overscore;00AF
+ovowelsignbengali;09CB
+ovowelsigndeva;094B
+ovowelsigngujarati;0ACB
+p;0070
+paampssquare;3380
+paasentosquare;332B
+pabengali;09AA
+pacute;1E55
+padeva;092A
+pagedown;21DF
+pageup;21DE
+pagujarati;0AAA
+pagurmukhi;0A2A
+pahiragana;3071
+paiyannoithai;0E2F
+pakatakana;30D1
+palatalizationcyrilliccmb;0484
+palochkacyrillic;04C0
+pansioskorean;317F
+paragraph;00B6
+parallel;2225
+parenleft;0028
+parenleftaltonearabic;FD3E
+parenleftbt;F8ED
+parenleftex;F8EC
+parenleftinferior;208D
+parenleftmonospace;FF08
+parenleftsmall;FE59
+parenleftsuperior;207D
+parenlefttp;F8EB
+parenleftvertical;FE35
+parenright;0029
+parenrightaltonearabic;FD3F
+parenrightbt;F8F8
+parenrightex;F8F7
+parenrightinferior;208E
+parenrightmonospace;FF09
+parenrightsmall;FE5A
+parenrightsuperior;207E
+parenrighttp;F8F6
+parenrightvertical;FE36
+partialdiff;2202
+paseqhebrew;05C0
+pashtahebrew;0599
+pasquare;33A9
+patah;05B7
+patah11;05B7
+patah1d;05B7
+patah2a;05B7
+patahhebrew;05B7
+patahnarrowhebrew;05B7
+patahquarterhebrew;05B7
+patahwidehebrew;05B7
+pazerhebrew;05A1
+pbopomofo;3106
+pcircle;24DF
+pdotaccent;1E57
+pe;05E4
+pecyrillic;043F
+pedagesh;FB44
+pedageshhebrew;FB44
+peezisquare;333B
+pefinaldageshhebrew;FB43
+peharabic;067E
+peharmenian;057A
+pehebrew;05E4
+pehfinalarabic;FB57
+pehinitialarabic;FB58
+pehiragana;307A
+pehmedialarabic;FB59
+pekatakana;30DA
+pemiddlehookcyrillic;04A7
+perafehebrew;FB4E
+percent;0025
+percentarabic;066A
+percentmonospace;FF05
+percentsmall;FE6A
+period;002E
+periodarmenian;0589
+periodcentered;00B7
+periodhalfwidth;FF61
+periodinferior;F6E7
+periodmonospace;FF0E
+periodsmall;FE52
+periodsuperior;F6E8
+perispomenigreekcmb;0342
+perpendicular;22A5
+perthousand;2030
+peseta;20A7
+pfsquare;338A
+phabengali;09AB
+phadeva;092B
+phagujarati;0AAB
+phagurmukhi;0A2B
+phi;03C6
+phi1;03D5
+phieuphacirclekorean;327A
+phieuphaparenkorean;321A
+phieuphcirclekorean;326C
+phieuphkorean;314D
+phieuphparenkorean;320C
+philatin;0278
+phinthuthai;0E3A
+phisymbolgreek;03D5
+phook;01A5
+phophanthai;0E1E
+phophungthai;0E1C
+phosamphaothai;0E20
+pi;03C0
+pieupacirclekorean;3273
+pieupaparenkorean;3213
+pieupcieuckorean;3176
+pieupcirclekorean;3265
+pieupkiyeokkorean;3172
+pieupkorean;3142
+pieupparenkorean;3205
+pieupsioskiyeokkorean;3174
+pieupsioskorean;3144
+pieupsiostikeutkorean;3175
+pieupthieuthkorean;3177
+pieuptikeutkorean;3173
+pihiragana;3074
+pikatakana;30D4
+pisymbolgreek;03D6
+piwrarmenian;0583
+plus;002B
+plusbelowcmb;031F
+pluscircle;2295
+plusminus;00B1
+plusmod;02D6
+plusmonospace;FF0B
+plussmall;FE62
+plussuperior;207A
+pmonospace;FF50
+pmsquare;33D8
+pohiragana;307D
+pointingindexdownwhite;261F
+pointingindexleftwhite;261C
+pointingindexrightwhite;261E
+pointingindexupwhite;261D
+pokatakana;30DD
+poplathai;0E1B
+postalmark;3012
+postalmarkface;3020
+pparen;24AB
+precedes;227A
+prescription;211E
+primemod;02B9
+primereversed;2035
+product;220F
+projective;2305
+prolongedkana;30FC
+propellor;2318
+propersubset;2282
+propersuperset;2283
+proportion;2237
+proportional;221D
+psi;03C8
+psicyrillic;0471
+psilipneumatacyrilliccmb;0486
+pssquare;33B0
+puhiragana;3077
+pukatakana;30D7
+pvsquare;33B4
+pwsquare;33BA
+q;0071
+qadeva;0958
+qadmahebrew;05A8
+qafarabic;0642
+qaffinalarabic;FED6
+qafinitialarabic;FED7
+qafmedialarabic;FED8
+qamats;05B8
+qamats10;05B8
+qamats1a;05B8
+qamats1c;05B8
+qamats27;05B8
+qamats29;05B8
+qamats33;05B8
+qamatsde;05B8
+qamatshebrew;05B8
+qamatsnarrowhebrew;05B8
+qamatsqatanhebrew;05B8
+qamatsqatannarrowhebrew;05B8
+qamatsqatanquarterhebrew;05B8
+qamatsqatanwidehebrew;05B8
+qamatsquarterhebrew;05B8
+qamatswidehebrew;05B8
+qarneyparahebrew;059F
+qbopomofo;3111
+qcircle;24E0
+qhook;02A0
+qmonospace;FF51
+qof;05E7
+qofdagesh;FB47
+qofdageshhebrew;FB47
+qofhatafpatah;05E7 05B2
+qofhatafpatahhebrew;05E7 05B2
+qofhatafsegol;05E7 05B1
+qofhatafsegolhebrew;05E7 05B1
+qofhebrew;05E7
+qofhiriq;05E7 05B4
+qofhiriqhebrew;05E7 05B4
+qofholam;05E7 05B9
+qofholamhebrew;05E7 05B9
+qofpatah;05E7 05B7
+qofpatahhebrew;05E7 05B7
+qofqamats;05E7 05B8
+qofqamatshebrew;05E7 05B8
+qofqubuts;05E7 05BB
+qofqubutshebrew;05E7 05BB
+qofsegol;05E7 05B6
+qofsegolhebrew;05E7 05B6
+qofsheva;05E7 05B0
+qofshevahebrew;05E7 05B0
+qoftsere;05E7 05B5
+qoftserehebrew;05E7 05B5
+qparen;24AC
+quarternote;2669
+qubuts;05BB
+qubuts18;05BB
+qubuts25;05BB
+qubuts31;05BB
+qubutshebrew;05BB
+qubutsnarrowhebrew;05BB
+qubutsquarterhebrew;05BB
+qubutswidehebrew;05BB
+question;003F
+questionarabic;061F
+questionarmenian;055E
+questiondown;00BF
+questiondownsmall;F7BF
+questiongreek;037E
+questionmonospace;FF1F
+questionsmall;F73F
+quotedbl;0022
+quotedblbase;201E
+quotedblleft;201C
+quotedblmonospace;FF02
+quotedblprime;301E
+quotedblprimereversed;301D
+quotedblright;201D
+quoteleft;2018
+quoteleftreversed;201B
+quotereversed;201B
+quoteright;2019
+quoterightn;0149
+quotesinglbase;201A
+quotesingle;0027
+quotesinglemonospace;FF07
+r;0072
+raarmenian;057C
+rabengali;09B0
+racute;0155
+radeva;0930
+radical;221A
+radicalex;F8E5
+radoverssquare;33AE
+radoverssquaredsquare;33AF
+radsquare;33AD
+rafe;05BF
+rafehebrew;05BF
+ragujarati;0AB0
+ragurmukhi;0A30
+rahiragana;3089
+rakatakana;30E9
+rakatakanahalfwidth;FF97
+ralowerdiagonalbengali;09F1
+ramiddlediagonalbengali;09F0
+ramshorn;0264
+ratio;2236
+rbopomofo;3116
+rcaron;0159
+rcedilla;0157
+rcircle;24E1
+rcommaaccent;0157
+rdblgrave;0211
+rdotaccent;1E59
+rdotbelow;1E5B
+rdotbelowmacron;1E5D
+referencemark;203B
+reflexsubset;2286
+reflexsuperset;2287
+registered;00AE
+registersans;F8E8
+registerserif;F6DA
+reharabic;0631
+reharmenian;0580
+rehfinalarabic;FEAE
+rehiragana;308C
+rehyehaleflamarabic;0631 FEF3 FE8E 0644
+rekatakana;30EC
+rekatakanahalfwidth;FF9A
+resh;05E8
+reshdageshhebrew;FB48
+reshhatafpatah;05E8 05B2
+reshhatafpatahhebrew;05E8 05B2
+reshhatafsegol;05E8 05B1
+reshhatafsegolhebrew;05E8 05B1
+reshhebrew;05E8
+reshhiriq;05E8 05B4
+reshhiriqhebrew;05E8 05B4
+reshholam;05E8 05B9
+reshholamhebrew;05E8 05B9
+reshpatah;05E8 05B7
+reshpatahhebrew;05E8 05B7
+reshqamats;05E8 05B8
+reshqamatshebrew;05E8 05B8
+reshqubuts;05E8 05BB
+reshqubutshebrew;05E8 05BB
+reshsegol;05E8 05B6
+reshsegolhebrew;05E8 05B6
+reshsheva;05E8 05B0
+reshshevahebrew;05E8 05B0
+reshtsere;05E8 05B5
+reshtserehebrew;05E8 05B5
+reversedtilde;223D
+reviahebrew;0597
+reviamugrashhebrew;0597
+revlogicalnot;2310
+rfishhook;027E
+rfishhookreversed;027F
+rhabengali;09DD
+rhadeva;095D
+rho;03C1
+rhook;027D
+rhookturned;027B
+rhookturnedsuperior;02B5
+rhosymbolgreek;03F1
+rhotichookmod;02DE
+rieulacirclekorean;3271
+rieulaparenkorean;3211
+rieulcirclekorean;3263
+rieulhieuhkorean;3140
+rieulkiyeokkorean;313A
+rieulkiyeoksioskorean;3169
+rieulkorean;3139
+rieulmieumkorean;313B
+rieulpansioskorean;316C
+rieulparenkorean;3203
+rieulphieuphkorean;313F
+rieulpieupkorean;313C
+rieulpieupsioskorean;316B
+rieulsioskorean;313D
+rieulthieuthkorean;313E
+rieultikeutkorean;316A
+rieulyeorinhieuhkorean;316D
+rightangle;221F
+righttackbelowcmb;0319
+righttriangle;22BF
+rihiragana;308A
+rikatakana;30EA
+rikatakanahalfwidth;FF98
+ring;02DA
+ringbelowcmb;0325
+ringcmb;030A
+ringhalfleft;02BF
+ringhalfleftarmenian;0559
+ringhalfleftbelowcmb;031C
+ringhalfleftcentered;02D3
+ringhalfright;02BE
+ringhalfrightbelowcmb;0339
+ringhalfrightcentered;02D2
+rinvertedbreve;0213
+rittorusquare;3351
+rlinebelow;1E5F
+rlongleg;027C
+rlonglegturned;027A
+rmonospace;FF52
+rohiragana;308D
+rokatakana;30ED
+rokatakanahalfwidth;FF9B
+roruathai;0E23
+rparen;24AD
+rrabengali;09DC
+rradeva;0931
+rragurmukhi;0A5C
+rreharabic;0691
+rrehfinalarabic;FB8D
+rrvocalicbengali;09E0
+rrvocalicdeva;0960
+rrvocalicgujarati;0AE0
+rrvocalicvowelsignbengali;09C4
+rrvocalicvowelsigndeva;0944
+rrvocalicvowelsigngujarati;0AC4
+rsuperior;F6F1
+rtblock;2590
+rturned;0279
+rturnedsuperior;02B4
+ruhiragana;308B
+rukatakana;30EB
+rukatakanahalfwidth;FF99
+rupeemarkbengali;09F2
+rupeesignbengali;09F3
+rupiah;F6DD
+ruthai;0E24
+rvocalicbengali;098B
+rvocalicdeva;090B
+rvocalicgujarati;0A8B
+rvocalicvowelsignbengali;09C3
+rvocalicvowelsigndeva;0943
+rvocalicvowelsigngujarati;0AC3
+s;0073
+sabengali;09B8
+sacute;015B
+sacutedotaccent;1E65
+sadarabic;0635
+sadeva;0938
+sadfinalarabic;FEBA
+sadinitialarabic;FEBB
+sadmedialarabic;FEBC
+sagujarati;0AB8
+sagurmukhi;0A38
+sahiragana;3055
+sakatakana;30B5
+sakatakanahalfwidth;FF7B
+sallallahoualayhewasallamarabic;FDFA
+samekh;05E1
+samekhdagesh;FB41
+samekhdageshhebrew;FB41
+samekhhebrew;05E1
+saraaathai;0E32
+saraaethai;0E41
+saraaimaimalaithai;0E44
+saraaimaimuanthai;0E43
+saraamthai;0E33
+saraathai;0E30
+saraethai;0E40
+saraiileftthai;F886
+saraiithai;0E35
+saraileftthai;F885
+saraithai;0E34
+saraothai;0E42
+saraueeleftthai;F888
+saraueethai;0E37
+saraueleftthai;F887
+sarauethai;0E36
+sarauthai;0E38
+sarauuthai;0E39
+sbopomofo;3119
+scaron;0161
+scarondotaccent;1E67
+scedilla;015F
+schwa;0259
+schwacyrillic;04D9
+schwadieresiscyrillic;04DB
+schwahook;025A
+scircle;24E2
+scircumflex;015D
+scommaaccent;0219
+sdotaccent;1E61
+sdotbelow;1E63
+sdotbelowdotaccent;1E69
+seagullbelowcmb;033C
+second;2033
+secondtonechinese;02CA
+section;00A7
+seenarabic;0633
+seenfinalarabic;FEB2
+seeninitialarabic;FEB3
+seenmedialarabic;FEB4
+segol;05B6
+segol13;05B6
+segol1f;05B6
+segol2c;05B6
+segolhebrew;05B6
+segolnarrowhebrew;05B6
+segolquarterhebrew;05B6
+segoltahebrew;0592
+segolwidehebrew;05B6
+seharmenian;057D
+sehiragana;305B
+sekatakana;30BB
+sekatakanahalfwidth;FF7E
+semicolon;003B
+semicolonarabic;061B
+semicolonmonospace;FF1B
+semicolonsmall;FE54
+semivoicedmarkkana;309C
+semivoicedmarkkanahalfwidth;FF9F
+sentisquare;3322
+sentosquare;3323
+seven;0037
+sevenarabic;0667
+sevenbengali;09ED
+sevencircle;2466
+sevencircleinversesansserif;2790
+sevendeva;096D
+seveneighths;215E
+sevengujarati;0AED
+sevengurmukhi;0A6D
+sevenhackarabic;0667
+sevenhangzhou;3027
+sevenideographicparen;3226
+seveninferior;2087
+sevenmonospace;FF17
+sevenoldstyle;F737
+sevenparen;247A
+sevenperiod;248E
+sevenpersian;06F7
+sevenroman;2176
+sevensuperior;2077
+seventeencircle;2470
+seventeenparen;2484
+seventeenperiod;2498
+seventhai;0E57
+sfthyphen;00AD
+shaarmenian;0577
+shabengali;09B6
+shacyrillic;0448
+shaddaarabic;0651
+shaddadammaarabic;FC61
+shaddadammatanarabic;FC5E
+shaddafathaarabic;FC60
+shaddafathatanarabic;0651 064B
+shaddakasraarabic;FC62
+shaddakasratanarabic;FC5F
+shade;2592
+shadedark;2593
+shadelight;2591
+shademedium;2592
+shadeva;0936
+shagujarati;0AB6
+shagurmukhi;0A36
+shalshelethebrew;0593
+shbopomofo;3115
+shchacyrillic;0449
+sheenarabic;0634
+sheenfinalarabic;FEB6
+sheeninitialarabic;FEB7
+sheenmedialarabic;FEB8
+sheicoptic;03E3
+sheqel;20AA
+sheqelhebrew;20AA
+sheva;05B0
+sheva115;05B0
+sheva15;05B0
+sheva22;05B0
+sheva2e;05B0
+shevahebrew;05B0
+shevanarrowhebrew;05B0
+shevaquarterhebrew;05B0
+shevawidehebrew;05B0
+shhacyrillic;04BB
+shimacoptic;03ED
+shin;05E9
+shindagesh;FB49
+shindageshhebrew;FB49
+shindageshshindot;FB2C
+shindageshshindothebrew;FB2C
+shindageshsindot;FB2D
+shindageshsindothebrew;FB2D
+shindothebrew;05C1
+shinhebrew;05E9
+shinshindot;FB2A
+shinshindothebrew;FB2A
+shinsindot;FB2B
+shinsindothebrew;FB2B
+shook;0282
+sigma;03C3
+sigma1;03C2
+sigmafinal;03C2
+sigmalunatesymbolgreek;03F2
+sihiragana;3057
+sikatakana;30B7
+sikatakanahalfwidth;FF7C
+siluqhebrew;05BD
+siluqlefthebrew;05BD
+similar;223C
+sindothebrew;05C2
+siosacirclekorean;3274
+siosaparenkorean;3214
+sioscieuckorean;317E
+sioscirclekorean;3266
+sioskiyeokkorean;317A
+sioskorean;3145
+siosnieunkorean;317B
+siosparenkorean;3206
+siospieupkorean;317D
+siostikeutkorean;317C
+six;0036
+sixarabic;0666
+sixbengali;09EC
+sixcircle;2465
+sixcircleinversesansserif;278F
+sixdeva;096C
+sixgujarati;0AEC
+sixgurmukhi;0A6C
+sixhackarabic;0666
+sixhangzhou;3026
+sixideographicparen;3225
+sixinferior;2086
+sixmonospace;FF16
+sixoldstyle;F736
+sixparen;2479
+sixperiod;248D
+sixpersian;06F6
+sixroman;2175
+sixsuperior;2076
+sixteencircle;246F
+sixteencurrencydenominatorbengali;09F9
+sixteenparen;2483
+sixteenperiod;2497
+sixthai;0E56
+slash;002F
+slashmonospace;FF0F
+slong;017F
+slongdotaccent;1E9B
+smileface;263A
+smonospace;FF53
+sofpasuqhebrew;05C3
+softhyphen;00AD
+softsigncyrillic;044C
+sohiragana;305D
+sokatakana;30BD
+sokatakanahalfwidth;FF7F
+soliduslongoverlaycmb;0338
+solidusshortoverlaycmb;0337
+sorusithai;0E29
+sosalathai;0E28
+sosothai;0E0B
+sosuathai;0E2A
+space;0020
+spacehackarabic;0020
+spade;2660
+spadesuitblack;2660
+spadesuitwhite;2664
+sparen;24AE
+squarebelowcmb;033B
+squarecc;33C4
+squarecm;339D
+squarediagonalcrosshatchfill;25A9
+squarehorizontalfill;25A4
+squarekg;338F
+squarekm;339E
+squarekmcapital;33CE
+squareln;33D1
+squarelog;33D2
+squaremg;338E
+squaremil;33D5
+squaremm;339C
+squaremsquared;33A1
+squareorthogonalcrosshatchfill;25A6
+squareupperlefttolowerrightfill;25A7
+squareupperrighttolowerleftfill;25A8
+squareverticalfill;25A5
+squarewhitewithsmallblack;25A3
+srsquare;33DB
+ssabengali;09B7
+ssadeva;0937
+ssagujarati;0AB7
+ssangcieuckorean;3149
+ssanghieuhkorean;3185
+ssangieungkorean;3180
+ssangkiyeokkorean;3132
+ssangnieunkorean;3165
+ssangpieupkorean;3143
+ssangsioskorean;3146
+ssangtikeutkorean;3138
+ssuperior;F6F2
+sterling;00A3
+sterlingmonospace;FFE1
+strokelongoverlaycmb;0336
+strokeshortoverlaycmb;0335
+subset;2282
+subsetnotequal;228A
+subsetorequal;2286
+succeeds;227B
+suchthat;220B
+suhiragana;3059
+sukatakana;30B9
+sukatakanahalfwidth;FF7D
+sukunarabic;0652
+summation;2211
+sun;263C
+superset;2283
+supersetnotequal;228B
+supersetorequal;2287
+svsquare;33DC
+syouwaerasquare;337C
+t;0074
+tabengali;09A4
+tackdown;22A4
+tackleft;22A3
+tadeva;0924
+tagujarati;0AA4
+tagurmukhi;0A24
+taharabic;0637
+tahfinalarabic;FEC2
+tahinitialarabic;FEC3
+tahiragana;305F
+tahmedialarabic;FEC4
+taisyouerasquare;337D
+takatakana;30BF
+takatakanahalfwidth;FF80
+tatweelarabic;0640
+tau;03C4
+tav;05EA
+tavdages;FB4A
+tavdagesh;FB4A
+tavdageshhebrew;FB4A
+tavhebrew;05EA
+tbar;0167
+tbopomofo;310A
+tcaron;0165
+tccurl;02A8
+tcedilla;0163
+tcheharabic;0686
+tchehfinalarabic;FB7B
+tchehinitialarabic;FB7C
+tchehmedialarabic;FB7D
+tchehmeeminitialarabic;FB7C FEE4
+tcircle;24E3
+tcircumflexbelow;1E71
+tcommaaccent;0163
+tdieresis;1E97
+tdotaccent;1E6B
+tdotbelow;1E6D
+tecyrillic;0442
+tedescendercyrillic;04AD
+teharabic;062A
+tehfinalarabic;FE96
+tehhahinitialarabic;FCA2
+tehhahisolatedarabic;FC0C
+tehinitialarabic;FE97
+tehiragana;3066
+tehjeeminitialarabic;FCA1
+tehjeemisolatedarabic;FC0B
+tehmarbutaarabic;0629
+tehmarbutafinalarabic;FE94
+tehmedialarabic;FE98
+tehmeeminitialarabic;FCA4
+tehmeemisolatedarabic;FC0E
+tehnoonfinalarabic;FC73
+tekatakana;30C6
+tekatakanahalfwidth;FF83
+telephone;2121
+telephoneblack;260E
+telishagedolahebrew;05A0
+telishaqetanahebrew;05A9
+tencircle;2469
+tenideographicparen;3229
+tenparen;247D
+tenperiod;2491
+tenroman;2179
+tesh;02A7
+tet;05D8
+tetdagesh;FB38
+tetdageshhebrew;FB38
+tethebrew;05D8
+tetsecyrillic;04B5
+tevirhebrew;059B
+tevirlefthebrew;059B
+thabengali;09A5
+thadeva;0925
+thagujarati;0AA5
+thagurmukhi;0A25
+thalarabic;0630
+thalfinalarabic;FEAC
+thanthakhatlowleftthai;F898
+thanthakhatlowrightthai;F897
+thanthakhatthai;0E4C
+thanthakhatupperleftthai;F896
+theharabic;062B
+thehfinalarabic;FE9A
+thehinitialarabic;FE9B
+thehmedialarabic;FE9C
+thereexists;2203
+therefore;2234
+theta;03B8
+theta1;03D1
+thetasymbolgreek;03D1
+thieuthacirclekorean;3279
+thieuthaparenkorean;3219
+thieuthcirclekorean;326B
+thieuthkorean;314C
+thieuthparenkorean;320B
+thirteencircle;246C
+thirteenparen;2480
+thirteenperiod;2494
+thonangmonthothai;0E11
+thook;01AD
+thophuthaothai;0E12
+thorn;00FE
+thothahanthai;0E17
+thothanthai;0E10
+thothongthai;0E18
+thothungthai;0E16
+thousandcyrillic;0482
+thousandsseparatorarabic;066C
+thousandsseparatorpersian;066C
+three;0033
+threearabic;0663
+threebengali;09E9
+threecircle;2462
+threecircleinversesansserif;278C
+threedeva;0969
+threeeighths;215C
+threegujarati;0AE9
+threegurmukhi;0A69
+threehackarabic;0663
+threehangzhou;3023
+threeideographicparen;3222
+threeinferior;2083
+threemonospace;FF13
+threenumeratorbengali;09F6
+threeoldstyle;F733
+threeparen;2476
+threeperiod;248A
+threepersian;06F3
+threequarters;00BE
+threequartersemdash;F6DE
+threeroman;2172
+threesuperior;00B3
+threethai;0E53
+thzsquare;3394
+tihiragana;3061
+tikatakana;30C1
+tikatakanahalfwidth;FF81
+tikeutacirclekorean;3270
+tikeutaparenkorean;3210
+tikeutcirclekorean;3262
+tikeutkorean;3137
+tikeutparenkorean;3202
+tilde;02DC
+tildebelowcmb;0330
+tildecmb;0303
+tildecomb;0303
+tildedoublecmb;0360
+tildeoperator;223C
+tildeoverlaycmb;0334
+tildeverticalcmb;033E
+timescircle;2297
+tipehahebrew;0596
+tipehalefthebrew;0596
+tippigurmukhi;0A70
+titlocyrilliccmb;0483
+tiwnarmenian;057F
+tlinebelow;1E6F
+tmonospace;FF54
+toarmenian;0569
+tohiragana;3068
+tokatakana;30C8
+tokatakanahalfwidth;FF84
+tonebarextrahighmod;02E5
+tonebarextralowmod;02E9
+tonebarhighmod;02E6
+tonebarlowmod;02E8
+tonebarmidmod;02E7
+tonefive;01BD
+tonesix;0185
+tonetwo;01A8
+tonos;0384
+tonsquare;3327
+topatakthai;0E0F
+tortoiseshellbracketleft;3014
+tortoiseshellbracketleftsmall;FE5D
+tortoiseshellbracketleftvertical;FE39
+tortoiseshellbracketright;3015
+tortoiseshellbracketrightsmall;FE5E
+tortoiseshellbracketrightvertical;FE3A
+totaothai;0E15
+tpalatalhook;01AB
+tparen;24AF
+trademark;2122
+trademarksans;F8EA
+trademarkserif;F6DB
+tretroflexhook;0288
+triagdn;25BC
+triaglf;25C4
+triagrt;25BA
+triagup;25B2
+ts;02A6
+tsadi;05E6
+tsadidagesh;FB46
+tsadidageshhebrew;FB46
+tsadihebrew;05E6
+tsecyrillic;0446
+tsere;05B5
+tsere12;05B5
+tsere1e;05B5
+tsere2b;05B5
+tserehebrew;05B5
+tserenarrowhebrew;05B5
+tserequarterhebrew;05B5
+tserewidehebrew;05B5
+tshecyrillic;045B
+tsuperior;F6F3
+ttabengali;099F
+ttadeva;091F
+ttagujarati;0A9F
+ttagurmukhi;0A1F
+tteharabic;0679
+ttehfinalarabic;FB67
+ttehinitialarabic;FB68
+ttehmedialarabic;FB69
+tthabengali;09A0
+tthadeva;0920
+tthagujarati;0AA0
+tthagurmukhi;0A20
+tturned;0287
+tuhiragana;3064
+tukatakana;30C4
+tukatakanahalfwidth;FF82
+tusmallhiragana;3063
+tusmallkatakana;30C3
+tusmallkatakanahalfwidth;FF6F
+twelvecircle;246B
+twelveparen;247F
+twelveperiod;2493
+twelveroman;217B
+twentycircle;2473
+twentyhangzhou;5344
+twentyparen;2487
+twentyperiod;249B
+two;0032
+twoarabic;0662
+twobengali;09E8
+twocircle;2461
+twocircleinversesansserif;278B
+twodeva;0968
+twodotenleader;2025
+twodotleader;2025
+twodotleadervertical;FE30
+twogujarati;0AE8
+twogurmukhi;0A68
+twohackarabic;0662
+twohangzhou;3022
+twoideographicparen;3221
+twoinferior;2082
+twomonospace;FF12
+twonumeratorbengali;09F5
+twooldstyle;F732
+twoparen;2475
+twoperiod;2489
+twopersian;06F2
+tworoman;2171
+twostroke;01BB
+twosuperior;00B2
+twothai;0E52
+twothirds;2154
+u;0075
+uacute;00FA
+ubar;0289
+ubengali;0989
+ubopomofo;3128
+ubreve;016D
+ucaron;01D4
+ucircle;24E4
+ucircumflex;00FB
+ucircumflexbelow;1E77
+ucyrillic;0443
+udattadeva;0951
+udblacute;0171
+udblgrave;0215
+udeva;0909
+udieresis;00FC
+udieresisacute;01D8
+udieresisbelow;1E73
+udieresiscaron;01DA
+udieresiscyrillic;04F1
+udieresisgrave;01DC
+udieresismacron;01D6
+udotbelow;1EE5
+ugrave;00F9
+ugujarati;0A89
+ugurmukhi;0A09
+uhiragana;3046
+uhookabove;1EE7
+uhorn;01B0
+uhornacute;1EE9
+uhorndotbelow;1EF1
+uhorngrave;1EEB
+uhornhookabove;1EED
+uhorntilde;1EEF
+uhungarumlaut;0171
+uhungarumlautcyrillic;04F3
+uinvertedbreve;0217
+ukatakana;30A6
+ukatakanahalfwidth;FF73
+ukcyrillic;0479
+ukorean;315C
+umacron;016B
+umacroncyrillic;04EF
+umacrondieresis;1E7B
+umatragurmukhi;0A41
+umonospace;FF55
+underscore;005F
+underscoredbl;2017
+underscoremonospace;FF3F
+underscorevertical;FE33
+underscorewavy;FE4F
+union;222A
+universal;2200
+uogonek;0173
+uparen;24B0
+upblock;2580
+upperdothebrew;05C4
+upsilon;03C5
+upsilondieresis;03CB
+upsilondieresistonos;03B0
+upsilonlatin;028A
+upsilontonos;03CD
+uptackbelowcmb;031D
+uptackmod;02D4
+uragurmukhi;0A73
+uring;016F
+ushortcyrillic;045E
+usmallhiragana;3045
+usmallkatakana;30A5
+usmallkatakanahalfwidth;FF69
+ustraightcyrillic;04AF
+ustraightstrokecyrillic;04B1
+utilde;0169
+utildeacute;1E79
+utildebelow;1E75
+uubengali;098A
+uudeva;090A
+uugujarati;0A8A
+uugurmukhi;0A0A
+uumatragurmukhi;0A42
+uuvowelsignbengali;09C2
+uuvowelsigndeva;0942
+uuvowelsigngujarati;0AC2
+uvowelsignbengali;09C1
+uvowelsigndeva;0941
+uvowelsigngujarati;0AC1
+v;0076
+vadeva;0935
+vagujarati;0AB5
+vagurmukhi;0A35
+vakatakana;30F7
+vav;05D5
+vavdagesh;FB35
+vavdagesh65;FB35
+vavdageshhebrew;FB35
+vavhebrew;05D5
+vavholam;FB4B
+vavholamhebrew;FB4B
+vavvavhebrew;05F0
+vavyodhebrew;05F1
+vcircle;24E5
+vdotbelow;1E7F
+vecyrillic;0432
+veharabic;06A4
+vehfinalarabic;FB6B
+vehinitialarabic;FB6C
+vehmedialarabic;FB6D
+vekatakana;30F9
+venus;2640
+verticalbar;007C
+verticallineabovecmb;030D
+verticallinebelowcmb;0329
+verticallinelowmod;02CC
+verticallinemod;02C8
+vewarmenian;057E
+vhook;028B
+vikatakana;30F8
+viramabengali;09CD
+viramadeva;094D
+viramagujarati;0ACD
+visargabengali;0983
+visargadeva;0903
+visargagujarati;0A83
+vmonospace;FF56
+voarmenian;0578
+voicediterationhiragana;309E
+voicediterationkatakana;30FE
+voicedmarkkana;309B
+voicedmarkkanahalfwidth;FF9E
+vokatakana;30FA
+vparen;24B1
+vtilde;1E7D
+vturned;028C
+vuhiragana;3094
+vukatakana;30F4
+w;0077
+wacute;1E83
+waekorean;3159
+wahiragana;308F
+wakatakana;30EF
+wakatakanahalfwidth;FF9C
+wakorean;3158
+wasmallhiragana;308E
+wasmallkatakana;30EE
+wattosquare;3357
+wavedash;301C
+wavyunderscorevertical;FE34
+wawarabic;0648
+wawfinalarabic;FEEE
+wawhamzaabovearabic;0624
+wawhamzaabovefinalarabic;FE86
+wbsquare;33DD
+wcircle;24E6
+wcircumflex;0175
+wdieresis;1E85
+wdotaccent;1E87
+wdotbelow;1E89
+wehiragana;3091
+weierstrass;2118
+wekatakana;30F1
+wekorean;315E
+weokorean;315D
+wgrave;1E81
+whitebullet;25E6
+whitecircle;25CB
+whitecircleinverse;25D9
+whitecornerbracketleft;300E
+whitecornerbracketleftvertical;FE43
+whitecornerbracketright;300F
+whitecornerbracketrightvertical;FE44
+whitediamond;25C7
+whitediamondcontainingblacksmalldiamond;25C8
+whitedownpointingsmalltriangle;25BF
+whitedownpointingtriangle;25BD
+whiteleftpointingsmalltriangle;25C3
+whiteleftpointingtriangle;25C1
+whitelenticularbracketleft;3016
+whitelenticularbracketright;3017
+whiterightpointingsmalltriangle;25B9
+whiterightpointingtriangle;25B7
+whitesmallsquare;25AB
+whitesmilingface;263A
+whitesquare;25A1
+whitestar;2606
+whitetelephone;260F
+whitetortoiseshellbracketleft;3018
+whitetortoiseshellbracketright;3019
+whiteuppointingsmalltriangle;25B5
+whiteuppointingtriangle;25B3
+wihiragana;3090
+wikatakana;30F0
+wikorean;315F
+wmonospace;FF57
+wohiragana;3092
+wokatakana;30F2
+wokatakanahalfwidth;FF66
+won;20A9
+wonmonospace;FFE6
+wowaenthai;0E27
+wparen;24B2
+wring;1E98
+wsuperior;02B7
+wturned;028D
+wynn;01BF
+x;0078
+xabovecmb;033D
+xbopomofo;3112
+xcircle;24E7
+xdieresis;1E8D
+xdotaccent;1E8B
+xeharmenian;056D
+xi;03BE
+xmonospace;FF58
+xparen;24B3
+xsuperior;02E3
+y;0079
+yaadosquare;334E
+yabengali;09AF
+yacute;00FD
+yadeva;092F
+yaekorean;3152
+yagujarati;0AAF
+yagurmukhi;0A2F
+yahiragana;3084
+yakatakana;30E4
+yakatakanahalfwidth;FF94
+yakorean;3151
+yamakkanthai;0E4E
+yasmallhiragana;3083
+yasmallkatakana;30E3
+yasmallkatakanahalfwidth;FF6C
+yatcyrillic;0463
+ycircle;24E8
+ycircumflex;0177
+ydieresis;00FF
+ydotaccent;1E8F
+ydotbelow;1EF5
+yeharabic;064A
+yehbarreearabic;06D2
+yehbarreefinalarabic;FBAF
+yehfinalarabic;FEF2
+yehhamzaabovearabic;0626
+yehhamzaabovefinalarabic;FE8A
+yehhamzaaboveinitialarabic;FE8B
+yehhamzaabovemedialarabic;FE8C
+yehinitialarabic;FEF3
+yehmedialarabic;FEF4
+yehmeeminitialarabic;FCDD
+yehmeemisolatedarabic;FC58
+yehnoonfinalarabic;FC94
+yehthreedotsbelowarabic;06D1
+yekorean;3156
+yen;00A5
+yenmonospace;FFE5
+yeokorean;3155
+yeorinhieuhkorean;3186
+yerahbenyomohebrew;05AA
+yerahbenyomolefthebrew;05AA
+yericyrillic;044B
+yerudieresiscyrillic;04F9
+yesieungkorean;3181
+yesieungpansioskorean;3183
+yesieungsioskorean;3182
+yetivhebrew;059A
+ygrave;1EF3
+yhook;01B4
+yhookabove;1EF7
+yiarmenian;0575
+yicyrillic;0457
+yikorean;3162
+yinyang;262F
+yiwnarmenian;0582
+ymonospace;FF59
+yod;05D9
+yoddagesh;FB39
+yoddageshhebrew;FB39
+yodhebrew;05D9
+yodyodhebrew;05F2
+yodyodpatahhebrew;FB1F
+yohiragana;3088
+yoikorean;3189
+yokatakana;30E8
+yokatakanahalfwidth;FF96
+yokorean;315B
+yosmallhiragana;3087
+yosmallkatakana;30E7
+yosmallkatakanahalfwidth;FF6E
+yotgreek;03F3
+yoyaekorean;3188
+yoyakorean;3187
+yoyakthai;0E22
+yoyingthai;0E0D
+yparen;24B4
+ypogegrammeni;037A
+ypogegrammenigreekcmb;0345
+yr;01A6
+yring;1E99
+ysuperior;02B8
+ytilde;1EF9
+yturned;028E
+yuhiragana;3086
+yuikorean;318C
+yukatakana;30E6
+yukatakanahalfwidth;FF95
+yukorean;3160
+yusbigcyrillic;046B
+yusbigiotifiedcyrillic;046D
+yuslittlecyrillic;0467
+yuslittleiotifiedcyrillic;0469
+yusmallhiragana;3085
+yusmallkatakana;30E5
+yusmallkatakanahalfwidth;FF6D
+yuyekorean;318B
+yuyeokorean;318A
+yyabengali;09DF
+yyadeva;095F
+z;007A
+zaarmenian;0566
+zacute;017A
+zadeva;095B
+zagurmukhi;0A5B
+zaharabic;0638
+zahfinalarabic;FEC6
+zahinitialarabic;FEC7
+zahiragana;3056
+zahmedialarabic;FEC8
+zainarabic;0632
+zainfinalarabic;FEB0
+zakatakana;30B6
+zaqefgadolhebrew;0595
+zaqefqatanhebrew;0594
+zarqahebrew;0598
+zayin;05D6
+zayindagesh;FB36
+zayindageshhebrew;FB36
+zayinhebrew;05D6
+zbopomofo;3117
+zcaron;017E
+zcircle;24E9
+zcircumflex;1E91
+zcurl;0291
+zdot;017C
+zdotaccent;017C
+zdotbelow;1E93
+zecyrillic;0437
+zedescendercyrillic;0499
+zedieresiscyrillic;04DF
+zehiragana;305C
+zekatakana;30BC
+zero;0030
+zeroarabic;0660
+zerobengali;09E6
+zerodeva;0966
+zerogujarati;0AE6
+zerogurmukhi;0A66
+zerohackarabic;0660
+zeroinferior;2080
+zeromonospace;FF10
+zerooldstyle;F730
+zeropersian;06F0
+zerosuperior;2070
+zerothai;0E50
+zerowidthjoiner;FEFF
+zerowidthnonjoiner;200C
+zerowidthspace;200B
+zeta;03B6
+zhbopomofo;3113
+zhearmenian;056A
+zhebrevecyrillic;04C2
+zhecyrillic;0436
+zhedescendercyrillic;0497
+zhedieresiscyrillic;04DD
+zihiragana;3058
+zikatakana;30B8
+zinorhebrew;05AE
+zlinebelow;1E95
+zmonospace;FF5A
+zohiragana;305E
+zokatakana;30BE
+zparen;24B5
+zretroflexhook;0290
+zstroke;01B6
+zuhiragana;305A
+zukatakana;30BA
+#--end
diff --git a/Build/source/texk/xdvipdfmx/debian/changelog b/Build/source/texk/xdvipdfmx/debian/changelog
new file mode 100644
index 00000000000..486406895f6
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/changelog
@@ -0,0 +1,18 @@
+xdvipdfmx (0.3-1) unstable; urgency=low
+
+ * New upstream release Closes: #0
+
+ -- Jonathan Kew <jonathan_kew@sil.org> Thu, 17 Aug 2006 17:09:41 +0100
+
+xdvipdfmx (0.2-1) unstable; urgency=low
+
+ * New upstream release Closes: #0
+
+ -- Jonathan Kew <jonathan_kew@sil.org> Tue, 4 Jul 2006 14:32:21 +0100
+
+xdvipdfmx (0.1-1) unstable; urgency=low
+
+ * Initial release Closes: #0
+
+ -- Jonathan Kew <jonathan_kew@sil.org> Tue, 25 Apr 2006 12:16:21 +0100
+
diff --git a/Build/source/texk/xdvipdfmx/debian/compat b/Build/source/texk/xdvipdfmx/debian/compat
new file mode 100644
index 00000000000..b8626c4cff2
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/compat
@@ -0,0 +1 @@
+4
diff --git a/Build/source/texk/xdvipdfmx/debian/conffiles.ex b/Build/source/texk/xdvipdfmx/debian/conffiles.ex
new file mode 100644
index 00000000000..e37b3362af7
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/conffiles.ex
@@ -0,0 +1,7 @@
+#
+# If you want to use this conffile, remove all comments and put files that
+# you want dpkg to process here using their absolute pathnames.
+# See the policy manual
+#
+# for example:
+# /etc/xdvipdfmx/xdvipdfmx.conf
diff --git a/Build/source/texk/xdvipdfmx/debian/control b/Build/source/texk/xdvipdfmx/debian/control
new file mode 100644
index 00000000000..cd213435f1f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/control
@@ -0,0 +1,15 @@
+Source: xdvipdfmx
+Section: contrib/tex
+Priority: optional
+Maintainer: Jonathan Kew <jonathan_kew@sil.org>
+Build-Depends: debhelper (>= 4.0.0), libkpathsea4-dev|libkpathsea-dev, libfreetype6-dev, libfontconfig1-dev, libpng-dev, zlib1-dev|zlib1g-dev
+Standards-Version: 3.6.1
+
+Package: xdvipdfmx
+Architecture: any
+Depends: ${shlibs:Depends}
+Conflicts: dvipdfmx
+Description: Extended version of DVIPDFMx with support for XeTeX
+ xdvipdfmx is an extended version of the DVIPDFMx output driver for TeX.
+ It adds support for the .xdv (extended .dvi) format that is generated
+ by the XeTeX program, to support Unicode text and OpenType fonts.
diff --git a/Build/source/texk/xdvipdfmx/debian/copyright b/Build/source/texk/xdvipdfmx/debian/copyright
new file mode 100644
index 00000000000..ec07efcc513
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/copyright
@@ -0,0 +1,36 @@
+This package was debianized by Jonathan Kew <jonathan_kew@sil.org> on
+Tue, 25 Apr 2006 12:16:21 +0100.
+
+It was downloaded from http://scripts.sil.org/svn-public/xdvipdfmx/
+
+Copyright Holder: SIL International (Jonathan Kew) and Jin-Hwan Cho
+
+Upstream Authors:
+ The dvipdfmx Project Team <dvipdfmx@project.ktug.or.kr>
+ SIL International (Jonathan Kew) <jonathan_kew@sil.org>
+
+Copyright:
+
+Copyright (c) 2006 by SIL International (Jonathan Kew) and Jin-Hwan Cho
+
+Copyright (c) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version; with the additional exemption that
+compiling, linking, and/or using OpenSSL is allowed.
+
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+On Debian GNU/Linux systems, the complete text of the GNU General
+Public License can be found in "/usr/share/common-licenses/GPL".
diff --git a/Build/source/texk/xdvipdfmx/debian/dirs b/Build/source/texk/xdvipdfmx/debian/dirs
new file mode 100644
index 00000000000..e7724817552
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/dirs
@@ -0,0 +1 @@
+usr/bin
diff --git a/Build/source/texk/xdvipdfmx/debian/docs b/Build/source/texk/xdvipdfmx/debian/docs
new file mode 100644
index 00000000000..b5c73628efe
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/docs
@@ -0,0 +1,4 @@
+BUGS
+NEWS
+README
+TODO
diff --git a/Build/source/texk/xdvipdfmx/debian/manpage.1.ex b/Build/source/texk/xdvipdfmx/debian/manpage.1.ex
new file mode 100644
index 00000000000..0f7c0bd0069
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/manpage.1.ex
@@ -0,0 +1,59 @@
+.\" Hey, EMACS: -*- nroff -*-
+.\" First parameter, NAME, should be all caps
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
+.\" other parameters are allowed: see man(7), man(1)
+.TH XDVIPDFMX SECTION "April 25, 2006"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh disable hyphenation
+.\" .hy enable hyphenation
+.\" .ad l left justify
+.\" .ad b justify to both left and right margins
+.\" .nf disable filling
+.\" .fi enable filling
+.\" .br insert line break
+.\" .sp <n> insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+xdvipdfmx \- program to do something
+.SH SYNOPSIS
+.B xdvipdfmx
+.RI [ options ] " files" ...
+.br
+.B bar
+.RI [ options ] " files" ...
+.SH DESCRIPTION
+This manual page documents briefly the
+.B xdvipdfmx
+and
+.B bar
+commands.
+.PP
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
+.\" respectively.
+\fBxdvipdfmx\fP is a program that...
+.SH OPTIONS
+These programs follow the usual GNU command line syntax, with long
+options starting with two dashes (`-').
+A summary of options is included below.
+For a complete description, see the Info files.
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.TP
+.B \-v, \-\-version
+Show version of program.
+.SH SEE ALSO
+.BR bar (1),
+.BR baz (1).
+.br
+The programs are documented fully by
+.IR "The Rise and Fall of a Fooish Bar" ,
+available via the Info system.
+.SH AUTHOR
+xdvipdfmx was written by <upstream author>.
+.PP
+This manual page was written by Jonathan Kew <jonathan@localhost.localdomain>,
+for the Debian project (but may be used by others).
diff --git a/Build/source/texk/xdvipdfmx/debian/rules b/Build/source/texk/xdvipdfmx/debian/rules
new file mode 100755
index 00000000000..c2370fd5261
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/rules
@@ -0,0 +1,107 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+config.status: configure
+ dh_testdir
+ # Add here commands to configure the package.
+ CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --with-freetype2=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
+
+
+build: build-stamp
+
+build-stamp: config.status
+ dh_testdir
+
+ # Add here commands to compile the package.
+ $(MAKE)
+ #docbook-to-man debian/xdvipdfmx.sgml > xdvipdfmx.1
+
+ touch build-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp
+
+ # Add here commands to clean up after the build process.
+ -$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+ cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+ cp -f /usr/share/misc/config.guess config.guess
+endif
+
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/xdvipdfmx.
+ $(MAKE) install DESTDIR=$(CURDIR)/debian/xdvipdfmx
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs ChangeLog
+ dh_installdocs
+# dh_installexamples
+# dh_install
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installemacsen
+# dh_installpam
+# dh_installmime
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+# dh_perl
+# dh_python
+# dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
diff --git a/Build/source/texk/xdvipdfmx/debian/watch.ex b/Build/source/texk/xdvipdfmx/debian/watch.ex
new file mode 100644
index 00000000000..49e9bd68d05
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/debian/watch.ex
@@ -0,0 +1,22 @@
+# Example watch control file for uscan
+# Rename this file to "watch" and then you can run the "uscan" command
+# to check for upstream updates and more.
+# See uscan(1) for format
+
+# Compulsory line, this is a version 3 file
+version=3
+
+# Uncomment to examine a Webpage
+# <Webpage URL> <string match>
+#http://www.example.com/downloads.php xdvipdfmx-(.*)\.tar\.gz
+
+# Uncomment to examine a Webserver directory
+#http://www.example.com/pub/xdvipdfmx-(.*)\.tar\.gz
+
+# Uncommment to examine a FTP server
+#ftp://ftp.example.com/pub/xdvipdfmx-(.*)\.tar\.gz debian uupdate
+
+# Uncomment to use Roland's hack for sourceforge based projects - YMMV!
+#http://people.debian.org/~lolando/sfdlr.php?project=xdvipdfmx xdvipdfmx-([\d.]*).tar.gz
+
+
diff --git a/Build/source/texk/xdvipdfmx/depcomp b/Build/source/texk/xdvipdfmx/depcomp
new file mode 100755
index 00000000000..ffcd540c336
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/depcomp
@@ -0,0 +1,529 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-02-09.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/texk/xdvipdfmx/doc/CJK-CID.txt b/Build/source/texk/xdvipdfmx/doc/CJK-CID.txt
new file mode 100644
index 00000000000..8089a1773ba
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/CJK-CID.txt
@@ -0,0 +1,76 @@
+Traditional Chinese: Adobe-CNS1
+ Supplement 0 of Adobe-CNS1 provides supports for Big
+ five and CNS 11643-1992 (Planes 1 and 2 only) character
+ set standard (CIDs 0 through 14098)
+ This contains glyphs for basic support for traditional
+ Chinese.
+ Supplement 1: Adds 3,309 glyphs and provides support for
+ the Hong Kong GCCS, and some of extensions and vender
+ specific character set from Monotype and Dynalab.
+ Supplement 2: Ignore this. Additional proportional and
+ half-width Latin glyphs and pre-rotated forms.
+ Supplement 3: Adds 1245 glyphs (CIDs from 17601 to 18845)
+ Adds glyphs for fully supporting Hong Kong SCS.
+ Supplement 4: Adds 119 new CIDs (from 18846 to 18964) for
+ supporting addition to HKSCS made in 2001.
+
+ Acrobat/Adobe Reader fonts:
+ MSung-Light-Acro: Adobe-CNS1-0 (Reader 4)
+ MHei-Medium-Acro: Adobe-CNS1-0 (Reader 4)
+ MSungStd-Light-Acro: Adobe-CNS1-4 (Reader 5)
+ AdobeMingStd-Light: Adobe-CNS1-4 (Reader 6)
+
+ Examples:
+
+ % For using never-embedded Acrobat font.
+ % You don't need to make those fonts visible to
+ % dvipdfmx (Don't do that, your are not allowed
+ % to "use" those fonts with dvipdfmx). Use Adobe or
+ % Acrobat Reader (with Asian font pack) to view and
+ % print documents.
+ b5sl@Big5@ ETen-B5-H MSung-Light-Acro
+ b5sm@Big5@ ETen-B5-H MHei-Medium-Acro
+ % sung-cid here is 16-bit CID encoded font.
+ % You should not use proportinal glyphs unless you
+ % embed fonts.
+ sung-cid Adobe-CNS1-4 MSungStd-Light-Acro
+ % Unicode
+ sung@Unicode@ UniCNS-UCS2-H MSungStd-Light-Acro
+
+Simplified Chinese: Adobe-GB1-0
+ Supplement 0 of Adobe-GB1 provided support for GB 2312-80
+ and GB 1988-89 character set standards. (7,717 glyphs)
+ Supplement 1: Adds 2,180 glyphs (upto CID 9896) and
+ provided support for GB/T 12345-90.
+ Supplement 2: Adds 12,230 glyphs (CIDs 9897 through 22126)
+ Support for GBK character set standard (GB 13000.1-93)
+ Supplement 3: Latin glyphs (esp. pre-rotated). Ignore this.
+ Supplement 4: Adds 6,712 glyphs (CIDs 22353 to 29064).
+ The major part of addition is to cover the Unicode block
+ "Unified Han Ideographs Extension A" (Unicode 3.0).
+
+ Acrobat/Adobe Reader fonts:
+ STSong-Light-Acro: Adobe-GB1-2 (Reader 4)
+ STSongStd-Light-Acro: Adobe-GB1-4 (Reader 5)
+ AdobeSongStd-Light: Adobe-GB1-4 (Reader 6)
+
+Korean: Adobe-Korea1
+
+ Acrobat/Adobe Reader fonts:
+ HYGoThic-Medium-Acro: Adobe-Korea1-1 (Reader 4)
+ HYSMyeongJo-Medium-Acro: Adobe-Korea1-1 (Reader 4)
+ HYSMyeongJoStd-Medium-Acro: Adobe-Korea1-2 (Reader 5)
+ AdobeMyungjoStd-Medium-Acro: Adobe-Korea1-2 (Reader 6)
+ AdobeMyungJoStd-Medium: Adobe-Korea1-2 (Reader 7)
+
+Japanese: Adobe-Japan1
+
+ Acrobat/Adobe Reader fonts:
+ HeiseiMin-W3-Acro: Adobe-Japan1-2 (Reader 4)
+ HeiseiKakuGo-W5-Acro: Adobe-Japan1-2 (Reader 4)
+ KozMinPro-Regular-Acro: Adobe-Japan1-4 (Reader 5)
+ KozGoPro-Medium: Adobe-Japan1-4 (Reader 6)
+ KozMinProVI-Regular: Adobe-Japan1-6 (Reader 7)
+
+
+
diff --git a/Build/source/texk/xdvipdfmx/doc/images/dvipdfm-cjk.png b/Build/source/texk/xdvipdfmx/doc/images/dvipdfm-cjk.png
new file mode 100644
index 00000000000..eac8098091a
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/images/dvipdfm-cjk.png
Binary files differ
diff --git a/Build/source/texk/xdvipdfmx/doc/images/dvipdfmx-logo.png b/Build/source/texk/xdvipdfmx/doc/images/dvipdfmx-logo.png
new file mode 100644
index 00000000000..8e8dc2a1f3e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/images/dvipdfmx-logo.png
Binary files differ
diff --git a/Build/source/texk/xdvipdfmx/doc/images/dvipdfmx.png b/Build/source/texk/xdvipdfmx/doc/images/dvipdfmx.png
new file mode 100644
index 00000000000..aaa94d984c7
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/images/dvipdfmx.png
Binary files differ
diff --git a/Build/source/texk/xdvipdfmx/doc/images/right_triangle.png b/Build/source/texk/xdvipdfmx/doc/images/right_triangle.png
new file mode 100644
index 00000000000..9b9b0d97ee9
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/images/right_triangle.png
Binary files differ
diff --git a/Build/source/texk/xdvipdfmx/doc/images/rightarrow.png b/Build/source/texk/xdvipdfmx/doc/images/rightarrow.png
new file mode 100644
index 00000000000..5a82e71f1cc
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/images/rightarrow.png
Binary files differ
diff --git a/Build/source/texk/xdvipdfmx/doc/tug2003.pdf b/Build/source/texk/xdvipdfmx/doc/tug2003.pdf
new file mode 100644
index 00000000000..ce1536a7187
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/doc/tug2003.pdf
Binary files differ
diff --git a/Build/source/texk/xdvipdfmx/index.html b/Build/source/texk/xdvipdfmx/index.html
new file mode 100644
index 00000000000..c92726c4bd7
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/index.html
@@ -0,0 +1,640 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en-US">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta http-equiv="Content-Language" content="en-US">
+ <title>The DVIPDFMx Project</title>
+ <base href="http://project.ktug.or.kr/dvipdfmx/">
+ <meta name="author" content="The DVIPDFMx Project Team">
+ <meta name="keywords" content="DVIPDFMx, dvipdfm, DVI, PDF, TeX, Chinese, Japanese, Korean, CJK">
+ <meta name="description" content="DVIPDFMx - a DVI to PDF converter">
+ <meta name="revised" content="Wed, 07 May 2005 01:23:22 +0900">
+ <meta name="copyright" content="Copyright (C) 2002-2005, The DVIPDFMx Project Team">
+ <link rev="made" href="mailto:dvipdfmx@project.ktug.or.kr">
+ <link rel="stylesheet" href="style_base.css" type="text/css" media="all">
+ <link rel="stylesheet" title="Plain" href="style_plain.css" type="text/css" media="all">
+ <link rel="alternate stylesheet" title="Screen" href="style_dflt.css" type="text/css" media="all">
+ <!--[if IE]>
+ <link rel="stylesheet" href="style_ie.css" type="text/css" media="screen">
+ <![endif]-->
+ <!-- script type="text/javascript" src="stylesel.js"></script -->
+</head>
+
+<body lang="en-US">
+
+<div id="navmenu" class="menu" title="Navigation Menu">
+ <p><a href="#title" title="top">Top</a></p>
+ <p><a href="#news" title="Recent News">News</a></p>
+ <p><a href="#sec-download" title="Download">Obtain...</a></p>
+ <p><a href="#sec-features" title="Features">Features</a></p>
+ <p><a href="#sec-examples" title="Examples">Examples</a></p>
+ <p><a href="#sec-resource" title="Resource">Resources</a></p>
+</div>
+
+
+<div id="contents" class="contents">
+
+<h1 id="title">THE DVIPDFM<i>x</i> PROJECT</h1>
+
+<p class="abstract">
+The <dfn title="extended dvipdfm">DVIPDFMx</dfn> project provides an eXtended version of the
+<dfn><a title="The dvipdfm Development Homepage" href="http://gaspra.kettering.edu/dvipdfm/">dvipdfm</a></dfn>,
+a <abbr title="Device Independent">DVI</abbr> format to <abbr title="Portable Document Format">PDF</abbr> translator
+developed by <span class="person">Mark A. Wicks</span>.
+
+The primary goal of this project is to support multi-byte character encodings and large character sets for East Asian
+languages by <abbr title="Character Identifier">CID</abbr>-keyed font technology.
+The secondary goal is to support as many features as
+<span><a title="The pdfTeX Development Homepage" href="http://www.tug.org/applications/pdftex/">pdfTeX</a></span>
+developed by <span class="person">Hàn Thê Thành</span>.
+
+This project is a combined work of the <span>dvipdfm-jpn</span> project by
+<!-- <span class="person" lang="ja-JP">平田 俊作</span> (Hirata, Shunsaku) -->
+<span class="person">Shunsaku Hirata</span>
+and its modified one, <span>dvipdfm-kor</span> by
+<!-- <span class="person" lang="ko-KR">趙 珍煥</span> (Cho, Jin-Hwan). -->
+<span class="person">Jin-Hwan Cho</span>.
+</p>
+
+<p class="annot">
+Choosing stylesheet <q>Screen</q> will show side-menu and
+select sans-serif font at smaller size, and
+stylesheet <q>Plain</q> will hide side-menu and select
+serif font at medium size.
+</p>
+
+<h2 id="news">What's New</h2>
+
+<div id="changelog">
+<ul class="log">
+ <li><div class="item"><span class="date">2005-05-05</span> Bug Fix in PK Font Generation</div>
+ <p class="desc">
+ Dvipdfmx-20040912 and 20050201 had a bug that it fails to generate PK font.
+ Patch:
+ <a href="snapshot/patch/tfm-c-20050201.diff">diff to <span class="file">src/tfm.c</span></a>
+ for 20040902-20050504.
+ </p>
+ </li>
+ <li><div class="item"><span class="date">2005-03-05</span> Bug Fix in MetaPost Support</div>
+ <p class="desc">
+ Dvipdfmx-20040824 and 20050201 had a bug that it doesn't correctly handle text strings in MetaPost output.
+ (CJK-LaTeX and HLaTeX users are affected.)
+ Patch:
+ <a href="snapshot/patch/mpost-c-20050201.diff">diff to <span class="file">src/mpost.c</span></a>
+ for 20050201-20050304.
+ </p>
+ </li>
+ <li><div class="item"><span class="date">2005-02-01</span> Important Note</div>
+ <p class="desc">
+ A few bugs were fixed, which occurred either in subfont scheme, e.g., CJK-LaTeX or HLaTeX, or in Truetype
+ fonts with CIDType2 format. We encourage the users to recompile the source in the
+ <a href="http://cvs.ktug.or.kr/viewcvs/dvipdfmx/">CVS repository</a> (with the tag DVIPDFMX-20050201).
+ For MiKTeX 2.4 users, see note in the section <q><a href="#sec-package">Binary Packages</a></q>.
+ </p>
+ </li>
+ <li><div class="item"><span class="date">2005-08-03</span> Graphics and Image Support</div>
+ <p class="desc">
+ Experimental embedded <abbr>ICC</abbr> profile
+ support for <abbr>JPEG</abbr> and <abbr>PNG</abbr> format images.
+ <abbr>BMP</abbr> image format is supported.
+ Bug fixes on <code>TPIC</code> support.
+ </p>
+ </li>
+ <li><div class="item"><span class="date">2004-08-03</span> Unicode Support</div>
+ <p class="desc">
+ A new encoding keyword "unicode" can be specified in fontmap
+ file for TrueType and Type1 font.
+ TrueType font must have Windows UCS2 (format 4) or UCS4 (format
+ 12) cmap subtable. Glyph list file (PS glyph name to Unicode
+ mapping) is required for Type1 font support.
+ Automatic creation and embedding of ToUnicode CMap is available
+ for Type 1, TrueType, and OpenType font.
+ </p>
+ </li>
+</ul>
+</div>
+
+<h2 id="sec-download">Obtaining Dvipdfmx</h2>
+
+<p class="abstract">
+The DVIPDFM<i>x</i> project basically does not offer pre-compiled binary packages.
+See, the section <q><a href="#sec-package">Binary Packages</a></q> for obtaining binary packages
+for each platforms.
+</p>
+
+<h3 id="sec-source">Source Code</h3>
+
+<p>
+You can obtain the latest snapshot from <a href="snapshot/">http://project.ktug.or.kr/dvipdfmx/snapshot/</a>.
+An anonymous access to the
+<abbr title="Concurrent Version System">CVS</abbr> repository
+is also available: You can update your local copy of DVIPDFMx source code via following commands:
+</p>
+
+<pre title="Instruction On Anonymous CVS Access">
+cvs -d:pserver:anonymous@cvs.ktug.or.kr:/home/cvsroot login
+cvs -d:pserver:anonymous@cvs.ktug.or.kr:/home/cvsroot co dvipdfmx
+</pre>
+
+<p>
+When prompted for a password for <code>anonymous</code> account, just press the <kbd>Enter</kbd> key.
+You can browse <abbr>CVS</abbr> repositories through browser interface at
+<a href="http://cvs.ktug.or.kr/viewcvs/dvipdfmx/">http://cvs.ktug.or.kr/viewcvs/dvipdfmx/</a>.
+</p>
+
+<p>
+To compile dvipdfmx, you need at least the kpathsea library which is used for finding location of
+various resource files, and dvipdfmx won't work without this library properly installed.
+Kpathsea library version heigher than 3.3 is recommended.
+
+In addition to this, the
+<a title="Go To Zlib Homepage" href="http://www.gzip.org/zlib/">zlib</a>
+data-compression library is required for compression support.
+Both zlib and
+<a title="Go To Libpng Homepage" href="http://www.libpng.org/pub/png/libpng.html">libpng</a>
+library is required for reading <abbr title="Portable Network Graphics">PNG</abbr> format image files.
+Dvipdfmx optionally support <span>libpaper</span> library for handling paper sizes.
+Please read <span class="file"><a href="README">README</a></span> file for more details.
+</p>
+
+<div class="important">
+<!--[if IE]><p>Important Note:</p><![endif]-->
+<p class="note">
+Default search path for various resource files required by dvipdfmx, namely
+<abbr>SFD</abbr>, CMap, and OpenType font files, may be different in recent
+installation of TeX, and dvipdfmx may fail to find those files if you update kpathsea library and dvipdfmx
+without adjusting existing <code>texmf</code> directory structure.
+In this case, please follow the instruction described
+in the section <cite><q>TeX Directory Structure (TDS)</q></cite>
+of <span class="file"><a href="README">README</a></span> file.
+</p>
+</div>
+
+
+<h3 id="sec-package">Binary Packages</h3>
+
+<ul>
+ <li><div class="item">MiKTeX :
+ <a title="MiKTeX Development Homepage" href="http://www.miktex.org">http://www.miktex.org</a>
+ </div>
+ <p class="desc">
+ An up-to-date implementation of TeX and related programs for Microsoft Windows
+ maintained by <span class="person">Christian Schenk</span>.
+ Cabinet binary packages of dvipdfmx for MiKTeX version 2.2, 2.3, and 2.4
+ is available
+ from <span class="file"><a href="snapshot/miktex/">snapshot/miktex/</a></span>
+ directory of the <a href=".">dvipdfmx project site</a>.
+ </p>
+ </li>
+ <li><div class="item">W32TeX :
+ <a href="http://www.fsci.fuk.kindai.ac.jp/kakuto/win32-ptex/">http://www.fsci.fuk.kindai.ac.jp/kakuto/win32-ptex/</a>
+ </div>
+ <p class="desc">
+ A TeX package for Microsoft Windows platforms based on Web2c, maintained by <span class="person">Akira Kakuto</span>;
+ including <span>pTeX</span>, <span>jTeX</span>, <span>GhostScript</span> and many other localized version of TeX
+ related programs especially useful for typesetting Japanese text.
+ </p>
+ </li>
+</ul>
+
+<div class="important">
+<!--[if IE]><p>Important Note:</p><![endif]-->
+<div class="note">
+<p>
+DVIPDFMx in the MiKTeX 2.4 distribution does not work smoothly due to several reasons.
+We encourage users to update as follows:
+</p>
+
+<ol>
+ <li>
+ <p class="desc">
+ Download the latest version of dvipdfmx program executable
+ <span class="file"><a href="snapshot/miktex/2.4/dvipdfmx.exe">dvipdfmx.exe</a></span>,
+ an update for MiKTeX 2.4 configuration file
+ <span class="file"><a href="snapshot/miktex/2.4/miktex.ini">miktex.ini</a></span>
+ for dvipdfmx, and an archive file
+ <span class="file"><a href="snapshot/miktex/2.4/ttf2pk.zip">ttf2pk.zip</a></span>
+ (a collection of various <abbr>SFD</abbr> files) from
+ <span class="file"><a href="snapshot/miktex/2.4/">snapshot/miktex/2.4/</a></span>
+ directory of the <a href=".">dvipdfmx project site</a>.
+ And obtain <q>Adobe Glyph List 2.0</q> from the
+ <a href="http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt">Adobe's Developers site</a>
+ (rename it as <span class="file">glyphlist.txt</span> if file name is different).
+ </p>
+ <li>
+ <p class="desc">
+ Replace dvipdfmx program executable
+ <span class="file">C:\texmf\miktex\bin\dvipdfmx.exe</span> with the one downloaded above.
+ </p>
+ </li>
+ <li>
+ <p class="desc">
+ Update your MiKTeX configuration file
+ <span class="file">C:\texmf\miktex\config\miktex.ini</span>
+ by replacing it with the one obtained above, or modify that manually as appropriate if you have your
+ own settings (i.e., the configuration is different from the initial installation).
+ The required changes are search path sections of <code>ttf2pk</code> and <code>ttf2tfm</code> programs.
+ </p>
+ </li>
+ <li>
+ <p class="desc">
+ Extract the archive file <span class="file">ttf2pk.zip</span> into the directory
+ <span class="file">C:\texmf</span> (or in other adequate places).
+ </p>
+ </li>
+ <li>
+ <p class="desc">
+ Place <span class="file">glyphlist.txt</span> file under the <span>dvipdfmx</span>
+ application data directory, e.g., <span class="file">C:\texmf\dvipdfm</span>.
+ </p>
+ </li>
+</ol>
+</div>
+</div>
+
+
+<h2 id="sec-features">Features</h2>
+
+<p class="abstract">
+Most features and enhancement added to <span>dvipdfm</span> is related to multi-byte encoding
+and font support, especially for supporting <abbr title="Chinese Japanese Korean">CJK</abbr> languages.
+</p>
+
+
+<h3>Font and Encoding</h3>
+
+<p>
+Dvipdfmx supports various encodings in rather unintuitive way (due to various reasons).
+For 8-bits encodings, it supports <q><code>.enc</code></q> format glyph encoding
+file (used by <code>dvips</code> program) with few extensions undocumented here and
+<q>remapping</q> of a set of 8-bit encoded TeX fonts to a single double-byte font with
+<abbr title="Subfont Definition">SFD</abbr> file support. And it can also support various
+multibyte encodings (excluding state-full encoding) by loading PostScript CMap resource.
+Not all encodings are supported depending on format of font to be used.
+</p>
+
+<p>
+The following font formats are supported:
+</p>
+
+<ul>
+ <li><div class="item">PostScript Type1</div>
+ <p class="desc">
+ PostScript Type1 format font is supported as in dvipdfm,
+ but they are converted to <abbr title="Compact Font Format">CFF</abbr>
+ format (for reducing <abbr>PDF</abbr> file size when compression is enabled)
+ and always embedded as a font subset. Currently usable only with
+ 8-bit encodings.
+ Multiple-Master font is not supported yet.
+ </p>
+ </li>
+ <li><div class="item">OpenType</div>
+ <p class="desc">
+ All flavours of OpenType fonts is supported: OpenType font with PostScript
+ outline, TrueType outline, and as <abbr>CID</abbr>Font in an OpenType
+ <q>wrapper</q>. However, as dvipdfmx is <em>not</em> a text manipulation
+ program nor layout program, it supports only a part of OpenType features;
+ partial support for OpenType <code>GSUB</code> Layout table just enough
+ for supporting vertical writing, some of ligatures, small-caps, and so on.
+ </p>
+ </li>
+ <li><div class="item">TrueType</div>
+ <p class="desc">
+ Both TrueType and <abbr title="TrueType Collection">TTC</abbr> format is supported.
+ There are several enhancement to dvipdfm including font subsetting.
+ They may be embedded as a TrueType font or as a <code>CIDFontType</code> 2 CIDFont.
+ </p>
+ </li>
+</ul>
+
+
+<h3>PDF Encryption</h3>
+
+<p>
+Encrypted <abbr>PDF</abbr> files can be generated if the <code>-S</code>
+option is given. The key bits (40-128 bits) and the permission flags are
+specified either in the configuration file <code>dvipdfmx.cfg</code> or
+with command line options <code>-K</code> (for key bits)
+and <code>-P</code> (for permission flags).
+</p>
+
+<h3>Graphics Support</h3>
+
+<p>
+All graphics format supported in dvipdfm is also supported in dvipdfmx
+with few improvement:
+A little enhancement on <abbr>PDF</abbr> inclusion (can handle dvipdfm
+output <abbr>PDF</abbr>).
+Improved <abbr title="Portable Network Graphics">PNG</abbr> support;
+alpha channel and <code>tRNS</code> chunk is fully supported.
+Indexed-color image is no longer converted to 24-bit
+<abbr title="Red Green Blue">RGB</abbr> color image.
+Experimental embedded
+<abbr title="International Color Consortium">ICC</abbr> profile
+support for <abbr title="Joint Photographic Experts Group">JPEG</abbr>
+and <abbr>PNG</abbr> format images.
+Windows <abbr>BMP</abbr> format is also supported in dvipdfmx.
+</p>
+
+<p>
+Nearly arbitrary graphics format can be supported with the help of external
+program as long as they can be translated into single page <abbr>PDF</abbr>
+<q>image</q> (like dvipdfm).
+There are few improvement on interpreting and translating PostScript code
+inserted with <code>\special</code> command or read from MetaPost output
+PostScript files. But there are still many limitations and restrictions.
+</p>
+
+<h2 id="sec-examples">Examples</h2>
+
+<p class="abstract">
+Sample outputs of dvipdfmx is available from the <span class="file"><a href="sample">sample/</a></span>
+directory of the <a href=".">dvipdfmx project site</a>.
+</p>
+
+<p class="annot">
+Some of examples presented in this section contains embedded
+<abbr>CJK</abbr> TrueType fonts. You need a <abbr>PDF</abbr> viewer supporting
+at least PDF version 1.3. For printing with PostScript printers,
+you may need <abbr>CID</abbr>-keyed font supporting printer,
+depending on how PDF files are converted to PostScript format.
+</p>
+
+<h3>ConTeXt</h3>
+
+<p>
+Most of examples are contributed by <span class="person">Lei Wang</span>.
+</p>
+
+<ul>
+ <li><div class="item">Chinese Zodiac</div>
+ <p class="desc">
+ Nice example by <span class="person">Lei Wang</span>.
+ Chinese zodiac and it's explanation:
+ <a href="sample/context/zodiac.pdf">zodiac.pdf</a>.
+ <span class="note">This document will be opened in fullscreen mode. Please press <kbd>ESC</kbd> key
+ to show menu bar in Adobe Reader.</span>
+ </p>
+ </li>
+ <li><div class="item">Examples contributed by Lei Wang</div>
+ <p class="desc">
+ ConTeXt examples with Chinese. GBK encoding is used in source files.
+ TrueType font embedded in <abbr>PDF</abbr>.
+ Bookmarks
+ [<a href="sample/context/bookmark.pdf">PDF (bookmark.pdf)</a>,
+ <a href="sample/context/bookmark.tex">TeX (bookmark.tex)</a>],
+ PDF Interaction
+ [<a href="sample/context/help-test.pdf">PDF (help-test.pdf)</a>,
+ <a href="sample/context/help-test.tex">TeX (help-test.tex)</a>],
+ and MetaPost graphics
+ [<a href="sample/context/mp-test.pdf">PDF (mp-test.pdf)</a>,
+ <a href="sample/context/mp-test.tar.gz">source archive (mp-test.tar.gz)</a>].
+ </p>
+ </li>
+ <li><div class="item">Other ConTeXt Examples</div>
+ <p class="desc">
+ Page Size Changes
+ [<a href="sample/context/papersize.pdf">PDF (papersize.pdf)</a>,
+ <a href="sample/context/papersize.tex">TeX (papersize.tex)</a>]
+ and Color Shading Example
+ [<a href="sample/context/color-shading.pdf">PDF (color-shading.pdf)</a>,
+ <a href="sample/context/color-shading.tex">TeX (color-shading.tex)</a>].
+ </p>
+ </li>
+</ul>
+
+
+<h3>CJK-LaTeX Package</h3>
+
+<p>
+A <span class="file"><a href="testsuite">testsuite</a></span> for testing CJK-LaTeX compatibility is
+available:
+<span class="file"><a href="testsuite/testsuite_cjk-latex.tar.gz">testsuite_cjk-latex.tar.gz</a></span>
+containing <span class="file">cjkmix2</span> for testing various <abbr>CJK</abbr> encodings and
+TrueType font support with CJK-LaTeX package + dvipdfmx.
+</p>
+
+<ul>
+ <li><div class="item"><a href="sample/cjk-latex/hunmin.pdf">HunMinJeongEum</a></div>
+ <p class="desc">
+ TrueType font embedded, 88K bytes. Contributed by <span class="person">Kangsoo Kim</span>.
+ </p>
+ </li>
+ <li><div class="item"><a href="sample/cjk-latex/kwandong.pdf">KwanDongByeolGok</a></div>
+ <p class="desc">
+ TrueType embedded, 257K bytes.
+ </p>
+ </li>
+ <li><div class="item"><a href="sample/cjk-latex/unicode.pdf">UTF8 text with several languages mixed</a></div>
+ <p class="desc">
+ Bitstream Cyberbit TrueType font is embedded, 43K bytes.
+ </p>
+ </li>
+</ul>
+
+
+<h3>HLaTeX Package</h3>
+
+<ul>
+ <li><div class="item"><a href="sample/hlatex/msfonts-kor.pdf">Korean MS-Windows TrueType Fonts</a></div>
+ <p class="desc">
+ KS encoding was used in the source. TrueType (no embedded font) with stylistic variants, 19K bytes.
+ You need MS-Windows Korean TrueType fonts, <code>batang.ttc</code> and <code>gulim.ttc</code>.
+ </p>
+ </li>
+ <li><div class="item"><a href="http://www.ktug.or.kr/doc/lshort-kr/lshort-kr-sandol.pdf">The Not So Short Introduction to LaTeX2e (Korean)</a></div>
+ <p class="desc">
+ KS encoding. TrueType embedded, 1.1M bytes.
+ Contributed by the lshort-kr project team.
+ </p>
+ </li>
+</ul>
+
+<h2><a name="sec-resource">Resources</a></h2>
+
+<p class="abstract">
+This section contains documents related to DVIPDFMx, some useful information for
+typesetting <abbr>CJK</abbr> text with TeX, and a small list of freely available fonts, etc...
+</p>
+
+<h3>DVIPDFM<i>x</i> Documents</h3>
+
+<p>
+There are no <abbr title="Hyper Text Markup Language">HTML</abbr> nor <abbr>PDF</abbr> manulas for dvipdfmx
+available yet,
+however, as dvipdfmx is an extended version of dvipdfm, basic usage is not different from the
+original one. Please refer <cite><q>The Dvipdfm User's Manual</q></cite> and other documents contained in
+<a href="http://gaspra.kettering.edu/dvipdfm/">dvipdfm</a> distribution.
+The <span class="file"><a href="README">README</a></span> file may contain brief instruction for installation,
+short description of additional resources, and summary of extension made in dvipdfmx.
+There are few documents related to dvipdfmx available from the <span class="file"><a href="doc">doc/</a></span>
+section of the <a href=".">dvipdfmx project site</a>:
+<cite><q><a href="doc/tug2003.pdf">DVIPDFM<i>x</i>, an eXtension of DVIPDFM</a></q></cite>,
+PDF version of presentation given at the <abbr title="TeX Users Group">TUG</abbr> 2003 conference.
+</p>
+
+<h3>TeX Related, LaTeX Packages, and Extended TeX</h3>
+
+<ul>
+ <li>
+ <div class="item">Aleph</div>
+ <p class="desc">
+ <cite title="Cited from Aleph entry of TeX FAQ" lang="en">
+ <q>The Aleph project aims to build a <q>usable</q> version of Omega, incorporating e-TeX extensions
+ from the NTS project.</q>
+ </cite>
+ Some information and link to Aleph package can be found in the
+ <a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=aleph">Aleph</a> entry of
+ the <a href="http://www.tex.ac.uk/faq">TeX FAQ</a>
+ and <a href="http://www.pragma-ade.com/general/manuals/aleph.pdf">Aleph manual</a> (link to <abbr>PDF</abbr> file)
+ available from <a href="http://www.pragma-ade.com/">www.pragma-ade.com</a>.
+ </p>
+ </li>
+ <li><div class="item">
+ <a title="ASCII pTeX Homepage" href="http://www.ascii.co.jp/pb/ptex/">ASCII pTeX</a>
+ </div>
+ <p class="desc">
+ A localized (Japanese) version of TeX.
+ Extensions for typesetting Japanese text and vertical writing.
+ </p>
+ </li>
+ <li><div class="item">
+ <a title="CJK-LaTeX Homepage" href="http://cjk.ffii.org/">CJK-LaTeX</a>
+ </div>
+ <p class="desc">
+ A <span title="LaTeX 2e">LaTeX 2ε</span> macro package which enables the use of CJK scripts (Chinese/Japanese/Korean) in
+ various encodings, written by <span class="person">Werner Lemberg</span>.
+ </p>
+ </li>
+ <li><div class="item"><a title="Go To ConTeXt Development Homepage" href="http://www.pragma-ade.com/">ConTeXt</a></div>
+ <p class="desc">
+ The ConTeXt driver file <a href="contrib/context/spec-dpx.tex">spec-dpx.tex</a>
+ for DVIPDFMx is contained in the
+ <a href="http://www.pragma-ade.com/beta.htm">beta version of ConTeXt</a>
+ since December 4, 2002.
+ Choose <code>dvipdfmx</code> as output option.
+ </p>
+ </li>
+ <li><div class="item"><a href="http://project.ktug.or.kr/hlatex/">HLaTeX</a></div>
+ <p class="desc">
+ Packages for typesetting Korean language with LaTeX, includes Korean localization and fonts.
+ </p>
+ </li>
+ <li><div class="item"><a href="http://oku.edu.mie-u.ac.jp/~okumura/texfaq/">Japanese TeX FAQ</a></div>
+ <p class="desc">A page maintained by <span class="person">Haruhiko Okumura</span>. (In Japanese)</p>
+ </li>
+ <li><div class="item"><a href="http://www.ktug.or.kr">KTUG</a></div>
+ <p class="desc">Korean TeX Users Group. (In Korean)</p>
+ </li>
+ <li><div class="item">Omega</div></li>
+</ul>
+
+
+<h3>CJK or Unicode Font</h3>
+
+<p>
+Many CJK/Unicode fonts are freely available in various formats and
+in a variety of qualities.
+</p>
+
+<ul>
+ <li><div class="item"><a href="http://www.adobe.com/products/acrobat/acrrasianfontpack.html">Asian and Central European font packs for Adobe Reader</a></div>
+ <p class="desc">
+ Several OpenType <abbr>CID</abbr>-keyed fonts are freely available from Adobe
+ <strong>for use with <span class="registered">Adobe</span> <span class="registered">Reader</span></strong>.
+ It also contains several CMap resources for standard CJK encodings and useful ToUnicode CMaps.
+ In the recent version of asian font pack, no san-serif font...
+ </p>
+ </li>
+ <li><div class="item"><a href="http://www.alanwood.net/unicode/">Alan Wood's Unicode Resources</a></div>
+ <p class="desc">
+ <!-- &mdash; -->
+ ... Unicode and Multilingual Support in HTML, Fonts, Web Browsers and Other Applications.
+ List of Unicode TrueType/OpenType fonts available for various platforms, along with
+ Unicode ranges covered by each font.
+ </p>
+ </li>
+ <li><div class="item">Arphic TrueType and Wang TrueType Font</div>
+ <p class="desc">
+ Several Chinese TrueType fonts can be found from
+ <a href="ftp://freebsd.sinica.edu.tw/pub/keith/">ftp://freebsd.sinica.edu.tw/pub/keith/</a>.
+ </p>
+ </li>
+ <li><div class="item">Korean Un Fonts</div>
+ <p class="desc">
+ Several Korean TrueType fonts can be found from
+ <a href="http://kldp.net/projects/unfonts/">http://kldp.net/projects/unfonts/</a>. (in Korean)
+ </p>
+ </li>
+ <li><div class="item">Gentium - a typeface for the nations</div>
+ <p class="desc">
+ Available from <a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=Gentium">SIL international</a>.
+ <cite title="Cited from Gentium Homepage..." lang="en">
+ <q>Gentium is a typeface family designed to enable the diverse ethnic groups around the world who use
+ the Latin script to produce readable, high-quality publications. It supports a wide range of
+ Latin-based alphabets and includes glyphs that correspond to all the Latin ranges of Unicode.</q>
+ </cite>
+ </p>
+ </li>
+ <li><div class="item">
+ <a href="http://www.microsoft.com/windows/ie/downloads/recommended/ime/default.asp">Microsoft Global Input Method Editors...</a>
+ </div>
+ <p class="desc">
+ ... Further Enhance East Asian Text Input:<!-- long title :( -->
+ Add-on packages for Microsoft Global <abbr title="Input Method Editor">IME</abbr>.
+ You can find TrueType fonts as a part of additional language packs
+ <strong>for use with Microsoft Windows OS</strong>.
+ <span class="file">MS Hei</span> and <span class="file">MS Song</span> (Simplified Chinese),
+ <span class="file">MingLiu</span> (Traditional Chinese),
+ <span class="file">GulimChe</span> (Korean), and <span class="file">MS Gothic</span> (Japanese) are available.
+ </p>
+ </li>
+</ul>
+
+
+<h3>Specifications</h3>
+
+<p>
+Useful documents and resources for developers.
+</p>
+
+<ul>
+ <li><div class="item"><a href="http://partners.adobe.com/public/developer/main.html">Adobe Solutions Network | Product and Technical Resources</a></div>
+ <p class="desc">
+ Resources for Developers, Print Service Providers, and others interested in making the most of
+ Adobe products and technologies.
+ </p>
+ </li>
+ <li><div class="item"><a href="http://www.microsoft.com/typography/otspec/default.htm">OpenType specification</a></div>
+ <p class="desc">
+ <span class="trademarked">OpenType</span> Specification from Microsoft Corporation.
+ </p>
+ </li>
+</ul>
+
+<p>
+DVI standard is available from <code>CTAN:dviware/driv-standard</code>.
+</p>
+
+
+<div id="footer" class="foot">
+<div class="logo">
+<a href="http://validator.w3.org/check/referer"><img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" height="31" width="88"></a>
+</div>
+<div>
+Copyright &copy; 2002-2005,
+The DVIPDFMx Project Team
+<span class="mail"><a href="mailto:dvipdfmx@project.ktug.or.kr">dvipdfmx@project.ktug.or.kr</a></span>
+<br>
+<span class="person"><a href="mailto:chofchof@ktug.or.kr">Jin-Hwan Cho</a></span>
+and
+<span class="person">Shunsaku Hirata</span>,
+Last modified on May 5, 2005.
+</div>
+</div>
+
+</div>
+<!-- class contents -->
+
+</body>
+</html>
diff --git a/Build/source/texk/xdvipdfmx/install-sh b/Build/source/texk/xdvipdfmx/install-sh
new file mode 100755
index 00000000000..e9de23842dc
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/Build/source/texk/xdvipdfmx/missing b/Build/source/texk/xdvipdfmx/missing
new file mode 100755
index 00000000000..e7ef83a1c25
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/missing
@@ -0,0 +1,360 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2003-09-02.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+ # We have makeinfo, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Build/source/texk/xdvipdfmx/mkinstalldirs b/Build/source/texk/xdvipdfmx/mkinstalldirs
new file mode 100755
index 00000000000..8a9a7fe9e9f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 2002/04/16 03:25:44 chofchof Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/Build/source/texk/xdvipdfmx/rpm/xdvipdfmx-0.3.spec b/Build/source/texk/xdvipdfmx/rpm/xdvipdfmx-0.3.spec
new file mode 100644
index 00000000000..7e1ecb39ce5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/rpm/xdvipdfmx-0.3.spec
@@ -0,0 +1,67 @@
+# # # # # # # # # #
+# PREAMBLE
+# # # # # # # # # #
+
+Summary: An extended version of DVIPDFMx with support for XeTeX output
+Name: xdvipdfmx
+Version: 0.3
+Release: 1
+Copyright: GPL
+Group: Productivity/Publishing/TeX/Base
+Source: http://scripts.sil.org/svn-view/xdvipdfmx/TAGS/xdvipdfmx-%{version}.tar.gz
+URL: http://scripts.sil.org/xetex_linux
+Vendor: SIL International
+Packager: Jonathan Kew <jonathan_kew@sil.org>
+
+Requires: tetex, fontconfig, freetype2, libpng, zlib
+
+# to build, we need various -devel packages...
+BuildRequires: fontconfig-devel, freetype2-devel, libpng-devel, zlib-devel, te_kpath
+
+%description
+xdvipdfmx is an output driver for the XeTeX typesetting system.
+It is an extended version of DVIPDFMx by Jin-Hwan Cho and Shunsaku Hirata,
+which is itself an extended version of dvipdfm by Mark A. Wicks.
+This driver converts XDV (extended DVI) output from the xetex program
+into standard PDF that can be viewed or printed.
+
+# # # # # # # # # #
+# PREP
+# # # # # # # # # #
+
+%prep
+
+# setup macro does standard clean-and-unpack
+%setup
+
+# # # # # # # # # #
+# BUILD
+# # # # # # # # # #
+
+%build
+sh ./configure --with-freetype2=`freetype-config --prefix`
+make
+
+# # # # # # # # # #
+# INSTALL
+# # # # # # # # # #
+
+%install
+# trying to copy the teTeX installation of dvipdfm, instead of using make install
+program=xdvipdfmx
+oldbin=`which dvipdfm`
+realoldbin=`readlink -f ${oldbin}`
+bindir=`dirname ${realoldbin}`
+cp src/${program} ${bindir}/${program}
+echo ${bindir}/${program} > installed-files
+if [ "${oldbin}" != "${realoldbin}" ]; then
+ linkdir=`dirname ${oldbin}`
+ ln -fs ${bindir}/${program} ${linkdir}/${program}
+ echo ${linkdir}/${program} >> installed-files
+fi
+
+# # # # # # # # # #
+# FILE LIST
+# # # # # # # # # #
+
+%files -f installed-files
diff --git a/Build/source/texk/xdvipdfmx/src/Makefile.am b/Build/source/texk/xdvipdfmx/src/Makefile.am
new file mode 100644
index 00000000000..7fa8533d8e0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/Makefile.am
@@ -0,0 +1,45 @@
+bin_PROGRAMS = xdvipdfmx
+xdvipdfmx_SOURCES = agl.c agl_standard.c bmpimage.c cff.c cff_dict.c cid.c cidtype0.c cidtype2.c \
+cmap.c cmap_read.c cmap_write.c cs_type2.c \
+dpxconf.c dpxcrypt.c dpxfile.c dpxutil.c \
+dvi.c dvipdfmx.c epdf.c error.c fontmap.c jpegimage.c mem.c mfileio.c mpost.c \
+numbers.c otl_conf.c otl_opt.c pdfcolor.c pdfdev.c pdfdoc.c pdfdraw.c pdfencoding.c \
+pdfencrypt.c pdffont.c pdfnames.c pdfobj.c pdfparse.c pdfresource.c pdfximage.c \
+pkfont.c pngimage.c pst.c pst_obj.c sfnt.c \
+spc_color.c spc_dvips.c spc_html.c spc_misc.c spc_pdfm.c spc_tpic.c spc_util.c spc_xtx.c specials.c \
+subfont.c tfm.c \
+tt_aux.c tt_cmap.c tt_glyf.c tt_gsub.c tt_post.c tt_table.c truetype.c \
+type0.c t1_char.c t1_load.c type1.c type1c.c \
+unicode.c vf.c \
+agl.h bmpimage.h asl_charset.h cff.h cff_dict.h cff_limits.h cff_stdstr.h cff_types.h \
+cid.h cid_basefont.h cid_p.h cidtype0.h cidtype2.h cmap.h cmap_p.h cmap_read.h cmap_write.h \
+cs_type2.h dpxconf.h dpxcrypt.h dpxutil.h dpxfile.h dvi.h dvicodes.h epdf.h error.h fontmap.h \
+jpegimage.h mem.h mfileio.h mpost.h numbers.h otl_conf.h otl_opt.h pdfcolor.h pdfdev.h \
+pdfdoc.h pdfdraw.h pdfencoding.h pdfencrypt.h pdffont.h pdflimits.h pdfnames.h pdfobj.h \
+pdfparse.h pdfresource.h pdfximage.h pkfont.h pngimage.h pst.h pst_obj.h sfnt.h \
+spc_color.h spc_dvips.h spc_html.h spc_misc.h spc_pdfm.h spc_tpic.h spc_util.h spc_xtx.h specials.h \
+subfont.h system.h tfm.h \
+tt_aux.h tt_cmap.h tt_glyf.h tt_gsub.h tt_post.h tt_table.h truetype.h \
+type0.h t1_char.h t1_load.h type1.h type1c.h \
+unicode.h vf.h
+
+
+LIBPNGDIR=$(top_builddir)/../../libs/libpng
+LIBPNGSRCDIR=$(srcdir)/$(LIBPNGDIR)
+LIBPNGDEP = @LIBPNGDEP@
+LDLIBPNG = @LDLIBPNG@
+
+ZLIBDIR=$(top_builddir)/../../libs/zlib
+ZLIBSRCDIR=$(srcdir)/$(ZLIBDIR)
+ZLIBDEP = @ZLIBDEP@
+LDZLIB = @LDZLIB@
+
+FREETYPE2DIR = $(top_builddir)/../../libs/freetype2
+FREETYPE2SRCDIR = $(srcdir)/$(FREETYPE2DIR)
+LDFREETYPE2 = @LDFREETYPE2@
+FREETYPE2DEP = @FREETYPE2DEP@
+
+xdvipdfmx_CPPFLAGS = @LIBPNGCPPFLAGS@ @ZLIBCPPFLAGS@ @FREETYPE2CPPFLAGS@
+xdvipdfmx_LDADD = $(LDADD) $(LDLIBPNG) $(LDZLIB) $(LDFREETYPE2)
+xdvipdfmx_DEPENDENCIES = $(ZLIBDEP) $(LIBPNGDEP) $(FREETYPE2DEP)
+xdvipdfmx_LDFLAGS = @xdvipdfmx_LDFLAGS@
diff --git a/Build/source/texk/xdvipdfmx/src/Makefile.in b/Build/source/texk/xdvipdfmx/src/Makefile.in
new file mode 100644
index 00000000000..0fdafce447a
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/Makefile.in
@@ -0,0 +1,1531 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = xdvipdfmx$(EXEEXT)
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/../../libs/libpng/withenable.ac \
+ $(top_srcdir)/../../libs/libpng/libpng.ac \
+ $(top_srcdir)/../../libs/zlib/withenable.ac \
+ $(top_srcdir)/../../libs/zlib/zlib.ac \
+ $(top_srcdir)/../../libs/freetype2/withenable.ac \
+ $(top_srcdir)/../../libs/freetype2/freetype2.ac \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_xdvipdfmx_OBJECTS = xdvipdfmx-agl.$(OBJEXT) \
+ xdvipdfmx-agl_standard.$(OBJEXT) xdvipdfmx-bmpimage.$(OBJEXT) \
+ xdvipdfmx-cff.$(OBJEXT) xdvipdfmx-cff_dict.$(OBJEXT) \
+ xdvipdfmx-cid.$(OBJEXT) xdvipdfmx-cidtype0.$(OBJEXT) \
+ xdvipdfmx-cidtype2.$(OBJEXT) xdvipdfmx-cmap.$(OBJEXT) \
+ xdvipdfmx-cmap_read.$(OBJEXT) xdvipdfmx-cmap_write.$(OBJEXT) \
+ xdvipdfmx-cs_type2.$(OBJEXT) xdvipdfmx-dpxconf.$(OBJEXT) \
+ xdvipdfmx-dpxcrypt.$(OBJEXT) xdvipdfmx-dpxfile.$(OBJEXT) \
+ xdvipdfmx-dpxutil.$(OBJEXT) xdvipdfmx-dvi.$(OBJEXT) \
+ xdvipdfmx-dvipdfmx.$(OBJEXT) xdvipdfmx-epdf.$(OBJEXT) \
+ xdvipdfmx-error.$(OBJEXT) xdvipdfmx-fontmap.$(OBJEXT) \
+ xdvipdfmx-jpegimage.$(OBJEXT) xdvipdfmx-mem.$(OBJEXT) \
+ xdvipdfmx-mfileio.$(OBJEXT) xdvipdfmx-mpost.$(OBJEXT) \
+ xdvipdfmx-numbers.$(OBJEXT) xdvipdfmx-otl_conf.$(OBJEXT) \
+ xdvipdfmx-otl_opt.$(OBJEXT) xdvipdfmx-pdfcolor.$(OBJEXT) \
+ xdvipdfmx-pdfdev.$(OBJEXT) xdvipdfmx-pdfdoc.$(OBJEXT) \
+ xdvipdfmx-pdfdraw.$(OBJEXT) xdvipdfmx-pdfencoding.$(OBJEXT) \
+ xdvipdfmx-pdfencrypt.$(OBJEXT) xdvipdfmx-pdffont.$(OBJEXT) \
+ xdvipdfmx-pdfnames.$(OBJEXT) xdvipdfmx-pdfobj.$(OBJEXT) \
+ xdvipdfmx-pdfparse.$(OBJEXT) xdvipdfmx-pdfresource.$(OBJEXT) \
+ xdvipdfmx-pdfximage.$(OBJEXT) xdvipdfmx-pkfont.$(OBJEXT) \
+ xdvipdfmx-pngimage.$(OBJEXT) xdvipdfmx-pst.$(OBJEXT) \
+ xdvipdfmx-pst_obj.$(OBJEXT) xdvipdfmx-sfnt.$(OBJEXT) \
+ xdvipdfmx-spc_color.$(OBJEXT) xdvipdfmx-spc_dvips.$(OBJEXT) \
+ xdvipdfmx-spc_html.$(OBJEXT) xdvipdfmx-spc_misc.$(OBJEXT) \
+ xdvipdfmx-spc_pdfm.$(OBJEXT) xdvipdfmx-spc_tpic.$(OBJEXT) \
+ xdvipdfmx-spc_util.$(OBJEXT) xdvipdfmx-spc_xtx.$(OBJEXT) \
+ xdvipdfmx-specials.$(OBJEXT) xdvipdfmx-subfont.$(OBJEXT) \
+ xdvipdfmx-tfm.$(OBJEXT) xdvipdfmx-tt_aux.$(OBJEXT) \
+ xdvipdfmx-tt_cmap.$(OBJEXT) xdvipdfmx-tt_glyf.$(OBJEXT) \
+ xdvipdfmx-tt_gsub.$(OBJEXT) xdvipdfmx-tt_post.$(OBJEXT) \
+ xdvipdfmx-tt_table.$(OBJEXT) xdvipdfmx-truetype.$(OBJEXT) \
+ xdvipdfmx-type0.$(OBJEXT) xdvipdfmx-t1_char.$(OBJEXT) \
+ xdvipdfmx-t1_load.$(OBJEXT) xdvipdfmx-type1.$(OBJEXT) \
+ xdvipdfmx-type1c.$(OBJEXT) xdvipdfmx-unicode.$(OBJEXT) \
+ xdvipdfmx-vf.$(OBJEXT)
+xdvipdfmx_OBJECTS = $(am_xdvipdfmx_OBJECTS)
+am__DEPENDENCIES_1 =
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(xdvipdfmx_SOURCES)
+DIST_SOURCES = $(xdvipdfmx_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FREETYPE2CPPFLAGS = @FREETYPE2CPPFLAGS@
+FREETYPE2DEP = @FREETYPE2DEP@
+FT2CPPFLAGS = @FT2CPPFLAGS@
+FT2DEP = @FT2DEP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LDFREETYPE2 = @LDFREETYPE2@
+LDFT2 = @LDFT2@
+LDLIBPNG = @LDLIBPNG@
+LDZLIB = @LDZLIB@
+LIBOBJS = @LIBOBJS@
+LIBPNGCPPFLAGS = @LIBPNGCPPFLAGS@
+LIBPNGDEP = @LIBPNGDEP@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TDS_VERSION_11_FALSE = @TDS_VERSION_11_FALSE@
+TDS_VERSION_11_TRUE = @TDS_VERSION_11_TRUE@
+VERSION = @VERSION@
+ZLIBCPPFLAGS = @ZLIBCPPFLAGS@
+ZLIBDEP = @ZLIBDEP@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+dvipdfmx_LDFLAGS = @dvipdfmx_LDFLAGS@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xdvipdfmx_LDFLAGS = @xdvipdfmx_LDFLAGS@
+xdvipdfmx_SOURCES = agl.c agl_standard.c bmpimage.c cff.c cff_dict.c cid.c cidtype0.c cidtype2.c \
+cmap.c cmap_read.c cmap_write.c cs_type2.c \
+dpxconf.c dpxcrypt.c dpxfile.c dpxutil.c \
+dvi.c dvipdfmx.c epdf.c error.c fontmap.c jpegimage.c mem.c mfileio.c mpost.c \
+numbers.c otl_conf.c otl_opt.c pdfcolor.c pdfdev.c pdfdoc.c pdfdraw.c pdfencoding.c \
+pdfencrypt.c pdffont.c pdfnames.c pdfobj.c pdfparse.c pdfresource.c pdfximage.c \
+pkfont.c pngimage.c pst.c pst_obj.c sfnt.c \
+spc_color.c spc_dvips.c spc_html.c spc_misc.c spc_pdfm.c spc_tpic.c spc_util.c spc_xtx.c specials.c \
+subfont.c tfm.c \
+tt_aux.c tt_cmap.c tt_glyf.c tt_gsub.c tt_post.c tt_table.c truetype.c \
+type0.c t1_char.c t1_load.c type1.c type1c.c \
+unicode.c vf.c \
+agl.h bmpimage.h asl_charset.h cff.h cff_dict.h cff_limits.h cff_stdstr.h cff_types.h \
+cid.h cid_basefont.h cid_p.h cidtype0.h cidtype2.h cmap.h cmap_p.h cmap_read.h cmap_write.h \
+cs_type2.h dpxconf.h dpxcrypt.h dpxutil.h dpxfile.h dvi.h dvicodes.h epdf.h error.h fontmap.h \
+jpegimage.h mem.h mfileio.h mpost.h numbers.h otl_conf.h otl_opt.h pdfcolor.h pdfdev.h \
+pdfdoc.h pdfdraw.h pdfencoding.h pdfencrypt.h pdffont.h pdflimits.h pdfnames.h pdfobj.h \
+pdfparse.h pdfresource.h pdfximage.h pkfont.h pngimage.h pst.h pst_obj.h sfnt.h \
+spc_color.h spc_dvips.h spc_html.h spc_misc.h spc_pdfm.h spc_tpic.h spc_util.h spc_xtx.h specials.h \
+subfont.h system.h tfm.h \
+tt_aux.h tt_cmap.h tt_glyf.h tt_gsub.h tt_post.h tt_table.h truetype.h \
+type0.h t1_char.h t1_load.h type1.h type1c.h \
+unicode.h vf.h
+
+LIBPNGDIR = $(top_builddir)/../../libs/libpng
+LIBPNGSRCDIR = $(srcdir)/$(LIBPNGDIR)
+ZLIBDIR = $(top_builddir)/../../libs/zlib
+ZLIBSRCDIR = $(srcdir)/$(ZLIBDIR)
+FREETYPE2DIR = $(top_builddir)/../../libs/freetype2
+FREETYPE2SRCDIR = $(srcdir)/$(FREETYPE2DIR)
+xdvipdfmx_CPPFLAGS = @LIBPNGCPPFLAGS@ @ZLIBCPPFLAGS@ @FREETYPE2CPPFLAGS@
+xdvipdfmx_LDADD = $(LDADD) $(LDLIBPNG) $(LDZLIB) $(LDFREETYPE2)
+xdvipdfmx_DEPENDENCIES = $(ZLIBDEP) $(LIBPNGDEP) $(FREETYPE2DEP)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+xdvipdfmx$(EXEEXT): $(xdvipdfmx_OBJECTS) $(xdvipdfmx_DEPENDENCIES)
+ @rm -f xdvipdfmx$(EXEEXT)
+ $(LINK) $(xdvipdfmx_LDFLAGS) $(xdvipdfmx_OBJECTS) $(xdvipdfmx_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-agl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-agl_standard.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-bmpimage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cff.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cff_dict.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cidtype0.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cidtype2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cmap_read.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cmap_write.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-cs_type2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-dpxconf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-dpxcrypt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-dpxfile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-dpxutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-dvi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-dvipdfmx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-epdf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-fontmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-jpegimage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-mem.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-mfileio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-mpost.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-numbers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-otl_conf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-otl_opt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfcolor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfdev.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfdoc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfdraw.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfencoding.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfencrypt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdffont.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfnames.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfobj.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfresource.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pdfximage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pkfont.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pngimage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pst.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-pst_obj.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-sfnt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_color.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_dvips.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_html.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_misc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_pdfm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_tpic.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_util.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-spc_xtx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-specials.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-subfont.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-t1_char.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-t1_load.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tfm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-truetype.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tt_aux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tt_cmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tt_glyf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tt_gsub.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tt_post.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-tt_table.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-type0.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-type1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-type1c.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-unicode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvipdfmx-vf.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+xdvipdfmx-agl.o: agl.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-agl.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-agl.Tpo" -c -o xdvipdfmx-agl.o `test -f 'agl.c' || echo '$(srcdir)/'`agl.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-agl.Tpo" "$(DEPDIR)/xdvipdfmx-agl.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-agl.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='agl.c' object='xdvipdfmx-agl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-agl.o `test -f 'agl.c' || echo '$(srcdir)/'`agl.c
+
+xdvipdfmx-agl.obj: agl.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-agl.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-agl.Tpo" -c -o xdvipdfmx-agl.obj `if test -f 'agl.c'; then $(CYGPATH_W) 'agl.c'; else $(CYGPATH_W) '$(srcdir)/agl.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-agl.Tpo" "$(DEPDIR)/xdvipdfmx-agl.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-agl.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='agl.c' object='xdvipdfmx-agl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-agl.obj `if test -f 'agl.c'; then $(CYGPATH_W) 'agl.c'; else $(CYGPATH_W) '$(srcdir)/agl.c'; fi`
+
+xdvipdfmx-agl_standard.o: agl_standard.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-agl_standard.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-agl_standard.Tpo" -c -o xdvipdfmx-agl_standard.o `test -f 'agl_standard.c' || echo '$(srcdir)/'`agl_standard.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-agl_standard.Tpo" "$(DEPDIR)/xdvipdfmx-agl_standard.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-agl_standard.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='agl_standard.c' object='xdvipdfmx-agl_standard.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-agl_standard.o `test -f 'agl_standard.c' || echo '$(srcdir)/'`agl_standard.c
+
+xdvipdfmx-agl_standard.obj: agl_standard.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-agl_standard.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-agl_standard.Tpo" -c -o xdvipdfmx-agl_standard.obj `if test -f 'agl_standard.c'; then $(CYGPATH_W) 'agl_standard.c'; else $(CYGPATH_W) '$(srcdir)/agl_standard.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-agl_standard.Tpo" "$(DEPDIR)/xdvipdfmx-agl_standard.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-agl_standard.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='agl_standard.c' object='xdvipdfmx-agl_standard.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-agl_standard.obj `if test -f 'agl_standard.c'; then $(CYGPATH_W) 'agl_standard.c'; else $(CYGPATH_W) '$(srcdir)/agl_standard.c'; fi`
+
+xdvipdfmx-bmpimage.o: bmpimage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-bmpimage.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-bmpimage.Tpo" -c -o xdvipdfmx-bmpimage.o `test -f 'bmpimage.c' || echo '$(srcdir)/'`bmpimage.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-bmpimage.Tpo" "$(DEPDIR)/xdvipdfmx-bmpimage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-bmpimage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bmpimage.c' object='xdvipdfmx-bmpimage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-bmpimage.o `test -f 'bmpimage.c' || echo '$(srcdir)/'`bmpimage.c
+
+xdvipdfmx-bmpimage.obj: bmpimage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-bmpimage.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-bmpimage.Tpo" -c -o xdvipdfmx-bmpimage.obj `if test -f 'bmpimage.c'; then $(CYGPATH_W) 'bmpimage.c'; else $(CYGPATH_W) '$(srcdir)/bmpimage.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-bmpimage.Tpo" "$(DEPDIR)/xdvipdfmx-bmpimage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-bmpimage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bmpimage.c' object='xdvipdfmx-bmpimage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-bmpimage.obj `if test -f 'bmpimage.c'; then $(CYGPATH_W) 'bmpimage.c'; else $(CYGPATH_W) '$(srcdir)/bmpimage.c'; fi`
+
+xdvipdfmx-cff.o: cff.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cff.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cff.Tpo" -c -o xdvipdfmx-cff.o `test -f 'cff.c' || echo '$(srcdir)/'`cff.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cff.Tpo" "$(DEPDIR)/xdvipdfmx-cff.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cff.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cff.c' object='xdvipdfmx-cff.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cff.o `test -f 'cff.c' || echo '$(srcdir)/'`cff.c
+
+xdvipdfmx-cff.obj: cff.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cff.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cff.Tpo" -c -o xdvipdfmx-cff.obj `if test -f 'cff.c'; then $(CYGPATH_W) 'cff.c'; else $(CYGPATH_W) '$(srcdir)/cff.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cff.Tpo" "$(DEPDIR)/xdvipdfmx-cff.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cff.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cff.c' object='xdvipdfmx-cff.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cff.obj `if test -f 'cff.c'; then $(CYGPATH_W) 'cff.c'; else $(CYGPATH_W) '$(srcdir)/cff.c'; fi`
+
+xdvipdfmx-cff_dict.o: cff_dict.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cff_dict.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cff_dict.Tpo" -c -o xdvipdfmx-cff_dict.o `test -f 'cff_dict.c' || echo '$(srcdir)/'`cff_dict.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cff_dict.Tpo" "$(DEPDIR)/xdvipdfmx-cff_dict.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cff_dict.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cff_dict.c' object='xdvipdfmx-cff_dict.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cff_dict.o `test -f 'cff_dict.c' || echo '$(srcdir)/'`cff_dict.c
+
+xdvipdfmx-cff_dict.obj: cff_dict.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cff_dict.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cff_dict.Tpo" -c -o xdvipdfmx-cff_dict.obj `if test -f 'cff_dict.c'; then $(CYGPATH_W) 'cff_dict.c'; else $(CYGPATH_W) '$(srcdir)/cff_dict.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cff_dict.Tpo" "$(DEPDIR)/xdvipdfmx-cff_dict.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cff_dict.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cff_dict.c' object='xdvipdfmx-cff_dict.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cff_dict.obj `if test -f 'cff_dict.c'; then $(CYGPATH_W) 'cff_dict.c'; else $(CYGPATH_W) '$(srcdir)/cff_dict.c'; fi`
+
+xdvipdfmx-cid.o: cid.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cid.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cid.Tpo" -c -o xdvipdfmx-cid.o `test -f 'cid.c' || echo '$(srcdir)/'`cid.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cid.Tpo" "$(DEPDIR)/xdvipdfmx-cid.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cid.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cid.c' object='xdvipdfmx-cid.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cid.o `test -f 'cid.c' || echo '$(srcdir)/'`cid.c
+
+xdvipdfmx-cid.obj: cid.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cid.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cid.Tpo" -c -o xdvipdfmx-cid.obj `if test -f 'cid.c'; then $(CYGPATH_W) 'cid.c'; else $(CYGPATH_W) '$(srcdir)/cid.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cid.Tpo" "$(DEPDIR)/xdvipdfmx-cid.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cid.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cid.c' object='xdvipdfmx-cid.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cid.obj `if test -f 'cid.c'; then $(CYGPATH_W) 'cid.c'; else $(CYGPATH_W) '$(srcdir)/cid.c'; fi`
+
+xdvipdfmx-cidtype0.o: cidtype0.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cidtype0.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cidtype0.Tpo" -c -o xdvipdfmx-cidtype0.o `test -f 'cidtype0.c' || echo '$(srcdir)/'`cidtype0.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cidtype0.Tpo" "$(DEPDIR)/xdvipdfmx-cidtype0.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cidtype0.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cidtype0.c' object='xdvipdfmx-cidtype0.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cidtype0.o `test -f 'cidtype0.c' || echo '$(srcdir)/'`cidtype0.c
+
+xdvipdfmx-cidtype0.obj: cidtype0.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cidtype0.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cidtype0.Tpo" -c -o xdvipdfmx-cidtype0.obj `if test -f 'cidtype0.c'; then $(CYGPATH_W) 'cidtype0.c'; else $(CYGPATH_W) '$(srcdir)/cidtype0.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cidtype0.Tpo" "$(DEPDIR)/xdvipdfmx-cidtype0.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cidtype0.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cidtype0.c' object='xdvipdfmx-cidtype0.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cidtype0.obj `if test -f 'cidtype0.c'; then $(CYGPATH_W) 'cidtype0.c'; else $(CYGPATH_W) '$(srcdir)/cidtype0.c'; fi`
+
+xdvipdfmx-cidtype2.o: cidtype2.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cidtype2.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cidtype2.Tpo" -c -o xdvipdfmx-cidtype2.o `test -f 'cidtype2.c' || echo '$(srcdir)/'`cidtype2.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cidtype2.Tpo" "$(DEPDIR)/xdvipdfmx-cidtype2.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cidtype2.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cidtype2.c' object='xdvipdfmx-cidtype2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cidtype2.o `test -f 'cidtype2.c' || echo '$(srcdir)/'`cidtype2.c
+
+xdvipdfmx-cidtype2.obj: cidtype2.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cidtype2.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cidtype2.Tpo" -c -o xdvipdfmx-cidtype2.obj `if test -f 'cidtype2.c'; then $(CYGPATH_W) 'cidtype2.c'; else $(CYGPATH_W) '$(srcdir)/cidtype2.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cidtype2.Tpo" "$(DEPDIR)/xdvipdfmx-cidtype2.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cidtype2.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cidtype2.c' object='xdvipdfmx-cidtype2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cidtype2.obj `if test -f 'cidtype2.c'; then $(CYGPATH_W) 'cidtype2.c'; else $(CYGPATH_W) '$(srcdir)/cidtype2.c'; fi`
+
+xdvipdfmx-cmap.o: cmap.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cmap.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cmap.Tpo" -c -o xdvipdfmx-cmap.o `test -f 'cmap.c' || echo '$(srcdir)/'`cmap.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cmap.Tpo" "$(DEPDIR)/xdvipdfmx-cmap.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmap.c' object='xdvipdfmx-cmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cmap.o `test -f 'cmap.c' || echo '$(srcdir)/'`cmap.c
+
+xdvipdfmx-cmap.obj: cmap.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cmap.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cmap.Tpo" -c -o xdvipdfmx-cmap.obj `if test -f 'cmap.c'; then $(CYGPATH_W) 'cmap.c'; else $(CYGPATH_W) '$(srcdir)/cmap.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cmap.Tpo" "$(DEPDIR)/xdvipdfmx-cmap.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmap.c' object='xdvipdfmx-cmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cmap.obj `if test -f 'cmap.c'; then $(CYGPATH_W) 'cmap.c'; else $(CYGPATH_W) '$(srcdir)/cmap.c'; fi`
+
+xdvipdfmx-cmap_read.o: cmap_read.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cmap_read.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cmap_read.Tpo" -c -o xdvipdfmx-cmap_read.o `test -f 'cmap_read.c' || echo '$(srcdir)/'`cmap_read.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cmap_read.Tpo" "$(DEPDIR)/xdvipdfmx-cmap_read.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cmap_read.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmap_read.c' object='xdvipdfmx-cmap_read.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cmap_read.o `test -f 'cmap_read.c' || echo '$(srcdir)/'`cmap_read.c
+
+xdvipdfmx-cmap_read.obj: cmap_read.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cmap_read.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cmap_read.Tpo" -c -o xdvipdfmx-cmap_read.obj `if test -f 'cmap_read.c'; then $(CYGPATH_W) 'cmap_read.c'; else $(CYGPATH_W) '$(srcdir)/cmap_read.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cmap_read.Tpo" "$(DEPDIR)/xdvipdfmx-cmap_read.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cmap_read.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmap_read.c' object='xdvipdfmx-cmap_read.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cmap_read.obj `if test -f 'cmap_read.c'; then $(CYGPATH_W) 'cmap_read.c'; else $(CYGPATH_W) '$(srcdir)/cmap_read.c'; fi`
+
+xdvipdfmx-cmap_write.o: cmap_write.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cmap_write.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cmap_write.Tpo" -c -o xdvipdfmx-cmap_write.o `test -f 'cmap_write.c' || echo '$(srcdir)/'`cmap_write.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cmap_write.Tpo" "$(DEPDIR)/xdvipdfmx-cmap_write.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cmap_write.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmap_write.c' object='xdvipdfmx-cmap_write.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cmap_write.o `test -f 'cmap_write.c' || echo '$(srcdir)/'`cmap_write.c
+
+xdvipdfmx-cmap_write.obj: cmap_write.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cmap_write.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cmap_write.Tpo" -c -o xdvipdfmx-cmap_write.obj `if test -f 'cmap_write.c'; then $(CYGPATH_W) 'cmap_write.c'; else $(CYGPATH_W) '$(srcdir)/cmap_write.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cmap_write.Tpo" "$(DEPDIR)/xdvipdfmx-cmap_write.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cmap_write.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmap_write.c' object='xdvipdfmx-cmap_write.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cmap_write.obj `if test -f 'cmap_write.c'; then $(CYGPATH_W) 'cmap_write.c'; else $(CYGPATH_W) '$(srcdir)/cmap_write.c'; fi`
+
+xdvipdfmx-cs_type2.o: cs_type2.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cs_type2.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cs_type2.Tpo" -c -o xdvipdfmx-cs_type2.o `test -f 'cs_type2.c' || echo '$(srcdir)/'`cs_type2.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cs_type2.Tpo" "$(DEPDIR)/xdvipdfmx-cs_type2.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cs_type2.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cs_type2.c' object='xdvipdfmx-cs_type2.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cs_type2.o `test -f 'cs_type2.c' || echo '$(srcdir)/'`cs_type2.c
+
+xdvipdfmx-cs_type2.obj: cs_type2.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-cs_type2.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-cs_type2.Tpo" -c -o xdvipdfmx-cs_type2.obj `if test -f 'cs_type2.c'; then $(CYGPATH_W) 'cs_type2.c'; else $(CYGPATH_W) '$(srcdir)/cs_type2.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-cs_type2.Tpo" "$(DEPDIR)/xdvipdfmx-cs_type2.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-cs_type2.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cs_type2.c' object='xdvipdfmx-cs_type2.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-cs_type2.obj `if test -f 'cs_type2.c'; then $(CYGPATH_W) 'cs_type2.c'; else $(CYGPATH_W) '$(srcdir)/cs_type2.c'; fi`
+
+xdvipdfmx-dpxconf.o: dpxconf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxconf.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxconf.Tpo" -c -o xdvipdfmx-dpxconf.o `test -f 'dpxconf.c' || echo '$(srcdir)/'`dpxconf.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxconf.Tpo" "$(DEPDIR)/xdvipdfmx-dpxconf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxconf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxconf.c' object='xdvipdfmx-dpxconf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxconf.o `test -f 'dpxconf.c' || echo '$(srcdir)/'`dpxconf.c
+
+xdvipdfmx-dpxconf.obj: dpxconf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxconf.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxconf.Tpo" -c -o xdvipdfmx-dpxconf.obj `if test -f 'dpxconf.c'; then $(CYGPATH_W) 'dpxconf.c'; else $(CYGPATH_W) '$(srcdir)/dpxconf.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxconf.Tpo" "$(DEPDIR)/xdvipdfmx-dpxconf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxconf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxconf.c' object='xdvipdfmx-dpxconf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxconf.obj `if test -f 'dpxconf.c'; then $(CYGPATH_W) 'dpxconf.c'; else $(CYGPATH_W) '$(srcdir)/dpxconf.c'; fi`
+
+xdvipdfmx-dpxcrypt.o: dpxcrypt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxcrypt.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxcrypt.Tpo" -c -o xdvipdfmx-dpxcrypt.o `test -f 'dpxcrypt.c' || echo '$(srcdir)/'`dpxcrypt.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxcrypt.Tpo" "$(DEPDIR)/xdvipdfmx-dpxcrypt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxcrypt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxcrypt.c' object='xdvipdfmx-dpxcrypt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxcrypt.o `test -f 'dpxcrypt.c' || echo '$(srcdir)/'`dpxcrypt.c
+
+xdvipdfmx-dpxcrypt.obj: dpxcrypt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxcrypt.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxcrypt.Tpo" -c -o xdvipdfmx-dpxcrypt.obj `if test -f 'dpxcrypt.c'; then $(CYGPATH_W) 'dpxcrypt.c'; else $(CYGPATH_W) '$(srcdir)/dpxcrypt.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxcrypt.Tpo" "$(DEPDIR)/xdvipdfmx-dpxcrypt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxcrypt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxcrypt.c' object='xdvipdfmx-dpxcrypt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxcrypt.obj `if test -f 'dpxcrypt.c'; then $(CYGPATH_W) 'dpxcrypt.c'; else $(CYGPATH_W) '$(srcdir)/dpxcrypt.c'; fi`
+
+xdvipdfmx-dpxfile.o: dpxfile.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxfile.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxfile.Tpo" -c -o xdvipdfmx-dpxfile.o `test -f 'dpxfile.c' || echo '$(srcdir)/'`dpxfile.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxfile.Tpo" "$(DEPDIR)/xdvipdfmx-dpxfile.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxfile.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxfile.c' object='xdvipdfmx-dpxfile.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxfile.o `test -f 'dpxfile.c' || echo '$(srcdir)/'`dpxfile.c
+
+xdvipdfmx-dpxfile.obj: dpxfile.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxfile.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxfile.Tpo" -c -o xdvipdfmx-dpxfile.obj `if test -f 'dpxfile.c'; then $(CYGPATH_W) 'dpxfile.c'; else $(CYGPATH_W) '$(srcdir)/dpxfile.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxfile.Tpo" "$(DEPDIR)/xdvipdfmx-dpxfile.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxfile.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxfile.c' object='xdvipdfmx-dpxfile.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxfile.obj `if test -f 'dpxfile.c'; then $(CYGPATH_W) 'dpxfile.c'; else $(CYGPATH_W) '$(srcdir)/dpxfile.c'; fi`
+
+xdvipdfmx-dpxutil.o: dpxutil.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxutil.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxutil.Tpo" -c -o xdvipdfmx-dpxutil.o `test -f 'dpxutil.c' || echo '$(srcdir)/'`dpxutil.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxutil.Tpo" "$(DEPDIR)/xdvipdfmx-dpxutil.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxutil.c' object='xdvipdfmx-dpxutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxutil.o `test -f 'dpxutil.c' || echo '$(srcdir)/'`dpxutil.c
+
+xdvipdfmx-dpxutil.obj: dpxutil.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dpxutil.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dpxutil.Tpo" -c -o xdvipdfmx-dpxutil.obj `if test -f 'dpxutil.c'; then $(CYGPATH_W) 'dpxutil.c'; else $(CYGPATH_W) '$(srcdir)/dpxutil.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dpxutil.Tpo" "$(DEPDIR)/xdvipdfmx-dpxutil.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dpxutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dpxutil.c' object='xdvipdfmx-dpxutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dpxutil.obj `if test -f 'dpxutil.c'; then $(CYGPATH_W) 'dpxutil.c'; else $(CYGPATH_W) '$(srcdir)/dpxutil.c'; fi`
+
+xdvipdfmx-dvi.o: dvi.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dvi.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dvi.Tpo" -c -o xdvipdfmx-dvi.o `test -f 'dvi.c' || echo '$(srcdir)/'`dvi.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dvi.Tpo" "$(DEPDIR)/xdvipdfmx-dvi.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dvi.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dvi.c' object='xdvipdfmx-dvi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dvi.o `test -f 'dvi.c' || echo '$(srcdir)/'`dvi.c
+
+xdvipdfmx-dvi.obj: dvi.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dvi.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dvi.Tpo" -c -o xdvipdfmx-dvi.obj `if test -f 'dvi.c'; then $(CYGPATH_W) 'dvi.c'; else $(CYGPATH_W) '$(srcdir)/dvi.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dvi.Tpo" "$(DEPDIR)/xdvipdfmx-dvi.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dvi.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dvi.c' object='xdvipdfmx-dvi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dvi.obj `if test -f 'dvi.c'; then $(CYGPATH_W) 'dvi.c'; else $(CYGPATH_W) '$(srcdir)/dvi.c'; fi`
+
+xdvipdfmx-dvipdfmx.o: dvipdfmx.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dvipdfmx.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dvipdfmx.Tpo" -c -o xdvipdfmx-dvipdfmx.o `test -f 'dvipdfmx.c' || echo '$(srcdir)/'`dvipdfmx.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dvipdfmx.Tpo" "$(DEPDIR)/xdvipdfmx-dvipdfmx.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dvipdfmx.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dvipdfmx.c' object='xdvipdfmx-dvipdfmx.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dvipdfmx.o `test -f 'dvipdfmx.c' || echo '$(srcdir)/'`dvipdfmx.c
+
+xdvipdfmx-dvipdfmx.obj: dvipdfmx.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-dvipdfmx.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-dvipdfmx.Tpo" -c -o xdvipdfmx-dvipdfmx.obj `if test -f 'dvipdfmx.c'; then $(CYGPATH_W) 'dvipdfmx.c'; else $(CYGPATH_W) '$(srcdir)/dvipdfmx.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-dvipdfmx.Tpo" "$(DEPDIR)/xdvipdfmx-dvipdfmx.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-dvipdfmx.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dvipdfmx.c' object='xdvipdfmx-dvipdfmx.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-dvipdfmx.obj `if test -f 'dvipdfmx.c'; then $(CYGPATH_W) 'dvipdfmx.c'; else $(CYGPATH_W) '$(srcdir)/dvipdfmx.c'; fi`
+
+xdvipdfmx-epdf.o: epdf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-epdf.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-epdf.Tpo" -c -o xdvipdfmx-epdf.o `test -f 'epdf.c' || echo '$(srcdir)/'`epdf.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-epdf.Tpo" "$(DEPDIR)/xdvipdfmx-epdf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-epdf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='epdf.c' object='xdvipdfmx-epdf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-epdf.o `test -f 'epdf.c' || echo '$(srcdir)/'`epdf.c
+
+xdvipdfmx-epdf.obj: epdf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-epdf.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-epdf.Tpo" -c -o xdvipdfmx-epdf.obj `if test -f 'epdf.c'; then $(CYGPATH_W) 'epdf.c'; else $(CYGPATH_W) '$(srcdir)/epdf.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-epdf.Tpo" "$(DEPDIR)/xdvipdfmx-epdf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-epdf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='epdf.c' object='xdvipdfmx-epdf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-epdf.obj `if test -f 'epdf.c'; then $(CYGPATH_W) 'epdf.c'; else $(CYGPATH_W) '$(srcdir)/epdf.c'; fi`
+
+xdvipdfmx-error.o: error.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-error.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-error.Tpo" -c -o xdvipdfmx-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-error.Tpo" "$(DEPDIR)/xdvipdfmx-error.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-error.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='xdvipdfmx-error.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c
+
+xdvipdfmx-error.obj: error.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-error.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-error.Tpo" -c -o xdvipdfmx-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-error.Tpo" "$(DEPDIR)/xdvipdfmx-error.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-error.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='xdvipdfmx-error.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi`
+
+xdvipdfmx-fontmap.o: fontmap.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-fontmap.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-fontmap.Tpo" -c -o xdvipdfmx-fontmap.o `test -f 'fontmap.c' || echo '$(srcdir)/'`fontmap.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-fontmap.Tpo" "$(DEPDIR)/xdvipdfmx-fontmap.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-fontmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fontmap.c' object='xdvipdfmx-fontmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-fontmap.o `test -f 'fontmap.c' || echo '$(srcdir)/'`fontmap.c
+
+xdvipdfmx-fontmap.obj: fontmap.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-fontmap.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-fontmap.Tpo" -c -o xdvipdfmx-fontmap.obj `if test -f 'fontmap.c'; then $(CYGPATH_W) 'fontmap.c'; else $(CYGPATH_W) '$(srcdir)/fontmap.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-fontmap.Tpo" "$(DEPDIR)/xdvipdfmx-fontmap.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-fontmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fontmap.c' object='xdvipdfmx-fontmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-fontmap.obj `if test -f 'fontmap.c'; then $(CYGPATH_W) 'fontmap.c'; else $(CYGPATH_W) '$(srcdir)/fontmap.c'; fi`
+
+xdvipdfmx-jpegimage.o: jpegimage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-jpegimage.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-jpegimage.Tpo" -c -o xdvipdfmx-jpegimage.o `test -f 'jpegimage.c' || echo '$(srcdir)/'`jpegimage.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-jpegimage.Tpo" "$(DEPDIR)/xdvipdfmx-jpegimage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-jpegimage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='jpegimage.c' object='xdvipdfmx-jpegimage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-jpegimage.o `test -f 'jpegimage.c' || echo '$(srcdir)/'`jpegimage.c
+
+xdvipdfmx-jpegimage.obj: jpegimage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-jpegimage.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-jpegimage.Tpo" -c -o xdvipdfmx-jpegimage.obj `if test -f 'jpegimage.c'; then $(CYGPATH_W) 'jpegimage.c'; else $(CYGPATH_W) '$(srcdir)/jpegimage.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-jpegimage.Tpo" "$(DEPDIR)/xdvipdfmx-jpegimage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-jpegimage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='jpegimage.c' object='xdvipdfmx-jpegimage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-jpegimage.obj `if test -f 'jpegimage.c'; then $(CYGPATH_W) 'jpegimage.c'; else $(CYGPATH_W) '$(srcdir)/jpegimage.c'; fi`
+
+xdvipdfmx-mem.o: mem.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-mem.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-mem.Tpo" -c -o xdvipdfmx-mem.o `test -f 'mem.c' || echo '$(srcdir)/'`mem.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-mem.Tpo" "$(DEPDIR)/xdvipdfmx-mem.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-mem.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mem.c' object='xdvipdfmx-mem.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-mem.o `test -f 'mem.c' || echo '$(srcdir)/'`mem.c
+
+xdvipdfmx-mem.obj: mem.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-mem.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-mem.Tpo" -c -o xdvipdfmx-mem.obj `if test -f 'mem.c'; then $(CYGPATH_W) 'mem.c'; else $(CYGPATH_W) '$(srcdir)/mem.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-mem.Tpo" "$(DEPDIR)/xdvipdfmx-mem.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-mem.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mem.c' object='xdvipdfmx-mem.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-mem.obj `if test -f 'mem.c'; then $(CYGPATH_W) 'mem.c'; else $(CYGPATH_W) '$(srcdir)/mem.c'; fi`
+
+xdvipdfmx-mfileio.o: mfileio.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-mfileio.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-mfileio.Tpo" -c -o xdvipdfmx-mfileio.o `test -f 'mfileio.c' || echo '$(srcdir)/'`mfileio.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-mfileio.Tpo" "$(DEPDIR)/xdvipdfmx-mfileio.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-mfileio.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mfileio.c' object='xdvipdfmx-mfileio.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-mfileio.o `test -f 'mfileio.c' || echo '$(srcdir)/'`mfileio.c
+
+xdvipdfmx-mfileio.obj: mfileio.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-mfileio.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-mfileio.Tpo" -c -o xdvipdfmx-mfileio.obj `if test -f 'mfileio.c'; then $(CYGPATH_W) 'mfileio.c'; else $(CYGPATH_W) '$(srcdir)/mfileio.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-mfileio.Tpo" "$(DEPDIR)/xdvipdfmx-mfileio.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-mfileio.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mfileio.c' object='xdvipdfmx-mfileio.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-mfileio.obj `if test -f 'mfileio.c'; then $(CYGPATH_W) 'mfileio.c'; else $(CYGPATH_W) '$(srcdir)/mfileio.c'; fi`
+
+xdvipdfmx-mpost.o: mpost.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-mpost.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-mpost.Tpo" -c -o xdvipdfmx-mpost.o `test -f 'mpost.c' || echo '$(srcdir)/'`mpost.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-mpost.Tpo" "$(DEPDIR)/xdvipdfmx-mpost.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-mpost.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpost.c' object='xdvipdfmx-mpost.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-mpost.o `test -f 'mpost.c' || echo '$(srcdir)/'`mpost.c
+
+xdvipdfmx-mpost.obj: mpost.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-mpost.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-mpost.Tpo" -c -o xdvipdfmx-mpost.obj `if test -f 'mpost.c'; then $(CYGPATH_W) 'mpost.c'; else $(CYGPATH_W) '$(srcdir)/mpost.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-mpost.Tpo" "$(DEPDIR)/xdvipdfmx-mpost.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-mpost.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mpost.c' object='xdvipdfmx-mpost.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-mpost.obj `if test -f 'mpost.c'; then $(CYGPATH_W) 'mpost.c'; else $(CYGPATH_W) '$(srcdir)/mpost.c'; fi`
+
+xdvipdfmx-numbers.o: numbers.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-numbers.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-numbers.Tpo" -c -o xdvipdfmx-numbers.o `test -f 'numbers.c' || echo '$(srcdir)/'`numbers.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-numbers.Tpo" "$(DEPDIR)/xdvipdfmx-numbers.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-numbers.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='numbers.c' object='xdvipdfmx-numbers.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-numbers.o `test -f 'numbers.c' || echo '$(srcdir)/'`numbers.c
+
+xdvipdfmx-numbers.obj: numbers.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-numbers.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-numbers.Tpo" -c -o xdvipdfmx-numbers.obj `if test -f 'numbers.c'; then $(CYGPATH_W) 'numbers.c'; else $(CYGPATH_W) '$(srcdir)/numbers.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-numbers.Tpo" "$(DEPDIR)/xdvipdfmx-numbers.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-numbers.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='numbers.c' object='xdvipdfmx-numbers.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-numbers.obj `if test -f 'numbers.c'; then $(CYGPATH_W) 'numbers.c'; else $(CYGPATH_W) '$(srcdir)/numbers.c'; fi`
+
+xdvipdfmx-otl_conf.o: otl_conf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-otl_conf.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-otl_conf.Tpo" -c -o xdvipdfmx-otl_conf.o `test -f 'otl_conf.c' || echo '$(srcdir)/'`otl_conf.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-otl_conf.Tpo" "$(DEPDIR)/xdvipdfmx-otl_conf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-otl_conf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='otl_conf.c' object='xdvipdfmx-otl_conf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-otl_conf.o `test -f 'otl_conf.c' || echo '$(srcdir)/'`otl_conf.c
+
+xdvipdfmx-otl_conf.obj: otl_conf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-otl_conf.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-otl_conf.Tpo" -c -o xdvipdfmx-otl_conf.obj `if test -f 'otl_conf.c'; then $(CYGPATH_W) 'otl_conf.c'; else $(CYGPATH_W) '$(srcdir)/otl_conf.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-otl_conf.Tpo" "$(DEPDIR)/xdvipdfmx-otl_conf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-otl_conf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='otl_conf.c' object='xdvipdfmx-otl_conf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-otl_conf.obj `if test -f 'otl_conf.c'; then $(CYGPATH_W) 'otl_conf.c'; else $(CYGPATH_W) '$(srcdir)/otl_conf.c'; fi`
+
+xdvipdfmx-otl_opt.o: otl_opt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-otl_opt.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-otl_opt.Tpo" -c -o xdvipdfmx-otl_opt.o `test -f 'otl_opt.c' || echo '$(srcdir)/'`otl_opt.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-otl_opt.Tpo" "$(DEPDIR)/xdvipdfmx-otl_opt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-otl_opt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='otl_opt.c' object='xdvipdfmx-otl_opt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-otl_opt.o `test -f 'otl_opt.c' || echo '$(srcdir)/'`otl_opt.c
+
+xdvipdfmx-otl_opt.obj: otl_opt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-otl_opt.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-otl_opt.Tpo" -c -o xdvipdfmx-otl_opt.obj `if test -f 'otl_opt.c'; then $(CYGPATH_W) 'otl_opt.c'; else $(CYGPATH_W) '$(srcdir)/otl_opt.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-otl_opt.Tpo" "$(DEPDIR)/xdvipdfmx-otl_opt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-otl_opt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='otl_opt.c' object='xdvipdfmx-otl_opt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-otl_opt.obj `if test -f 'otl_opt.c'; then $(CYGPATH_W) 'otl_opt.c'; else $(CYGPATH_W) '$(srcdir)/otl_opt.c'; fi`
+
+xdvipdfmx-pdfcolor.o: pdfcolor.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfcolor.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfcolor.Tpo" -c -o xdvipdfmx-pdfcolor.o `test -f 'pdfcolor.c' || echo '$(srcdir)/'`pdfcolor.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfcolor.Tpo" "$(DEPDIR)/xdvipdfmx-pdfcolor.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfcolor.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfcolor.c' object='xdvipdfmx-pdfcolor.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfcolor.o `test -f 'pdfcolor.c' || echo '$(srcdir)/'`pdfcolor.c
+
+xdvipdfmx-pdfcolor.obj: pdfcolor.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfcolor.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfcolor.Tpo" -c -o xdvipdfmx-pdfcolor.obj `if test -f 'pdfcolor.c'; then $(CYGPATH_W) 'pdfcolor.c'; else $(CYGPATH_W) '$(srcdir)/pdfcolor.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfcolor.Tpo" "$(DEPDIR)/xdvipdfmx-pdfcolor.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfcolor.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfcolor.c' object='xdvipdfmx-pdfcolor.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfcolor.obj `if test -f 'pdfcolor.c'; then $(CYGPATH_W) 'pdfcolor.c'; else $(CYGPATH_W) '$(srcdir)/pdfcolor.c'; fi`
+
+xdvipdfmx-pdfdev.o: pdfdev.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfdev.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfdev.Tpo" -c -o xdvipdfmx-pdfdev.o `test -f 'pdfdev.c' || echo '$(srcdir)/'`pdfdev.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfdev.Tpo" "$(DEPDIR)/xdvipdfmx-pdfdev.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfdev.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfdev.c' object='xdvipdfmx-pdfdev.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfdev.o `test -f 'pdfdev.c' || echo '$(srcdir)/'`pdfdev.c
+
+xdvipdfmx-pdfdev.obj: pdfdev.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfdev.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfdev.Tpo" -c -o xdvipdfmx-pdfdev.obj `if test -f 'pdfdev.c'; then $(CYGPATH_W) 'pdfdev.c'; else $(CYGPATH_W) '$(srcdir)/pdfdev.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfdev.Tpo" "$(DEPDIR)/xdvipdfmx-pdfdev.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfdev.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfdev.c' object='xdvipdfmx-pdfdev.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfdev.obj `if test -f 'pdfdev.c'; then $(CYGPATH_W) 'pdfdev.c'; else $(CYGPATH_W) '$(srcdir)/pdfdev.c'; fi`
+
+xdvipdfmx-pdfdoc.o: pdfdoc.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfdoc.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfdoc.Tpo" -c -o xdvipdfmx-pdfdoc.o `test -f 'pdfdoc.c' || echo '$(srcdir)/'`pdfdoc.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfdoc.Tpo" "$(DEPDIR)/xdvipdfmx-pdfdoc.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfdoc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfdoc.c' object='xdvipdfmx-pdfdoc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfdoc.o `test -f 'pdfdoc.c' || echo '$(srcdir)/'`pdfdoc.c
+
+xdvipdfmx-pdfdoc.obj: pdfdoc.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfdoc.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfdoc.Tpo" -c -o xdvipdfmx-pdfdoc.obj `if test -f 'pdfdoc.c'; then $(CYGPATH_W) 'pdfdoc.c'; else $(CYGPATH_W) '$(srcdir)/pdfdoc.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfdoc.Tpo" "$(DEPDIR)/xdvipdfmx-pdfdoc.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfdoc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfdoc.c' object='xdvipdfmx-pdfdoc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfdoc.obj `if test -f 'pdfdoc.c'; then $(CYGPATH_W) 'pdfdoc.c'; else $(CYGPATH_W) '$(srcdir)/pdfdoc.c'; fi`
+
+xdvipdfmx-pdfdraw.o: pdfdraw.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfdraw.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfdraw.Tpo" -c -o xdvipdfmx-pdfdraw.o `test -f 'pdfdraw.c' || echo '$(srcdir)/'`pdfdraw.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfdraw.Tpo" "$(DEPDIR)/xdvipdfmx-pdfdraw.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfdraw.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfdraw.c' object='xdvipdfmx-pdfdraw.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfdraw.o `test -f 'pdfdraw.c' || echo '$(srcdir)/'`pdfdraw.c
+
+xdvipdfmx-pdfdraw.obj: pdfdraw.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfdraw.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfdraw.Tpo" -c -o xdvipdfmx-pdfdraw.obj `if test -f 'pdfdraw.c'; then $(CYGPATH_W) 'pdfdraw.c'; else $(CYGPATH_W) '$(srcdir)/pdfdraw.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfdraw.Tpo" "$(DEPDIR)/xdvipdfmx-pdfdraw.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfdraw.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfdraw.c' object='xdvipdfmx-pdfdraw.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfdraw.obj `if test -f 'pdfdraw.c'; then $(CYGPATH_W) 'pdfdraw.c'; else $(CYGPATH_W) '$(srcdir)/pdfdraw.c'; fi`
+
+xdvipdfmx-pdfencoding.o: pdfencoding.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfencoding.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfencoding.Tpo" -c -o xdvipdfmx-pdfencoding.o `test -f 'pdfencoding.c' || echo '$(srcdir)/'`pdfencoding.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfencoding.Tpo" "$(DEPDIR)/xdvipdfmx-pdfencoding.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfencoding.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfencoding.c' object='xdvipdfmx-pdfencoding.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfencoding.o `test -f 'pdfencoding.c' || echo '$(srcdir)/'`pdfencoding.c
+
+xdvipdfmx-pdfencoding.obj: pdfencoding.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfencoding.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfencoding.Tpo" -c -o xdvipdfmx-pdfencoding.obj `if test -f 'pdfencoding.c'; then $(CYGPATH_W) 'pdfencoding.c'; else $(CYGPATH_W) '$(srcdir)/pdfencoding.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfencoding.Tpo" "$(DEPDIR)/xdvipdfmx-pdfencoding.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfencoding.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfencoding.c' object='xdvipdfmx-pdfencoding.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfencoding.obj `if test -f 'pdfencoding.c'; then $(CYGPATH_W) 'pdfencoding.c'; else $(CYGPATH_W) '$(srcdir)/pdfencoding.c'; fi`
+
+xdvipdfmx-pdfencrypt.o: pdfencrypt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfencrypt.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfencrypt.Tpo" -c -o xdvipdfmx-pdfencrypt.o `test -f 'pdfencrypt.c' || echo '$(srcdir)/'`pdfencrypt.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfencrypt.Tpo" "$(DEPDIR)/xdvipdfmx-pdfencrypt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfencrypt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfencrypt.c' object='xdvipdfmx-pdfencrypt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfencrypt.o `test -f 'pdfencrypt.c' || echo '$(srcdir)/'`pdfencrypt.c
+
+xdvipdfmx-pdfencrypt.obj: pdfencrypt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfencrypt.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfencrypt.Tpo" -c -o xdvipdfmx-pdfencrypt.obj `if test -f 'pdfencrypt.c'; then $(CYGPATH_W) 'pdfencrypt.c'; else $(CYGPATH_W) '$(srcdir)/pdfencrypt.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfencrypt.Tpo" "$(DEPDIR)/xdvipdfmx-pdfencrypt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfencrypt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfencrypt.c' object='xdvipdfmx-pdfencrypt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfencrypt.obj `if test -f 'pdfencrypt.c'; then $(CYGPATH_W) 'pdfencrypt.c'; else $(CYGPATH_W) '$(srcdir)/pdfencrypt.c'; fi`
+
+xdvipdfmx-pdffont.o: pdffont.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdffont.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdffont.Tpo" -c -o xdvipdfmx-pdffont.o `test -f 'pdffont.c' || echo '$(srcdir)/'`pdffont.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdffont.Tpo" "$(DEPDIR)/xdvipdfmx-pdffont.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdffont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdffont.c' object='xdvipdfmx-pdffont.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdffont.o `test -f 'pdffont.c' || echo '$(srcdir)/'`pdffont.c
+
+xdvipdfmx-pdffont.obj: pdffont.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdffont.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdffont.Tpo" -c -o xdvipdfmx-pdffont.obj `if test -f 'pdffont.c'; then $(CYGPATH_W) 'pdffont.c'; else $(CYGPATH_W) '$(srcdir)/pdffont.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdffont.Tpo" "$(DEPDIR)/xdvipdfmx-pdffont.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdffont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdffont.c' object='xdvipdfmx-pdffont.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdffont.obj `if test -f 'pdffont.c'; then $(CYGPATH_W) 'pdffont.c'; else $(CYGPATH_W) '$(srcdir)/pdffont.c'; fi`
+
+xdvipdfmx-pdfnames.o: pdfnames.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfnames.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfnames.Tpo" -c -o xdvipdfmx-pdfnames.o `test -f 'pdfnames.c' || echo '$(srcdir)/'`pdfnames.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfnames.Tpo" "$(DEPDIR)/xdvipdfmx-pdfnames.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfnames.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfnames.c' object='xdvipdfmx-pdfnames.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfnames.o `test -f 'pdfnames.c' || echo '$(srcdir)/'`pdfnames.c
+
+xdvipdfmx-pdfnames.obj: pdfnames.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfnames.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfnames.Tpo" -c -o xdvipdfmx-pdfnames.obj `if test -f 'pdfnames.c'; then $(CYGPATH_W) 'pdfnames.c'; else $(CYGPATH_W) '$(srcdir)/pdfnames.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfnames.Tpo" "$(DEPDIR)/xdvipdfmx-pdfnames.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfnames.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfnames.c' object='xdvipdfmx-pdfnames.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfnames.obj `if test -f 'pdfnames.c'; then $(CYGPATH_W) 'pdfnames.c'; else $(CYGPATH_W) '$(srcdir)/pdfnames.c'; fi`
+
+xdvipdfmx-pdfobj.o: pdfobj.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfobj.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfobj.Tpo" -c -o xdvipdfmx-pdfobj.o `test -f 'pdfobj.c' || echo '$(srcdir)/'`pdfobj.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfobj.Tpo" "$(DEPDIR)/xdvipdfmx-pdfobj.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfobj.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfobj.c' object='xdvipdfmx-pdfobj.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfobj.o `test -f 'pdfobj.c' || echo '$(srcdir)/'`pdfobj.c
+
+xdvipdfmx-pdfobj.obj: pdfobj.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfobj.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfobj.Tpo" -c -o xdvipdfmx-pdfobj.obj `if test -f 'pdfobj.c'; then $(CYGPATH_W) 'pdfobj.c'; else $(CYGPATH_W) '$(srcdir)/pdfobj.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfobj.Tpo" "$(DEPDIR)/xdvipdfmx-pdfobj.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfobj.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfobj.c' object='xdvipdfmx-pdfobj.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfobj.obj `if test -f 'pdfobj.c'; then $(CYGPATH_W) 'pdfobj.c'; else $(CYGPATH_W) '$(srcdir)/pdfobj.c'; fi`
+
+xdvipdfmx-pdfparse.o: pdfparse.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfparse.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfparse.Tpo" -c -o xdvipdfmx-pdfparse.o `test -f 'pdfparse.c' || echo '$(srcdir)/'`pdfparse.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfparse.Tpo" "$(DEPDIR)/xdvipdfmx-pdfparse.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfparse.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfparse.c' object='xdvipdfmx-pdfparse.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfparse.o `test -f 'pdfparse.c' || echo '$(srcdir)/'`pdfparse.c
+
+xdvipdfmx-pdfparse.obj: pdfparse.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfparse.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfparse.Tpo" -c -o xdvipdfmx-pdfparse.obj `if test -f 'pdfparse.c'; then $(CYGPATH_W) 'pdfparse.c'; else $(CYGPATH_W) '$(srcdir)/pdfparse.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfparse.Tpo" "$(DEPDIR)/xdvipdfmx-pdfparse.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfparse.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfparse.c' object='xdvipdfmx-pdfparse.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfparse.obj `if test -f 'pdfparse.c'; then $(CYGPATH_W) 'pdfparse.c'; else $(CYGPATH_W) '$(srcdir)/pdfparse.c'; fi`
+
+xdvipdfmx-pdfresource.o: pdfresource.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfresource.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfresource.Tpo" -c -o xdvipdfmx-pdfresource.o `test -f 'pdfresource.c' || echo '$(srcdir)/'`pdfresource.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfresource.Tpo" "$(DEPDIR)/xdvipdfmx-pdfresource.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfresource.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfresource.c' object='xdvipdfmx-pdfresource.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfresource.o `test -f 'pdfresource.c' || echo '$(srcdir)/'`pdfresource.c
+
+xdvipdfmx-pdfresource.obj: pdfresource.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfresource.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfresource.Tpo" -c -o xdvipdfmx-pdfresource.obj `if test -f 'pdfresource.c'; then $(CYGPATH_W) 'pdfresource.c'; else $(CYGPATH_W) '$(srcdir)/pdfresource.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfresource.Tpo" "$(DEPDIR)/xdvipdfmx-pdfresource.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfresource.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfresource.c' object='xdvipdfmx-pdfresource.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfresource.obj `if test -f 'pdfresource.c'; then $(CYGPATH_W) 'pdfresource.c'; else $(CYGPATH_W) '$(srcdir)/pdfresource.c'; fi`
+
+xdvipdfmx-pdfximage.o: pdfximage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfximage.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfximage.Tpo" -c -o xdvipdfmx-pdfximage.o `test -f 'pdfximage.c' || echo '$(srcdir)/'`pdfximage.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfximage.Tpo" "$(DEPDIR)/xdvipdfmx-pdfximage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfximage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfximage.c' object='xdvipdfmx-pdfximage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfximage.o `test -f 'pdfximage.c' || echo '$(srcdir)/'`pdfximage.c
+
+xdvipdfmx-pdfximage.obj: pdfximage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pdfximage.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pdfximage.Tpo" -c -o xdvipdfmx-pdfximage.obj `if test -f 'pdfximage.c'; then $(CYGPATH_W) 'pdfximage.c'; else $(CYGPATH_W) '$(srcdir)/pdfximage.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pdfximage.Tpo" "$(DEPDIR)/xdvipdfmx-pdfximage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pdfximage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pdfximage.c' object='xdvipdfmx-pdfximage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pdfximage.obj `if test -f 'pdfximage.c'; then $(CYGPATH_W) 'pdfximage.c'; else $(CYGPATH_W) '$(srcdir)/pdfximage.c'; fi`
+
+xdvipdfmx-pkfont.o: pkfont.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pkfont.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pkfont.Tpo" -c -o xdvipdfmx-pkfont.o `test -f 'pkfont.c' || echo '$(srcdir)/'`pkfont.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pkfont.Tpo" "$(DEPDIR)/xdvipdfmx-pkfont.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pkfont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pkfont.c' object='xdvipdfmx-pkfont.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pkfont.o `test -f 'pkfont.c' || echo '$(srcdir)/'`pkfont.c
+
+xdvipdfmx-pkfont.obj: pkfont.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pkfont.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pkfont.Tpo" -c -o xdvipdfmx-pkfont.obj `if test -f 'pkfont.c'; then $(CYGPATH_W) 'pkfont.c'; else $(CYGPATH_W) '$(srcdir)/pkfont.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pkfont.Tpo" "$(DEPDIR)/xdvipdfmx-pkfont.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pkfont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pkfont.c' object='xdvipdfmx-pkfont.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pkfont.obj `if test -f 'pkfont.c'; then $(CYGPATH_W) 'pkfont.c'; else $(CYGPATH_W) '$(srcdir)/pkfont.c'; fi`
+
+xdvipdfmx-pngimage.o: pngimage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pngimage.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pngimage.Tpo" -c -o xdvipdfmx-pngimage.o `test -f 'pngimage.c' || echo '$(srcdir)/'`pngimage.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pngimage.Tpo" "$(DEPDIR)/xdvipdfmx-pngimage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pngimage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pngimage.c' object='xdvipdfmx-pngimage.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pngimage.o `test -f 'pngimage.c' || echo '$(srcdir)/'`pngimage.c
+
+xdvipdfmx-pngimage.obj: pngimage.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pngimage.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pngimage.Tpo" -c -o xdvipdfmx-pngimage.obj `if test -f 'pngimage.c'; then $(CYGPATH_W) 'pngimage.c'; else $(CYGPATH_W) '$(srcdir)/pngimage.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pngimage.Tpo" "$(DEPDIR)/xdvipdfmx-pngimage.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pngimage.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pngimage.c' object='xdvipdfmx-pngimage.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pngimage.obj `if test -f 'pngimage.c'; then $(CYGPATH_W) 'pngimage.c'; else $(CYGPATH_W) '$(srcdir)/pngimage.c'; fi`
+
+xdvipdfmx-pst.o: pst.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pst.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pst.Tpo" -c -o xdvipdfmx-pst.o `test -f 'pst.c' || echo '$(srcdir)/'`pst.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pst.Tpo" "$(DEPDIR)/xdvipdfmx-pst.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pst.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pst.c' object='xdvipdfmx-pst.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pst.o `test -f 'pst.c' || echo '$(srcdir)/'`pst.c
+
+xdvipdfmx-pst.obj: pst.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pst.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pst.Tpo" -c -o xdvipdfmx-pst.obj `if test -f 'pst.c'; then $(CYGPATH_W) 'pst.c'; else $(CYGPATH_W) '$(srcdir)/pst.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pst.Tpo" "$(DEPDIR)/xdvipdfmx-pst.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pst.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pst.c' object='xdvipdfmx-pst.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pst.obj `if test -f 'pst.c'; then $(CYGPATH_W) 'pst.c'; else $(CYGPATH_W) '$(srcdir)/pst.c'; fi`
+
+xdvipdfmx-pst_obj.o: pst_obj.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pst_obj.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pst_obj.Tpo" -c -o xdvipdfmx-pst_obj.o `test -f 'pst_obj.c' || echo '$(srcdir)/'`pst_obj.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pst_obj.Tpo" "$(DEPDIR)/xdvipdfmx-pst_obj.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pst_obj.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pst_obj.c' object='xdvipdfmx-pst_obj.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pst_obj.o `test -f 'pst_obj.c' || echo '$(srcdir)/'`pst_obj.c
+
+xdvipdfmx-pst_obj.obj: pst_obj.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-pst_obj.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-pst_obj.Tpo" -c -o xdvipdfmx-pst_obj.obj `if test -f 'pst_obj.c'; then $(CYGPATH_W) 'pst_obj.c'; else $(CYGPATH_W) '$(srcdir)/pst_obj.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-pst_obj.Tpo" "$(DEPDIR)/xdvipdfmx-pst_obj.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-pst_obj.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pst_obj.c' object='xdvipdfmx-pst_obj.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-pst_obj.obj `if test -f 'pst_obj.c'; then $(CYGPATH_W) 'pst_obj.c'; else $(CYGPATH_W) '$(srcdir)/pst_obj.c'; fi`
+
+xdvipdfmx-sfnt.o: sfnt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-sfnt.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-sfnt.Tpo" -c -o xdvipdfmx-sfnt.o `test -f 'sfnt.c' || echo '$(srcdir)/'`sfnt.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-sfnt.Tpo" "$(DEPDIR)/xdvipdfmx-sfnt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-sfnt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sfnt.c' object='xdvipdfmx-sfnt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-sfnt.o `test -f 'sfnt.c' || echo '$(srcdir)/'`sfnt.c
+
+xdvipdfmx-sfnt.obj: sfnt.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-sfnt.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-sfnt.Tpo" -c -o xdvipdfmx-sfnt.obj `if test -f 'sfnt.c'; then $(CYGPATH_W) 'sfnt.c'; else $(CYGPATH_W) '$(srcdir)/sfnt.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-sfnt.Tpo" "$(DEPDIR)/xdvipdfmx-sfnt.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-sfnt.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sfnt.c' object='xdvipdfmx-sfnt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-sfnt.obj `if test -f 'sfnt.c'; then $(CYGPATH_W) 'sfnt.c'; else $(CYGPATH_W) '$(srcdir)/sfnt.c'; fi`
+
+xdvipdfmx-spc_color.o: spc_color.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_color.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_color.Tpo" -c -o xdvipdfmx-spc_color.o `test -f 'spc_color.c' || echo '$(srcdir)/'`spc_color.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_color.Tpo" "$(DEPDIR)/xdvipdfmx-spc_color.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_color.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_color.c' object='xdvipdfmx-spc_color.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_color.o `test -f 'spc_color.c' || echo '$(srcdir)/'`spc_color.c
+
+xdvipdfmx-spc_color.obj: spc_color.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_color.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_color.Tpo" -c -o xdvipdfmx-spc_color.obj `if test -f 'spc_color.c'; then $(CYGPATH_W) 'spc_color.c'; else $(CYGPATH_W) '$(srcdir)/spc_color.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_color.Tpo" "$(DEPDIR)/xdvipdfmx-spc_color.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_color.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_color.c' object='xdvipdfmx-spc_color.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_color.obj `if test -f 'spc_color.c'; then $(CYGPATH_W) 'spc_color.c'; else $(CYGPATH_W) '$(srcdir)/spc_color.c'; fi`
+
+xdvipdfmx-spc_dvips.o: spc_dvips.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_dvips.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_dvips.Tpo" -c -o xdvipdfmx-spc_dvips.o `test -f 'spc_dvips.c' || echo '$(srcdir)/'`spc_dvips.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_dvips.Tpo" "$(DEPDIR)/xdvipdfmx-spc_dvips.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_dvips.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_dvips.c' object='xdvipdfmx-spc_dvips.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_dvips.o `test -f 'spc_dvips.c' || echo '$(srcdir)/'`spc_dvips.c
+
+xdvipdfmx-spc_dvips.obj: spc_dvips.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_dvips.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_dvips.Tpo" -c -o xdvipdfmx-spc_dvips.obj `if test -f 'spc_dvips.c'; then $(CYGPATH_W) 'spc_dvips.c'; else $(CYGPATH_W) '$(srcdir)/spc_dvips.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_dvips.Tpo" "$(DEPDIR)/xdvipdfmx-spc_dvips.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_dvips.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_dvips.c' object='xdvipdfmx-spc_dvips.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_dvips.obj `if test -f 'spc_dvips.c'; then $(CYGPATH_W) 'spc_dvips.c'; else $(CYGPATH_W) '$(srcdir)/spc_dvips.c'; fi`
+
+xdvipdfmx-spc_html.o: spc_html.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_html.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_html.Tpo" -c -o xdvipdfmx-spc_html.o `test -f 'spc_html.c' || echo '$(srcdir)/'`spc_html.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_html.Tpo" "$(DEPDIR)/xdvipdfmx-spc_html.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_html.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_html.c' object='xdvipdfmx-spc_html.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_html.o `test -f 'spc_html.c' || echo '$(srcdir)/'`spc_html.c
+
+xdvipdfmx-spc_html.obj: spc_html.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_html.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_html.Tpo" -c -o xdvipdfmx-spc_html.obj `if test -f 'spc_html.c'; then $(CYGPATH_W) 'spc_html.c'; else $(CYGPATH_W) '$(srcdir)/spc_html.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_html.Tpo" "$(DEPDIR)/xdvipdfmx-spc_html.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_html.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_html.c' object='xdvipdfmx-spc_html.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_html.obj `if test -f 'spc_html.c'; then $(CYGPATH_W) 'spc_html.c'; else $(CYGPATH_W) '$(srcdir)/spc_html.c'; fi`
+
+xdvipdfmx-spc_misc.o: spc_misc.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_misc.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_misc.Tpo" -c -o xdvipdfmx-spc_misc.o `test -f 'spc_misc.c' || echo '$(srcdir)/'`spc_misc.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_misc.Tpo" "$(DEPDIR)/xdvipdfmx-spc_misc.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_misc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_misc.c' object='xdvipdfmx-spc_misc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_misc.o `test -f 'spc_misc.c' || echo '$(srcdir)/'`spc_misc.c
+
+xdvipdfmx-spc_misc.obj: spc_misc.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_misc.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_misc.Tpo" -c -o xdvipdfmx-spc_misc.obj `if test -f 'spc_misc.c'; then $(CYGPATH_W) 'spc_misc.c'; else $(CYGPATH_W) '$(srcdir)/spc_misc.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_misc.Tpo" "$(DEPDIR)/xdvipdfmx-spc_misc.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_misc.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_misc.c' object='xdvipdfmx-spc_misc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_misc.obj `if test -f 'spc_misc.c'; then $(CYGPATH_W) 'spc_misc.c'; else $(CYGPATH_W) '$(srcdir)/spc_misc.c'; fi`
+
+xdvipdfmx-spc_pdfm.o: spc_pdfm.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_pdfm.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_pdfm.Tpo" -c -o xdvipdfmx-spc_pdfm.o `test -f 'spc_pdfm.c' || echo '$(srcdir)/'`spc_pdfm.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_pdfm.Tpo" "$(DEPDIR)/xdvipdfmx-spc_pdfm.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_pdfm.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_pdfm.c' object='xdvipdfmx-spc_pdfm.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_pdfm.o `test -f 'spc_pdfm.c' || echo '$(srcdir)/'`spc_pdfm.c
+
+xdvipdfmx-spc_pdfm.obj: spc_pdfm.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_pdfm.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_pdfm.Tpo" -c -o xdvipdfmx-spc_pdfm.obj `if test -f 'spc_pdfm.c'; then $(CYGPATH_W) 'spc_pdfm.c'; else $(CYGPATH_W) '$(srcdir)/spc_pdfm.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_pdfm.Tpo" "$(DEPDIR)/xdvipdfmx-spc_pdfm.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_pdfm.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_pdfm.c' object='xdvipdfmx-spc_pdfm.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_pdfm.obj `if test -f 'spc_pdfm.c'; then $(CYGPATH_W) 'spc_pdfm.c'; else $(CYGPATH_W) '$(srcdir)/spc_pdfm.c'; fi`
+
+xdvipdfmx-spc_tpic.o: spc_tpic.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_tpic.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_tpic.Tpo" -c -o xdvipdfmx-spc_tpic.o `test -f 'spc_tpic.c' || echo '$(srcdir)/'`spc_tpic.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_tpic.Tpo" "$(DEPDIR)/xdvipdfmx-spc_tpic.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_tpic.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_tpic.c' object='xdvipdfmx-spc_tpic.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_tpic.o `test -f 'spc_tpic.c' || echo '$(srcdir)/'`spc_tpic.c
+
+xdvipdfmx-spc_tpic.obj: spc_tpic.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_tpic.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_tpic.Tpo" -c -o xdvipdfmx-spc_tpic.obj `if test -f 'spc_tpic.c'; then $(CYGPATH_W) 'spc_tpic.c'; else $(CYGPATH_W) '$(srcdir)/spc_tpic.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_tpic.Tpo" "$(DEPDIR)/xdvipdfmx-spc_tpic.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_tpic.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_tpic.c' object='xdvipdfmx-spc_tpic.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_tpic.obj `if test -f 'spc_tpic.c'; then $(CYGPATH_W) 'spc_tpic.c'; else $(CYGPATH_W) '$(srcdir)/spc_tpic.c'; fi`
+
+xdvipdfmx-spc_util.o: spc_util.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_util.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_util.Tpo" -c -o xdvipdfmx-spc_util.o `test -f 'spc_util.c' || echo '$(srcdir)/'`spc_util.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_util.Tpo" "$(DEPDIR)/xdvipdfmx-spc_util.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_util.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_util.c' object='xdvipdfmx-spc_util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_util.o `test -f 'spc_util.c' || echo '$(srcdir)/'`spc_util.c
+
+xdvipdfmx-spc_util.obj: spc_util.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_util.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_util.Tpo" -c -o xdvipdfmx-spc_util.obj `if test -f 'spc_util.c'; then $(CYGPATH_W) 'spc_util.c'; else $(CYGPATH_W) '$(srcdir)/spc_util.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_util.Tpo" "$(DEPDIR)/xdvipdfmx-spc_util.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_util.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_util.c' object='xdvipdfmx-spc_util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_util.obj `if test -f 'spc_util.c'; then $(CYGPATH_W) 'spc_util.c'; else $(CYGPATH_W) '$(srcdir)/spc_util.c'; fi`
+
+xdvipdfmx-spc_xtx.o: spc_xtx.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_xtx.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_xtx.Tpo" -c -o xdvipdfmx-spc_xtx.o `test -f 'spc_xtx.c' || echo '$(srcdir)/'`spc_xtx.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_xtx.Tpo" "$(DEPDIR)/xdvipdfmx-spc_xtx.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_xtx.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_xtx.c' object='xdvipdfmx-spc_xtx.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_xtx.o `test -f 'spc_xtx.c' || echo '$(srcdir)/'`spc_xtx.c
+
+xdvipdfmx-spc_xtx.obj: spc_xtx.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-spc_xtx.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-spc_xtx.Tpo" -c -o xdvipdfmx-spc_xtx.obj `if test -f 'spc_xtx.c'; then $(CYGPATH_W) 'spc_xtx.c'; else $(CYGPATH_W) '$(srcdir)/spc_xtx.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-spc_xtx.Tpo" "$(DEPDIR)/xdvipdfmx-spc_xtx.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-spc_xtx.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='spc_xtx.c' object='xdvipdfmx-spc_xtx.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-spc_xtx.obj `if test -f 'spc_xtx.c'; then $(CYGPATH_W) 'spc_xtx.c'; else $(CYGPATH_W) '$(srcdir)/spc_xtx.c'; fi`
+
+xdvipdfmx-specials.o: specials.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-specials.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-specials.Tpo" -c -o xdvipdfmx-specials.o `test -f 'specials.c' || echo '$(srcdir)/'`specials.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-specials.Tpo" "$(DEPDIR)/xdvipdfmx-specials.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-specials.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='specials.c' object='xdvipdfmx-specials.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-specials.o `test -f 'specials.c' || echo '$(srcdir)/'`specials.c
+
+xdvipdfmx-specials.obj: specials.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-specials.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-specials.Tpo" -c -o xdvipdfmx-specials.obj `if test -f 'specials.c'; then $(CYGPATH_W) 'specials.c'; else $(CYGPATH_W) '$(srcdir)/specials.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-specials.Tpo" "$(DEPDIR)/xdvipdfmx-specials.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-specials.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='specials.c' object='xdvipdfmx-specials.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-specials.obj `if test -f 'specials.c'; then $(CYGPATH_W) 'specials.c'; else $(CYGPATH_W) '$(srcdir)/specials.c'; fi`
+
+xdvipdfmx-subfont.o: subfont.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-subfont.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-subfont.Tpo" -c -o xdvipdfmx-subfont.o `test -f 'subfont.c' || echo '$(srcdir)/'`subfont.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-subfont.Tpo" "$(DEPDIR)/xdvipdfmx-subfont.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-subfont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subfont.c' object='xdvipdfmx-subfont.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-subfont.o `test -f 'subfont.c' || echo '$(srcdir)/'`subfont.c
+
+xdvipdfmx-subfont.obj: subfont.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-subfont.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-subfont.Tpo" -c -o xdvipdfmx-subfont.obj `if test -f 'subfont.c'; then $(CYGPATH_W) 'subfont.c'; else $(CYGPATH_W) '$(srcdir)/subfont.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-subfont.Tpo" "$(DEPDIR)/xdvipdfmx-subfont.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-subfont.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='subfont.c' object='xdvipdfmx-subfont.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-subfont.obj `if test -f 'subfont.c'; then $(CYGPATH_W) 'subfont.c'; else $(CYGPATH_W) '$(srcdir)/subfont.c'; fi`
+
+xdvipdfmx-tfm.o: tfm.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tfm.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tfm.Tpo" -c -o xdvipdfmx-tfm.o `test -f 'tfm.c' || echo '$(srcdir)/'`tfm.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tfm.Tpo" "$(DEPDIR)/xdvipdfmx-tfm.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tfm.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tfm.c' object='xdvipdfmx-tfm.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tfm.o `test -f 'tfm.c' || echo '$(srcdir)/'`tfm.c
+
+xdvipdfmx-tfm.obj: tfm.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tfm.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tfm.Tpo" -c -o xdvipdfmx-tfm.obj `if test -f 'tfm.c'; then $(CYGPATH_W) 'tfm.c'; else $(CYGPATH_W) '$(srcdir)/tfm.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tfm.Tpo" "$(DEPDIR)/xdvipdfmx-tfm.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tfm.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tfm.c' object='xdvipdfmx-tfm.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tfm.obj `if test -f 'tfm.c'; then $(CYGPATH_W) 'tfm.c'; else $(CYGPATH_W) '$(srcdir)/tfm.c'; fi`
+
+xdvipdfmx-tt_aux.o: tt_aux.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_aux.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_aux.Tpo" -c -o xdvipdfmx-tt_aux.o `test -f 'tt_aux.c' || echo '$(srcdir)/'`tt_aux.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_aux.Tpo" "$(DEPDIR)/xdvipdfmx-tt_aux.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_aux.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_aux.c' object='xdvipdfmx-tt_aux.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_aux.o `test -f 'tt_aux.c' || echo '$(srcdir)/'`tt_aux.c
+
+xdvipdfmx-tt_aux.obj: tt_aux.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_aux.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_aux.Tpo" -c -o xdvipdfmx-tt_aux.obj `if test -f 'tt_aux.c'; then $(CYGPATH_W) 'tt_aux.c'; else $(CYGPATH_W) '$(srcdir)/tt_aux.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_aux.Tpo" "$(DEPDIR)/xdvipdfmx-tt_aux.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_aux.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_aux.c' object='xdvipdfmx-tt_aux.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_aux.obj `if test -f 'tt_aux.c'; then $(CYGPATH_W) 'tt_aux.c'; else $(CYGPATH_W) '$(srcdir)/tt_aux.c'; fi`
+
+xdvipdfmx-tt_cmap.o: tt_cmap.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_cmap.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_cmap.Tpo" -c -o xdvipdfmx-tt_cmap.o `test -f 'tt_cmap.c' || echo '$(srcdir)/'`tt_cmap.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_cmap.Tpo" "$(DEPDIR)/xdvipdfmx-tt_cmap.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_cmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_cmap.c' object='xdvipdfmx-tt_cmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_cmap.o `test -f 'tt_cmap.c' || echo '$(srcdir)/'`tt_cmap.c
+
+xdvipdfmx-tt_cmap.obj: tt_cmap.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_cmap.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_cmap.Tpo" -c -o xdvipdfmx-tt_cmap.obj `if test -f 'tt_cmap.c'; then $(CYGPATH_W) 'tt_cmap.c'; else $(CYGPATH_W) '$(srcdir)/tt_cmap.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_cmap.Tpo" "$(DEPDIR)/xdvipdfmx-tt_cmap.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_cmap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_cmap.c' object='xdvipdfmx-tt_cmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_cmap.obj `if test -f 'tt_cmap.c'; then $(CYGPATH_W) 'tt_cmap.c'; else $(CYGPATH_W) '$(srcdir)/tt_cmap.c'; fi`
+
+xdvipdfmx-tt_glyf.o: tt_glyf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_glyf.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_glyf.Tpo" -c -o xdvipdfmx-tt_glyf.o `test -f 'tt_glyf.c' || echo '$(srcdir)/'`tt_glyf.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_glyf.Tpo" "$(DEPDIR)/xdvipdfmx-tt_glyf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_glyf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_glyf.c' object='xdvipdfmx-tt_glyf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_glyf.o `test -f 'tt_glyf.c' || echo '$(srcdir)/'`tt_glyf.c
+
+xdvipdfmx-tt_glyf.obj: tt_glyf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_glyf.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_glyf.Tpo" -c -o xdvipdfmx-tt_glyf.obj `if test -f 'tt_glyf.c'; then $(CYGPATH_W) 'tt_glyf.c'; else $(CYGPATH_W) '$(srcdir)/tt_glyf.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_glyf.Tpo" "$(DEPDIR)/xdvipdfmx-tt_glyf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_glyf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_glyf.c' object='xdvipdfmx-tt_glyf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_glyf.obj `if test -f 'tt_glyf.c'; then $(CYGPATH_W) 'tt_glyf.c'; else $(CYGPATH_W) '$(srcdir)/tt_glyf.c'; fi`
+
+xdvipdfmx-tt_gsub.o: tt_gsub.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_gsub.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_gsub.Tpo" -c -o xdvipdfmx-tt_gsub.o `test -f 'tt_gsub.c' || echo '$(srcdir)/'`tt_gsub.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_gsub.Tpo" "$(DEPDIR)/xdvipdfmx-tt_gsub.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_gsub.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_gsub.c' object='xdvipdfmx-tt_gsub.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_gsub.o `test -f 'tt_gsub.c' || echo '$(srcdir)/'`tt_gsub.c
+
+xdvipdfmx-tt_gsub.obj: tt_gsub.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_gsub.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_gsub.Tpo" -c -o xdvipdfmx-tt_gsub.obj `if test -f 'tt_gsub.c'; then $(CYGPATH_W) 'tt_gsub.c'; else $(CYGPATH_W) '$(srcdir)/tt_gsub.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_gsub.Tpo" "$(DEPDIR)/xdvipdfmx-tt_gsub.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_gsub.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_gsub.c' object='xdvipdfmx-tt_gsub.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_gsub.obj `if test -f 'tt_gsub.c'; then $(CYGPATH_W) 'tt_gsub.c'; else $(CYGPATH_W) '$(srcdir)/tt_gsub.c'; fi`
+
+xdvipdfmx-tt_post.o: tt_post.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_post.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_post.Tpo" -c -o xdvipdfmx-tt_post.o `test -f 'tt_post.c' || echo '$(srcdir)/'`tt_post.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_post.Tpo" "$(DEPDIR)/xdvipdfmx-tt_post.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_post.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_post.c' object='xdvipdfmx-tt_post.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_post.o `test -f 'tt_post.c' || echo '$(srcdir)/'`tt_post.c
+
+xdvipdfmx-tt_post.obj: tt_post.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_post.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_post.Tpo" -c -o xdvipdfmx-tt_post.obj `if test -f 'tt_post.c'; then $(CYGPATH_W) 'tt_post.c'; else $(CYGPATH_W) '$(srcdir)/tt_post.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_post.Tpo" "$(DEPDIR)/xdvipdfmx-tt_post.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_post.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_post.c' object='xdvipdfmx-tt_post.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_post.obj `if test -f 'tt_post.c'; then $(CYGPATH_W) 'tt_post.c'; else $(CYGPATH_W) '$(srcdir)/tt_post.c'; fi`
+
+xdvipdfmx-tt_table.o: tt_table.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_table.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_table.Tpo" -c -o xdvipdfmx-tt_table.o `test -f 'tt_table.c' || echo '$(srcdir)/'`tt_table.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_table.Tpo" "$(DEPDIR)/xdvipdfmx-tt_table.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_table.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_table.c' object='xdvipdfmx-tt_table.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_table.o `test -f 'tt_table.c' || echo '$(srcdir)/'`tt_table.c
+
+xdvipdfmx-tt_table.obj: tt_table.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-tt_table.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-tt_table.Tpo" -c -o xdvipdfmx-tt_table.obj `if test -f 'tt_table.c'; then $(CYGPATH_W) 'tt_table.c'; else $(CYGPATH_W) '$(srcdir)/tt_table.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-tt_table.Tpo" "$(DEPDIR)/xdvipdfmx-tt_table.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-tt_table.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tt_table.c' object='xdvipdfmx-tt_table.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-tt_table.obj `if test -f 'tt_table.c'; then $(CYGPATH_W) 'tt_table.c'; else $(CYGPATH_W) '$(srcdir)/tt_table.c'; fi`
+
+xdvipdfmx-truetype.o: truetype.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-truetype.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-truetype.Tpo" -c -o xdvipdfmx-truetype.o `test -f 'truetype.c' || echo '$(srcdir)/'`truetype.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-truetype.Tpo" "$(DEPDIR)/xdvipdfmx-truetype.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-truetype.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='truetype.c' object='xdvipdfmx-truetype.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-truetype.o `test -f 'truetype.c' || echo '$(srcdir)/'`truetype.c
+
+xdvipdfmx-truetype.obj: truetype.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-truetype.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-truetype.Tpo" -c -o xdvipdfmx-truetype.obj `if test -f 'truetype.c'; then $(CYGPATH_W) 'truetype.c'; else $(CYGPATH_W) '$(srcdir)/truetype.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-truetype.Tpo" "$(DEPDIR)/xdvipdfmx-truetype.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-truetype.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='truetype.c' object='xdvipdfmx-truetype.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-truetype.obj `if test -f 'truetype.c'; then $(CYGPATH_W) 'truetype.c'; else $(CYGPATH_W) '$(srcdir)/truetype.c'; fi`
+
+xdvipdfmx-type0.o: type0.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-type0.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-type0.Tpo" -c -o xdvipdfmx-type0.o `test -f 'type0.c' || echo '$(srcdir)/'`type0.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-type0.Tpo" "$(DEPDIR)/xdvipdfmx-type0.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-type0.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='type0.c' object='xdvipdfmx-type0.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-type0.o `test -f 'type0.c' || echo '$(srcdir)/'`type0.c
+
+xdvipdfmx-type0.obj: type0.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-type0.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-type0.Tpo" -c -o xdvipdfmx-type0.obj `if test -f 'type0.c'; then $(CYGPATH_W) 'type0.c'; else $(CYGPATH_W) '$(srcdir)/type0.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-type0.Tpo" "$(DEPDIR)/xdvipdfmx-type0.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-type0.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='type0.c' object='xdvipdfmx-type0.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-type0.obj `if test -f 'type0.c'; then $(CYGPATH_W) 'type0.c'; else $(CYGPATH_W) '$(srcdir)/type0.c'; fi`
+
+xdvipdfmx-t1_char.o: t1_char.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-t1_char.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-t1_char.Tpo" -c -o xdvipdfmx-t1_char.o `test -f 't1_char.c' || echo '$(srcdir)/'`t1_char.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-t1_char.Tpo" "$(DEPDIR)/xdvipdfmx-t1_char.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-t1_char.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='t1_char.c' object='xdvipdfmx-t1_char.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-t1_char.o `test -f 't1_char.c' || echo '$(srcdir)/'`t1_char.c
+
+xdvipdfmx-t1_char.obj: t1_char.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-t1_char.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-t1_char.Tpo" -c -o xdvipdfmx-t1_char.obj `if test -f 't1_char.c'; then $(CYGPATH_W) 't1_char.c'; else $(CYGPATH_W) '$(srcdir)/t1_char.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-t1_char.Tpo" "$(DEPDIR)/xdvipdfmx-t1_char.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-t1_char.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='t1_char.c' object='xdvipdfmx-t1_char.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-t1_char.obj `if test -f 't1_char.c'; then $(CYGPATH_W) 't1_char.c'; else $(CYGPATH_W) '$(srcdir)/t1_char.c'; fi`
+
+xdvipdfmx-t1_load.o: t1_load.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-t1_load.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-t1_load.Tpo" -c -o xdvipdfmx-t1_load.o `test -f 't1_load.c' || echo '$(srcdir)/'`t1_load.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-t1_load.Tpo" "$(DEPDIR)/xdvipdfmx-t1_load.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-t1_load.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='t1_load.c' object='xdvipdfmx-t1_load.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-t1_load.o `test -f 't1_load.c' || echo '$(srcdir)/'`t1_load.c
+
+xdvipdfmx-t1_load.obj: t1_load.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-t1_load.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-t1_load.Tpo" -c -o xdvipdfmx-t1_load.obj `if test -f 't1_load.c'; then $(CYGPATH_W) 't1_load.c'; else $(CYGPATH_W) '$(srcdir)/t1_load.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-t1_load.Tpo" "$(DEPDIR)/xdvipdfmx-t1_load.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-t1_load.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='t1_load.c' object='xdvipdfmx-t1_load.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-t1_load.obj `if test -f 't1_load.c'; then $(CYGPATH_W) 't1_load.c'; else $(CYGPATH_W) '$(srcdir)/t1_load.c'; fi`
+
+xdvipdfmx-type1.o: type1.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-type1.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-type1.Tpo" -c -o xdvipdfmx-type1.o `test -f 'type1.c' || echo '$(srcdir)/'`type1.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-type1.Tpo" "$(DEPDIR)/xdvipdfmx-type1.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-type1.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='type1.c' object='xdvipdfmx-type1.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-type1.o `test -f 'type1.c' || echo '$(srcdir)/'`type1.c
+
+xdvipdfmx-type1.obj: type1.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-type1.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-type1.Tpo" -c -o xdvipdfmx-type1.obj `if test -f 'type1.c'; then $(CYGPATH_W) 'type1.c'; else $(CYGPATH_W) '$(srcdir)/type1.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-type1.Tpo" "$(DEPDIR)/xdvipdfmx-type1.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-type1.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='type1.c' object='xdvipdfmx-type1.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-type1.obj `if test -f 'type1.c'; then $(CYGPATH_W) 'type1.c'; else $(CYGPATH_W) '$(srcdir)/type1.c'; fi`
+
+xdvipdfmx-type1c.o: type1c.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-type1c.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-type1c.Tpo" -c -o xdvipdfmx-type1c.o `test -f 'type1c.c' || echo '$(srcdir)/'`type1c.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-type1c.Tpo" "$(DEPDIR)/xdvipdfmx-type1c.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-type1c.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='type1c.c' object='xdvipdfmx-type1c.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-type1c.o `test -f 'type1c.c' || echo '$(srcdir)/'`type1c.c
+
+xdvipdfmx-type1c.obj: type1c.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-type1c.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-type1c.Tpo" -c -o xdvipdfmx-type1c.obj `if test -f 'type1c.c'; then $(CYGPATH_W) 'type1c.c'; else $(CYGPATH_W) '$(srcdir)/type1c.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-type1c.Tpo" "$(DEPDIR)/xdvipdfmx-type1c.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-type1c.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='type1c.c' object='xdvipdfmx-type1c.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-type1c.obj `if test -f 'type1c.c'; then $(CYGPATH_W) 'type1c.c'; else $(CYGPATH_W) '$(srcdir)/type1c.c'; fi`
+
+xdvipdfmx-unicode.o: unicode.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-unicode.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-unicode.Tpo" -c -o xdvipdfmx-unicode.o `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-unicode.Tpo" "$(DEPDIR)/xdvipdfmx-unicode.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-unicode.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='unicode.c' object='xdvipdfmx-unicode.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-unicode.o `test -f 'unicode.c' || echo '$(srcdir)/'`unicode.c
+
+xdvipdfmx-unicode.obj: unicode.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-unicode.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-unicode.Tpo" -c -o xdvipdfmx-unicode.obj `if test -f 'unicode.c'; then $(CYGPATH_W) 'unicode.c'; else $(CYGPATH_W) '$(srcdir)/unicode.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-unicode.Tpo" "$(DEPDIR)/xdvipdfmx-unicode.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-unicode.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='unicode.c' object='xdvipdfmx-unicode.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-unicode.obj `if test -f 'unicode.c'; then $(CYGPATH_W) 'unicode.c'; else $(CYGPATH_W) '$(srcdir)/unicode.c'; fi`
+
+xdvipdfmx-vf.o: vf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-vf.o -MD -MP -MF "$(DEPDIR)/xdvipdfmx-vf.Tpo" -c -o xdvipdfmx-vf.o `test -f 'vf.c' || echo '$(srcdir)/'`vf.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-vf.Tpo" "$(DEPDIR)/xdvipdfmx-vf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-vf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vf.c' object='xdvipdfmx-vf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-vf.o `test -f 'vf.c' || echo '$(srcdir)/'`vf.c
+
+xdvipdfmx-vf.obj: vf.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xdvipdfmx-vf.obj -MD -MP -MF "$(DEPDIR)/xdvipdfmx-vf.Tpo" -c -o xdvipdfmx-vf.obj `if test -f 'vf.c'; then $(CYGPATH_W) 'vf.c'; else $(CYGPATH_W) '$(srcdir)/vf.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xdvipdfmx-vf.Tpo" "$(DEPDIR)/xdvipdfmx-vf.Po"; else rm -f "$(DEPDIR)/xdvipdfmx-vf.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vf.c' object='xdvipdfmx-vf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(xdvipdfmx_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xdvipdfmx-vf.obj `if test -f 'vf.c'; then $(CYGPATH_W) 'vf.c'; else $(CYGPATH_W) '$(srcdir)/vf.c'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/xdvipdfmx/src/agl.c b/Build/source/texk/xdvipdfmx/src/agl.c
new file mode 100644
index 00000000000..e7987a5fc3e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/agl.c
@@ -0,0 +1,848 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/agl.c,v 1.32 2005/07/20 10:41:54 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * References:
+ *
+ * Unicode and Glyph Names, ver. 2.3., Adobe Solution Network
+ * http://partners.adobe.com/asn/tech/type/unicodegn.jsp
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <ctype.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "mfileio.h"
+#include "pdfparse.h"
+
+/* Hash */
+#include "dpxutil.h"
+
+#include "dpxfile.h"
+
+#include "unicode.h"
+
+#include "agl.h"
+
+static int verbose = 0;
+
+void
+agl_set_verbose (void)
+{
+ verbose++;
+}
+
+static agl_name *
+agl_new_name (void)
+{
+ agl_name *agln;
+
+ agln = NEW(1, agl_name);
+ agln->name = NULL;
+ agln->suffix = NULL;
+ agln->n_components = 0;
+ agln->alternate = NULL;
+
+ return agln;
+}
+
+static void
+agl_release_name (agl_name *agln)
+{
+ agl_name *next;
+
+ while (agln) {
+ next = agln->alternate;
+ if (agln->name)
+ RELEASE(agln->name);
+ if (agln->suffix)
+ RELEASE(agln->suffix);
+ agln->name = NULL;
+ RELEASE(agln);
+ agln = next;
+ }
+}
+
+char *
+agl_chop_suffix (const char *glyphname, char **suffix)
+{
+ char *name, *p;
+ int len;
+
+ ASSERT(glyphname && suffix);
+
+ p = strchr(glyphname, '.');
+ if (p) {
+ len = strlen(glyphname) - strlen(p);
+ if (len < 1) {
+ name = NULL;
+ *suffix = NEW(strlen(glyphname), char);
+ strcpy(*suffix, glyphname+1);
+ } else {
+ p++;
+ name = NEW(len + 1, char);
+ strncpy(name, glyphname, len);
+ name[len] = '\0';
+ if (p[0] == '\0') {
+ *suffix = NULL;
+ } else {
+ *suffix = NEW(strlen(p) + 1, char);
+ strcpy(*suffix, p);
+ }
+ }
+ } else {
+ name = NEW(strlen(glyphname) + 1, char);
+ strcpy(name, glyphname);
+ *suffix = NULL;
+ }
+
+ return name;
+}
+
+static const char * const modifiers[] = {
+ "acute", "breve", "caron", "cedilla", "circumflex",
+ "dieresis", "dotaccent", "grave", "hungarumlaut",
+ "macron", "ogonek", "ring", "tilde", "commaaccent",
+ "slash",
+
+ /* The following entries are not accent nor something
+ * but PS font may have those "small" version...
+ */
+ "ampersand", "exclam", "exclamdown",
+ "question","questiondown",
+ NULL
+};
+
+static int
+skip_capital (char **p, char *endptr)
+{
+ long slen = 0, len;
+
+ len = (long) (endptr - (*p));
+
+ if (len >= 2 &&
+ ((**p == 'A' && *(*p+1) == 'E') ||
+ (**p == 'O' && *(*p+1) == 'E'))) {
+ *p += 2;
+ slen = 2;
+ } else if (len >= 3 &&
+ **p == 'E' &&
+ *(*p+1) == 't' &&
+ *(*p+2) == 'h') {
+ *p += 3;
+ slen = 3;
+ } else if (len >= 5 &&
+ **p == 'T' &&
+ *(*p+1) == 'h' &&
+ *(*p+2) == 'o' &&
+ *(*p+3) == 'r' &&
+ *(*p+4) == 'n') {
+ *p += 5;
+ slen = 5;
+ } else if (len >= 1 &&
+ **p >= 'A' && **p <= 'Z') {
+ *p += 1;
+ slen = 1;
+ }
+
+ return slen;
+}
+
+static int
+skip_modifier (char **p, char *endptr)
+{
+ long slen = 0, len;
+ int i;
+
+ len = (long) (endptr - (*p));
+
+ for (i = 0; modifiers[i] != NULL; i++) {
+ if ((len >= strlen(modifiers[i]) &&
+ !memcmp(*p, modifiers[i], len))) {
+ slen = strlen(modifiers[i]);
+ *p += slen;
+ break;
+ }
+ }
+
+ return slen;
+}
+
+static int
+is_smallcap (const char *glyphname)
+{
+ long len, slen;
+ char *p, *endptr;
+
+ if (!glyphname)
+ return 0;
+
+ p = (char *) glyphname;
+ len = strlen(glyphname);
+ if (len < 6 ||
+ strcmp(p + len - 5, "small"))
+ return 0;
+
+ endptr = p + len - 5;
+
+ len -= 5;
+ slen = skip_modifier(&p, endptr);
+ if (slen == len)
+ return 1; /* Acutesmall, Gravesmall, etc */
+ else if (slen > 0) { /* ??? */
+ return 0;
+ }
+
+ len -= skip_capital(&p, endptr);
+ if (len == 0) {
+ return 1; /* Asmall, AEsmall, etc */
+ }
+
+ while (len > 0) { /* allow multiple accent */
+ slen = skip_modifier(&p, endptr);
+ if (slen == 0)
+ return 0;
+ len -= slen;
+ }
+
+ return 1;
+}
+
+#define SUFFIX_LIST_MAX 16
+#define AGL_VAR_SMCP_IDX 0
+static struct {
+ const char *key;
+ const char *otl_tag;
+ const char *suffixes[SUFFIX_LIST_MAX];
+} var_list[] = {
+ {"small" , "smcp", {"sc", NULL}},
+ {"swash" , "swsh", {NULL}},
+ {"superior" , "sups", {NULL}},
+ {"inferior" , "sinf", {NULL}},
+ {"numerator" , "numr", {NULL}},
+ {"denominator" , "dnom", {NULL}},
+ {"oldstyle" , "onum", {NULL}},
+
+ /* The following only used by TeX, there are no
+ * corresponding OTL feat. tag.
+ */
+ {"display" , NULL, {NULL}},
+ {"text" , NULL, {NULL}},
+ {"big" , NULL, {NULL}},
+ {"bigg" , NULL, {NULL}},
+ {"Big" , NULL, {NULL}},
+ {"Bigg" , NULL, {NULL}},
+ {NULL, NULL, {NULL}}
+};
+
+const char *
+agl_suffix_to_otltag (const char *suffix)
+{
+ int i, j;
+
+ for (i = 0; var_list[i].key; i++) {
+ for (j = 0; var_list[i].suffixes[j]; j++) {
+ if (!strcmp(suffix, var_list[i].suffixes[j]))
+ return var_list[i].otl_tag;
+ }
+ if (!strcmp(suffix, var_list[i].key))
+ return var_list[i].otl_tag;
+ if (var_list[i].otl_tag &&
+ !strcmp(suffix, var_list[i].otl_tag))
+ return var_list[i].otl_tag;
+ }
+
+ return NULL;
+}
+
+static int
+agl_guess_name (const char *glyphname)
+{
+ int i, len;
+
+ if (is_smallcap(glyphname))
+ return AGL_VAR_SMCP_IDX;
+
+ len = strlen(glyphname);
+ for (i = 1; var_list[i].key != NULL; i++) {
+ if (len > strlen(var_list[i].key) &&
+ !strcmp(glyphname+len-strlen(var_list[i].key), var_list[i].key)
+ ) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static agl_name *
+agl_normalized_name (char *glyphname)
+{
+ agl_name *agln;
+ char *suffix;
+ int i, n;
+
+ if (!glyphname)
+ return NULL;
+
+ agln = agl_new_name();
+ suffix = strchr(glyphname, '.');
+ if (suffix) {
+ n = strlen(glyphname) - strlen(suffix);
+ if (suffix[1] != '\0') {
+ agln->suffix = NEW(strlen(suffix), char);
+ strcpy(agln->suffix, suffix+1);
+ }
+ agln->name = NEW(n+1, char);
+ memcpy(agln->name, glyphname, n);
+ agln->name[n] = '\0';
+ } else if (is_smallcap(glyphname)) {
+ n = strlen(glyphname) - 5;
+ agln->suffix = NEW(3, char);
+ strcpy(agln->suffix, "sc");
+ agln->name = NEW(n+1, char);
+ for (i = 0; i < n; i++) {
+ agln->name[i] = isupper(glyphname[i]) ?
+ (glyphname[i] + 32) : glyphname[i];
+ }
+ agln->name[n] = '\0';
+ } else {
+ int var_idx;
+
+#define SET_STRING(p,s) do {\
+ (p) = NEW(strlen((s))+1, char);\
+ strcpy((p),(s));\
+} while (0)
+ var_idx = agl_guess_name(glyphname);
+ if (var_idx < 0 ||
+ !var_list[var_idx].key) {
+ n = strlen(glyphname);
+ } else {
+ n = strlen(glyphname) - strlen(var_list[var_idx].key);
+ if (var_list[var_idx].suffixes[0])
+ SET_STRING(agln->suffix, var_list[var_idx].suffixes[0]);
+ else {
+ SET_STRING(agln->suffix, var_list[var_idx].key);
+ }
+ }
+ agln->name = NEW(n+1, char);
+ memcpy(agln->name, glyphname, n);
+ agln->name[n] = '\0';
+ }
+
+ return agln;
+}
+
+static struct ht_table aglmap;
+
+static void
+agl_load_standard_names()
+{
+ char** pline = &agl_standard_names[0];
+ while (**pline != 0) {
+ agl_load_line(*pline, *pline + strlen(*pline));
+ ++pline;
+ }
+}
+
+void
+agl_init_map (void)
+{
+ ht_init_table(&aglmap);
+ agl_load_listfile(AGL_EXTRA_LISTFILE, 0);
+#if 0 /* JK: use built-in list of standard names rather than requiring separate file */
+ if (agl_load_listfile(AGL_DEFAULT_LISTFILE, 0) < 0) {
+ WARN("Failed to load AGL file \"%s\"...", AGL_DEFAULT_LISTFILE);
+ }
+#else
+ agl_load_standard_names();
+#endif
+}
+
+static void CDECL
+hval_free (void *hval)
+{
+ agl_release_name((struct agl_name *) hval);
+}
+
+void
+agl_close_map (void)
+{
+ ht_clear_table(&aglmap, hval_free);
+}
+
+int
+agl_load_line(char* p, char* endptr)
+{
+ char *wbuf = p;
+ agl_name *agln, *duplicate;
+ char *nextptr, *name;
+ int n_unicodes, i;
+ long unicodes[AGL_MAX_UNICODES];
+
+ nextptr = strchr(p, ';');
+ if (!nextptr || nextptr == p)
+ return 0;
+
+ name = parse_ident(&p, nextptr);
+
+ skip_white(&p, endptr);
+ if (!name || p[0] != ';') {
+ WARN("Invalid AGL entry: %s", wbuf);
+ if (name)
+ RELEASE(name);
+ return 0;
+ }
+
+ p++;
+ skip_white(&p, endptr);
+
+ n_unicodes = 0;
+ while (p < endptr &&
+ ((p[0] >= '0' && p[0] <= '9') ||
+ (p[0] >= 'A' && p[0] <= 'F'))
+ ) {
+
+ if (n_unicodes >= AGL_MAX_UNICODES) {
+ WARN("Too many Unicode values");
+ break;
+ }
+ unicodes[n_unicodes++] = strtol(p, &nextptr, 16);
+
+ p = nextptr;
+ skip_white(&p, endptr);
+ }
+
+ if (n_unicodes == 0) {
+ WARN("AGL entry ignored (no mapping): %s", wbuf);
+ RELEASE(name);
+ return 0;
+ }
+
+ agln = agl_normalized_name(name);
+ agln->n_components = n_unicodes;
+ for (i = 0; i < n_unicodes; i++) {
+ agln->unicodes[i] = unicodes[i];
+ }
+
+ duplicate = ht_lookup_table(&aglmap, name, strlen(name));
+ if (!duplicate)
+ ht_append_table(&aglmap, name, strlen(name), agln);
+ else {
+ while (duplicate->alternate)
+ duplicate = duplicate->alternate;
+ duplicate->alternate = agln;
+ }
+
+ if (verbose > 3) {
+ if (agln->suffix)
+ MESG("agl: %s [%s.%s] -->", name, agln->name, agln->suffix);
+ else
+ MESG("agl: %s [%s] -->", name, agln->name);
+ for (i = 0; i < agln->n_components; i++) {
+ if (agln->unicodes[i] > 0xffff) {
+ MESG(" U+%06X", agln->unicodes[i]);
+ } else {
+ MESG(" U+%04X", agln->unicodes[i]);
+ }
+ }
+ MESG("\n");
+ }
+
+ RELEASE(name);
+ return 1;
+}
+
+
+#define WBUF_SIZE 1024
+
+int
+agl_load_listfile (const char *filename, int format) /* format unused. */
+{
+ int count = 0;
+ char *p, *endptr;
+ char wbuf[WBUF_SIZE];
+ FILE *fp;
+
+ if (!filename)
+ return -1;
+
+ fp = DPXFOPEN(filename, DPX_RES_TYPE_AGL);
+ if (!fp) {
+ return -1;
+ }
+
+ if (verbose)
+ MESG("<AGL:%s", filename);
+
+ while ((p = mfgets(wbuf, WBUF_SIZE, fp)) != NULL) {
+ endptr = p + strlen(p);
+ skip_white(&p, endptr);
+
+ /* Need table version check. */
+ if (!p || p[0] == '#' || p >= endptr)
+ continue;
+
+ count += agl_load_line(p, endptr);
+ }
+ DPXFCLOSE(fp);
+
+ if (verbose)
+ MESG(">");
+
+ return count;
+}
+
+agl_name *
+agl_lookup_list (const char *glyphname)
+{
+ agl_name *agln;
+
+ if (!glyphname)
+ return NULL;
+
+ agln = ht_lookup_table(&aglmap, glyphname, strlen(glyphname));
+
+ return agln;
+}
+
+int
+agl_name_is_unicode (const char *glyphname)
+{
+ char c, *suffix;
+ int i, len;
+
+ if (!glyphname)
+ return 0;
+
+ suffix = strchr(glyphname, '.');
+ len = (int) (suffix ? suffix - glyphname : strlen(glyphname));
+ /*
+ * uni02ac is invalid glyph name and mapped to th empty string.
+ */
+ if (len >= 7 && (len - 3) % 4 == 0 &&
+ !strncmp(glyphname, "uni", 3)) {
+ c = glyphname[3];
+ /*
+ * Check if the 4th character is uppercase hexadecimal digit.
+ * "union" should not be treated as Unicode glyph name.
+ */
+ if (isdigit(c) || (c >= 'A' && c <= 'F'))
+ return 1;
+ else
+ return 0;
+ } else if (len <= 7 && len >= 5 &&
+ glyphname[0] == 'u') {
+ for (i = 1; i < len - 1; i++) {
+ c = glyphname[i];
+ if (!isdigit(c) && (c < 'A' || c > 'F'))
+ return 0;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+long
+agl_name_convert_unicode (const char *glyphname)
+{
+ long ucv = -1;
+ char *p, *e;
+
+ if (!agl_name_is_unicode(glyphname))
+ return -1;
+
+ if (strlen(glyphname) > 7 && *(glyphname+7) != '.') {
+ WARN("Mapping to multiple Unicode characters not supported.");
+ /* JK: don't return directly from here;
+ use the first of the Unicode characters, rather than nothing
+ return -1;
+ */
+ }
+
+ if (glyphname[1] == 'n') {
+ p = (char *) (glyphname + 3);
+ e = p + 4;
+ }
+ else {
+ p = (char *) (glyphname + 1);
+ e = p + 6;
+ }
+ ucv = 0;
+ while (*p != '\0' && *p != '.' && p < e) {
+ if (!isdigit(*p) && (*p < 'A' || *p > 'F')) {
+ WARN("Invalid char %c in Unicode glyph name %s.", *p, glyphname);
+ return -1;
+ }
+ ucv <<= 4;
+ ucv += isdigit(*p) ? *p - '0' : *p - 'A' + 10;
+ p++;
+ }
+
+ if (!UC_is_valid(ucv)) {
+ if (ucv < 0x10000) {
+ WARN("Invalid Unicode code value U+%04X.", ucv);
+ } else {
+ WARN("Invalid Unicode code value U+%06X.", ucv);
+ }
+ ucv = -1;
+ }
+
+ return ucv;
+}
+
+
+
+static long
+xtol (const char *start, int len)
+{
+ long v = 0;
+
+ while (len-- > 0) {
+ v <<= 4;
+ if (isdigit(*start)) {
+ v += *start - '0';
+ } else if (*start >= 'A' && *start <= 'F') {
+ v += *start - 'A' + 10;
+ } else {
+ return -1;
+ }
+ start++;
+ }
+
+ return v;
+}
+
+#define IS_PUA(u) (((u) >= 0x00E000L && (u) <= 0x00F8FFL) || \
+ ((u) >= 0x0F0000L && (u) <= 0x0FFFFDL) || \
+ ((u) >= 0x100000L && (u) <= 0x10FFFDL) \
+)
+
+static long
+put_unicode_glyph (const char *name,
+ unsigned char **dstpp, unsigned char *limptr)
+{
+ char *p;
+ long len = 0, ucv;
+
+ p = (char *) name;
+ ucv = 0;
+
+ if (p[1] != 'n') {
+ p += 1;
+ ucv = xtol(p, strlen(p));
+ len += UC_sput_UTF16BE (ucv, dstpp, limptr);
+ } else {
+ p += 3;
+ while (*p != '\0') {
+ ucv = xtol(p, 4);
+ len += UC_sput_UTF16BE (ucv, dstpp, limptr);
+ p += 4;
+ }
+ }
+
+ return len;
+}
+
+long
+agl_sput_UTF16BE (const char *glyphstr,
+ unsigned char **dstpp, unsigned char *limptr,
+ int *fail_count)
+{
+ long len = 0;
+ int count = 0;
+ char *p, *endptr;
+
+ ASSERT(glyphstr && dstpp);
+
+ p = (char *) glyphstr;
+ endptr = strchr(p, '.');
+ if (!endptr)
+ endptr = p + strlen(p);
+
+ while (p < endptr) {
+ char *name, *delim;
+ long sub_len;
+ int i;
+ agl_name *agln0, *agln1 = NULL;
+
+ delim = strchr(p, '_');
+ if (delim == p) {
+ /*
+ * Glyph names starting with a underscore or two subsequent
+ * underscore in glyph name not allowed?
+ */
+ WARN("Invalid glyph name component in \"%s\".", glyphstr);
+ count++;
+ if (fail_count)
+ *fail_count = count;
+ return len; /* Cannot continue */
+ } else if (!delim || delim > endptr) {
+ delim = endptr;
+ }
+ sub_len = (long) (delim - p);
+
+ name = NEW(sub_len+1, char);
+ memcpy(name, p, sub_len);
+ name[sub_len] = '\0';
+
+ if (agl_name_is_unicode(name)) {
+ sub_len = put_unicode_glyph(name, dstpp, limptr);
+ if (sub_len > 0)
+ len += sub_len;
+ else {
+ count++;
+ }
+ } else {
+ agln1 = agl_lookup_list(name);
+ if (!agln1 || (agln1->n_components == 1 &&
+ IS_PUA(agln1->unicodes[0]))) {
+ agln0 = agl_normalized_name(name);
+ if (agln0) {
+ if (verbose > 1 && agln0->suffix) {
+ WARN("agl: fix %s --> %s.%s",
+ name, agln0->name, agln0->suffix);
+ }
+ agln1 = agl_lookup_list(agln0->name);
+ agl_release_name(agln0);
+ }
+ }
+ if (agln1) {
+ for (i = 0; i < agln1->n_components; i++) {
+ len += UC_sput_UTF16BE (agln1->unicodes[i], dstpp, limptr);
+ }
+ } else {
+ if (verbose) {
+ WARN("No Unicode mapping for glyph name \"%s\" found.", name);
+ }
+ count++;
+ }
+ }
+ RELEASE(name);
+ p = delim + 1;
+ }
+
+ if (fail_count)
+ *fail_count = count;
+ return len;
+}
+
+int
+agl_get_unicodes (const char *glyphstr,
+ long *unicodes, int max_unicodes)
+{
+ int count = 0;
+ char *p, *endptr;
+
+ p = (char *) glyphstr;
+ endptr = strchr(p, '.');
+ if (!endptr)
+ endptr = p + strlen(p);
+
+ while (p < endptr) {
+ char *name, *delim;
+ long sub_len;
+ int i;
+ agl_name *agln0, *agln1 = NULL;
+
+ delim = strchr(p, '_');
+ if (delim == p) {
+ /*
+ * Glyph names starting with a underscore or two subsequent
+ * underscore in glyph name not allowed?
+ */
+ WARN("Invalid glyph name component in \"%s\".", glyphstr);
+ return -1; /* Cannot continue */
+ } else if (!delim || delim > endptr) {
+ delim = endptr;
+ }
+ sub_len = (long) (delim - p);
+
+ name = NEW(sub_len+1, char);
+ memcpy(name, p, sub_len);
+ name[sub_len] = '\0';
+
+ if (agl_name_is_unicode(name)) {
+ p = name;
+ if (p[1] != 'n') { /* uXXXXXXXX */
+ if (count >= max_unicodes) {
+ RELEASE(name);
+ return -1;
+ }
+ p++;
+ unicodes[count++] = xtol(p, strlen(p));
+ } else {
+ p += 3;
+ while (*p != '\0') {
+ if (count >= max_unicodes) {
+ RELEASE(name);
+ return -1;
+ }
+ unicodes[count++] = xtol(p, 4);
+ p += 4;
+ }
+ }
+ } else {
+ agln1 = agl_lookup_list(name);
+ if (!agln1 || (agln1->n_components == 1 &&
+ IS_PUA(agln1->unicodes[0]))) {
+ agln0 = agl_normalized_name(name);
+ if (agln0) {
+ if (verbose > 1 && agln0->suffix) {
+ WARN("agl: fix %s --> %s.%s",
+ name, agln0->name, agln0->suffix);
+ }
+ agln1 = agl_lookup_list(agln0->name);
+ agl_release_name(agln0);
+ }
+ }
+ if (agln1) {
+ if (count + agln1->n_components > max_unicodes) {
+ RELEASE(name);
+ return -1;
+ }
+ for (i = 0; i < agln1->n_components; i++) {
+ unicodes[count++] = agln1->unicodes[i];
+ }
+ } else {
+ if (verbose > 1)
+ WARN("No Unicode mapping for glyph name \"%s\" found.", name);
+ RELEASE(name);
+ return -1;
+ }
+ }
+ RELEASE(name);
+ p = delim + 1;
+ }
+
+ return count;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/agl.h b/Build/source/texk/xdvipdfmx/src/agl.h
new file mode 100644
index 00000000000..d770f9f7d72
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/agl.h
@@ -0,0 +1,68 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/agl.h,v 1.17 2005/07/07 08:00:31 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _AGL_H_
+#define _AGL_H_
+
+#define AGL_DEFAULT_LISTFILE "glyphlist.txt"
+#define AGL_EXTRA_LISTFILE "texglyphlist.txt"
+
+extern char* agl_standard_names[];
+
+#define AGL_MAX_UNICODES 16
+struct agl_name {
+ char *name;
+ char *suffix;
+ int n_components;
+ long unicodes[AGL_MAX_UNICODES];
+ struct agl_name *alternate;
+};
+typedef struct agl_name agl_name;
+
+extern char *agl_chop_suffix (const char *glyphname, char **suffix);
+
+extern long agl_sput_UTF16BE (const char *name,
+ unsigned char **dstpp,
+ unsigned char *limptr, int *num_fails);
+
+extern int agl_get_unicodes (const char *glyphstr,
+ long *unicodes, int max_uncodes);
+
+extern int agl_name_is_unicode (const char *glyphname);
+extern long agl_name_convert_unicode (const char *glyphname);
+
+extern const char *agl_suffix_to_otltag (const char *suffix);
+
+extern agl_name *agl_lookup_list (const char *glyphname);
+extern int agl_load_listfile (const char *filename, int format);
+
+#if 0
+extern int agl_select_listfile (const char *mapfile);
+#endif
+
+extern void agl_set_verbose (void);
+extern void agl_init_map (void);
+extern void agl_close_map (void);
+
+#endif /* _AGL_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/agl_standard.c b/Build/source/texk/xdvipdfmx/src/agl_standard.c
new file mode 100644
index 00000000000..a7e77a78d93
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/agl_standard.c
@@ -0,0 +1,5895 @@
+#include "agl.h"
+
+char* agl_standard_names[] = {
+ "spacehackarabic;0020",
+ "visiblespace;0020",
+ "space;0020",
+ "exclam;0021",
+ "quotedbl;0022",
+ "numbersign;0023",
+ "dollar;0024",
+ "percent;0025",
+ "ampersand;0026",
+ "quotesingle;0027",
+ "parenleft;0028",
+ "parenright;0029",
+ "asterisk;002A",
+ "plus;002B",
+ "comma;002C",
+ "hyphen;002D",
+ "period;002E",
+ "slash;002F",
+ "zero;0030",
+ "one;0031",
+ "two;0032",
+ "three;0033",
+ "four;0034",
+ "five;0035",
+ "six;0036",
+ "seven;0037",
+ "eight;0038",
+ "nine;0039",
+ "colon;003A",
+ "semicolon;003B",
+ "less;003C",
+ "equal;003D",
+ "greater;003E",
+ "question;003F",
+ "at;0040",
+ "A;0041",
+ "B;0042",
+ "C;0043",
+ "D;0044",
+ "E;0045",
+ "F;0046",
+ "G;0047",
+ "H;0048",
+ "I;0049",
+ "J;004A",
+ "K;004B",
+ "L;004C",
+ "M;004D",
+ "N;004E",
+ "O;004F",
+ "P;0050",
+ "Q;0051",
+ "R;0052",
+ "S;0053",
+ "T;0054",
+ "U;0055",
+ "V;0056",
+ "W;0057",
+ "X;0058",
+ "Y;0059",
+ "Z;005A",
+ "bracketleft;005B",
+ "backslash;005C",
+ "bracketright;005D",
+ "asciicircum;005E",
+ "underscore;005F",
+ "grave;0060",
+ "a;0061",
+ "b;0062",
+ "c;0063",
+ "d;0064",
+ "e;0065",
+ "f;0066",
+ "g;0067",
+ "h;0068",
+ "i;0069",
+ "j;006A",
+ "k;006B",
+ "l;006C",
+ "m;006D",
+ "n;006E",
+ "o;006F",
+ "p;0070",
+ "q;0071",
+ "r;0072",
+ "s;0073",
+ "t;0074",
+ "u;0075",
+ "v;0076",
+ "w;0077",
+ "x;0078",
+ "y;0079",
+ "z;007A",
+ "braceleft;007B",
+ "verticalbar;007C",
+ "bar;007C",
+ "braceright;007D",
+ "asciitilde;007E",
+ "controlDEL;007F",
+ "nonbreakingspace;00A0",
+ "space_;00A0",
+ "nbspace;00A0",
+ "exclamdown;00A1",
+ "cent;00A2",
+ "sterling;00A3",
+ "currency;00A4",
+ "yen;00A5",
+ "brokenbar;00A6",
+ "section;00A7",
+ "dieresis;00A8",
+ "copyright;00A9",
+ "ordfeminine;00AA",
+ "guillemotleft;00AB",
+ "logicalnot;00AC",
+ "dash;00AD",
+ "hyphen_;00AD",
+ "sfthyphen;00AD",
+ "softhyphen;00AD",
+ "registered;00AE",
+ "overscore;00AF",
+ "macron;00AF",
+ "degree;00B0",
+ "plusminus;00B1",
+ "two.superior;00B2",
+ "two.sups;00B2",
+ "twosuperior;00B2",
+ "three.superior;00B3",
+ "three.sups;00B3",
+ "threesuperior;00B3",
+ "acute;00B4",
+ "micro;00B5",
+ "mu1;00B5",
+ "mu;00B5",
+ "paragraph;00B6",
+ "middot;00B7",
+ "periodcentered;00B7",
+ "cedilla;00B8",
+ "one.superior;00B9",
+ "one.sups;00B9",
+ "onesuperior;00B9",
+ "ordmasculine;00BA",
+ "guillemotright;00BB",
+ "onequarter;00BC",
+ "onehalf;00BD",
+ "threequarters;00BE",
+ "questiondown;00BF",
+ "Agrave;00C0",
+ "Aacute;00C1",
+ "Acircumflex;00C2",
+ "Atilde;00C3",
+ "Adieresis;00C4",
+ "Aring;00C5",
+ "AE;00C6",
+ "Ccedilla;00C7",
+ "Egrave;00C8",
+ "Eacute;00C9",
+ "Ecircumflex;00CA",
+ "Edieresis;00CB",
+ "Igrave;00CC",
+ "Iacute;00CD",
+ "Icircumflex;00CE",
+ "Idieresis;00CF",
+ "Eth;00D0",
+ "Ntilde;00D1",
+ "Ograve;00D2",
+ "Oacute;00D3",
+ "Ocircumflex;00D4",
+ "Otilde;00D5",
+ "Odieresis;00D6",
+ "multiply;00D7",
+ "Oslash;00D8",
+ "Ugrave;00D9",
+ "Uacute;00DA",
+ "Ucircumflex;00DB",
+ "Udieresis;00DC",
+ "Yacute;00DD",
+ "Thorn;00DE",
+ "Germandbls;00DF",
+ "SS;00DF",
+ "germandbls;00DF",
+ "agrave;00E0",
+ "aacute;00E1",
+ "acircumflex;00E2",
+ "atilde;00E3",
+ "adieresis;00E4",
+ "aring;00E5",
+ "ae;00E6",
+ "ccedilla;00E7",
+ "egrave;00E8",
+ "eacute;00E9",
+ "ecircumflex;00EA",
+ "edieresis;00EB",
+ "igrave;00EC",
+ "iacute;00ED",
+ "icircumflex;00EE",
+ "idieresis;00EF",
+ "eth;00F0",
+ "ntilde;00F1",
+ "ograve;00F2",
+ "oacute;00F3",
+ "ocircumflex;00F4",
+ "otilde;00F5",
+ "odieresis;00F6",
+ "divide;00F7",
+ "oslash;00F8",
+ "ugrave;00F9",
+ "uacute;00FA",
+ "ucircumflex;00FB",
+ "udieresis;00FC",
+ "yacute;00FD",
+ "thorn;00FE",
+ "ydieresis;00FF",
+ "Amacron;0100",
+ "amacron;0101",
+ "Abreve;0102",
+ "abreve;0103",
+ "Aogonek;0104",
+ "aogonek;0105",
+ "Cacute;0106",
+ "cacute;0107",
+ "Ccircumflex;0108",
+ "ccircumflex;0109",
+ "Cdot;010A",
+ "Cdotaccent;010A",
+ "cdot;010B",
+ "cdotaccent;010B",
+ "Ccaron;010C",
+ "ccaron;010D",
+ "Dcaron;010E",
+ "dcaron;010F",
+ "Dmacron;0110",
+ "Dslash;0110",
+ "Dcroat;0110",
+ "dmacron;0111",
+ "dslash;0111",
+ "dcroat;0111",
+ "Emacron;0112",
+ "emacron;0113",
+ "Ebreve;0114",
+ "ebreve;0115",
+ "Edot;0116",
+ "Edotaccent;0116",
+ "edot;0117",
+ "edotaccent;0117",
+ "Eogonek;0118",
+ "eogonek;0119",
+ "Ecaron;011A",
+ "ecaron;011B",
+ "Gcircumflex;011C",
+ "gcircumflex;011D",
+ "Gbreve;011E",
+ "gbreve;011F",
+ "Gdot;0120",
+ "Gdotaccent;0120",
+ "gdot;0121",
+ "gdotaccent;0121",
+ "Gcedilla;0122",
+ "Gcommaaccent;0122",
+ "gcedilla;0123",
+ "gcommaaccent;0123",
+ "Hcircumflex;0124",
+ "hcircumflex;0125",
+ "Hbar;0126",
+ "hbar;0127",
+ "Itilde;0128",
+ "itilde;0129",
+ "Imacron;012A",
+ "imacron;012B",
+ "Ibreve;012C",
+ "ibreve;012D",
+ "Iogonek;012E",
+ "iogonek;012F",
+ "Idot;0130",
+ "Idotaccent;0130",
+ "dotlessi;0131",
+ "I_J;0132",
+ "IJ;0132",
+ "i_j;0133",
+ "ij;0133",
+ "Jcircumflex;0134",
+ "jcircumflex;0135",
+ "Kcedilla;0136",
+ "Kcommaaccent;0136",
+ "kcedilla;0137",
+ "kcommaaccent;0137",
+ "kra;0138",
+ "kgreenlandic;0138",
+ "Lacute;0139",
+ "lacute;013A",
+ "Lcedilla;013B",
+ "Lcommaaccent;013B",
+ "lcedilla;013C",
+ "lcommaaccent;013C",
+ "Lcaron;013D",
+ "lcaron;013E",
+ "Ldotaccent;013F",
+ "Ldot;013F",
+ "ldotaccent;0140",
+ "ldot;0140",
+ "Lslash;0141",
+ "lslash;0142",
+ "Nacute;0143",
+ "nacute;0144",
+ "Ncedilla;0145",
+ "Ncommaaccent;0145",
+ "ncedilla;0146",
+ "ncommaaccent;0146",
+ "Ncaron;0147",
+ "ncaron;0148",
+ "quoten;0149",
+ "quoterightn;0149",
+ "napostrophe;0149",
+ "Eng;014A",
+ "eng;014B",
+ "Omacron;014C",
+ "omacron;014D",
+ "Obreve;014E",
+ "obreve;014F",
+ "Odblacute;0150",
+ "Ohungarumlaut;0150",
+ "odblacute;0151",
+ "ohungarumlaut;0151",
+ "OE;0152",
+ "oe;0153",
+ "Racute;0154",
+ "racute;0155",
+ "Rcedilla;0156",
+ "Rcommaaccent;0156",
+ "rcedilla;0157",
+ "rcommaaccent;0157",
+ "Rcaron;0158",
+ "rcaron;0159",
+ "Sacute;015A",
+ "sacute;015B",
+ "Scircumflex;015C",
+ "scircumflex;015D",
+ "Scedilla;015E",
+ "scedilla;015F",
+ "Scaron;0160",
+ "scaron;0161",
+ "Tcedilla;0162",
+ "Tcommaaccent;0162",
+ "tcedilla;0163",
+ "tcommaaccent;0163",
+ "Tcaron;0164",
+ "tcaron;0165",
+ "Tbar;0166",
+ "tbar;0167",
+ "Utilde;0168",
+ "utilde;0169",
+ "Umacron;016A",
+ "umacron;016B",
+ "Ubreve;016C",
+ "ubreve;016D",
+ "Uring;016E",
+ "uring;016F",
+ "Udblacute;0170",
+ "Uhungarumlaut;0170",
+ "udblacute;0171",
+ "uhungarumlaut;0171",
+ "Uogonek;0172",
+ "uogonek;0173",
+ "Wcircumflex;0174",
+ "wcircumflex;0175",
+ "Ycircumflex;0176",
+ "ycircumflex;0177",
+ "Ydieresis;0178",
+ "Zacute;0179",
+ "zacute;017A",
+ "Zdot;017B",
+ "Zdotaccent;017B",
+ "zdot;017C",
+ "zdotaccent;017C",
+ "Zcaron;017D",
+ "zcaron;017E",
+ "slong;017F",
+ "longs;017F",
+ "bbar;0180",
+ "bstroke;0180",
+ "Bhook;0181",
+ "Btopbar;0182",
+ "btopbar;0183",
+ "Tonesix;0184",
+ "tonesix;0185",
+ "Oopen;0186",
+ "Chook;0187",
+ "chook;0188",
+ "Dafrican;0189",
+ "Dbar1;0189",
+ "Dhook;018A",
+ "Dtopbar;018B",
+ "dtopbar;018C",
+ "deltaturn;018D",
+ "deltaturned;018D",
+ "Ereversed;018E",
+ "Eturn;018E",
+ "Schwa;018F",
+ "Eopen;0190",
+ "Epsilon1;0190",
+ "Fhook;0191",
+ "fscript;0192",
+ "florin;0192",
+ "Ghook;0193",
+ "Gamma1;0194",
+ "Gammaafrican;0194",
+ "hv;0195",
+ "Iota1;0196",
+ "Iotaafrican;0196",
+ "Ibar;0197",
+ "Istroke;0197",
+ "Khook;0198",
+ "khook;0199",
+ "lbar;019A",
+ "lambdabar;019B",
+ "lambdastroke;019B",
+ "Mturned;019C",
+ "mcapturn;019C",
+ "Nhook;019D",
+ "Nhookleft;019D",
+ "nleg;019E",
+ "nlegrightlong;019E",
+ "Obar;019F",
+ "Ocenteredtilde;019F",
+ "Ohorn;01A0",
+ "ohorn;01A1",
+ "OI;01A2",
+ "Oi;01A2",
+ "oi;01A3",
+ "Phook;01A4",
+ "phook;01A5",
+ "YR;01A6",
+ "yr;01A6",
+ "Tonetwo;01A7",
+ "tonetwo;01A8",
+ "Esh;01A9",
+ "eshlooprev;01AA",
+ "eshreversedloop;01AA",
+ "tpalatalhook;01AB",
+ "Thook;01AC",
+ "thook;01AD",
+ "Tretroflexhook;01AE",
+ "Trthook;01AE",
+ "Uhorn;01AF",
+ "uhorn;01B0",
+ "Upsilon2;01B1",
+ "Upsilonafrican;01B1",
+ "Vcursive;01B2",
+ "Vhook;01B2",
+ "Yhook;01B3",
+ "Zbar;01B5",
+ "Zstroke;01B5",
+ "zbar;01B6",
+ "zstroke;01B6",
+ "Ezh;01B7",
+ "Yogh;01B7",
+ "Ezhreversed;01B8",
+ "Yoghrev;01B8",
+ "ezhreversed;01B9",
+ "yoghrev;01B9",
+ "ezhtail;01BA",
+ "yoghtail;01BA",
+ "2bar;01BB",
+ "twostroke;01BB",
+ "Tonefive;01BC",
+ "tonefive;01BD",
+ "glottalinvertedstroke;01BE",
+ "glottalstopbarinv;01BE",
+ "wynn;01BF",
+ "clickdental;01C0",
+ "pipe;01C0",
+ "clicklateral;01C1",
+ "pipedbl;01C1",
+ "clickalveolar;01C2",
+ "pipedblbar;01C2",
+ "clickretroflex;01C3",
+ "exclam1;01C3",
+ "DZcaron;01C4",
+ "DZhacek;01C4",
+ "Dzcaron;01C5",
+ "Dzhacek;01C5",
+ "dzcaron;01C6",
+ "dzhacek;01C6",
+ "LJ;01C7",
+ "L_J;01C7",
+ "L_j;01C8",
+ "Lj;01C8",
+ "l_j;01C9",
+ "lj;01C9",
+ "NJ;01CA",
+ "N_J;01CA",
+ "N_j;01CB",
+ "Nj;01CB",
+ "n_j;01CC",
+ "nj;01CC",
+ "Acaron;01CD",
+ "Ahacek;01CD",
+ "acaron;01CE",
+ "ahacek;01CE",
+ "Icaron;01CF",
+ "Ihacek;01CF",
+ "icaron;01D0",
+ "ihacek;01D0",
+ "Ocaron;01D1",
+ "Ohacek;01D1",
+ "ocaron;01D2",
+ "ohacek;01D2",
+ "Ucaron;01D3",
+ "Uhacek;01D3",
+ "ucaron;01D4",
+ "uhacek;01D4",
+ "Udieresismacron;01D5",
+ "udieresismacron;01D6",
+ "Udieresisacute;01D7",
+ "udieresisacute;01D8",
+ "Udieresiscaron;01D9",
+ "Udieresishacek;01D9",
+ "udieresiscaron;01DA",
+ "udieresishacek;01DA",
+ "Udieresisgrave;01DB",
+ "udieresisgrave;01DC",
+ "eturn;01DD",
+ "eturned;01DD",
+ "Adieresismacron;01DE",
+ "adieresismacron;01DF",
+ "Adotmacron;01E0",
+ "adotmacron;01E1",
+ "AEmacron;01E2",
+ "aemacron;01E3",
+ "Gbar;01E4",
+ "Gstroke;01E4",
+ "gbar;01E5",
+ "gstroke;01E5",
+ "Ghacek;01E6",
+ "Gcaron;01E6",
+ "ghacek;01E7",
+ "gcaron;01E7",
+ "Kcaron;01E8",
+ "Khacek;01E8",
+ "kcaron;01E9",
+ "khacek;01E9",
+ "Oogonek;01EA",
+ "oogonek;01EB",
+ "Oogonekmacron;01EC",
+ "oogonekmacron;01ED",
+ "Ezhcaron;01EE",
+ "Yoghhacek;01EE",
+ "ezhcaron;01EF",
+ "yoghhacek;01EF",
+ "jcaron;01F0",
+ "jhacek;01F0",
+ "DZ;01F1",
+ "Dz;01F2",
+ "dz;01F3",
+ "Gacute;01F4",
+ "gacute;01F5",
+ "Aacutering;01FA",
+ "Aringacute;01FA",
+ "aacutering;01FB",
+ "aringacute;01FB",
+ "AEacute;01FC",
+ "aeacute;01FD",
+ "Ostrokeacute;01FE",
+ "Oslashacute;01FE",
+ "ostrokeacute;01FF",
+ "oslashacute;01FF",
+ "Adblgrave;0200",
+ "adblgrave;0201",
+ "Ainvertedbreve;0202",
+ "ainvertedbreve;0203",
+ "Edblgrave;0204",
+ "edblgrave;0205",
+ "Einvertedbreve;0206",
+ "einvertedbreve;0207",
+ "Idblgrave;0208",
+ "idblgrave;0209",
+ "Iinvertedbreve;020A",
+ "iinvertedbreve;020B",
+ "Odblgrave;020C",
+ "odblgrave;020D",
+ "Oinvertedbreve;020E",
+ "oinvertedbreve;020F",
+ "Rdblgrave;0210",
+ "rdblgrave;0211",
+ "Rinvertedbreve;0212",
+ "rinvertedbreve;0213",
+ "Udblgrave;0214",
+ "udblgrave;0215",
+ "Uinvertedbreve;0216",
+ "uinvertedbreve;0217",
+ "Scommaaccent;0218",
+ "scommaaccent;0219",
+ "dotlessj;0237",
+ "aturn;0250",
+ "aturned;0250",
+ "ascript;0251",
+ "ascriptturn;0252",
+ "ascriptturned;0252",
+ "bhook;0253",
+ "cturn;0254",
+ "oopen;0254",
+ "ccurl;0255",
+ "drthook;0256",
+ "dtail;0256",
+ "dhook;0257",
+ "erev;0258",
+ "ereversed;0258",
+ "schwa;0259",
+ "schwahook;025A",
+ "eopen;025B",
+ "epsilon1;025B",
+ "eopenreversed;025C",
+ "epsilon1rev;025C",
+ "eopenreversedhook;025D",
+ "epsilon1revhook;025D",
+ "eopenreversedclosed;025E",
+ "epsilon1revclosed;025E",
+ "jdotlessbar;025F",
+ "jdotlessstroke;025F",
+ "ghook;0260",
+ "gcursive;0261",
+ "gscript;0261",
+ "Gsmallcap;0262",
+ "gamma1;0263",
+ "gammalatinsmall;0263",
+ "babygamma;0264",
+ "ramshorn;0264",
+ "hturn;0265",
+ "hturned;0265",
+ "hhook;0266",
+ "henghook;0267",
+ "ibar;0268",
+ "istroke;0268",
+ "iota1;0269",
+ "iotalatin;0269",
+ "Ismallcap;026A",
+ "lmiddletilde;026B",
+ "lmidtilde;026B",
+ "lbelt;026C",
+ "lhookretroflex;026D",
+ "lrthook;026D",
+ "lezh;026E",
+ "lyogh;026E",
+ "mturn;026F",
+ "mturned;026F",
+ "mlonglegturned;0270",
+ "mturndescend;0270",
+ "mhook;0271",
+ "nhookleft;0272",
+ "nlftlfthook;0272",
+ "nhookretroflex;0273",
+ "nrthook;0273",
+ "Nsmallcap;0274",
+ "obar;0275",
+ "obarred;0275",
+ "OEsmallcap;0276",
+ "omegaclosed;0277",
+ "omegalatinclosed;0277",
+ "philatin;0278",
+ "rturn;0279",
+ "rturned;0279",
+ "rlonglegturned;027A",
+ "rturnascend;027A",
+ "rhookturned;027B",
+ "rturnrthook;027B",
+ "rdescend;027C",
+ "rlongleg;027C",
+ "rhook;027D",
+ "rrthook;027D",
+ "rfishhook;027E",
+ "rfishhookrev;027F",
+ "rfishhookreversed;027F",
+ "Rsmallcap;0280",
+ "Rsmallcapinv;0281",
+ "Rsmallinverted;0281",
+ "shook;0282",
+ "srthook;0282",
+ "esh;0283",
+ "dotlessjstrokehook;0284",
+ "jhookdblbar;0284",
+ "eshshortrev;0285",
+ "eshsquatreversed;0285",
+ "eshcurl;0286",
+ "tturn;0287",
+ "tturned;0287",
+ "tretroflexhook;0288",
+ "trthook;0288",
+ "ubar;0289",
+ "upsilonlatin;028A",
+ "vhook;028B",
+ "vscript;028B",
+ "vturn;028C",
+ "vturned;028C",
+ "wturn;028D",
+ "wturned;028D",
+ "yturn;028E",
+ "yturned;028E",
+ "Ysmallcap;028F",
+ "zretroflexhook;0290",
+ "zrthook;0290",
+ "zcurl;0291",
+ "ezh;0292",
+ "yogh;0292",
+ "ezhcurl;0293",
+ "yoghcurl;0293",
+ "glottalstop;0294",
+ "glottalstopreversed;0295",
+ "glottalstoprevinv;0295",
+ "glottalstopinv;0296",
+ "glottalstopinverted;0296",
+ "cstretch;0297",
+ "cstretched;0297",
+ "bilabialclick;0298",
+ "Bsmallcap;0299",
+ "eopenclosed;029A",
+ "epsilonclosed;029A",
+ "Gsmallcaphook;029B",
+ "Gsmallhook;029B",
+ "Hsmallcap;029C",
+ "jcrossedtail;029D",
+ "jcrosstail;029D",
+ "kturn;029E",
+ "kturned;029E",
+ "Lsmallcap;029F",
+ "qhook;02A0",
+ "glottalstopbar;02A1",
+ "glottalstopstroke;02A1",
+ "glottalstopbarrev;02A2",
+ "glottalstopstrokereversed;02A2",
+ "dzaltone;02A3",
+ "dezh;02A4",
+ "dyogh;02A4",
+ "dzcurl;02A5",
+ "ts;02A6",
+ "tesh;02A7",
+ "tccurl;02A8",
+ "hsuper;02B0",
+ "hsuperior;02B0",
+ "hhooksuper;02B1",
+ "hhooksuperior;02B1",
+ "jsuper;02B2",
+ "jsuperior;02B2",
+ "rsuper;02B3",
+ "rturnedsuperior;02B4",
+ "rturnsuper;02B4",
+ "rturnrthooksuper;02B5",
+ "Rsmallinvertedsuperior;02B6",
+ "Rturnsuper;02B6",
+ "wsuper;02B7",
+ "wsuperior;02B7",
+ "ysuper;02B8",
+ "ysuperior;02B8",
+ "primemod;02B9",
+ "dblprimemod;02BA",
+ "primedblmod;02BA",
+ "commaturnedmod;02BB",
+ "doublevav;02BB",
+ "quoteleftmod;02BB",
+ "apostrophe;02BC",
+ "apostrophemod;02BC",
+ "afii57929;02BC",
+ "apostropherev;02BD",
+ "commareversedmod;02BD",
+ "doubleyod;02BD",
+ "afii64937;02BD",
+ "ringhalfright;02BE",
+ "ringrighthalfsuper;02BE",
+ "ringhalfleft;02BF",
+ "ringlefthalfsuper;02BF",
+ "glottal;02C0",
+ "glottalstopmod;02C0",
+ "glottalrev;02C1",
+ "glottalstopreversedmod;02C1",
+ "vavshindot;02C1",
+ "arrowheadleftmod;02C2",
+ "finalkafsheva;02C2",
+ "fronted;02C2",
+ "arrowheadrightmod;02C3",
+ "backed;02C3",
+ "finalkafqamats;02C3",
+ "arrowheadupmod;02C4",
+ "lamedholam;02C4",
+ "raised;02C4",
+ "arrowheaddownmod;02C5",
+ "lamedholamdagesh;02C5",
+ "lowered;02C5",
+ "altayin;02C6",
+ "circumflex;02C6",
+ "caron;02C7",
+ "linevert;02C8",
+ "verticallinemod;02C8",
+ "firsttonechinese;02C9",
+ "macron_;02C9",
+ "acute1;02CA",
+ "secondtonechinese;02CA",
+ "alefpatah;02CB",
+ "fourthtonechinese;02CB",
+ "grave1;02CB",
+ "alefqamats;02CC",
+ "linevertsub;02CC",
+ "verticallinelowmod;02CC",
+ "alefmapiq;02CD",
+ "macronlowmod;02CD",
+ "macronsub;02CD",
+ "gravelowmod;02CE",
+ "gravesub;02CE",
+ "acutelowmod;02CF",
+ "acutesub;02CF",
+ "colontriangularmod;02D0",
+ "length;02D0",
+ "colontriangularhalfmod;02D1",
+ "halflength;02D1",
+ "ringhalfrightcentered;02D2",
+ "ringrighthalfcenter;02D2",
+ "ringhalfleftcentered;02D3",
+ "ringlefthalfsup;02D3",
+ "tackupmid;02D4",
+ "uptackmod;02D4",
+ "downtackmod;02D5",
+ "tackdownmid;02D5",
+ "plusmod;02D6",
+ "minusmod;02D7",
+ "breve;02D8",
+ "dotaccent;02D9",
+ "ring;02DA",
+ "ogonek;02DB",
+ "finalpedagesh;02DC",
+ "ilde;02DC",
+ "tilde;02DC",
+ "hungarumlaut;02DD",
+ "rhotichook;02DE",
+ "rhotichookmod;02DE",
+ "gammasuper;02E0",
+ "gammasuperior;02E0",
+ "reshdagesh;02E0",
+ "lsuper;02E1",
+ "ssuper;02E2",
+ "xsuper;02E3",
+ "xsuperior;02E3",
+ "betrafe;02E4",
+ "glottalrevsuper;02E4",
+ "glottalstopreversedsuperior;02E4",
+ "kafrafe;02E5",
+ "tonebarextrahighmod;02E5",
+ "toneextrahigh;02E5",
+ "perafe;02E6",
+ "tonebarhighmod;02E6",
+ "tonehigh;02E6",
+ "aleflamed;02E7",
+ "tonebarmidmod;02E7",
+ "tonemid;02E7",
+ "tonebarlowmod;02E8",
+ "tonelow;02E8",
+ "tonebarextralowmod;02E9",
+ "toneextralow;02E9",
+ "lefttorightmark;02EA",
+ "righttoleftmark;02EB",
+ "gravecmb;0300",
+ "gravenosp;0300",
+ "gravecomb;0300",
+ "acutecmb;0301",
+ "acutenosp;0301",
+ "acutecomb;0301",
+ "circumflexcmb;0302",
+ "circumflexcomb;0302",
+ "circumflexnosp;0302",
+ "tildecmb;0303",
+ "tildenosp;0303",
+ "tildecomb;0303",
+ "macroncmb;0304",
+ "macroncomb;0304",
+ "macronnosp;0304",
+ "overlinecmb;0305",
+ "overscorecomb;0305",
+ "overscorenosp;0305",
+ "brevecmb;0306",
+ "brevecomb;0306",
+ "brevenosp;0306",
+ "dotaccentcmb;0307",
+ "dotaccentcomb;0307",
+ "dotnosp;0307",
+ "dieresiscmb;0308",
+ "dieresiscomb;0308",
+ "dieresisnosp;0308",
+ "hookcmb;0309",
+ "hooksupnosp;0309",
+ "hookabovecomb;0309",
+ "ringcmb;030A",
+ "ringnosp;030A",
+ "acutedblnosp;030B",
+ "hungarumlautcmb;030B",
+ "caroncmb;030C",
+ "haceknosp;030C",
+ "linevertnosp;030D",
+ "verticallineabovecmb;030D",
+ "dblverticallineabovecmb;030E",
+ "linevertdblnosp;030E",
+ "dblgravecmb;030F",
+ "gravedblnosp;030F",
+ "candrabinducmb;0310",
+ "candrabindunosp;0310",
+ "breveinvertedcmb;0311",
+ "breveinvnosp;0311",
+ "commaturnedabovecmb;0312",
+ "commaturnsupnosp;0312",
+ "apostrophesupnosp;0313",
+ "commaabovecmb;0313",
+ "commareversedabovecmb;0314",
+ "commasuprevnosp;0314",
+ "commaaboverightcmb;0315",
+ "commasuprightnosp;0315",
+ "gravebelowcmb;0316",
+ "gravesubnosp;0316",
+ "acutebelowcmb;0317",
+ "acutesubnosp;0317",
+ "lefttackbelowcmb;0318",
+ "tackleftsubnosp;0318",
+ "righttackbelowcmb;0319",
+ "tackrightsubnosp;0319",
+ "anglesupnosp;031A",
+ "leftangleabovecmb;031A",
+ "horncmb;031B",
+ "hornnosp;031B",
+ "ringhalfleftbelowcmb;031C",
+ "ringlefthalfsubnosp;031C",
+ "tackupsubnosp;031D",
+ "uptackbelowcmb;031D",
+ "downtackbelowcmb;031E",
+ "tackdownsubnosp;031E",
+ "plusbelowcmb;031F",
+ "plussubnosp;031F",
+ "minusbelowcmb;0320",
+ "minussubnosp;0320",
+ "hookpalatalizedbelowcmb;0321",
+ "hooksubpalatnosp;0321",
+ "hookretroflexbelowcmb;0322",
+ "hooksubretronosp;0322",
+ "dotbelowcmb;0323",
+ "dotsubnosp;0323",
+ "dotbelowcomb;0323",
+ "dieresisbelowcmb;0324",
+ "dotdblsubnosp;0324",
+ "ringbelowcmb;0325",
+ "ringsubnosp;0325",
+ "commasubnosp;0326",
+ "cedillacmb;0327",
+ "cedillanosp;0327",
+ "ogonekcmb;0328",
+ "ogoneknosp;0328",
+ "linevertsubnosp;0329",
+ "verticallinebelowcmb;0329",
+ "bridgebelowcmb;032A",
+ "bridgesubnosp;032A",
+ "archdblsubnosp;032B",
+ "dblarchinvertedbelowcmb;032B",
+ "caronbelowcmb;032C",
+ "haceksubnosp;032C",
+ "circumflexbelowcmb;032D",
+ "circumflexsubnosp;032D",
+ "brevebelowcmb;032E",
+ "brevesubnosp;032E",
+ "breveinvertedbelowcmb;032F",
+ "breveinvsubnosp;032F",
+ "tildebelowcmb;0330",
+ "tildesubnosp;0330",
+ "macronbelowcmb;0331",
+ "macronsubnosp;0331",
+ "lowlinecmb;0332",
+ "underscorenosp;0332",
+ "dbllowlinecmb;0333",
+ "underscoredblnosp;0333",
+ "tildemidnosp;0334",
+ "tildeoverlaycmb;0334",
+ "barmidshortnosp;0335",
+ "strokeshortoverlaycmb;0335",
+ "barmidlongnosp;0336",
+ "strokelongoverlaycmb;0336",
+ "slashshortnosp;0337",
+ "solidusshortoverlaycmb;0337",
+ "slashlongnosp;0338",
+ "soliduslongoverlaycmb;0338",
+ "ringhalfrightbelowcmb;0339",
+ "ringrighthalfsubnosp;0339",
+ "bridgeinvertedbelowcmb;033A",
+ "bridgeinvsubnosp;033A",
+ "squarebelowcmb;033B",
+ "squaresubnosp;033B",
+ "seagullbelowcmb;033C",
+ "seagullsubnosp;033C",
+ "xabovecmb;033D",
+ "xsupnosp;033D",
+ "tildeverticalcmb;033E",
+ "tildevertsupnosp;033E",
+ "dbloverlinecmb;033F",
+ "overscoredblnosp;033F",
+ "graveleftnosp;0340",
+ "gravetonecmb;0340",
+ "acuterightnosp;0341",
+ "acutetonecmb;0341",
+ "perispomenigreekcmb;0342",
+ "koroniscmb;0343",
+ "diaeresistonosnosp;0344",
+ "dialytikatonoscmb;0344",
+ "iotasubnosp;0345",
+ "ypogegrammenigreekcmb;0345",
+ "tildedoublecmb;0360",
+ "breveinverteddoublecmb;0361",
+ "numeralgreek;0374",
+ "numeralsigngreek;0374",
+ "numeralgreeksub;0375",
+ "numeralsignlowergreek;0375",
+ "iotasub;037A",
+ "ypogegrammeni;037A",
+ "questiongreek;037E",
+ "semicolon_;037E",
+ "tonos;0384",
+ "diaeresistonos;0385",
+ "dialytikatonos;0385",
+ "greekacutedieresis;0385",
+ "dieresistonos;0385",
+ "Alphaacute;0386",
+ "Alphatonos;0386",
+ "anoteleia;0387",
+ "Epsilonacute;0388",
+ "Epsilontonos;0388",
+ "Etaacute;0389",
+ "Etatonos;0389",
+ "Iotaacute;038A",
+ "Iotatonos;038A",
+ "Omicronacute;038C",
+ "Omicrontonos;038C",
+ "Upsilonacute;038E",
+ "Upsilontonos;038E",
+ "Omegaacute;038F",
+ "Omegatonos;038F",
+ "iotaacutedieresis;0390",
+ "iotadieresistonos;0390",
+ "Alpha;0391",
+ "Beta;0392",
+ "Gamma;0393",
+ "Deltagreek;0394",
+ "Delta;0394",
+ "Epsilon;0395",
+ "Zeta;0396",
+ "Eta;0397",
+ "Theta;0398",
+ "Iota;0399",
+ "Kappa;039A",
+ "Lambda;039B",
+ "Mu;039C",
+ "Nu;039D",
+ "Xi;039E",
+ "Omicron;039F",
+ "Pi;03A0",
+ "Rho;03A1",
+ "Sigma;03A3",
+ "Tau;03A4",
+ "Upsilon;03A5",
+ "Phi;03A6",
+ "Chi;03A7",
+ "Psi;03A8",
+ "Omegagreek;03A9",
+ "Omega;03A9",
+ "Iotadieresis;03AA",
+ "Upsilondieresis;03AB",
+ "alphaacute;03AC",
+ "alphatonos;03AC",
+ "epsilonacute;03AD",
+ "epsilontonos;03AD",
+ "etaacute;03AE",
+ "etatonos;03AE",
+ "iotaacute;03AF",
+ "iotatonos;03AF",
+ "upsilonacutedieresis;03B0",
+ "upsilondieresistonos;03B0",
+ "alpha;03B1",
+ "beta;03B2",
+ "gamma;03B3",
+ "delta;03B4",
+ "epsilon;03B5",
+ "zeta;03B6",
+ "eta;03B7",
+ "theta;03B8",
+ "iota;03B9",
+ "kappa;03BA",
+ "lambda;03BB",
+ "greekmu;03BC",
+ "mu_;03BC",
+ "mugreek;03BC",
+ "nu;03BD",
+ "xi;03BE",
+ "omicron;03BF",
+ "pi;03C0",
+ "rho;03C1",
+ "sigmaalt;03C2",
+ "sigmafinal;03C2",
+ "sigma1;03C2",
+ "sigma;03C3",
+ "tau;03C4",
+ "upsilon;03C5",
+ "phi;03C6",
+ "chi;03C7",
+ "psi;03C8",
+ "omega;03C9",
+ "iotadieresis;03CA",
+ "upsilondieresis;03CB",
+ "omicronacute;03CC",
+ "omicrontonos;03CC",
+ "upsilonacute;03CD",
+ "upsilontonos;03CD",
+ "omegaacute;03CE",
+ "omegatonos;03CE",
+ "beta1;03D0",
+ "betasymbolgreek;03D0",
+ "thetasymbolgreek;03D1",
+ "theta1;03D1",
+ "Upsilonhooksymbol;03D2",
+ "Upsilon1;03D2",
+ "Upsilon1tonos;03D3",
+ "Upsilonacutehooksymbolgreek;03D3",
+ "Upsilon1dieresis;03D4",
+ "Upsilondieresishooksymbolgreek;03D4",
+ "phisymbolgreek;03D5",
+ "phi1;03D5",
+ "pi1;03D6",
+ "pisymbolgreek;03D6",
+ "omega1;03D6",
+ "Stigma;03DA",
+ "Stigmagreek;03DA",
+ "Digamma;03DC",
+ "Digammagreek;03DC",
+ "Koppa;03DE",
+ "Koppagreek;03DE",
+ "Sampi;03E0",
+ "Sampigreek;03E0",
+ "Sheicoptic;03E2",
+ "sheicoptic;03E3",
+ "Feicoptic;03E4",
+ "feicoptic;03E5",
+ "Kheicoptic;03E6",
+ "kheicoptic;03E7",
+ "horicoptic;03E9",
+ "Gangiacoptic;03EA",
+ "gangiacoptic;03EB",
+ "Shimacoptic;03EC",
+ "shimacoptic;03ED",
+ "Dei;03EE",
+ "Deicoptic;03EE",
+ "dei;03EF",
+ "deicoptic;03EF",
+ "kappa1;03F0",
+ "kappasymbolgreek;03F0",
+ "rho1;03F1",
+ "rhosymbolgreek;03F1",
+ "sigmalunate;03F2",
+ "sigmalunatesymbolgreek;03F2",
+ "yotgreek;03F3",
+ "Io;0401",
+ "Iocyrillic;0401",
+ "afii10023;0401",
+ "Dje;0402",
+ "Djecyrillic;0402",
+ "afii10051;0402",
+ "Gjecyrillic;0403",
+ "afii10052;0403",
+ "Ecyril;0404",
+ "Ecyrillic;0404",
+ "afii10053;0404",
+ "Dze;0405",
+ "Dzecyrillic;0405",
+ "afii10054;0405",
+ "Icyril;0406",
+ "Icyrillic;0406",
+ "afii10055;0406",
+ "Yi;0407",
+ "Yicyrillic;0407",
+ "afii10056;0407",
+ "Je;0408",
+ "Jecyrillic;0408",
+ "afii10057;0408",
+ "Lje;0409",
+ "Ljecyrillic;0409",
+ "afii10058;0409",
+ "Nje;040A",
+ "Njecyrillic;040A",
+ "afii10059;040A",
+ "Tshe;040B",
+ "Tshecyrillic;040B",
+ "afii10060;040B",
+ "Kje;040C",
+ "Kjecyrillic;040C",
+ "afii10061;040C",
+ "Ucyrilbreve;040E",
+ "Ushortcyrillic;040E",
+ "afii10062;040E",
+ "Dzhe;040F",
+ "Dzhecyrillic;040F",
+ "afii10145;040F",
+ "Acyril;0410",
+ "Acyrillic;0410",
+ "afii10017;0410",
+ "Be;0411",
+ "Becyrillic;0411",
+ "afii10018;0411",
+ "Ve;0412",
+ "Vecyrillic;0412",
+ "afii10019;0412",
+ "Ge;0413",
+ "Gecyrillic;0413",
+ "afii10020;0413",
+ "De;0414",
+ "Decyrillic;0414",
+ "afii10021;0414",
+ "Ie;0415",
+ "Iecyrillic;0415",
+ "afii10022;0415",
+ "Zhe;0416",
+ "Zhecyrillic;0416",
+ "afii10024;0416",
+ "Ze;0417",
+ "Zecyrillic;0417",
+ "afii10025;0417",
+ "Ii;0418",
+ "Iicyrillic;0418",
+ "afii10026;0418",
+ "Iibreve;0419",
+ "Iishortcyrillic;0419",
+ "afii10027;0419",
+ "Ka;041A",
+ "Kacyrillic;041A",
+ "afii10028;041A",
+ "El;041B",
+ "Elcyrillic;041B",
+ "afii10029;041B",
+ "Em;041C",
+ "Emcyrillic;041C",
+ "afii10030;041C",
+ "En;041D",
+ "Encyrillic;041D",
+ "afii10031;041D",
+ "Ocyril;041E",
+ "Ocyrillic;041E",
+ "afii10032;041E",
+ "Pecyril;041F",
+ "Pecyrillic;041F",
+ "afii10033;041F",
+ "Er;0420",
+ "Ercyrillic;0420",
+ "afii10034;0420",
+ "Es;0421",
+ "Escyrillic;0421",
+ "afii10035;0421",
+ "Te;0422",
+ "Tecyrillic;0422",
+ "afii10036;0422",
+ "Ucyril;0423",
+ "Ucyrillic;0423",
+ "afii10037;0423",
+ "Ef;0424",
+ "Efcyrillic;0424",
+ "afii10038;0424",
+ "Kha;0425",
+ "Khacyrillic;0425",
+ "afii10039;0425",
+ "Tse;0426",
+ "Tsecyrillic;0426",
+ "afii10040;0426",
+ "Che;0427",
+ "Checyrillic;0427",
+ "afii10041;0427",
+ "Sha;0428",
+ "Shacyrillic;0428",
+ "afii10042;0428",
+ "Shcha;0429",
+ "Shchacyrillic;0429",
+ "afii10043;0429",
+ "Hard;042A",
+ "Hardsigncyrillic;042A",
+ "afii10044;042A",
+ "Yeri;042B",
+ "Yericyrillic;042B",
+ "afii10045;042B",
+ "Soft;042C",
+ "afii10046;042C",
+ "Ecyrilrev;042D",
+ "Ereversedcyrillic;042D",
+ "afii10047;042D",
+ "IUcyrillic;042E",
+ "Iu;042E",
+ "afii10048;042E",
+ "IAcyrillic;042F",
+ "Ia;042F",
+ "afii10049;042F",
+ "acyril;0430",
+ "acyrillic;0430",
+ "afii10065;0430",
+ "be;0431",
+ "becyrillic;0431",
+ "afii10066;0431",
+ "ve;0432",
+ "vecyrillic;0432",
+ "afii10067;0432",
+ "ge;0433",
+ "gecyrillic;0433",
+ "afii10068;0433",
+ "de;0434",
+ "decyrillic;0434",
+ "afii10069;0434",
+ "ie;0435",
+ "iecyrillic;0435",
+ "afii10070;0435",
+ "zhe;0436",
+ "zhecyrillic;0436",
+ "afii10072;0436",
+ "ze;0437",
+ "zecyrillic;0437",
+ "afii10073;0437",
+ "ii;0438",
+ "iicyrillic;0438",
+ "afii10074;0438",
+ "iibreve;0439",
+ "iishortcyrillic;0439",
+ "afii10075;0439",
+ "ka;043A",
+ "kacyrillic;043A",
+ "afii10076;043A",
+ "el;043B",
+ "elcyrillic;043B",
+ "afii10077;043B",
+ "em;043C",
+ "emcyrillic;043C",
+ "afii10078;043C",
+ "en;043D",
+ "encyrillic;043D",
+ "afii10079;043D",
+ "ocyril;043E",
+ "ocyrillic;043E",
+ "afii10080;043E",
+ "pecyril;043F",
+ "pecyrillic;043F",
+ "afii10081;043F",
+ "er;0440",
+ "ercyrillic;0440",
+ "afii10082;0440",
+ "es;0441",
+ "escyrillic;0441",
+ "afii10083;0441",
+ "te;0442",
+ "tecyrillic;0442",
+ "afii10084;0442",
+ "ucyril;0443",
+ "ucyrillic;0443",
+ "afii10085;0443",
+ "ef;0444",
+ "efcyrillic;0444",
+ "afii10086;0444",
+ "kha;0445",
+ "khacyrillic;0445",
+ "afii10087;0445",
+ "tse;0446",
+ "tsecyrillic;0446",
+ "afii10088;0446",
+ "che;0447",
+ "checyrillic;0447",
+ "afii10089;0447",
+ "sha;0448",
+ "shacyrillic;0448",
+ "afii10090;0448",
+ "shcha;0449",
+ "shchacyrillic;0449",
+ "afii10091;0449",
+ "hard;044A",
+ "hardsigncyrillic;044A",
+ "afii10092;044A",
+ "yeri;044B",
+ "yericyrillic;044B",
+ "afii10093;044B",
+ "soft;044C",
+ "softsigncyrillic;044C",
+ "afii10094;044C",
+ "ecyrilrev;044D",
+ "ereversedcyrillic;044D",
+ "afii10095;044D",
+ "iu;044E",
+ "iucyrillic;044E",
+ "afii10096;044E",
+ "ia;044F",
+ "iacyrillic;044F",
+ "afii10097;044F",
+ "io;0451",
+ "iocyrillic;0451",
+ "afii10071;0451",
+ "dje;0452",
+ "djecyrillic;0452",
+ "afii10099;0452",
+ "gje;0453",
+ "gjecyrillic;0453",
+ "afii10100;0453",
+ "ecyril;0454",
+ "ecyrillic;0454",
+ "afii10101;0454",
+ "dze;0455",
+ "dzecyrillic;0455",
+ "afii10102;0455",
+ "icyril;0456",
+ "icyrillic;0456",
+ "afii10103;0456",
+ "yi;0457",
+ "yicyrillic;0457",
+ "afii10104;0457",
+ "je;0458",
+ "jecyrillic;0458",
+ "afii10105;0458",
+ "lje;0459",
+ "ljecyrillic;0459",
+ "afii10106;0459",
+ "nje;045A",
+ "njecyrillic;045A",
+ "afii10107;045A",
+ "tshe;045B",
+ "tshecyrillic;045B",
+ "afii10108;045B",
+ "kje;045C",
+ "kjecyrillic;045C",
+ "afii10109;045C",
+ "ucyrilbreve;045E",
+ "ushortcyrillic;045E",
+ "afii10110;045E",
+ "dzhe;045F",
+ "dzhecyrillic;045F",
+ "afii10193;045F",
+ "Omegacyrillic;0460",
+ "omegacyrillic;0461",
+ "Yat;0462",
+ "Yatcyrillic;0462",
+ "afii10146;0462",
+ "yat;0463",
+ "yatcyrillic;0463",
+ "afii10194;0463",
+ "Eiotifiedcyrillic;0464",
+ "eiotifiedcyrillic;0465",
+ "Yuslittlecyrillic;0466",
+ "yuslittlecyrillic;0467",
+ "Yuslittleiotifiedcyrillic;0468",
+ "yuslittleiotifiedcyrillic;0469",
+ "Yusbig;046A",
+ "Yusbigcyrillic;046A",
+ "yusbig;046B",
+ "yusbigcyrillic;046B",
+ "Yusbigiotifiedcyrillic;046C",
+ "yusbigiotifiedcyrillic;046D",
+ "Ksicyrillic;046E",
+ "ksicyrillic;046F",
+ "Psicyrillic;0470",
+ "psicyrillic;0471",
+ "Fitacyrillic;0472",
+ "afii10147;0472",
+ "fitacyrillic;0473",
+ "afii10195;0473",
+ "Izhitsacyrillic;0474",
+ "afii10148;0474",
+ "izhitsacyrillic;0475",
+ "afii10196;0475",
+ "Izhitsadblgravecyrillic;0476",
+ "izhitsadblgravecyrillic;0477",
+ "Ukcyrillic;0478",
+ "ukcyrillic;0479",
+ "Omegaroundcyrillic;047A",
+ "omegaroundcyrillic;047B",
+ "Omegatitlocyrillic;047C",
+ "omegatitlocyrillic;047D",
+ "Otcyrillic;047E",
+ "otcyrillic;047F",
+ "Koppacyrillic;0480",
+ "koppacyrillic;0481",
+ "thousandcyrillic;0482",
+ "titlocyrilliccmb;0483",
+ "palatalizationcyrilliccmb;0484",
+ "dasiapneumatacyrilliccmb;0485",
+ "psilipneumatacyrilliccmb;0486",
+ "Geupturn;0490",
+ "Gheupturncyrillic;0490",
+ "afii10050;0490",
+ "geupturn;0491",
+ "gheupturncyrillic;0491",
+ "afii10098;0491",
+ "Gebar;0492",
+ "Ghestrokecyrillic;0492",
+ "gebar;0493",
+ "ghestrokecyrillic;0493",
+ "Gehook;0494",
+ "Ghemiddlehookcyrillic;0494",
+ "gehook;0495",
+ "ghemiddlehookcyrillic;0495",
+ "Zhedescendercyrillic;0496",
+ "Zhertdes;0496",
+ "zhedescendercyrillic;0497",
+ "zhertdes;0497",
+ "Zecedilla;0498",
+ "Zedescendercyrillic;0498",
+ "zedescendercyrillic;0499",
+ "Kadescendercyrillic;049A",
+ "Kartdes;049A",
+ "kadescendercyrillic;049B",
+ "kartdes;049B",
+ "Kavertbar;049C",
+ "Kaverticalstrokecyrillic;049C",
+ "kavertbar;049D",
+ "kaverticalstrokecyrillic;049D",
+ "Kabar;049E",
+ "Kastrokecyrillic;049E",
+ "kabar;049F",
+ "kastrokecyrillic;049F",
+ "GeKarev;04A0",
+ "Kabashkircyrillic;04A0",
+ "gekarev;04A1",
+ "kabashkircyrillic;04A1",
+ "Endescendercyrillic;04A2",
+ "Enrtdes;04A2",
+ "endescendercyrillic;04A3",
+ "enrtdes;04A3",
+ "EnGe;04A4",
+ "Enghecyrillic;04A4",
+ "enge;04A5",
+ "enghecyrillic;04A5",
+ "Pehook;04A6",
+ "Pemiddlehookcyrillic;04A6",
+ "pehook;04A7",
+ "pemiddlehookcyrillic;04A7",
+ "Haabkhasiancyrillic;04A8",
+ "Ohook;04A8",
+ "haabkhasiancyrillic;04A9",
+ "ohook;04A9",
+ "Escedilla;04AA",
+ "Esdescendercyrillic;04AA",
+ "escedilla;04AB",
+ "esdescendercyrillic;04AB",
+ "Tedescendercyrillic;04AC",
+ "Tertdes;04AC",
+ "tedescendercyrillic;04AD",
+ "tertdes;04AD",
+ "Ustraightcyrillic;04AE",
+ "Ustrt;04AE",
+ "ustraightcyrillic;04AF",
+ "ustrt;04AF",
+ "Ustraightstrokecyrillic;04B0",
+ "Ustrtbar;04B0",
+ "ustraightstrokecyrillic;04B1",
+ "ustrtbar;04B1",
+ "Hadescendercyrillic;04B2",
+ "Khartdes;04B2",
+ "hadescendercyrillic;04B3",
+ "khartdes;04B3",
+ "TeTse;04B4",
+ "Tetsecyrillic;04B4",
+ "tetse;04B5",
+ "tetsecyrillic;04B5",
+ "Chedescendercyrillic;04B6",
+ "Chertdes;04B6",
+ "chedescendercyrillic;04B7",
+ "chertdes;04B7",
+ "Chevertbar;04B8",
+ "Cheverticalstrokecyrillic;04B8",
+ "chevertbar;04B9",
+ "cheverticalstrokecyrillic;04B9",
+ "Hcyril;04BA",
+ "Shhacyrillic;04BA",
+ "hcyril;04BB",
+ "shhacyrillic;04BB",
+ "Cheabkhasiancyrillic;04BC",
+ "Iehook;04BC",
+ "cheabkhasiancyrillic;04BD",
+ "iehook;04BD",
+ "Chedescenderabkhasiancyrillic;04BE",
+ "Iehookogonek;04BE",
+ "chedescenderabkhasiancyrillic;04BF",
+ "iehookogonek;04BF",
+ "Icyril1;04C0",
+ "palochkacyrillic;04C0",
+ "Zhebreve;04C1",
+ "Zhebrevecyrillic;04C1",
+ "zhebreve;04C2",
+ "zhebrevecyrillic;04C2",
+ "Kahook;04C3",
+ "Kahookcyrillic;04C3",
+ "kahook;04C4",
+ "kahookcyrillic;04C4",
+ "Enhook;04C7",
+ "Enhookcyrillic;04C7",
+ "enhook;04C8",
+ "enhookcyrillic;04C8",
+ "Chekhakassiancyrillic;04CB",
+ "Cheleftdes;04CB",
+ "chekhakassiancyrillic;04CC",
+ "cheleftdes;04CC",
+ "Abrevecyrillic;04D0",
+ "abrevecyrillic;04D1",
+ "Adieresiscyrillic;04D2",
+ "adieresiscyrillic;04D3",
+ "Aiecyrillic;04D4",
+ "aiecyrillic;04D5",
+ "Iebrevecyrillic;04D6",
+ "iebrevecyrillic;04D7",
+ "Schwacyrillic;04D8",
+ "schwacyrillic;04D9",
+ "afii10846;04D9",
+ "Schwadieresiscyrillic;04DA",
+ "schwadieresiscyrillic;04DB",
+ "Zhedieresiscyrillic;04DC",
+ "zhedieresiscyrillic;04DD",
+ "Zedieresiscyrillic;04DE",
+ "zedieresiscyrillic;04DF",
+ "Dzeabkhasiancyrillic;04E0",
+ "dzeabkhasiancyrillic;04E1",
+ "Imacroncyrillic;04E2",
+ "imacroncyrillic;04E3",
+ "Idieresiscyrillic;04E4",
+ "idieresiscyrillic;04E5",
+ "Odieresiscyrillic;04E6",
+ "odieresiscyrillic;04E7",
+ "Obarredcyrillic;04E8",
+ "obarredcyrillic;04E9",
+ "Obarreddieresiscyrillic;04EA",
+ "obarreddieresiscyrillic;04EB",
+ "Umacroncyrillic;04EE",
+ "umacroncyrillic;04EF",
+ "Udieresiscyrillic;04F0",
+ "udieresiscyrillic;04F1",
+ "Uhungarumlautcyrillic;04F2",
+ "uhungarumlautcyrillic;04F3",
+ "Chedieresiscyrillic;04F4",
+ "chedieresiscyrillic;04F5",
+ "Yerudieresiscyrillic;04F8",
+ "yerudieresiscyrillic;04F9",
+ "Aybarmenian;0531",
+ "Benarmenian;0532",
+ "Gimarmenian;0533",
+ "Echarmenian;0535",
+ "Zaarmenian;0536",
+ "Eharmenian;0537",
+ "Etarmenian;0538",
+ "Toarmenian;0539",
+ "Zhearmenian;053A",
+ "Iniarmenian;053B",
+ "Liwnarmenian;053C",
+ "Xeharmenian;053D",
+ "Caarmenian;053E",
+ "Kenarmenian;053F",
+ "Hoarmenian;0540",
+ "Jaarmenian;0541",
+ "Ghadarmenian;0542",
+ "Cheharmenian;0543",
+ "Menarmenian;0544",
+ "Yiarmenian;0545",
+ "Nowarmenian;0546",
+ "Shaarmenian;0547",
+ "Voarmenian;0548",
+ "Chaarmenian;0549",
+ "Peharmenian;054A",
+ "Jheharmenian;054B",
+ "Raarmenian;054C",
+ "Vewarmenian;054E",
+ "Tiwnarmenian;054F",
+ "Reharmenian;0550",
+ "Coarmenian;0551",
+ "Yiwnarmenian;0552",
+ "Piwrarmenian;0553",
+ "Keharmenian;0554",
+ "Oharmenian;0555",
+ "Feharmenian;0556",
+ "ringhalfleftarmenian;0559",
+ "apostrophearmenian;055A",
+ "emphasismarkarmenian;055B",
+ "exclamarmenian;055C",
+ "commaarmenian;055D",
+ "questionarmenian;055E",
+ "abbreviationmarkarmenian;055F",
+ "aybarmenian;0561",
+ "benarmenian;0562",
+ "gimarmenian;0563",
+ "daarmenian;0564",
+ "echarmenian;0565",
+ "zaarmenian;0566",
+ "eharmenian;0567",
+ "etarmenian;0568",
+ "toarmenian;0569",
+ "zhearmenian;056A",
+ "iniarmenian;056B",
+ "liwnarmenian;056C",
+ "xeharmenian;056D",
+ "caarmenian;056E",
+ "kenarmenian;056F",
+ "hoarmenian;0570",
+ "jaarmenian;0571",
+ "ghadarmenian;0572",
+ "cheharmenian;0573",
+ "menarmenian;0574",
+ "yiarmenian;0575",
+ "nowarmenian;0576",
+ "shaarmenian;0577",
+ "voarmenian;0578",
+ "chaarmenian;0579",
+ "peharmenian;057A",
+ "jheharmenian;057B",
+ "raarmenian;057C",
+ "seharmenian;057D",
+ "vewarmenian;057E",
+ "tiwnarmenian;057F",
+ "reharmenian;0580",
+ "coarmenian;0581",
+ "yiwnarmenian;0582",
+ "piwrarmenian;0583",
+ "keharmenian;0584",
+ "oharmenian;0585",
+ "feharmenian;0586",
+ "echyiwnarmenian;0587",
+ "periodarmenian;0589",
+ ";058A",
+ "etnahtafoukhhebrew;0591",
+ "etnahtafoukhlefthebrew;0591",
+ "etnahtahebrew;0591",
+ "etnahtalefthebrew;0591",
+ "segoltahebrew;0592",
+ "zaqefqatanhebrew;0594",
+ "zaqefgadolhebrew;0595",
+ "tipehahebrew;0596",
+ "tipehalefthebrew;0596",
+ "reviahebrew;0597",
+ "reviamugrashhebrew;0597",
+ "pashtahebrew;0599",
+ "yetivhebrew;059A",
+ "tevirhebrew;059B",
+ "tevirlefthebrew;059B",
+ "gereshaccenthebrew;059C",
+ "gereshmuqdamhebrew;059D",
+ "gershayimaccenthebrew;059E",
+ "qarneyparahebrew;059F",
+ "telishagedolahebrew;05A0",
+ "pazerhebrew;05A1",
+ "munahhebrew;05A3",
+ "munahlefthebrew;05A3",
+ "mahapakhhebrew;05A4",
+ "mahapakhlefthebrew;05A4",
+ "merkhahebrew;05A5",
+ "merkhalefthebrew;05A5",
+ "merkhakefulahebrew;05A6",
+ "merkhakefulalefthebrew;05A6",
+ "dargahebrew;05A7",
+ "dargalefthebrew;05A7",
+ "qadmahebrew;05A8",
+ "telishaqetanahebrew;05A9",
+ "yerahbenyomohebrew;05AA",
+ "yerahbenyomolefthebrew;05AA",
+ "olehebrew;05AB",
+ "iluyhebrew;05AC",
+ "dehihebrew;05AD",
+ "zinorhebrew;05AE",
+ "masoracirclehebrew;05AF",
+ "sheva;05B0",
+ "sheva115;05B0",
+ "sheva15;05B0",
+ "sheva22;05B0",
+ "sheva2e;05B0",
+ "shevahebrew;05B0",
+ "shevanarrowhebrew;05B0",
+ "shevaquarterhebrew;05B0",
+ "shevawidehebrew;05B0",
+ "afii57799;05B0",
+ "hatafsegol;05B1",
+ "hatafsegol17;05B1",
+ "hatafsegol24;05B1",
+ "hatafsegol30;05B1",
+ "hatafsegolhebrew;05B1",
+ "hatafsegolnarrowhebrew;05B1",
+ "hatafsegolquarterhebrew;05B1",
+ "hatafsegolwidehebrew;05B1",
+ "afii57801;05B1",
+ "hatafpatah;05B2",
+ "hatafpatah16;05B2",
+ "hatafpatah23;05B2",
+ "hatafpatah2f;05B2",
+ "hatafpatahhebrew;05B2",
+ "hatafpatahnarrowhebrew;05B2",
+ "hatafpatahquarterhebrew;05B2",
+ "hatafpatahwidehebrew;05B2",
+ "afii57800;05B2",
+ "hatafqamats;05B3",
+ "hatafqamats1b;05B3",
+ "hatafqamats28;05B3",
+ "hatafqamats34;05B3",
+ "hatafqamatshebrew;05B3",
+ "hatafqamatsnarrowhebrew;05B3",
+ "hatafqamatsquarterhebrew;05B3",
+ "hatafqamatswidehebrew;05B3",
+ "afii57802;05B3",
+ "hiriq;05B4",
+ "hiriq14;05B4",
+ "hiriq21;05B4",
+ "hiriq2d;05B4",
+ "hiriqhebrew;05B4",
+ "hiriqnarrowhebrew;05B4",
+ "hiriqquarterhebrew;05B4",
+ "hiriqwidehebrew;05B4",
+ "afii57793;05B4",
+ "tsere;05B5",
+ "tsere12;05B5",
+ "tsere1e;05B5",
+ "tsere2b;05B5",
+ "tserehebrew;05B5",
+ "tserenarrowhebrew;05B5",
+ "tserequarterhebrew;05B5",
+ "tserewidehebrew;05B5",
+ "afii57794;05B5",
+ "segol;05B6",
+ "segol13;05B6",
+ "segol1f;05B6",
+ "segol2c;05B6",
+ "segolhebrew;05B6",
+ "segolnarrowhebrew;05B6",
+ "segolquarterhebrew;05B6",
+ "segolwidehebrew;05B6",
+ "afii57795;05B6",
+ "patah;05B7",
+ "patah11;05B7",
+ "patah1d;05B7",
+ "patah2a;05B7",
+ "patahhebrew;05B7",
+ "patahnarrowhebrew;05B7",
+ "patahquarterhebrew;05B7",
+ "patahwidehebrew;05B7",
+ "afii57798;05B7",
+ "qamats;05B8",
+ "qamats10;05B8",
+ "qamats1a;05B8",
+ "qamats1c;05B8",
+ "qamats27;05B8",
+ "qamats29;05B8",
+ "qamats33;05B8",
+ "qamatsde;05B8",
+ "qamatshebrew;05B8",
+ "qamatsnarrowhebrew;05B8",
+ "qamatsqatanhebrew;05B8",
+ "qamatsqatannarrowhebrew;05B8",
+ "qamatsqatanquarterhebrew;05B8",
+ "qamatsqatanwidehebrew;05B8",
+ "qamatsquarterhebrew;05B8",
+ "qamatswidehebrew;05B8",
+ "afii57797;05B8",
+ "holam;05B9",
+ "holam19;05B9",
+ "holam26;05B9",
+ "holam32;05B9",
+ "holamhebrew;05B9",
+ "holamnarrowhebrew;05B9",
+ "holamquarterhebrew;05B9",
+ "holamwidehebrew;05B9",
+ "afii57806;05B9",
+ "qubuts;05BB",
+ "qubuts18;05BB",
+ "qubuts25;05BB",
+ "qubuts31;05BB",
+ "qubutshebrew;05BB",
+ "qubutsnarrowhebrew;05BB",
+ "qubutsquarterhebrew;05BB",
+ "qubutswidehebrew;05BB",
+ "afii57796;05BB",
+ "dagesh;05BC",
+ "dageshhebrew;05BC",
+ "c24210;05BC",
+ "afii57807;05BC",
+ "meteg;05BD",
+ "siluqhebrew;05BD",
+ "siluqlefthebrew;05BD",
+ "afii57839;05BD",
+ "maqaf;05BE",
+ "maqafhebrew;05BE",
+ "afii57645;05BE",
+ "rafe;05BF",
+ "rafehebrew;05BF",
+ "afii57841;05BF",
+ "afii67842;05C0",
+ "paseq;05C0",
+ "paseqhebrew;05C0",
+ "afii57842;05C0",
+ "shindot;05C1",
+ "shindothebrew;05C1",
+ "afii57804;05C1",
+ "sindot;05C2",
+ "sindothebrew;05C2",
+ "afii57803;05C2",
+ "sofpasuq;05C3",
+ "sofpasuqhebrew;05C3",
+ "afii57658;05C3",
+ "upperdothebrew;05C4",
+ "alef;05D0",
+ "alefhebrew;05D0",
+ "afii57664;05D0",
+ "bet;05D1",
+ "bethebrew;05D1",
+ "afii57665;05D1",
+ "gimel;05D2",
+ "gimelhebrew;05D2",
+ "afii57666;05D2",
+ "dalet;05D3",
+ "dalethebrew;05D3",
+ "afii57667;05D3",
+ "he;05D4",
+ "hehebrew;05D4",
+ "afii57668;05D4",
+ "vavhebrew;05D5",
+ "afii57669;05D5",
+ "zayin;05D6",
+ "zayinhebrew;05D6",
+ "afii57670;05D6",
+ "het;05D7",
+ "hethebrew;05D7",
+ "afii57671;05D7",
+ "tet;05D8",
+ "tethebrew;05D8",
+ "afii57672;05D8",
+ "yod;05D9",
+ "yodhebrew;05D9",
+ "afii57673;05D9",
+ "finalkaf;05DA",
+ "finalkafhebrew;05DA",
+ "kaffinal;05DA",
+ "afii57674;05DA",
+ "kaf;05DB",
+ "kafhebrew;05DB",
+ "afii57675;05DB",
+ "lamed;05DC",
+ "lamedhebrew;05DC",
+ "afii57676;05DC",
+ "finalmem;05DD",
+ "finalmemhebrew;05DD",
+ "memfinal;05DD",
+ "afii57677;05DD",
+ "mem;05DE",
+ "memhebrew;05DE",
+ "afii57678;05DE",
+ "finalnun;05DF",
+ "finalnunhebrew;05DF",
+ "nunfinal;05DF",
+ "afii57679;05DF",
+ "nun;05E0",
+ "nunhebrew;05E0",
+ "afii57680;05E0",
+ "samekh;05E1",
+ "samekhhebrew;05E1",
+ "afii57681;05E1",
+ "ayin;05E2",
+ "ayinhebrew;05E2",
+ "afii57682;05E2",
+ "finalpe;05E3",
+ "finalpehebrew;05E3",
+ "pefinal;05E3",
+ "afii57683;05E3",
+ "pe;05E4",
+ "pehebrew;05E4",
+ "afii57684;05E4",
+ "finaltsadi;05E5",
+ "finaltsadihebrew;05E5",
+ "tsadifinal;05E5",
+ "afii57685;05E5",
+ "tsadi;05E6",
+ "tsadihebrew;05E6",
+ "afii57686;05E6",
+ "qof;05E7",
+ "qofhebrew;05E7",
+ "afii57687;05E7",
+ "resh;05E8",
+ "reshhebrew;05E8",
+ "afii57688;05E8",
+ "shin;05E9",
+ "shinhebrew;05E9",
+ "afii57689;05E9",
+ "tav;05EA",
+ "tavhebrew;05EA",
+ "afii57690;05EA",
+ "vavdbl;05F0",
+ "vavvavhebrew;05F0",
+ "afii57716;05F0",
+ "vavyod;05F1",
+ "vavyodhebrew;05F1",
+ "afii57717;05F1",
+ "yoddbl;05F2",
+ "yodyodhebrew;05F2",
+ "afii57718;05F2",
+ "geresh;05F3",
+ "gereshhebrew;05F3",
+ "gershayim;05F4",
+ "gershayimhebrew;05F4",
+ "c19466;060C",
+ "commaarabic;060C",
+ "afii57388;060C",
+ "c19467;061B",
+ "semicolonarabic;061B",
+ "afii57403;061B",
+ "c19470;061F",
+ "questionarabic;061F",
+ "afii57407;061F",
+ "hamzaarabic;0621",
+ "hamzalowarabic;0621",
+ "afii57409;0621",
+ "alefmaddaabovearabic;0622",
+ "c19542;0622",
+ "afii57410;0622",
+ "alefhamzaabovearabic;0623",
+ "c19446;0623",
+ "afii57411;0623",
+ "wawhamzaabovearabic;0624",
+ "afii57412;0624",
+ "alefhamzabelowarabic;0625",
+ "c19447;0625",
+ "afii57413;0625",
+ "yehhamzaabovearabic;0626",
+ "afii57414;0626",
+ "alefarabic;0627",
+ "c19379;0627",
+ "afii57415;0627",
+ "beharabic;0628",
+ "c19381;0628",
+ "afii57416;0628",
+ "c19443;0629",
+ "tehmarbutaarabic;0629",
+ "afii57417;0629",
+ "c19383;062A",
+ "teharabic;062A",
+ "afii57418;062A",
+ "c19385;062B",
+ "theharabic;062B",
+ "afii57419;062B",
+ "c19388;062C",
+ "jeemarabic;062C",
+ "afii57420;062C",
+ "c19391;062D",
+ "haharabic;062D",
+ "afii57421;062D",
+ "c19394;062E",
+ "khaharabic;062E",
+ "afii57422;062E",
+ "c19395;062F",
+ "dalarabic;062F",
+ "afii57423;062F",
+ "c19396;0630",
+ "thalarabic;0630",
+ "afii57424;0630",
+ "c19397;0631",
+ "reharabic;0631",
+ "afii57425;0631",
+ "c19398;0632",
+ "afii57426;0632",
+ "c19400;0633",
+ "seenarabic;0633",
+ "afii57427;0633",
+ "c19402;0634",
+ "sheenarabic;0634",
+ "afii57428;0634",
+ "c19404;0635",
+ "sadarabic;0635",
+ "afii57429;0635",
+ "c19406;0636",
+ "dadarabic;0636",
+ "afii57430;0636",
+ "c19407;0637",
+ "taharabic;0637",
+ "afii57431;0637",
+ "c19408;0638",
+ "zaharabic;0638",
+ "afii57432;0638",
+ "ainarabic;0639",
+ "afii57433;0639",
+ "ghainarabic;063A",
+ "afii57434;063A",
+ "c20156;0640",
+ "kashidaautoarabic;0640",
+ "kashidaautonosidebearingarabic;0640",
+ "tatweelarabic;0640",
+ "afii57440;0640",
+ "c19420;0641",
+ "feharabic;0641",
+ "afii57441;0641",
+ "c19423;0642",
+ "qafarabic;0642",
+ "afii57442;0642",
+ "c19425;0643",
+ "kafarabic;0643",
+ "afii57443;0643",
+ "c19427;0644",
+ "lamarabic;0644",
+ "afii57444;0644",
+ "c19429;0645",
+ "meemarabic;0645",
+ "afii57445;0645",
+ "c19431;0646",
+ "noonarabic;0646",
+ "afii57446;0646",
+ "c19435;0647",
+ "heharabic;0647",
+ "afii57470;0647",
+ "c19436;0648",
+ "wawarabic;0648",
+ "afii57448;0648",
+ "alefmaksuraarabic;0649",
+ "c19441;0649",
+ "afii57449;0649",
+ "c19439;064A",
+ "yeharabic;064A",
+ "afii57450;064A",
+ "fathatanarabic;064B",
+ "afii57451;064B",
+ "dammatanaltonearabic;064C",
+ "dammatanarabic;064C",
+ "afii57452;064C",
+ "kasratanarabic;064D",
+ "afii57453;064D",
+ "fathaarabic;064E",
+ "fathalowarabic;064E",
+ "afii57454;064E",
+ "dammaarabic;064F",
+ "dammalowarabic;064F",
+ "afii57455;064F",
+ "kasraarabic;0650",
+ "afii57456;0650",
+ "shaddaarabic;0651",
+ "afii57457;0651",
+ "sukunarabic;0652",
+ "afii57458;0652",
+ "c19463;0660",
+ "zeroarabic;0660",
+ "afii57392;0660",
+ "c19454;0661",
+ "onearabic;0661",
+ "onehackarabic;0661",
+ "afii57393;0661",
+ "c19455;0662",
+ "twoarabic;0662",
+ "twohackarabic;0662",
+ "afii57394;0662",
+ "c19456;0663",
+ "threearabic;0663",
+ "threehackarabic;0663",
+ "afii57395;0663",
+ "c19457;0664",
+ "fourarabic;0664",
+ "fourhackarabic;0664",
+ "afii57396;0664",
+ "c19458;0665",
+ "fivearabic;0665",
+ "fivehackarabic;0665",
+ "afii57397;0665",
+ "c19459;0666",
+ "sixarabic;0666",
+ "sixhackarabic;0666",
+ "afii57398;0666",
+ "c19460;0667",
+ "sevenarabic;0667",
+ "sevenhackarabic;0667",
+ "afii57399;0667",
+ "c19461;0668",
+ "eightarabic;0668",
+ "eighthackarabic;0668",
+ "afii57400;0668",
+ "c19462;0669",
+ "ninearabic;0669",
+ "ninehackarabic;0669",
+ "afii57401;0669",
+ "c19464;066A",
+ "percentarabic;066A",
+ "afii57381;066A",
+ "decimalseparatorarabic;066B",
+ "decimalseparatorpersian;066B",
+ "c21121;066C",
+ "thousandsseparatorarabic;066C",
+ "thousandsseparatorpersian;066C",
+ "asteriskaltonearabic;066D",
+ "asteriskarabic;066D",
+ "afii63167;066D",
+ "tteharabic;0679",
+ "afii57511;0679",
+ "peharabic;067E",
+ "afii57506;067E",
+ "tcheharabic;0686",
+ "afii57507;0686",
+ "ddalarabic;0688",
+ "afii57512;0688",
+ "rreharabic;0691",
+ "afii57513;0691",
+ "jeharabic;0698",
+ "afii57508;0698",
+ "veharabic;06A4",
+ "afii57505;06A4",
+ "gafarabic;06AF",
+ "afii57509;06AF",
+ "noonghunnaarabic;06BA",
+ "afii57514;06BA",
+ "haaltonearabic;06C1",
+ "hehaltonearabic;06C1",
+ "yehthreedotsbelowarabic;06D1",
+ "yehbarreearabic;06D2",
+ "afii57519;06D2",
+ "afii57534;06D5",
+ "zeropersian;06F0",
+ "onepersian;06F1",
+ "twopersian;06F2",
+ "threepersian;06F3",
+ "fourpersian;06F4",
+ "fivepersian;06F5",
+ "sixpersian;06F6",
+ "sevenpersian;06F7",
+ "eightpersian;06F8",
+ "ninepersian;06F9",
+ "candrabindudeva;0901",
+ "anusvaradeva;0902",
+ "visargadeva;0903",
+ "adeva;0905",
+ "aadeva;0906",
+ "ideva;0907",
+ "iideva;0908",
+ "udeva;0909",
+ "uudeva;090A",
+ "rvocalicdeva;090B",
+ "ecandradeva;090D",
+ "eshortdeva;090E",
+ "edeva;090F",
+ "aideva;0910",
+ "ocandradeva;0911",
+ "oshortdeva;0912",
+ "odeva;0913",
+ "audeva;0914",
+ "kadeva;0915",
+ "khadeva;0916",
+ "gadeva;0917",
+ "ghadeva;0918",
+ "ngadeva;0919",
+ "cadeva;091A",
+ "chadeva;091B",
+ "jadeva;091C",
+ "jhadeva;091D",
+ "nyadeva;091E",
+ "ttadeva;091F",
+ "tthadeva;0920",
+ "ddadeva;0921",
+ "ddhadeva;0922",
+ "nnadeva;0923",
+ "tadeva;0924",
+ "thadeva;0925",
+ "dadeva;0926",
+ "dhadeva;0927",
+ "nadeva;0928",
+ "nnnadeva;0929",
+ "padeva;092A",
+ "phadeva;092B",
+ "badeva;092C",
+ "bhadeva;092D",
+ "madeva;092E",
+ "yadeva;092F",
+ "radeva;0930",
+ "rradeva;0931",
+ "ladeva;0932",
+ "lladeva;0933",
+ "llladeva;0934",
+ "vadeva;0935",
+ "shadeva;0936",
+ "ssadeva;0937",
+ "sadeva;0938",
+ "hadeva;0939",
+ "nuktadeva;093C",
+ "avagrahadeva;093D",
+ "aavowelsigndeva;093E",
+ "ivowelsigndeva;093F",
+ "iivowelsigndeva;0940",
+ "uvowelsigndeva;0941",
+ "uuvowelsigndeva;0942",
+ "rvocalicvowelsigndeva;0943",
+ "rrvocalicvowelsigndeva;0944",
+ "ecandravowelsigndeva;0945",
+ "eshortvowelsigndeva;0946",
+ "aivowelsigndeva;0948",
+ "ocandravowelsigndeva;0949",
+ "oshortvowelsigndeva;094A",
+ "ovowelsigndeva;094B",
+ "viramadeva;094D",
+ "omdeva;0950",
+ "udattadeva;0951",
+ "anudattadeva;0952",
+ "gravedeva;0953",
+ "acutedeva;0954",
+ "qadeva;0958",
+ "khhadeva;0959",
+ "ghhadeva;095A",
+ "zadeva;095B",
+ "dddhadeva;095C",
+ "rhadeva;095D",
+ "fadeva;095E",
+ "yyadeva;095F",
+ "rrvocalicdeva;0960",
+ "llvocalicdeva;0961",
+ "lvocalicvowelsigndeva;0962",
+ "llvocalicvowelsigndeva;0963",
+ "danda;0964",
+ "dbldanda;0965",
+ "zerodeva;0966",
+ "onedeva;0967",
+ "twodeva;0968",
+ "threedeva;0969",
+ "fourdeva;096A",
+ "fivedeva;096B",
+ "sixdeva;096C",
+ "sevendeva;096D",
+ "eightdeva;096E",
+ "ninedeva;096F",
+ "abbreviationsigndeva;0970",
+ "candrabindubengali;0981",
+ "anusvarabengali;0982",
+ "visargabengali;0983",
+ "abengali;0985",
+ "aabengali;0986",
+ "ibengali;0987",
+ "iibengali;0988",
+ "ubengali;0989",
+ "uubengali;098A",
+ "rvocalicbengali;098B",
+ "lvocalicbengali;098C",
+ "ebengali;098F",
+ "aibengali;0990",
+ "obengali;0993",
+ "aubengali;0994",
+ "kabengali;0995",
+ "khabengali;0996",
+ "gabengali;0997",
+ "ghabengali;0998",
+ "ngabengali;0999",
+ "cabengali;099A",
+ "chabengali;099B",
+ "jabengali;099C",
+ "jhabengali;099D",
+ "nyabengali;099E",
+ "ttabengali;099F",
+ "tthabengali;09A0",
+ "ddabengali;09A1",
+ "ddhabengali;09A2",
+ "nnabengali;09A3",
+ "tabengali;09A4",
+ "thabengali;09A5",
+ "dabengali;09A6",
+ "dhabengali;09A7",
+ "nabengali;09A8",
+ "pabengali;09AA",
+ "phabengali;09AB",
+ "babengali;09AC",
+ "bhabengali;09AD",
+ "mabengali;09AE",
+ "yabengali;09AF",
+ "rabengali;09B0",
+ "labengali;09B2",
+ "shabengali;09B6",
+ "ssabengali;09B7",
+ "sabengali;09B8",
+ "habengali;09B9",
+ "nuktabengali;09BC",
+ "aavowelsignbengali;09BE",
+ "ivowelsignbengali;09BF",
+ "uvowelsignbengali;09C1",
+ "uuvowelsignbengali;09C2",
+ "rvocalicvowelsignbengali;09C3",
+ "rrvocalicvowelsignbengali;09C4",
+ "evowelsignbengali;09C7",
+ "aivowelsignbengali;09C8",
+ "ovowelsignbengali;09CB",
+ "auvowelsignbengali;09CC",
+ "viramabengali;09CD",
+ "aulengthmarkbengali;09D7",
+ "rrabengali;09DC",
+ "rhabengali;09DD",
+ "yyabengali;09DF",
+ "rrvocalicbengali;09E0",
+ "llvocalicbengali;09E1",
+ "lvocalicvowelsignbengali;09E2",
+ "llvocalicvowelsignbengali;09E3",
+ "zerobengali;09E6",
+ "onebengali;09E7",
+ "twobengali;09E8",
+ "threebengali;09E9",
+ "fourbengali;09EA",
+ "fivebengali;09EB",
+ "sixbengali;09EC",
+ "sevenbengali;09ED",
+ "eightbengali;09EE",
+ "ninebengali;09EF",
+ "ramiddlediagonalbengali;09F0",
+ "ralowerdiagonalbengali;09F1",
+ "rupeemarkbengali;09F2",
+ "rupeesignbengali;09F3",
+ "onenumeratorbengali;09F4",
+ "twonumeratorbengali;09F5",
+ "threenumeratorbengali;09F6",
+ "fournumeratorbengali;09F7",
+ "denominatorminusonenumeratorbengali;09F8",
+ "sixteencurrencydenominatorbengali;09F9",
+ "issharbengali;09FA",
+ "bindigurmukhi;0A02",
+ "agurmukhi;0A05",
+ "aagurmukhi;0A06",
+ "igurmukhi;0A07",
+ "iigurmukhi;0A08",
+ "ugurmukhi;0A09",
+ "uugurmukhi;0A0A",
+ "eegurmukhi;0A0F",
+ "aigurmukhi;0A10",
+ "oogurmukhi;0A13",
+ "augurmukhi;0A14",
+ "kagurmukhi;0A15",
+ "khagurmukhi;0A16",
+ "gagurmukhi;0A17",
+ "ghagurmukhi;0A18",
+ "ngagurmukhi;0A19",
+ "cagurmukhi;0A1A",
+ "chagurmukhi;0A1B",
+ "jagurmukhi;0A1C",
+ "jhagurmukhi;0A1D",
+ "nyagurmukhi;0A1E",
+ "ttagurmukhi;0A1F",
+ "tthagurmukhi;0A20",
+ "ddagurmukhi;0A21",
+ "ddhagurmukhi;0A22",
+ "nnagurmukhi;0A23",
+ "tagurmukhi;0A24",
+ "thagurmukhi;0A25",
+ "dagurmukhi;0A26",
+ "dhagurmukhi;0A27",
+ "nagurmukhi;0A28",
+ "pagurmukhi;0A2A",
+ "phagurmukhi;0A2B",
+ "bagurmukhi;0A2C",
+ "bhagurmukhi;0A2D",
+ "magurmukhi;0A2E",
+ "yagurmukhi;0A2F",
+ "ragurmukhi;0A30",
+ "lagurmukhi;0A32",
+ "vagurmukhi;0A35",
+ "shagurmukhi;0A36",
+ "sagurmukhi;0A38",
+ "hagurmukhi;0A39",
+ "nuktagurmukhi;0A3C",
+ "aamatragurmukhi;0A3E",
+ "imatragurmukhi;0A3F",
+ "iimatragurmukhi;0A40",
+ "umatragurmukhi;0A41",
+ "uumatragurmukhi;0A42",
+ "eematragurmukhi;0A47",
+ "aimatragurmukhi;0A48",
+ "oomatragurmukhi;0A4B",
+ "aumatragurmukhi;0A4C",
+ "halantgurmukhi;0A4D",
+ "khhagurmukhi;0A59",
+ "ghhagurmukhi;0A5A",
+ "zagurmukhi;0A5B",
+ "rragurmukhi;0A5C",
+ "fagurmukhi;0A5E",
+ "zerogurmukhi;0A66",
+ "onegurmukhi;0A67",
+ "twogurmukhi;0A68",
+ "threegurmukhi;0A69",
+ "fourgurmukhi;0A6A",
+ "fivegurmukhi;0A6B",
+ "sixgurmukhi;0A6C",
+ "sevengurmukhi;0A6D",
+ "eightgurmukhi;0A6E",
+ "ninegurmukhi;0A6F",
+ "tippigurmukhi;0A70",
+ "addakgurmukhi;0A71",
+ "irigurmukhi;0A72",
+ "uragurmukhi;0A73",
+ "ekonkargurmukhi;0A74",
+ "candrabindugujarati;0A81",
+ "anusvaragujarati;0A82",
+ "visargagujarati;0A83",
+ "agujarati;0A85",
+ "aagujarati;0A86",
+ "igujarati;0A87",
+ "iigujarati;0A88",
+ "ugujarati;0A89",
+ "uugujarati;0A8A",
+ "rvocalicgujarati;0A8B",
+ "ecandragujarati;0A8D",
+ "egujarati;0A8F",
+ "aigujarati;0A90",
+ "ocandragujarati;0A91",
+ "ogujarati;0A93",
+ "augujarati;0A94",
+ "kagujarati;0A95",
+ "khagujarati;0A96",
+ "gagujarati;0A97",
+ "ghagujarati;0A98",
+ "ngagujarati;0A99",
+ "cagujarati;0A9A",
+ "chagujarati;0A9B",
+ "jagujarati;0A9C",
+ "jhagujarati;0A9D",
+ "nyagujarati;0A9E",
+ "ttagujarati;0A9F",
+ "tthagujarati;0AA0",
+ "ddagujarati;0AA1",
+ "ddhagujarati;0AA2",
+ "nnagujarati;0AA3",
+ "tagujarati;0AA4",
+ "thagujarati;0AA5",
+ "dagujarati;0AA6",
+ "dhagujarati;0AA7",
+ "nagujarati;0AA8",
+ "pagujarati;0AAA",
+ "phagujarati;0AAB",
+ "bagujarati;0AAC",
+ "bhagujarati;0AAD",
+ "magujarati;0AAE",
+ "yagujarati;0AAF",
+ "ragujarati;0AB0",
+ "lagujarati;0AB2",
+ "llagujarati;0AB3",
+ "vagujarati;0AB5",
+ "shagujarati;0AB6",
+ "ssagujarati;0AB7",
+ "sagujarati;0AB8",
+ "hagujarati;0AB9",
+ "nuktagujarati;0ABC",
+ "aavowelsigngujarati;0ABE",
+ "ivowelsigngujarati;0ABF",
+ "iivowelsigngujarati;0AC0",
+ "uvowelsigngujarati;0AC1",
+ "uuvowelsigngujarati;0AC2",
+ "rvocalicvowelsigngujarati;0AC3",
+ "rrvocalicvowelsigngujarati;0AC4",
+ "ecandravowelsigngujarati;0AC5",
+ "evowelsigngujarati;0AC7",
+ "aivowelsigngujarati;0AC8",
+ "ocandravowelsigngujarati;0AC9",
+ "ovowelsigngujarati;0ACB",
+ "auvowelsigngujarati;0ACC",
+ "viramagujarati;0ACD",
+ "omgujarati;0AD0",
+ "rrvocalicgujarati;0AE0",
+ "zerogujarati;0AE6",
+ "onegujarati;0AE7",
+ "twogujarati;0AE8",
+ "threegujarati;0AE9",
+ "fourgujarati;0AEA",
+ "fivegujarati;0AEB",
+ "sixgujarati;0AEC",
+ "sevengujarati;0AED",
+ "eightgujarati;0AEE",
+ "ninegujarati;0AEF",
+ "afii59681;0E01",
+ "kokaithai;0E01",
+ "afii59682;0E02",
+ "khokhaithai;0E02",
+ "afii59683;0E03",
+ "khokhuatthai;0E03",
+ "afii59684;0E04",
+ "khokhwaithai;0E04",
+ "afii59685;0E05",
+ "khokhonthai;0E05",
+ "afii59686;0E06",
+ "khorakhangthai;0E06",
+ "afii59687;0E07",
+ "ngonguthai;0E07",
+ "afii59688;0E08",
+ "chochanthai;0E08",
+ "afii59689;0E09",
+ "chochingthai;0E09",
+ "afii59690;0E0A",
+ "chochangthai;0E0A",
+ "afii59691;0E0B",
+ "sosothai;0E0B",
+ "afii59692;0E0C",
+ "chochoethai;0E0C",
+ "afii59693;0E0D",
+ "yoyingthai;0E0D",
+ "afii59694;0E0E",
+ "dochadathai;0E0E",
+ "afii59695;0E0F",
+ "topatakthai;0E0F",
+ "afii59696;0E10",
+ "thothanthai;0E10",
+ "afii59697;0E11",
+ "thonangmonthothai;0E11",
+ "afii59698;0E12",
+ "thophuthaothai;0E12",
+ "afii59699;0E13",
+ "nonenthai;0E13",
+ "afii59700;0E14",
+ "dodekthai;0E14",
+ "afii59701;0E15",
+ "totaothai;0E15",
+ "afii59702;0E16",
+ "thothungthai;0E16",
+ "afii59703;0E17",
+ "thothahanthai;0E17",
+ "afii59704;0E18",
+ "thothongthai;0E18",
+ "afii59705;0E19",
+ "nonuthai;0E19",
+ "afii59706;0E1A",
+ "bobaimaithai;0E1A",
+ "afii59707;0E1B",
+ "poplathai;0E1B",
+ "afii59708;0E1C",
+ "phophungthai;0E1C",
+ "afii59709;0E1D",
+ "fofathai;0E1D",
+ "afii59710;0E1E",
+ "phophanthai;0E1E",
+ "afii59711;0E1F",
+ "fofanthai;0E1F",
+ "afii59712;0E20",
+ "phosamphaothai;0E20",
+ "afii59713;0E21",
+ "momathai;0E21",
+ "afii59714;0E22",
+ "yoyakthai;0E22",
+ "afii59715;0E23",
+ "roruathai;0E23",
+ "afii59716;0E24",
+ "ruthai;0E24",
+ "afii59717;0E25",
+ "lolingthai;0E25",
+ "afii59718;0E26",
+ "luthai;0E26",
+ "afii59719;0E27",
+ "wowaenthai;0E27",
+ "afii59720;0E28",
+ "sosalathai;0E28",
+ "afii59721;0E29",
+ "sorusithai;0E29",
+ "afii59722;0E2A",
+ "sosuathai;0E2A",
+ "afii59723;0E2B",
+ "hohipthai;0E2B",
+ "afii59724;0E2C",
+ "lochulathai;0E2C",
+ "afii59725;0E2D",
+ "oangthai;0E2D",
+ "afii59726;0E2E",
+ "honokhukthai;0E2E",
+ "afii59727;0E2F",
+ "paiyannoithai;0E2F",
+ "afii59728;0E30",
+ "saraathai;0E30",
+ "afii59729;0E31",
+ "maihanakatthai;0E31",
+ "afii59730;0E32",
+ "saraaathai;0E32",
+ "afii59731;0E33",
+ "saraamthai;0E33",
+ "afii59732;0E34",
+ "saraithai;0E34",
+ "afii59733;0E35",
+ "saraiithai;0E35",
+ "afii59734;0E36",
+ "sarauethai;0E36",
+ "afii59735;0E37",
+ "saraueethai;0E37",
+ "afii59736;0E38",
+ "sarauthai;0E38",
+ "afii59737;0E39",
+ "sarauuthai;0E39",
+ "afii59738;0E3A",
+ "phinthuthai;0E3A",
+ "afii59743;0E3F",
+ "bahtthai;0E3F",
+ "afii59744;0E40",
+ "saraethai;0E40",
+ "afii59745;0E41",
+ "saraaethai;0E41",
+ "afii59746;0E42",
+ "saraothai;0E42",
+ "afii59747;0E43",
+ "saraaimaimuanthai;0E43",
+ "afii59748;0E44",
+ "saraaimaimalaithai;0E44",
+ "afii59749;0E45",
+ "lakkhangyaothai;0E45",
+ "afii59750;0E46",
+ "maiyamokthai;0E46",
+ "afii59751;0E47",
+ "maitaikhuthai;0E47",
+ "afii59752;0E48",
+ "maiekthai;0E48",
+ "afii59753;0E49",
+ "maithothai;0E49",
+ "afii59754;0E4A",
+ "maitrithai;0E4A",
+ "afii59755;0E4B",
+ "maichattawathai;0E4B",
+ "afii59756;0E4C",
+ "thanthakhatthai;0E4C",
+ "afii59757;0E4D",
+ "nikhahitthai;0E4D",
+ "afii59758;0E4E",
+ "yamakkanthai;0E4E",
+ "afii59759;0E4F",
+ "fongmanthai;0E4F",
+ "afii59760;0E50",
+ "zerothai;0E50",
+ "afii59761;0E51",
+ "onethai;0E51",
+ "afii59762;0E52",
+ "twothai;0E52",
+ "afii59763;0E53",
+ "threethai;0E53",
+ "afii59764;0E54",
+ "fourthai;0E54",
+ "afii59765;0E55",
+ "fivethai;0E55",
+ "afii59766;0E56",
+ "sixthai;0E56",
+ "afii59767;0E57",
+ "seventhai;0E57",
+ "afii59768;0E58",
+ "eightthai;0E58",
+ "afii59769;0E59",
+ "ninethai;0E59",
+ "afii59770;0E5A",
+ "angkhankhuthai;0E5A",
+ "afii59771;0E5B",
+ "khomutthai;0E5B",
+ "Aringbelow;1E00",
+ "aringbelow;1E01",
+ "Bdotaccent;1E02",
+ "bdotaccent;1E03",
+ "Bdotbelow;1E04",
+ "bdotbelow;1E05",
+ "Blinebelow;1E06",
+ "blinebelow;1E07",
+ "Ccedillaacute;1E08",
+ "ccedillaacute;1E09",
+ "Ddotaccent;1E0A",
+ "ddotaccent;1E0B",
+ "Ddotbelow;1E0C",
+ "ddotbelow;1E0D",
+ "Dlinebelow;1E0E",
+ "dlinebelow;1E0F",
+ "Dcedilla;1E10",
+ "dcedilla;1E11",
+ "Dcircumflexbelow;1E12",
+ "dcircumflexbelow;1E13",
+ "Emacrongrave;1E14",
+ "emacrongrave;1E15",
+ "Emacronacute;1E16",
+ "emacronacute;1E17",
+ "Ecircumflexbelow;1E18",
+ "ecircumflexbelow;1E19",
+ "Etildebelow;1E1A",
+ "etildebelow;1E1B",
+ "Ecedillabreve;1E1C",
+ "ecedillabreve;1E1D",
+ "Fdotaccent;1E1E",
+ "fdotaccent;1E1F",
+ "Gmacron;1E20",
+ "gmacron;1E21",
+ "Hdotaccent;1E22",
+ "hdotaccent;1E23",
+ "Hdotbelow;1E24",
+ "hdotbelow;1E25",
+ "Hdieresis;1E26",
+ "hdieresis;1E27",
+ "Hcedilla;1E28",
+ "hcedilla;1E29",
+ "Hbrevebelow;1E2A",
+ "hbrevebelow;1E2B",
+ "Itildebelow;1E2C",
+ "itildebelow;1E2D",
+ "Idieresisacute;1E2E",
+ "idieresisacute;1E2F",
+ "Kacute;1E30",
+ "kacute;1E31",
+ "Kdotbelow;1E32",
+ "kdotbelow;1E33",
+ "Klinebelow;1E34",
+ "klinebelow;1E35",
+ "Ldotbelow;1E36",
+ "ldotbelow;1E37",
+ "Ldotbelowmacron;1E38",
+ "ldotbelowmacron;1E39",
+ "Llinebelow;1E3A",
+ "llinebelow;1E3B",
+ "Lcircumflexbelow;1E3C",
+ "lcircumflexbelow;1E3D",
+ "Macute;1E3E",
+ "macute;1E3F",
+ "Mdotaccent;1E40",
+ "mdotaccent;1E41",
+ "Mdotbelow;1E42",
+ "mdotbelow;1E43",
+ "Ndotaccent;1E44",
+ "ndotaccent;1E45",
+ "Ndotbelow;1E46",
+ "ndotbelow;1E47",
+ "Nlinebelow;1E48",
+ "nlinebelow;1E49",
+ "Ncircumflexbelow;1E4A",
+ "ncircumflexbelow;1E4B",
+ "Otildeacute;1E4C",
+ "otildeacute;1E4D",
+ "Otildedieresis;1E4E",
+ "otildedieresis;1E4F",
+ "Omacrongrave;1E50",
+ "omacrongrave;1E51",
+ "Omacronacute;1E52",
+ "omacronacute;1E53",
+ "Pacute;1E54",
+ "pacute;1E55",
+ "Pdotaccent;1E56",
+ "pdotaccent;1E57",
+ "rdotaccent;1E59",
+ "Rdotbelow;1E5A",
+ "rdotbelow;1E5B",
+ "Rdotbelowmacron;1E5C",
+ "rdotbelowmacron;1E5D",
+ "Rlinebelow;1E5E",
+ "rlinebelow;1E5F",
+ "Sdotaccent;1E60",
+ "sdotaccent;1E61",
+ "Sdotbelow;1E62",
+ "sdotbelow;1E63",
+ "Sacutedotaccent;1E64",
+ "sacutedotaccent;1E65",
+ "Scarondotaccent;1E66",
+ "scarondotaccent;1E67",
+ "Sdotbelowdotaccent;1E68",
+ "sdotbelowdotaccent;1E69",
+ "Tdotaccent;1E6A",
+ "tdotaccent;1E6B",
+ "Tdotbelow;1E6C",
+ "tdotbelow;1E6D",
+ "Tlinebelow;1E6E",
+ "tlinebelow;1E6F",
+ "Tcircumflexbelow;1E70",
+ "tcircumflexbelow;1E71",
+ "Udieresisbelow;1E72",
+ "udieresisbelow;1E73",
+ "Utildebelow;1E74",
+ "utildebelow;1E75",
+ "Ucircumflexbelow;1E76",
+ "ucircumflexbelow;1E77",
+ "Utildeacute;1E78",
+ "utildeacute;1E79",
+ "Umacrondieresis;1E7A",
+ "umacrondieresis;1E7B",
+ "Vtilde;1E7C",
+ "vtilde;1E7D",
+ "Vdotbelow;1E7E",
+ "vdotbelow;1E7F",
+ "Wgrave;1E80",
+ "wgrave;1E81",
+ "Wacute;1E82",
+ "wacute;1E83",
+ "Wdieresis;1E84",
+ "wdieresis;1E85",
+ "Wdotaccent;1E86",
+ "wdotaccent;1E87",
+ "Wdotbelow;1E88",
+ "wdotbelow;1E89",
+ "Xdotaccent;1E8A",
+ "xdotaccent;1E8B",
+ "Xdieresis;1E8C",
+ "xdieresis;1E8D",
+ "Ydotaccent;1E8E",
+ "ydotaccent;1E8F",
+ "Zcircumflex;1E90",
+ "zcircumflex;1E91",
+ "Zdotbelow;1E92",
+ "zdotbelow;1E93",
+ "Zlinebelow;1E94",
+ "zlinebelow;1E95",
+ "hlinebelow;1E96",
+ "tdieresis;1E97",
+ "wring;1E98",
+ "yring;1E99",
+ "arighthalfring;1E9A",
+ "slongdotaccent;1E9B",
+ "Adotbelow;1EA0",
+ "adotbelow;1EA1",
+ "Ahookabove;1EA2",
+ "ahookabove;1EA3",
+ "Acircumflexacute;1EA4",
+ "acircumflexacute;1EA5",
+ "Acircumflexgrave;1EA6",
+ "acircumflexgrave;1EA7",
+ "Acircumflexhookabove;1EA8",
+ "acircumflexhookabove;1EA9",
+ "Acircumflextilde;1EAA",
+ "acircumflextilde;1EAB",
+ "Acircumflexdotbelow;1EAC",
+ "acircumflexdotbelow;1EAD",
+ "Abreveacute;1EAE",
+ "abreveacute;1EAF",
+ "Abrevegrave;1EB0",
+ "abrevegrave;1EB1",
+ "Abrevehookabove;1EB2",
+ "abrevehookabove;1EB3",
+ "Abrevetilde;1EB4",
+ "abrevetilde;1EB5",
+ "Abrevedotbelow;1EB6",
+ "abrevedotbelow;1EB7",
+ "Edotbelow;1EB8",
+ "edotbelow;1EB9",
+ "Ehookabove;1EBA",
+ "ehookabove;1EBB",
+ "Etilde;1EBC",
+ "etilde;1EBD",
+ "Ecircumflexacute;1EBE",
+ "ecircumflexacute;1EBF",
+ "Ecircumflexgrave;1EC0",
+ "ecircumflexgrave;1EC1",
+ "Ecircumflexhookabove;1EC2",
+ "ecircumflexhookabove;1EC3",
+ "Ecircumflextilde;1EC4",
+ "ecircumflextilde;1EC5",
+ "Ecircumflexdotbelow;1EC6",
+ "ecircumflexdotbelow;1EC7",
+ "Ihookabove;1EC8",
+ "ihookabove;1EC9",
+ "Idotbelow;1ECA",
+ "idotbelow;1ECB",
+ "Odotbelow;1ECC",
+ "odotbelow;1ECD",
+ "Ohookabove;1ECE",
+ "ohookabove;1ECF",
+ "Ocircumflexacute;1ED0",
+ "ocircumflexacute;1ED1",
+ "Ocircumflexgrave;1ED2",
+ "ocircumflexgrave;1ED3",
+ "Ocircumflexhookabove;1ED4",
+ "ocircumflexhookabove;1ED5",
+ "Ocircumflextilde;1ED6",
+ "ocircumflextilde;1ED7",
+ "Ocircumflexdotbelow;1ED8",
+ "Ohornacute;1EDA",
+ "ohornacute;1EDB",
+ "Ohorngrave;1EDC",
+ "ohorngrave;1EDD",
+ "Ohornhookabove;1EDE",
+ "ohornhookabove;1EDF",
+ "Ohorntilde;1EE0",
+ "ohorntilde;1EE1",
+ "Ohorndotbelow;1EE2",
+ "ohorndotbelow;1EE3",
+ "Udotbelow;1EE4",
+ "udotbelow;1EE5",
+ "Uhookabove;1EE6",
+ "uhookabove;1EE7",
+ "Uhornacute;1EE8",
+ "uhornacute;1EE9",
+ "Uhorngrave;1EEA",
+ "uhorngrave;1EEB",
+ "Uhornhookabove;1EEC",
+ "uhornhookabove;1EED",
+ "Uhorntilde;1EEE",
+ "uhorntilde;1EEF",
+ "Uhorndotbelow;1EF0",
+ "uhorndotbelow;1EF1",
+ "Ygrave;1EF2",
+ "ygrave;1EF3",
+ "Ydotbelow;1EF4",
+ "ydotbelow;1EF5",
+ "Yhookabove;1EF6",
+ "yhookabove;1EF7",
+ "Ytilde;1EF8",
+ "ytilde;1EF9",
+ "enquad;2000",
+ "emquad;2001",
+ "enspace;2002",
+ "emspace;2003",
+ "threeperemspace;2004",
+ "fourperemspace;2005",
+ "sixperemspace;2006",
+ "figurespace;2007",
+ "punctuationspace;2008",
+ "thinspace;2009",
+ "hairspace;200A",
+ "zerospace;200B",
+ "zerowidthspace;200B",
+ "c24083;200C",
+ "zeronojoin;200C",
+ "zerowidthnonjoiner;200C",
+ "afii61664;200C",
+ "afii57598;200D",
+ "c24084;200D",
+ "zerojoin;200D",
+ "afii301;200D",
+ "afii57596;200E",
+ "c24085;200E",
+ "lefttoright;200E",
+ "afii299;200E",
+ "afii57597;200F",
+ "c24086;200F",
+ "righttoleft;200F",
+ "afii300;200F",
+ "hyphen1;2010",
+ "hyphen__;2010",
+ "hyphentwo;2010",
+ "hyphennobreak;2011",
+ "figuredash;2012",
+ "endash;2013",
+ "emdash;2014",
+ "horizontalbar;2015",
+ "longdash;2015",
+ "quotedash;2015",
+ "afii00208;2015",
+ "dblverticalbar;2016",
+ "verticalbardbl;2016",
+ "dbllowline;2017",
+ "underscoredbl;2017",
+ "quoteleft;2018",
+ "quoteright;2019",
+ "quotesinglbase;201A",
+ "quoteleftreversed;201B",
+ "quotesinglrev;201B",
+ "quotereversed;201B",
+ "quotedblleft;201C",
+ "quotedblright;201D",
+ "quotedblbase;201E",
+ "quotedblrev;201F",
+ "dagger;2020",
+ "daggerdbl;2021",
+ "bullet;2022",
+ "trianglebullet;2023",
+ "onedotlead;2024",
+ "onedotenleader;2024",
+ "twodotlead;2025",
+ "twodotleader;2025",
+ "twodotenleader;2025",
+ "ellipsis;2026",
+ "hyphendot;2027",
+ "lineseparator;2028",
+ "paragraphseparator;2029",
+ "lre;202A",
+ "rle;202B",
+ "pdf;202C",
+ "afii61573;202C",
+ "lro;202D",
+ "afii61574;202D",
+ "rlo;202E",
+ "afii61575;202E",
+ "perthousand;2030",
+ "pertenthousand;2031",
+ "prime1;2032",
+ "minute;2032",
+ "primedbl1;2033",
+ "second;2033",
+ "primetripl1;2034",
+ "primerev1;2035",
+ "primereversed;2035",
+ "primedblrev1;2036",
+ "primetriplerev1;2037",
+ "caret;2038",
+ "guilsinglleft;2039",
+ "guilsinglright;203A",
+ "referencemark;203B",
+ "refmark;203B",
+ "exclamdbl;203C",
+ "interrobang;203D",
+ "overline;203E",
+ "overscore1;203E",
+ "tie1;2040",
+ "caretinsert;2041",
+ "asterism;2042",
+ "hyphenbullet;2043",
+ "fraction1;2044",
+ "fraction;2044",
+ "zero.superior;2070",
+ "zero.sups;2070",
+ "zerosuperior;2070",
+ "four.superior;2074",
+ "four.sups;2074",
+ "foursuperior;2074",
+ "five.superior;2075",
+ "five.sups;2075",
+ "fivesuperior;2075",
+ "six.superior;2076",
+ "six.sups;2076",
+ "sixsuperior;2076",
+ "seven.superior;2077",
+ "seven.sups;2077",
+ "sevensuperior;2077",
+ "eight.superior;2078",
+ "eight.sups;2078",
+ "eightsuperior;2078",
+ "nine.superior;2079",
+ "nine.sups;2079",
+ "ninesuperior;2079",
+ "plus.superior;207A",
+ "plus.sups;207A",
+ "plussuperior;207A",
+ "minus.superior;207B",
+ "minus.sups;207B",
+ "minussuperior;207B",
+ "equal.superior;207C",
+ "equal.sups;207C",
+ "equalsuperior;207C",
+ "parenleft.superior;207D",
+ "parenleft.sups;207D",
+ "parenleftsuperior;207D",
+ "parenright.superior;207E",
+ "parenright.sups;207E",
+ "parenrightsuperior;207E",
+ "n.superior;207F",
+ "n.sups;207F",
+ "nsuperior;207F",
+ "zero.inferior;2080",
+ "zero.sinf;2080",
+ "zeroinferior;2080",
+ "zerosub;2080",
+ "one.inferior;2081",
+ "one.sinf;2081",
+ "oneinferior;2081",
+ "onesub;2081",
+ "two.inferior;2082",
+ "two.sinf;2082",
+ "twoinferior;2082",
+ "twosub;2082",
+ "three.inferior;2083",
+ "three.sinf;2083",
+ "threeinferior;2083",
+ "threesub;2083",
+ "four.inferior;2084",
+ "four.sinf;2084",
+ "fourinferior;2084",
+ "foursub;2084",
+ "five.inferior;2085",
+ "five.sinf;2085",
+ "fiveinferior;2085",
+ "fivesub;2085",
+ "six.inferior;2086",
+ "six.sinf;2086",
+ "sixinferior;2086",
+ "sixsub;2086",
+ "seven.inferior;2087",
+ "seven.sinf;2087",
+ "seveninferior;2087",
+ "sevensub;2087",
+ "eight.inferior;2088",
+ "eight.sinf;2088",
+ "eightinferior;2088",
+ "eightsub;2088",
+ "nine.inferior;2089",
+ "nine.sinf;2089",
+ "nineinferior;2089",
+ "ninesub;2089",
+ "plussub;208A",
+ "minussub;208B",
+ "equalsub;208C",
+ "parenleft.inferior;208D",
+ "parenleft.sinf;208D",
+ "parenleftinferior;208D",
+ "parenleftsub;208D",
+ "parenright.inferior;208E",
+ "parenright.sinf;208E",
+ "parenrightinferior;208E",
+ "parenrightsub;208E",
+ "coloncurrency;20A1",
+ "colonsign;20A1",
+ "colonmonetary;20A1",
+ "cruzeiro;20A2",
+ "franc;20A3",
+ "afii08941;20A4",
+ "lira;20A4",
+ "mill;20A5",
+ "naira;20A6",
+ "Pts;20A7",
+ "pesetas;20A7",
+ "peseta;20A7",
+ "rupee;20A8",
+ "won;20A9",
+ "newsheqel;20AA",
+ "newsheqelsign;20AA",
+ "sheqel;20AA",
+ "sheqelhebrew;20AA",
+ "afii57636;20AA",
+ "dong;20AB",
+ "Eurocurrency;20AC",
+ "euro;20AC",
+ "eurocurrency;20AC",
+ "Euro;20AC",
+ "accountof;2100",
+ "addresssubject;2101",
+ "Cbb;2102",
+ "centigrade;2103",
+ "degreecentigrade;2103",
+ "CL;2104",
+ "careof;2105",
+ "cslasho;2105",
+ "afii61248;2105",
+ "cadauna;2106",
+ "Euler;2107",
+ "scruple;2108",
+ "degreefarenheit;2109",
+ "fahrenheit;2109",
+ "Hscript;210B",
+ "Hblackletter;210C",
+ "Hbb;210D",
+ "planck;210E",
+ "planckover2pi;210F",
+ "Iscript;2110",
+ "Ifraktur;2111",
+ "Lscript;2112",
+ "litre;2113",
+ "lscript;2113",
+ "lsquare;2113",
+ "afii61289;2113",
+ "lbbar;2114",
+ "numero;2116",
+ "afii61352;2116",
+ "recordright;2117",
+ "weierstrass;2118",
+ "Pbb;2119",
+ "Qbb;211A",
+ "Rscript;211B",
+ "Rfractur;211C",
+ "Rfraktur;211C",
+ "Rbb;211D",
+ "Rx;211E",
+ "prescription;211E",
+ "response;211F",
+ "servicemark;2120",
+ "tel;2121",
+ "telephone;2121",
+ "trademark;2122",
+ "versicle;2123",
+ "Zbb;2124",
+ "ounce;2125",
+ "Ohm;2126",
+ "Omega_;2126",
+ "ohm;2126",
+ "mho;2127",
+ "Zblackletter;2128",
+ "iotaturn;2129",
+ "degreekelvin;212A",
+ "angstrom;212B",
+ "Bscript;212C",
+ "Cblackletter;212D",
+ "estimated;212E",
+ "escript;212F",
+ "Escript;2130",
+ "Fscript;2131",
+ "Fturn;2132",
+ "Mscript;2133",
+ "0script;2134",
+ "alephmath;2135",
+ "aleph;2135",
+ "bethmath;2136",
+ "gimelmath;2137",
+ "dalethmath;2138",
+ "onethird;2153",
+ "twothirds;2154",
+ "oneeighth;215B",
+ "threeeighths;215C",
+ "fiveeighths;215D",
+ "seveneighths;215E",
+ "Oneroman;2160",
+ "Tworoman;2161",
+ "Threeroman;2162",
+ "Fourroman;2163",
+ "Fiveroman;2164",
+ "Sixroman;2165",
+ "Sevenroman;2166",
+ "Eightroman;2167",
+ "Nineroman;2168",
+ "Tenroman;2169",
+ "Elevenroman;216A",
+ "Twelveroman;216B",
+ "oneroman;2170",
+ "tworoman;2171",
+ "threeroman;2172",
+ "fourroman;2173",
+ "fiveroman;2174",
+ "sixroman;2175",
+ "sevenroman;2176",
+ "eightroman;2177",
+ "nineroman;2178",
+ "tenroman;2179",
+ "elevenroman;217A",
+ "twelveroman;217B",
+ "arrowleft;2190",
+ "arrowup;2191",
+ "a161;2192",
+ "arrowright;2192",
+ "arrowdown;2193",
+ "a163;2194",
+ "arrowlongboth;2194",
+ "arrowboth;2194",
+ "a164;2195",
+ "arrowlongbothv;2195",
+ "arrowupdn;2195",
+ "arrownorthwest;2196",
+ "arrowupleft;2196",
+ "arrownortheast;2197",
+ "arrowupright;2197",
+ "arrowdownright;2198",
+ "arrowsoutheast;2198",
+ "arrowdownleft;2199",
+ "arrowsouthwest;2199",
+ "arrowleftnot;219A",
+ "arrowrightnot;219B",
+ "arrowwaveleft;219C",
+ "arrowwaveright;219D",
+ "dblarrowheadleft;219E",
+ "dblarrowheadup;219F",
+ "dblarrowheaddown;21A1",
+ "arrowtailleft;21A2",
+ "arrowtailright;21A3",
+ "arrowbarleft;21A4",
+ "arrowbarup;21A5",
+ "arrowbarright;21A6",
+ "arrowbardown;21A7",
+ "arrowbothvbase;21A8",
+ "arrowupdownbase;21A8",
+ "arrowupdnbse;21A8",
+ "arrowhookleft;21A9",
+ "arrowhookright;21AA",
+ "arrowloopleft;21AB",
+ "arrowloopright;21AC",
+ "arrowwaveboth;21AD",
+ "arrowlongbothnot;21AE",
+ "arrowzigzag;21AF",
+ "arrowrightdown;21B4",
+ "carriagerreturn;21B5",
+ "carriagereturn;21B5",
+ "arrowsemanticlockw;21B6",
+ "arrowsemclockw;21B7",
+ "home;21B8",
+ "tableftright;21B9",
+ "arrowanticlockw;21BA",
+ "arrowclockw;21BB",
+ "arrowlefttophalf;21BC",
+ "harpoonleftbarbup;21BC",
+ "arrowleftbothalf;21BD",
+ "harpoonupright;21BE",
+ "harpoonupleft;21BF",
+ "arrowrighttophalf;21C0",
+ "harpoonrightbarbup;21C0",
+ "arrowrightbothalf;21C1",
+ "harpoondownright;21C2",
+ "harpoondownleft;21C3",
+ "arrowparrrightleft;21C4",
+ "arrowrightoverleft;21C4",
+ "arrowupleftofdown;21C5",
+ "dblarrowupdown;21C5",
+ "arrowleftoverright;21C6",
+ "arrowparrleftright;21C6",
+ "dblarrowup;21C8",
+ "dblarrowdown;21CA",
+ "harpoonleftright;21CB",
+ "harpoonrightleft;21CC",
+ "arrowdblleftnot;21CD",
+ "arrowleftdblstroke;21CD",
+ "arrowdbllongbothnot;21CE",
+ "arrowdblrightnot;21CF",
+ "arrowrightdblstroke;21CF",
+ "arrowleftdbl;21D0",
+ "arrowdblleft;21D0",
+ "arrowdblup;21D1",
+ "dblarrowright;21D2",
+ "arrowdblright;21D2",
+ "arrowdbldown;21D3",
+ "arrowdbllongboth;21D4",
+ "dblarrowleft;21D4",
+ "arrowdblboth;21D4",
+ "arrowdbllongbothv;21D5",
+ "arrowdblnw;21D6",
+ "arrowdblne;21D7",
+ "arrowdblse;21D8",
+ "arrowdblsw;21D9",
+ "arrowtripleleft;21DA",
+ "arrowtripleright;21DB",
+ "arrowsquiggleleft;21DC",
+ "arrowsquiggleright;21DD",
+ "pageup;21DE",
+ "pagedown;21DF",
+ "arrowdashleft;21E0",
+ "arrowdashup;21E1",
+ "arrowdashright;21E2",
+ "arrowdashdown;21E3",
+ "arrowtableft;21E4",
+ "arrowtabright;21E5",
+ "arrowleftwhite;21E6",
+ "arrowopenleft;21E6",
+ "arrowopenup;21E7",
+ "arrowupwhite;21E7",
+ "arrowopenright;21E8",
+ "arrowrightwhite;21E8",
+ "arrowdownwhite;21E9",
+ "arrowopendown;21E9",
+ "capslock;21EA",
+ "forall;2200",
+ "universal;2200",
+ "complement;2201",
+ "partialdiff;2202",
+ "thereexists;2203",
+ "existential;2203",
+ "notexistential;2204",
+ "emptyset;2205",
+ "Delta_;2206",
+ "increment;2206",
+ "Nabla;2207",
+ "nabla;2207",
+ "gradient;2207",
+ "element;2208",
+ "notelementof;2209",
+ "notelement;2209",
+ "elementsmall;220A",
+ "owner;220B",
+ "suchthat;220B",
+ "notcontains;220C",
+ "notowner;220C",
+ "ownersmall;220D",
+ "eop;220E",
+ "product;220F",
+ "coproduct;2210",
+ "summation;2211",
+ "minus;2212",
+ "minusplus;2213",
+ "dotplus;2214",
+ "divisionslash;2215",
+ "slashmath;2215",
+ "backslashmath;2216",
+ "asteriskmath;2217",
+ "bulletmath;2219",
+ "bulletoperator;2219",
+ "periodcenter;2219",
+ "periodcentered_;2219",
+ "radical;221A",
+ "cuberoot;221B",
+ "fourthroot;221C",
+ "proportional;221D",
+ "infinity;221E",
+ "rightangle;221F",
+ "orthogonal;221F",
+ "angle;2220",
+ "measuredangle;2221",
+ "sphericalangle;2222",
+ "bar1;2223",
+ "divides;2223",
+ "bardbl2;2225",
+ "parallel;2225",
+ "notbardbl;2226",
+ "notparallel;2226",
+ "logicaland;2227",
+ "logicalor;2228",
+ "intersection;2229",
+ "union;222A",
+ "integral;222B",
+ "dblintegral;222C",
+ "integraldbl;222C",
+ "integraltrpl;222D",
+ "contintegral;222E",
+ "contourintegral;222E",
+ "surfintegral;222F",
+ "volintegral;2230",
+ "clwintegral;2231",
+ "clwcontintegral;2232",
+ "cclwcontintegral;2233",
+ "therefore;2234",
+ "because;2235",
+ "ratio;2236",
+ "proportion;2237",
+ "dotminus;2238",
+ "excess;2239",
+ "geomproportion;223A",
+ "homothetic;223B",
+ "tildeoperator;223C",
+ "similar;223C",
+ "reversedtilde;223D",
+ "revsimilar;223D",
+ "lazysinv;223E",
+ "sine;223F",
+ "wreathproduct;2240",
+ "notsimilar;2241",
+ "minustilde;2242",
+ "asymptequal;2243",
+ "asymptoticallyequal;2243",
+ "notasymptequal;2244",
+ "approximatelyequal;2245",
+ "approxorequal;2245",
+ "congruent;2245",
+ "approxnotequal;2246",
+ "notapproxequal;2247",
+ "approxequal;2248",
+ "notalmostequal;2249",
+ "almostorequal;224A",
+ "tildetrpl;224B",
+ "allequal;224C",
+ "equivasymptotic;224D",
+ "geomequivalent;224E",
+ "difference;224F",
+ "approaches;2250",
+ "approachlimit;2250",
+ "geomequal;2251",
+ "geometricallyequal;2251",
+ "approxequalorimage;2252",
+ "imageorapproxequal;2253",
+ "imageorapproximatelyequal;2253",
+ "colonequal;2254",
+ "equalcolon;2255",
+ "ringinequal;2256",
+ "ringequal;2257",
+ "corresponds;2258",
+ "estimates;2259",
+ "equiangular;225A",
+ "starequal;225B",
+ "deltaequal;225C",
+ "definequal;225D",
+ "measurequal;225E",
+ "questionequal;225F",
+ "notequal;2260",
+ "equivalence;2261",
+ "notequivalence;2262",
+ "notidentical;2262",
+ "strictequivalence;2263",
+ "lessequal;2264",
+ "greaterequal;2265",
+ "lessdblequal;2266",
+ "lessoverequal;2266",
+ "greaterdblequal;2267",
+ "greateroverequal;2267",
+ "lessnotdblequal;2268",
+ "greaternotdblequal;2269",
+ "lessmuch;226A",
+ "muchless;226A",
+ "greatermuch;226B",
+ "muchgreater;226B",
+ "between;226C",
+ "notequivasymptotic;226D",
+ "notless;226E",
+ "notgreater;226F",
+ "notlessequal1;2270",
+ "notlessnorequal;2270",
+ "notgreaterequal1;2271",
+ "notgreaternorequal;2271",
+ "lessequivlnt;2272",
+ "lessorequivalent;2272",
+ "greaterequivlnt;2273",
+ "greaterorequivalent;2273",
+ "notlessequivlnt;2274",
+ "notgreaterequivlnt;2275",
+ "lessorgreater;2276",
+ "greaterorless;2277",
+ "notlessgreater;2278",
+ "notgreaterless;2279",
+ "notgreaternorless;2279",
+ "precedes;227A",
+ "follows;227B",
+ "succeeds;227B",
+ "precedesequal1;227C",
+ "followsequal1;227D",
+ "precedequivlnt;227E",
+ "followsequivlnt;227F",
+ "notprecedes;2280",
+ "notpreceeds;2280",
+ "notfollows;2281",
+ "notsucceeds;2281",
+ "subset;2282",
+ "propersubset;2282",
+ "superset;2283",
+ "propersuperset;2283",
+ "notpropersubset;2284",
+ "notsubset;2284",
+ "notpropersuperset;2285",
+ "notsuperset;2285",
+ "subsetorequal;2286",
+ "reflexsubset;2286",
+ "supersetorequal;2287",
+ "reflexsuperset;2287",
+ "notreflexsubset;2288",
+ "notreflexsuperset;2289",
+ "subsetnotequal;228A",
+ "supersetnotequal;228B",
+ "multiset;228C",
+ "multiplymultiset;228D",
+ "unionmulti;228E",
+ "squareimage;228F",
+ "squareoriginal;2290",
+ "subsetsqequal;2291",
+ "supersetsqequal;2292",
+ "intersectionsq;2293",
+ "unionsq;2294",
+ "pluscircle;2295",
+ "circleplus;2295",
+ "circleminus;2296",
+ "minuscircle;2296",
+ "timescircle;2297",
+ "circlemultiply;2297",
+ "circledivide;2298",
+ "circledot;2299",
+ "circleot;2299",
+ "circlering;229A",
+ "circleasterisk;229B",
+ "circleequal;229C",
+ "circleminus1;229D",
+ "squareplus;229E",
+ "squareminus;229F",
+ "squaremultiply;22A0",
+ "squaredot;22A1",
+ "turnstileleft;22A2",
+ "tackleft;22A3",
+ "turnstileright;22A3",
+ "latticetop;22A4",
+ "tackdown;22A4",
+ "perpendicular;22A5",
+ "assertion;22A6",
+ "truestate;22A7",
+ "satisfy;22A8",
+ "force;22A9",
+ "tacktrpl;22AA",
+ "forceextr;22AB",
+ "notturnstileleft;22AC",
+ "notsatisfy;22AD",
+ "notforce;22AE",
+ "lowerrank;22B0",
+ "higherrank;22B1",
+ "triangleright;22B2",
+ "triangleleft;22B3",
+ "triangleftequal;22B4",
+ "triangrightequal;22B5",
+ "original;22B6",
+ "image;22B7",
+ "multimap;22B8",
+ "hermitconjmatrix;22B9",
+ "intercal;22BA",
+ "xor;22BB",
+ "nand;22BC",
+ "nor;22BD",
+ "rightanglearc;22BE",
+ "righttriangle;22BF",
+ "narylogicaland;22C0",
+ "narylogicalor;22C1",
+ "naryintersection;22C2",
+ "naryunion;22C3",
+ "diamondmath;22C4",
+ "periodcentered__;22C5",
+ "dotmath;22C5",
+ "star;22C6",
+ "divideonmultiply;22C7",
+ "bowtie;22C8",
+ "multicloseleft;22C9",
+ "multicloseright;22CA",
+ "multiopenleft;22CB",
+ "multiopenright;22CC",
+ "revasymptequal;22CD",
+ "curlor;22CE",
+ "curlyor;22CE",
+ "curland;22CF",
+ "curlyand;22CF",
+ "subsetdbl;22D0",
+ "supersetdbl;22D1",
+ "uniondbl;22D2",
+ "intersectiondbl;22D3",
+ "fork;22D4",
+ "equalparallel;22D5",
+ "lessdot;22D6",
+ "greaterdot;22D7",
+ "verymuchless;22D8",
+ "verymuchgreater;22D9",
+ "lessequalgreater;22DA",
+ "lessequalorgreater;22DA",
+ "greaterequalless;22DB",
+ "greaterequalorless;22DB",
+ "equalless;22DC",
+ "equalgreater;22DD",
+ "equalprecedes1;22DE",
+ "equalfollows1;22DF",
+ "preceedsnotequal;22E0",
+ "followsnotequal;22E1",
+ "notsupersetsqequal;22E3",
+ "sqimageornotequal;22E4",
+ "sqoriginornotequal;22E5",
+ "lessnotequivlnt;22E6",
+ "greaternotequivlnt;22E7",
+ "preceedsnotsimilar;22E8",
+ "followsnotequivlnt;22E9",
+ "nottriangleleft;22EA",
+ "nottriangleright;22EB",
+ "nottriangleleftequal;22EC",
+ "nottrianglerightequal;22ED",
+ "ellipsisvertical;22EE",
+ "vertellipsis;22EE",
+ "midhorizellipsis;22EF",
+ "upslopeellipsis;22F0",
+ "downslopeellipsis;22F1",
+ "house;2302",
+ "control;2303",
+ "projective;2305",
+ "perspcorrespond;2306",
+ "ceilingleft;2308",
+ "ceilingright;2309",
+ "floorleft;230A",
+ "floorright;230B",
+ "logicalnotreversed;2310",
+ "revlogicalnot;2310",
+ "arc;2312",
+ "propellor;2318",
+ "integraltop;2320",
+ "integraltp;2320",
+ "integralbottom;2321",
+ "integralbt;2321",
+ "slurabove;2322",
+ "slurbelow;2323",
+ "option;2325",
+ "deleteright;2326",
+ "clear;2327",
+ "angleleft;2329",
+ "angleright;232A",
+ "deleteleft;232B",
+ "null;2400",
+ "startofhead;2401",
+ "starttext;2402",
+ "endtext;2403",
+ "endtrans;2404",
+ "enquiry;2405",
+ "acknowledge;2406",
+ "bell;2407",
+ "backspace;2408",
+ "horiztab;2409",
+ "linefeed;240A",
+ "verttab;240B",
+ "formfeed;240C",
+ "shiftout;240E",
+ "shiftin;240F",
+ "datalinkescape;2410",
+ "devcon1;2411",
+ "devcon2;2412",
+ "devcon3;2413",
+ "devcon4;2414",
+ "negacknowledge;2415",
+ "synch;2416",
+ "endtransblock;2417",
+ "cancel;2418",
+ "endmedium;2419",
+ "substitute;241A",
+ "escape;241B",
+ "fileseparator;241C",
+ "groupseparator;241D",
+ "recordseparator;241E",
+ "unitseparator;241F",
+ "spaceliteral;2420",
+ "delete;2421",
+ "blankb;2422",
+ "blank;2423",
+ "spaceopenbox;2423",
+ "newline;2424",
+ "a120;2460",
+ "onecircle;2460",
+ "a121;2461",
+ "twocircle;2461",
+ "a122;2462",
+ "threecircle;2462",
+ "a123;2463",
+ "fourcircle;2463",
+ "a124;2464",
+ "fivecircle;2464",
+ "a125;2465",
+ "sixcircle;2465",
+ "a126;2466",
+ "sevencircle;2466",
+ "a127;2467",
+ "eightcircle;2467",
+ "a128;2468",
+ "ninecircle;2468",
+ "a129;2469",
+ "tencircle;2469",
+ "elevencircle;246A",
+ "twelvecircle;246B",
+ "thirteencircle;246C",
+ "fourteencircle;246D",
+ "fifteencircle;246E",
+ "sixteencircle;246F",
+ "seventeencircle;2470",
+ "eighteencircle;2471",
+ "nineteencircle;2472",
+ "twentycircle;2473",
+ "oneparen;2474",
+ "twoparen;2475",
+ "fourparen;2477",
+ "fiveparen;2478",
+ "sixparen;2479",
+ "sevenparen;247A",
+ "eightparen;247B",
+ "nineparen;247C",
+ "tenparen;247D",
+ "elevenparen;247E",
+ "twelveparen;247F",
+ "thirteenparen;2480",
+ "fourteenparen;2481",
+ "fifteenparen;2482",
+ "sixteenparen;2483",
+ "seventeenparen;2484",
+ "eighteenparen;2485",
+ "nineteenparen;2486",
+ "twentyparen;2487",
+ "oneperiod;2488",
+ "twoperiod;2489",
+ "threeperiod;248A",
+ "fourperiod;248B",
+ "fiveperiod;248C",
+ "sixperiod;248D",
+ "sevenperiod;248E",
+ "eightperiod;248F",
+ "nineperiod;2490",
+ "tenperiod;2491",
+ "elevenperiod;2492",
+ "twelveperiod;2493",
+ "thirteenperiod;2494",
+ "fourteenperiod;2495",
+ "fifteenperiod;2496",
+ "sixteenperiod;2497",
+ "seventeenperiod;2498",
+ "eighteenperiod;2499",
+ "nineteenperiod;249A",
+ "twentyperiod;249B",
+ "aparen;249C",
+ "bparen;249D",
+ "cparen;249E",
+ "dparen;249F",
+ "eparen;24A0",
+ "fparen;24A1",
+ "gparen;24A2",
+ "hparen;24A3",
+ "iparen;24A4",
+ "jparen;24A5",
+ "kparen;24A6",
+ "lparen;24A7",
+ "mparen;24A8",
+ "nparen;24A9",
+ "oparen;24AA",
+ "pparen;24AB",
+ "qparen;24AC",
+ "rparen;24AD",
+ "sparen;24AE",
+ "tparen;24AF",
+ "uparen;24B0",
+ "vparen;24B1",
+ "wparen;24B2",
+ "xparen;24B3",
+ "yparen;24B4",
+ "zparen;24B5",
+ "Acircle;24B6",
+ "Bcircle;24B7",
+ "Ccircle;24B8",
+ "Dcircle;24B9",
+ "Ecircle;24BA",
+ "Fcircle;24BB",
+ "Gcircle;24BC",
+ "Hcircle;24BD",
+ "Icircle;24BE",
+ "Jcircle;24BF",
+ "Kcircle;24C0",
+ "Lcircle;24C1",
+ "Mcircle;24C2",
+ "Ncircle;24C3",
+ "Ocircle;24C4",
+ "Pcircle;24C5",
+ "Qcircle;24C6",
+ "Rcircle;24C7",
+ "Scircle;24C8",
+ "Tcircle;24C9",
+ "Ucircle;24CA",
+ "Vcircle;24CB",
+ "Wcircle;24CC",
+ "Xcircle;24CD",
+ "Ycircle;24CE",
+ "Zcircle;24CF",
+ "acircle;24D0",
+ "bcircle;24D1",
+ "ccircle;24D2",
+ "dcircle;24D3",
+ "ecircle;24D4",
+ "fcircle;24D5",
+ "gcircle;24D6",
+ "hcircle;24D7",
+ "icircle;24D8",
+ "jcircle;24D9",
+ "kcircle;24DA",
+ "lcircle;24DB",
+ "mcircle;24DC",
+ "ncircle;24DD",
+ "ocircle;24DE",
+ "pcircle;24DF",
+ "qcircle;24E0",
+ "rcircle;24E1",
+ "scircle;24E2",
+ "tcircle;24E3",
+ "ucircle;24E4",
+ "vcircle;24E5",
+ "wcircle;24E6",
+ "xcircle;24E7",
+ "ycircle;24E8",
+ "zcircle;24E9",
+ "SF100000;2500",
+ "SF110000;2502",
+ "SF010000;250C",
+ "SF030000;2510",
+ "SF020000;2514",
+ "SF040000;2518",
+ "SF080000;251C",
+ "SF090000;2524",
+ "SF060000;252C",
+ "SF070000;2534",
+ "SF050000;253C",
+ "SF430000;2550",
+ "SF240000;2551",
+ "SF510000;2552",
+ "SF520000;2553",
+ "SF390000;2554",
+ "SF220000;2555",
+ "SF210000;2556",
+ "SF250000;2557",
+ "SF500000;2558",
+ "SF490000;2559",
+ "SF380000;255A",
+ "SF280000;255B",
+ "SF270000;255C",
+ "SF260000;255D",
+ "SF360000;255E",
+ "SF370000;255F",
+ "SF420000;2560",
+ "SF190000;2561",
+ "SF200000;2562",
+ "SF230000;2563",
+ "SF470000;2564",
+ "SF480000;2565",
+ "SF410000;2566",
+ "SF450000;2567",
+ "SF460000;2568",
+ "SF400000;2569",
+ "SF540000;256A",
+ "SF530000;256B",
+ "SF440000;256C",
+ "upblock;2580",
+ "dnquarterblock;2582",
+ "dnthreeeighthblock;2583",
+ "dnblock;2584",
+ "dnfiveeighthblock;2585",
+ "dnthreequarterblock;2586",
+ "dnseveneighthblock;2587",
+ "block;2588",
+ "lfseveneighthblock;2589",
+ "lfthreequarterblock;258A",
+ "lffiveeighthblock;258B",
+ "lfblock;258C",
+ "lfthreeeighthblock;258D",
+ "lfquarterblock;258E",
+ "lfeighthblock;258F",
+ "rtblock;2590",
+ "shadelight;2591",
+ "ltshade;2591",
+ "shademedium;2592",
+ "shade;2592",
+ "shadedark;2593",
+ "dkshade;2593",
+ "upeighthblock;2594",
+ "rteighthblock;2595",
+ "a73;25A0",
+ "blacksquare;25A0",
+ "filledbox;25A0",
+ "U25a1;25A1",
+ "box;25A1",
+ "whitesquare;25A1",
+ "H22073;25A1",
+ "boxrounded;25A2",
+ "boxnested;25A3",
+ "squarewhitewithsmallblack;25A3",
+ "boxhorizhatch;25A4",
+ "squarehorizontalfill;25A4",
+ "boxverthatch;25A5",
+ "squareverticalfill;25A5",
+ "boxcrosshatch;25A6",
+ "squareorthogonalcrosshatchfill;25A6",
+ "boxleftdiaghatch;25A7",
+ "squareupperlefttolowerrightfill;25A7",
+ "boxrtdiaghatch;25A8",
+ "squareupperrighttolowerleftfill;25A8",
+ "boxcrossdiaghatch;25A9",
+ "squarediagonalcrosshatchfill;25A9",
+ "U25aa;25AA",
+ "blacksmallsquare;25AA",
+ "smallboxfilled;25AA",
+ "H18543;25AA",
+ "U25ab;25AB",
+ "smallbox;25AB",
+ "whitesmallsquare;25AB",
+ "H18551;25AB",
+ "blackrectangle;25AC",
+ "filledrect;25AC",
+ "rectangle;25AD",
+ "filledvertrect;25AE",
+ "vertrectangle;25AF",
+ "filledparallelogram;25B0",
+ "parallelogram;25B1",
+ "a76;25B2",
+ "blackuppointingtriangle;25B2",
+ "triagup;25B2",
+ "triangle;25B3",
+ "whiteuppointingtriangle;25B3",
+ "blackuppointingsmalltriangle;25B4",
+ "smalltrianglesld;25B4",
+ "smalltriangle;25B5",
+ "whiteuppointingsmalltriangle;25B5",
+ "blackrightpointingtriangle;25B6",
+ "trianglerightsld1;25B6",
+ "triangleright1;25B7",
+ "whiterightpointingtriangle;25B7",
+ "smalltrianglerightsld;25B8",
+ "smalltriangleright;25B9",
+ "whiterightpointingsmalltriangle;25B9",
+ "blackrightpointingpointer;25BA",
+ "triagrt;25BA",
+ "triagrtopen;25BB",
+ "a77;25BC",
+ "blackdownpointingtriangle;25BC",
+ "triagdn;25BC",
+ "triangleinv;25BD",
+ "whitedownpointingtriangle;25BD",
+ "smalltriangleinvsld;25BE",
+ "smalltriangleinv;25BF",
+ "whitedownpointingsmalltriangle;25BF",
+ "blackleftpointingtriangle;25C0",
+ "triangleleftsld1;25C0",
+ "triangleleft1;25C1",
+ "whiteleftpointingtriangle;25C1",
+ "smalltriangleleftsld;25C2",
+ "smalltriangleleft;25C3",
+ "whiteleftpointingsmalltriangle;25C3",
+ "blackleftpointingpointer;25C4",
+ "triaglf;25C4",
+ "triaglfopen;25C5",
+ "a78;25C6",
+ "blackdiamond;25C6",
+ "diamondrhombsolid;25C6",
+ "diamondrhomb;25C7",
+ "whitediamond;25C7",
+ "diamondrhombnested;25C8",
+ "whitediamondcontainingblacksmalldiamond;25C8",
+ "fisheye;25C9",
+ "lozenge;25CA",
+ "whitecircle;25CB",
+ "circle;25CB",
+ "circledash;25CC",
+ "dottedcircle;25CC",
+ "circleverthatch;25CD",
+ "bullseye;25CE",
+ "bullseye1;25CE",
+ "U25cf;25CF",
+ "a71;25CF",
+ "blackcircle;25CF",
+ "circlesolid;25CF",
+ "H18533;25CF",
+ "circleleftsld;25D0",
+ "circlewithlefthalfblack;25D0",
+ "circlerightsld;25D1",
+ "circlewithrighthalfblack;25D1",
+ "circlebottomsld;25D2",
+ "circletopsld;25D3",
+ "circlenesld;25D4",
+ "circlenwopen;25D5",
+ "semicircleleftsld;25D6",
+ "a81;25D7",
+ "semicirclelertsld;25D7",
+ "bulletinverse;25D8",
+ "invbullet;25D8",
+ "whitecircleinverse;25D9",
+ "invcircle;25D9",
+ "invsemicircleup;25DA",
+ "invsemicircledn;25DB",
+ "nwquadarc;25DC",
+ "nequadarc;25DD",
+ "sequadarc;25DE",
+ "swquadarc;25DF",
+ "toparc;25E0",
+ "bottomarc;25E1",
+ "blacklowerrighttriangle;25E2",
+ "trianglesesld;25E2",
+ "blacklowerlefttriangle;25E3",
+ "triangleswsld;25E3",
+ "blackupperlefttriangle;25E4",
+ "tranglenwsld;25E4",
+ "blackupperrighttriangle;25E5",
+ "trianglenesld;25E5",
+ "U25e6;25E6",
+ "openbullet1;25E6",
+ "whitebullet;25E6",
+ "openbullet;25E6",
+ "squareleftsld;25E7",
+ "squarerightsld;25E8",
+ "squarenwsld;25E9",
+ "squaresesld;25EA",
+ "squarevertbisect;25EB",
+ "triangledot;25EC",
+ "triangleleftsld;25ED",
+ "trianglerightsld;25EE",
+ "largecircle;25EF",
+ "a35;2605",
+ "blackstar;2605",
+ "whitestar;2606",
+ "a4;260E",
+ "telephoneblack;260E",
+ "whitetelephone;260F",
+ "a11;261B",
+ "pointingindexleftwhite;261C",
+ "pointingindexupwhite;261D",
+ "a12;261E",
+ "pointingindexrightwhite;261E",
+ "pointingindexdownwhite;261F",
+ "yinyang;262F",
+ "whitesmilingface;263A",
+ "smileface;263A",
+ "blacksmilingface;263B",
+ "invsmileface;263B",
+ "compass;263C",
+ "sun;263C",
+ "venus;2640",
+ "female;2640",
+ "earth;2641",
+ "mars;2642",
+ "male;2642",
+ "a109;2660",
+ "spadesuitblack;2660",
+ "spade;2660",
+ "heartsuitwhite;2661",
+ "diamondsuitwhite;2662",
+ "a112;2663",
+ "clubsuitblack;2663",
+ "club;2663",
+ "spadesuitwhite;2664",
+ "a110;2665",
+ "heartsuitblack;2665",
+ "heart;2665",
+ "a111;2666",
+ "diamond;2666",
+ "clubsuitwhite;2667",
+ "hotsprings;2668",
+ "quarternote;2669",
+ "musicalnote;266A",
+ "eighthnotebeamed;266B",
+ "musicalnotedbl;266B",
+ "beamedsixteenthnotes;266C",
+ "flat;266D",
+ "musicflatsign;266D",
+ "natural;266E",
+ "musicsharpsign;266F",
+ "sharp;266F",
+ "a1;2701",
+ "a2;2702",
+ "a202;2703",
+ "a3;2704",
+ "a5;2706",
+ "a119;2707",
+ "a118;2708",
+ "a117;2709",
+ "a13;270C",
+ "a14;270D",
+ "a15;270E",
+ "a16;270F",
+ "a105;2710",
+ "a17;2711",
+ "a18;2712",
+ "a19;2713",
+ "checkmark;2713",
+ "a20;2714",
+ "a21;2715",
+ "a22;2716",
+ "a23;2717",
+ "a24;2718",
+ "a25;2719",
+ "a26;271A",
+ "a27;271B",
+ "a28;271C",
+ "a6;271D",
+ "a7;271E",
+ "a8;271F",
+ "a9;2720",
+ "a10;2721",
+ "a29;2722",
+ "a30;2723",
+ "a31;2724",
+ "a32;2725",
+ "a33;2726",
+ "a34;2727",
+ "a36;2729",
+ "a37;272A",
+ "a38;272B",
+ "a39;272C",
+ "a40;272D",
+ "a41;272E",
+ "a42;272F",
+ "a43;2730",
+ "a44;2731",
+ "a45;2732",
+ "a46;2733",
+ "a47;2734",
+ "a48;2735",
+ "a49;2736",
+ "a50;2737",
+ "a51;2738",
+ "a52;2739",
+ "a53;273A",
+ "a54;273B",
+ "a55;273C",
+ "a56;273D",
+ "a57;273E",
+ "a58;273F",
+ "a59;2740",
+ "a60;2741",
+ "a61;2742",
+ "a62;2743",
+ "a63;2744",
+ "a64;2745",
+ "a65;2746",
+ "a66;2747",
+ "a67;2748",
+ "a68;2749",
+ "a69;274A",
+ "a70;274B",
+ "a72;274D",
+ "a74;274F",
+ "a203;2750",
+ "a75;2751",
+ "a204;2752",
+ "a79;2756",
+ "a82;2758",
+ "a83;2759",
+ "a84;275A",
+ "a97;275B",
+ "a98;275C",
+ "a99;275D",
+ "a100;275E",
+ "a101;2761",
+ "a102;2762",
+ "a103;2763",
+ "a104;2764",
+ "a106;2765",
+ "a107;2766",
+ "a108;2767",
+ "a130;2776",
+ "a131;2777",
+ "a132;2778",
+ "a133;2779",
+ "a134;277A",
+ "a135;277B",
+ "a136;277C",
+ "a137;277D",
+ "a138;277E",
+ "a139;277F",
+ "a140;2780",
+ "a141;2781",
+ "a142;2782",
+ "a143;2783",
+ "a144;2784",
+ "a145;2785",
+ "a146;2786",
+ "a147;2787",
+ "a148;2788",
+ "a149;2789",
+ "a150;278A",
+ "onecircleinversesansserif;278A",
+ "a151;278B",
+ "twocircleinversesansserif;278B",
+ "a152;278C",
+ "threecircleinversesansserif;278C",
+ "a153;278D",
+ "fourcircleinversesansserif;278D",
+ "a154;278E",
+ "fivecircleinversesansserif;278E",
+ "a155;278F",
+ "sixcircleinversesansserif;278F",
+ "a156;2790",
+ "sevencircleinversesansserif;2790",
+ "a157;2791",
+ "eightcircleinversesansserif;2791",
+ "a158;2792",
+ "ninecircleinversesansserif;2792",
+ "a159;2793",
+ "a160;2794",
+ "a196;2798",
+ "a165;2799",
+ "a192;279A",
+ "a166;279B",
+ "a167;279C",
+ "a168;279D",
+ "a169;279E",
+ "arrowrightheavy;279E",
+ "a170;279F",
+ "a171;27A0",
+ "a172;27A1",
+ "a173;27A2",
+ "a162;27A3",
+ "a174;27A4",
+ "a175;27A5",
+ "a176;27A6",
+ "a177;27A7",
+ "a178;27A8",
+ "a179;27A9",
+ "a193;27AA",
+ "a180;27AB",
+ "a199;27AC",
+ "a181;27AD",
+ "a200;27AE",
+ "a182;27AF",
+ "a201;27B1",
+ "a183;27B2",
+ "a184;27B3",
+ "a197;27B4",
+ "a185;27B5",
+ "a194;27B6",
+ "a198;27B7",
+ "a186;27B8",
+ "a195;27B9",
+ "a187;27BA",
+ "a188;27BB",
+ "a189;27BC",
+ "a190;27BD",
+ "a191;27BE",
+ "ideographicspace;3000",
+ "ideographiccomma;3001",
+ "ideographicperiod;3002",
+ "dittomark;3003",
+ "jis;3004",
+ "ideographiciterationmark;3005",
+ "ideographicclose;3006",
+ "ideographiczero;3007",
+ "anglebracketleft;3008",
+ "anglebracketright;3009",
+ "dblanglebracketleft;300A",
+ "dblanglebracketright;300B",
+ "cornerbracketleft;300C",
+ "cornerbracketright;300D",
+ "whitecornerbracketleft;300E",
+ "whitecornerbracketright;300F",
+ "blacklenticularbracketleft;3010",
+ "blacklenticularbracketright;3011",
+ "postalmark;3012",
+ "getamark;3013",
+ "tortoiseshellbracketleft;3014",
+ "tortoiseshellbracketright;3015",
+ "whitelenticularbracketleft;3016",
+ "whitelenticularbracketright;3017",
+ "whitetortoiseshellbracketleft;3018",
+ "whitetortoiseshellbracketright;3019",
+ "wavedash;301C",
+ "quotedblprimereversed;301D",
+ "quotedblprime;301E",
+ "postalmarkface;3020",
+ "onehangzhou;3021",
+ "threehangzhou;3023",
+ "fourhangzhou;3024",
+ "fivehangzhou;3025",
+ "sixhangzhou;3026",
+ "sevenhangzhou;3027",
+ "eighthangzhou;3028",
+ "ninehangzhou;3029",
+ "circlepostalmark;3036",
+ "asmallhiragana;3041",
+ "ahiragana;3042",
+ "ismallhiragana;3043",
+ "ihiragana;3044",
+ "usmallhiragana;3045",
+ "uhiragana;3046",
+ "esmallhiragana;3047",
+ "ehiragana;3048",
+ "osmallhiragana;3049",
+ "ohiragana;304A",
+ "kahiragana;304B",
+ "gahiragana;304C",
+ "kihiragana;304D",
+ "kuhiragana;304F",
+ "guhiragana;3050",
+ "kehiragana;3051",
+ "gehiragana;3052",
+ "kohiragana;3053",
+ "gohiragana;3054",
+ "sahiragana;3055",
+ "zahiragana;3056",
+ "sihiragana;3057",
+ "zihiragana;3058",
+ "suhiragana;3059",
+ "zuhiragana;305A",
+ "sehiragana;305B",
+ "zehiragana;305C",
+ "sohiragana;305D",
+ "zohiragana;305E",
+ "tahiragana;305F",
+ "dahiragana;3060",
+ "tihiragana;3061",
+ "dihiragana;3062",
+ "tusmallhiragana;3063",
+ "tuhiragana;3064",
+ "duhiragana;3065",
+ "tehiragana;3066",
+ "dehiragana;3067",
+ "tohiragana;3068",
+ "dohiragana;3069",
+ "nahiragana;306A",
+ "nihiragana;306B",
+ "nuhiragana;306C",
+ "nehiragana;306D",
+ "nohiragana;306E",
+ "hahiragana;306F",
+ "bahiragana;3070",
+ "pahiragana;3071",
+ "bihiragana;3073",
+ "pihiragana;3074",
+ "huhiragana;3075",
+ "buhiragana;3076",
+ "puhiragana;3077",
+ "hehiragana;3078",
+ "behiragana;3079",
+ "pehiragana;307A",
+ "hohiragana;307B",
+ "bohiragana;307C",
+ "pohiragana;307D",
+ "mahiragana;307E",
+ "mihiragana;307F",
+ "muhiragana;3080",
+ "mehiragana;3081",
+ "mohiragana;3082",
+ "yasmallhiragana;3083",
+ "yahiragana;3084",
+ "yusmallhiragana;3085",
+ "yuhiragana;3086",
+ "yosmallhiragana;3087",
+ "yohiragana;3088",
+ "rahiragana;3089",
+ "rihiragana;308A",
+ "ruhiragana;308B",
+ "rehiragana;308C",
+ "rohiragana;308D",
+ "wasmallhiragana;308E",
+ "wahiragana;308F",
+ "wihiragana;3090",
+ "wehiragana;3091",
+ "wohiragana;3092",
+ "nhiragana;3093",
+ "vuhiragana;3094",
+ "voicedmarkkana;309B",
+ "semivoicedmarkkana;309C",
+ "iterationhiragana;309D",
+ "voicediterationhiragana;309E",
+ "asmallkatakana;30A1",
+ "akatakana;30A2",
+ "ismallkatakana;30A3",
+ "ikatakana;30A4",
+ "usmallkatakana;30A5",
+ "ukatakana;30A6",
+ "esmallkatakana;30A7",
+ "ekatakana;30A8",
+ "osmallkatakana;30A9",
+ "okatakana;30AA",
+ "kakatakana;30AB",
+ "gakatakana;30AC",
+ "kikatakana;30AD",
+ "gikatakana;30AE",
+ "kukatakana;30AF",
+ "gukatakana;30B0",
+ "kekatakana;30B1",
+ "gekatakana;30B2",
+ "kokatakana;30B3",
+ "gokatakana;30B4",
+ "sakatakana;30B5",
+ "zakatakana;30B6",
+ "sikatakana;30B7",
+ "zikatakana;30B8",
+ "sukatakana;30B9",
+ "zukatakana;30BA",
+ "sekatakana;30BB",
+ "zekatakana;30BC",
+ "sokatakana;30BD",
+ "zokatakana;30BE",
+ "takatakana;30BF",
+ "dakatakana;30C0",
+ "dikatakana;30C2",
+ "tusmallkatakana;30C3",
+ "tukatakana;30C4",
+ "dukatakana;30C5",
+ "tekatakana;30C6",
+ "dekatakana;30C7",
+ "tokatakana;30C8",
+ "dokatakana;30C9",
+ "nakatakana;30CA",
+ "nikatakana;30CB",
+ "nukatakana;30CC",
+ "nekatakana;30CD",
+ "nokatakana;30CE",
+ "hakatakana;30CF",
+ "bakatakana;30D0",
+ "pakatakana;30D1",
+ "hikatakana;30D2",
+ "bikatakana;30D3",
+ "pikatakana;30D4",
+ "hukatakana;30D5",
+ "bukatakana;30D6",
+ "pukatakana;30D7",
+ "hekatakana;30D8",
+ "bekatakana;30D9",
+ "pekatakana;30DA",
+ "hokatakana;30DB",
+ "bokatakana;30DC",
+ "pokatakana;30DD",
+ "makatakana;30DE",
+ "mikatakana;30DF",
+ "mukatakana;30E0",
+ "mekatakana;30E1",
+ "mokatakana;30E2",
+ "yasmallkatakana;30E3",
+ "yakatakana;30E4",
+ "yusmallkatakana;30E5",
+ "yukatakana;30E6",
+ "yosmallkatakana;30E7",
+ "yokatakana;30E8",
+ "rakatakana;30E9",
+ "rikatakana;30EA",
+ "rukatakana;30EB",
+ "rekatakana;30EC",
+ "rokatakana;30ED",
+ "wasmallkatakana;30EE",
+ "wakatakana;30EF",
+ "wikatakana;30F0",
+ "wekatakana;30F1",
+ "wokatakana;30F2",
+ "nkatakana;30F3",
+ "vukatakana;30F4",
+ "kasmallkatakana;30F5",
+ "kesmallkatakana;30F6",
+ "vakatakana;30F7",
+ "vikatakana;30F8",
+ "vekatakana;30F9",
+ "vokatakana;30FA",
+ "dotkatakana;30FB",
+ "prolongedkana;30FC",
+ "iterationkatakana;30FD",
+ "voicediterationkatakana;30FE",
+ "bbopomofo;3105",
+ "pbopomofo;3106",
+ "mbopomofo;3107",
+ "fbopomofo;3108",
+ "dbopomofo;3109",
+ "tbopomofo;310A",
+ "nbopomofo;310B",
+ "lbopomofo;310C",
+ "gbopomofo;310D",
+ "kbopomofo;310E",
+ "hbopomofo;310F",
+ "jbopomofo;3110",
+ "qbopomofo;3111",
+ "xbopomofo;3112",
+ "zhbopomofo;3113",
+ "chbopomofo;3114",
+ "shbopomofo;3115",
+ "rbopomofo;3116",
+ "zbopomofo;3117",
+ "cbopomofo;3118",
+ "sbopomofo;3119",
+ "abopomofo;311A",
+ "obopomofo;311B",
+ "ebopomofo;311C",
+ "ehbopomofo;311D",
+ "aibopomofo;311E",
+ "eibopomofo;311F",
+ "aubopomofo;3120",
+ "oubopomofo;3121",
+ "anbopomofo;3122",
+ "enbopomofo;3123",
+ "angbopomofo;3124",
+ "engbopomofo;3125",
+ "erbopomofo;3126",
+ "ubopomofo;3128",
+ "iubopomofo;3129",
+ "kiyeokkorean;3131",
+ "ssangkiyeokkorean;3132",
+ "kiyeoksioskorean;3133",
+ "nieunkorean;3134",
+ "nieuncieuckorean;3135",
+ "nieunhieuhkorean;3136",
+ "tikeutkorean;3137",
+ "ssangtikeutkorean;3138",
+ "rieulkorean;3139",
+ "rieulkiyeokkorean;313A",
+ "rieulmieumkorean;313B",
+ "rieulpieupkorean;313C",
+ "rieulsioskorean;313D",
+ "rieulthieuthkorean;313E",
+ "rieulphieuphkorean;313F",
+ "rieulhieuhkorean;3140",
+ "mieumkorean;3141",
+ "pieupkorean;3142",
+ "ssangpieupkorean;3143",
+ "pieupsioskorean;3144",
+ "sioskorean;3145",
+ "ssangsioskorean;3146",
+ "ieungkorean;3147",
+ "cieuckorean;3148",
+ "ssangcieuckorean;3149",
+ "chieuchkorean;314A",
+ "khieukhkorean;314B",
+ "thieuthkorean;314C",
+ "phieuphkorean;314D",
+ "hieuhkorean;314E",
+ "akorean;314F",
+ "aekorean;3150",
+ "yakorean;3151",
+ "yaekorean;3152",
+ "eokorean;3153",
+ "ekorean;3154",
+ "yeokorean;3155",
+ "yekorean;3156",
+ "okorean;3157",
+ "wakorean;3158",
+ "waekorean;3159",
+ "oekorean;315A",
+ "yokorean;315B",
+ "ukorean;315C",
+ "weokorean;315D",
+ "wekorean;315E",
+ "wikorean;315F",
+ "yukorean;3160",
+ "eukorean;3161",
+ "yikorean;3162",
+ "ikorean;3163",
+ "hangulfiller;3164",
+ "ssangnieunkorean;3165",
+ "nieuntikeutkorean;3166",
+ "nieunsioskorean;3167",
+ "nieunpansioskorean;3168",
+ "rieulkiyeoksioskorean;3169",
+ "rieultikeutkorean;316A",
+ "rieulpieupsioskorean;316B",
+ "rieulpansioskorean;316C",
+ "rieulyeorinhieuhkorean;316D",
+ "mieumpieupkorean;316E",
+ "mieumsioskorean;316F",
+ "mieumpansioskorean;3170",
+ "kapyeounmieumkorean;3171",
+ "pieupkiyeokkorean;3172",
+ "pieuptikeutkorean;3173",
+ "pieupsioskiyeokkorean;3174",
+ "pieupsiostikeutkorean;3175",
+ "pieupcieuckorean;3176",
+ "pieupthieuthkorean;3177",
+ "kapyeounpieupkorean;3178",
+ "kapyeounssangpieupkorean;3179",
+ "sioskiyeokkorean;317A",
+ "siosnieunkorean;317B",
+ "siostikeutkorean;317C",
+ "siospieupkorean;317D",
+ "sioscieuckorean;317E",
+ "pansioskorean;317F",
+ "ssangieungkorean;3180",
+ "yesieungkorean;3181",
+ "yesieungsioskorean;3182",
+ "yesieungpansioskorean;3183",
+ "kapyeounphieuphkorean;3184",
+ "ssanghieuhkorean;3185",
+ "yeorinhieuhkorean;3186",
+ "yoyakorean;3187",
+ "yoyaekorean;3188",
+ "yoikorean;3189",
+ "yuyeokorean;318A",
+ "yuyekorean;318B",
+ "yuikorean;318C",
+ "araeakorean;318D",
+ "araeaekorean;318E",
+ "kiyeokparenkorean;3200",
+ "nieunparenkorean;3201",
+ "tikeutparenkorean;3202",
+ "rieulparenkorean;3203",
+ "mieumparenkorean;3204",
+ "pieupparenkorean;3205",
+ "siosparenkorean;3206",
+ "ieungparenkorean;3207",
+ "cieucparenkorean;3208",
+ "chieuchparenkorean;3209",
+ "khieukhparenkorean;320A",
+ "thieuthparenkorean;320B",
+ "phieuphparenkorean;320C",
+ "hieuhparenkorean;320D",
+ "kiyeokaparenkorean;320E",
+ "nieunaparenkorean;320F",
+ "tikeutaparenkorean;3210",
+ "rieulaparenkorean;3211",
+ "mieumaparenkorean;3212",
+ "pieupaparenkorean;3213",
+ "siosaparenkorean;3214",
+ "ieungaparenkorean;3215",
+ "cieucaparenkorean;3216",
+ "chieuchaparenkorean;3217",
+ "khieukhaparenkorean;3218",
+ "thieuthaparenkorean;3219",
+ "phieuphaparenkorean;321A",
+ "hieuhaparenkorean;321B",
+ "cieucuparenkorean;321C",
+ "oneideographicparen;3220",
+ "twoideographicparen;3221",
+ "threeideographicparen;3222",
+ "fourideographicparen;3223",
+ "fiveideographicparen;3224",
+ "sixideographicparen;3225",
+ "sevenideographicparen;3226",
+ "eightideographicparen;3227",
+ "nineideographicparen;3228",
+ "tenideographicparen;3229",
+ "ideographicmoonparen;322A",
+ "ideographicfireparen;322B",
+ "ideographicwaterparen;322C",
+ "ideographicwoodparen;322D",
+ "ideographicmetalparen;322E",
+ "ideographicearthparen;322F",
+ "ideographicsunparen;3230",
+ "ideographicstockparen;3231",
+ "ideographichaveparen;3232",
+ "ideographicsocietyparen;3233",
+ "ideographicnameparen;3234",
+ "ideographicspecialparen;3235",
+ "ideographicfinancialparen;3236",
+ "ideographiccongratulationparen;3237",
+ "ideographiclaborparen;3238",
+ "ideographicrepresentparen;3239",
+ "ideographiccallparen;323A",
+ "ideographicstudyparen;323B",
+ "ideographicsuperviseparen;323C",
+ "ideographicenterpriseparen;323D",
+ "ideographicresourceparen;323E",
+ "ideographicallianceparen;323F",
+ "ideographicfestivalparen;3240",
+ "ideographicselfparen;3242",
+ "ideographicreachparen;3243",
+ "kiyeokcirclekorean;3260",
+ "nieuncirclekorean;3261",
+ "tikeutcirclekorean;3262",
+ "rieulcirclekorean;3263",
+ "mieumcirclekorean;3264",
+ "pieupcirclekorean;3265",
+ "sioscirclekorean;3266",
+ "ieungcirclekorean;3267",
+ "cieuccirclekorean;3268",
+ "chieuchcirclekorean;3269",
+ "khieukhcirclekorean;326A",
+ "thieuthcirclekorean;326B",
+ "phieuphcirclekorean;326C",
+ "hieuhcirclekorean;326D",
+ "kiyeokacirclekorean;326E",
+ "nieunacirclekorean;326F",
+ "tikeutacirclekorean;3270",
+ "rieulacirclekorean;3271",
+ "mieumacirclekorean;3272",
+ "pieupacirclekorean;3273",
+ "siosacirclekorean;3274",
+ "ieungacirclekorean;3275",
+ "cieucacirclekorean;3276",
+ "chieuchacirclekorean;3277",
+ "khieukhacirclekorean;3278",
+ "thieuthacirclekorean;3279",
+ "phieuphacirclekorean;327A",
+ "hieuhacirclekorean;327B",
+ "koreanstandardsymbol;327F",
+ "ideographmooncircle;328A",
+ "ideographfirecircle;328B",
+ "ideographwatercircle;328C",
+ "ideographwoodcircle;328D",
+ "ideographmetalcircle;328E",
+ "ideographearthcircle;328F",
+ "ideographsuncircle;3290",
+ "ideographnamecircle;3294",
+ "ideographicfinancialcircle;3296",
+ "ideographiclaborcircle;3298",
+ "ideographicsecretcircle;3299",
+ "ideographicexcellentcircle;329D",
+ "ideographicprintcircle;329E",
+ "ideographiccorrectcircle;32A3",
+ "ideographichighcircle;32A4",
+ "ideographiccentrecircle;32A5",
+ "ideographiclowcircle;32A6",
+ "ideographicleftcircle;32A7",
+ "ideographicrightcircle;32A8",
+ "ideographicmedicinecircle;32A9",
+ "apaatosquare;3300",
+ "aarusquare;3303",
+ "intisquare;3305",
+ "karoriisquare;330D",
+ "kirosquare;3314",
+ "kiroguramusquare;3315",
+ "kiromeetorusquare;3316",
+ "guramusquare;3318",
+ "kooposquare;331E",
+ "sentisquare;3322",
+ "sentosquare;3323",
+ "dorusquare;3326",
+ "tonsquare;3327",
+ "haitusquare;332A",
+ "paasentosquare;332B",
+ "birusquare;3331",
+ "huiitosquare;3333",
+ "hekutaarusquare;3336",
+ "herutusquare;3339",
+ "peezisquare;333B",
+ "hoonsquare;3342",
+ "mansyonsquare;3347",
+ "mirisquare;3349",
+ "miribaarusquare;334A",
+ "meetorusquare;334D",
+ "yaadosquare;334E",
+ "rittorusquare;3351",
+ "wattosquare;3357",
+ "heiseierasquare;337B",
+ "syouwaerasquare;337C",
+ "taisyouerasquare;337D",
+ "meizierasquare;337E",
+ "corporationsquare;337F",
+ "paampssquare;3380",
+ "nasquare;3381",
+ "muasquare;3382",
+ "masquare;3383",
+ "kasquare;3384",
+ "KBsquare;3385",
+ "MBsquare;3386",
+ "GBsquare;3387",
+ "calsquare;3388",
+ "kcalsquare;3389",
+ "pfsquare;338A",
+ "nfsquare;338B",
+ "mufsquare;338C",
+ "mugsquare;338D",
+ "squaremg;338E",
+ "squarekg;338F",
+ "Hzsquare;3390",
+ "khzsquare;3391",
+ "mhzsquare;3392",
+ "ghzsquare;3393",
+ "thzsquare;3394",
+ "mulsquare;3395",
+ "mlsquare;3396",
+ "dlsquare;3397",
+ "klsquare;3398",
+ "fmsquare;3399",
+ "nmsquare;339A",
+ "mumsquare;339B",
+ "squaremm;339C",
+ "squarecm;339D",
+ "squarekm;339E",
+ "mmsquaredsquare;339F",
+ "cmsquaredsquare;33A0",
+ "squaremsquared;33A1",
+ "kmsquaredsquare;33A2",
+ "mmcubedsquare;33A3",
+ "cmcubedsquare;33A4",
+ "mcubedsquare;33A5",
+ "kmcubedsquare;33A6",
+ "moverssquare;33A7",
+ "moverssquaredsquare;33A8",
+ "pasquare;33A9",
+ "kpasquare;33AA",
+ "mpasquare;33AB",
+ "gpasquare;33AC",
+ "radsquare;33AD",
+ "radoverssquare;33AE",
+ "radoverssquaredsquare;33AF",
+ "pssquare;33B0",
+ "nssquare;33B1",
+ "mussquare;33B2",
+ "mssquare;33B3",
+ "pvsquare;33B4",
+ "nvsquare;33B5",
+ "muvsquare;33B6",
+ "mvsquare;33B7",
+ "kvsquare;33B8",
+ "mvmegasquare;33B9",
+ "pwsquare;33BA",
+ "nwsquare;33BB",
+ "muwsquare;33BC",
+ "mwsquare;33BD",
+ "kwsquare;33BE",
+ "mwmegasquare;33BF",
+ "kohmsquare;33C0",
+ "mohmsquare;33C1",
+ "amsquare;33C2",
+ "bqsquare;33C3",
+ "squarecc;33C4",
+ "cdsquare;33C5",
+ "coverkgsquare;33C6",
+ "cosquare;33C7",
+ "dbsquare;33C8",
+ "gysquare;33C9",
+ "hasquare;33CA",
+ "HPsquare;33CB",
+ "KKsquare;33CD",
+ "squarekmcapital;33CE",
+ "ktsquare;33CF",
+ "lmsquare;33D0",
+ "squareln;33D1",
+ "squarelog;33D2",
+ "lxsquare;33D3",
+ "mbsquare;33D4",
+ "squaremil;33D5",
+ "molsquare;33D6",
+ "pmsquare;33D8",
+ "srsquare;33DB",
+ "svsquare;33DC",
+ "wbsquare;33DD",
+ "twentyhangzhou;5344",
+ "f_f.liga;FB00",
+ "ff;FB00",
+ "f_f;FB00",
+ "f_i.liga;FB01",
+ "f_i;FB01",
+ "fi;FB01",
+ "f_l.liga;FB02",
+ "f_l;FB02",
+ "fl;FB02",
+ "f_f_i.liga;FB03",
+ "ffi;FB03",
+ "f_f_i;FB03",
+ "f_f_l.liga;FB04",
+ "ffl;FB04",
+ "f_f_l;FB04",
+ "longs_t.dlig;FB05",
+ "longs_t.liga;FB05",
+ "longst;FB05",
+ "longs_t;FB05",
+ "s_t.dlig;FB06",
+ "s_t.liga;FB06",
+ "st;FB06",
+ "s_t;FB06",
+ "varika;FB1E",
+ "doubleyodpatah;FB1F",
+ "doubleyodpatahhebrew;FB1F",
+ "yodyodpatahhebrew;FB1F",
+ "afii57705;FB1F",
+ "ayinaltonehebrew;FB20",
+ "shinshindot;FB2A",
+ "shinshindothebrew;FB2A",
+ "afii57694;FB2A",
+ "shinsindot;FB2B",
+ "shinsindothebrew;FB2B",
+ "afii57695;FB2B",
+ "afii57696;FB2C",
+ "shindageshshindot;FB2C",
+ "shindageshshindothebrew;FB2C",
+ "afii57697;FB2D",
+ "shindageshsindot;FB2D",
+ "shindageshsindothebrew;FB2D",
+ "alefpatahhebrew;FB2E",
+ "alefqamatshebrew;FB2F",
+ "alefdageshhebrew;FB30",
+ "afii57691;FB31",
+ "betdagesh;FB31",
+ "betdageshhebrew;FB31",
+ "afii57720;FB32",
+ "gimeldagesh;FB32",
+ "gimeldageshhebrew;FB32",
+ "afii57721;FB33",
+ "daletdagesh;FB33",
+ "daletdageshhebrew;FB33",
+ "afii57722;FB34",
+ "hedagesh;FB34",
+ "hedageshhebrew;FB34",
+ "vavdagesh;FB35",
+ "vavdagesh65;FB35",
+ "vavdageshhebrew;FB35",
+ "afii57723;FB35",
+ "afii57724;FB36",
+ "zayindagesh;FB36",
+ "zayindageshhebrew;FB36",
+ "afii57725;FB38",
+ "tetdagesh;FB38",
+ "tetdageshhebrew;FB38",
+ "afii57726;FB39",
+ "yoddagesh;FB39",
+ "yoddageshhebrew;FB39",
+ "afii57761;FB3A",
+ "finalkafdagesh;FB3A",
+ "finalkafdageshhebrew;FB3A",
+ "c8564;FB3B",
+ "kafdagesh;FB3B",
+ "kafdageshhebrew;FB3B",
+ "afii57762;FB3C",
+ "lameddagesh;FB3C",
+ "lameddageshhebrew;FB3C",
+ "afii57763;FB3E",
+ "memdagesh;FB3E",
+ "memdageshhebrew;FB3E",
+ "afii57764;FB40",
+ "nundagesh;FB40",
+ "nundageshhebrew;FB40",
+ "afii57765;FB41",
+ "samekhdagesh;FB41",
+ "samekhdageshhebrew;FB41",
+ "pefinaldageshhebrew;FB43",
+ "afii57766;FB44",
+ "pedagesh;FB44",
+ "pedageshhebrew;FB44",
+ "afii57767;FB46",
+ "tsadidagesh;FB46",
+ "tsadidageshhebrew;FB46",
+ "afii57768;FB47",
+ "qofdagesh;FB47",
+ "qofdageshhebrew;FB47",
+ "reshdageshhebrew;FB48",
+ "afii57770;FB49",
+ "shindagesh;FB49",
+ "shindageshhebrew;FB49",
+ "afii57771;FB4A",
+ "tavdages;FB4A",
+ "tavdagesh;FB4A",
+ "tavdageshhebrew;FB4A",
+ "vavholam;FB4B",
+ "vavholamhebrew;FB4B",
+ "afii57700;FB4B",
+ "betrafehebrew;FB4C",
+ "kafrafehebrew;FB4D",
+ "perafehebrew;FB4E",
+ "aleflamedhebrew;FB4F",
+ "pehfinalarabic;FB57",
+ "pehinitialarabic;FB58",
+ "pehmedialarabic;FB59",
+ "ttehfinalarabic;FB67",
+ "ttehinitialarabic;FB68",
+ "ttehmedialarabic;FB69",
+ "vehfinalarabic;FB6B",
+ "vehinitialarabic;FB6C",
+ "vehmedialarabic;FB6D",
+ "tchehfinalarabic;FB7B",
+ "tchehinitialarabic;FB7C",
+ "tchehmedialarabic;FB7D",
+ "ddalfinalarabic;FB89",
+ "jehfinalarabic;FB8B",
+ "rrehfinalarabic;FB8D",
+ "c19424;FB90",
+ "gaffinalarabic;FB93",
+ "gafinitialarabic;FB94",
+ "gafmedialarabic;FB95",
+ "noonghunnafinalarabic;FB9F",
+ "hehhamzaaboveisolatedarabic;FBA4",
+ "hehhamzaabovefinalarabic;FBA5",
+ "hehfinalaltonearabic;FBA7",
+ "hehinitialaltonearabic;FBA8",
+ "hehmedialaltonearabic;FBA9",
+ "yehbarreefinalarabic;FBAF",
+ "c19440;FBFD",
+ "behmeemisolatedarabic;FC08",
+ "c24065;FC08",
+ "tehjeemisolatedarabic;FC0B",
+ "tehhahisolatedarabic;FC0C",
+ "c24066;FC0E",
+ "tehmeemisolatedarabic;FC0E",
+ "c20220;FC32",
+ "c24069;FC3F",
+ "c24070;FC40",
+ "c24071;FC41",
+ "c20631;FC42",
+ "c20224;FC43",
+ "c20222;FC44",
+ "meemmeemisolatedarabic;FC48",
+ "noonjeemisolatedarabic;FC4B",
+ "c24068;FC4E",
+ "noonmeemisolatedarabic;FC4E",
+ "yehmeemisolatedarabic;FC58",
+ "c19498;FC5E",
+ "shaddadammatanarabic;FC5E",
+ "c19497;FC5F",
+ "shaddakasratanarabic;FC5F",
+ "c19493;FC60",
+ "shaddafathaarabic;FC60",
+ "c19495;FC61",
+ "shaddadammaarabic;FC61",
+ "c19494;FC62",
+ "shaddakasraarabic;FC62",
+ "c20622;FC6A",
+ "behnoonfinalarabic;FC6D",
+ "c24081;FC6D",
+ "c24074;FC6F",
+ "c20650;FC70",
+ "c24082;FC73",
+ "tehnoonfinalarabic;FC73",
+ "c20652;FC75",
+ "noonnoonfinalarabic;FC8D",
+ "c20641;FC8F",
+ "c20254;FC91",
+ "c20255;FC94",
+ "yehnoonfinalarabic;FC94",
+ "c24075;FC9C",
+ "c24076;FC9D",
+ "c24077;FC9E",
+ "behmeeminitialarabic;FC9F",
+ "c20621;FC9F",
+ "c20646;FCA1",
+ "tehjeeminitialarabic;FCA1",
+ "c20644;FCA2",
+ "tehhahinitialarabic;FCA2",
+ "c20647;FCA3",
+ "c20648;FCA4",
+ "tehmeeminitialarabic;FCA4",
+ "c24067;FCA6",
+ "c20626;FCA8",
+ "c20624;FCAA",
+ "c20627;FCAC",
+ "c24072;FCB0",
+ "c20251;FCC9",
+ "lamjeeminitialarabic;FCC9",
+ "c20252;FCCA",
+ "lamhahinitialarabic;FCCA",
+ "c20253;FCCB",
+ "lamkhahinitialarabic;FCCB",
+ "c20250;FCCC",
+ "lammeeminitialarabic;FCCC",
+ "c20630;FCCD",
+ "c20633;FCCE",
+ "c20632;FCCF",
+ "c20634;FCD0",
+ "c20635;FCD1",
+ "meemmeeminitialarabic;FCD1",
+ "c24078;FCD2",
+ "noonjeeminitialarabic;FCD2",
+ "c24079;FCD3",
+ "c24080;FCD4",
+ "c20639;FCD5",
+ "noonmeeminitialarabic;FCD5",
+ "c20656;FCDA",
+ "c20654;FCDB",
+ "c20657;FCDC",
+ "c20658;FCDD",
+ "yehmeeminitialarabic;FCDD",
+ "c24073;FD30",
+ "c21128;FD3E",
+ "parenleftaltonearabic;FD3E",
+ "c21129;FD3F",
+ "parenrightaltonearabic;FD3F",
+ "c24091;FD88",
+ "lammeemhahinitialarabic;FD88",
+ "c20182;FDF2",
+ "lamlamhehisolatedarabic;FDF2",
+ "sallallahoualayhewasallamarabic;FDFA",
+ "twodotleadervertical;FE30",
+ "emdashvertical;FE31",
+ "endashvertical;FE32",
+ "underscorevertical;FE33",
+ "wavyunderscorevertical;FE34",
+ "parenleftvertical;FE35",
+ "parenrightvertical;FE36",
+ "braceleftvertical;FE37",
+ "bracerightvertical;FE38",
+ "tortoiseshellbracketleftvertical;FE39",
+ "tortoiseshellbracketrightvertical;FE3A",
+ "blacklenticularbracketleftvertical;FE3B",
+ "blacklenticularbracketrightvertical;FE3C",
+ "dblanglebracketleftvertical;FE3D",
+ "dblanglebracketrightvertical;FE3E",
+ "anglebracketleftvertical;FE3F",
+ "anglebracketrightvertical;FE40",
+ "cornerbracketleftvertical;FE41",
+ "cornerbracketrightvertical;FE42",
+ "whitecornerbracketleftvertical;FE43",
+ "whitecornerbracketrightvertical;FE44",
+ "overlinedashed;FE49",
+ "overlinecenterline;FE4A",
+ "overlinewavy;FE4B",
+ "overlinedblwavy;FE4C",
+ "lowlinedashed;FE4D",
+ "lowlinecenterline;FE4E",
+ "underscorewavy;FE4F",
+ "commasmall;FE50",
+ "periodsmall;FE52",
+ "semicolonsmall;FE54",
+ "colonsmall;FE55",
+ "parenleftsmall;FE59",
+ "parenrightsmall;FE5A",
+ "braceleftsmall;FE5B",
+ "bracerightsmall;FE5C",
+ "tortoiseshellbracketleftsmall;FE5D",
+ "tortoiseshellbracketrightsmall;FE5E",
+ "numbersignsmall;FE5F",
+ "asterisksmall;FE61",
+ "plussmall;FE62",
+ "hyphensmall;FE63",
+ "lesssmall;FE64",
+ "greatersmall;FE65",
+ "equalsmall;FE66",
+ "dollarsmall;FE69",
+ "percentsmall;FE6A",
+ "atsmall;FE6B",
+ "c19482;FE70",
+ "c19484;FE72",
+ "c24054;FE74",
+ "c19479;FE76",
+ "c19481;FE78",
+ "c19999;FE7A",
+ "c19492;FE7C",
+ "c19491;FE7E",
+ "c24189;FE80",
+ "c20174;FE81",
+ "alefmaddaabovefinalarabic;FE82",
+ "c20175;FE82",
+ "c24198;FE83",
+ "alefhamzaabovefinalarabic;FE84",
+ "c24199;FE84",
+ "c24194;FE85",
+ "c24195;FE86",
+ "wawhamzaabovefinalarabic;FE86",
+ "c24200;FE87",
+ "alefhamzabelowfinalarabic;FE88",
+ "c24201;FE88",
+ "c24190;FE89",
+ "c24193;FE8A",
+ "yehhamzaabovefinalarabic;FE8A",
+ "c24191;FE8B",
+ "yehhamzaaboveinitialarabic;FE8B",
+ "c24192;FE8C",
+ "yehhamzaabovemedialarabic;FE8C",
+ "c20051;FE8D",
+ "aleffinalarabic;FE8E",
+ "c20052;FE8E",
+ "c20053;FE8F",
+ "behfinalarabic;FE90",
+ "c20056;FE90",
+ "behinitialarabic;FE91",
+ "c20054;FE91",
+ "behmedialarabic;FE92",
+ "c20055;FE92",
+ "c20153;FE93",
+ "c20154;FE94",
+ "tehmarbutafinalarabic;FE94",
+ "c20057;FE95",
+ "c20060;FE96",
+ "tehfinalarabic;FE96",
+ "c20058;FE97",
+ "tehinitialarabic;FE97",
+ "c20059;FE98",
+ "tehmedialarabic;FE98",
+ "c20061;FE99",
+ "c20064;FE9A",
+ "thehfinalarabic;FE9A",
+ "c20062;FE9B",
+ "thehinitialarabic;FE9B",
+ "c20063;FE9C",
+ "thehmedialarabic;FE9C",
+ "c20065;FE9D",
+ "c20068;FE9E",
+ "jeemfinalarabic;FE9E",
+ "c20066;FE9F",
+ "jeeminitialarabic;FE9F",
+ "c20067;FEA0",
+ "jeemmedialarabic;FEA0",
+ "c20069;FEA1",
+ "c20072;FEA2",
+ "hahfinalarabic;FEA2",
+ "c20070;FEA3",
+ "hahinitialarabic;FEA3",
+ "c20071;FEA4",
+ "hahmedialarabic;FEA4",
+ "c20073;FEA5",
+ "c20076;FEA6",
+ "khahfinalarabic;FEA6",
+ "c20074;FEA7",
+ "khahinitialarabic;FEA7",
+ "c20075;FEA8",
+ "khahmedialarabic;FEA8",
+ "c20077;FEA9",
+ "c20078;FEAA",
+ "dalfinalarabic;FEAA",
+ "c20079;FEAB",
+ "c20080;FEAC",
+ "thalfinalarabic;FEAC",
+ "c20081;FEAD",
+ "c20082;FEAE",
+ "rehfinalarabic;FEAE",
+ "c20083;FEAF",
+ "c20084;FEB0",
+ "zainfinalarabic;FEB0",
+ "c20085;FEB1",
+ "c20088;FEB2",
+ "seenfinalarabic;FEB2",
+ "c20086;FEB3",
+ "seeninitialarabic;FEB3",
+ "c20087;FEB4",
+ "seenmedialarabic;FEB4",
+ "c20089;FEB5",
+ "sheenfinalarabic;FEB6",
+ "sheeninitialarabic;FEB7",
+ "sheenmedialarabic;FEB8",
+ "c20096;FEBA",
+ "sadfinalarabic;FEBA",
+ "sadinitialarabic;FEBB",
+ "sadmedialarabic;FEBC",
+ "c20097;FEBD",
+ "c20100;FEBE",
+ "dadfinalarabic;FEBE",
+ "dadinitialarabic;FEBF",
+ "c20099;FEC0",
+ "dadmedialarabic;FEC0",
+ "c20101;FEC1",
+ "c20104;FEC2",
+ "tahfinalarabic;FEC2",
+ "c20102;FEC3",
+ "tahinitialarabic;FEC3",
+ "c20103;FEC4",
+ "tahmedialarabic;FEC4",
+ "c20105;FEC5",
+ "c20108;FEC6",
+ "zahfinalarabic;FEC6",
+ "c20106;FEC7",
+ "zahinitialarabic;FEC7",
+ "c20107;FEC8",
+ "zahmedialarabic;FEC8",
+ "c20109;FEC9",
+ "ainfinalarabic;FECA",
+ "c20112;FECA",
+ "aininitialarabic;FECB",
+ "c20110;FECB",
+ "ainmedialarabic;FECC",
+ "c20111;FECC",
+ "c20113;FECD",
+ "c20116;FECE",
+ "ghainfinalarabic;FECE",
+ "c20114;FECF",
+ "ghaininitialarabic;FECF",
+ "c20115;FED0",
+ "ghainmedialarabic;FED0",
+ "c20117;FED1",
+ "c20120;FED2",
+ "fehfinalarabic;FED2",
+ "c20118;FED3",
+ "fehinitialarabic;FED3",
+ "c20119;FED4",
+ "fehmedialarabic;FED4",
+ "c20121;FED5",
+ "c20124;FED6",
+ "qaffinalarabic;FED6",
+ "c20122;FED7",
+ "qafinitialarabic;FED7",
+ "c20123;FED8",
+ "qafmedialarabic;FED8",
+ "c20125;FED9",
+ "c20128;FEDA",
+ "kaffinalarabic;FEDA",
+ "c20126;FEDB",
+ "kafinitialarabic;FEDB",
+ "c20127;FEDC",
+ "kafmedialarabic;FEDC",
+ "c20129;FEDD",
+ "c20132;FEDE",
+ "lamfinalarabic;FEDE",
+ "c20130;FEDF",
+ "laminitialarabic;FEDF",
+ "c20131;FEE0",
+ "lammedialarabic;FEE0",
+ "c20133;FEE1",
+ "c20136;FEE2",
+ "meemfinalarabic;FEE2",
+ "c20134;FEE3",
+ "meeminitialarabic;FEE3",
+ "c20135;FEE4",
+ "meemmedialarabic;FEE4",
+ "c20137;FEE5",
+ "c20140;FEE6",
+ "noonfinalarabic;FEE6",
+ "c20138;FEE7",
+ "nooninitialarabic;FEE7",
+ "c20139;FEE8",
+ "noonmedialarabic;FEE8",
+ "c20141;FEE9",
+ "c20144;FEEA",
+ "hehfinalalttwoarabic;FEEA",
+ "hehfinalarabic;FEEA",
+ "c20142;FEEB",
+ "hehinitialarabic;FEEB",
+ "c20143;FEEC",
+ "hehmedialarabic;FEEC",
+ "c20145;FEED",
+ "c20147;FEEE",
+ "wawfinalarabic;FEEE",
+ "c20256;FEEF",
+ "alefmaksurafinalarabic;FEF0",
+ "c20257;FEF0",
+ "c20148;FEF1",
+ "c20151;FEF2",
+ "yehfinalarabic;FEF2",
+ "alefmaksurainitialarabic;FEF3",
+ "c20149;FEF3",
+ "yehinitialarabic;FEF3",
+ "alefmaksuramedialarabic;FEF4",
+ "c20150;FEF4",
+ "yehmedialarabic;FEF4",
+ "c20214;FEF5",
+ "lamalefmaddaaboveisolatedarabic;FEF5",
+ "c20215;FEF6",
+ "lamalefmaddaabovefinalarabic;FEF6",
+ "c24202;FEF7",
+ "lamalefhamzaaboveisolatedarabic;FEF7",
+ "c24203;FEF8",
+ "lamalefhamzaabovefinalarabic;FEF8",
+ "c24206;FEF9",
+ "lamalefhamzabelowisolatedarabic;FEF9",
+ "c24207;FEFA",
+ "lamalefhamzabelowfinalarabic;FEFA",
+ "c20208;FEFB",
+ "lamalefisolatedarabic;FEFB",
+ "c20209;FEFC",
+ "lamaleffinalarabic;FEFC",
+ "bom;FEFF",
+ "zerowidthjoiner;FEFF",
+ "exclammonospace;FF01",
+ "quotedblmonospace;FF02",
+ "numbersignmonospace;FF03",
+ "dollarmonospace;FF04",
+ "percentmonospace;FF05",
+ "ampersandmonospace;FF06",
+ "quotesinglemonospace;FF07",
+ "parenleftmonospace;FF08",
+ "parenrightmonospace;FF09",
+ "asteriskmonospace;FF0A",
+ "plusmonospace;FF0B",
+ "commamonospace;FF0C",
+ "hyphenmonospace;FF0D",
+ "periodmonospace;FF0E",
+ "slashmonospace;FF0F",
+ "zeromonospace;FF10",
+ "onemonospace;FF11",
+ "twomonospace;FF12",
+ "threemonospace;FF13",
+ "fourmonospace;FF14",
+ "fivemonospace;FF15",
+ "sixmonospace;FF16",
+ "sevenmonospace;FF17",
+ "eightmonospace;FF18",
+ "ninemonospace;FF19",
+ "colonmonospace;FF1A",
+ "semicolonmonospace;FF1B",
+ "lessmonospace;FF1C",
+ "equalmonospace;FF1D",
+ "greatermonospace;FF1E",
+ "questionmonospace;FF1F",
+ "atmonospace;FF20",
+ "Amonospace;FF21",
+ "Bmonospace;FF22",
+ "Cmonospace;FF23",
+ "Dmonospace;FF24",
+ "Emonospace;FF25",
+ "Fmonospace;FF26",
+ "Gmonospace;FF27",
+ "Hmonospace;FF28",
+ "Imonospace;FF29",
+ "Jmonospace;FF2A",
+ "Kmonospace;FF2B",
+ "Lmonospace;FF2C",
+ "Mmonospace;FF2D",
+ "Nmonospace;FF2E",
+ "Omonospace;FF2F",
+ "Pmonospace;FF30",
+ "Qmonospace;FF31",
+ "Rmonospace;FF32",
+ "Smonospace;FF33",
+ "Tmonospace;FF34",
+ "Umonospace;FF35",
+ "Vmonospace;FF36",
+ "Wmonospace;FF37",
+ "Xmonospace;FF38",
+ "Ymonospace;FF39",
+ "Zmonospace;FF3A",
+ "bracketleftmonospace;FF3B",
+ "backslashmonospace;FF3C",
+ "bracketrightmonospace;FF3D",
+ "asciicircummonospace;FF3E",
+ "underscoremonospace;FF3F",
+ "gravemonospace;FF40",
+ "amonospace;FF41",
+ "bmonospace;FF42",
+ "cmonospace;FF43",
+ "dmonospace;FF44",
+ "emonospace;FF45",
+ "fmonospace;FF46",
+ "gmonospace;FF47",
+ "hmonospace;FF48",
+ "imonospace;FF49",
+ "jmonospace;FF4A",
+ "kmonospace;FF4B",
+ "lmonospace;FF4C",
+ "mmonospace;FF4D",
+ "nmonospace;FF4E",
+ "omonospace;FF4F",
+ "pmonospace;FF50",
+ "qmonospace;FF51",
+ "rmonospace;FF52",
+ "smonospace;FF53",
+ "tmonospace;FF54",
+ "umonospace;FF55",
+ "vmonospace;FF56",
+ "wmonospace;FF57",
+ "xmonospace;FF58",
+ "ymonospace;FF59",
+ "zmonospace;FF5A",
+ "braceleftmonospace;FF5B",
+ "barmonospace;FF5C",
+ "bracerightmonospace;FF5D",
+ "asciitildemonospace;FF5E",
+ "periodhalfwidth;FF61",
+ "cornerbracketlefthalfwidth;FF62",
+ "cornerbracketrighthalfwidth;FF63",
+ "ideographiccommaleft;FF64",
+ "middledotkatakanahalfwidth;FF65",
+ "wokatakanahalfwidth;FF66",
+ "asmallkatakanahalfwidth;FF67",
+ "ismallkatakanahalfwidth;FF68",
+ "usmallkatakanahalfwidth;FF69",
+ "esmallkatakanahalfwidth;FF6A",
+ "osmallkatakanahalfwidth;FF6B",
+ "yasmallkatakanahalfwidth;FF6C",
+ "yusmallkatakanahalfwidth;FF6D",
+ "yosmallkatakanahalfwidth;FF6E",
+ "tusmallkatakanahalfwidth;FF6F",
+ "katahiraprolongmarkhalfwidth;FF70",
+ "ikatakanahalfwidth;FF72",
+ "ukatakanahalfwidth;FF73",
+ "ekatakanahalfwidth;FF74",
+ "okatakanahalfwidth;FF75",
+ "kakatakanahalfwidth;FF76",
+ "kikatakanahalfwidth;FF77",
+ "kukatakanahalfwidth;FF78",
+ "kekatakanahalfwidth;FF79",
+ "kokatakanahalfwidth;FF7A",
+ "sakatakanahalfwidth;FF7B",
+ "sikatakanahalfwidth;FF7C",
+ "sukatakanahalfwidth;FF7D",
+ "sekatakanahalfwidth;FF7E",
+ "sokatakanahalfwidth;FF7F",
+ "takatakanahalfwidth;FF80",
+ "tikatakanahalfwidth;FF81",
+ "tukatakanahalfwidth;FF82",
+ "tekatakanahalfwidth;FF83",
+ "tokatakanahalfwidth;FF84",
+ "nakatakanahalfwidth;FF85",
+ "nikatakanahalfwidth;FF86",
+ "nukatakanahalfwidth;FF87",
+ "nekatakanahalfwidth;FF88",
+ "nokatakanahalfwidth;FF89",
+ "hakatakanahalfwidth;FF8A",
+ "hikatakanahalfwidth;FF8B",
+ "hukatakanahalfwidth;FF8C",
+ "hekatakanahalfwidth;FF8D",
+ "hokatakanahalfwidth;FF8E",
+ "makatakanahalfwidth;FF8F",
+ "mikatakanahalfwidth;FF90",
+ "mukatakanahalfwidth;FF91",
+ "mekatakanahalfwidth;FF92",
+ "mokatakanahalfwidth;FF93",
+ "yakatakanahalfwidth;FF94",
+ "yukatakanahalfwidth;FF95",
+ "yokatakanahalfwidth;FF96",
+ "rakatakanahalfwidth;FF97",
+ "rikatakanahalfwidth;FF98",
+ "rukatakanahalfwidth;FF99",
+ "rekatakanahalfwidth;FF9A",
+ "rokatakanahalfwidth;FF9B",
+ "wakatakanahalfwidth;FF9C",
+ "nkatakanahalfwidth;FF9D",
+ "voicedmarkkanahalfwidth;FF9E",
+ "semivoicedmarkkanahalfwidth;FF9F",
+ "centmonospace;FFE0",
+ "sterlingmonospace;FFE1",
+ "macronmonospace;FFE3",
+ "yenmonospace;FFE5",
+ "wonmonospace;FFE6",
+ "AEsmall;F7E6",
+ "Aacutesmall;F7E1",
+ "Acircumflexsmall;F7E2",
+ "Acute;F6C9",
+ "Acutesmall;F7B4",
+ "Adieresissmall;F7E4",
+ "Agravesmall;F7E0",
+ "Aringsmall;F7E5",
+ "Asmall;F761",
+ "Atildesmall;F7E3",
+ "Brevesmall;F6F4",
+ "Bsmall;F762",
+ "Caron;F6CA",
+ "Caronsmall;F6F5",
+ "Ccedillasmall;F7E7",
+ "Cedillasmall;F7B8",
+ "Circumflexsmall;F6F6",
+ "Csmall;F763",
+ "Daarmenian;0534",
+ "Dieresis;F6CB",
+ "DieresisAcute;F6CC",
+ "DieresisGrave;F6CD",
+ "Dieresissmall;F7A8",
+ "Dotaccentsmall;F6F7",
+ "Dsmall;F764",
+ "Eacutesmall;F7E9",
+ "Ecircumflexsmall;F7EA",
+ "Edieresissmall;F7EB",
+ "Egravesmall;F7E8",
+ "Esmall;F765",
+ "Ethsmall;F7F0",
+ "Fsmall;F766",
+ "Grave;F6CE",
+ "Gravesmall;F760",
+ "Gsmall;F767",
+ "Horicoptic;03E8",
+ "Hsmall;F768",
+ "Hungarumlaut;F6CF",
+ "Hungarumlautsmall;F6F8",
+ "Iacutesmall;F7ED",
+ "Icircumflexsmall;F7EE",
+ "Idieresissmall;F7EF",
+ "Igravesmall;F7EC",
+ "Ismall;F769",
+ "Jsmall;F76A",
+ "Ksmall;F76B",
+ "LL;F6BF",
+ "Lslashsmall;F6F9",
+ "Lsmall;F76C",
+ "Macron;F6D0",
+ "Macronsmall;F7AF",
+ "Msmall;F76D",
+ "Nsmall;F76E",
+ "Ntildesmall;F7F1",
+ "OEsmall;F6FA",
+ "Oacutesmall;F7F3",
+ "Ocircumflexsmall;F7F4",
+ "Odieresissmall;F7F6",
+ "Ogoneksmall;F6FB",
+ "Ogravesmall;F7F2",
+ "Oslashsmall;F7F8",
+ "Osmall;F76F",
+ "Otildesmall;F7F5",
+ "Psmall;F770",
+ "Qsmall;F771",
+ "Rdotaccent;1E58",
+ "Ringsmall;F6FC",
+ "Rsmall;F772",
+ "Scaronsmall;F6FD",
+ "Seharmenian;054D",
+ "Softsigncyrillic;042C",
+ "Ssmall;F773",
+ "Thornsmall;F7FE",
+ "Tildesmall;F6FE",
+ "Tsmall;F774",
+ "Uacutesmall;F7FA",
+ "Ucircumflexsmall;F7FB",
+ "Udieresissmall;F7FC",
+ "Ugravesmall;F7F9",
+ "Usmall;F775",
+ "Vsmall;F776",
+ "Wsmall;F777",
+ "Xsmall;F778",
+ "Yacutesmall;F7FD",
+ "Ydieresissmall;F7FF",
+ "Ysmall;F779",
+ "Zcaronsmall;F6FF",
+ "Zsmall;F77A",
+ "afii10063;F6C4",
+ "afii10064;F6C5",
+ "afii10192;F6C6",
+ "afii10831;F6C7",
+ "afii10832;F6C8",
+ "akatakanahalfwidth;FF71",
+ "ampersandsmall;F726",
+ "apple;F8FF",
+ "arrowhorizex;F8E7",
+ "arrowvertex;F8E6",
+ "asuperior;F6E9",
+ "auvowelsigndeva;094C",
+ "braceex;F8F4",
+ "braceleftbt;F8F3",
+ "braceleftmid;F8F2",
+ "bracelefttp;F8F1",
+ "bracerightbt;F8FE",
+ "bracerightmid;F8FD",
+ "bracerighttp;F8FC",
+ "bracketleftbt;F8F0",
+ "bracketleftex;F8EF",
+ "bracketlefttp;F8EE",
+ "bracketrightbt;F8FB",
+ "bracketrightex;F8FA",
+ "bracketrighttp;F8F9",
+ "bsuperior;F6EA",
+ "centinferior;F6DF",
+ "centoldstyle;F7A2",
+ "centsuperior;F6E0",
+ "commaaccent;F6C3",
+ "commainferior;F6E1",
+ "commasuperior;F6E2",
+ "controlACK;0006",
+ "controlBEL;0007",
+ "controlBS;0008",
+ "controlCAN;0018",
+ "controlCR;000D",
+ "controlDC1;0011",
+ "controlDC2;0012",
+ "controlDC3;0013",
+ "controlDC4;0014",
+ "controlDLE;0010",
+ "controlEM;0019",
+ "controlENQ;0005",
+ "controlEOT;0004",
+ "controlESC;001B",
+ "controlETB;0017",
+ "controlETX;0003",
+ "controlFF;000C",
+ "controlFS;001C",
+ "controlGS;001D",
+ "controlHT;0009",
+ "controlLF;000A",
+ "controlNAK;0015",
+ "controlRS;001E",
+ "controlSI;000F",
+ "controlSO;000E",
+ "controlSOT;0002",
+ "controlSTX;0001",
+ "controlSUB;001A",
+ "controlSYN;0016",
+ "controlUS;001F",
+ "controlVT;000B",
+ "copyrightsans;F8E9",
+ "copyrightserif;F6D9",
+ "cyrBreve;F6D1",
+ "cyrFlex;F6D2",
+ "cyrbreve;F6D4",
+ "cyrflex;F6D5",
+ "dalethatafpatah;05D3 05B2",
+ "dalethatafpatahhebrew;05D3 05B2",
+ "dalethatafsegol;05D3 05B1",
+ "dalethatafsegolhebrew;05D3 05B1",
+ "dalethiriq;05D3 05B4",
+ "dalethiriqhebrew;05D3 05B4",
+ "daletholam;05D3 05B9",
+ "daletholamhebrew;05D3 05B9",
+ "daletpatah;05D3 05B7",
+ "daletpatahhebrew;05D3 05B7",
+ "daletqamats;05D3 05B8",
+ "daletqamatshebrew;05D3 05B8",
+ "daletqubuts;05D3 05BB",
+ "daletqubutshebrew;05D3 05BB",
+ "daletsegol;05D3 05B6",
+ "daletsegolhebrew;05D3 05B6",
+ "daletsheva;05D3 05B0",
+ "daletshevahebrew;05D3 05B0",
+ "dalettsere;05D3 05B5",
+ "dalettserehebrew;05D3 05B5",
+ "dblGrave;F6D3",
+ "dblgrave;F6D6",
+ "dieresisacute;F6D7",
+ "dieresisgrave;F6D8",
+ "dollarinferior;F6E3",
+ "dollaroldstyle;F724",
+ "dollarsuperior;F6E4",
+ "dsuperior;F6EB",
+ "eightoldstyle;F738",
+ "esuperior;F6EC",
+ "evowelsigndeva;0947",
+ "exclamdownsmall;F7A1",
+ "exclamsmall;F721",
+ "finalkafqamatshebrew;05DA 05B8",
+ "finalkafshevahebrew;05DA 05B0",
+ "fiveoldstyle;F735",
+ "fouroldstyle;F734",
+ "gihiragana;304E",
+ "hamzadammaarabic;0621 064F",
+ "hamzadammatanarabic;0621 064C",
+ "hamzafathaarabic;0621 064E",
+ "hamzafathatanarabic;0621 064B",
+ "hamzalowkasraarabic;0621 0650",
+ "hamzalowkasratanarabic;0621 064D",
+ "hamzasukunarabic;0621 0652",
+ "hihiragana;3072",
+ "hypheninferior;F6E5",
+ "hyphensuperior;F6E6",
+ "ibopomofo;3127",
+ "iivowelsignbengali;09C0",
+ "integralex;F8F5",
+ "isuperior;F6ED",
+ "lamedholamdageshhebrew;05DC 05B9 05BC",
+ "lamedholamhebrew;05DC 05B9",
+ "lammeemjeeminitialarabic;FEDF FEE4 FEA0",
+ "lammeemkhahinitialarabic;FEDF FEE4 FEA8",
+ "ll;F6C0",
+ "lsuperior;F6EE",
+ "lvocalicdeva;090C",
+ "maichattawalowleftthai;F895",
+ "maichattawalowrightthai;F894",
+ "maichattawaupperleftthai;F893",
+ "maieklowleftthai;F88C",
+ "maieklowrightthai;F88B",
+ "maiekupperleftthai;F88A",
+ "maihanakatleftthai;F884",
+ "maitaikhuleftthai;F889",
+ "maitholowleftthai;F88F",
+ "maitholowrightthai;F88E",
+ "maithoupperleftthai;F88D",
+ "maitrilowleftthai;F892",
+ "maitrilowrightthai;F891",
+ "maitriupperleftthai;F890",
+ "msuperior;F6EF",
+ "nikhahitleftthai;F899",
+ "nineoldstyle;F739",
+ "noonhehinitialarabic;FEE7 FEEC",
+ "ocircumflexdotbelow;1ED9",
+ "onefitted;F6DC",
+ "oneoldstyle;F731",
+ "osuperior;F6F0",
+ "parenleftbt;F8ED",
+ "parenleftex;F8EC",
+ "parenlefttp;F8EB",
+ "parenrightbt;F8F8",
+ "parenrightex;F8F7",
+ "parenrighttp;F8F6",
+ "periodinferior;F6E7",
+ "periodsuperior;F6E8",
+ "qofhatafpatah;05E7 05B2",
+ "qofhatafpatahhebrew;05E7 05B2",
+ "qofhatafsegol;05E7 05B1",
+ "qofhatafsegolhebrew;05E7 05B1",
+ "qofhiriq;05E7 05B4",
+ "qofhiriqhebrew;05E7 05B4",
+ "qofholam;05E7 05B9",
+ "qofholamhebrew;05E7 05B9",
+ "qofpatah;05E7 05B7",
+ "qofpatahhebrew;05E7 05B7",
+ "qofqamats;05E7 05B8",
+ "qofqamatshebrew;05E7 05B8",
+ "qofqubuts;05E7 05BB",
+ "qofqubutshebrew;05E7 05BB",
+ "qofsegol;05E7 05B6",
+ "qofsegolhebrew;05E7 05B6",
+ "qofsheva;05E7 05B0",
+ "qofshevahebrew;05E7 05B0",
+ "qoftsere;05E7 05B5",
+ "qoftserehebrew;05E7 05B5",
+ "questiondownsmall;F7BF",
+ "questionsmall;F73F",
+ "radicalex;F8E5",
+ "registersans;F8E8",
+ "registerserif;F6DA",
+ "rehyehaleflamarabic;0631 FEF3 FE8E 0644",
+ "reshhatafpatah;05E8 05B2",
+ "reshhatafpatahhebrew;05E8 05B2",
+ "reshhatafsegol;05E8 05B1",
+ "reshhatafsegolhebrew;05E8 05B1",
+ "reshhiriq;05E8 05B4",
+ "reshhiriqhebrew;05E8 05B4",
+ "reshholam;05E8 05B9",
+ "reshholamhebrew;05E8 05B9",
+ "reshpatah;05E8 05B7",
+ "reshpatahhebrew;05E8 05B7",
+ "reshqamats;05E8 05B8",
+ "reshqamatshebrew;05E8 05B8",
+ "reshqubuts;05E8 05BB",
+ "reshqubutshebrew;05E8 05BB",
+ "reshsegol;05E8 05B6",
+ "reshsegolhebrew;05E8 05B6",
+ "reshsheva;05E8 05B0",
+ "reshshevahebrew;05E8 05B0",
+ "reshtsere;05E8 05B5",
+ "reshtserehebrew;05E8 05B5",
+ "rhookturnedsuperior;02B5",
+ "rsuperior;F6F1",
+ "rupiah;F6DD",
+ "saraiileftthai;F886",
+ "saraileftthai;F885",
+ "saraueeleftthai;F888",
+ "saraueleftthai;F887",
+ "sevenoldstyle;F737",
+ "shaddafathatanarabic;0651 064B",
+ "shalshelethebrew;0593",
+ "sixoldstyle;F736",
+ "ssuperior;F6F2",
+ "tchehmeeminitialarabic;FB7C FEE4",
+ "thanthakhatlowleftthai;F898",
+ "thanthakhatlowrightthai;F897",
+ "thanthakhatupperleftthai;F896",
+ "threeoldstyle;F733",
+ "threeparen;2476",
+ "threequartersemdash;F6DE",
+ "tikatakana;30C1",
+ "trademarksans;F8EA",
+ "trademarkserif;F6DB",
+ "tsuperior;F6F3",
+ "twohangzhou;3022",
+ "twooldstyle;F732",
+ "vav;05D5",
+ "yhook;01B4",
+ "zainarabic;0632",
+ "zarqahebrew;0598",
+ "zerohackarabic;0660",
+ "zerooldstyle;F730",
+ "" /* terminator */
+};
diff --git a/Build/source/texk/xdvipdfmx/src/asl_charset.h b/Build/source/texk/xdvipdfmx/src/asl_charset.h
new file mode 100644
index 00000000000..91192a62cc7
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/asl_charset.h
@@ -0,0 +1,364 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/asl_charset.h,v 1.3 2004/01/30 18:34:19 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _ASL_CHARSET_H_
+#define _ASL_CHARSET_H_
+
+/*
+ * Adobe Standard Latin Character Set - from PLRM 3rd. ed.
+ *
+ * Characters marked as EXT are present in the extended (315-character)
+ * Latin character set, but not in the original (229-character) set.
+ *
+ * This list contains 314 characters, Maybe one character missing.
+ *
+ * Most of strings are also found in cff_stdstr.h.
+ * CFF Standard Strings contains all glyph names from the original ASL
+ * character set (plus Expert set). But it does not contains glyph names
+ * found only in the extented version.
+ *
+ */
+
+#ifdef _ENCODINGS_C_
+#define ASL_CHARSET_MAX 314
+static const char *const
+ASL_Charset[ASL_CHARSET_MAX] = {
+ "A",
+ "AE",
+ "Aacute",
+ "Abreve", /* EXT */
+ "Acircumflex",
+ "Adieresis",
+ "Agrave",
+ "Amacron", /* EXT */
+ "Aogonek", /* EXT */
+ "Aring",
+ "Atilde",
+ "B",
+ "C",
+ "Cacute", /* EXT */
+ "Ccaron", /* EXT */
+ "Ccedilla",
+ "D",
+ "Dcaron", /* EXT */
+ "Dcroat", /* EXT */
+ "Delta", /* EXT */
+ "E",
+ "Eacute",
+ "Ecaron", /* EXT */
+ "Ecircumflex",
+ "Edieresis",
+ "Edotaccent", /* EXT */
+ "Egrave",
+ "Emacron", /* EXT */
+ "Eogonek", /* EXT */
+ "Eth",
+ "F",
+ "G",
+ "Gbreve", /* EXT */
+ "Gcommaaccent", /* EXT */
+ "H",
+ "I",
+ "Iacute",
+ "Icircumflex",
+ "Idieresis",
+ "Idotaccent", /* EXT */
+ "Igrave",
+ "Imacron", /* EXT */
+ "Iogonek", /* EXT */
+ "J",
+ "K",
+ "Kcommaaccent", /* EXT */
+ "L",
+ "Lacute", /* EXT */
+ "Lcaron", /* EXT */
+ "Lcommaaccent", /* EXT */
+ "Lslash",
+ "M",
+ "N",
+ "Nacute", /* EXT */
+ "Ncaron", /* EXT */
+ "Ncommaaccent", /* EXT */
+ "Ntilde",
+ "O",
+ "OE",
+ "Oacute",
+ "Ocircumflex",
+ "Odieresis",
+ "Ograve",
+ "Ohungarumlaut", /* EXT */
+ "Omacron", /* EXT */
+ "Oslash",
+ "Otilde",
+ "P",
+ "Q",
+ "R",
+ "Racute", /* EXT */
+ "Rcaron", /* EXT */
+ "Rcommaaccent", /* EXT */
+ "S",
+ "Sacute", /* EXT */
+ "Scaron",
+ "Scedilla", /* EXT */
+ "Scommaaccent", /* EXT */
+ "T",
+ "Tcaron", /* EXT */
+ "Tcommaaccent", /* EXT */
+ "Thorn",
+ "U",
+ "Uacute",
+ "Ucircumflex",
+ "Udieresis",
+ "Ugrave",
+ "Uhungarumlaut", /* EXT */
+ "Umacron", /* EXT */
+ "Uogonek", /* EXT */
+ "Uring", /* EXT */
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Yacute",
+ "Ydieresis",
+ "Z",
+ "Zacute", /* EXT */
+ "Zcaron",
+ "Zdotaccent", /* EXT */
+ "a",
+ "aacute",
+ "abreve", /* EXT */
+ "acircumflex",
+ "acute",
+ "adieresis",
+ "ae",
+ "agrave",
+ "amacron", /* EXT */
+ "ampersand",
+ "aogonek", /* EXT */
+ "aring",
+ "asciicircum",
+ "asciitilde",
+ "asterisk",
+ "at",
+ "atilde",
+ "b",
+ "backslash",
+ "bar",
+ "braceleft",
+ "braceright",
+ "bracketleft",
+ "bracketright",
+ "breve",
+ "brokenbar",
+ "bullet",
+ "c",
+ "cacute", /* EXT */
+ "caron",
+ "ccaron", /* EXT */
+ "ccedilla",
+ "cedilla",
+ "cent",
+ "circumflex",
+ "colon",
+ "comma",
+ "commaaccent", /* EXT */
+ "copyright",
+ "currency",
+ "d",
+ "dagger",
+ "daggerdbl",
+ "dcaron", /* EXT */
+ "dcroat", /* EXT */
+ "degree",
+ "dieresis",
+ "divide",
+ "dollar",
+ "dotaccent",
+ "dotlessi",
+ "e",
+ "eacute",
+ "ecaron", /* EXT */
+ "ecircumflex",
+ "edieresis",
+ "edotaccent", /* EXT */
+ "egrave",
+ "eight",
+ "ellipsis",
+ "emacron", /* EXT */
+ "emdash",
+ "endash",
+ "eogonek", /* EXT */
+ "equal",
+ "eth",
+ "exclam",
+ "exclamdown",
+ "f",
+ "fi",
+ "five",
+ "fl",
+ "florin",
+ "four",
+ "fraction",
+ "g",
+ "gbreve", /* EXT */
+ "gcammaaccent", /* EXT */
+ "germandbls",
+ "grave",
+ "greater",
+ "greaterequal", /* EXT */
+ "guillemotleft", /* MISSPELED BY ADOBE */
+ "guillemotright", /* MISSPELED BY ADOBE */
+ "guilsinglleft",
+ "guilsinglright",
+ "h",
+ "hungarumlaut",
+ "hyphen",
+ "i",
+ "iacute",
+ "icircumflex",
+ "idieresis",
+ "igrave",
+ "imacron", /* EXT */
+ "iogonek", /* EXT */
+ "j",
+ "k",
+ "kcommaaccent", /* EXT */
+ "l",
+ "lacute", /* EXT */
+ "lcaron", /* EXT */
+ "lcommaaccent", /* EXT */
+ "less",
+ "lessequal", /* EXT */
+ "logicalnot",
+ "lozenge", /* EXT */
+ "lslash",
+ "m",
+ "macron",
+ "minus",
+ "mu",
+ "multiply",
+ "n",
+ "nacute", /* EXT */
+ "ncaron", /* EXT */
+ "ncommaaccent", /* EXT */
+ "nine",
+ "notequal", /* EXT */
+ "ntilde",
+ "numbersign",
+ "o",
+ "oacute",
+ "ocircumflex",
+ "odieresis",
+ "oe",
+ "ogonek",
+ "ograve",
+ "ohungarumlaut", /* EXT */
+ "omacron", /* EXT */
+ "one",
+ "onehalf",
+ "onequarter",
+ "onesuperior",
+ "ordfeminine",
+ "ordmasculine",
+ "oslash",
+ "otilde",
+ "p",
+ "paragraph",
+ "parenleft",
+ "parenright",
+ "partialdiff", /* EXT */
+ "percent",
+ "period",
+ "periodcentered",
+ "perthousand",
+ "plus",
+ "plusminus",
+ "q",
+ "question",
+ "questiondown",
+ "quotedbl",
+ "quotedblbase",
+ "quotedblleft",
+ "quotedblright",
+ "quoteleft",
+ "quoteright",
+ "quotesinglbase",
+ "quotesingle",
+ "r",
+ "racute", /* EXT */
+ "radical", /* EXT */
+ "rcaron", /* EXT */
+ "rcommaaccent", /* EXT */
+ "registered",
+ "ring",
+ "s",
+ "scacute", /* EXT */
+ "scaron",
+ "scedilla", /* EXT */
+ "scommaaccent", /* EXT */
+ "section",
+ "semicolon",
+ "seven",
+ "six",
+ "slash",
+ "space",
+ "sterling",
+ "summation", /* EXT */
+ "t",
+ "tcaron", /* EXT */
+ "tcommaaccent", /* EXT */
+ "thorn",
+ "three",
+ "threequarters",
+ "threesuperior",
+ "tilde",
+ "trademark",
+ "two",
+ "twosuperior",
+ "u",
+ "uacute",
+ "ucircumflex",
+ "udieresis",
+ "ugrave",
+ "uhungarumlaut", /* EXT */
+ "umacron", /* EXT */
+ "underscore",
+ "uogonek", /* EXT */
+ "uring", /* EXT */
+ "v",
+ "w",
+ "x",
+ "y",
+ "yacute",
+ "ydieresis",
+ "yen",
+ "z",
+ "zacute", /* EXT */
+ "zcaron",
+ "zdotaccent", /* EXT */
+ "zero"
+};
+#endif /* _ENCODINGS_C_ */
+
+#endif /* _ASL_CHARSET_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/bmpimage.c b/Build/source/texk/xdvipdfmx/src/bmpimage.c
new file mode 100644
index 00000000000..3897275ca06
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/bmpimage.c
@@ -0,0 +1,466 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/bmpimage.c,v 1.2 2004/07/27 12:08:46 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * BMP SUPPORT:
+ */
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "pdfobj.h"
+
+#include "bmpimage.h"
+
+#define DIB_FILE_HEADER_SIZE 14
+#define DIB_CORE_HEADER_SIZE 14
+#define DIB_INFO_HEADER_SIZE 40
+
+#define DIB_COMPRESS_NONE 0
+#define DIB_COMPRESS_RLE8 1
+#define DIB_COMPRESS_RLE4 2
+
+#define DIB_HEADER_SIZE_MAX (DIB_FILE_HEADER_SIZE+DIB_INFO_HEADER_SIZE)
+
+static long read_raster_rle8 (unsigned char *data_ptr,
+ long width, long height, FILE *fp);
+static long read_raster_rle4 (unsigned char *data_ptr,
+ long width, long height, FILE *fp);
+
+int
+check_for_bmp (FILE *fp)
+{
+ unsigned char sigbytes[2];
+
+ if (!fp)
+ return 0;
+
+ rewind(fp);
+ if (fread(sigbytes, 1, sizeof(sigbytes), fp) != sizeof(sigbytes) ||
+ sigbytes[0] != 'B' || sigbytes[1] != 'M')
+ return 0;
+ else
+ return 1;
+
+ return 0;
+}
+
+int
+bmp_include_image (pdf_ximage *ximage, FILE *fp)
+{
+ pdf_obj *stream, *stream_dict, *colorspace;
+ ximage_info info;
+ unsigned char buf[DIB_HEADER_SIZE_MAX+4];
+ unsigned char *p;
+ long offset, fsize, hsize, compression;
+ long psize; /* Bytes per palette color: 3 for OS2, 4 for Win */
+ unsigned short bit_count; /* Bits per pix */
+ int num_palette, flip;
+ int i;
+ unsigned long biXPelsPerMeter, biYPelsPerMeter;
+
+ pdf_ximage_init_image_info(&info);
+
+ stream = stream_dict = colorspace = NULL;
+ p = buf;
+
+ rewind(fp);
+ if (fread(buf, 1, DIB_FILE_HEADER_SIZE + 4, fp)
+ != DIB_FILE_HEADER_SIZE + 4) {
+ WARN("Could not read BMP file header...");
+ }
+
+ if (p[0] != 'B' || p[1] != 'M') {
+ WARN("File not starting with \'B\' \'M\'... Not a BMP file?");
+ return -1;
+ }
+ p += 2;
+
+#define ULONG_LE(b) ((b)[0] + ((b)[1] << 8) +\
+ ((b)[2] << 16) + ((b)[3] << 24))
+#define USHORT_LE(b) ((b)[0] + ((b)[1] << 8))
+
+ fsize = ULONG_LE(p); p += 4;
+ if (ULONG_LE(p) != 0) {
+ WARN("Not a BMP file???");
+ return -1;
+ }
+ p += 4;
+ offset = ULONG_LE(p); p += 4;
+
+ /* info header */
+ hsize = ULONG_LE(p); p += 4;
+ if (fread(p, sizeof(char), hsize - 4, fp) != hsize - 4) {
+ WARN("Could not read BMP file header...");
+ return -1;
+ }
+ flip = 1;
+ if (hsize == DIB_CORE_HEADER_SIZE) {
+ info.width = USHORT_LE(p); p += 2;
+ info.height = USHORT_LE(p); p += 2;
+ if (USHORT_LE(p) != 1) {
+ WARN("Unknown bcPlanes value in BMP COREHEADER.");
+ return -1;
+ }
+ p += 2;
+ bit_count = USHORT_LE(p); p += 2;
+ compression = DIB_COMPRESS_NONE;
+ psize = 3;
+ } else if (hsize == DIB_INFO_HEADER_SIZE) {
+ info.width = ULONG_LE(p); p += 4;
+ info.height = ULONG_LE(p); p += 4;
+ if (USHORT_LE(p) != 1) {
+ WARN("Unknown biPlanes value in BMP INFOHEADER.");
+ return -1;
+ }
+ p += 2;
+ bit_count = USHORT_LE(p); p += 2;
+ compression = ULONG_LE(p); p += 4;
+ /* ignore biSizeImage */ p += 4;
+ biXPelsPerMeter = ULONG_LE(p); p += 4;
+ biYPelsPerMeter = ULONG_LE(p); p += 4;
+ info.xdpi = biXPelsPerMeter * 0.0254; /* convert pixels per meter to DPI */
+ info.ydpi = biYPelsPerMeter * 0.0254;
+ if (info.height < 0) {
+ info.height = -info.height;
+ flip = 0;
+ }
+ psize = 4;
+ } else {
+ WARN("Unknown BMP header type.");
+ return -1;
+ }
+
+ if (bit_count < 24) {
+ if (bit_count != 1 &&
+ bit_count != 4 && bit_count != 8) {
+ WARN("Unsupported palette size: %ld", bit_count);
+ return -1;
+ }
+ num_palette = (offset - hsize - DIB_FILE_HEADER_SIZE) / psize;
+ info.bits_per_component = bit_count;
+ info.num_components = 1;
+ } else if (bit_count == 24) { /* full color */
+ num_palette = 1; /* dummy */
+ info.bits_per_component = 8;
+ info.num_components = 3;
+ } else {
+ WARN("Unkown BMP bitCount: %ld", bit_count);
+ return -1;
+ }
+
+ if (info.width == 0 || info.height == 0 || num_palette < 1) {
+ WARN("Invalid BMP file: width=%ld, height=%ld, #palette=%d",
+ info.width, info.height, num_palette);
+ return -1;
+ }
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+ stream_dict = pdf_stream_dict(stream);
+
+ if (bit_count < 24) {
+ pdf_obj *lookup;
+ unsigned char *palette, bgrq[4];
+
+ palette = NEW(num_palette*3+1, unsigned char);
+ for (i = 0; i < num_palette; i++) {
+ if (fread(bgrq, 1, psize, fp) != psize) {
+ WARN("Reading file failed...");
+ RELEASE(palette);
+ return -1;
+ }
+ /* BGR data */
+ palette[3*i ] = bgrq[2];
+ palette[3*i+1] = bgrq[1];
+ palette[3*i+2] = bgrq[0];
+ }
+ lookup = pdf_new_string(palette, num_palette*3);
+ RELEASE(palette);
+
+ colorspace = pdf_new_array();
+ pdf_add_array(colorspace, pdf_new_name("Indexed"));
+ pdf_add_array(colorspace, pdf_new_name("DeviceRGB"));
+ pdf_add_array(colorspace, pdf_new_number(num_palette-1));
+ pdf_add_array(colorspace, lookup);
+ } else {
+ colorspace = pdf_new_name("DeviceRGB");
+ }
+ pdf_add_dict(stream_dict, pdf_new_name("ColorSpace"), colorspace);
+
+ /* Raster data of BMP is four-byte aligned. */
+ {
+ long rowbytes, n;
+ unsigned char *stream_data_ptr = NULL;
+
+ rowbytes = (info.width * bit_count + 7) / 8;
+
+ seek_absolute(fp, offset);
+ if (compression == DIB_COMPRESS_NONE) {
+ long dib_rowbytes;
+ int padding;
+
+ padding = (rowbytes % 4) ? 4 - (rowbytes % 4) : 0;
+ dib_rowbytes = rowbytes + padding;
+ stream_data_ptr = NEW(rowbytes*info.height + padding,
+ unsigned char);
+ for (n = 0; n < info.height; n++) {
+ p = stream_data_ptr + n * rowbytes;
+ if (fread(p, 1, dib_rowbytes, fp) != dib_rowbytes) {
+ WARN("Reading BMP raster data failed...");
+ pdf_release_obj(stream);
+ RELEASE(stream_data_ptr);
+ return -1;
+ }
+ }
+ } else if (compression == DIB_COMPRESS_RLE8) {
+ stream_data_ptr = NEW(rowbytes*info.height, unsigned char);
+ if (read_raster_rle8(stream_data_ptr,
+ info.width, info.height, fp) < 0) {
+ WARN("Reading BMP raster data failed...");
+ pdf_release_obj(stream);
+ RELEASE(stream_data_ptr);
+ return -1;
+ }
+ } else if (compression == DIB_COMPRESS_RLE4) {
+ stream_data_ptr = NEW(rowbytes*info.height, unsigned char);
+ if (read_raster_rle4(stream_data_ptr,
+ info.width, info.height, fp) < 0) {
+ WARN("Reading BMP raster data failed...");
+ pdf_release_obj(stream);
+ RELEASE(stream_data_ptr);
+ return -1;
+ }
+ } else {
+ pdf_release_obj(stream);
+ return -1;
+ }
+
+ /* gbr --> rgb */
+ if (bit_count == 24) {
+ for (n = 0; n < info.width * info.height * 3; n += 3) {
+ unsigned char g;
+ g = stream_data_ptr[n];
+ stream_data_ptr[n ] = stream_data_ptr[n+2];
+ stream_data_ptr[n+2] = g;
+ }
+ }
+
+ if (flip) {
+ for (n = info.height - 1; n >= 0; n--) {
+ p = stream_data_ptr + n * rowbytes;
+ pdf_add_stream(stream, p, rowbytes);
+ }
+ } else {
+ pdf_add_stream(stream, stream_data_ptr, rowbytes*info.height);
+ }
+ RELEASE(stream_data_ptr);
+ }
+
+ pdf_ximage_set_image(ximage, &info, stream);
+
+ return 0;
+}
+
+static long
+read_raster_rle8 (unsigned char *data_ptr,
+ long width, long height, FILE *fp)
+{
+ long count = 0;
+ unsigned char *p, b0, b1;
+ long h, v, rowbytes;
+ int eol, eoi;
+
+ p = data_ptr;
+ rowbytes = width;
+ memset(data_ptr, 0, rowbytes*height);
+ for (v = 0, eoi = 0; v < height && !eoi; v++) {
+ for (h = 0, eol = 0; h < width && !eol; ) {
+
+ b0 = get_unsigned_byte(fp);
+ b1 = get_unsigned_byte(fp);
+ count += 2;
+
+ p = data_ptr + v * rowbytes + h;
+
+ if (b0 == 0x00) {
+ switch (b1) {
+ case 0x00: /* EOL */
+ eol = 1;
+ break;
+ case 0x01: /* EOI */
+ eoi = 1;
+ break;
+ case 0x02:
+ h += get_unsigned_byte(fp);
+ v += get_unsigned_byte(fp);
+ count += 2;
+ break;
+ default:
+ h += b1;
+ if (h > width) {
+ WARN("RLE decode failed...");
+ return -1;
+ }
+ if (fread(p, 1, b1, fp) != b1)
+ return -1;
+ count += b1;
+ if (b1 % 2) {
+ get_unsigned_byte(fp);
+ count++;
+ }
+ break;
+ }
+ } else {
+ h += b0;
+ if (h > width) {
+ WARN("RLE decode failed...");
+ return -1;
+ }
+ memset(p, b1, b0);
+ }
+ }
+
+ /* Check for EOL and EOI marker */
+ if (!eol && !eoi) {
+ b0 = get_unsigned_byte(fp);
+ b1 = get_unsigned_byte(fp);
+ if (b0 != 0x00) {
+ WARN("RLE decode failed...");
+ return -1;
+ } else if (b1 == 0x01) {
+ eoi = 1;
+ } else if (b1 != 0x00) {
+ WARN("RLE decode failed...");
+ return -1;
+ }
+ }
+
+ /* next row ... */
+ }
+
+ return count;
+}
+
+static long
+read_raster_rle4 (unsigned char *data_ptr,
+ long width, long height, FILE *fp)
+{
+ long count = 0;
+ unsigned char *p, b0, b1, b;
+ long h, v, rowbytes;
+ int eol, eoi, i, nbytes;
+
+ p = data_ptr;
+ rowbytes = (width + 1) / 2;
+ memset(data_ptr, 0, rowbytes*height);
+ for (v = 0, eoi = 0; v < height && !eoi; v++) {
+ for (h = 0, eol = 0; h < width && !eol; ) {
+
+ b0 = get_unsigned_byte(fp);
+ b1 = get_unsigned_byte(fp);
+ count += 2;
+
+ p = data_ptr + v * rowbytes + (h / 2);
+ if (b0 == 0x00) {
+ switch (b1) {
+ case 0x00: /* EOL */
+ eol = 1;
+ break;
+ case 0x01: /* EOI */
+ eoi = 1;
+ break;
+ case 0x02:
+ h += get_unsigned_byte(fp);
+ v += get_unsigned_byte(fp);
+ count += 2;
+ break;
+ default:
+ if (h + b1 > width) {
+ WARN("RLE decode failed...");
+ return -1;
+ }
+ nbytes = (b1 + 1)/2;
+ if (h % 2) { /* starting at hi-nib */
+ for (i = 0; i < nbytes; i++) {
+ b = get_unsigned_byte(fp);
+ *p++ |= (b >> 4) & 0x0f;
+ *p = (b << 4) & 0xf0;
+ }
+ } else {
+ if (fread(p, 1, nbytes, fp) != nbytes) {
+ return -1;
+ }
+ }
+ h += b1;
+ count += nbytes;
+ if (nbytes % 2) {
+ get_unsigned_byte(fp);
+ count++;
+ }
+ break;
+ }
+ } else {
+ if (h + b0 > width) {
+ WARN("RLE decode failed...");
+ return -1;
+ }
+ if (h % 2) {
+ *p++ = (b1 >> 4) & 0x0f;
+ b1 = ((b1 << 4) & 0xf0)|((b1 >> 4) & 0x0f);
+ b0--;
+ h++;
+ }
+ nbytes = (b0 + 1)/2;
+ memset(p, b1, nbytes);
+ h += b0;
+ if (h % 2)
+ p[nbytes-1] &= 0xf0;
+ }
+ }
+
+ /* Check for EOL and EOI marker */
+ if (!eol && !eoi) {
+ b0 = get_unsigned_byte(fp);
+ b1 = get_unsigned_byte(fp);
+ if (b0 != 0x00) {
+ WARN("No EOL/EOI marker. RLE decode failed...");
+ return -1;
+ } else if (b1 == 0x01) {
+ eoi = 1;
+ } else if (b1 != 0x00) {
+ WARN("No EOL/EOI marker. RLE decode failed...");
+ return -1;
+ }
+ }
+
+ /* next row ... */
+ }
+
+ return count;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/bmpimage.h b/Build/source/texk/xdvipdfmx/src/bmpimage.h
new file mode 100644
index 00000000000..7dbe6beb798
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/bmpimage.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/bmpimage.h,v 1.1 2004/07/25 11:54:20 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+
+#ifndef _BMPIMAGE_H_
+#define _BMPIMAGE_H_
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "mfileio.h"
+#include "pdfximage.h"
+
+extern int bmp_include_image (pdf_ximage *ximage, FILE *file);
+extern int check_for_bmp (FILE *file);
+
+#endif /* _BMPIMAGE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cff.c b/Build/source/texk/xdvipdfmx/src/cff.c
new file mode 100644
index 00000000000..51d33633f9d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff.c
@@ -0,0 +1,1458 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff.c,v 1.15 2004/09/11 14:50:28 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+
+#include "cff_limits.h"
+#include "cff_types.h"
+#include "cff_stdstr.h"
+#include "cff_dict.h"
+
+#include "cff.h"
+
+#define CFF_DEBUG 5
+#define CFF_DEBUG_STR "CFF"
+
+static unsigned long get_unsigned (sfnt *sfont, int n)
+{
+ unsigned long v = 0;
+
+ while (n-- > 0)
+ v = v*0x100u + sfnt_get_byte(sfont);
+
+ return v;
+}
+
+#define get_offset(s, n) get_unsigned((s), (n))
+#define get_card8(s) sfnt_get_byte((s))
+#define get_card16(s) sfnt_get_ushort((s))
+
+/*
+ * Read Header, Name INDEX, Top DICT INDEX, and String INDEX.
+ */
+cff_font *cff_open(sfnt *sfont, long offset, int n)
+{
+ cff_font *cff;
+ cff_index *idx;
+
+ cff = NEW(1, cff_font);
+
+ cff->fontname = NULL;
+ cff->index = n;
+ cff->sfont = sfont;
+ cff->offset = offset;
+ cff->filter = 0; /* not used */
+ cff->flag = 0;
+
+ cff->name = NULL;
+ cff->gsubr = NULL;
+ cff->encoding = NULL;
+ cff->charsets = NULL;
+ cff->fdselect = NULL;
+ cff->cstrings = NULL;
+ cff->fdarray = NULL;
+ cff->private = NULL;
+ cff->subrs = NULL;
+
+ cff->num_glyphs = 0;
+ cff->num_fds = 0;
+ cff->_string = NULL;
+
+ cff_seek_set(cff, 0);
+ cff->header.major = get_card8(cff->sfont);
+ cff->header.minor = get_card8(cff->sfont);
+ cff->header.hdr_size = get_card8(cff->sfont);
+ cff->header.offsize = get_card8(cff->sfont);
+ if (cff->header.offsize < 1 ||
+ cff->header.offsize > 4)
+ ERROR("invalid offsize data");
+
+ if (cff->header.major > 1 ||
+ cff->header.minor > 0) {
+ WARN("%s: CFF version %u.%u not supported.",
+ CFF_DEBUG_STR, cff->header.major, cff->header.minor);
+ cff_close(cff);
+ return NULL;
+ }
+
+ cff_seek_set(cff, (cff->header).hdr_size);
+
+ /* Name INDEX */
+ idx = cff_get_index(cff);
+ if (n > idx->count - 1) {
+ WARN("%s: Invalid CFF fontset index number.", CFF_DEBUG_STR);
+ cff_close(cff);
+ return NULL;
+ }
+
+ cff->name = idx;
+
+ cff->fontname = cff_get_name(cff);
+
+ /* Top DICT INDEX */
+ idx = cff_get_index(cff);
+ if (n > idx->count - 1)
+ ERROR("CFF Top DICT not exist...");
+ cff->topdict = cff_dict_unpack(idx->data + idx->offset[n] - 1,
+ idx->data + idx->offset[n + 1] - 1);
+ if (!cff->topdict)
+ ERROR("Parsing CFF Top DICT data failed...");
+ cff_release_index(idx);
+
+ if (cff_dict_known(cff->topdict, "CharstringType") &&
+ cff_dict_get(cff->topdict, "CharstringType", 0) != 2) {
+ WARN("Only Type 2 Charstrings supported...");
+ cff_close(cff);
+ return NULL;
+ }
+
+ if (cff_dict_known(cff->topdict, "SyntheticBase")) {
+ WARN("CFF Synthetic font not supported.");
+ cff_close(cff);
+ return NULL;
+ }
+
+ /* String INDEX */
+ cff->string = cff_get_index(cff);
+
+ /* offset to GSubr */
+ cff->gsubr_offset = cff->sfont->loc - offset;
+
+ /* Number of glyphs */
+ offset = (long) cff_dict_get(cff->topdict, "CharStrings", 0);
+ cff_seek_set(cff, offset);
+ cff->num_glyphs = get_card16(cff->sfont);
+
+ /* Check for font type */
+ if (cff_dict_known(cff->topdict, "ROS")) {
+ cff->flag |= FONTTYPE_CIDFONT;
+ } else {
+ cff->flag |= FONTTYPE_FONT;
+ }
+
+ /* Check for encoding */
+ if (cff_dict_known(cff->topdict, "Encoding")) {
+ offset = (long) cff_dict_get(cff->topdict, "Encoding", 0);
+ if (offset == 0) { /* predefined */
+ cff->flag |= ENCODING_STANDARD;
+ } else if (offset == 1) {
+ cff->flag |= ENCODING_EXPERT;
+ }
+ } else {
+ cff->flag |= ENCODING_STANDARD;
+ }
+
+ /* Check for charset */
+ if (cff_dict_known(cff->topdict, "charset")) {
+ offset = (long) cff_dict_get(cff->topdict, "charset", 0);
+ if (offset == 0) { /* predefined */
+ cff->flag |= CHARSETS_ISOADOBE;
+ } else if (offset == 1) {
+ cff->flag |= CHARSETS_EXPERT;
+ } else if (offset == 2) {
+ cff->flag |= CHARSETS_EXPSUB;
+ }
+ } else {
+ cff->flag |= CHARSETS_ISOADOBE;
+ }
+
+ cff_seek_set(cff, cff->gsubr_offset); /* seek back to GSubr */
+
+ return cff;
+}
+
+void
+cff_close (cff_font *cff)
+{
+ card16 i;
+
+ if (cff) {
+ if (cff->fontname) RELEASE(cff->fontname);
+ if (cff->name) cff_release_index(cff->name);
+ if (cff->topdict) cff_release_dict(cff->topdict);
+ if (cff->string) cff_release_index(cff->string);
+ if (cff->gsubr) cff_release_index(cff->gsubr);
+ if (cff->encoding) cff_release_encoding(cff->encoding);
+ if (cff->charsets) cff_release_charsets(cff->charsets);
+ if (cff->fdselect) cff_release_fdselect(cff->fdselect);
+ if (cff->cstrings) cff_release_index(cff->cstrings);
+ if (cff->fdarray) {
+ for (i=0;i<cff->num_fds;i++) {
+ if (cff->fdarray[i]) cff_release_dict(cff->fdarray[i]);
+ }
+ RELEASE(cff->fdarray);
+ }
+ if (cff->private) {
+ for (i=0;i<cff->num_fds;i++) {
+ if (cff->private[i]) cff_release_dict(cff->private[i]);
+ }
+ RELEASE(cff->private);
+ }
+ if (cff->subrs) {
+ for (i=0;i<cff->num_fds;i++) {
+ if (cff->subrs[i]) cff_release_index(cff->subrs[i]);
+ }
+ RELEASE(cff->subrs);
+ }
+ if (cff->_string)
+ cff_release_index(cff->_string);
+ RELEASE(cff);
+ }
+
+ return;
+}
+
+char *
+cff_get_name (cff_font *cff)
+{
+ char *fontname;
+ l_offset len;
+ cff_index *idx;
+
+ idx = cff->name;
+ len = idx->offset[cff->index + 1] - idx->offset[cff->index];
+ fontname = NEW(len + 1, char);
+ memcpy(fontname, idx->data + idx->offset[cff->index] - 1, len);
+ fontname[len] = '\0';
+
+ return fontname;
+}
+
+long
+cff_set_name (cff_font *cff, char *name)
+{
+ cff_index *idx;
+
+ if (strlen(name) > 127)
+ ERROR("FontName string length too large...");
+
+ if (cff->name)
+ cff_release_index(cff->name);
+
+ cff->name = idx = NEW(1, cff_index);
+ idx->count = 1;
+ idx->offsize = 1;
+ idx->offset = NEW(2, l_offset);
+ (idx->offset)[0] = 1;
+ (idx->offset)[1] = strlen(name) + 1;
+ idx->data = NEW(strlen(name), card8);
+ memmove(idx->data, name, strlen(name)); /* no trailing '\0' */
+
+ return 5 + strlen(name);
+}
+
+long
+cff_put_header (cff_font *cff, card8 *dest, long destlen)
+{
+ if (destlen < 4)
+ ERROR("Not enough space available...");
+
+ *(dest++) = cff->header.major;
+ *(dest++) = cff->header.minor;
+ *(dest++) = 4; /* Additional data in between header and
+ * Name INDEX ignored.
+ */
+ /* We will set all offset (0) to four-byte integer. */
+ *(dest++) = 4;
+ cff->header.offsize = 4;
+
+ return 4;
+}
+
+/* Only read header part but not body */
+cff_index *
+cff_get_index_header (cff_font *cff)
+{
+ cff_index *idx;
+ card16 i, count;
+
+ idx = NEW(1, cff_index);
+
+ idx->count = count = get_card16(cff->sfont);
+ if (count > 0) {
+ idx->offsize = get_card8(cff->sfont);
+ if (idx->offsize < 1 || idx->offsize > 4)
+ ERROR("invalid offsize data");
+
+ idx->offset = NEW(count+1, l_offset);
+ for (i=0;i<count+1;i++) {
+ (idx->offset)[i] = get_offset(cff->sfont, idx->offsize);
+ }
+
+ if (idx->offset[0] != 1)
+ ERROR("cff_get_index(): invalid index data");
+
+ idx->data = NULL;
+ } else {
+ idx->offsize = 0;
+ idx->offset = NULL;
+ idx->data = NULL;
+ }
+
+ return idx;
+}
+
+cff_index *
+cff_get_index (cff_font *cff)
+{
+ cff_index *idx;
+ card16 i, count;
+ long length, nb_read, offset;
+
+ idx = NEW(1, cff_index);
+
+ idx->count = count = get_card16(cff->sfont);
+ if (count > 0) {
+ idx->offsize = get_card8(cff->sfont);
+ if (idx->offsize < 1 || idx->offsize > 4)
+ ERROR("invalid offsize data");
+
+ idx->offset = NEW(count + 1, l_offset);
+ for (i = 0 ; i < count + 1; i++) {
+ idx->offset[i] = get_offset(cff->sfont, idx->offsize);
+ }
+
+ if (idx->offset[0] != 1)
+ ERROR("Invalid CFF Index offset data");
+
+ length = idx->offset[count] - idx->offset[0];
+
+ idx->data = NEW(length, card8);
+ offset = 0;
+ while (length > 0) {
+ nb_read = sfnt_read(idx->data + offset, length, cff->sfont);
+ offset += nb_read;
+ length -= nb_read;
+ }
+ } else {
+ idx->offsize = 0;
+ idx->offset = NULL;
+ idx->data = NULL;
+ }
+
+ return idx;
+}
+
+long
+cff_pack_index (cff_index *idx, card8 *dest, long destlen)
+{
+ long len = 0;
+ long datalen;
+ card16 i;
+
+ if (idx->count < 1) {
+ if (destlen < 2)
+ ERROR("Not enough space available...");
+ memset(dest, 0, 2);
+ return 2;
+ }
+
+ len = cff_index_size(idx);
+ datalen = idx->offset[idx->count] - 1;
+
+ if (destlen < len)
+ ERROR("Not enough space available...");
+
+ *(dest++) = (idx->count >> 8) & 0xff;
+ *(dest++) = idx->count & 0xff;
+
+ if (datalen < 0xffUL) {
+ idx->offsize = 1;
+ *(dest++) = 1;
+ for (i = 0; i <= idx->count; i++) {
+ *(dest++) = (card8) (idx->offset[i] & 0xff);
+ }
+ } else if (datalen < 0xffffUL) {
+ idx->offsize = 2;
+ *(dest++) = 2;
+ for (i = 0; i <= idx->count; i++) {
+ *(dest++) = (card8) ((idx->offset[i] >> 8) & 0xff);
+ *(dest++) = (card8) ( idx->offset[i] & 0xff);
+ }
+ } else if (datalen < 0xffffffUL) {
+ idx->offsize = 3;
+ *(dest++) = 3;
+ for (i = 0; i <= idx->count; i++) {
+ *(dest++) = (card8)((idx->offset[i] >> 16) & 0xff);
+ *(dest++) = (card8)((idx->offset[i] >> 8) & 0xff);
+ *(dest++) = (card8)(idx->offset[i] & 0xff);
+ }
+ } else {
+ idx->offsize = 4;
+ *(dest++) = 4;
+ for (i = 0; i <= idx->count; i++) {
+ *(dest++) = (card8)((idx->offset[i] >> 24) & 0xff);
+ *(dest++) = (card8)((idx->offset[i] >> 16) & 0xff);
+ *(dest++) = (card8)((idx->offset[i] >> 8) & 0xff);
+ *(dest++) = (card8)(idx->offset[i] & 0xff);
+ }
+ }
+
+ memmove(dest, idx->data, idx->offset[idx->count] - 1);
+
+ return len;
+}
+
+long
+cff_index_size (cff_index *idx)
+{
+ if (idx->count > 0) {
+ l_offset datalen;
+
+ datalen = idx->offset[idx->count] - 1;
+ if (datalen < 0xffUL) {
+ idx->offsize = 1;
+ } else if (datalen < 0xffffUL) {
+ idx->offsize = 2;
+ } else if (datalen < 0xffffffUL) {
+ idx->offsize = 3;
+ } else {
+ idx->offsize = 4;
+ }
+ return (3 + (idx->offsize)*(idx->count + 1) + datalen);
+ } else {
+ return 2;
+ }
+}
+
+
+cff_index *cff_new_index (card16 count)
+{
+ cff_index *idx;
+
+ idx = NEW(1, cff_index);
+ idx->count = count;
+ idx->offsize = 0;
+
+ if (count > 0) {
+ idx->offset = NEW(count + 1, l_offset);
+ (idx->offset)[0] = 1;
+ } else {
+ idx->offset = NULL;
+ }
+ idx->data = NULL;
+
+ return idx;
+}
+
+void cff_release_index (cff_index *idx)
+{
+ if (idx) {
+ if (idx->data) {
+ RELEASE(idx->data);
+ }
+ if (idx->offset) {
+ RELEASE(idx->offset);
+ }
+ RELEASE(idx);
+ }
+}
+
+/* Strings */
+char *cff_get_string (cff_font *cff, s_SID id)
+{
+ char *result = NULL;
+ long len;
+
+ if (id < CFF_STDSTR_MAX) {
+ len = strlen(cff_stdstr[id]);
+ result = NEW(len+1, char);
+ memcpy(result, cff_stdstr[id], len);
+ result[len] = '\0';
+ } else if (cff && cff->string) {
+ cff_index *strings = cff->string;
+ id -= CFF_STDSTR_MAX;
+ if (id < strings->count) {
+ len = (strings->offset)[id+1] - (strings->offset)[id];
+ result = NEW(len + 1, char);
+ memmove(result, strings->data + (strings->offset)[id] - 1, len);
+ result[len] = '\0';
+ }
+ }
+
+ return result;
+}
+
+long cff_get_sid (cff_font *cff, char *str)
+{
+ card16 i;
+
+ if (!cff || !str)
+ return -1;
+
+ /* I search String INDEX first. */
+ if (cff && cff->string) {
+ cff_index *idx = cff->string;
+ for (i = 0; i < idx->count; i++) {
+ if (strlen(str) == (idx->offset)[i+1] - (idx->offset)[i] &&
+ !memcmp(str, (idx->data)+(idx->offset)[i]-1, strlen(str)))
+ return (i + CFF_STDSTR_MAX);
+ }
+ }
+
+ for (i = 0; i < CFF_STDSTR_MAX; i++) {
+ if (!strcmp(str, cff_stdstr[i]))
+ return i;
+ }
+
+ return -1;
+}
+
+int cff_match_string (cff_font *cff, const char *str, s_SID sid)
+{
+ card16 i;
+
+ if (sid < CFF_STDSTR_MAX) {
+ return ((!strcmp(str, cff_stdstr[sid])) ? 1 : 0);
+ } else {
+ i = sid - CFF_STDSTR_MAX;
+ if (cff == NULL || cff->string == NULL || i >= cff->string->count)
+ ERROR("Invalid SID");
+ if (strlen(str) == (cff->string->offset)[i+1] - (cff->string->offset)[i])
+ return (!memcmp(str,
+ (cff->string->data)+(cff->string->offset)[i]-1,
+ strlen(str))) ? 1 : 0;
+ }
+
+ return 0;
+}
+
+void cff_update_string (cff_font *cff)
+{
+ if (cff == NULL)
+ ERROR("CFF font not opened.");
+
+ if (cff->string)
+ cff_release_index(cff->string);
+ cff->string = cff->_string;
+ cff->_string = NULL;
+}
+
+s_SID cff_add_string (cff_font *cff, char *str)
+{
+ card16 idx;
+ cff_index *strings;
+ l_offset offset, size;
+
+ if (cff == NULL)
+ ERROR("CFF font not opened.");
+
+ if (cff->_string == NULL)
+ cff->_string = cff_new_index(0);
+ strings = cff->_string;
+
+ for (idx = 0; idx < strings->count; idx++) {
+ size = strings->offset[idx+1] - strings->offset[idx];
+ offset = strings->offset[idx];
+ if (size == strlen(str) &&
+ !memcmp(strings->data+offset-1, str, strlen(str)))
+ return (idx + CFF_STDSTR_MAX);
+ }
+
+ for (idx = 0; idx < CFF_STDSTR_MAX; idx++) {
+ if (cff_stdstr[idx] &&
+ !strcmp(cff_stdstr[idx], str))
+ return idx;
+ }
+ offset = (strings->count > 0) ? strings->offset[strings->count] : 1;
+ strings->offset = RENEW(strings->offset, strings->count+2, l_offset);
+ if (strings->count == 0)
+ strings->offset[0] = 1;
+ idx = strings->count;
+ strings->count += 1;
+ strings->offset[strings->count] = offset + strlen(str);
+ strings->data = RENEW(strings->data, offset+strlen(str)-1, card8);
+ memcpy(strings->data+offset-1, str, strlen(str));
+
+ return (idx + CFF_STDSTR_MAX);
+}
+
+/*
+ * Encoding and Charset
+ *
+ * Encoding and Charset arrays always begin with GID = 1.
+ */
+long cff_read_encoding (cff_font *cff)
+{
+ cff_encoding *encoding;
+ long offset, length;
+ card8 i;
+
+ if (cff->topdict == NULL) {
+ ERROR("Top DICT data not found");
+ }
+
+ if (!cff_dict_known(cff->topdict, "Encoding")) {
+ cff->flag |= ENCODING_STANDARD;
+ cff->encoding = NULL;
+ return 0;
+ }
+
+ offset = (long) cff_dict_get(cff->topdict, "Encoding", 0);
+ if (offset == 0) { /* predefined */
+ cff->flag |= ENCODING_STANDARD;
+ cff->encoding = NULL;
+ return 0;
+ } else if (offset == 1) {
+ cff->flag |= ENCODING_EXPERT;
+ cff->encoding = NULL;
+ return 0;
+ }
+
+ cff_seek_set(cff, offset);
+ cff->encoding = encoding = NEW(1, cff_encoding);
+ encoding->format = get_card8(cff->sfont);
+ length = 1;
+
+ switch (encoding->format & (~0x80)) {
+ case 0:
+ encoding->num_entries = get_card8(cff->sfont);
+ (encoding->data).codes = NEW(encoding->num_entries, card8);
+ for (i=0;i<(encoding->num_entries);i++) {
+ (encoding->data).codes[i] = get_card8(cff->sfont);
+ }
+ length += encoding->num_entries + 1;
+ break;
+ case 1:
+ {
+ cff_range1 *ranges;
+ encoding->num_entries = get_card8(cff->sfont);
+ encoding->data.range1 = ranges
+ = NEW(encoding->num_entries, cff_range1);
+ for (i=0;i<(encoding->num_entries);i++) {
+ ranges[i].first = get_card8(cff->sfont);
+ ranges[i].n_left = get_card8(cff->sfont);
+ }
+ length += (encoding->num_entries) * 2 + 1;
+ }
+ break;
+ default:
+ RELEASE(encoding);
+ ERROR("Unknown Encoding format");
+ break;
+ }
+
+ /* Supplementary data */
+ if ((encoding->format) & 0x80) {
+ cff_map *map;
+ encoding->num_supps = get_card8(cff->sfont);
+ encoding->supp = map = NEW(encoding->num_supps, cff_map);
+ for (i=0;i<(encoding->num_supps);i++) {
+ map[i].code = get_card8(cff->sfont);
+ map[i].glyph = get_card16(cff->sfont); /* SID */
+ }
+ length += (encoding->num_supps) * 3 + 1;
+ } else {
+ encoding->num_supps = 0;
+ encoding->supp = NULL;
+ }
+
+ return length;
+}
+
+long cff_pack_encoding (cff_font *cff, card8 *dest, long destlen)
+{
+ long len = 0;
+ cff_encoding *encoding;
+ card16 i;
+
+ if (cff->flag & HAVE_STANDARD_ENCODING || cff->encoding == NULL)
+ return 0;
+
+ if (destlen < 2)
+ ERROR("in cff_pack_encoding(): Buffer overflow");
+
+ encoding = cff->encoding;
+
+ dest[len++] = encoding->format;
+ dest[len++] = encoding->num_entries;
+ switch (encoding->format & (~0x80)) {
+ case 0:
+ if (destlen < len + encoding->num_entries)
+ ERROR("in cff_pack_encoding(): Buffer overflow");
+ for (i=0;i<(encoding->num_entries);i++) {
+ dest[len++] = (encoding->data).codes[i];
+ }
+ break;
+ case 1:
+ {
+ if (destlen < len + (encoding->num_entries)*2)
+ ERROR("in cff_pack_encoding(): Buffer overflow");
+ for (i=0;i<(encoding->num_entries);i++) {
+ dest[len++] = (encoding->data).range1[i].first & 0xff;
+ dest[len++] = (encoding->data).range1[i].n_left;
+ }
+ }
+ break;
+ default:
+ ERROR("Unknown Encoding format");
+ break;
+ }
+
+ if ((encoding->format) & 0x80) {
+ if (destlen < len + (encoding->num_supps)*3 + 1)
+ ERROR("in cff_pack_encoding(): Buffer overflow");
+ dest[len++] = encoding->num_supps;
+ for (i=0;i<(encoding->num_supps);i++) {
+ dest[len++] = (encoding->supp)[i].code;
+ dest[len++] = ((encoding->supp)[i].glyph >> 8) & 0xff;
+ dest[len++] = (encoding->supp)[i].glyph & 0xff;
+ }
+ }
+
+ return len;
+}
+
+/* input: code, output: glyph index */
+card16 cff_encoding_lookup (cff_font *cff, card8 code)
+{
+ card16 gid = 0;
+ cff_encoding *encoding;
+ card16 i;
+
+ if (cff->flag & (ENCODING_STANDARD|ENCODING_EXPERT)) {
+ ERROR("Predefined CFF encoding not supported yet");
+ } else if (cff->encoding == NULL) {
+ ERROR("Encoding data not available");
+ }
+
+ encoding = cff->encoding;
+
+ gid = 0;
+ switch (encoding->format & (~0x80)) {
+ case 0:
+ for (i = 0; i < encoding->num_entries; i++) {
+ if (code == (encoding->data).codes[i]) {
+ gid = i + 1;
+ break;
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i < encoding->num_entries; i++) {
+ if (code >= (encoding->data).range1[i].first &&
+ code <= (encoding->data).range1[i].first + (encoding->data).range1[i].n_left) {
+ gid += code - (encoding->data).range1[i].first + 1;
+ break;
+ }
+ gid += (encoding->data).range1[i].n_left + 1;
+ }
+ if (i == encoding->num_entries)
+ gid = 0;
+ break;
+ default:
+ ERROR("Unknown Encoding format.");
+ }
+
+ /* Supplementary data */
+ if (gid == 0 && ((encoding->format) & 0x80)) {
+ cff_map *map;
+ if (!encoding->supp)
+ ERROR("No CFF supplementary encoding data read.");
+ map = encoding->supp;
+ for (i=0;i<(encoding->num_supps);i++) {
+ if (code == map[i].code) {
+ gid = cff_charsets_lookup(cff, map[i].glyph);
+ break;
+ }
+ }
+ }
+
+ return gid;
+}
+
+void cff_release_encoding (cff_encoding *encoding)
+{
+ if (encoding) {
+ switch (encoding->format & (~0x80)) {
+ case 0:
+ if (encoding->data.codes)
+ RELEASE(encoding->data.codes);
+ break;
+ case 1:
+ if (encoding->data.range1)
+ RELEASE(encoding->data.range1);
+ break;
+ default:
+ ERROR("Unknown Encoding format.");
+ }
+ if (encoding->format & 0x80) {
+ if (encoding->supp)
+ RELEASE(encoding->supp);
+ }
+ RELEASE(encoding);
+ }
+}
+
+long cff_read_charsets (cff_font *cff)
+{
+ cff_charsets *charset;
+ long offset, length;
+ card16 count, i;
+
+ if (cff->topdict == NULL)
+ ERROR("Top DICT not available");
+
+ if (!cff_dict_known(cff->topdict, "charset")) {
+ cff->flag |= CHARSETS_ISOADOBE;
+ cff->charsets = NULL;
+ return 0;
+ }
+
+ offset = (long) cff_dict_get(cff->topdict, "charset", 0);
+
+ if (offset == 0) { /* predefined */
+ cff->flag |= CHARSETS_ISOADOBE;
+ cff->charsets = NULL;
+ return 0;
+ } else if (offset == 1) {
+ cff->flag |= CHARSETS_EXPERT;
+ cff->charsets = NULL;
+ return 0;
+ } else if (offset == 2) {
+ cff->flag |= CHARSETS_EXPSUB;
+ cff->charsets = NULL;
+ return 0;
+ }
+
+ cff_seek_set(cff, offset);
+ cff->charsets = charset = NEW(1, cff_charsets);
+ charset->format = get_card8(cff->sfont);
+ charset->num_entries = 0;
+
+ count = cff->num_glyphs - 1;
+ length = 1;
+
+ /* Not sure. Not well documented. */
+ switch (charset->format) {
+ case 0:
+ charset->num_entries = cff->num_glyphs - 1; /* no .notdef */
+ charset->data.glyphs = NEW(charset->num_entries, s_SID);
+ length += (charset->num_entries) * 2;
+ for (i=0;i<(charset->num_entries);i++) {
+ charset->data.glyphs[i] = get_card16(cff->sfont);
+ }
+ count = 0;
+ break;
+ case 1:
+ {
+ cff_range1 *ranges = NULL;
+ while (count > 0 && charset->num_entries < cff->num_glyphs) {
+ ranges = RENEW(ranges, charset->num_entries + 1, cff_range1);
+ ranges[charset->num_entries].first = get_card16(cff->sfont);
+ ranges[charset->num_entries].n_left = get_card8(cff->sfont);
+ count -= ranges[charset->num_entries].n_left + 1; /* no-overrap */
+ charset->num_entries += 1;
+ charset->data.range1 = ranges;
+ }
+ length += (charset->num_entries) * 3;
+ }
+ break;
+ case 2:
+ {
+ cff_range2 *ranges = NULL;
+ while (count > 0 && charset->num_entries < cff->num_glyphs) {
+ ranges = RENEW(ranges, charset->num_entries + 1, cff_range2);
+ ranges[charset->num_entries].first = get_card16(cff->sfont);
+ ranges[charset->num_entries].n_left = get_card16(cff->sfont);
+ count -= ranges[charset->num_entries].n_left + 1; /* non-overrapping */
+ charset->num_entries += 1;
+ }
+ charset->data.range2 = ranges;
+ length += (charset->num_entries) * 4;
+ }
+ break;
+ default:
+ RELEASE(charset);
+ ERROR("Unknown Charset format");
+ break;
+ }
+
+ if (count > 0)
+ ERROR("Charset data possibly broken");
+
+ return length;
+}
+
+long cff_pack_charsets (cff_font *cff, card8 *dest, long destlen)
+{
+ long len = 0;
+ card16 i;
+ cff_charsets *charset;
+
+ if (cff->flag & HAVE_STANDARD_CHARSETS || cff->charsets == NULL)
+ return 0;
+
+ if (destlen < 1)
+ ERROR("in cff_pack_charsets(): Buffer overflow");
+
+ charset = cff->charsets;
+
+ dest[len++] = charset->format;
+ switch (charset->format) {
+ case 0:
+ if (destlen < len + (charset->num_entries)*2)
+ ERROR("in cff_pack_charsets(): Buffer overflow");
+ for (i=0;i<(charset->num_entries);i++) {
+ s_SID sid = (charset->data).glyphs[i]; /* or CID */
+ dest[len++] = (sid >> 8) & 0xff;
+ dest[len++] = sid & 0xff;
+ }
+ break;
+ case 1:
+ {
+ if (destlen < len + (charset->num_entries)*3)
+ ERROR("in cff_pack_charsets(): Buffer overflow");
+ for (i=0;i<(charset->num_entries);i++) {
+ dest[len++] = ((charset->data).range1[i].first >> 8) & 0xff;
+ dest[len++] = (charset->data).range1[i].first & 0xff;
+ dest[len++] = (charset->data).range1[i].n_left;
+ }
+ }
+ break;
+ case 2:
+ {
+ if (destlen < len + (charset->num_entries)*4)
+ ERROR("in cff_pack_charsets(): Buffer overflow");
+ for (i=0;i<(charset->num_entries);i++) {
+ dest[len++] = ((charset->data).range2[i].first >> 8) & 0xff;
+ dest[len++] = (charset->data).range2[i].first & 0xff;
+ dest[len++] = ((charset->data).range2[i].n_left >> 8) & 0xff;
+ dest[len++] = (charset->data).range2[i].n_left & 0xff;
+ }
+ }
+ break;
+ default:
+ ERROR("Unknown Charset format");
+ break;
+ }
+
+ return len;
+}
+
+card16 cff_glyph_lookup (cff_font *cff, const char *glyph)
+{
+ card16 gid;
+ cff_charsets *charset;
+ card16 i, n;
+
+ if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) {
+ ERROR("Predefined CFF charsets not supported yet");
+ } else if (cff->charsets == NULL) {
+ ERROR("Charsets data not available");
+ }
+
+ /* .notdef always have glyph index 0 */
+ if (!glyph || !strcmp(glyph, ".notdef")) {
+ return 0;
+ }
+
+ charset = cff->charsets;
+
+ gid = 0;
+ switch (charset->format) {
+ case 0:
+ for (i = 0; i < charset->num_entries; i++) {
+ gid++;
+ if (cff_match_string(cff, glyph, charset->data.glyphs[i])) {
+ return gid;
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i < charset->num_entries; i++) {
+ for (n = 0;
+ n <= charset->data.range1[i].n_left; n++) {
+ gid++;
+ if (cff_match_string(cff, glyph,
+ (s_SID)(charset->data.range1[i].first + n))) {
+ return gid;
+ }
+ }
+ }
+ break;
+ case 2:
+ for (i = 0; i <charset->num_entries; i++) {
+ for (n = 0;
+ n <= charset->data.range2[i].n_left; n++) {
+ gid++;
+ if (cff_match_string(cff, glyph,
+ (s_SID)(charset->data.range2[i].first + n))) {
+ return gid;
+ }
+ }
+ }
+ break;
+ default:
+ ERROR("Unknown Charset format");
+ }
+
+ return 0; /* not found, returns .notdef */
+}
+
+/* Input : SID or CID (16-bit unsigned int)
+ * Output: glyph index
+ */
+card16
+cff_charsets_lookup (cff_font *cff, card16 cid)
+{
+ card16 gid = 0;
+ cff_charsets *charset;
+ card16 i;
+
+ if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) {
+ ERROR("Predefined CFF charsets not supported yet");
+ } else if (cff->charsets == NULL) {
+ ERROR("Charsets data not available");
+ }
+
+ if (cid == 0) {
+ return 0; /* GID 0 (.notdef) */
+ }
+
+ charset = cff->charsets;
+
+ gid = 0;
+ switch (charset->format) {
+ case 0:
+ for (i = 0; i <charset->num_entries; i++) {
+ if (cid == charset->data.glyphs[i]) {
+ gid = i + 1;
+ return gid;
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i < charset->num_entries; i++) {
+ if (cid >= charset->data.range1[i].first &&
+ cid <= charset->data.range1[i].first + charset->data.range1[i].n_left) {
+ gid += cid - charset->data.range1[i].first + 1;
+ return gid;
+ }
+ gid += charset->data.range1[i].n_left + 1;
+ }
+ break;
+ case 2:
+ for (i = 0; i < charset->num_entries; i++) {
+ if (cid >= charset->data.range2[i].first &&
+ cid <= charset->data.range2[i].first + charset->data.range2[i].n_left) {
+ gid += cid - charset->data.range2[i].first + 1;
+ return gid;
+ }
+ gid += charset->data.range2[i].n_left + 1;
+ }
+ break;
+ default:
+ ERROR("Unknown Charset format");
+ }
+
+ return 0; /* not found */
+}
+
+/* Input : GID
+ * Output: SID/CID (card16)
+ */
+card16
+cff_charsets_lookup_inverse (cff_font *cff, card16 gid)
+{
+ card16 sid = 0;
+ cff_charsets *charset;
+ card16 i;
+
+ if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) {
+ ERROR("Predefined CFF charsets not supported yet");
+ } else if (cff->charsets == NULL) {
+ ERROR("Charsets data not available");
+ }
+
+ if (gid == 0) {
+ return 0; /* .notdef */
+ }
+
+ charset = cff->charsets;
+
+ sid = 0;
+ switch (charset->format) {
+ case 0:
+ if (gid - 1 >= charset->num_entries)
+ ERROR("Invalid GID.");
+ sid = charset->data.glyphs[gid - 1];
+ break;
+ case 1:
+ for (i = 0; i < charset->num_entries; i++) {
+ if (gid <= charset->data.range1[i].n_left + 1) {
+ sid = gid + charset->data.range1[i].first - 1;
+ break;
+ }
+ gid -= charset->data.range1[i].n_left + 1;
+ }
+ if (i == charset->num_entries)
+ ERROR("Invalid GID");
+ break;
+ case 2:
+ for (i = 0; i < charset->num_entries; i++) {
+ if (gid <= charset->data.range2[i].n_left + 1) {
+ sid = gid + charset->data.range2[i].first - 1;
+ break;
+ }
+ gid -= charset->data.range2[i].n_left + 1;
+ }
+ if (i == charset->num_entries)
+ ERROR("Invalid GID");
+ break;
+ default:
+ ERROR("Unknown Charset format");
+ }
+
+ return sid;
+}
+
+void
+cff_release_charsets (cff_charsets *charset)
+{
+ if (charset) {
+ switch (charset->format) {
+ case 0:
+ if (charset->data.glyphs)
+ RELEASE(charset->data.glyphs);
+ break;
+ case 1:
+ if (charset->data.range1)
+ RELEASE(charset->data.range1);
+ break;
+ case 2:
+ if (charset->data.range2)
+ RELEASE(charset->data.range2);
+ break;
+ default:
+ break;
+ }
+ RELEASE(charset);
+ }
+}
+
+/* CID-Keyed font specific */
+long cff_read_fdselect (cff_font *cff)
+{
+ cff_fdselect *fdsel;
+ long offset, length;
+ card16 i;
+
+ if (cff->topdict == NULL)
+ ERROR("Top DICT not available");
+
+ if (!(cff->flag & FONTTYPE_CIDFONT))
+ return 0;
+
+ offset = (long) cff_dict_get(cff->topdict, "FDSelect", 0);
+ cff_seek_set(cff, offset);
+ cff->fdselect = fdsel = NEW(1, cff_fdselect);
+ fdsel->format = get_card8(cff->sfont);
+
+ length = 1;
+
+ switch (fdsel->format) {
+ case 0:
+ fdsel->num_entries = cff->num_glyphs;
+ (fdsel->data).fds = NEW(fdsel->num_entries, card8);
+ for (i=0;i<(fdsel->num_entries);i++) {
+ (fdsel->data).fds[i] = get_card8(cff->sfont);
+ }
+ length += fdsel->num_entries;
+ break;
+ case 3:
+ {
+ cff_range3 *ranges;
+ fdsel->num_entries = get_card16(cff->sfont);
+ fdsel->data.ranges = ranges = NEW(fdsel->num_entries, cff_range3);
+ for (i=0;i<(fdsel->num_entries);i++) {
+ ranges[i].first = get_card16(cff->sfont);
+ ranges[i].fd = get_card8(cff->sfont);
+ }
+ if (ranges[0].first != 0)
+ ERROR("Range not starting with 0.");
+ if (cff->num_glyphs != get_card16(cff->sfont))
+ ERROR("Sentinel value mismatched with number of glyphs.");
+ length += (fdsel->num_entries) * 3 + 4;
+ }
+ break;
+ default:
+ RELEASE(fdsel);
+ ERROR("Unknown FDSelect format.");
+ break;
+ }
+
+ return length;
+}
+
+long cff_pack_fdselect (cff_font *cff, card8 *dest, long destlen)
+{
+ cff_fdselect *fdsel;
+ long len = 0;
+ card16 i;
+
+ if (cff->fdselect == NULL)
+ return 0;
+
+ if (destlen < 1)
+ ERROR("in cff_pack_fdselect(): Buffur overflow");
+
+ fdsel = cff->fdselect;
+
+ dest[len++] = fdsel->format;
+ switch (fdsel->format) {
+ case 0:
+ if (fdsel->num_entries != cff->num_glyphs)
+ ERROR("in cff_pack_fdselect(): Invalid data");
+ if (destlen < len + fdsel->num_entries)
+ ERROR("in cff_pack_fdselect(): Buffer overflow");
+ for (i=0;i<fdsel->num_entries;i++) {
+ dest[len++] = (fdsel->data).fds[i];
+ }
+ break;
+ case 3:
+ {
+ if (destlen < len + 2)
+ ERROR("in cff_pack_fdselect(): Buffer overflow");
+ len += 2;
+ for (i=0;i<(fdsel->num_entries);i++) {
+ if (destlen < len + 3)
+ ERROR("in cff_pack_fdselect(): Buffer overflow");
+ dest[len++] = ((fdsel->data).ranges[i].first >> 8) & 0xff;
+ dest[len++] = (fdsel->data).ranges[i].first & 0xff;
+ dest[len++] = (fdsel->data).ranges[i].fd;
+ }
+ if (destlen < len + 2)
+ ERROR("in cff_pack_fdselect(): Buffer overflow");
+ dest[len++] = (cff->num_glyphs >> 8) & 0xff;
+ dest[len++] = cff->num_glyphs & 0xff;
+ dest[1] = ((len/3 - 1) >> 8) & 0xff;
+ dest[2] = (len/3 - 1) & 0xff;
+ }
+ break;
+ default:
+ ERROR("Unknown FDSelect format.");
+ break;
+ }
+
+ return len;
+}
+
+void cff_release_fdselect (cff_fdselect *fdselect)
+{
+ if (fdselect) {
+ if (fdselect->format == 0) {
+ if (fdselect->data.fds) RELEASE(fdselect->data.fds);
+ } else if (fdselect->format == 3) {
+ if (fdselect->data.ranges) RELEASE(fdselect->data.ranges);
+ }
+ RELEASE(fdselect);
+ }
+}
+
+card8 cff_fdselect_lookup (cff_font *cff, card16 gid)
+{
+ card8 fd = 0xff;
+ cff_fdselect *fdsel;
+
+ if (cff->fdselect == NULL)
+ ERROR("in cff_fdselect_lookup(): FDSelect not available");
+
+ fdsel = cff->fdselect;
+
+ if (gid >= cff->num_glyphs)
+ ERROR("in cff_fdselect_lookup(): Invalid glyph index");
+
+ switch (fdsel->format) {
+ case 0:
+ fd = fdsel->data.fds[gid];
+ break;
+ case 3:
+ {
+ if (gid == 0) {
+ fd = (fdsel->data).ranges[0].fd;
+ } else {
+ card16 i;
+ for (i=1;i<(fdsel->num_entries);i++) {
+ if (gid < (fdsel->data).ranges[i].first)
+ break;
+ }
+ fd = (fdsel->data).ranges[i-1].fd;
+ }
+ }
+ break;
+ default:
+ ERROR("in cff_fdselect_lookup(): Invalid FDSelect format");
+ break;
+ }
+
+ if (fd >= cff->num_fds)
+ ERROR("in cff_fdselect_lookup(): Invalid Font DICT index");
+
+ return fd;
+}
+
+long cff_read_subrs (cff_font *cff)
+{
+ long len = 0;
+ long offset;
+ int i;
+
+ if ((cff->flag & FONTTYPE_CIDFONT) && cff->fdarray == NULL) {
+ cff_read_fdarray(cff);
+ }
+
+ if (cff->private == NULL)
+ cff_read_private(cff);
+
+ if (cff->gsubr == NULL) {
+ cff_seek_set(cff, cff->gsubr_offset);
+ cff->gsubr = cff_get_index(cff);
+ }
+
+ cff->subrs = NEW(cff->num_fds, cff_index *);
+ if (cff->flag & FONTTYPE_CIDFONT) {
+ for (i=0;i<cff->num_fds;i++) {
+ if (cff->private[i] == NULL ||
+ !cff_dict_known(cff->private[i], "Subrs")) {
+ (cff->subrs)[i] = NULL;
+ } else {
+ offset = (long) cff_dict_get(cff->fdarray[i], "Private", 1);
+ offset += (long) cff_dict_get(cff->private[i], "Subrs", 0);
+ cff_seek_set(cff, offset);
+ (cff->subrs)[i] = cff_get_index(cff);
+ len += cff_index_size((cff->subrs)[i]);
+ }
+ }
+ } else {
+ if (cff->private[0] == NULL ||
+ !cff_dict_known(cff->private[0], "Subrs")) {
+ (cff->subrs)[0] = NULL;
+ } else {
+ offset = (long) cff_dict_get(cff->topdict, "Private", 1);
+ offset += (long) cff_dict_get(cff->private[0], "Subrs", 0);
+ cff_seek_set(cff, offset);
+ (cff->subrs)[0] = cff_get_index(cff);
+ len += cff_index_size((cff->subrs)[0]);
+ }
+ }
+
+ return len;
+}
+
+long cff_read_fdarray (cff_font *cff)
+{
+ long len = 0;
+ cff_index *idx;
+ long offset, size;
+ card16 i;
+
+ if (cff->topdict == NULL)
+ ERROR("in cff_read_fdarray(): Top DICT not found");
+
+ if (!(cff->flag & FONTTYPE_CIDFONT))
+ return 0;
+
+ /* must exist */
+ offset = (long) cff_dict_get(cff->topdict, "FDArray", 0);
+ cff_seek_set(cff, offset);
+ idx = cff_get_index(cff);
+ cff->num_fds = (card8)idx->count;
+ cff->fdarray = NEW(idx->count, cff_dict *);
+ for (i=0;i<idx->count;i++) {
+ card8 *data = idx->data + (idx->offset)[i] - 1;
+ size = (idx->offset)[i+1] - (idx->offset)[i];
+ if (size > 0) {
+ (cff->fdarray)[i] = cff_dict_unpack(data, data+size);
+ } else {
+ (cff->fdarray)[i] = NULL;
+ }
+ }
+ len = cff_index_size(idx);
+ cff_release_index(idx);
+
+ return len;
+}
+
+long cff_read_private (cff_font *cff)
+{
+ long len = 0;
+ card8 *data;
+ long offset, size;
+
+ if (cff->flag & FONTTYPE_CIDFONT) {
+ int i;
+
+ if (cff->fdarray == NULL)
+ cff_read_fdarray(cff);
+
+ cff->private = NEW(cff->num_fds, cff_dict *);
+ for (i=0;i<cff->num_fds;i++) {
+ if (cff->fdarray[i] != NULL &&
+ cff_dict_known(cff->fdarray[i], "Private") &&
+ (size = (long) cff_dict_get(cff->fdarray[i], "Private", 0))
+ > 0) {
+ offset = (long) cff_dict_get(cff->fdarray[i], "Private", 1);
+ cff_seek_set(cff, offset);
+ data = NEW(size, card8);
+ if (sfnt_read(data, size, cff->sfont) != size)
+ ERROR("reading file failed");
+ (cff->private)[i] = cff_dict_unpack(data, data+size);
+ RELEASE(data);
+ len += size;
+ } else {
+ (cff->private)[i] = NULL;
+ }
+ }
+ } else {
+ cff->num_fds = 1;
+ cff->private = NEW(1, cff_dict *);
+ if (cff_dict_known(cff->topdict, "Private") &&
+ (size = (long) cff_dict_get(cff->topdict, "Private", 0)) > 0) {
+ offset = (long) cff_dict_get(cff->topdict, "Private", 1);
+ cff_seek_set(cff, offset);
+ data = NEW(size, card8);
+ if (sfnt_read(data, size, cff->sfont) != size)
+ ERROR("reading file failed");
+ cff->private[0] = cff_dict_unpack(data, data+size);
+ RELEASE(data);
+ len += size;
+ } else {
+ (cff->private)[0] = NULL;
+ len = 0;
+ }
+ }
+
+ return len;
+}
+
+#ifdef XETEX
+unsigned short* cff_get_ft_to_gid(cff_font *cff)
+{
+ return cff->ft_to_gid;
+}
+#endif
diff --git a/Build/source/texk/xdvipdfmx/src/cff.h b/Build/source/texk/xdvipdfmx/src/cff.h
new file mode 100644
index 00000000000..3a39c80cafd
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff.h
@@ -0,0 +1,155 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff.h,v 1.9 2004/09/11 14:50:28 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CFF_H_
+#define _CFF_H_
+
+#include "mfileio.h"
+#include "cff_types.h"
+
+#include "sfnt.h"
+
+/* Flag */
+#define FONTTYPE_CIDFONT (1 << 0)
+#define FONTTYPE_FONT (1 << 1)
+#define FONTTYPE_MMASTER (1 << 2)
+
+#define ENCODING_STANDARD (1 << 3)
+#define ENCODING_EXPERT (1 << 4)
+
+#define CHARSETS_ISOADOBE (1 << 5)
+#define CHARSETS_EXPERT (1 << 6)
+#define CHARSETS_EXPSUB (1 << 7)
+
+#define HAVE_STANDARD_ENCODING (ENCODING_STANDARD|ENCODING_EXPERT)
+#define HAVE_STANDARD_CHARSETS \
+ (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)
+
+#define CFF_STRING_NOTDEF 65535
+
+typedef struct
+{
+ char *fontname; /* FontName */
+
+ /* - CFF structure - */
+ cff_header header; /* CFF Header */
+ cff_index *name; /* Name INDEX */
+ cff_dict *topdict; /* Top DICT (single) */
+ cff_index *string; /* String INDEX */
+ cff_index *gsubr; /* Global Subr INDEX */
+ cff_encoding *encoding; /* Encodings */
+ cff_charsets *charsets; /* Charsets */
+ cff_fdselect *fdselect; /* FDSelect, CIDFont only */
+ cff_index *cstrings; /* CharStrings */
+ cff_dict **fdarray; /* CIDFont only */
+ cff_dict **private; /* per-Font DICT */
+ cff_index **subrs; /* Local Subr INDEX, per-Private DICT */
+
+ /* -- extra data -- */
+ l_offset offset; /* non-zero for OpenType or PostScript wrapped */
+ l_offset gsubr_offset;
+ card16 num_glyphs; /* number of glyphs (CharString INDEX count) */
+ card8 num_fds; /* number of Font DICT */
+
+ /* Updated String INDEX.
+ * Please fix this. We should separate input and output.
+ */
+ cff_index *_string;
+
+#ifdef XETEX
+ unsigned short *ft_to_gid;
+#endif
+
+ sfnt *sfont;
+ int filter; /* not used, ASCII Hex filter if needed */
+
+ int index; /* CFF fontset index */
+ int flag; /* Flag: see above */
+} cff_font;
+
+extern cff_font *cff_open (sfnt *sfont, long offset, int idx);
+extern void cff_close (cff_font *cff);
+
+#define cff_seek_set(c, p) sfnt_seek_set (((c)->sfont), ((c)->offset) + (p));
+
+/* CFF Header */
+extern long cff_put_header (cff_font *cff, card8 *dest, long destlen);
+
+/* CFF INDEX */
+extern cff_index *cff_get_index (cff_font *cff);
+extern cff_index *cff_get_index_header (cff_font *cff);
+extern void cff_release_index (cff_index *idx);
+extern cff_index *cff_new_index (card16 count);
+extern long cff_index_size (cff_index *idx);
+extern long cff_pack_index (cff_index *idx, card8 *dest, long destlen);
+
+/* Name INDEX */
+extern char *cff_get_name (cff_font *cff);
+extern long cff_set_name (cff_font *cff, char *name);
+
+/* Global and Local Subrs INDEX */
+extern long cff_read_subrs (cff_font *cff);
+
+/* Encoding */
+extern long cff_read_encoding (cff_font *cff);
+extern long cff_pack_encoding (cff_font *cff, card8 *dest, long destlen);
+extern card16 cff_encoding_lookup (cff_font *cff, card8 code);
+extern void cff_release_encoding (cff_encoding *encoding);
+
+/* Charsets */
+extern long cff_read_charsets (cff_font *cff);
+extern long cff_pack_charsets (cff_font *cff, card8 *dest, long destlen);
+
+/* Returns GID of PS name "glyph" */
+extern card16 cff_glyph_lookup (cff_font *cff, const char *glyph);
+/* Returns GID of glyph with SID/CID "cid" */
+extern card16 cff_charsets_lookup (cff_font *cff, card16 cid);
+extern void cff_release_charsets (cff_charsets *charset);
+/* Returns SID or CID */
+extern card16 cff_charsets_lookup_inverse (cff_font *cff, card16 gid);
+
+/* FDSelect */
+extern long cff_read_fdselect (cff_font *cff);
+extern long cff_pack_fdselect (cff_font *cff, card8 *dest, long destlen);
+extern card8 cff_fdselect_lookup (cff_font *cff, card16 gid);
+extern void cff_release_fdselect (cff_fdselect *fdselect);
+
+/* Font DICT(s) */
+extern long cff_read_fdarray (cff_font *cff);
+
+/* Private DICT(s) */
+extern long cff_read_private (cff_font *cff);
+
+#ifdef XETEX
+extern unsigned short* cff_get_ft_to_gid(cff_font *cff);
+#endif
+
+/* String */
+extern int cff_match_string (cff_font *cff, const char *str, s_SID sid);
+extern char *cff_get_string (cff_font *cff, s_SID id);
+extern long cff_get_sid (cff_font *cff, char *str);
+extern s_SID cff_add_string (cff_font *cff, char *str);
+extern void cff_update_string (cff_font *cff);
+
+#define cff_is_stdstr(s) (cff_get_sid(NULL, (s)) >= 0)
+
+#endif /* _CFF_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cff_dict.c b/Build/source/texk/xdvipdfmx/src/cff_dict.c
new file mode 100644
index 00000000000..875210ca090
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff_dict.c
@@ -0,0 +1,770 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff_dict.c,v 1.13 2004/08/26 16:02:26 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * CFF Font Dictionary
+ *
+ * Adobe Technical Note #5176 "The Compact Font Format Specification"
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "error.h"
+#include "mem.h"
+
+#ifndef CFF_DEBUG_STR
+#define CFF_DEBUG_STR "CFF"
+#define CFF_DEBUG 5
+#endif
+
+/* work_buffer for get_real() */
+#include "mfileio.h"
+
+#include "cff_types.h"
+#include "cff_limits.h"
+
+/* #include "cff_string.h" */
+#include "cff_dict.h"
+/* cff_update_dict requires this. */
+#include "cff.h"
+
+#define CFF_PARSE_OK 0
+#define CFF_ERROR_PARSE_ERROR -1
+#define CFF_ERROR_STACK_OVERFLOW -2
+#define CFF_ERROR_STACK_UNDERFLOW -3
+#define CFF_ERROR_STACK_RANGECHECK -4
+
+#define DICT_ENTRY_MAX 16
+cff_dict *cff_new_dict (void)
+{
+ cff_dict *dict;
+
+ dict = NEW(1, cff_dict);
+ dict->max = DICT_ENTRY_MAX;
+ dict->count = 0;
+ dict->entries = NEW(dict->max, cff_dict_entry);
+
+ return dict;
+}
+
+void cff_release_dict (cff_dict *dict)
+{
+ if (dict) {
+ if (dict->entries) {
+ int i;
+ for (i=0;i<dict->count;i++) {
+ if ((dict->entries)[i].values)
+ RELEASE((dict->entries)[i].values);
+ }
+ RELEASE(dict->entries);
+ }
+ RELEASE(dict);
+ }
+}
+
+/*
+ * Operand stack:
+ * only numbers are stored (as double)
+ *
+ * Operand types:
+ *
+ * number : double (integer or real)
+ * boolean: stored as a number
+ * SID : stored as a number
+ * array : array of numbers
+ * delta : array of numbers
+ */
+
+#define CFF_DICT_STACK_LIMIT 64
+static int stack_top = 0;
+static double arg_stack[CFF_DICT_STACK_LIMIT];
+
+/*
+ * CFF DICT encoding:
+ * TODO: default values
+ */
+
+#define CFF_LAST_DICT_OP1 22
+#define CFF_LAST_DICT_OP2 39
+#define CFF_LAST_DICT_OP (CFF_LAST_DICT_OP1 + CFF_LAST_DICT_OP2)
+
+static struct {
+ const char *opname;
+ int argtype;
+} dict_operator[CFF_LAST_DICT_OP] = {
+ {"version", CFF_TYPE_SID},
+ {"Notice", CFF_TYPE_SID},
+ {"FullName", CFF_TYPE_SID},
+ {"FamilyName", CFF_TYPE_SID},
+ {"Weight", CFF_TYPE_SID},
+ {"FontBBox", CFF_TYPE_ARRAY},
+ {"BlueValues", CFF_TYPE_DELTA},
+ {"OtherBlues", CFF_TYPE_DELTA},
+ {"FamilyBlues", CFF_TYPE_DELTA},
+ {"FamilyOtherBlues", CFF_TYPE_DELTA},
+ {"StdHW", CFF_TYPE_NUMBER},
+ {"StdVW", CFF_TYPE_NUMBER},
+ {NULL, -1}, /* first byte of two-byte operator */
+ /* Top */
+ {"UniqueID", CFF_TYPE_NUMBER},
+ {"XUID", CFF_TYPE_ARRAY},
+ {"charset", CFF_TYPE_OFFSET},
+ {"Encoding", CFF_TYPE_OFFSET},
+ {"CharStrings", CFF_TYPE_OFFSET},
+ {"Private", CFF_TYPE_SZOFF}, /* two numbers (size and offset) */
+ /* Private */
+ {"Subrs", CFF_TYPE_OFFSET},
+ {"defaultWidthX", CFF_TYPE_NUMBER},
+ {"nominalWidthX", CFF_TYPE_NUMBER},
+ /* Operator 2 */
+ {"Copyright", CFF_TYPE_SID},
+ {"IsFixedPitch", CFF_TYPE_BOOLEAN},
+ {"ItalicAngle", CFF_TYPE_NUMBER},
+ {"UnderlinePosition", CFF_TYPE_NUMBER},
+ {"UnderlineThickness", CFF_TYPE_NUMBER},
+ {"PaintType", CFF_TYPE_NUMBER},
+ {"CharstringType", CFF_TYPE_NUMBER},
+ {"FontMatrix", CFF_TYPE_ARRAY},
+ {"StrokeWidth", CFF_TYPE_NUMBER},
+ {"BlueScale", CFF_TYPE_NUMBER},
+ {"BlueShift", CFF_TYPE_NUMBER},
+ {"BlueFuzz", CFF_TYPE_NUMBER},
+ {"StemSnapH", CFF_TYPE_DELTA},
+ {"StemSnapV", CFF_TYPE_DELTA},
+ {"ForceBold", CFF_TYPE_BOOLEAN},
+ {NULL, -1},
+ {NULL, -1},
+ {"LanguageGroup", CFF_TYPE_NUMBER},
+ {"ExpansionFactor", CFF_TYPE_NUMBER},
+ {"InitialRandomSeed", CFF_TYPE_NUMBER},
+ {"SyntheticBase", CFF_TYPE_NUMBER},
+ {"PostScript", CFF_TYPE_SID},
+ {"BaseFontName", CFF_TYPE_SID},
+ {"BaseFontBlend", CFF_TYPE_DELTA}, /* MMaster ? */
+ {NULL, -1},
+ {NULL, -1},
+ {NULL, -1},
+ {NULL, -1},
+ {NULL, -1},
+ {NULL, -1},
+ /* CID-Keyed font */
+ {"ROS", CFF_TYPE_ROS}, /* SID SID number */
+ {"CIDFontVersion", CFF_TYPE_NUMBER},
+ {"CIDFontRevision", CFF_TYPE_NUMBER},
+ {"CIDFontType", CFF_TYPE_NUMBER},
+ {"CIDCount", CFF_TYPE_NUMBER},
+ {"UIDBase", CFF_TYPE_NUMBER},
+ {"FDArray", CFF_TYPE_OFFSET},
+ {"FDSelect", CFF_TYPE_OFFSET},
+ {"FontName", CFF_TYPE_SID},
+};
+
+/* Parse DICT data */
+static double get_integer (card8 **data, card8 *endptr, int *status)
+{
+ long result = 0;
+ card8 b0, b1, b2;
+
+ b0 = *(*data)++;
+ if (b0 == 28 && *data < endptr - 2) { /* shortint */
+ b1 = *(*data)++;
+ b2 = *(*data)++;
+ result = b1*256+b2;
+ if (result > 0x7fffL)
+ result -= 0x10000L;
+ } else if (b0 == 29 && *data < endptr - 4) { /* longint */
+ int i;
+ result = *(*data)++;
+ if (result > 0x7f)
+ result -= 0x100;
+ for (i=0;i<3;i++) {
+ result = result*256+(**data);
+ *data += 1;
+ }
+ } else if (b0 >= 32 && b0 <= 246) { /* int (1) */
+ result = b0 - 139;
+ } else if (b0 >= 247 && b0 <= 250) { /* int (2) */
+ b1 = *(*data)++;
+ result = (b0-247)*256+b1+108;
+ } else if (b0 >= 251 && b0 <= 254) {
+ b1 = *(*data)++;
+ result = -(b0-251)*256-b1-108;
+ } else {
+ *status = CFF_ERROR_PARSE_ERROR;
+ }
+
+ return (double) result;
+}
+
+/* Simply uses strtod */
+static double get_real(card8 **data, card8 *endptr, int *status)
+{
+ double result = 0.0;
+ int nibble = 0, pos = 0;
+ int len = 0, fail = 0;
+
+ if (**data != 30 || *data >= endptr -1) {
+ *status = CFF_ERROR_PARSE_ERROR;
+ return 0.0;
+ }
+
+ *data += 1; /* skip first byte (30) */
+
+ pos = 0;
+ while ((! fail) && len < WORK_BUFFER_SIZE - 2 && *data < endptr) {
+ /* get nibble */
+ if (pos % 2) {
+ nibble = **data & 0x0f;
+ *data += 1;
+ } else {
+ nibble = (**data >> 4) & 0x0f;
+ }
+ if (nibble >= 0x00 && nibble <= 0x09) {
+ work_buffer[len++] = nibble + '0';
+ } else if (nibble == 0x0a) { /* . */
+ work_buffer[len++] = '.';
+ } else if (nibble == 0x0b || nibble == 0x0c) { /* E, E- */
+ work_buffer[len++] = 'e';
+ if (nibble == 0x0c)
+ work_buffer[len++] = '-';
+ } else if (nibble == 0x0e) { /* `-' */
+ work_buffer[len++] = '-';
+ } else if (nibble == 0x0d) { /* skip */
+ /* do nothing */
+ } else if (nibble == 0x0f) { /* end */
+ work_buffer[len++] = '\0';
+ if (((pos % 2) == 0) && (**data != 0xff)) {
+ fail = 1;
+ }
+ break;
+ } else { /* invalid */
+ fail = 1;
+ }
+ pos++;
+ }
+
+ /* returned values */
+ if (fail || nibble != 0x0f) {
+ *status = CFF_ERROR_PARSE_ERROR;
+ } else {
+ char *s;
+ result = strtod(work_buffer, &s);
+ if (*s != 0 || errno == ERANGE) {
+ *status = CFF_ERROR_PARSE_ERROR;
+ }
+ }
+
+ return result;
+}
+
+/* operators */
+static void add_dict (cff_dict *dict,
+ card8 **data, card8 *endptr, int *status)
+{
+ int id, argtype;
+
+ id = **data;
+ if (id == 0x0c) {
+ *data += 1;
+ if (*data >= endptr ||
+ (id = **data + CFF_LAST_DICT_OP1) >= CFF_LAST_DICT_OP) {
+ *status = CFF_ERROR_PARSE_ERROR;
+ return;
+ }
+ } else if (id >= CFF_LAST_DICT_OP1) {
+ *status = CFF_ERROR_PARSE_ERROR;
+ return;
+ }
+
+ argtype = dict_operator[id].argtype;
+ if (dict_operator[id].opname == NULL || argtype < 0) {
+ *status = CFF_ERROR_PARSE_ERROR;
+ return;
+ } else if (stack_top < 1) {
+ *status = CFF_ERROR_STACK_UNDERFLOW;
+ return;
+ }
+
+ if (dict->count >= dict->max) {
+ dict->max += DICT_ENTRY_MAX;
+ dict->entries = RENEW(dict->entries, dict->max, cff_dict_entry);
+ }
+
+ (dict->entries)[dict->count].id = id;
+ (dict->entries)[dict->count].key = (char *) dict_operator[id].opname;
+ if (argtype == CFF_TYPE_NUMBER ||
+ argtype == CFF_TYPE_BOOLEAN ||
+ argtype == CFF_TYPE_SID ||
+ argtype == CFF_TYPE_OFFSET) {
+ stack_top--;
+ (dict->entries)[dict->count].count = 1;
+ (dict->entries)[dict->count].values = NEW(1, double);
+ (dict->entries)[dict->count].values[0] = arg_stack[stack_top];
+ } else {
+ (dict->entries)[dict->count].count = stack_top;
+ (dict->entries)[dict->count].values = NEW(stack_top, double);
+ while (stack_top > 0) {
+ stack_top--;
+ (dict->entries)[dict->count].values[stack_top] = arg_stack[stack_top];
+ }
+ }
+
+ dict->count += 1;
+ *data += 1;
+
+ return;
+}
+
+/*
+ * All operands are treated as number or array of numbers.
+ * Private: two numbers, size and offset
+ * ROS : three numbers, SID, SID, and a number
+ */
+cff_dict *cff_dict_unpack (card8 *data, card8 *endptr)
+{
+ cff_dict *dict;
+ int status = CFF_PARSE_OK;
+
+ stack_top = 0;
+
+ dict = cff_new_dict();
+ while (data < endptr && status == CFF_PARSE_OK) {
+ if (*data < 22) { /* operator */
+ add_dict(dict, &data, endptr, &status);
+ } else if (*data == 30) { /* real - First byte of a sequence (variable) */
+ if (stack_top < CFF_DICT_STACK_LIMIT) {
+ arg_stack[stack_top] = get_real(&data, endptr, &status);
+ stack_top++;
+ } else {
+ status = CFF_ERROR_STACK_OVERFLOW;
+ }
+ } else if (*data == 255 || (*data >= 22 && *data <= 27)) { /* reserved */
+ data++;
+ } else { /* everything else are integer */
+ if (stack_top < CFF_DICT_STACK_LIMIT) {
+ arg_stack[stack_top] = get_integer(&data, endptr, &status);
+ stack_top++;
+ } else {
+ status = CFF_ERROR_STACK_OVERFLOW;
+ }
+ }
+ }
+
+ if (status != CFF_PARSE_OK) {
+ ERROR("%s: Parsing CFF DICT failed. (error=%d)", CFF_DEBUG_STR, status);
+ } else if (stack_top != 0) {
+ WARN("%s: Garbage in CFF DICT data.", CFF_DEBUG_STR);
+ stack_top = 0;
+ }
+
+ return dict;
+}
+
+/* Pack DICT data */
+static long pack_integer (card8 *dest, long destlen, long value)
+{
+ long len = 0;
+
+ if (value >= -107 && value <= 107) {
+ if (destlen < 1)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[0] = (value + 139) & 0xff;
+ len = 1;
+ } else if (value >= 108 && value <= 1131) {
+ if (destlen < 2)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ value = 0xf700u + value - 108;
+ dest[0] = (value >> 8) & 0xff;
+ dest[1] = value & 0xff;
+ len = 2;
+ } else if (value >= -1131 && value <= -108) {
+ if (destlen < 2)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ value = 0xfb00u - value - 108;
+ dest[0] = (value >> 8) & 0xff;
+ dest[1] = value & 0xff;
+ len = 2;
+ } else if (value >= -32768 && value <= 32767) { /* shortint */
+ if (destlen < 3)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[0] = 28;
+ dest[1] = (value >> 8) & 0xff;
+ dest[2] = value & 0xff;
+ len = 3;
+ } else { /* longint */
+ if (destlen < 5)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[0] = 29;
+ dest[1] = (value >> 24) & 0xff;
+ dest[2] = (value >> 16) & 0xff;
+ dest[3] = (value >> 8) & 0xff;
+ dest[4] = value & 0xff;
+ len = 5;
+ }
+
+ return len;
+}
+
+static long pack_real (card8 *dest, long destlen, double value)
+{
+ long e;
+ int i = 0, pos = 2;
+#define CFF_REAL_MAX_LEN 17
+
+ if (destlen < 2)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+
+ dest[0] = 30;
+
+ if (value == 0.0) {
+ dest[1] = 0x0f;
+ return 2;
+ }
+
+ if (value < 0.0) {
+ dest[1] = 0xe0;
+ value *= -1.0;
+ pos++;
+ }
+
+ e = 0;
+ if (value >= 10.0) {
+ while (value >= 10.0) {
+ value /= 10.0;
+ e++;
+ }
+ } else if (value < 1.0) {
+ while (value < 1.0) {
+ value *= 10.0;
+ e--;
+ }
+ }
+
+ sprintf(work_buffer, "%1.14g", value);
+ for (i=0;i<CFF_REAL_MAX_LEN;i++) {
+ unsigned char ch = 0;
+ if (work_buffer[i] == '\0') {
+ break;
+ } else if (work_buffer[i] == '.') {
+ ch = 0x0a;
+ } else if (work_buffer[i] >= '0' && work_buffer[i] <= '9') {
+ ch = work_buffer[i] - '0';
+ } else {
+ ERROR("%s: Invalid character.", CFF_DEBUG_STR);
+ }
+
+ if (destlen < pos/2 + 1)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+
+ if (pos % 2) {
+ dest[pos/2] += ch;
+ } else {
+ dest[pos/2] = (ch << 4);
+ }
+ pos++;
+ }
+
+ if (e > 0) {
+ if (pos % 2) {
+ dest[pos/2] += 0x0b;
+ } else {
+ if (destlen < pos/2 + 1)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[pos/2] = 0xb0;
+ }
+ pos++;
+ } else if (e < 0) {
+ if (pos % 2) {
+ dest[pos/2] += 0x0c;
+ } else {
+ if (destlen < pos/2 + 1)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[pos/2] = 0xc0;
+ }
+ e *= -1;
+ pos++;
+ }
+
+ if (e != 0) {
+ sprintf(work_buffer, "%ld", e);
+ for (i=0;i<CFF_REAL_MAX_LEN;i++) {
+ unsigned char ch = 0;
+ if (work_buffer[i] == '\0') {
+ break;
+ } else if (work_buffer[i] == '.') {
+ ch = 0x0a;
+ } else if (work_buffer[i] >= '0' && work_buffer[i] <= '9') {
+ ch = work_buffer[i] - '0';
+ } else {
+ ERROR("%s: Invalid character.", CFF_DEBUG_STR);
+ }
+
+ if (destlen < pos/2 + 1)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+
+ if (pos % 2) {
+ dest[pos/2] += ch;
+ } else {
+ dest[pos/2] = (ch << 4);
+ }
+ pos++;
+ }
+ }
+
+ if (pos % 2) {
+ dest[pos/2] += 0x0f;
+ pos++;
+ } else {
+ if (destlen < pos/2 + 1)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[pos/2] = 0xff;
+ pos += 2;
+ }
+
+ return pos/2;
+}
+
+static long cff_dict_put_number (double value,
+ card8 *dest, long destlen,
+ int type)
+{
+ long len = 0;
+ double nearint;
+
+ nearint = floor(value+0.5);
+ /* set offset to longint */
+ if (type == CFF_TYPE_OFFSET) {
+ long lvalue;
+
+ lvalue = (long) value;
+ if (destlen < 5)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[0] = 29;
+ dest[1] = (lvalue >> 24) & 0xff;
+ dest[2] = (lvalue >> 16) & 0xff;
+ dest[3] = (lvalue >> 8) & 0xff;
+ dest[4] = lvalue & 0xff;
+ len = 5;
+ } else if (value > CFF_INT_MAX || value < CFF_INT_MIN ||
+ (fabs(value - nearint) > 1.0e-5)) { /* real */
+ len = pack_real(dest, destlen, value);
+ } else { /* integer */
+ len = pack_integer(dest, destlen, (long) nearint);
+ }
+
+ return len;
+}
+
+static long
+put_dict_entry (cff_dict_entry *de,
+ card8 *dest, long destlen)
+{
+ long len = 0;
+ int i, type, id;
+
+ if (de->count > 0) {
+ id = de->id;
+ if (dict_operator[id].argtype == CFF_TYPE_OFFSET ||
+ dict_operator[id].argtype == CFF_TYPE_SZOFF) {
+ type = CFF_TYPE_OFFSET;
+ } else {
+ type = CFF_TYPE_NUMBER;
+ }
+ for (i = 0; i < de->count; i++) {
+ len += cff_dict_put_number(de->values[i],
+ dest+len,
+ destlen-len, type);
+ }
+ if (id >= 0 && id < CFF_LAST_DICT_OP1) {
+ if (len + 1 > destlen)
+ ERROR("%s: Buffer overflow.", CFF_DEBUG_STR);
+ dest[len++] = id;
+ } else if (id >= 0 && id < CFF_LAST_DICT_OP) {
+ if (len + 2 > destlen)
+ ERROR("in cff_dict_pack(): Buffer overflow");
+ dest[len++] = 12;
+ dest[len++] = id - CFF_LAST_DICT_OP1;
+ } else {
+ ERROR("%s: Invalid CFF DICT operator ID.", CFF_DEBUG_STR);
+ }
+ }
+
+ return len;
+}
+
+long cff_dict_pack (cff_dict *dict, card8 *dest, long destlen)
+{
+ long len = 0;
+ int i;
+
+ for (i = 0; i < dict->count; i++) {
+ if (!strcmp(dict->entries[i].key, "ROS")) {
+ len += put_dict_entry(&dict->entries[i], dest, destlen);
+ break;
+ }
+ }
+ for (i = 0; i < dict->count; i++) {
+ if (strcmp(dict->entries[i].key, "ROS")) {
+ len += put_dict_entry(&dict->entries[i], dest+len, destlen-len);
+ }
+ }
+
+ return len;
+}
+
+void cff_dict_add (cff_dict *dict, const char *key, int count)
+{
+ int id, i;
+
+ for (id=0;id<CFF_LAST_DICT_OP;id++) {
+ if (key && dict_operator[id].opname &&
+ strcmp(dict_operator[id].opname, key) == 0)
+ break;
+ }
+
+ if (id == CFF_LAST_DICT_OP)
+ ERROR("%s: Unknown CFF DICT operator.", CFF_DEBUG_STR);
+
+ for (i=0;i<dict->count;i++) {
+ if ((dict->entries)[i].id == id) {
+ if ((dict->entries)[i].count != count)
+ ERROR("%s: Inconsistent DICT argument number.", CFF_DEBUG_STR);
+ return;
+ }
+ }
+
+ if (dict->count + 1 >= dict->max) {
+ dict->max += 8;
+ dict->entries = RENEW(dict->entries, dict->max, cff_dict_entry);
+ }
+
+ (dict->entries)[dict->count].id = id;
+ (dict->entries)[dict->count].key = (char *) dict_operator[id].opname;
+ (dict->entries)[dict->count].count = count;
+ if (count > 0) {
+ (dict->entries)[dict->count].values = NEW(count, double);
+ memset((dict->entries)[dict->count].values,
+ 0, sizeof(double)*count);
+ } else {
+ (dict->entries)[dict->count].values = NULL;
+ }
+ dict->count += 1;
+
+ return;
+}
+
+void cff_dict_remove (cff_dict *dict, const char *key)
+{
+ int i;
+ for (i = 0; i < dict->count; i++) {
+ if (key && strcmp(key, (dict->entries)[i].key) == 0) {
+ (dict->entries)[i].count = 0;
+ if ((dict->entries)[i].values)
+ RELEASE((dict->entries)[i].values);
+ (dict->entries)[i].values = NULL;
+ }
+ }
+}
+
+int cff_dict_known (cff_dict *dict, const char *key)
+{
+ int i;
+
+ for (i = 0; i < dict->count; i++) {
+ if (key && strcmp(key, (dict->entries)[i].key) == 0
+ && (dict->entries)[i].count > 0)
+ return 1;
+ }
+
+ return 0;
+}
+
+double cff_dict_get (cff_dict *dict, const char *key, int idx)
+{
+ double value = 0.0;
+ int i;
+
+ ASSERT(key && dict);
+
+ for (i = 0; i < dict->count; i++) {
+ if (strcmp(key, (dict->entries)[i].key) == 0) {
+ if ((dict->entries)[i].count > idx)
+ value = (dict->entries)[i].values[idx];
+ else
+ ERROR("%s: Invalid index number.", CFF_DEBUG_STR);
+ break;
+ }
+ }
+
+ if (i == dict->count)
+ ERROR("%s: DICT entry \"%s\" not found.", CFF_DEBUG_STR, key);
+
+ return value;
+}
+
+void cff_dict_set (cff_dict *dict, const char *key, int idx, double value)
+{
+ int i;
+
+ ASSERT(dict && key);
+
+ for (i = 0 ; i < dict->count; i++) {
+ if (strcmp(key, (dict->entries)[i].key) == 0) {
+ if ((dict->entries)[i].count > idx)
+ (dict->entries)[i].values[idx] = value;
+ else
+ ERROR("%s: Invalid index number.", CFF_DEBUG_STR);
+ break;
+ }
+ }
+
+ if (i == dict->count)
+ ERROR("%s: DICT entry \"%s\" not found.", CFF_DEBUG_STR, key);
+}
+
+void cff_dict_update (cff_dict *dict, cff_font *cff)
+{
+ int i;
+
+ for (i = 0;i < dict->count; i++) {
+ if ((dict->entries)[i].count > 0) {
+ char *str;
+ int id;
+
+ id = (dict->entries)[i].id;
+ if (dict_operator[id].argtype == CFF_TYPE_SID) {
+ str = cff_get_string(cff, (dict->entries)[i].values[0]);
+ (dict->entries)[i].values[0] = cff_add_string(cff, str);
+ RELEASE(str);
+ } else if (dict_operator[id].argtype == CFF_TYPE_ROS) {
+ str = cff_get_string(cff, (dict->entries)[i].values[0]);
+ (dict->entries)[i].values[0] = cff_add_string(cff, str);
+ RELEASE(str);
+ str = cff_get_string(cff, (dict->entries)[i].values[1]);
+ (dict->entries)[i].values[1] = cff_add_string(cff, str);
+ RELEASE(str);
+ }
+ }
+ }
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cff_dict.h b/Build/source/texk/xdvipdfmx/src/cff_dict.h
new file mode 100644
index 00000000000..806fc4be50d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff_dict.h
@@ -0,0 +1,48 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff_dict.h,v 1.6 2004/02/15 12:59:42 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CFF_DICT_H_
+#define _CFF_DICT_H_
+
+#include "cff_types.h"
+#include "cff.h"
+
+#define CFF_CIDCOUNT_DEFAULT 8720
+#define CFF_NOMINALWIDTHX_DEFAULT 0.0
+#define CFF_DEFAULTWIDTHX_DEFAULT 0.0
+
+extern cff_dict *cff_new_dict (void);
+extern void cff_release_dict (cff_dict *dict);
+
+extern void cff_dict_set (cff_dict *dict, const char *key, int idx, double value);
+extern double cff_dict_get (cff_dict *dict, const char *key, int idx);
+extern void cff_dict_add (cff_dict *dict, const char *key, int count);
+extern void cff_dict_remove (cff_dict *dict, const char *key);
+extern int cff_dict_known (cff_dict *dict, const char *key);
+
+/* decode/encode DICT */
+extern cff_dict *cff_dict_unpack (card8 *data, card8 *endptr);
+extern long cff_dict_pack (cff_dict *dict, card8 *dest, long destlen);
+
+extern void cff_dict_update (cff_dict *dict, cff_font *cff);
+
+#endif /* _CFF_DICT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cff_limits.h b/Build/source/texk/xdvipdfmx/src/cff_limits.h
new file mode 100644
index 00000000000..3bfd88a80ca
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff_limits.h
@@ -0,0 +1,46 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff_limits.h,v 1.3 2002/10/30 02:27:05 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CFF_LIMITS_H_
+#define _CFF_LIMITS_H_
+
+#include <limits.h>
+
+#define CFF_INT_MAX 0x7fffffff
+#define CFF_INT_MIN (-0x7fffffff - 1)
+
+#if (LONG_MAX < CFF_INT_MAX || LONG_MIN > CFF_INT_MIN)
+#error "CFF support won't work on this system."
+#endif
+
+#define CFF_SID_MAX 64999
+#define CFF_STDSTR_MAX 391
+
+/* Type 2 Charstring */
+#define CS_NUM_SUBR_MAX 65536
+#define CS_STR_LEN_MAX 65536
+#define CS_STEM_ZONE_MAX 96
+#define CS_ARG_STACK_MAX 48
+#define CS_TRANS_ARRAY_MAX 32
+#define CS_SUBR_NEST_MAX 10
+
+#endif /* _CFF_LIMITS_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cff_stdstr.h b/Build/source/texk/xdvipdfmx/src/cff_stdstr.h
new file mode 100644
index 00000000000..2c3e2ba7a39
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff_stdstr.h
@@ -0,0 +1,109 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff_stdstr.h,v 1.3 2002/10/30 02:27:05 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CFF_STDSTR_H_
+#define _CFF_STDSTR_H_
+
+#define CFF_STDSTR_MAX 391
+
+const char *const cff_stdstr[CFF_STDSTR_MAX] = {
+ ".notdef", "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright", "parenleft",
+ "parenright", "asterisk", "plus", "comma", "hyphen",
+ "period", "slash", "zero", "one", "two",
+ "three", "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon", "less",
+ "equal", "greater", "question", "at", "A",
+ "B", "C", "D", "E", "F",
+ "G", "H", "I", "J", "K",
+ "L", "M", "N", "O", "P",
+ "Q", "R", "S", "T", "U",
+ "V", "W", "X", "Y", "Z",
+ "bracketleft", "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c", "d",
+ "e", "f", "g", "h", "i",
+ "j", "k", "l", "m", "n",
+ "o", "p", "q", "r", "s",
+ "t", "u", "v", "w", "x",
+ "y", "z", "braceleft", "bar", "braceright",
+ "asciitilde", "exclamdown", "cent", "sterling", "fraction",
+ "yen", "florin", "section", "currency", "quotesingle",
+ "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi",
+ "fl", "endash", "dagger", "daggerdbl", "periodcentered",
+ "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright",
+ "guillemotright", "ellipsis", "perthousand", "questiondown", "grave",
+ "acute", "circumflex", "tilde", "macron", "breve",
+ "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut",
+ "ogonek", "caron", "emdash", "AE", "ordfeminine",
+ "Lslash", "Oslash", "OE", "ordmasculine", "ae",
+ "dotlessi", "lslash", "oslash", "oe", "germandbls",
+ "onesuperior", "logicalnot", "mu", "trademark", "Eth",
+ "onehalf", "plusminus", "Thorn", "onequarter", "divide",
+ "brokenbar", "degree", "thorn", "threequarters", "twosuperior",
+ "registered", "minus", "eth", "multiply", "threesuperior",
+ "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave",
+ "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex",
+ "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis",
+ "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis",
+ "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex",
+ "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron",
+ "aacute", "acircumflex", "adieresis", "agrave", "aring",
+ "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis",
+ "egrave", "iacute", "icircumflex", "idieresis", "igrave",
+ "ntilde", "oacute", "ocircumflex", "odieresis", "ograve",
+ "otilde", "scaron", "uacute", "ucircumflex", "udieresis",
+ "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall",
+ "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
+ "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle",
+ "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle",
+ "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior",
+ "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior",
+ "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior",
+ "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior",
+ "tsuperior", "ff", "ffi", "ffl", "parenleftinferior",
+ "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall",
+ "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall",
+ "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall",
+ "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall",
+ "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall",
+ "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall",
+ "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall",
+ "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall",
+ "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash",
+ "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall",
+ "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird",
+ "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior",
+ "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior",
+ "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior",
+ "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior",
+ "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall",
+ "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall",
+ "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall",
+ "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall",
+ "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall",
+ "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall",
+ "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall",
+ "001.000", "001.001", "001.002", "001.003",
+ "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"
+};
+
+#endif /* _CFF_STDSTR_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cff_types.h b/Build/source/texk/xdvipdfmx/src/cff_types.h
new file mode 100644
index 00000000000..ede20b64199
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cff_types.h
@@ -0,0 +1,142 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cff_types.h,v 1.3 2002/10/30 02:27:05 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CFF_TYPES_H_
+#define _CFF_TYPES_H_
+
+/* CFF Data Types */
+
+#define CFF_TYPE_UNKNOWN 0
+#define CFF_TYPE_INTEGER (1 << 0)
+#define CFF_TYPE_REAL (1 << 1)
+#define CFF_TYPE_NUMBER (CFF_TYPE_INTEGER|CFF_TYPE_REAL)
+#define CFF_TYPE_BOOLEAN (1 << 2)
+#define CFF_TYPE_SID (1 << 3)
+#define CFF_TYPE_ARRAY (1 << 4)
+#define CFF_TYPE_DELTA (1 << 5)
+
+/* SID SID number */
+#define CFF_TYPE_ROS (1 << 6)
+/* offset(0) */
+#define CFF_TYPE_OFFSET (1 << 7)
+/* size offset(0) */
+#define CFF_TYPE_SZOFF (1 << 8)
+
+typedef unsigned char card8; /* 1-byte unsigned number */
+typedef unsigned short card16; /* 2-byte unsigned number */
+typedef unsigned char c_offsize; /* 1-byte unsigned number specifies the size
+ of an Offset field or fields, range 1-4 */
+typedef unsigned long l_offset; /* 1, 2, 3, or 4-byte offset */
+typedef unsigned short s_SID; /* 2-byte string identifier */
+
+typedef unsigned long l_size;
+
+typedef struct {
+ card16 count; /* number of objects stored in INDEX */
+ c_offsize offsize; /* Offset array element size, 1-4 */
+ l_offset *offset; /* Offset array, count + 1 offsets */
+ card8 *data; /* Object data */
+} cff_index;
+
+typedef struct {
+ card8 major; /* format major version (starting at 1) */
+ card8 minor; /* format minor version (starting at 0) */
+ card8 hdr_size; /* Header size (bytes) */
+ c_offsize offsize; /* Absolute offset (0) size */
+} cff_header;
+
+
+/* Dictionary */
+typedef struct {
+ int id; /* encoded data value (as card8 or card16) */
+ char *key; /* opname */
+ int count; /* number of values */
+ double *values; /* values */
+} cff_dict_entry;
+
+typedef struct {
+ int max;
+ int count;
+ cff_dict_entry *entries;
+} cff_dict;
+
+/* Encoding, Charset and FDSelect */
+typedef struct
+{
+ s_SID first; /* SID or CID, or card8 for Encoding */
+ card8 n_left; /* no. of remaining gids/codes in this range */
+} cff_range1;
+
+typedef struct
+{
+ s_SID first; /* SID or CID (card16) */
+ card16 n_left; /* card16-version of range1 */
+} cff_range2;
+
+typedef struct
+{
+ card8 code;
+ s_SID glyph;
+} cff_map;
+
+typedef struct
+{
+ card8 format; /* if (format & 0x80) then have supplement */
+ card8 num_entries; /* number of entries */
+ union {
+ card8 *codes; /* format 0 */
+ cff_range1 *range1; /* format 1 */
+ } data;
+ card8 num_supps; /* number of supplementary data */
+ cff_map *supp; /* supplement */
+} cff_encoding;
+
+typedef struct
+{
+ card8 format;
+ card16 num_entries;
+ union {
+ s_SID *glyphs; /* format 0 */
+ cff_range1 *range1; /* format 1 */
+ cff_range2 *range2; /* format 2 */
+ } data;
+} cff_charsets;
+
+/* CID-Keyed font specific */
+typedef struct
+{
+ card16 first;
+ card8 fd;
+} cff_range3;
+
+typedef struct
+{
+ card8 format;
+ card16 num_entries; /* number of glyphs/ranges */
+ union {
+ card8 *fds; /* format 0 */
+ cff_range3 *ranges; /* format 3 */
+ } data;
+ /* card16 sentinel; */ /* format 3 only, must be equals to num_glyphs */
+} cff_fdselect;
+
+#endif /* _CFF_TYPES_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cid.c b/Build/source/texk/xdvipdfmx/src/cid.c
new file mode 100644
index 00000000000..95d336dd333
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cid.c
@@ -0,0 +1,826 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cid.c,v 1.29 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * CID-keyed font support:
+ *
+ * See also, cidtype0, and cidtype2
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+
+#include "cidtype0.h"
+#include "cidtype2.h"
+#include "cid_p.h"
+#include "cid.h"
+
+#define CIDFONT_DEBUG 3
+#define CIDFONT_DEBUG_STR "CIDFont"
+
+#define PDF_CID_SUPPORT_MIN 2
+#define PDF_CID_SUPPORT_MAX 6
+
+/*
+ * Unicode and PDF Standard Character Collections.
+ *
+ * Adobe-Identity is only for TrueType fonts and it means font's
+ * internal glyph ordering.
+ */
+static struct {
+ const char *registry;
+ const char *ordering;
+ /* Heighest Supplement values supported by PDF-1.0, 1.1, ... */
+ int supplement[16];
+} CIDFont_stdcc_def[] = {
+ {"Adobe", "UCS", {-1, -1, 0, 0, 0, 0, 0}},
+ {"Adobe", "GB1", {-1, -1, 0, 2, 4, 4, 4}},
+ {"Adobe", "CNS1", {-1, -1, 0, 0, 3, 4, 4}},
+ {"Adobe", "Japan1", {-1, -1, 2, 2, 4, 5, 6}},
+ {"Adobe", "Korea1", {-1, -1, 1, 1, 2, 2, 2}},
+ {"Adobe", "Identity", {-1, -1, 0, 0, 0, 0, 0}},
+ {NULL, NULL, {0,0,0,0,0,0,0}}
+};
+#define UCS_CC 0
+#define ACC_START 1
+#define ACC_END 4
+
+CIDSysInfo CSI_IDENTITY = {
+ (char *) "Adobe",
+ (char *) "Identity",
+ 0
+};
+
+CIDSysInfo CSI_UNICODE = {
+ (char *) "Adobe",
+ (char *) "UCS",
+ 0
+};
+
+/*
+ * Optional supplement after alias name.
+ */
+static struct {
+ const char *name;
+ int index;
+} CIDFont_stdcc_alias[] = {
+ {"AU", 0}, {"AG1", 1}, {"AC1", 2}, {"AJ1", 3}, {"AK1", 4}, {"AI", 5},
+ {"UCS", 0}, {"GB1", 1}, {"CNS1", 2}, {"Japan1", 3}, {"Korea1", 4}, {"Identity", 5},
+ {"U", 0}, {"G", 1}, {"C", 2}, {"J", 3}, {"K", 4}, {"I", 5},
+ {NULL, 0}
+};
+
+static void release_opt (cid_opt *opt);
+static CIDSysInfo *get_cidsysinfo (const char *map_name, fontmap_opt *fmap_opt);
+
+static int __verbose = 0;
+static long cidoptflags = 0;
+
+void
+CIDFont_set_verbose (void)
+{
+ CIDFont_type0_set_verbose();
+ CIDFont_type2_set_verbose();
+ __verbose++;
+}
+
+int
+CIDFont_require_version (void)
+{
+ return PDF_CID_SUPPORT_MIN;
+}
+
+CIDFont *
+CIDFont_new (void)
+{
+ CIDFont *font = NULL;
+
+ font = NEW(1, struct CIDFont);
+
+ font->name = NULL;
+ font->fontname = NULL;
+ font->ident = NULL;
+
+#ifdef XETEX
+ font->ft_face = NULL;
+ font->ft_to_gid = NULL;
+#endif
+
+ /*
+ * CIDFont
+ */
+ font->subtype = -1;
+ font->flags = FONT_FLAG_NONE;
+ font->csi = NULL;
+ font->options = NULL;
+ (font->parent)[0] = -1; /* Horizontal */
+ (font->parent)[1] = -1; /* Vertical */
+
+ /*
+ * PDF Font Resource
+ */
+ font->indirect = NULL;
+ font->fontdict = NULL;
+ font->descriptor = NULL;
+
+ return font;
+}
+
+/* It does write PDF objects. */
+void
+CIDFont_flush (CIDFont *font)
+{
+ if (font) {
+ if (font->indirect) pdf_release_obj(font->indirect);
+ font->indirect = NULL;
+ if (font->fontdict) pdf_release_obj(font->fontdict);
+ font->fontdict = NULL;
+ if (font->descriptor) pdf_release_obj(font->descriptor);
+ font->descriptor = NULL;
+ }
+}
+
+void
+CIDFont_release (CIDFont *font)
+{
+ if (font) {
+ switch(font->subtype) {
+ case CIDFONT_TYPE0:
+ CIDFont_type0_release(font);
+ break;
+ case CIDFONT_TYPE2:
+ CIDFont_type2_release(font);
+ break;
+ }
+ if (font->indirect)
+ ERROR("%s: Object not flushed.", CIDFONT_DEBUG_STR);
+ if (font->fontdict)
+ ERROR("%s: Object not flushed.", CIDFONT_DEBUG_STR);
+ if (font->descriptor)
+ ERROR("%s: Object not flushed.", CIDFONT_DEBUG_STR);
+
+ if (font->fontname) RELEASE(font->fontname);
+ if (font->name) RELEASE(font->name);
+ if (font->ident) RELEASE(font->ident);
+ if (font->csi) {
+ if (font->csi->registry)
+ RELEASE(font->csi->registry);
+ if (font->csi->ordering)
+ RELEASE(font->csi->ordering);
+ RELEASE(font->csi);
+ }
+ if (font->options)
+ release_opt(font->options);
+ }
+}
+
+#ifdef XETEX
+unsigned short *
+CIDFont_get_ft_to_gid(CIDFont *font)
+{
+ ASSERT(font);
+ return font->ft_to_gid;
+}
+#endif
+
+char *
+CIDFont_get_fontname (CIDFont *font)
+{
+ ASSERT(font);
+ return font->fontname;
+}
+
+char *
+CIDFont_get_ident (CIDFont *font)
+{
+ ASSERT(font);
+ return font->ident;
+}
+
+int
+CIDFont_get_opt_index (CIDFont *font)
+{
+ int opt_index;
+
+ ASSERT(font);
+
+ if (font->options)
+ opt_index = font->options->index;
+ else {
+ opt_index = 0;
+ }
+
+ return opt_index;
+}
+
+#ifdef XETEX
+FT_Face
+CIDFont_get_ft_face(CIDFont *font)
+{
+ ASSERT(font);
+ return font->ft_face;
+}
+#endif
+
+int
+CIDFont_get_subtype (CIDFont *font)
+{
+ ASSERT(font);
+ return font->subtype;
+}
+
+int
+CIDFont_get_embedding (CIDFont *font)
+{
+ ASSERT(font);
+ return font->options->embed;
+}
+
+CIDSysInfo *
+CIDFont_get_CIDSysInfo (CIDFont *font)
+{
+ ASSERT(font);
+
+ return font->csi;
+}
+
+/*
+ * Returns ID of parent Type0 font
+ * wmode: 0 for horizontal, 1 for vertical
+ */
+int
+CIDFont_get_parent_id (CIDFont *font, int wmode)
+{
+ ASSERT(font);
+
+ if (wmode < 0 || wmode > 1)
+ ERROR("%s: Invalid wmode value.", CIDFONT_DEBUG_STR);
+
+ return (font->parent)[wmode];
+}
+
+pdf_obj *
+CIDFont_get_resource (CIDFont *font)
+{
+ ASSERT(font);
+
+ if (!font->indirect)
+ font->indirect = pdf_ref_obj(font->fontdict);
+
+ return pdf_link_obj(font->indirect);
+}
+
+/*
+ * Set parent Type0 font.
+ */
+void
+CIDFont_attach_parent (CIDFont *font, int parent_id, int wmode)
+{
+ ASSERT(font);
+
+ if (wmode < 0 || wmode > 1)
+ ERROR("%s: Invalid wmode value.", CIDFONT_DEBUG_STR);
+
+ if (font->parent[wmode] >= 0)
+ WARN("%s: CIDFont already have a parent Type1 font.", CIDFONT_DEBUG_STR);
+
+ font->parent[wmode] = parent_id;
+}
+
+int
+CIDFont_is_ACCFont (CIDFont *font)
+{
+ int i;
+
+ ASSERT(font);
+
+ if (!font->csi)
+ ERROR("%s: CIDSystemInfo undefined.", CIDFONT_DEBUG_STR);
+
+ for (i = ACC_START; i <= ACC_END ; i++) {
+ if (!strcmp(font->csi->registry, CIDFont_stdcc_def[i].registry) &&
+ !strcmp(font->csi->ordering, CIDFont_stdcc_def[i].ordering))
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+CIDFont_is_UCSFont (CIDFont *font)
+{
+ ASSERT(font);
+ if (!strcmp(font->csi->ordering, "UCS") ||
+ !strcmp(font->csi->ordering, "UCS2"))
+ return 1;
+ return 0;
+}
+
+/* FIXME */
+int
+CIDFont_get_flag (CIDFont *font, int mask)
+{
+ ASSERT(font);
+ return ((font->flags & mask) ? 1 : 0);
+}
+
+static void
+CIDFont_dofont (CIDFont *font)
+{
+ if (!font || !font->indirect)
+ return;
+
+ if (__verbose)
+ MESG(":%s", font->ident);
+ if (__verbose > 1) {
+ if (font->fontname)
+ MESG("[%s]", font->fontname);
+ }
+
+ switch (font->subtype) {
+ case CIDFONT_TYPE0:
+ if(__verbose)
+ MESG("[CIDFontType0]");
+ if (CIDFont_get_flag(font, CIDFONT_FLAG_TYPE1))
+ CIDFont_type0_t1dofont(font);
+ else if (CIDFont_get_flag(font, CIDFONT_FLAG_TYPE1C))
+ CIDFont_type0_t1cdofont(font);
+ else
+ CIDFont_type0_dofont(font);
+ break;
+ case CIDFONT_TYPE2:
+ if(__verbose)
+ MESG("[CIDFontType2]");
+ CIDFont_type2_dofont(font);
+ break;
+ default:
+ ERROR("%s: Unknown CIDFontType %d.", CIDFONT_DEBUG_STR, font->subtype);
+ break;
+ }
+}
+
+
+/*
+ *
+ */
+int
+CIDFont_is_BaseFont (CIDFont *font)
+{
+ ASSERT(font);
+ return (font->flags & FONT_FLAG_BASEFONT) ? 1 : 0;
+}
+
+#include "pdfparse.h"
+#include "cid_basefont.h"
+
+static int CIDFont_base_open (CIDFont *font,
+ const char *name, CIDSysInfo *cmap_csi, cid_opt *opt);
+
+static int
+CIDFont_base_open (CIDFont *font, const char *name, CIDSysInfo *cmap_csi, cid_opt *opt)
+{
+ pdf_obj *fontdict, *descriptor;
+ char *fontname = NULL;
+ int idx;
+
+ ASSERT(font);
+
+ for (idx = 0; cid_basefont[idx].fontname != NULL; idx++) {
+ if (!strcmp(name, cid_basefont[idx].fontname) ||
+ (strlen(name) == strlen(cid_basefont[idx].fontname) - strlen("-Acro") &&
+ !strncmp(name, cid_basefont[idx].fontname,
+ strlen(cid_basefont[idx].fontname)-strlen("-Acro")))
+ )
+ break;
+ }
+
+ if (cid_basefont[idx].fontname == NULL)
+ return -1;
+
+ fontname = NEW(strlen(name)+12, char);
+ memset(fontname, 0, strlen(name)+12);
+ strcpy(fontname, name);
+
+ switch (opt->style) {
+ case FONT_STYLE_BOLD:
+ strcat(fontname, ",Bold");
+ break;
+ case FONT_STYLE_ITALIC:
+ strcat(fontname, ",Italic");
+ break;
+ case FONT_STYLE_BOLDITALIC:
+ strcat(fontname, ",BoldItalic");
+ break;
+ }
+ {
+ const char *start;
+ const char *end;
+
+ start = cid_basefont[idx].fontdict;
+ end = start + strlen(start);
+ fontdict = parse_pdf_dict((char **)&start, (char *)end);
+ start = cid_basefont[idx].descriptor;
+ end = start + strlen(start);
+ descriptor = parse_pdf_dict((char **)&start, (char *)end);
+
+ ASSERT(fontdict && descriptor);
+ }
+
+ font->fontname = fontname;
+ font->flags |= FONT_FLAG_BASEFONT;
+ {
+ char *registry, *ordering;
+ int supplement;
+ pdf_obj *tmp;
+
+ tmp = pdf_lookup_dict(fontdict, "CIDSystemInfo");
+
+ ASSERT( tmp && pdf_obj_typeof(tmp) == PDF_DICT );
+
+ registry = pdf_string_value(pdf_lookup_dict(tmp, "Registry"));
+ ordering = pdf_string_value(pdf_lookup_dict(tmp, "Ordering"));
+ supplement = pdf_number_value(pdf_lookup_dict(tmp, "Supplement"));
+ if (cmap_csi) { /* NULL for accept any */
+ if (strcmp(registry, cmap_csi->registry) ||
+ strcmp(ordering, cmap_csi->ordering))
+ ERROR("Inconsistent CMap used for CID-keyed font %s.",
+ cid_basefont[idx].fontname);
+ else if (supplement < cmap_csi->supplement) {
+ WARN("CMap has higher supplement number than CIDFont: %s", fontname);
+ WARN("Some chracters may not be displayed or printed.");
+ }
+ }
+ font->csi = NEW(1, CIDSysInfo);
+ font->csi->registry = NEW(strlen(registry)+1, char);
+ font->csi->ordering = NEW(strlen(ordering)+1, char);
+ strcpy(font->csi->registry, registry);
+ strcpy(font->csi->ordering, ordering);
+ font->csi->supplement = supplement;
+ }
+
+ {
+ pdf_obj *tmp;
+ char *type;
+
+ tmp = pdf_lookup_dict(fontdict, "Subtype");
+ ASSERT( tmp != NULL && pdf_obj_typeof(tmp) == PDF_NAME );
+
+ type = pdf_name_value(tmp);
+ if (!strcmp(type, "CIDFontType0"))
+ font->subtype = CIDFONT_TYPE0;
+ else if (!strcmp(type, "CIDFontType2"))
+ font->subtype = CIDFONT_TYPE2;
+ else {
+ ERROR("Unknown CIDFontType \"%s\"", type);
+ }
+ }
+
+ if (cidoptflags & CIDFONT_FORCE_FIXEDPITCH) {
+ if (pdf_lookup_dict(fontdict, "W")) {
+ pdf_remove_dict(fontdict, "W");
+ }
+ if (pdf_lookup_dict(fontdict, "W2")) {
+ pdf_remove_dict(fontdict, "W2");
+ }
+ }
+
+ pdf_add_dict(fontdict, pdf_new_name("Type"), pdf_new_name("Font"));
+ pdf_add_dict(fontdict, pdf_new_name("BaseFont"), pdf_new_name(fontname));
+ pdf_add_dict(descriptor, pdf_new_name("Type"), pdf_new_name("FontDescriptor"));
+ pdf_add_dict(descriptor, pdf_new_name("FontName"), pdf_new_name(fontname));
+
+ font->fontdict = fontdict;
+ font->descriptor = descriptor;
+
+ opt->embed = 0;
+
+ return 0;
+}
+
+
+
+#define CACHE_ALLOC_SIZE 16u
+
+struct FontCache {
+ int num;
+ int max;
+ CIDFont **fonts;
+};
+
+static struct FontCache *__cache = NULL;
+
+#define CHECK_ID(n) do {\
+ if (! __cache)\
+ ERROR("%s: CIDFont cache not initialized.", CIDFONT_DEBUG_STR);\
+ if ((n) < 0 || (n) >= __cache->num)\
+ ERROR("%s: Invalid ID %d", CIDFONT_DEBUG_STR, (n));\
+ } while (0)
+
+void
+CIDFont_cache_init (void)
+{
+ if (__cache)
+ ERROR("%s: Already initialized.", CIDFONT_DEBUG_STR);
+
+ __cache = NEW(1, struct FontCache);
+
+ __cache->max = CACHE_ALLOC_SIZE;
+ __cache->fonts = NEW(__cache->max, struct CIDFont *);
+ __cache->num = 0;
+}
+
+CIDFont *
+CIDFont_cache_get (int font_id)
+{
+ CHECK_ID(font_id);
+ return __cache->fonts[font_id];
+}
+
+/*
+ * cmap_csi is NULL if CMap is Identity.
+ */
+int
+CIDFont_cache_find (const char *map_name,
+ CIDSysInfo *cmap_csi, fontmap_opt *fmap_opt)
+{
+ int font_id = -1;
+ CIDFont *font = NULL;
+ cid_opt *opt = NULL;
+
+ if (!__cache)
+ CIDFont_cache_init();
+
+ opt = NEW(1, cid_opt);
+ opt->style = fmap_opt->style;
+ opt->index = fmap_opt->index;
+ opt->embed = (fmap_opt->flags & FONTMAP_OPT_NOEMBED) ? 0 : 1;
+ opt->name = NULL;
+ opt->csi = get_cidsysinfo(map_name, fmap_opt);
+
+ if (!opt->csi && cmap_csi) {
+ /*
+ * No CIDSystemInfo supplied explicitly. Copy from CMap's one if available.
+ * It is not neccesary for CID-keyed fonts. But TrueType requires them.
+ */
+ opt->csi = NEW(1, CIDSysInfo);
+ opt->csi->registry = NEW(strlen(cmap_csi->registry)+1, char);
+ strcpy(opt->csi->registry, cmap_csi->registry);
+ opt->csi->ordering = NEW(strlen(cmap_csi->ordering)+1, char);
+ strcpy(opt->csi->ordering, cmap_csi->ordering);
+ opt->csi->supplement = cmap_csi->supplement;
+ }
+ /*
+ * Here, we do not compare font->ident and map_name because of
+ * implicit CIDSystemInfo supplied by CMap for TrueType.
+ */
+ for (font_id = 0; font_id < __cache->num; font_id++) {
+ font = __cache->fonts[font_id];
+ if (!strcmp(font->name, map_name) &&
+ font->options->style == opt->style &&
+ font->options->index == opt->index) {
+ if (font->options->embed == opt->embed) {
+ /*
+ * Case 1: CSI not available (Identity CMap)
+ * Font is TrueType --> continue
+ * Font is CIDFont --> break
+ * Case 2: CSI matched --> break
+ */
+ if (!opt->csi) {
+ if (font->subtype == CIDFONT_TYPE2)
+ continue;
+ else
+ break;
+ } else if (!strcmp(font->csi->registry, opt->csi->registry) &&
+ !strcmp(font->csi->ordering, opt->csi->ordering)) {
+ if (font->subtype == CIDFONT_TYPE2)
+ font->csi->supplement =
+ MAX(opt->csi->supplement, font->csi->supplement);
+ break;
+ }
+ } else if (CIDFont_is_BaseFont(font)) {
+ opt->embed = 0;
+ break;
+ }
+ }
+ }
+
+ if (font_id < __cache->num && cmap_csi) {
+ if (strcmp(font->csi->registry, cmap_csi->registry) ||
+ strcmp(font->csi->ordering, cmap_csi->ordering))
+ ERROR("%s: Incompatible CMap for CIDFont \"%s\"",
+ CIDFONT_DEBUG_STR, map_name);
+ }
+
+ if (font_id == __cache->num) {
+ font = CIDFont_new();
+#ifdef XETEX
+ font->ft_face = fmap_opt->ft_face;
+#endif
+ if (CIDFont_type0_open(font, map_name, cmap_csi, opt) < 0 &&
+ CIDFont_type2_open(font, map_name, cmap_csi, opt) < 0 &&
+ CIDFont_type0_t1open(font, map_name, cmap_csi, opt) < 0 &&
+ CIDFont_type0_t1copen(font, map_name, cmap_csi, opt) < 0 &&
+ CIDFont_base_open (font, map_name, cmap_csi, opt) < 0
+ ) {
+ CIDFont_release(font);
+ release_opt(opt);
+ return -1;
+ } else {
+ if (__cache->num >= __cache->max) {
+ __cache->max += CACHE_ALLOC_SIZE;
+ __cache->fonts = RENEW(__cache->fonts,
+ __cache->max, struct CIDFont *);
+ }
+ font->name = NEW(strlen(map_name)+1, char);
+ strcpy(font->name, map_name);
+ font->ident = NEW(strlen(map_name)+1, char);
+ strcpy(font->ident, map_name);
+ font->options = opt;
+ __cache->fonts[font_id] = font;
+ (__cache->num)++;
+ }
+ } else if (opt) {
+ release_opt(opt);
+ }
+
+ return font_id;
+}
+
+void
+CIDFont_cache_close (void)
+{
+ int font_id;
+
+ if (__cache) {
+ for (font_id = 0;
+ font_id < __cache->num; font_id++) {
+ CIDFont *font;
+
+ font = __cache->fonts[font_id];
+
+ if (__verbose)
+ MESG("(CID");
+
+ CIDFont_dofont (font);
+ CIDFont_flush (font);
+ CIDFont_release(font);
+
+ RELEASE(font);
+
+ if (__verbose)
+ MESG(")");
+ }
+ RELEASE(__cache->fonts);
+ RELEASE(__cache);
+ __cache = NULL;
+ }
+}
+
+/******************************* OPTIONS *******************************/
+
+/*
+ * FORMAT:
+ *
+ * (:int:)?!?string(/string)?(,string)?
+ */
+
+static void
+release_opt (cid_opt *opt)
+{
+ if (opt->csi) {
+ if (opt->csi->registry)
+ RELEASE(opt->csi->registry);
+ if (opt->csi->ordering)
+ RELEASE(opt->csi->ordering);
+ RELEASE(opt->csi);
+ }
+ RELEASE(opt);
+}
+
+static CIDSysInfo *
+get_cidsysinfo (const char *map_name, fontmap_opt *fmap_opt)
+{
+ CIDSysInfo *csi = NULL;
+ int pdf_ver;
+ int i, csi_idx = -1, n, m;
+
+ pdf_ver = pdf_get_version();
+
+ if (!fmap_opt || !fmap_opt->charcoll)
+ return NULL;
+
+ /* First try alias for standard one. */
+ for (i = 0; CIDFont_stdcc_alias[i].name != NULL; i++) {
+ n = strlen(CIDFont_stdcc_alias[i].name);
+ if (!strncmp(fmap_opt->charcoll,
+ CIDFont_stdcc_alias[i].name, n)) {
+ csi_idx = CIDFont_stdcc_alias[i].index;
+ csi = NEW(1, CIDSysInfo);
+ csi->registry = NEW(strlen(CIDFont_stdcc_def[csi_idx].registry)+1, char);
+ strcpy(csi->registry, CIDFont_stdcc_def[csi_idx].registry);
+ csi->ordering = NEW(strlen(CIDFont_stdcc_def[csi_idx].ordering)+1, char);
+ strcpy(csi->ordering, CIDFont_stdcc_def[csi_idx].ordering);
+ if (strlen(fmap_opt->charcoll) > n) {
+ csi->supplement = (int) strtoul(&(fmap_opt->charcoll[n]), NULL, 10);
+ } else { /* Use heighest supported value for current output PDF version. */
+ csi->supplement = CIDFont_stdcc_def[csi_idx].supplement[pdf_ver];
+ }
+ break;
+ }
+ }
+ if (csi == NULL) {
+ char *p, *q;
+
+ p = (char *) fmap_opt->charcoll;
+ csi = NEW(1, CIDSysInfo);
+
+ /* Full REGISTRY-ORDERING-SUPPLEMENT */
+ p = strchr(fmap_opt->charcoll, '-');
+ if (!p || p[1] == '\0')
+ ERROR("%s: String can't be converted to REGISTRY-ORDERING-SUPPLEMENT: %s",
+ CIDFONT_DEBUG_STR, fmap_opt->charcoll);
+ p++;
+
+ q = strchr(p, '-');
+ if (!q || q[1] == '\0')
+ ERROR("%s: String can't be converted to REGISTRY-ORDERING-SUPPLEMENT: %s",
+ CIDFONT_DEBUG_STR, fmap_opt->charcoll);
+ q++;
+
+ if (!isdigit(q[0]))
+ ERROR("%s: String can't be converted to REGISTRY-ORDERING-SUPPLEMENT: %s",
+ CIDFONT_DEBUG_STR, fmap_opt->charcoll);
+
+ n = strlen(fmap_opt->charcoll) - strlen(p) - 1;
+ csi->registry = NEW(n+1, char);
+ memcpy(csi->registry, fmap_opt->charcoll, n);
+ csi->registry[n] = '\0';
+
+ m = strlen(p) - strlen(q) - 1;
+ csi->ordering = NEW(m+1, char);
+ memcpy(csi->ordering, p, m);
+ csi->ordering[m] = '\0';
+
+ csi->supplement = (int) strtoul(q, NULL, 10);
+
+ /* Check for standart character collections. */
+ for (i = 0; CIDFont_stdcc_def[i].ordering != NULL; i++) {
+ if ((CIDFont_stdcc_def[i].registry &&
+ !strcmp(csi->registry, CIDFont_stdcc_def[i].registry)) &&
+ !strcmp(csi->ordering, CIDFont_stdcc_def[i].ordering)) {
+ csi_idx = i;
+ break;
+ }
+ }
+ }
+
+ if (csi && csi_idx >= 0) {
+ if (csi->supplement > CIDFont_stdcc_def[csi_idx].supplement[pdf_ver]
+ && (fmap_opt->flags & FONTMAP_OPT_NOEMBED)) {
+ WARN("%s: Heighest supplement number supported in PDF-1.%d for %s-%s is %d.",
+ CIDFONT_DEBUG_STR, pdf_ver, csi->registry, csi->ordering,
+ CIDFont_stdcc_def[csi_idx].supplement[pdf_ver]);
+ WARN("%s: Some character may not shown without embedded font (--> %s).",
+ CIDFONT_DEBUG_STR, map_name);
+ }
+ }
+
+ return csi;
+}
+
+void
+CIDFont_set_flags (long flags)
+{
+ CIDFont_type0_set_flags(flags);
+ CIDFont_type2_set_flags(flags);
+ cidoptflags |= flags;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cid.h b/Build/source/texk/xdvipdfmx/src/cid.h
new file mode 100644
index 00000000000..97b846e6f4f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cid.h
@@ -0,0 +1,94 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cid.h,v 1.13 2004/09/02 12:23:06 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CID_H_
+#define _CID_H_
+
+#ifdef XETEX
+#include "ft2build.h"
+#include FT_FREETYPE_H
+#endif
+
+/* CIDFont types */
+#define CIDFONT_TYPE0 1
+#define CIDFONT_TYPE2 2
+
+typedef struct {
+ char *registry;
+ char *ordering;
+ int supplement;
+} CIDSysInfo;
+
+extern CIDSysInfo CSI_IDENTITY;
+extern CIDSysInfo CSI_UNICODE;
+
+typedef struct CIDFont CIDFont;
+
+extern void CIDFont_set_verbose (void);
+extern int CIDFont_require_version (void);
+extern void CIDFont_set_flags (long flags);
+
+#define CIDFONT_FORCE_FIXEDPITCH (1 << 1)
+
+#include "pdfobj.h"
+#include "type0.h"
+
+/* FIXME */
+/* Converted from Type 1 */
+#define CIDFONT_FLAG_TYPE1 (1 << 8)
+#define CIDFONT_FLAG_TYPE1C (1 << 9)
+#define CIDFONT_FLAG_TRUETYPE (1 << 10)
+
+extern CIDFont *CIDFont_new (void);
+extern void CIDFont_release (CIDFont *font);
+extern void CIDFont_flush (CIDFont *font);
+
+extern char *CIDFont_get_fontname (CIDFont *font);
+
+extern char *CIDFont_get_ident (CIDFont *font); /* FIXME */
+extern int CIDFont_get_opt_index (CIDFont *font); /* FIXME */
+#ifdef XETEX
+extern FT_Face CIDFont_get_ft_face (CIDFont *font);
+extern unsigned short *CIDFont_get_ft_to_gid(CIDFont *font);
+#endif
+
+extern int CIDFont_get_flag (CIDFont *font, int mask);
+
+extern int CIDFont_get_subtype (CIDFont *font);
+extern int CIDFont_get_embedding (CIDFont *font);
+extern pdf_obj *CIDFont_get_resource (CIDFont *font);
+extern CIDSysInfo *CIDFont_get_CIDSysInfo (CIDFont *font);
+
+extern void CIDFont_attach_parent (CIDFont *font, int parent_id, int wmode);
+extern int CIDFont_get_parent_id (CIDFont *font, int wmode);
+
+extern int CIDFont_is_BaseFont (CIDFont *font);
+extern int CIDFont_is_ACCFont (CIDFont *font);
+extern int CIDFont_is_UCSFont (CIDFont *font);
+
+#include "fontmap.h"
+extern void CIDFont_cache_init (void);
+extern int CIDFont_cache_find (const char *map_name, CIDSysInfo *cmap_csi, fontmap_opt *fmap_opt);
+extern CIDFont *CIDFont_cache_get (int fnt_id);
+extern void CIDFont_cache_close (void);
+
+#endif /* _CID_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cid_basefont.h b/Build/source/texk/xdvipdfmx/src/cid_basefont.h
new file mode 100644
index 00000000000..9dd947bcb57
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cid_basefont.h
@@ -0,0 +1,463 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cid_basefont.h,v 1.14 2005/06/27 11:54:50 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CID_BASEFONT_H_
+#define _CID_BASEFONT_H_
+
+/* PLEASE SEND INFORMATION ON FONTS
+ *
+ * Those fonts are only for fixed-pitch glyphs (full-, half-, third-,
+ * and quarter- widths). Glyph widths should be determined solely from
+ * CID and CIDSystemInfo for those never-embedded fonts. Fixed-pitch
+ * pre-rotated forms are not supported yet.
+ *
+ * Font dictionaly entry Subtype and CIDSystemInfo is mandatory here.
+ * Font descriptor entry CapHeight, Ascent, Descent, ItalicAngle, Flags,
+ * FontBBox, and StemV is required. However, CapHeight, Ascent, Descent,
+ * and ItalicAngle is irrelevant for font-matching of CJK fonts. Panose
+ * entry in Style dictionary may affect in Acrobat. Serif font should
+ * have flag bit position 2 (2) set and all CJK fonts should also have
+ * bit position 3 (4) set: CJK font serif -> Flags 6, sans serif -> 4.
+ *
+ * Please always supply DW entry in font dictionary although this can
+ * be optional. PDF reference 1.2 had been described default value for
+ * DW as 0 (correct value if 1000) and several versions of Mac OS X
+ * implement so!
+ */
+
+const struct {
+ const char *fontname;
+ const char *fontdict;
+ const char *descriptor;
+} cid_basefont[] = {
+ /*
+ * Fonts found in printers
+ *
+ * Ryumin-Light and GothicBBB-Medium is often available in
+ * PostScript printer sold in Japan. There may be additonal
+ * Morisawa fonts such as ShinGo-Bold, but less common than
+ * those two fonts.
+ */
+ {
+ "Ryumin-Light",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+]\
+>>",
+ "<< \
+/CapHeight 709 /Ascent 723 /Descent -241 /StemV 69 \
+/FontBBox [-170 -331 1024 903] \
+/ItalicAngle 0 /Flags 6 \
+/Style << /Panose <010502020300000000000000> >> \
+>>"
+ },
+ {
+ "GothicBBB-Medium",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+]\
+>>",
+ "<< \
+/CapHeight 737 /Ascent 752 /Descent -271 /StemV 99 \
+/FontBBox [-174 -268 1001 944] \
+/ItalicAngle 0 /Flags 4 \
+/Style << /Panose <0801020b0500000000000000> >> \
+>>"
+ },
+
+ /* Adobe Asian Font Packs for Acrobat Reader 4 */
+ {
+ "MHei-Medium-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (CNS1) /Supplement 0 >> \
+/DW 1000 \
+/W [\
+13648 13742 500 \
+17603 [500] \
+]\
+>>",
+ "<< \
+/Ascent 752 /CapHeight 737 /Descent -271 /StemV 58 \
+/FontBBox [-45 -250 1015 887] \
+/ItalicAngle 0 /Flags 4 /XHeight 553 \
+/Style << /Panose <000001000600000000000000> >> \
+>>"
+ },
+ {
+ "MSung-Light-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (CNS1) /Supplement 0 >> \
+/DW 1000 \
+/W [\
+13648 13742 500 \
+17603 [500] \
+]\
+>>",
+ "<< \
+/Ascent 752 /CapHeight 737 /Descent -271 /StemV 58 \
+/FontBBox [-160 -259 1015 888] \
+/ItalicAngle 0 /Flags 6 /XHeight 553 \
+/Style << /Panose <000000000400000000000000> >> \
+>>"
+ },
+ {
+ "STSong-Light-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (GB1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 814 939 500 \
+ 7716 [500] \
+22355 [500 500] \
+22357 [500] \
+]\
+>>",
+ "<< \
+/Ascent 857 /CapHeight 857 /Descent -143 /StemV 91 \
+/FontBBox [-250 -143 600 857] \
+/ItalicAngle 0 /Flags 6 /XHeight 599 \
+/Style << /Panose <000000000400000000000000> >> \
+>>"
+ },
+ {
+ "HeiseiKakuGo-W5-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+]\
+>>",
+ "<< \
+/Ascent 752 /CapHeight 737 /Descent -221 /StemV 114 \
+/FontBBox [-92 -250 1010 922] \
+/ItalicAngle 0 /Flags 4 /XHeight 553 \
+/Style << /Panose <000001000500000000000000> >> \
+>>"
+ },
+ {
+ "HeiseiMin-W3-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+]\
+>>",
+ "<< \
+/Ascent 723 /CapHeight 709 /Descent -241 /StemV 69 \
+/FontBBox [-123 -257 1001 910] \
+/ItalicAngle 0 /Flags 6 /XHeight 450 \
+/Style << /Panose <000002020500000000000000> >> \
+>>"
+ },
+ {
+ "HYGoThic-Medium-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 1 >> \
+/DW 1000 \
+/W [\
+ 97 [500] \
+ 8094 8190 500 \
+]\
+>>",
+ "<< \
+/Ascent 752 /CapHeight 737 /Descent -271 /StemV 58 \
+/FontBBox [-6 -145 1003 880] \
+/ItalicAngle 0 /Flags 4 /XHeight 553 \
+/Style << /Panose <000001000600000000000000> >> \
+>>"
+ },
+ {
+ "HYSMyeongJo-Medium-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 1 >> \
+/DW 1000 \
+/W [\
+ 97 [500] \
+ 8094 8190 500 \
+]\
+>>",
+ "<< \
+/Ascent 752 /CapHeight 737 /Descent -271 /StemV 58 \
+/FontBBox [-0 -148 1001 880] \
+/ItalicAngle 0 /Flags 6 /XHeight 553 \
+/Style << /Panose <000000000600000000000000> >> \
+>>"
+ },
+
+ /* Acrobat Reader 5 */
+ {
+ "MSungStd-Light-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (CNS1) /Supplement 4 >> \
+/DW 1000 \
+/W [\
+13648 13742 500 \
+17603 [500] \
+]\
+>>",
+ "<< \
+/Ascent 880 /CapHeight 662 /Descent -120 /StemV 54 \
+/FontBBox [-160 -249 1015 1071] \
+/ItalicAngle 0 /Flags 6 \
+/Style << /Panose <000000000400000000000000> >> \
+>>"
+ },
+ {
+ "STSongStd-Light-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (GB1) /Supplement 4 >> \
+/DW 1000 \
+/W [\
+ 814 939 500 \
+ 7716 [500] \
+22355 [500 500] \
+22357 [500] \
+]\
+>>",
+ "<< \
+/Ascent 880 /CapHeight 626 /Descent -120 /StemV 44 \
+/FontBBox [-134 -254 1001 905] \
+/ItalicAngle 0 /Flags 6 \
+/Style << /Panose <000000000400000000000000> >> \
+>>"
+ },
+ {
+ "HYSMyeongJoStd-Medium-Acro",
+ "<< \
+/Subtype /CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 97 [500] \
+ 8094 8190 500 \
+]\
+>>",
+ "<< \
+/Ascent 880 /CapHeight 720 /Descent -120 /StemV 60 \
+/FontBBox [-28 -148 1001 880] \
+/ItalicAngle 0 /Flags 6 \
+/Style << /Panose <000000000600000000000000> >> \
+>>"
+ },
+
+ /* Adobe Asian Font Packs for Adobe Reader 6 */
+
+ /*
+ * Widths of Adobe-CNS1-4
+ * 1 95 proportional
+ * 13648 13742 half-width
+ * 17601 17601 proportional?
+ * 17603 17603 half-width?
+ */
+ {
+ "AdobeMingStd-Light-Acro",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (CNS1) /Supplement 4 >> \
+/DW 1000 \
+/W [\
+13648 13742 500 \
+17603 [500] \
+]\
+>>",
+ "<< \
+/Ascent 880 /Descent -120 /StemV 48 /CapHeight 731 \
+/FontBBox [-38 -121 1002 918] \
+/ItalicAngle 0 /Flags 6 /XHeight 466 \
+/Style << /Panose <000002020300000000000000> >> \
+>>"
+ },
+ /*
+ * Widths of Adobe-GB1-4
+ * 1 95 proportional
+ * 814 939 half-width
+ * 7712 7715 proportional
+ * 7716 7716 half-width space
+ * 22353 22354 proportional
+ * 22355 22357 half-width
+ */
+ {
+ "AdobeSongStd-Light-Acro",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (GB1) /Supplement 4 >> \
+/DW 1000 \
+/W [\
+ 814 939 500 \
+ 7716 [500] \
+22355 [500 500] \
+22357 [500] \
+]\
+>>",
+ "<< \
+/Ascent 880 /Descent -120 /StemV 66 /CapHeight 626 \
+/FontBBox [-134 -254 1001 905] \
+/ItalicAngle 0 /Flags 6 /XHeight 416 \
+/Style << /Panose <000002020300000000000000> >> \
+>>"
+ },
+ /*
+ * Widths of Adobe-Japan1-4
+ * 1 230 proportional
+ * 231 632 half-width
+ * 9354 9737 proportional
+ * 9738 9757 quater-width
+ * 9758 9778 third-width
+ * 12063 12087 half-width
+ */
+ {
+ "KozMinPro-Regular-Acro",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 4 >> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+ 9738 9757 250 \
+ 9758 9778 333 \
+12063 12087 500 \
+]\
+>>",
+ "<< \
+/Ascent 880 /Descent -120 /StemV 86 /CapHeight 740 \
+/FontBBox [-195 -272 1110 1075] \
+/ItalicAngle 0 /Flags 6 /XHeight 502 \
+/Style << /Panose <000002020400000000000000> >> \
+>>"
+ },
+ {
+ "KozGoPro-Medium-Acro",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering(Japan1) /Supplement 4 >> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+ 9738 9757 250 \
+ 9758 9778 333 \
+12063 12087 500 \
+]\
+>>",
+ "<< \
+/Ascent 880 /Descent -120 /StemV 99 /CapHeight 763 \
+/FontBBox [-149 -374 1254 1008] \
+/ItalicAngle 0 /Flags 4 /XHeight 549 \
+/Style << /Panose <0000020b0700000000000000> >> \
+>>"
+ },
+ /*
+ * Widths of Adobe-Korea1-2
+ * 1 95 proportional
+ * 97 97 half-width?
+ * 8094 8190 half-width
+ */
+ {
+ "AdobeMyungjoStd-Medium-Acro",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 2 >> \
+/DW 1000 \
+/W [\
+ 97 [500] \
+ 8094 8190 500 \
+]\
+>>",
+ "<< \
+/Ascent 880 /Descent -120 /StemV 99 /CapHeight 719 \
+/FontBBox [-28 -148 1001 880] \
+/ItalicAngle 0 /Flags 6 /XHeight 478 \
+/Style << /Panose <000002020600000000000000> >> \
+>>"
+ },
+
+ /* Addition in Adobe Reader 7 */
+ /*
+ * Adobe-Japan1-5
+ * 15449-15911 proportional
+ * 15912-15975 proportional
+ * 15976-16192 proportional (vert)
+ * 16469-16714 pre-rotated proportional
+ * 16715-16778 pre-rotated proportional
+ * Adobe-Japan1-6
+ * 20317-20371 proportional
+ * 20372-20426 proportional
+ * 20958 - (reserved for future use)
+ * 20961-21015 pre-rotated proportional
+ * 21016-21070 pre-rotated proportional
+ */
+ {
+ "KozMinProVI-Regular",
+ "<< \
+/Subtype/CIDFontType0 \
+/CIDSystemInfo << \
+ /Registry (Adobe) \
+ /Ordering (Japan1) \
+ /Supplement 6 \
+>> \
+/DW 1000 \
+/W [\
+ 231 632 500 \
+ 8718 [500 500] \
+ 9738 9757 250 \
+ 9758 9778 333 \
+ 12063 12087 500 \
+]\
+ >>",
+ "<< \
+/Ascent 880 /Descent -120 /StemV 86 /CapHeight 742 \
+/FontBBox [-437 -340 1144 1317] \
+/ItalicAngle 0 /Flags 6 /XHeight 503 \
+/Style << \
+ /Panose <000002020400000000000000> \
+>> \
+ >>"
+ },
+ /* END */
+ {NULL, NULL, NULL}
+};
+
+#endif /* _CID_BASEFONT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cid_p.h b/Build/source/texk/xdvipdfmx/src/cid_p.h
new file mode 100644
index 00000000000..72f0c2835d3
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cid_p.h
@@ -0,0 +1,73 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cid_p.h,v 1.8 2004/09/11 14:50:28 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CID_P_H_
+#define _CID_P_H_
+
+#define FONT_FLAG_NONE 0
+#define FONT_FLAG_BASEFONT (1 << 0)
+#define FONT_FLAG_ACCFONT (1 << 1)
+#define FONT_FLAG_UCSFONT (1 << 2)
+
+#include "fontmap.h"
+#define FONT_STYLE_NONE FONTMAP_STYLE_NONE
+#define FONT_STYLE_BOLD FONTMAP_STYLE_BOLD
+#define FONT_STYLE_ITALIC FONTMAP_STYLE_ITALIC
+#define FONT_STYLE_BOLDITALIC FONTMAP_STYLE_BOLDITALIC
+
+typedef struct
+{
+ char *name; /* Unused */
+ CIDSysInfo *csi;
+ int index;
+ int style;
+ int embed;
+} cid_opt;
+
+struct CIDFont
+{
+ char *ident; /* Map record entry */
+ char *name; /* Fontname or filename */
+ char *fontname; /* PostScript font name */
+#ifdef XETEX
+ FT_Face ft_face;
+ unsigned short *ft_to_gid;
+#endif
+ /*
+ * CIDFont Specific
+ */
+ int subtype; /* CIDFONT_TYPE0 or CIDFONT_TYPE2 */
+ int flags; /* BASEFONT */
+ int parent[2]; /* Parent type0 font of this CID-keyed font: H, V */
+ CIDSysInfo *csi; /* Character collection */
+ cid_opt *options; /* Options from map record */
+ /*
+ * PDF Font Resource
+ */
+ pdf_obj *indirect; /* Indirect reference to CIDFont dictionary */
+ pdf_obj *fontdict; /* CIDFont dictionary */
+ pdf_obj *descriptor; /* FontDescriptor */
+};
+
+#endif /* _CID_P_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cidtype0.c b/Build/source/texk/xdvipdfmx/src/cidtype0.c
new file mode 100644
index 00000000000..ea471fae14c
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cidtype0.c
@@ -0,0 +1,2073 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cidtype0.c,v 1.34 2005/07/17 09:53:37 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * CID-Keyed Font support:
+ *
+ * Only CFF/OpenType CID-Keyed Font with Type 2 charstrings is supported.
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "numbers.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+
+#include "pdfobj.h"
+/* pseudo unique tag */
+#include "pdffont.h"
+
+/* Font info. from OpenType tables */
+#include "sfnt.h"
+#include "tt_aux.h"
+/* Metrics */
+#include "tt_table.h"
+
+#include "cff_types.h"
+#include "cff_limits.h"
+#include "cff.h"
+#include "cff_dict.h"
+#include "cs_type2.h"
+
+/* typedef CID in cmap.h */
+#include "cmap.h"
+#include "type0.h"
+#include "cid.h"
+#include "cid_p.h"
+#include "cidtype0.h"
+
+static int verbose = 0;
+static long opt_flags = 0;
+
+void
+CIDFont_type0_set_verbose (void)
+{
+ verbose++;
+}
+
+void
+CIDFont_type0_set_flags (long flags)
+{
+ opt_flags = flags;
+}
+
+/*
+ * PDF Reference 3rd. ed., p.340, "Glyph Metrics in CID Fonts".
+ */
+#ifndef PDFUNIT
+#define PDFUNIT(v) (ROUND((1000.0*(v))/(head->unitsPerEm),1))
+#endif
+
+static void
+add_CIDHMetrics (sfnt *sfont, pdf_obj *fontdict,
+ unsigned char *CIDToGIDMap, unsigned short last_cid,
+ struct tt_maxp_table *maxp,
+ struct tt_head_table *head, struct tt_longMetrics *hmtx)
+{
+ pdf_obj *w_array, *an_array = NULL;
+ long cid, start = 0, prev = 0;
+ double defaultAdvanceWidth;
+ int empty = 1;
+
+ defaultAdvanceWidth = PDFUNIT(hmtx[0].advance);
+ /*
+ * We alway use format:
+ * c [w_1 w_2 ... w_n]
+ */
+ w_array = pdf_new_array();
+ for (cid = 0; cid <= last_cid; cid++) {
+ USHORT gid;
+ double advanceWidth;
+ gid = CIDToGIDMap ? ((CIDToGIDMap[2*cid] << 8)|CIDToGIDMap[2*cid+1]) : cid;
+ if (gid >= maxp->numGlyphs || (cid != 0 && gid == 0))
+ continue;
+ advanceWidth = PDFUNIT(hmtx[gid].advance);
+ if (advanceWidth == defaultAdvanceWidth) {
+ if (an_array) {
+ pdf_add_array(w_array, pdf_new_number(start));
+ pdf_add_array(w_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ } else {
+ if (cid != prev + 1 && an_array) {
+ pdf_add_array(w_array, pdf_new_number(start));
+ pdf_add_array(w_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ if (an_array == NULL) {
+ an_array = pdf_new_array();
+ start = cid;
+ }
+ pdf_add_array(an_array, pdf_new_number(advanceWidth));
+ prev = cid;
+ }
+ }
+
+ if (an_array) {
+ pdf_add_array(w_array, pdf_new_number(start));
+ pdf_add_array(w_array, an_array);
+ empty = 0;
+ }
+
+ /*
+ * We always write DW for older MacOS X's preview app.
+ * PDF Reference 2nd. ed, wrongly described default value of DW as 0, and
+ * MacOS X's (up to 10.2.8) preview app. implements this wrong description.
+ */
+ pdf_add_dict(fontdict,
+ pdf_new_name("DW"),
+ pdf_new_number(defaultAdvanceWidth));
+ if (!empty) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("W"),
+ pdf_ref_obj(w_array));
+ }
+ pdf_release_obj(w_array);
+
+ return;
+}
+
+static void
+add_CIDVMetrics (sfnt *sfont, pdf_obj *fontdict,
+ unsigned char *CIDToGIDMap, unsigned short last_cid,
+ struct tt_maxp_table *maxp,
+ struct tt_head_table *head, struct tt_longMetrics *hmtx)
+{
+ pdf_obj *w2_array, *an_array = NULL;
+ long cid, prev, start;
+ struct tt_VORG_table *vorg;
+ struct tt_os2__table *os2;
+ struct tt_vhea_table *vhea = NULL;
+ struct tt_longMetrics *vmtx = NULL;
+ double defaultAdvanceHeight, defaultVertOriginY;
+ int empty = 1;
+
+ /*
+ * No accurate vertical metrics can be obtained by simple way if the
+ * font does not have VORG table. Only CJK fonts may have VORG.
+ */
+ if (sfnt_find_table_pos(sfont, "VORG") <= 0)
+ return;
+
+ vorg = tt_read_VORG_table(sfont);
+ defaultVertOriginY = PDFUNIT(vorg->defaultVertOriginY);
+ if (sfnt_find_table_pos(sfont, "vhea") > 0)
+ vhea = tt_read_vhea_table(sfont);
+ if (vhea && sfnt_find_table_pos(sfont, "vmtx") > 0) {
+ sfnt_locate_table(sfont, "vmtx");
+ vmtx = tt_read_longMetrics(sfont, maxp->numGlyphs, vhea->numOfLongVerMetrics);
+ }
+ /*
+ * OpenType font must have OS/2 table.
+ */
+ os2 = tt_read_os2__table(sfont);
+ defaultVertOriginY = PDFUNIT(os2->sTypoAscender);
+ defaultAdvanceHeight = PDFUNIT(os2->sTypoAscender - os2->sTypoDescender);
+ RELEASE(os2);
+
+ w2_array = pdf_new_array();
+ start = prev = 0;
+ for (cid = 0; cid <= last_cid; cid++) {
+ USHORT i, gid;
+ double advanceHeight, vertOriginX, vertOriginY;
+ gid = CIDToGIDMap ? ((CIDToGIDMap[2*cid] << 8)|CIDToGIDMap[2*cid+1]) : cid;
+ if (gid >= maxp->numGlyphs || (cid != 0 && gid == 0))
+ continue;
+ advanceHeight = vmtx ? PDFUNIT(vmtx[gid].advance) : defaultAdvanceHeight;
+ vertOriginX = PDFUNIT(hmtx[gid].advance*0.5);
+ vertOriginY = defaultVertOriginY;
+ for (i = 0;
+ i < vorg->numVertOriginYMetrics && gid > vorg->vertOriginYMetrics[i].glyphIndex;
+ i++) {
+ if (gid == vorg->vertOriginYMetrics[i].glyphIndex)
+ vertOriginY = PDFUNIT(vorg->vertOriginYMetrics[i].vertOriginY);
+ }
+#if 0
+ /*
+ * c [w1_1y v_1x v_1y w1_2y v_2x v_2y ...]
+ * Not working... Why?
+ * Acrobat Reader:
+ * Wrong rendering, interpretation of position vector is wrong.
+ * Xpdf and gs: ignores W2?
+ */
+ if (vertOriginY == defaultVertOriginY &&
+ advanceHeight == defaultAdvanceHeight) {
+ if (an_array) {
+ pdf_add_array(w2_array, pdf_new_number(start));
+ pdf_add_array(w2_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ } else {
+ if (cid != prev + 1 && an_array) {
+ pdf_add_array(w2_array, pdf_new_number(start));
+ pdf_add_array(w2_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ if (an_array == NULL) {
+ an_array = pdf_new_array();
+ start = cid;
+ }
+ pdf_add_array(an_array, pdf_new_number(-advanceHeight));
+ pdf_add_array(an_array, pdf_new_number(vertOriginX));
+ pdf_add_array(an_array, pdf_new_number(vertOriginY));
+ prev = cid;
+ }
+#else
+ /*
+ * c_first c_last w1_y v_x v_y
+ * This form may hit Acrobat's implementation limit of array element size, 8192.
+ * AFPL GhostScript 8.11 stops with rangecheck error with this. Maybe GS's bug?
+ */
+ if (vertOriginY != defaultVertOriginY ||
+ advanceHeight != defaultAdvanceHeight) {
+ pdf_add_array(w2_array, pdf_new_number(cid));
+ pdf_add_array(w2_array, pdf_new_number(cid));
+ pdf_add_array(w2_array, pdf_new_number(-advanceHeight));
+ pdf_add_array(w2_array, pdf_new_number(vertOriginX));
+ pdf_add_array(w2_array, pdf_new_number(vertOriginY));
+ empty = 0;
+ }
+#endif
+ }
+
+#if 0
+ if (an_array) {
+ pdf_add_array(w2_array, pdf_new_number(start));
+ pdf_add_array(w2_array, an_array);
+ empty = 0;
+ }
+#endif
+
+ if (defaultVertOriginY != 880 || defaultAdvanceHeight != 1000) {
+ an_array = pdf_new_array();
+ pdf_add_array(an_array, pdf_new_number(defaultVertOriginY));
+ pdf_add_array(an_array, pdf_new_number(-defaultAdvanceHeight));
+ pdf_add_dict(fontdict, pdf_new_name ("DW2"), an_array);
+ }
+ if (!empty) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("W2"), pdf_ref_obj(w2_array));
+ }
+ pdf_release_obj(w2_array);
+
+ if (vorg->vertOriginYMetrics)
+ RELEASE(vorg->vertOriginYMetrics);
+ RELEASE(vorg);
+
+ if (vmtx)
+ RELEASE(vmtx);
+ if (vhea)
+ RELEASE(vhea);
+
+ return;
+}
+
+static void
+add_CIDMetrics (sfnt *sfont, pdf_obj *fontdict,
+ unsigned char *CIDToGIDMap, unsigned short last_cid, int need_vmetrics)
+{
+ struct tt_longMetrics *hmtx;
+ struct tt_head_table *head;
+ struct tt_hhea_table *hhea;
+ struct tt_maxp_table *maxp;
+
+ /*
+ * Read head, hhea, maxp:
+ *
+ * unitsPerEm --> head
+ * numHMetrics --> hhea
+ * numGlyphs --> maxp
+ */
+ head = tt_read_head_table(sfont);
+ maxp = tt_read_maxp_table(sfont);
+ hhea = tt_read_hhea_table(sfont);
+
+ sfnt_locate_table(sfont, "hmtx");
+ hmtx = tt_read_longMetrics(sfont, maxp->numGlyphs, hhea->numberOfHMetrics);
+
+ add_CIDHMetrics(sfont, fontdict, CIDToGIDMap, last_cid, maxp, head, hmtx);
+ if (need_vmetrics)
+ add_CIDVMetrics(sfont, fontdict, CIDToGIDMap, last_cid, maxp, head, hmtx);
+
+ RELEASE(hmtx);
+ RELEASE(hhea);
+ RELEASE(maxp);
+ RELEASE(head);
+
+ return;
+}
+
+/*
+ * Create an instance of embeddable font.
+ */
+static long
+write_fontfile (CIDFont *font, cff_font *cffont)
+{
+ cff_index *topdict, *fdarray, *private;
+ unsigned char *dest;
+ long destlen = 0, i, size;
+ long offset, topdict_offset, fdarray_offset;
+
+ /* DICT sizes (offset set to long int) */
+ topdict = cff_new_index(1);
+ fdarray = cff_new_index(cffont->num_fds);
+ private = cff_new_index(cffont->num_fds);
+
+ cff_dict_remove(cffont->topdict, "UniqueID");
+ cff_dict_remove(cffont->topdict, "XUID");
+ cff_dict_remove(cffont->topdict, "Private"); /* some bad font may have */
+ cff_dict_remove(cffont->topdict, "Encoding"); /* some bad font may have */
+
+ topdict->offset[1] = cff_dict_pack(cffont->topdict,
+ (card8 *) work_buffer,
+ WORK_BUFFER_SIZE) + 1;
+ for (i = 0;i < cffont->num_fds; i++) {
+ size = 0;
+ if (cffont->private && cffont->private[i]) {
+ size = cff_dict_pack(cffont->private[i],
+ (card8 *) work_buffer, WORK_BUFFER_SIZE);
+ if (size < 1) { /* Private had contained only Subr */
+ cff_dict_remove(cffont->fdarray[i], "Private");
+ }
+ }
+ (private->offset)[i+1] = (private->offset)[i] + size;
+ (fdarray->offset)[i+1] = (fdarray->offset)[i] +
+ cff_dict_pack(cffont->fdarray[i],
+ (card8 *) work_buffer, WORK_BUFFER_SIZE);
+ }
+
+ destlen = 4; /* header size */
+ destlen += cff_set_name(cffont, font->fontname);
+ destlen += cff_index_size(topdict);
+ destlen += cff_index_size(cffont->string);
+ destlen += cff_index_size(cffont->gsubr);
+ destlen += (cffont->charsets->num_entries) * 2 + 1; /* charset format 0 */
+ destlen += (cffont->fdselect->num_entries) * 3 + 5; /* fdselect format 3 */
+ destlen += cff_index_size(cffont->cstrings);
+ destlen += cff_index_size(fdarray);
+ destlen += private->offset[private->count] - 1; /* Private is not INDEX */
+
+ dest = NEW(destlen, card8);
+
+ offset = 0;
+ /* Header */
+ offset += cff_put_header(cffont, dest + offset, destlen - offset);
+ /* Name */
+ offset += cff_pack_index(cffont->name, dest + offset, destlen - offset);
+ /* Top DICT */
+ topdict_offset = offset;
+ offset += cff_index_size(topdict);
+ /* Strings */
+ offset += cff_pack_index(cffont->string, dest + offset, destlen - offset);
+ /* Global Subrs */
+ offset += cff_pack_index(cffont->gsubr, dest + offset, destlen - offset);
+
+ /* charset */
+ cff_dict_set(cffont->topdict, "charset", 0, offset);
+ offset += cff_pack_charsets(cffont, dest + offset, destlen - offset);
+
+ /* FDSelect */
+ cff_dict_set(cffont->topdict, "FDSelect", 0, offset);
+ offset += cff_pack_fdselect(cffont, dest + offset, destlen - offset);
+
+ /* CharStrings */
+ cff_dict_set(cffont->topdict, "CharStrings", 0, offset);
+ offset += cff_pack_index(cffont->cstrings,
+ dest + offset, cff_index_size(cffont->cstrings));
+ cff_release_index(cffont->cstrings);
+ cffont->cstrings = NULL; /* Charstrings cosumes huge memory */
+
+ /* FDArray and Private */
+ cff_dict_set(cffont->topdict, "FDArray", 0, offset);
+ fdarray_offset = offset;
+ offset += cff_index_size(fdarray);
+
+ fdarray->data = NEW(fdarray->offset[fdarray->count] - 1, card8);
+ for (i = 0; i < cffont->num_fds; i++) {
+ size = private->offset[i+1] - private->offset[i];
+ if (cffont->private[i] && size > 0) {
+ cff_dict_pack(cffont->private[i], dest + offset, size);
+ cff_dict_set(cffont->fdarray[i], "Private", 0, size);
+ cff_dict_set(cffont->fdarray[i], "Private", 1, offset);
+ }
+ cff_dict_pack(cffont->fdarray[i],
+ fdarray->data + (fdarray->offset)[i] - 1,
+ fdarray->offset[fdarray->count] - 1);
+ offset += size;
+ }
+
+ cff_pack_index(fdarray, dest + fdarray_offset, cff_index_size(fdarray));
+ cff_release_index(fdarray);
+ cff_release_index(private);
+
+ /* Finally Top DICT */
+ topdict->data = NEW(topdict->offset[topdict->count] - 1, card8);
+ cff_dict_pack(cffont->topdict,
+ topdict->data, topdict->offset[topdict->count] - 1);
+ cff_pack_index(topdict, dest + topdict_offset, cff_index_size(topdict));
+ cff_release_index(topdict);
+
+ /*
+ * FontFile
+ */
+ {
+ pdf_obj *fontfile, *stream_dict;
+
+ fontfile = pdf_new_stream(STREAM_COMPRESS);
+ stream_dict = pdf_stream_dict(fontfile);
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontFile3"),
+ pdf_ref_obj (fontfile));
+ pdf_add_dict(stream_dict,
+ pdf_new_name("Subtype"),
+ pdf_new_name("CIDFontType0C"));
+ pdf_add_stream(fontfile, (char *) dest, offset);
+ pdf_release_obj(fontfile);
+ RELEASE(dest);
+ }
+
+ return destlen;
+}
+
+void
+CIDFont_type0_dofont (CIDFont *font)
+{
+ sfnt *sfont;
+ cff_font *cffont;
+ FILE *fp = NULL;
+ cff_index *charstrings, *idx;
+ cff_charsets *charset = NULL;
+ cff_fdselect *fdselect = NULL;
+ long charstring_len, max_len;
+ long destlen = 0;
+ long size, offset = 0;
+ card8 *data;
+ card16 num_glyphs, gid;
+ long cid;
+ card16 cid_count, cs_count, last_cid;
+ int fd, prev_fd, parent_id;
+ char *used_chars;
+ unsigned char *CIDToGIDMap = NULL;
+
+ ASSERT(font);
+
+ if (!font->indirect)
+ return;
+
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("FontDescriptor"),
+ pdf_ref_obj (font->descriptor));
+
+ if (CIDFont_is_BaseFont(font))
+ return;
+ else if (!CIDFont_get_embedding(font) &&
+ (opt_flags & CIDFONT_FORCE_FIXEDPITCH)) {
+ /* No metrics needed. */
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("DW"), pdf_new_number(1000.0));
+ return;
+ }
+
+ if ((parent_id = CIDFont_get_parent_id(font, 0)) < 0 &&
+ (parent_id = CIDFont_get_parent_id(font, 1)) < 0)
+ ERROR("No parent Type 0 font !");
+
+ used_chars = Type0Font_get_usedchars(Type0Font_cache_get(parent_id));
+ if (!used_chars)
+ ERROR("Unexpected error: Font not actually used???");
+
+#ifdef XETEX
+ sfont = sfnt_open(font->ft_face, SFNT_TYPE_POSTSCRIPT);
+#else
+ fp = DPXFOPEN(font->ident, DPX_RES_TYPE_OTFONT);
+ if (!fp)
+ ERROR("Could not open OpenType font file: %s", font->ident);
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont)
+ ERROR("Could not open OpenType font file: %s", font->ident);
+
+ if (sfnt_read_table_directory(sfont, 0) < 0 ||
+ sfont->type != SFNT_TYPE_POSTSCRIPT)
+ ERROR("Not a CFF/OpenType font ?");
+ offset = sfnt_find_table_pos(sfont, "CFF ");
+ if (offset == 0)
+ ERROR("Not a CFF/OpenType font ?");
+
+ cffont = cff_open(sfont, offset, font->options->index);
+ if (!cffont)
+ ERROR("Could not open CFF font.");
+ if (!(cffont->flag & FONTTYPE_CIDFONT))
+ ERROR("Not a CIDFont.");
+
+ if (cff_dict_known(cffont->topdict, "CIDCount")) {
+ cid_count = (card16) cff_dict_get(cffont->topdict, "CIDCount", 0);
+ } else {
+ cid_count = CFF_CIDCOUNT_DEFAULT;
+ }
+
+ cff_read_charsets(cffont);
+ CIDToGIDMap = NEW(2*cid_count, unsigned char);
+ memset(CIDToGIDMap, 0, 2*cid_count);
+ add_to_used_chars2(used_chars, 0); /* .notdef */
+ cid = 0; last_cid = 0; num_glyphs = 0;
+ for (cid = 0; cid <= CID_MAX; cid++) {
+ if (is_used_char2(used_chars, cid)) {
+ if (cid >= cid_count) {
+ WARN("Glyph for CID %u missing in font \"%s\".", (CID) cid, font->ident);
+ used_chars[cid/8] &= ~(1 << (7 - (cid % 8)));
+ continue;
+ }
+ gid = cff_charsets_lookup(cffont, cid);
+ if (cid != 0 && gid == 0) {
+ WARN("Glyph for CID %u missing in font \"%s\".", (CID) cid, font->ident);
+ used_chars[cid/8] &= ~(1 << (7 - (cid % 8)));
+ continue;
+ }
+ CIDToGIDMap[2*cid] = (gid >> 8) & 0xff;
+ CIDToGIDMap[2*cid+1] = gid & 0xff;
+ last_cid = cid;
+ num_glyphs++;
+ }
+ }
+
+ /*
+ * DW, W, DW2 and W2:
+ * Those values are obtained from OpenType table (not TFM).
+ */
+ if (opt_flags & CIDFONT_FORCE_FIXEDPITCH) {
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("DW"), pdf_new_number(1000.0));
+ } else {
+ add_CIDMetrics(sfont, font->fontdict, CIDToGIDMap, last_cid,
+ ((CIDFont_get_parent_id(font, 1) < 0) ? 0 : 1));
+ }
+
+ if (!CIDFont_get_embedding(font)) {
+ RELEASE(CIDToGIDMap);
+ cff_close(cffont);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return;
+ }
+
+ /*
+ * Embed font subset.
+ */
+ cff_read_fdselect(cffont);
+ cff_read_fdarray(cffont);
+ cff_read_private(cffont);
+
+ cff_read_subrs(cffont);
+
+ offset = (long) cff_dict_get(cffont->topdict, "CharStrings", 0);
+ cff_seek_set(cffont, offset);
+ idx = cff_get_index_header(cffont);
+ /* offset is now absolute offset ... bad */
+ offset = cffont->sfont->loc;
+
+ if ((cs_count = idx->count) < 2) {
+ ERROR("No valid charstring data found.");
+ }
+
+ /* New Charsets data */
+ charset = NEW(1, cff_charsets);
+ charset->format = 0;
+ charset->num_entries = 0;
+ charset->data.glyphs = NEW(num_glyphs, s_SID);
+
+ /* New FDSelect data */
+ fdselect = NEW(1, cff_fdselect);
+ fdselect->format = 3;
+ fdselect->num_entries = 0;
+ fdselect->data.ranges = NEW(num_glyphs, cff_range3);
+
+ /* New CharStrings INDEX */
+ charstrings = cff_new_index(num_glyphs+1);
+ max_len = 2 * CS_STR_LEN_MAX;
+ charstrings->data = NEW(max_len, card8);
+ charstring_len = 0;
+
+ /*
+ * TODO: Re-assign FD number.
+ */
+ prev_fd = -1; gid = 0;
+ data = NEW(CS_STR_LEN_MAX, card8);
+ for (cid = 0; cid <= last_cid; cid++) {
+ unsigned short gid_org;
+
+ if (!is_used_char2(used_chars, cid))
+ continue;
+
+ gid_org = (CIDToGIDMap[2*cid] << 8)|(CIDToGIDMap[2*cid+1]);
+ if ((size = (idx->offset)[gid_org+1] - (idx->offset)[gid_org])
+ > CS_STR_LEN_MAX)
+ ERROR("Charstring too long: gid=%u", gid_org);
+ if (charstring_len + CS_STR_LEN_MAX >= max_len) {
+ max_len = charstring_len + 2 * CS_STR_LEN_MAX;
+ charstrings->data = RENEW(charstrings->data, max_len, card8);
+ }
+ (charstrings->offset)[gid] = charstring_len + 1;
+ sfnt_seek_set(cffont->sfont, offset + (idx->offset)[gid_org] - 1);
+ sfnt_read(data, size, cffont->sfont);
+ fd = cff_fdselect_lookup(cffont, gid_org);
+ charstring_len += cs_copy_charstring(charstrings->data + charstring_len,
+ max_len - charstring_len,
+ data, size,
+ cffont->gsubr, (cffont->subrs)[fd], 0, 0, NULL);
+ if (cid > 0 && gid_org > 0) {
+ charset->data.glyphs[charset->num_entries] = cid;
+ charset->num_entries += 1;
+ }
+ if (fd != prev_fd) {
+ fdselect->data.ranges[fdselect->num_entries].first = gid;
+ fdselect->data.ranges[fdselect->num_entries].fd = fd;
+ fdselect->num_entries += 1;
+ prev_fd = fd;
+ }
+ gid++;
+ }
+ if (gid != num_glyphs)
+ ERROR("Unexpeced error: ?????");
+ RELEASE(data);
+ cff_release_index(idx);
+
+ RELEASE(CIDToGIDMap);
+
+ (charstrings->offset)[num_glyphs] = charstring_len + 1;
+ charstrings->count = num_glyphs;
+ cffont->num_glyphs = num_glyphs;
+ cffont->cstrings = charstrings;
+
+ /* discard old one, set new data */
+ cff_release_charsets(cffont->charsets);
+ cffont->charsets = charset;
+ cff_release_fdselect(cffont->fdselect);
+ cffont->fdselect = fdselect;
+
+ /* no Global subr */
+ if (cffont->gsubr)
+ cff_release_index(cffont->gsubr);
+ cffont->gsubr = cff_new_index(0);
+
+ for (fd = 0; fd < cffont->num_fds; fd++) {
+ if (cffont->subrs && cffont->subrs[fd]) {
+ cff_release_index(cffont->subrs[fd]);
+ cffont->subrs[fd] = NULL;
+ }
+ if (cffont->private && (cffont->private)[fd]) {
+ cff_dict_remove((cffont->private)[fd], "Subrs"); /* no Subrs */
+ }
+ }
+
+ destlen = write_fontfile(font, cffont);
+
+ cff_close(cffont);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ if (verbose > 1)
+ MESG("[%u/%u glyphs][%ld bytes]", num_glyphs, cs_count, destlen);
+
+ /*
+ * CIDSet:
+ * Length of CIDSet stream is not clear. Must be 8192 bytes long?
+ */
+ {
+ pdf_obj *cidset;
+
+ cidset = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(cidset, used_chars, (last_cid/8)+1);
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("CIDSet"), pdf_ref_obj(cidset));
+ pdf_release_obj(cidset);
+ }
+
+ return;
+}
+
+int
+CIDFont_type0_open (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt)
+{
+ CIDSysInfo *csi;
+ char *fontname;
+ sfnt *sfont;
+ cff_font *cffont;
+ FILE *fp = NULL;
+ unsigned long offset = 0;
+
+ ASSERT(font);
+
+#ifdef XETEX
+ sfont = sfnt_open(font->ft_face, SFNT_TYPE_POSTSCRIPT);
+ if (!sfont)
+ return -1;
+#else
+ fp = DPXFOPEN(name, DPX_RES_TYPE_OTFONT);
+ if (!fp)
+ return -1;
+
+ sfont = sfnt_open(fp);
+ if (!sfont) {
+ ERROR("Not a CFF/OpenType font?");
+ }
+#endif
+ if (sfont->type != SFNT_TYPE_POSTSCRIPT ||
+ sfnt_read_table_directory(sfont, 0) < 0 ||
+ (offset = sfnt_find_table_pos(sfont, "CFF ")) == 0) {
+ ERROR("Not a CFF/OpenType font?");
+ }
+
+ cffont = cff_open(sfont, offset, opt->index);
+ if (!cffont) {
+ ERROR("Cannot read CFF font data");
+ }
+
+ if (!(cffont->flag & FONTTYPE_CIDFONT)) {
+ cff_close(cffont);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ csi = NEW(1, CIDSysInfo);
+ csi->registry =
+ cff_get_string(cffont, (s_SID)cff_dict_get(cffont->topdict, "ROS", 0));
+ csi->ordering =
+ cff_get_string(cffont, (s_SID)cff_dict_get(cffont->topdict, "ROS", 1));
+ csi->supplement = (int)cff_dict_get(cffont->topdict, "ROS", 2);
+
+ if (cmap_csi) {
+ if (strcmp(csi->registry, cmap_csi->registry) != 0 ||
+ strcmp(csi->ordering, cmap_csi->ordering) != 0) {
+ MESG("\nCharacter collection mismatched:\n");
+ MESG("\tFont: %s-%s-%d\n", csi->registry, csi->ordering, csi->supplement);
+ MESG("\tCMap: %s-%s-%d\n", cmap_csi->registry, cmap_csi->ordering, cmap_csi->supplement);
+ ERROR("Inconsistent CMap specified for this font.");
+ }
+ if (csi->supplement < cmap_csi->supplement) {
+ WARN("CMap have higher supplmement number.");
+ WARN("Some characters may not be displayed or printed.");
+ }
+ }
+
+ {
+ char *shortname;
+
+ shortname = cff_get_name(cffont);
+ if (!shortname)
+ ERROR("No valid FontName found.");
+ /*
+ * Mangled name requires more 7 bytes.
+ * Style requires more 11 bytes.
+ */
+ fontname = NEW(strlen(shortname)+19, char);
+ memset(fontname, 0, strlen(shortname)+19);
+ strcpy(fontname, shortname);
+ RELEASE(shortname);
+ }
+ cff_close(cffont);
+
+ if (opt->embed && opt->style != FONT_STYLE_NONE) {
+ WARN("Embedding disabled due to style option for %s.", name);
+ opt->embed = 0;
+ }
+ switch (opt->style) {
+ case FONT_STYLE_BOLD:
+ strcat(fontname, ",Bold");
+ break;
+ case FONT_STYLE_ITALIC:
+ strcat(fontname, ",Italic");
+ break;
+ case FONT_STYLE_BOLDITALIC:
+ strcat(fontname, ",BoldItalic");
+ break;
+ }
+
+ font->fontname = fontname;
+ font->subtype = CIDFONT_TYPE0;
+ font->csi = csi;
+
+ font->fontdict = pdf_new_dict();
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Type"),
+ pdf_new_name("Font"));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Subtype"),
+ pdf_new_name("CIDFontType0"));
+
+ /* getting font info. from TrueType tables */
+ if ((font->descriptor
+ = tt_get_fontdesc(sfont, &(opt->embed), 0)) == NULL)
+ ERROR("Could not obtain neccesary font info.");
+
+ if (opt->embed) {
+ memmove(fontname + 7, fontname, strlen(fontname) + 1);
+ pdf_font_make_uniqueTag(fontname);
+ fontname[6] = '+';
+ }
+
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontName"),
+ pdf_new_name(fontname));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("BaseFont"),
+ pdf_new_name(fontname));
+ {
+ pdf_obj *csi_dict = pdf_new_dict();
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Registry"),
+ pdf_new_string(csi->registry, strlen(csi->registry)));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Ordering"),
+ pdf_new_string(csi->ordering, strlen(csi->ordering)));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Supplement"),
+ pdf_new_number(csi->supplement));
+ pdf_add_dict(font->fontdict, pdf_new_name("CIDSystemInfo"), csi_dict);
+ }
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("DW"),
+ pdf_new_number(1000)); /* not sure */
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return 0;
+}
+
+void
+CIDFont_type0_t1cdofont (CIDFont *font)
+{
+ sfnt *sfont;
+ cff_font *cffont;
+ cff_index *charstrings, *idx;
+ long charstring_len, max_len;
+ long destlen = 0;
+ long size, offset = 0;
+ card8 *data;
+ card16 num_glyphs, gid, last_cid;
+ long i, cid;
+ int parent_id;
+ char *used_chars;
+ double default_width, nominal_width;
+ FILE *fp = NULL;
+
+ ASSERT(font);
+
+ if (!font->indirect)
+ return;
+
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("FontDescriptor"),
+ pdf_ref_obj (font->descriptor));
+
+ if ((parent_id = CIDFont_get_parent_id(font, 0)) < 0 &&
+ (parent_id = CIDFont_get_parent_id(font, 1)) < 0)
+ ERROR("No parent Type 0 font !");
+
+ used_chars = Type0Font_get_usedchars(Type0Font_cache_get(parent_id));
+ if (!used_chars)
+ ERROR("Unexpected error: Font not actually used???");
+
+#ifdef XETEX
+ sfont = sfnt_open(font->ft_face, SFNT_TYPE_POSTSCRIPT);
+#else
+ fp = DPXFOPEN(font->ident, DPX_RES_TYPE_OTFONT);
+ if (!fp)
+ ERROR("Could not open OpenType font file: %s", font->ident);
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont)
+ ERROR("Could not open OpenType font file: %s", font->ident);
+
+ if (sfnt_read_table_directory(sfont, 0) < 0 ||
+ sfont->type != SFNT_TYPE_POSTSCRIPT)
+ ERROR("Not a CFF/OpenType font ?");
+ offset = sfnt_find_table_pos(sfont, "CFF ");
+ if (offset == 0)
+ ERROR("Not a CFF/OpenType font ?");
+
+ cffont = cff_open(sfont, offset, font->options->index);
+ if (!cffont)
+ ERROR("Could not open CFF font.");
+ if (cffont->flag & FONTTYPE_CIDFONT)
+ ERROR("This is CIDFont...");
+
+ cff_read_private(cffont);
+ cff_read_subrs (cffont);
+
+ if (cffont->private[0] && cff_dict_known(cffont->private[0], "StdVW")) {
+ double stemv;
+ stemv = cff_dict_get(cffont->private[0], "StdVW", 0);
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("StemV"), pdf_new_number(stemv));
+ }
+ if (cffont->private[0] && cff_dict_known(cffont->private[0], "defaultWidthX")) {
+ default_width = (double) cff_dict_get(cffont->private[0], "defaultWidthX", 0);
+ } else {
+ default_width = CFF_DEFAULTWIDTHX_DEFAULT;
+ }
+ if (cffont->private[0] && cff_dict_known(cffont->private[0], "nominalWidthX")) {
+ nominal_width = (double) cff_dict_get(cffont->private[0], "nominalWidthX", 0);
+ } else {
+ nominal_width = CFF_NOMINALWIDTHX_DEFAULT;
+ }
+
+ num_glyphs = 0; last_cid = 0;
+ add_to_used_chars2(used_chars, 0); /* .notdef */
+ for (i = 0; i < (cffont->num_glyphs + 7)/8; i++) {
+ int c, j;
+
+ c = used_chars[i];
+ for (j = 7; j >= 0; j--) {
+ if (c & (1 << j)) {
+ num_glyphs++;
+ last_cid = (i + 1) * 8 - j - 1;
+ }
+ }
+ }
+
+ {
+ cff_fdselect *fdselect;
+
+ fdselect = NEW(1, cff_fdselect);
+ fdselect->format = 3;
+ fdselect->num_entries = 1;
+ fdselect->data.ranges = NEW(1, cff_range3);
+ fdselect->data.ranges[0].first = 0;
+ fdselect->data.ranges[0].fd = 0;
+ cffont->fdselect = fdselect;
+ }
+
+ {
+ cff_charsets *charset;
+
+ charset = NEW(1, cff_charsets);
+ charset->format = 0;
+ charset->num_entries = num_glyphs-1;
+ charset->data.glyphs = NEW(num_glyphs-1, s_SID);
+
+ for (gid = 0, cid = 0; cid <= last_cid; cid++) {
+ if (is_used_char2(used_chars, cid)) {
+ if (gid > 0)
+ charset->data.glyphs[gid-1] = cid;
+ gid++;
+ }
+ }
+ /* cff_release_charsets(cffont->charsets); */
+ cffont->charsets = charset;
+ }
+
+ cff_dict_add(cffont->topdict, "CIDCount", 1);
+ cff_dict_set(cffont->topdict, "CIDCount", 0, last_cid + 1);
+
+ cffont->fdarray = NEW(1, cff_dict *);
+ cffont->fdarray[0] = cff_new_dict();
+ cff_dict_add(cffont->fdarray[0], "FontName", 1);
+ cff_dict_set(cffont->fdarray[0], "FontName", 0,
+ (double) cff_add_string(cffont, font->fontname + 7)); /* FIXME: Skip XXXXXX+ */
+ cff_dict_add(cffont->fdarray[0], "Private", 2);
+ cff_dict_set(cffont->fdarray[0], "Private", 0, 0.0);
+ cff_dict_set(cffont->fdarray[0], "Private", 0, 0.0);
+ /* FDArray - index offset, not known yet */
+ cff_dict_add(cffont->topdict, "FDArray", 1);
+ cff_dict_set(cffont->topdict, "FDArray", 0, 0.0);
+ /* FDSelect - offset, not known yet */
+ cff_dict_add(cffont->topdict, "FDSelect", 1);
+ cff_dict_set(cffont->topdict, "FDSelect", 0, 0.0);
+
+ cff_dict_remove(cffont->topdict, "UniqueID");
+ cff_dict_remove(cffont->topdict, "XUID");
+ cff_dict_remove(cffont->topdict, "Private");
+ cff_dict_remove(cffont->topdict, "Encoding");
+
+
+ /* */
+ offset = (long) cff_dict_get(cffont->topdict, "CharStrings", 0);
+ cff_seek_set(cffont, offset);
+ idx = cff_get_index_header(cffont);
+ /* offset is now absolute offset ... bad */
+ offset = cffont->sfont->loc;
+
+ if (idx->count < 2)
+ ERROR("No valid charstring data found.");
+
+ /* New CharStrings INDEX */
+ charstrings = cff_new_index(num_glyphs+1);
+ max_len = 2 * CS_STR_LEN_MAX;
+ charstrings->data = NEW(max_len, card8);
+ charstring_len = 0;
+
+ gid = 0;
+ data = NEW(CS_STR_LEN_MAX, card8);
+ for (cid = 0; cid <= last_cid; cid++) {
+ if (!is_used_char2(used_chars, cid))
+ continue;
+
+ if ((size = (idx->offset)[cid+1] - (idx->offset)[cid])
+ > CS_STR_LEN_MAX)
+ ERROR("Charstring too long: gid=%u", cid);
+ if (charstring_len + CS_STR_LEN_MAX >= max_len) {
+ max_len = charstring_len + 2 * CS_STR_LEN_MAX;
+ charstrings->data = RENEW(charstrings->data, max_len, card8);
+ }
+ (charstrings->offset)[gid] = charstring_len + 1;
+ sfnt_seek_set(cffont->sfont, offset + (idx->offset)[cid] - 1);
+ sfnt_read(data, size, cffont->sfont);
+ charstring_len += cs_copy_charstring(charstrings->data + charstring_len,
+ max_len - charstring_len,
+ data, size,
+ cffont->gsubr, (cffont->subrs)[0],
+ default_width, nominal_width, NULL);
+ gid++;
+ }
+ if (gid != num_glyphs)
+ ERROR("Unexpeced error: ?????");
+ RELEASE(data);
+ cff_release_index(idx);
+
+ (charstrings->offset)[num_glyphs] = charstring_len + 1;
+ charstrings->count = num_glyphs;
+ cffont->num_glyphs = num_glyphs;
+ cffont->cstrings = charstrings;
+
+ /* no Global subr */
+ if (cffont->gsubr)
+ cff_release_index(cffont->gsubr);
+ cffont->gsubr = cff_new_index(0);
+
+ if (cffont->subrs && cffont->subrs[0]) {
+ cff_release_index(cffont->subrs[0]);
+ cffont->subrs[0] = NULL;
+ }
+ if (cffont->private && (cffont->private)[0]) {
+ cff_dict_remove((cffont->private)[0], "Subrs"); /* no Subrs */
+ }
+
+ cff_add_string(cffont, (char *)"Adobe");
+ cff_add_string(cffont, (char *)"Identity");
+
+ cff_dict_update(cffont->topdict, cffont);
+ cff_dict_update(cffont->private[0], cffont);
+ cff_update_string(cffont);
+
+ /* CFF code need to be rewrote... */
+ cff_dict_add(cffont->topdict, "ROS", 3);
+ cff_dict_set(cffont->topdict, "ROS", 0,
+ (double) cff_get_sid(cffont, (char *)"Adobe"));
+ cff_dict_set(cffont->topdict, "ROS", 1,
+ (double) cff_get_sid(cffont, (char *)"Identity"));
+ cff_dict_set(cffont->topdict, "ROS", 2, 0.0);
+
+ destlen = write_fontfile(font, cffont);
+
+ cff_close(cffont);
+
+ /*
+ * DW, W, DW2 and W2:
+ * Those values are obtained from OpenType table (not TFM).
+ */
+ {
+ unsigned char *CIDToGIDMap;
+
+ CIDToGIDMap = NEW(2 * (last_cid+1), unsigned char);
+ memset(CIDToGIDMap, 0, 2 * (last_cid + 1));
+ for (cid = 0; cid <= last_cid; cid++) {
+ if (is_used_char2(used_chars, cid)) {
+ CIDToGIDMap[2*cid ] = (cid >> 8) & 0xff;
+ CIDToGIDMap[2*cid+1] = cid & 0xff;
+ }
+ }
+ add_CIDMetrics(sfont, font->fontdict, CIDToGIDMap, last_cid,
+ ((CIDFont_get_parent_id(font, 1) < 0) ? 0 : 1));
+ RELEASE(CIDToGIDMap);
+ }
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ if (verbose > 1)
+ MESG("[%u glyphs][%ld bytes]", num_glyphs, destlen);
+
+ /*
+ * CIDSet:
+ * Length of CIDSet stream is not clear. Must be 8192 bytes long?
+ */
+ {
+ pdf_obj *cidset;
+
+ cidset = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(cidset, used_chars, (last_cid/8)+1);
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("CIDSet"), pdf_ref_obj(cidset));
+ pdf_release_obj(cidset);
+ }
+
+ return;
+}
+
+int
+CIDFont_type0_t1copen (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt)
+{
+ CIDSysInfo *csi;
+ char *fontname;
+ sfnt *sfont;
+ cff_font *cffont;
+ unsigned long offset = 0;
+ FILE *fp = NULL;
+
+ ASSERT(font);
+
+#ifdef XETEX
+ sfont = sfnt_open(font->ft_face, SFNT_TYPE_POSTSCRIPT);
+ if (!sfont)
+ return -1;
+#else
+ fp = DPXFOPEN(name, DPX_RES_TYPE_OTFONT);
+ if (!fp)
+ return -1;
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont) {
+ ERROR("Not a CFF/OpenType font?");
+ }
+ if (sfont->type != SFNT_TYPE_POSTSCRIPT ||
+ sfnt_read_table_directory(sfont, 0) < 0 ||
+ (offset = sfnt_find_table_pos(sfont, "CFF ")) == 0) {
+ ERROR("Not a CFF/OpenType font?");
+ }
+
+ cffont = cff_open(sfont, offset, opt->index);
+ if (!cffont) {
+ ERROR("Cannot read CFF font data");
+ }
+
+ if (cffont->flag & FONTTYPE_CIDFONT) {
+ cff_close(cffont);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return -1;
+ }
+
+ csi = NEW(1, CIDSysInfo);
+ csi->registry = NEW(strlen("Adobe")+1, char);
+ strcpy(csi->registry, "Adobe");
+ csi->ordering = NEW(strlen("Identity")+1, char);
+ strcpy(csi->ordering, "Identity");
+ csi->supplement = 0;
+
+ if (cmap_csi) {
+ if (strcmp(csi->registry, cmap_csi->registry) != 0 ||
+ strcmp(csi->ordering, cmap_csi->ordering) != 0) {
+ MESG("\nCharacter collection mismatched:\n");
+ MESG("\tFont: %s-%s-%d\n", csi->registry, csi->ordering, csi->supplement);
+ MESG("\tCMap: %s-%s-%d\n", cmap_csi->registry, cmap_csi->ordering, cmap_csi->supplement);
+ ERROR("Inconsistent CMap specified for this font.");
+ }
+ if (csi->supplement < cmap_csi->supplement) {
+ WARN("CMap have higher supplmement number.");
+ WARN("Some characters may not be displayed or printed.");
+ }
+ }
+
+ {
+ char *shortname;
+
+ shortname = cff_get_name(cffont);
+ if (!shortname)
+ ERROR("No valid FontName found.");
+ /* Mangled name requires more 7 bytes. */
+
+ fontname = NEW(strlen(shortname) + 8, char);
+ memset(fontname, 0, strlen(shortname) + 8);
+ strcpy(fontname, shortname);
+ RELEASE(shortname);
+ }
+ cff_close(cffont);
+
+ opt->embed = 1;
+
+ font->fontname = fontname;
+ font->subtype = CIDFONT_TYPE0;
+ font->csi = csi;
+ font->flags |= CIDFONT_FLAG_TYPE1C;
+
+ font->fontdict = pdf_new_dict();
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Type"),
+ pdf_new_name("Font"));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Subtype"),
+ pdf_new_name("CIDFontType0"));
+
+ /* getting font info. from TrueType tables */
+ if ((font->descriptor
+ = tt_get_fontdesc(sfont, &(opt->embed), 0)) == NULL)
+ ERROR("Could not obtain neccesary font info.");
+
+ if (opt->embed) {
+ memmove(fontname + 7, fontname, strlen(fontname) + 1);
+ pdf_font_make_uniqueTag(fontname);
+ fontname[6] = '+';
+ }
+
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontName"),
+ pdf_new_name(fontname));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("BaseFont"),
+ pdf_new_name(fontname));
+ {
+ pdf_obj *csi_dict = pdf_new_dict();
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Registry"),
+ pdf_new_string(csi->registry, strlen(csi->registry)));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Ordering"),
+ pdf_new_string(csi->ordering, strlen(csi->ordering)));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Supplement"),
+ pdf_new_number(csi->supplement));
+ pdf_add_dict(font->fontdict, pdf_new_name("CIDSystemInfo"), csi_dict);
+ }
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return 0;
+}
+
+
+/* Type1 --> CFF CIDFont */
+#include "unicode.h"
+#include "t1_load.h"
+#include "t1_char.h"
+
+#include "agl.h"
+
+#include "cmap.h"
+#include "cmap_write.h"
+#include "fontmap.h"
+
+static int
+load_base_CMap (const char *font_name, int wmode, cff_font *cffont)
+{
+ int cmap_id = -1;
+ CMap *cmap;
+ char *cmap_name;
+ card16 gid;
+ unsigned char range_min[4] = {0x00, 0x00, 0x00, 0x00};
+ unsigned char range_max[4] = {0x7f, 0xff, 0xff, 0xff};
+
+ cmap_name = NEW(strlen(font_name)+strlen("-UCS4-H")+1, char);
+ if (wmode) {
+ sprintf(cmap_name, "%s-UCS4-V", font_name);
+ } else {
+ sprintf(cmap_name, "%s-UCS4-H", font_name);
+ }
+
+ cmap_id = CMap_cache_find(cmap_name);
+ if (cmap_id >= 0) {
+ RELEASE(cmap_name);
+ return cmap_id;
+ }
+
+ 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, range_min, range_max, 4);
+ CMap_set_CIDSysInfo(cmap, &CSI_IDENTITY);
+ RELEASE(cmap_name);
+
+ for (gid = 1; gid < cffont->num_glyphs; gid++) {
+ long ucv;
+ s_SID sid;
+ char *glyph, *name, *suffix;
+ unsigned char srcCode[4];
+
+ sid = cff_charsets_lookup_inverse(cffont, gid);
+ glyph = cff_get_string (cffont, sid);
+
+ name = agl_chop_suffix(glyph, &suffix);
+ if (!name) {
+ if (suffix)
+ RELEASE(suffix);
+ RELEASE(glyph);
+ continue;
+ }
+
+ if (suffix) {
+ RELEASE(name);
+ RELEASE(suffix);
+ RELEASE(glyph);
+ continue;
+ }
+
+ if (agl_name_is_unicode(name)) {
+ ucv = agl_name_convert_unicode(name);
+ srcCode[0] = (ucv >> 24) & 0xff;
+ srcCode[1] = (ucv >> 16) & 0xff;
+ srcCode[2] = (ucv >> 8) & 0xff;
+ srcCode[3] = ucv & 0xff;
+ CMap_add_cidchar(cmap, srcCode, 4, gid);
+ } else {
+ agl_name *agln;
+
+ agln = agl_lookup_list(name);
+ if (!agln)
+ WARN("Glyph \"%s\" inaccessible (no Unicode mapping)", glyph);
+ while (agln) {
+ if (agln->n_components > 1) {
+ WARN("Glyph \"%s\" inaccessible (composite character)", glyph);
+ } else if (agln->n_components == 1) {
+ ucv = agln->unicodes[0];
+ srcCode[0] = (ucv >> 24) & 0xff;
+ srcCode[1] = (ucv >> 16) & 0xff;
+ srcCode[2] = (ucv >> 8) & 0xff;
+ srcCode[3] = ucv & 0xff;
+ CMap_add_cidchar(cmap, srcCode, 4, gid);
+ }
+ agln = agln->alternate;
+ }
+ }
+ RELEASE(name);
+ if (suffix)
+ RELEASE(suffix);
+ RELEASE(glyph);
+ }
+ cmap_id = CMap_cache_add(cmap);
+
+ return cmap_id;
+}
+
+int
+t1_load_UnicodeCMap (const char *font_name,
+ const char *otl_tags, /* not supported yet */
+ int wmode)
+{
+ int cmap_id = -1;
+ cff_font *cffont;
+ FILE *fp;
+
+ if (!font_name)
+ return -1;
+
+ fp = DPXFOPEN(font_name, DPX_RES_TYPE_T1FONT);
+ if (!fp)
+ return -1;
+
+ cffont = t1_load_font(NULL, 1, fp);
+ DPXFCLOSE(fp);
+ if (!cffont)
+ return -1;
+
+ cmap_id = load_base_CMap(font_name, wmode, cffont);
+
+ cff_close(cffont);
+
+ if (cmap_id < 0) {
+ ERROR("Failed to create Unicode charmap for font \"%s\".", font_name);
+ return -1;
+ }
+
+ if (otl_tags) {
+ WARN("Glyph substitution not supported for Type1 font yet...");
+ }
+
+ return cmap_id;
+}
+
+
+/*
+ * ToUnicode CMap
+ */
+
+static pdf_obj *
+create_ToUnicode_stream (cff_font *cffont,
+ const char *font_name, const char *used_glyphs)
+{
+ pdf_obj *stream = NULL;
+ CMap *cmap;
+ CID cid;
+ card16 gid;
+ long glyph_count, total_fail_count;
+ char *cmap_name;
+#define WBUF_SIZE 1024
+ unsigned char wbuf[WBUF_SIZE];
+ unsigned char *p, *endptr;
+ static unsigned char range_min[2] = {0x00, 0x00};
+ static unsigned char range_max[2] = {0xff, 0xff};
+
+ if (!font_name || !used_glyphs)
+ return NULL;
+
+ cmap = CMap_new();
+
+ cmap_name = NEW(strlen(font_name)+strlen("-UTF16")+1, char);
+ strcpy(cmap_name, font_name);
+ strcat(cmap_name, "-UTF16");
+ CMap_set_name (cmap, cmap_name);
+ RELEASE(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, range_min, range_max, 2);
+
+ glyph_count = total_fail_count = 0;
+ p = wbuf;
+ endptr = wbuf + WBUF_SIZE;
+ for (cid = 1; cid < cffont->num_glyphs; cid++) { /* Skip .notdef */
+ if (is_used_char2(used_glyphs, cid)) {
+ char *glyph;
+ long len;
+ int fail_count;
+
+ wbuf[0] = (cid >> 8) & 0xff;
+ wbuf[1] = (cid & 0xff);
+
+ p = wbuf + 2;
+ gid = cff_charsets_lookup_inverse(cffont, cid);
+ if (gid == 0)
+ continue;
+ glyph = cff_get_string(cffont, gid);
+ if (glyph) {
+ len = agl_sput_UTF16BE(glyph, &p, endptr, &fail_count);
+ if (len < 1 || fail_count) {
+ total_fail_count += fail_count;
+ } else {
+ CMap_add_bfchar(cmap, wbuf, 2, wbuf+2, len);
+ }
+ RELEASE(glyph);
+ }
+ glyph_count++;
+ }
+ }
+
+ if (total_fail_count != 0 &&
+ total_fail_count >= glyph_count/10) {
+ WARN("%d glyph names (out of %d) missing Unicode mapping.",
+ total_fail_count, glyph_count);
+ WARN("ToUnicode CMap \"%s-UTF16\" removed.", font_name);
+ } else {
+ stream = CMap_create_stream(cmap, 0);
+ }
+ CMap_release(cmap);
+
+ return stream;
+}
+
+
+int
+CIDFont_type0_t1open (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt)
+{
+ FILE *fp;
+ char *fontname, *shortname;
+ cff_font *cffont;
+#ifdef XETEX
+ unsigned short *ft_to_gid;
+#endif
+
+ ASSERT(font);
+
+ if (cmap_csi &&
+ (strcmp(cmap_csi->registry, "Adobe") != 0 ||
+ strcmp(cmap_csi->ordering, "Identity") != 0)) {
+ return -1;
+ }
+ fp = DPXFOPEN(name, DPX_RES_TYPE_T1FONT);
+ if (!fp)
+ return -1;
+
+ cffont = t1_load_font(NULL, 1, fp);
+ if (!cffont) {
+ DPXFCLOSE(fp);
+ return -1;
+ }
+ DPXFCLOSE(fp);
+
+ shortname = cff_get_name(cffont);
+ if (!shortname)
+ ERROR("No valid FontName found.");
+ fontname = NEW(strlen(shortname) + 8, char);
+ memset(fontname, 0, strlen(shortname) + 8);
+ strcpy(fontname, shortname);
+ RELEASE(shortname);
+
+#ifdef XETEX
+ font->ft_to_gid = cff_get_ft_to_gid(cffont);
+#endif
+
+ cff_close(cffont);
+
+ if (opt->style != FONT_STYLE_NONE) {
+ WARN(",Bold, ,Italic, ... not supported for this type of font...");
+ opt->style = FONT_STYLE_NONE;
+ }
+
+ font->fontname = fontname;
+ font->subtype = CIDFONT_TYPE0;
+ font->csi = NEW(1, CIDSysInfo);
+ font->csi->registry = NEW(strlen("Adobe")+1, char);
+ strcpy(font->csi->registry, "Adobe");
+ font->csi->ordering = NEW(strlen("Identity")+1, char);
+ strcpy(font->csi->ordering, "Identity");
+ font->csi->supplement = 0;
+ font->flags |= CIDFONT_FLAG_TYPE1;
+
+ font->fontdict = pdf_new_dict();
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Type"),
+ pdf_new_name("Font"));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Subtype"),
+ pdf_new_name("CIDFontType0"));
+
+ memmove(fontname + 7, fontname, strlen(fontname) + 1);
+ pdf_font_make_uniqueTag(fontname);
+ fontname[6] = '+';
+
+ font->descriptor = pdf_new_dict();
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontName"),
+ pdf_new_name(fontname));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("BaseFont"),
+ pdf_new_name(fontname));
+ {
+ pdf_obj *csi_dict;
+
+ csi_dict = pdf_new_dict();
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Registry"),
+ pdf_new_string("Adobe", strlen("Adobe")));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Ordering"),
+ pdf_new_string("Identity", strlen("Identity")));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Supplement"),
+ pdf_new_number(0.0));
+ pdf_add_dict(font->fontdict, pdf_new_name("CIDSystemInfo"), csi_dict);
+ }
+
+
+ return 0;
+}
+
+/* Duplicate from type1.c */
+#define TYPE1_NAME_LEN_MAX 127
+
+#define FONT_FLAG_FIXEDPITCH (1 << 0) /* Fixed-width font */
+#define FONT_FLAG_SERIF (1 << 1) /* Serif font */
+#define FONT_FLAG_SYMBOLIC (1 << 2) /* Symbolic font */
+#define FONT_FLAG_SCRIPT (1 << 3) /* Script font */
+#define FONT_FLAG_STANDARD (1 << 5) /* Adobe Standard Character Set */
+#define FONT_FLAG_ITALIC (1 << 6) /* Italic */
+#define FONT_FLAG_ALLCAP (1 << 16) /* All-cap font */
+#define FONT_FLAG_SMALLCAP (1 << 17) /* Small-cap font */
+#define FONT_FLAG_FORCEBOLD (1 << 18) /* Force bold at small text sizes */
+
+/* pdf_font --> CIDFont */
+static void
+get_font_attr (CIDFont *font, cff_font *cffont)
+{
+ double capheight, ascent, descent;
+ double italicangle, stemv;
+ double defaultwidth, nominalwidth;
+ long flags = 0;
+ long gid;
+ int i;
+ static const char *L_c[] = {
+ "H", "P", "Pi", "Rho", NULL
+ };
+ static const char *L_d[] = {
+ "p", "q", "mu", "eta", NULL
+ };
+ static const char *L_a[] = {
+ "b", "h", "lambda", NULL
+ };
+ t1_ginfo gm;
+
+ defaultwidth = 500.0;
+ nominalwidth = 0.0;
+
+ /*
+ * CapHeight, Ascent, and Descent is meaningfull only for Latin/Greek/Cyrillic.
+ * The BlueValues and OtherBlues also have those information.
+ */
+ if (cff_dict_known(cffont->topdict, "FontBBox")) {
+ /* Default values */
+ capheight = ascent = cff_dict_get(cffont->topdict, "FontBBox", 3);
+ descent = cff_dict_get(cffont->topdict, "FontBBox", 1);
+ } else {
+ capheight = 680.0;
+ ascent = 690.0;
+ descent = -190.0;
+ }
+ if (cff_dict_known(cffont->private[0], "StdVW")) {
+ stemv = cff_dict_get(cffont->private[0], "StdVW", 0);
+ } else {
+ /*
+ * We may use the following values for StemV:
+ * Thin - ExtraLight: <= 50
+ * Light: 71
+ * Regular(Normal): 88
+ * Medium: 109
+ * SemiBold(DemiBold): 135
+ * Bold - Heavy: >= 166
+ */
+ stemv = 88.0;
+ }
+ if (cff_dict_known(cffont->topdict, "ItalicAngle")) {
+ italicangle = cff_dict_get(cffont->topdict, "ItalicAngle", 0);
+ if (italicangle != 0.0)
+ flags |= FONT_FLAG_ITALIC;
+ } else {
+ italicangle = 0.0;
+ }
+
+ /*
+ * Use "space", "H", "p", and "b" for various values.
+ * Those characters should not "seac". (no accent)
+ */
+ gid = cff_glyph_lookup(cffont, "space");
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ defaultwidth = gm.wx;
+ }
+
+ for (i = 0; L_c[i] != NULL; i++) {
+ gid = cff_glyph_lookup(cffont, L_c[i]);
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ capheight = gm.bbox.ury;
+ break;
+ }
+ }
+
+ for (i = 0; L_d[i] != NULL; i++) {
+ gid = cff_glyph_lookup(cffont, L_d[i]);
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ descent = gm.bbox.lly;
+ break;
+ }
+ }
+
+ for (i = 0; L_a[i] != NULL; i++) {
+ gid = cff_glyph_lookup(cffont, L_a[i]);
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ ascent = gm.bbox.ury;
+ break;
+ }
+ }
+
+ if (defaultwidth != 0.0) {
+ cff_dict_add(cffont->private[0], "defaultWidthX", 1);
+ cff_dict_set(cffont->private[0], "defaultWidthX", 0, defaultwidth);
+ }
+ if (nominalwidth != 0.0) {
+ cff_dict_add(cffont->private[0], "nominalWidthX", 1);
+ cff_dict_set(cffont->private[0], "nominalWidthX", 0, nominalwidth);
+ }
+ if (cff_dict_known(cffont->private[0], "ForceBold") &&
+ cff_dict_get(cffont->private[0], "ForceBold", 0)) {
+ flags |= FONT_FLAG_FORCEBOLD;
+ }
+ if (cff_dict_known(cffont->private[0], "IsFixedPitch") &&
+ cff_dict_get(cffont->private[0], "IsFixedPitch", 0)) {
+ flags |= FONT_FLAG_FIXEDPITCH;
+ }
+ if (font->fontname &&
+ !strstr(font->fontname, "Sans")) {
+ flags |= FONT_FLAG_SERIF;
+ }
+ flags |= FONT_FLAG_SYMBOLIC;
+
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("CapHeight"), pdf_new_number(capheight));
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("Ascent"), pdf_new_number(ascent));
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("Descent"), pdf_new_number(descent));
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("ItalicAngle"), pdf_new_number(italicangle));
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("StemV"), pdf_new_number(stemv));
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("Flags"), pdf_new_number(flags));
+}
+
+static void
+add_metrics (CIDFont *font, cff_font *cffont,
+ unsigned char *CIDToGIDMap,
+ double *widths, double default_width, CID last_cid)
+{
+ pdf_obj *tmp;
+ double val;
+ card16 cid, gid;
+ char *used_chars;
+ int i, parent_id;
+
+ /*
+ * The original FontBBox of the font is preserved, instead
+ * of replacing it with tight bounding box calculated from
+ * charstrings, to prevent Acrobat 4 from greeking text as
+ * much as possible.
+ */
+ if (!cff_dict_known(cffont->topdict, "FontBBox")) {
+ ERROR("No FontBBox?");
+ }
+ tmp = pdf_new_array();
+ for (i = 0; i < 4; i++) {
+ val = cff_dict_get(cffont->topdict, "FontBBox", i);
+ pdf_add_array(tmp, pdf_new_number(ROUND(val, 1.0)));
+ }
+ pdf_add_dict(font->descriptor, pdf_new_name("FontBBox"), tmp);
+
+ if ((parent_id = CIDFont_get_parent_id(font, 0)) < 0 &&
+ (parent_id = CIDFont_get_parent_id(font, 1)) < 0)
+ ERROR("No parent Type 0 font !");
+
+ used_chars = Type0Font_get_usedchars(Type0Font_cache_get(parent_id));
+ if (!used_chars) {
+ ERROR("Unexpected error: Font not actually used???");
+ }
+
+ /* FIXME:
+ * This writes "CID CID width".
+ * I think it's better to handle each 8 char block
+ * and to use "CID_start [ w0 w1 ...]".
+ */
+ tmp = pdf_new_array();
+ for (cid = 0; cid <= last_cid; cid++) {
+ if (is_used_char2(used_chars, cid)) {
+ gid = (CIDToGIDMap[2*cid] << 8)|CIDToGIDMap[2*cid+1];
+ if (widths[gid] != default_width) {
+ pdf_add_array(tmp, pdf_new_number(cid));
+ pdf_add_array(tmp, pdf_new_number(cid));
+ pdf_add_array(tmp, pdf_new_number(ROUND(widths[gid], 1.0)));
+ }
+ }
+ }
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("DW"), pdf_new_number(default_width));
+ if (pdf_array_length(tmp) > 0) {
+ pdf_add_dict(font->fontdict, pdf_new_name("W"), pdf_ref_obj(tmp));
+ }
+ pdf_release_obj(tmp);
+}
+
+void
+CIDFont_type0_t1dofont (CIDFont *font)
+{
+ cff_font *cffont;
+ double defaultwidth, nominalwidth;
+ long num_glyphs = 0;
+ FILE *fp;
+ long i, offset;
+ char *used_chars = NULL;
+ card16 last_cid, gid, cid;
+ unsigned char *CIDToGIDMap;
+
+ ASSERT(font);
+
+ if (!font->indirect) {
+ return;
+ }
+
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("FontDescriptor"),
+ pdf_ref_obj (font->descriptor));
+
+ fp = DPXFOPEN(font->ident, DPX_RES_TYPE_T1FONT);
+ if (!fp) {
+ ERROR("Type1: Could not open Type1 font.");
+ }
+
+ cffont = t1_load_font(NULL, 0, fp);
+ if (!cffont)
+ ERROR("Could not read Type 1 font...");
+ DPXFCLOSE(fp);
+
+ if (!font->fontname)
+ ERROR("Fontname undefined...");
+
+ {
+ Type0Font *hparent, *vparent;
+ pdf_obj *tounicode;
+ int vparent_id, hparent_id;
+
+ hparent_id = CIDFont_get_parent_id(font, 0);
+ vparent_id = CIDFont_get_parent_id(font, 1);
+ if (hparent_id < 0 && vparent_id < 0)
+ ERROR("No parent Type 0 font !");
+
+ /* usedchars is same for h and v */
+ if (hparent_id < 0)
+ hparent = NULL;
+ else {
+ hparent = Type0Font_cache_get(hparent_id);
+ used_chars = Type0Font_get_usedchars(hparent);
+ }
+ if (vparent_id < 0)
+ vparent = NULL;
+ else {
+ vparent = Type0Font_cache_get(vparent_id);
+ used_chars = Type0Font_get_usedchars(vparent);
+ }
+ if (!used_chars)
+ ERROR("Unexpected error: Font not actually used???");
+
+ tounicode = create_ToUnicode_stream(cffont, font->fontname, used_chars);
+
+ if (hparent)
+ Type0Font_set_ToUnicode(hparent, pdf_ref_obj(tounicode));
+ if (vparent)
+ Type0Font_set_ToUnicode(vparent, pdf_ref_obj(tounicode));
+ pdf_release_obj(tounicode);
+ }
+
+ cff_set_name(cffont, font->fontname);
+
+ /* defaultWidthX, CapHeight, etc. */
+ get_font_attr(font, cffont);
+ if (cff_dict_known(cffont->private[0], "defaultWidthX")) {
+ defaultwidth = cff_dict_get(cffont->private[0], "defaultWidthX", 0);
+ } else {
+ defaultwidth = 0.0;
+ }
+ if (cff_dict_known(cffont->private[0], "nominalWidthX")) {
+ nominalwidth = cff_dict_get(cffont->private[0], "nominalWidthX", 0);
+ } else {
+ nominalwidth = 0.0;
+ }
+
+ num_glyphs = 0; last_cid = 0;
+ add_to_used_chars2(used_chars, 0); /* .notdef */
+ for (i = 0; i < (cffont->num_glyphs + 7)/8; i++) {
+ int c, j;
+
+ c = used_chars[i];
+ for (j = 7; j >= 0; j--) {
+ if (c & (1 << j)) {
+ num_glyphs++;
+ last_cid = (i + 1) * 8 - j - 1;
+ }
+ }
+ }
+
+ {
+ cff_fdselect *fdselect;
+
+ fdselect = NEW(1, cff_fdselect);
+ fdselect->format = 3;
+ fdselect->num_entries = 1;
+ fdselect->data.ranges = NEW(1, cff_range3);
+ fdselect->data.ranges[0].first = 0;
+ fdselect->data.ranges[0].fd = 0;
+ cffont->fdselect = fdselect;
+ }
+
+ CIDToGIDMap = NEW(2*(last_cid+1), unsigned char);
+ memset(CIDToGIDMap, 0, 2*(last_cid+1));
+ {
+ cff_charsets *charset;
+
+ charset = NEW(1, cff_charsets);
+ charset->format = 0;
+ charset->num_entries = num_glyphs-1;
+ charset->data.glyphs = NEW(num_glyphs-1, s_SID);
+
+ for (gid = 0, cid = 0; cid <= last_cid; cid++) {
+ if (is_used_char2(used_chars, cid)) {
+ if (gid > 0)
+ charset->data.glyphs[gid-1] = cid;
+ CIDToGIDMap[2*cid ] = (gid >> 8) & 0xff;
+ CIDToGIDMap[2*cid+1] = gid & 0xff;
+ gid++;
+ }
+ }
+
+ cff_release_charsets(cffont->charsets);
+ cffont->charsets = charset;
+ }
+
+ cff_dict_add(cffont->topdict, "CIDCount", 1);
+ cff_dict_set(cffont->topdict, "CIDCount", 0, last_cid + 1);
+
+ cffont->fdarray = NEW(1, cff_dict *);
+ cffont->fdarray[0] = cff_new_dict();
+ cff_dict_add(cffont->fdarray[0], "FontName", 1);
+ cff_dict_set(cffont->fdarray[0], "FontName", 0,
+ (double) cff_add_string(cffont, font->fontname + 7)); /* FIXME: Skip XXXXXX+ */
+ cff_dict_add(cffont->fdarray[0], "Private", 2);
+ cff_dict_set(cffont->fdarray[0], "Private", 0, 0.0);
+ cff_dict_set(cffont->fdarray[0], "Private", 0, 0.0);
+
+ /* FDArray - index offset, not known yet */
+ cff_dict_add(cffont->topdict, "FDArray", 1);
+ cff_dict_set(cffont->topdict, "FDArray", 0, 0.0);
+ /* FDSelect - offset, not known yet */
+ cff_dict_add(cffont->topdict, "FDSelect", 1);
+ cff_dict_set(cffont->topdict, "FDSelect", 0, 0.0);
+
+ cff_dict_add(cffont->topdict, "charset", 1);
+ cff_dict_set(cffont->topdict, "charset", 0, 0.0);
+
+ cff_dict_add(cffont->topdict, "CharStrings", 1);
+ cff_dict_set(cffont->topdict, "CharStrings", 0, 0.0);
+
+ {
+ cff_index *cstring;
+ t1_ginfo gm;
+ long max = 0;
+ double *widths;
+ int w_stat[1001], max_count, dw;
+
+ widths = NEW(num_glyphs, double);
+ memset(w_stat, 0, sizeof(int)*1001);
+ offset = 0L;
+ cstring = cff_new_index(num_glyphs);
+ cstring->data = NULL;
+ cstring->offset[0] = 1;
+ gid = 0;
+ for (cid = 0; cid <= last_cid; cid++) {
+ if (!is_used_char2(used_chars, cid))
+ continue;
+
+ if (offset + CS_STR_LEN_MAX >= max) {
+ max += CS_STR_LEN_MAX*2;
+ cstring->data = RENEW(cstring->data, max, card8);
+ }
+ offset += t1char_convert_charstring(cstring->data + cstring->offset[gid] - 1, CS_STR_LEN_MAX,
+ cffont->cstrings->data + cffont->cstrings->offset[cid] - 1,
+ cffont->cstrings->offset[cid+1] - cffont->cstrings->offset[cid],
+ cffont->subrs[0], defaultwidth, nominalwidth, &gm);
+ cstring->offset[gid+1] = offset + 1;
+ if (gm.use_seac) {
+ ERROR("This font using the \"seac\" command for accented characters...");
+ }
+ widths[gid] = gm.wx;
+ if (gm.wx >= 0.0 && gm.wx <= 1000.0) {
+ w_stat[((int) gm.wx)] += 1;
+ }
+ gid++;
+ }
+
+ cff_release_index(cffont->cstrings);
+ cffont->cstrings = cstring;
+
+ max_count = 0; dw = -1;
+ for (i = 0; i <= 1000; i++) {
+ if (w_stat[i] > max_count) {
+ dw = i;
+ max_count = w_stat[i];
+ }
+ }
+ if (dw >= 0) {
+ add_metrics(font, cffont, CIDToGIDMap, widths, dw, last_cid);
+ } else {
+ add_metrics(font, cffont, CIDToGIDMap, widths, defaultwidth, last_cid);
+ }
+ RELEASE(widths);
+ }
+ cff_release_index(cffont->subrs[0]);
+ cffont->subrs[0] = NULL;
+
+ RELEASE(CIDToGIDMap);
+
+ cff_add_string(cffont, (char *)"Adobe");
+ cff_add_string(cffont, (char *)"Identity");
+
+ cff_dict_update(cffont->topdict, cffont);
+ cff_dict_update(cffont->private[0], cffont);
+
+ cff_update_string(cffont);
+
+ /* CFF code need to be rewrote... */
+ cff_dict_add(cffont->topdict, "ROS", 3);
+ cff_dict_set(cffont->topdict, "ROS", 0,
+ (double) cff_get_sid(cffont, (char *)"Adobe"));
+ cff_dict_set(cffont->topdict, "ROS", 1,
+ (double) cff_get_sid(cffont, (char *)"Identity"));
+ cff_dict_set(cffont->topdict, "ROS", 2, 0.0);
+
+ cffont->num_glyphs = num_glyphs;
+ offset = write_fontfile(font, cffont);
+
+ cff_close(cffont);
+
+ {
+ pdf_obj *cidset;
+
+ cidset = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(cidset, used_chars, (last_cid/8)+1);
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("CIDSet"), pdf_ref_obj(cidset));
+ pdf_release_obj(cidset);
+ }
+
+
+ return;
+}
+
+void
+CIDFont_type0_release(CIDFont *font)
+{
+ return;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cidtype0.h b/Build/source/texk/xdvipdfmx/src/cidtype0.h
new file mode 100644
index 00000000000..6358d55112d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cidtype0.h
@@ -0,0 +1,47 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cidtype0.h,v 1.10 2004/09/02 12:23:06 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CIDTYPE0_H_
+#define _CIDTYPE0_H_
+
+#include "cid.h"
+#include "cid_p.h"
+#include "fontmap.h"
+
+extern void CIDFont_type0_set_verbose (void);
+extern void CIDFont_type0_set_flags (long flags);
+
+extern int CIDFont_type0_open (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt);
+extern void CIDFont_type0_dofont (CIDFont *font);
+extern void CIDFont_type0_release (CIDFont *font);
+
+/* Type1 --> CFF CIDFont */
+extern int t1_load_UnicodeCMap (const char *font_name, const char *otl_tags, int wmode);
+extern int CIDFont_type0_t1open (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt);
+extern void CIDFont_type0_t1dofont (CIDFont *font);
+extern int CIDFont_type0_t1copen (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt);
+extern void CIDFont_type0_t1cdofont (CIDFont *font);
+
+#endif /* _CIDTYPE0_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cidtype2.c b/Build/source/texk/xdvipdfmx/src/cidtype2.c
new file mode 100644
index 00000000000..c9045e4b2d5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cidtype2.c
@@ -0,0 +1,1086 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cidtype2.c,v 1.33 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * TrueType glyf table is sorted by CID and no CIDToGIDMap is used here.
+ * GhostScript can't handle CIDToGIDMap correctly.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "numbers.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxfile.h"
+
+#include "pdfobj.h"
+/* pseudo unique tag */
+#include "pdffont.h"
+
+#ifndef PDF_NAME_LEN_MAX
+# define PDF_NAME_LEN_MAX 255
+#endif
+
+/* TrueType */
+#include "sfnt.h"
+#include "tt_aux.h"
+#include "tt_glyf.h"
+#include "tt_cmap.h"
+#include "tt_table.h"
+
+#include "tt_gsub.h"
+
+/* CID font */
+#include "cmap.h"
+#include "type0.h"
+#include "cid.h"
+#include "cid_p.h"
+#include "cidtype2.h"
+
+static int verbose = 0;
+static int opt_flags = 0;
+
+void
+CIDFont_type2_set_verbose (void)
+{
+ verbose++;
+}
+
+void
+CIDFont_type2_set_flags (long flags)
+{
+ opt_flags = flags;
+}
+
+/*
+ * PDF viewer applications use following tables (CIDFontType 2)
+ *
+ * head, hhea, loca, maxp, glyf, hmtx, fpgm, cvt_, prep
+ *
+ * - from PDF Ref. v.1.3, 2nd ed.
+ *
+ * The fpgm, cvt_, and prep tables appears only when TrueType instructions
+ * requires them. Those tables must be preserved if they exist.
+ * We use must_exist flag to indicate `preserve it if present'
+ * and to make sure not to cause an error when it does not exist.
+ *
+ * post and name table must exist in ordinary TrueType font file,
+ * but when a TrueType font is converted to CIDFontType 2 font, those tables
+ * are no longer required.
+ *
+ * The OS/2 table (required for TrueType font for Windows and OS/2) contains
+ * liscencing information, but PDF viewers seems not using them.
+ *
+ * The 'name' table added. See comments in ttf.c.
+ */
+
+static struct
+{
+ const char *name;
+ int must_exist;
+} required_table[] = {
+ {"OS/2", 0}, {"head", 1}, {"hhea", 1}, {"loca", 1}, {"maxp", 1},
+ {"name", 1}, {"glyf", 1}, {"hmtx", 1}, {"fpgm", 0}, {"cvt ", 0},
+ {"prep", 0}, {NULL, 0}
+};
+
+static void
+validate_name (char *fontname, int len)
+{
+ int i, count;
+ char *p;
+ static const char *badstrlist[] = {
+ "-WIN-RKSJ-H",
+ "-WINP-RKSJ-H",
+ "-WING-RKSJ-H",
+ "-90pv-RKSJ-H",
+ NULL
+ };
+
+ for (count = 0, i = 0; i < len; i++) {
+ if (fontname[i] == 0) {
+ memmove(fontname + i, fontname + i + 1, len - i);
+ count++;
+ len--;
+ }
+ }
+ if (count > 0) {
+ WARN("Removed %d null character(s) from fontname --> %s",
+ count, fontname);
+ }
+ fontname[len] = '\0';
+
+ /* For some fonts that have bad PS name. ad hoc. remove me. */
+ for (i = 0; badstrlist[i] != NULL; i++) {
+ p = strstr(fontname, badstrlist[i]);
+ if (p && p > fontname) {
+ WARN("Removed string \"%s\" from fontname \"%s\".",
+ badstrlist[i], fontname);
+ p[0] = '\0';
+ len = (int) (p - fontname);
+ break;
+ }
+ }
+
+ if (len < 1) {
+ ERROR("No valid character found in fontname string.");
+ }
+}
+
+/*
+ * We will follow the convension for finding ToUnicode CMap described in PDF
+ * Reference 4th ed., page 432. The name of "ToCode" (not limited to Unicode
+ * here) CMap is obtained by concatenating the registry, ordering, and the
+ * name of encoding.
+ *
+ * UCSms-UCS4, UCSms-UCS2, UCS4 added...
+ */
+
+#define WIN_UCS_INDEX_MAX 1
+#define KNOWN_ENCODINGS_MAX 8
+static struct
+{
+ unsigned short platform;
+ unsigned short encoding;
+ const char *pdfnames[5];
+} known_encodings[] = {
+ {TT_WIN, TT_WIN_UCS4, {"UCSms-UCS4", "UCSms-UCS2", "UCS4", "UCS2", NULL}},
+ {TT_WIN, TT_WIN_UNICODE, {"UCSms-UCS4", "UCSms-UCS2", "UCS4", "UCS2", NULL}},
+ {TT_WIN, TT_WIN_SJIS, {"90ms-RKSJ", NULL}},
+ {TT_WIN, TT_WIN_RPC, {"GBK-EUC", NULL}},
+ {TT_WIN, TT_WIN_BIG5, {"ETen-B5", NULL}},
+ {TT_WIN, TT_WIN_WANSUNG, {"KSCms-UHC", NULL}},
+ {TT_MAC, TT_MAC_JAPANESE, {"90pv-RKSJ", NULL}},
+ {TT_MAC, TT_MAC_TRADITIONAL_CHINESE, {"B5pc", NULL}},
+ {TT_MAC, TT_MAC_SIMPLIFIED_CHINESE, {"GBpc-EUC", NULL}},
+ {TT_MAC, TT_MAC_KOREAN, {"KSCpc-EUC", NULL}},
+ {0, 0, {NULL}}
+};
+
+static CMap *
+find_tocode_cmap (const char *reg, const char *ord, int select)
+{
+ int cmap_id = -1, i;
+ char *cmap_name;
+ char *append;
+
+ if (!reg || !ord ||
+ select < 0 || select > KNOWN_ENCODINGS_MAX)
+ ERROR("Character set unknown.");
+
+ if (!strcmp(ord, "UCS") &&
+ select <= WIN_UCS_INDEX_MAX)
+ return NULL;
+
+ for (i = 0; cmap_id < 0 && i < 5; i++) {
+ append = (char *) known_encodings[select].pdfnames[i];
+ if (!append)
+ break;
+ cmap_name = NEW(strlen(reg) + strlen(ord) + strlen(append) + 3, char);
+ sprintf(cmap_name, "%s-%s-%s", reg, ord, append);
+ cmap_id = CMap_cache_find(cmap_name);
+ RELEASE(cmap_name);
+ }
+ if (cmap_id < 0) {
+ WARN("Could not find CID-to-Code mapping for \"%s-%s\".", reg, ord);
+ WARN("I tried to load (one of) the following file(s):");
+ for (i = 0; i < 5; i++) {
+ append = (char *) known_encodings[select].pdfnames[i];
+ if (!append)
+ break;
+ MESG(" %s-%s-%s", reg, ord, append);
+ }
+ WARN("Please check if this file exists.");
+ ERROR("Cannot continue...");
+ }
+
+ return CMap_cache_get(cmap_id);
+}
+
+
+/*
+ * CIDFont glyph metrics:
+ * Mostly same as add_CID[HV]Metrics in cidtype0.c.
+ */
+#define PDFUNIT(v) ((double) (ROUND(1000.0*(v)/(g->emsize), 1)))
+
+static void
+add_TTCIDHMetrics (pdf_obj *fontdict, struct tt_glyphs *g,
+ char *used_chars, unsigned char *cidtogidmap, unsigned short last_cid)
+{
+ long cid, start = 0, prev = 0;
+ pdf_obj *w_array, *an_array = NULL;
+ double dw;
+ int empty = 1;
+
+ w_array = pdf_new_array();
+ if (g->dw != 0 && g->dw <= g->emsize) {
+ dw = PDFUNIT(g->dw);
+ } else {
+ dw = PDFUNIT(g->gd[0].advw);
+ }
+ for (cid = 0; cid <= last_cid; cid++) {
+ USHORT idx, gid;
+ double width;
+
+ if (!is_used_char2(used_chars, cid))
+ continue;
+ gid = (cidtogidmap) ? ((cidtogidmap[2*cid] << 8)|cidtogidmap[2*cid+1]) : cid;
+ idx = tt_get_index(g, gid);
+ if (cid != 0 && idx == 0)
+ continue;
+ width = PDFUNIT((g->gd)[idx].advw);
+ if (width == dw) {
+ if (an_array) {
+ pdf_add_array(w_array, pdf_new_number(start));
+ pdf_add_array(w_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ } else {
+ if (cid != prev + 1) {
+ if (an_array) {
+ pdf_add_array(w_array, pdf_new_number(start));
+ pdf_add_array(w_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ }
+ if (an_array == NULL) {
+ an_array = pdf_new_array();
+ start = cid;
+ }
+ pdf_add_array(an_array, pdf_new_number(width));
+ prev = cid;
+ }
+ }
+
+ if (an_array) {
+ pdf_add_array(w_array, pdf_new_number(start));
+ pdf_add_array(w_array, an_array);
+ empty = 0;
+ }
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("DW"),
+ pdf_new_number(dw));
+ if (!empty) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("W"),
+ pdf_ref_obj(w_array));
+ }
+ pdf_release_obj(w_array);
+
+ return;
+}
+
+static void
+add_TTCIDVMetrics (pdf_obj *fontdict, struct tt_glyphs *g,
+ char *used_chars, unsigned char *cidtogidmap, unsigned short last_cid)
+{
+ pdf_obj *w2_array, *an_array = NULL;
+ long cid, prev, start;
+ double defaultVertOriginY, defaultAdvanceHeight;
+ int empty = 1;
+
+ defaultVertOriginY = PDFUNIT(g->default_advh - g->default_tsb);
+ defaultAdvanceHeight = PDFUNIT(g->default_advh);
+
+ w2_array = pdf_new_array();
+ start = prev = 0;
+ for (cid = 0; cid <= last_cid; cid++) {
+ USHORT idx, gid;
+ double vertOriginX, vertOriginY, advanceHeight;
+
+ if (!is_used_char2(used_chars, cid))
+ continue;
+ gid = (cidtogidmap) ? ((cidtogidmap[2*cid] << 8)|cidtogidmap[2*cid+1]) : cid;
+ idx = tt_get_index(g, cid);
+ if (cid != 0 && idx == 0)
+ continue;
+ advanceHeight = PDFUNIT(g->gd[idx].advh);
+ vertOriginX = PDFUNIT(0.5*(g->gd[idx].advw));
+ vertOriginY = PDFUNIT(g->gd[idx].tsb + g->gd[idx].ury);
+#if 0
+ /*
+ * c [w1_1y v_1x v_1y w1_2y v_2x v_2y ...]
+ * Not working... Why?
+ * Acrobat Reader:
+ * Wrong rendering, interpretation of position vector is wrong.
+ * Xpdf and gs: ignores W2?
+ */
+ if (vertOriginY == defaultVertOriginY &&
+ advanceHeight == defaultAdvanceHeight) {
+ if (an_array) {
+ pdf_add_array(w2_array, pdf_new_number(start));
+ pdf_add_array(w2_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ } else {
+ if (cid != prev + 1 && an_array) {
+ pdf_add_array(w2_array, pdf_new_number(start));
+ pdf_add_array(w2_array, an_array);
+ an_array = NULL;
+ empty = 0;
+ }
+ if (an_array == NULL) {
+ an_array = pdf_new_array();
+ start = cid;
+ }
+ pdf_add_array(an_array, pdf_new_number(-advanceHeight));
+ pdf_add_array(an_array, pdf_new_number(vertOriginX));
+ pdf_add_array(an_array, pdf_new_number(vertOriginY));
+ prev = cid;
+ }
+#else
+ /*
+ * c_first c_last w1_y v_x v_y
+ * This form may hit Acrobat's implementation limit of array element size,
+ * 8192. AFPL GhostScript 8.11 stops with rangecheck error with this.
+ * Maybe GS's bug?
+ */
+ if (vertOriginY != defaultVertOriginY ||
+ advanceHeight != defaultAdvanceHeight) {
+ pdf_add_array(w2_array, pdf_new_number(cid));
+ pdf_add_array(w2_array, pdf_new_number(cid));
+ pdf_add_array(w2_array, pdf_new_number(-advanceHeight));
+ pdf_add_array(w2_array, pdf_new_number(vertOriginX));
+ pdf_add_array(w2_array, pdf_new_number(vertOriginY));
+ empty = 0;
+ }
+#endif
+ }
+
+#if 0
+ if (an_array) {
+ pdf_add_array(w2_array, pdf_new_number(start));
+ pdf_add_array(w2_array, an_array);
+ empty = 0;
+ }
+#endif
+
+ if (defaultVertOriginY != 880 || defaultAdvanceHeight != 1000) {
+ an_array = pdf_new_array();
+ pdf_add_array(an_array, pdf_new_number(defaultVertOriginY));
+ pdf_add_array(an_array, pdf_new_number(-defaultAdvanceHeight));
+ pdf_add_dict(fontdict, pdf_new_name ("DW2"), an_array);
+ }
+ if (!empty) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("W2"),
+ pdf_ref_obj(w2_array));
+ }
+ pdf_release_obj(w2_array);
+
+ return;
+}
+
+/*
+ * The following routine fixes few problems caused by vendor specific
+ * Unicode mappings.
+ */
+
+#define FIX_CJK_UNIOCDE_SYMBOLS 1
+
+static unsigned short
+fix_CJK_symbols (unsigned short code)
+{
+ unsigned short alt_code;
+ static struct
+ {
+ unsigned short alt1;
+ unsigned short alt2;
+ } CJK_Uni_symbols[] = {
+ /*
+ * Microsoft/Apple Unicode mapping difference:
+ * They are taken from SJIS-Unicode mapping difference but nearly
+ * same thing might be applied to Chinese (e.g., Big5) too.
+ */
+ {0x2014, 0x2015}, /* EM DASH <-> HORIZONTAL BAR */
+ {0x2016, 0x2225}, /* DOUBLE VERTICAL LINE <-> PARALLEL TO */
+ {0x203E, 0xFFE3}, /* OVERLINE <-> FULLWIDTH MACRON */
+ {0x2026, 0x22EF}, /* HORIZONTAL ELLIPSIS <-> MIDLINE HORIZONTAL ELLIPSIS */
+ {0x2212, 0xFF0D}, /* MINUS SIGN <-> FULLWIDTH HYPHEN-MINUS */
+ {0x301C, 0xFF5E}, /* WAVE DASH <-> FULLWIDTH TILDE */
+ {0xFFE0, 0x00A2}, /* FULLWIDTH CENT SIGN <-> CENT SIGN */
+ {0xFFE1, 0x00A3}, /* FULLWIDTH POUND SIGN <-> POUND SIGN */
+ {0xFFE2, 0x00AC}, /* FULLWIDTH NOT SIGN <-> NOT SIGN */
+ {0xFFFF, 0xFFFF}, /* EOD */
+ };
+#define NUM_CJK_SYMBOLS (sizeof(CJK_Uni_symbols)/sizeof(CJK_Uni_symbols[0]))
+ int i;
+
+ alt_code = code;
+ for (i = 0; i < NUM_CJK_SYMBOLS; i++) {
+ if (CJK_Uni_symbols[i].alt1 == code) {
+ alt_code = CJK_Uni_symbols[i].alt2;
+ break;
+ } else if (CJK_Uni_symbols[i].alt2 == code) {
+ alt_code = CJK_Uni_symbols[i].alt1;
+ break;
+ }
+ }
+
+ return alt_code;
+}
+
+static long
+cid_to_code (CMap *cmap, CID cid)
+{
+ unsigned char inbuf[2], outbuf[32];
+ long inbytesleft = 2, outbytesleft = 32;
+ unsigned char *p, *q;
+
+ if (!cmap)
+ return cid;
+
+ inbuf[0] = (cid >> 8) & 0xff;
+ inbuf[1] = cid & 0xff;
+ p = inbuf; q = outbuf;
+
+ CMap_decode_char(cmap, (const unsigned char **) &p, &inbytesleft, &q, &outbytesleft);
+
+ if (inbytesleft != 0)
+ return 0;
+ else if (outbytesleft == 31)
+ return (long) outbuf[0];
+ else if (outbytesleft == 30)
+ return (long) (outbuf[0] << 8|outbuf[1]);
+ else if (outbytesleft == 28)
+ return (long) (outbuf[0] << 24|outbuf[1] << 16|outbuf[2] << 8|outbuf[3]);
+
+ return 0;
+}
+
+/* #define NO_GHOSTSCRIPT_BUG 1 */
+
+void
+CIDFont_type2_dofont (CIDFont *font)
+{
+ pdf_obj *fontfile;
+ sfnt *sfont;
+ char *h_used_chars, *v_used_chars, *used_chars;
+ struct tt_glyphs *glyphs;
+ CMap *cmap = NULL;
+ tt_cmap *ttcmap = NULL;
+ unsigned long offset = 0;
+ CID cid, last_cid;
+ unsigned char *cidtogidmap;
+ USHORT num_glyphs;
+ int i, glyph_ordering = 0, unicode_cmap = 0;
+ FILE *fp = NULL;
+
+ if (!font->indirect)
+ return;
+
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("FontDescriptor"), pdf_ref_obj(font->descriptor));
+
+ if (CIDFont_is_BaseFont(font))
+ return;
+
+ /*
+ * CIDSystemInfo comes here since Supplement can be increased.
+ */
+ {
+ pdf_obj *tmp;
+
+ tmp = pdf_new_dict ();
+ pdf_add_dict(tmp,
+ pdf_new_name("Registry"),
+ pdf_new_string(font->csi->registry, strlen(font->csi->registry)));
+ pdf_add_dict(tmp,
+ pdf_new_name("Ordering"),
+ pdf_new_string(font->csi->ordering, strlen(font->csi->ordering)));
+ pdf_add_dict(tmp,
+ pdf_new_name("Supplement"),
+ pdf_new_number(font->csi->supplement));
+ pdf_add_dict(font->fontdict, pdf_new_name("CIDSystemInfo"), tmp);
+ }
+
+ /* Quick exit for non-embedded & fixed-pitch font. */
+ if (!CIDFont_get_embedding(font) &&
+ (opt_flags & CIDFONT_FORCE_FIXEDPITCH)) {
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("DW"), pdf_new_number(1000.0));
+ return;
+ }
+
+#ifdef XETEX
+ sfont = sfnt_open(font->ft_face, SFNT_TYPE_TTC | SFNT_TYPE_TRUETYPE);
+#else
+ fp = DPXFOPEN(font->ident, DPX_RES_TYPE_TTFONT);
+ if (!fp)
+ ERROR("Could not open TTF file: %s", font->ident);
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont) {
+ ERROR("Could not open TTF file: %s", font->ident);
+ }
+
+ switch (sfont->type) {
+ case SFNT_TYPE_TTC:
+ offset = ttc_read_offset(sfont, font->options->index);
+ if (offset == 0)
+ ERROR("Invalid TTC index in %s.", font->ident);
+ break;
+ case SFNT_TYPE_TRUETYPE:
+ if (font->options->index > 0)
+ ERROR("Found TrueType font file while expecting TTC file (%s).", font->ident);
+ offset = 0;
+ break;
+ default:
+ ERROR("Not a TrueType/TTC font (%s)?", font->ident);
+ break;
+ }
+
+ if (sfnt_read_table_directory(sfont, offset) < 0)
+ ERROR("Could not read TrueType table directory (%s).", font->ident);
+
+ /*
+ * Adobe-Identity means font's internal glyph ordering here.
+ */
+ if (!strcmp(font->csi->registry, "Adobe") &&
+ !strcmp(font->csi->ordering, "Identity")) {
+ glyph_ordering = 1;
+ } else {
+ glyph_ordering = 0;
+ }
+
+ /*
+ * Select TrueType cmap table, find ToCode CMap for each TrueType encodings.
+ */
+ if (glyph_ordering) {
+ ttcmap = NULL;
+ cmap = NULL;
+ } else {
+ /*
+ * This part contains a bug. It may choose SJIS encoding TrueType cmap
+ * table for Adobe-GB1.
+ */
+ for (i = 0; i <= KNOWN_ENCODINGS_MAX; i++) {
+ ttcmap = tt_cmap_read(sfont,
+ known_encodings[i].platform,
+ known_encodings[i].encoding);
+ if (ttcmap)
+ break;
+ }
+ if (!ttcmap) {
+ WARN("No usable TrueType cmap table found for font \"%s\".", font->ident);
+ WARN("CID character collection for this font is set to \"%s-%s\"",
+ font->csi->registry, font->csi->ordering);
+ ERROR("Cannot continue without this...");
+ } else if (i <= WIN_UCS_INDEX_MAX) {
+ unicode_cmap = 1;
+ } else {
+ unicode_cmap = 0;
+ }
+
+ /*
+ * NULL is returned if CMap is Identity CMap.
+ */
+ cmap = find_tocode_cmap(font->csi->registry,
+ font->csi->ordering, i);
+ }
+
+ glyphs = tt_build_init();
+
+ last_cid = 0;
+ num_glyphs = 1; /* .notdef */
+ used_chars = h_used_chars = v_used_chars = NULL;
+ {
+ Type0Font *parent;
+ int parent_id, c;
+
+ if ((parent_id = CIDFont_get_parent_id(font, 0)) >= 0) {
+ parent = Type0Font_cache_get(parent_id);
+ h_used_chars = Type0Font_get_usedchars(parent);
+ }
+ if ((parent_id = CIDFont_get_parent_id(font, 1)) >= 0) {
+ parent = Type0Font_cache_get(parent_id);
+ v_used_chars = Type0Font_get_usedchars(parent);
+ }
+ if (!h_used_chars && !v_used_chars)
+ ERROR("Unexpected error.");
+
+ /*
+ * Quick check of max CID.
+ */
+ c = 0;
+ for (i = 8191; i >= 0; i--) {
+ if (h_used_chars && h_used_chars[i] != 0) {
+ last_cid = i * 8 + 7;
+ c = h_used_chars[i];
+ break;
+ }
+ if (v_used_chars && v_used_chars[i] != 0) {
+ last_cid = i * 8 + 7;
+ c = v_used_chars[i];
+ break;
+ }
+ }
+ if (last_cid > 0) {
+ for (i = 0; i < 8; i++) {
+ if ((c >> i) & 1)
+ break;
+ last_cid--;
+ }
+ }
+ if (last_cid >= 0xFFFFu) {
+ ERROR("CID count > 65535");
+ }
+ }
+
+#ifndef NO_GHOSTSCRIPT_BUG
+ cidtogidmap = NULL;
+#else
+ cidtogidmap = NEW((last_cid + 1) * 2, unsigned char);
+ memset(cidtogidmap, 0, (last_cid + 1) * 2);
+#endif /* !NO_GHOSTSCRIPT_BUG */
+
+ /*
+ * Map CIDs to GIDs.
+ * Horizontal and vertical used_chars are merged.
+ */
+
+ /*
+ * Horizontal
+ */
+ if (h_used_chars) {
+ used_chars = h_used_chars;
+ for (cid = 1; cid <= last_cid; cid++) {
+ long code;
+ unsigned short gid;
+
+ if (!is_used_char2(h_used_chars, cid))
+ continue;
+
+ if (glyph_ordering) {
+ gid = cid;
+ code = cid;
+ } else {
+ code = cid_to_code(cmap, cid);
+ gid = tt_cmap_lookup(ttcmap, code);
+#ifdef FIX_CJK_UNIOCDE_SYMBOLS
+ if (gid == 0 && unicode_cmap) {
+ long alt_code;
+
+ alt_code = fix_CJK_symbols(code);
+ if (alt_code != code) {
+ gid = tt_cmap_lookup(ttcmap, alt_code);
+ if (gid != 0) {
+ WARN("Unicode char U+%04x replaced with U+%04x.",
+ code, alt_code);
+ }
+ }
+ }
+#endif /* FIX_CJK_UNIOCDE_SYMBOLS */
+ }
+
+ if (gid == 0) {
+ WARN("Glyph missing in font. (CID=%u, code=0x%04x)", cid, code);
+ }
+
+ /* TODO: duplicated glyph */
+#ifndef NO_GHOSTSCRIPT_BUG
+ gid = tt_add_glyph(glyphs, gid, cid);
+#else
+ gid = tt_add_glyph(glyphs, gid, num_glyphs);
+ cidtogidmap[2*cid ] = gid >> 8;
+ cidtogidmap[2*cid+1] = gid & 0xff;
+#endif /* !NO_GHOSTSCRIPT_BUG */
+
+ num_glyphs++;
+ }
+ }
+
+ /*
+ * Vertical
+ */
+ if (v_used_chars) {
+ otl_gsub *gsub_list = NULL;
+
+ /*
+ * Require `vrt2' or `vert'.
+ */
+ if (glyph_ordering) {
+ gsub_list = NULL;
+ } else {
+ gsub_list = otl_gsub_new();
+ if (otl_gsub_add_feat(gsub_list,
+ "*", "*", "vrt2", sfont) < 0) {
+ if (otl_gsub_add_feat(gsub_list,
+ "*", "*", "vert", sfont) < 0) {
+ WARN("GSUB feature vrt2/vert not found.");
+ otl_gsub_release(gsub_list);
+ gsub_list = NULL;
+ } else {
+ otl_gsub_select(gsub_list, "*", "*", "vert");
+ }
+ } else {
+ otl_gsub_select(gsub_list, "*", "*", "vrt2");
+ }
+ }
+
+ for (cid = 1; cid <= last_cid; cid++) {
+ long code;
+ unsigned short gid;
+
+ if (!is_used_char2(v_used_chars, cid))
+ continue;
+
+ /* There may be conflict of horizontal and vertical glyphs
+ * when font is used with /UCS. However, we simply ignore
+ * that...
+ */
+ if (h_used_chars && is_used_char2(h_used_chars, cid)) {
+ continue;
+ }
+
+ if (glyph_ordering) {
+ gid = cid;
+ code = cid;
+ } else {
+ code = cid_to_code(cmap, cid);
+ gid = tt_cmap_lookup(ttcmap, code);
+#ifdef FIX_CJK_UNIOCDE_SYMBOLS
+ if (gid == 0 && unicode_cmap) {
+ long alt_code;
+
+ alt_code = fix_CJK_symbols(code);
+ if (alt_code != code) {
+ gid = tt_cmap_lookup(ttcmap, alt_code);
+ if (gid != 0) {
+ WARN("Unicode char U+%04x replaced with U+%04x.",
+ code, alt_code);
+ }
+ }
+ }
+#endif /* FIX_CJK_UNIOCDE_SYMBOLS */
+ }
+ if (gid == 0) {
+ WARN("Glyph missing in font. (CID=%u, code=0x%04x)", cid, code);
+ } else if (gsub_list) {
+ otl_gsub_apply(gsub_list, &gid);
+ }
+
+#ifndef NO_GHOSTSCRIPT_BUG
+ gid = tt_add_glyph(glyphs, gid, cid);
+#else
+ gid = tt_add_glyph(glyphs, gid, num_glyphs);
+ cidtogidmap[2*cid ] = gid >> 8;
+ cidtogidmap[2*cid+1] = gid & 0xff;
+#endif /* !NO_GHOSTSCRIPT_BUG */
+
+ if (used_chars) /* merge vertical used_chars to horizontal */
+ add_to_used_chars2(used_chars, cid);
+
+ num_glyphs++;
+ }
+
+ if (gsub_list)
+ otl_gsub_release(gsub_list);
+
+ if (!used_chars) /* We have no horizontal. */
+ used_chars = v_used_chars;
+ }
+
+ if (!used_chars)
+ ERROR("Unexpected error.");
+
+ tt_cmap_release(ttcmap);
+
+ if (CIDFont_get_embedding(font)) {
+ if (tt_build_tables(sfont, glyphs) < 0)
+ ERROR("Could not created FontFile stream.");
+ if (verbose > 1)
+ MESG("[%u glyphs (Max CID: %u)]", glyphs->num_glyphs, last_cid);
+ } else {
+ if (tt_get_metrics(sfont, glyphs) < 0)
+ ERROR("Reading glyph metrics failed...");
+ }
+
+ /*
+ * DW, W, DW2, and W2
+ */
+ if (opt_flags & CIDFONT_FORCE_FIXEDPITCH) {
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("DW"), pdf_new_number(1000.0));
+ } else {
+ add_TTCIDHMetrics(font->fontdict, glyphs, used_chars, cidtogidmap, last_cid);
+ if (v_used_chars)
+ add_TTCIDVMetrics(font->fontdict, glyphs, used_chars, cidtogidmap, last_cid);
+ }
+
+ tt_build_finish(glyphs);
+
+ /* Finish here if not embedded. */
+ if (!CIDFont_get_embedding(font)) {
+ if (cidtogidmap)
+ RELEASE(cidtogidmap);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return;
+ }
+
+ /* Create font file */
+ for (i = 0; required_table[i].name; i++) {
+ if (sfnt_require_table(sfont,
+ required_table[i].name,
+ required_table[i].must_exist) < 0) {
+ ERROR("Some required TrueType table does not exist.");
+ }
+ }
+
+ /*
+ * FontFile2
+ */
+ fontfile = sfnt_create_FontFile_stream(sfont);
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ if (!fontfile)
+ ERROR("Could not created FontFile stream for \"%s\".", font->ident);
+
+ if (verbose > 1) {
+ MESG("[%ld bytes]", pdf_stream_length(fontfile));
+ }
+
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontFile2"),
+ pdf_ref_obj (fontfile));
+ pdf_release_obj(fontfile);
+
+ /*
+ * CIDSet
+ */
+ {
+ pdf_obj *cidset;
+
+ cidset = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(cidset, used_chars, last_cid/8 + 1);
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("CIDSet"),
+ pdf_ref_obj(cidset));
+ pdf_release_obj(cidset);
+ }
+
+ /*
+ * CIDToGIDMap
+ */
+ if (cidtogidmap) {
+ pdf_obj *c2gmstream;
+
+ c2gmstream = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(c2gmstream, cidtogidmap, (last_cid + 1) * 2);
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("CIDToGIDMap"),
+ pdf_ref_obj (c2gmstream));
+ pdf_release_obj(c2gmstream);
+ RELEASE(cidtogidmap);
+ }
+
+ return;
+}
+
+int
+CIDFont_type2_open (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt)
+{
+ char *fontname;
+ sfnt *sfont;
+ unsigned long offset = 0;
+ FILE *fp = NULL;
+
+ ASSERT(font && opt);
+
+#ifdef XETEX
+ sfont = sfnt_open(font->ft_face, SFNT_TYPE_TTC | SFNT_TYPE_TRUETYPE);
+ if (!sfont)
+ return -1;
+#else
+ fp = DPXFOPEN(name, DPX_RES_TYPE_TTFONT);
+ if (!fp)
+ return -1;
+
+ sfont = sfnt_open(fp);
+ if (!sfont) {
+ DPXFCLOSE(fp);
+ return -1;
+ }
+#endif
+
+ switch (sfont->type) {
+ case SFNT_TYPE_TTC:
+ offset = ttc_read_offset(sfont, opt->index);
+ break;
+ case SFNT_TYPE_TRUETYPE:
+ if (opt->index > 0) {
+ ERROR("Invalid TTC index (not TTC font): %s", name);
+ } else {
+ offset = 0;
+ }
+ break;
+ default:
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ break;
+ }
+
+ if (sfnt_read_table_directory(sfont, offset) < 0) {
+ ERROR("Reading TrueType table directory failed.");
+ }
+
+ {
+ char *shortname;
+ long namelen;
+
+ /* MAC-ROMAN-EN-POSTSCRIPT or WIN-UNICODE-EN(US)-POSTSCRIPT */
+ shortname = NEW(PDF_NAME_LEN_MAX, char);
+ namelen = tt_get_ps_fontname(sfont, shortname, PDF_NAME_LEN_MAX);
+ if (namelen == 0) {
+ memset(shortname, 0, PDF_NAME_LEN_MAX);
+ strncpy(shortname, name, PDF_NAME_LEN_MAX);
+ namelen = strlen(shortname);
+ }
+ validate_name(shortname, namelen); /* for SJIS, UTF-16, ... string */
+ /*
+ * Strlen works, after validate_named string.
+ * Mangled name requires more 7 bytes.
+ * Style requires more 11 bytes.
+ */
+ fontname = NEW(strlen(shortname)+19, char);
+ strcpy(fontname, shortname);
+ RELEASE(shortname);
+ }
+
+ if (opt->embed && opt->style != FONT_STYLE_NONE) {
+ WARN("Embedding disabled due to style option for %s.", name);
+ opt->embed = 0;
+ }
+ switch (opt->style) {
+ case FONT_STYLE_BOLD:
+ strcat(fontname, ",Bold");
+ break;
+ case FONT_STYLE_ITALIC:
+ strcat(fontname, ",Italic");
+ break;
+ case FONT_STYLE_BOLDITALIC:
+ strcat(fontname, ",BoldItalic");
+ break;
+ }
+ /*
+ * CIDSystemInfo is determined from CMap or from map record option.
+ */
+ font->fontname = fontname;
+ font->subtype = CIDFONT_TYPE2;
+ font->csi = NEW(1, CIDSysInfo);
+ if (opt->csi) {
+ if (cmap_csi) {
+ if (strcmp(opt->csi->registry, cmap_csi->registry) ||
+ strcmp(opt->csi->ordering, cmap_csi->ordering)) {
+ WARN("CID character collection mismatched:\n");
+ MESG("\tFont: %s-%s-%d\n",
+ opt->csi->registry, opt->csi->ordering, opt->csi->supplement);
+ MESG("\tCMap: %s-%s-%d\n",
+ cmap_csi->registry, cmap_csi->ordering, cmap_csi->supplement);
+ ERROR("Incompatible CMap specified for this font.");
+ }
+ if (opt->csi->supplement < cmap_csi->supplement) {
+ WARN("Supplmement value in CIDSystemInfo increased.");
+ WARN("Some characters may not shown.");
+ opt->csi->supplement = cmap_csi->supplement;
+ }
+ }
+ font->csi->registry = NEW(strlen(opt->csi->registry)+1, char);
+ strcpy(font->csi->registry, opt->csi->registry);
+ font->csi->ordering = NEW(strlen(opt->csi->ordering)+1, char);
+ strcpy(font->csi->ordering, opt->csi->ordering);
+ font->csi->supplement = opt->csi->supplement;
+ } else if (cmap_csi) {
+ font->csi->registry = NEW(strlen(cmap_csi->registry)+1, char);
+ strcpy(font->csi->registry, cmap_csi->registry);
+ font->csi->ordering = NEW(strlen(cmap_csi->ordering)+1, char);
+ strcpy(font->csi->ordering, cmap_csi->ordering);
+ font->csi->supplement = cmap_csi->supplement;
+ } else { /* This means font's internal glyph ordering. */
+ font->csi->registry = NEW(strlen("Adobe")+1, char);
+ strcpy(font->csi->registry, "Adobe");
+ font->csi->ordering = NEW(strlen("Identity")+1, char);
+ strcpy(font->csi->ordering, "Identity");
+ font->csi->supplement = 0;
+ }
+
+ font->fontdict = pdf_new_dict();
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Type"),
+ pdf_new_name("Font"));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Subtype"),
+ pdf_new_name("CIDFontType2"));
+
+ font->descriptor = tt_get_fontdesc(sfont, &(opt->embed), 0);
+ if (!font->descriptor) {
+ ERROR("Could not obtain neccesary font info.");
+ }
+
+ if (opt->embed) {
+ memmove(fontname + 7, fontname, strlen(fontname) + 1);
+ pdf_font_make_uniqueTag(fontname);
+ fontname[6] = '+';
+ }
+
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontName"),
+ pdf_new_name(fontname));
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("BaseFont"),
+ pdf_new_name(fontname));
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ /*
+ * Don't write fontdict here.
+ * /Supplement in /CIDSystemInfo may change.
+ */
+
+ return 0;
+}
+
+void
+CIDFont_type2_release (CIDFont *font)
+{
+ return;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cidtype2.h b/Build/source/texk/xdvipdfmx/src/cidtype2.h
new file mode 100644
index 00000000000..24c555954d1
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cidtype2.h
@@ -0,0 +1,37 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cidtype2.h,v 1.6 2004/08/07 09:52:34 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CIDTYPE2_H_
+#define _CIDTYPE2_H_
+
+#include "cid.h"
+#include "cid_p.h"
+
+extern void CIDFont_type2_set_verbose (void);
+extern void CIDFont_type2_set_flags (long flags);
+
+extern int CIDFont_type2_open (CIDFont *font, const char *name,
+ CIDSysInfo *cmap_csi, cid_opt *opt);
+extern void CIDFont_type2_dofont (CIDFont *font);
+extern void CIDFont_type2_release (CIDFont *font);
+
+#endif /* _CIDTYPE2_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cmap.c b/Build/source/texk/xdvipdfmx/src/cmap.c
new file mode 100644
index 00000000000..b0a2f160daf
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap.c
@@ -0,0 +1,995 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap.c,v 1.28 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * References:
+ *
+ * PostScript Language Reference Manual, 3rd. ed. (Adobe Systems Inc.)
+ * 5.11.4 CMap Dictionaries
+ * 5.11.5 FMapType 9 Composite Fonts
+ * Building CMap Files for CID-Keyed Fonts, Adobe Technical Note #5099
+ * CID-Keyed Font Technology Overview, Adobe Technical Note #5092
+ * Adobe CMap and CIDFont Files Specification, Adobe Technical Specification #5014
+ *
+ * Undefined Character Handling:
+ * PLRM 3rd. ed., sec. 5.11.5., "Handling Undefined Characters"
+ *
+ * TODO:
+ * Only cid(range|char) allowed for CODE_TO_CID and bf(range|char) for CID_TO_CODE ?
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "cmap_p.h"
+#include "cmap.h"
+
+static int __verbose = 0;
+static int __silent = 0;
+
+void
+CMap_set_verbose (void)
+{
+ __verbose++;
+}
+
+void
+CMap_set_silent (int value)
+{
+ __silent = value ? 1 : 0;
+}
+
+/* Private funcs. */
+static int bytes_consumed (CMap *cmap, const unsigned char *instr, long inbytes);
+static void handle_undefined (CMap *cmap,
+ const unsigned char **inbuf, long *inbytesleft,
+ unsigned char **outbuf, long *outbytesleft);
+
+static int check_range (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim,
+ const unsigned char *dst, int dstdim);
+
+static unsigned char *get_mem (CMap *cmap, int size);
+static mapDef *mapDef_new (void);
+static void mapDef_release (mapDef *t);
+static int locate_tbl (mapDef **cur, const unsigned char *code, int dim);
+
+CMap *
+CMap_new (void)
+{
+ CMap *cmap;
+
+ cmap = NEW(1, struct CMap);
+ cmap->name = NULL;
+ cmap->type = CMAP_TYPE_CODE_TO_CID;
+ cmap->wmode = 0;
+ cmap->useCMap = NULL;
+ cmap->CSI = NULL;
+
+ cmap->profile.minBytesIn = 2;
+ cmap->profile.maxBytesIn = 2;
+ cmap->profile.minBytesOut = 2;
+ cmap->profile.maxBytesOut = 2;
+
+ cmap->flags = 0;
+
+ cmap->codespace.num = 0;
+ cmap->codespace.max = 10;
+ cmap->codespace.ranges = NEW(10, struct rangeDef);
+
+ cmap->mapTbl = NULL;
+
+ cmap->mapData = NEW(1, struct mapData);
+ cmap->mapData->prev = NULL;
+ cmap->mapData->pos = 0;
+ cmap->mapData->data = NEW(MEM_ALLOC_SIZE, unsigned char);
+
+ return cmap;
+}
+
+void
+CMap_release (CMap *cmap)
+{
+ if (!cmap)
+ return;
+
+ if (cmap->name)
+ RELEASE(cmap->name);
+ if (cmap->CSI) {
+ if (cmap->CSI->registry) RELEASE(cmap->CSI->registry);
+ if (cmap->CSI->ordering) RELEASE(cmap->CSI->ordering);
+ RELEASE(cmap->CSI);
+ }
+ if (cmap->codespace.ranges)
+ RELEASE(cmap->codespace.ranges);
+ if (cmap->mapTbl)
+ mapDef_release(cmap->mapTbl);
+ {
+ mapData *map = cmap->mapData;
+ while (map != NULL) {
+ mapData *prev = map->prev;
+ if (map->data != NULL)
+ RELEASE(map->data);
+ RELEASE(map);
+ map = prev;
+ }
+ }
+
+ RELEASE(cmap);
+}
+
+int
+CMap_is_Identity (CMap *cmap)
+{
+ ASSERT(cmap);
+ if (!strcmp(cmap->name, "Identity-H") || !strcmp(cmap->name, "Identity-V"))
+ return 1;
+ else
+ return 0;
+}
+
+#if 0
+/* NOT IMPLEMENTED YET */
+int
+CMap_is_realy_Identity(CMap *cmap)
+{
+ return 0;
+}
+#endif
+
+int
+CMap_is_valid (CMap *cmap)
+{
+ /* Quick check */
+ if (!cmap || !(cmap->name) || cmap->type < CMAP_TYPE_IDENTITY ||
+ cmap->type > CMAP_TYPE_CID_TO_CODE || cmap->codespace.num < 1 ||
+ (cmap->type != CMAP_TYPE_IDENTITY && !cmap->mapTbl))
+ return 0;
+
+ if (cmap->useCMap) {
+ CIDSysInfo *csi1, *csi2;
+ csi1 = CMap_get_CIDSysInfo(cmap);
+ csi2 = CMap_get_CIDSysInfo(cmap->useCMap);
+ if (strcmp(csi1->registry, csi2->registry) ||
+ strcmp(csi1->ordering, csi2->ordering)) {
+ WARN("CIDSystemInfo mismatched %s <--> %s",
+ CMap_get_name(cmap), CMap_get_name(cmap->useCMap));
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int
+CMap_get_profile (CMap *cmap, int type)
+{
+ int value = 0;
+
+ ASSERT(cmap);
+ switch (type) {
+ case CMAP_PROF_TYPE_INBYTES_MIN:
+ value = cmap->profile.minBytesIn;
+ break;
+ case CMAP_PROF_TYPE_INBYTES_MAX:
+ value = cmap->profile.maxBytesIn;
+ break;
+ case CMAP_PROF_TYPE_OUTBYTES_MIN:
+ value = cmap->profile.maxBytesOut;
+ break;
+ case CMAP_PROF_TYPE_OUTBYTES_MAX:
+ value = cmap->profile.maxBytesOut;
+ break;
+ default:
+ ERROR("%s: Unrecognized profile type %d.", CMAP_DEBUG_STR, type);
+ }
+
+ return value;
+}
+
+/*
+ * Put notdef chars for codes not declared in notdef(range|char)
+ */
+static void
+handle_undefined (CMap *cmap,
+ const unsigned char **inbuf, long *inbytesleft,
+ unsigned char **outbuf, long *outbytesleft)
+{
+ long len = 0;
+
+ if (*outbytesleft < 2)
+ ERROR("%s: Buffer overflow.", CMAP_DEBUG_STR);
+
+ switch (cmap->type) {
+ case CMAP_TYPE_CODE_TO_CID:
+ memcpy(*outbuf, CID_NOTDEF_CHAR, 2);
+ break;
+ case CMAP_TYPE_TO_UNICODE:
+ memcpy(*outbuf, UCS_NOTDEF_CHAR, 2);
+ break;
+ default:
+ WARN("Cannot handle undefined mapping for this type of CMap mapping: %d", cmap->type);
+ WARN("<0000> is used for .notdef char.");
+ memset(*outbuf, 0, 2);
+ }
+ *outbuf += 2;
+ *outbytesleft -= 2;
+
+ len = bytes_consumed(cmap, *inbuf, *inbytesleft);
+
+ *inbuf += len;
+ *inbytesleft -= len;
+}
+
+void
+CMap_decode_char (CMap *cmap,
+ const unsigned char **inbuf, long *inbytesleft,
+ unsigned char **outbuf, long *outbytesleft)
+{
+ mapDef *t;
+ unsigned char *p, c = 0, *save;
+ long count = 0;
+
+ p = save = (unsigned char *) *inbuf;
+ /*
+ * First handle some special cases:
+ */
+ if (cmap->type == CMAP_TYPE_IDENTITY) {
+ if ((*inbytesleft) % 2)
+ ERROR("%s: Invalid/truncated input string.", CMAP_DEBUG_STR);
+ if (*outbytesleft < 2)
+ ERROR("%s: Buffer overflow.", CMAP_DEBUG_STR);
+ memcpy(*outbuf, *inbuf, 2);
+ *inbuf += 2;
+ *outbuf += 2;
+ *outbytesleft -= 2;
+ *inbytesleft -= 2;
+ return;
+ } else if (!cmap->mapTbl) {
+ if (cmap->useCMap) {
+ CMap_decode_char(cmap->useCMap, inbuf, inbytesleft, outbuf, outbytesleft);
+ return;
+ } else {
+ /* no mapping available in this CMap */
+ WARN("No mapping available for this character.");
+ handle_undefined(cmap, inbuf, inbytesleft, outbuf, outbytesleft);
+ return;
+ }
+ }
+
+ ASSERT(cmap->mapTbl);
+ t = cmap->mapTbl;
+ while (count < *inbytesleft) {
+ c = *p++;
+ count++;
+ if (LOOKUP_END(t[c].flag))
+ break;
+ t = t[c].next;
+ }
+ if (LOOKUP_CONTINUE(t[c].flag)) /* need more bytes */
+ ERROR("%s: Premature end of input string.", CMAP_DEBUG_STR);
+ else if (!MAP_DEFINED(t[c].flag)) {
+ if (cmap->useCMap) {
+ CMap_decode_char(cmap->useCMap, inbuf, inbytesleft, outbuf, outbytesleft);
+ return;
+ } else {
+ /* no mapping available in this CMap */
+ WARN("No character mapping available.");
+ MESG(" CMap name: %s\n", CMap_get_name(cmap));
+ MESG(" input str: ");
+ MESG("<");
+ while (save < p) {
+ MESG("%02x", *save);
+ save++;
+ }
+ MESG(">\n");
+ /*
+ * We know partial match found up to `count' bytes,
+ * but we will not use this information for the sake of simplicity.
+ */
+ handle_undefined(cmap, inbuf, inbytesleft, outbuf, outbytesleft);
+ return;
+ }
+ } else {
+ switch (MAP_TYPE(t[c].flag)) {
+ case MAP_IS_NOTDEF:
+ WARN("Character mapped to .notdef found.");
+ /* continue */
+ case MAP_IS_CID: case MAP_IS_CODE:
+ if (*outbytesleft >= t[c].len)
+ memcpy(*outbuf, t[c].code, t[c].len);
+ else
+ ERROR("%s: Buffer overflow.", CMAP_DEBUG_STR);
+ *outbuf += t[c].len;
+ *outbytesleft -= t[c].len;
+ break;
+ case MAP_IS_NAME:
+ ERROR("%s: CharName mapping not supported.", CMAP_DEBUG_STR);
+ break;
+ default:
+ ERROR("%s: Unknown mapping type.", CMAP_DEBUG_STR);
+ }
+ if (inbytesleft)
+ *inbytesleft -= count;
+ *inbuf = p;
+ }
+}
+
+/*
+ * For convenience, it does not do decoding to CIDs.
+ */
+long
+CMap_decode (CMap *cmap,
+ const unsigned char **inbuf, long *inbytesleft,
+ unsigned char **outbuf, long *outbytesleft)
+{
+ int count;
+
+ ASSERT(cmap && inbuf && outbuf);
+ ASSERT(inbytesleft && outbytesleft);
+ for (count = 0;*inbytesleft > 0 && *outbytesleft > 0; count++)
+ CMap_decode_char(cmap, inbuf, inbytesleft, outbuf, outbytesleft);
+
+ return count;
+}
+
+char *
+CMap_get_name (CMap *cmap)
+{
+ ASSERT(cmap);
+ return cmap->name;
+}
+
+int
+CMap_get_type (CMap *cmap)
+{
+ ASSERT(cmap);
+ return cmap->type;
+}
+
+int
+CMap_get_wmode (CMap *cmap)
+{
+ ASSERT(cmap);
+ return cmap->wmode;
+}
+
+CIDSysInfo *
+CMap_get_CIDSysInfo (CMap *cmap)
+{
+ ASSERT(cmap);
+ return cmap->CSI;
+}
+
+void
+CMap_set_name (CMap *cmap, const char *name)
+{
+ ASSERT(cmap);
+ if (cmap->name)
+ RELEASE(cmap->name);
+ cmap->name = NEW(strlen(name)+1, char);
+ strcpy(cmap->name, name);
+}
+
+void
+CMap_set_type (CMap *cmap, int type)
+{
+ ASSERT(cmap);
+ cmap->type = type;
+}
+
+void
+CMap_set_wmode (CMap *cmap, int wmode)
+{
+ ASSERT(cmap);
+ cmap->wmode = wmode;
+}
+
+void
+CMap_set_CIDSysInfo (CMap *cmap, const CIDSysInfo *csi)
+{
+ ASSERT(cmap);
+
+ if (cmap->CSI) {
+ if (cmap->CSI->registry)
+ RELEASE(cmap->CSI->registry);
+ if (cmap->CSI->ordering)
+ RELEASE(cmap->CSI->ordering);
+ RELEASE(cmap->CSI);
+ }
+
+ if (csi && csi->registry && csi->ordering) {
+ cmap->CSI = NEW(1, CIDSysInfo);
+ cmap->CSI->registry = NEW(strlen(csi->registry)+1, char);
+ strcpy(cmap->CSI->registry, csi->registry);
+ cmap->CSI->ordering = NEW(strlen(csi->ordering)+1, char);
+ strcpy(cmap->CSI->ordering, csi->ordering);
+ cmap->CSI->supplement = csi->supplement;
+ } else {
+ WARN("Invalid CIDSystemInfo.");
+ cmap->CSI = NULL;
+ }
+}
+
+/*
+ * Can have muliple entry ?
+ */
+void
+CMap_set_usecmap (CMap *cmap, CMap *ucmap)
+{
+ int i;
+
+ ASSERT(cmap);
+ ASSERT(ucmap); /* Maybe if (!ucmap) ERROR() is better for this. */
+
+ if (cmap == ucmap)
+ ERROR("%s: Identical CMap object cannot be used for usecmap CMap: 0x%p=0x%p",
+ CMAP_DEBUG_STR, cmap, ucmap);
+
+ /* Check if ucmap have neccesary information. */
+ if (!CMap_is_valid(ucmap))
+ ERROR("%s: Invalid CMap.", CMAP_DEBUG_STR);
+
+ /*
+ * CMapName of cmap can be undefined when usecmap is executed in CMap parsing.
+ * And it is also possible CSI is not defined at that time.
+ */
+ if (cmap->name && strcmp(cmap->name, ucmap->name) == 0)
+ ERROR("%s: CMap refering itself not allowed: CMap %s --> %s",
+ CMAP_DEBUG_STR, cmap->name, ucmap->name);
+
+ if (cmap->CSI && cmap->CSI->registry && cmap->CSI->ordering) {
+ if (strcmp(cmap->CSI->registry, ucmap->CSI->registry) ||
+ strcmp(cmap->CSI->ordering, ucmap->CSI->ordering))
+ ERROR("%s: CMap %s required by %s have different CSI.",
+ CMAP_DEBUG_STR, CMap_get_name(cmap), CMap_get_name(ucmap));
+ }
+
+ /* We must copy codespaceranges. */
+ for (i = 0; i < ucmap->codespace.num; i++) {
+ rangeDef *csr = ucmap->codespace.ranges + i;
+ CMap_add_codespacerange(cmap, csr->codeLo, csr->codeHi, csr->dim);
+ }
+
+ cmap->useCMap = ucmap;
+}
+
+/* Test the validity of character c. */
+int
+CMap_match_codespace (CMap *cmap, const unsigned char *c, int dim)
+{
+ int i, pos;
+
+ ASSERT(cmap);
+ for (i = 0; i < cmap->codespace.num; i++) {
+ rangeDef *csr = cmap->codespace.ranges + i;
+ if (csr->dim != dim)
+ continue;
+ for (pos = 0; pos < dim; pos++) {
+ if (c[pos] > csr->codeHi[pos] || c[pos] < csr->codeLo[pos])
+ break;
+ }
+ if (pos == dim)
+ return 0; /* Valid */
+ }
+
+ return -1; /* Invalid */
+}
+
+/*
+ * No overlapping codespace ranges are allowed, otherwise mapping is ambiguous.
+ */
+int
+CMap_add_codespacerange (CMap *cmap,
+ const unsigned char *codelo, const unsigned char *codehi, int dim)
+{
+ rangeDef *csr = NULL;
+ int i;
+
+ ASSERT(cmap && dim > 0);
+
+ for (i = 0; i < cmap->codespace.num; i++) {
+ int j, overlap = 1;
+ csr = cmap->codespace.ranges + i;
+ for (j = 0; j < MIN(csr->dim, dim) && overlap; j++) {
+ if ((codelo[j] >= csr->codeLo[j] && codelo[j] <= csr->codeHi[j]) ||
+ (codehi[j] >= csr->codeLo[j] && codehi[j] <= csr->codeHi[j]))
+ overlap = 1;
+ else
+ overlap = 0;
+ }
+ if (overlap) {
+ WARN("Overlapping codespace found. (ingored)");
+ return -1;
+ }
+ }
+
+ if (dim < cmap->profile.minBytesIn)
+ cmap->profile.minBytesIn = dim;
+ if (dim > cmap->profile.maxBytesIn)
+ cmap->profile.maxBytesIn = dim;
+
+ if (cmap->codespace.num + 1 > cmap->codespace.max) {
+ cmap->codespace.max += 10;
+ cmap->codespace.ranges = RENEW(cmap->codespace.ranges, cmap->codespace.max, struct rangeDef);
+ }
+
+ csr = cmap->codespace.ranges + cmap->codespace.num;
+ csr->dim = dim;
+ csr->codeHi = get_mem(cmap, dim);
+ csr->codeLo = get_mem(cmap, dim);
+ memcpy(csr->codeHi, codehi, dim);
+ memcpy(csr->codeLo, codelo, dim);
+
+ (cmap->codespace.num)++;
+
+ return 0;
+}
+
+int
+CMap_add_notdefchar (CMap *cmap, const unsigned char *src, int srcdim, CID dst)
+{
+ return CMap_add_notdefrange(cmap, src, src, srcdim, dst);
+}
+
+int
+CMap_add_notdefrange (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim, CID dst)
+{
+ int c;
+ mapDef *cur;
+
+ ASSERT(cmap);
+ /* dst not used here */
+ /* FIXME */
+ if (check_range(cmap, srclo, srchi, srcdim, (const unsigned char *)&dst, 2) < 0)
+ return -1;
+
+ if (cmap->mapTbl == NULL )
+ cmap->mapTbl = mapDef_new();
+
+ cur = cmap->mapTbl;
+ if (locate_tbl(&cur, srclo, srcdim) < 0)
+ return -1;
+
+ for (c = srclo[srcdim-1]; c <= srchi[srcdim-1]; c++) {
+ if (MAP_DEFINED(cur[c].flag)) {
+ if (!__silent)
+ WARN("Trying to redefine already defined code mapping. (ignored)");
+ } else {
+ cur[c].flag = (MAP_LOOKUP_END|MAP_IS_NOTDEF);
+ cur[c].code = get_mem(cmap, 2);
+ cur[c].len = 2;
+ cur[c].code[0] = dst >> 8;
+ cur[c].code[1] = dst & 0xff;
+ }
+ /* Do not do dst++ for notdefrange */
+ }
+
+ return 0;
+}
+
+int
+CMap_add_bfchar (CMap *cmap,
+ const unsigned char *src, int srcdim,
+ const unsigned char *dst, int dstdim)
+{
+ return CMap_add_bfrange(cmap, src, src, srcdim, dst, dstdim);
+}
+
+int
+CMap_add_bfrange (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim,
+ const unsigned char *base, int dstdim)
+{
+ int c, last_byte, i;
+ mapDef *cur;
+
+ ASSERT(cmap);
+ if (check_range(cmap, srclo, srchi, srcdim, base, dstdim) < 0)
+ return -1;
+
+ if (cmap->mapTbl == NULL )
+ cmap->mapTbl = mapDef_new();
+
+ cur = cmap->mapTbl;
+ if (locate_tbl(&cur, srclo, srcdim) < 0)
+ return -1;
+
+ for (c = srclo[srcdim-1]; c <= srchi[srcdim-1]; c++) {
+ if (MAP_DEFINED(cur[c].flag)) {
+ if (!__silent)
+ WARN("Trying to redefine already defined code mapping. (ignored)");
+ continue;
+ }
+
+ /*
+ * We assume restriction to code ranges also applied here.
+ * Addition <00FF> + 1 is undefined.
+ *
+ * Changed on 2004-03-20:
+ *
+ * Should be treated as <0100> in Acrobat's "ToUnicode" CMap.
+ */
+ cur[c].flag = (MAP_LOOKUP_END|MAP_IS_CODE);
+ cur[c].code = get_mem(cmap, dstdim);
+ cur[c].len = dstdim;
+ memcpy(cur[c].code, base, dstdim);
+
+ last_byte = c - srclo[srcdim-1] + base[dstdim-1];
+ cur[c].code[dstdim-1] = (last_byte & 0xFF);
+ for (i = dstdim - 2; i >= 0 && last_byte > 255; i--) {
+ last_byte = cur[c].code[i] + 1;
+ cur[c].code[i] = (last_byte & 0xFF);
+ }
+ }
+
+ return 0;
+}
+
+int
+CMap_add_cidchar (CMap *cmap, const unsigned char *src, int srcdim, CID dst)
+{
+ return CMap_add_cidrange(cmap, src, src, srcdim, dst);
+}
+
+int
+CMap_add_cidrange (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim, CID base)
+{
+ int c;
+ mapDef *cur;
+
+ ASSERT(cmap);
+ /* base not used here */
+ if (check_range(cmap, srclo, srchi, srcdim, (const unsigned char *)&base, 2) < 0) /* FIXME */
+ return -1;
+
+ if (cmap->mapTbl == NULL )
+ cmap->mapTbl = mapDef_new();
+
+ cur = cmap->mapTbl;
+ if (locate_tbl(&cur, srclo, srcdim) < 0)
+ return -1;
+
+ for (c = srclo[srcdim-1]; c <= srchi[srcdim-1]; c++) {
+ if (cur[c].flag != 0) {
+ if (!__silent)
+ WARN("Trying to redefine already defined CID mapping. (ignored)");
+ } else {
+ cur[c].flag = (MAP_LOOKUP_END|MAP_IS_CID);
+ cur[c].len = 2;
+ cur[c].code = get_mem(cmap, 2);
+ cur[c].code[0] = base >> 8;
+ cur[c].code[1] = base & 0xff;
+ }
+ if (base >= CID_MAX)
+ WARN("CID number too large.");
+ base++;
+ }
+
+ return 0;
+}
+
+static void
+mapDef_release (mapDef *t)
+{
+ int c;
+
+ ASSERT(t);
+ for (c = 0; c < 256; c++) {
+ if (LOOKUP_CONTINUE(t[c].flag))
+ mapDef_release(t[c].next);
+ }
+ RELEASE(t);
+}
+
+static mapDef *
+mapDef_new (void)
+{
+ mapDef *t;
+ int c;
+
+ t = NEW(256, mapDef);
+ for (c=0; c<256; c++) {
+ t[c].flag = (MAP_LOOKUP_END|MAP_IS_UNDEF);
+ t[c].code = NULL;
+ t[c].next = NULL;
+ }
+
+ return t;
+}
+
+static unsigned char *
+get_mem (CMap *cmap, int size)
+{
+ mapData *map;
+ unsigned char *p;
+
+ ASSERT(cmap && cmap->mapData && size >= 0);
+ map = cmap->mapData;
+ if (map->pos + size >= MEM_ALLOC_SIZE) {
+ mapData *prev = map;
+ map = NEW(1, struct mapData);
+ map->data = NEW(MEM_ALLOC_SIZE, unsigned char);
+ map->prev = prev;
+ map->pos = 0;
+ cmap->mapData = map;
+ }
+ p = map->data + map->pos;
+ map->pos += size;
+
+ return p;
+}
+
+static int
+locate_tbl (mapDef **cur, const unsigned char *code, int dim)
+{
+ int i, c;
+
+ ASSERT(cur && *cur);
+ for (i = 0; i < dim-1; i++) {
+ c = code[i];
+ if (MAP_DEFINED((*cur)[c].flag)) {
+ WARN("Ambiguous CMap entry.");
+ return -1;
+ }
+ if ((*cur)[c].next == NULL) /* create new node */
+ (*cur)[c].next = mapDef_new();
+ (*cur)[c].flag |= MAP_LOOKUP_CONTINUE;
+ *cur = (*cur)[c].next;
+ }
+
+ return 0;
+}
+
+/*
+ * Guess how many bytes consumed as a `single' character:
+ * Substring of length bytesconsumed bytes of input string is interpreted as
+ * a `single' character by CMap_decode().
+ */
+static int
+bytes_consumed (CMap *cmap, const unsigned char *instr, long inbytes)
+{
+ int i, pos, longest = 0, bytesconsumed;
+
+ ASSERT(cmap);
+ for (i = 0; i < cmap->codespace.num; i++) {
+ rangeDef *csr = cmap->codespace.ranges + i;
+ for (pos = 0; pos < MIN(csr->dim, inbytes); pos++) {
+ if (instr[pos] > csr->codeHi[pos] || instr[pos] < csr->codeLo[pos])
+ break;
+ }
+ if (pos == csr->dim) /* part of instr is totally valid in this codespace. */
+ return csr->dim;
+ if (pos > longest)
+ longest = pos;
+ }
+
+ if (i == cmap->codespace.num) /* No matching at all */
+ bytesconsumed = cmap->profile.minBytesIn;
+ else {
+ bytesconsumed = cmap->profile.maxBytesIn;
+ for (i = 0; i< cmap->codespace.num; i++) {
+ rangeDef *csr = cmap->codespace.ranges + i;
+ if (csr->dim > longest && csr->dim < bytesconsumed)
+ bytesconsumed = csr->dim;
+ }
+ }
+
+ return bytesconsumed;
+}
+
+static int
+check_range (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim,
+ const unsigned char *dst, int dstdim)
+{
+ if ((srcdim < 1 || dstdim < 1) ||
+ (!srclo || !srchi || !dst) ||
+ memcmp(srclo, srchi, srcdim - 1) ||
+ srclo[srcdim-1] > srchi[srcdim-1]) {
+ WARN("Invalid CMap mapping entry. (ignored)");
+ return -1;
+ }
+
+ if (CMap_match_codespace(cmap, srclo, srcdim) < 0 ||
+ CMap_match_codespace(cmap, srchi, srcdim) < 0) {
+ WARN("Invalid CMap mapping entry. (ignored)");
+ return -1;
+ }
+
+ if (srcdim < cmap->profile.minBytesIn)
+ cmap->profile.minBytesIn = srcdim;
+ if (srcdim > cmap->profile.maxBytesIn)
+ cmap->profile.maxBytesIn = srcdim;
+ if (dstdim < cmap->profile.minBytesOut)
+ cmap->profile.minBytesOut = dstdim;
+ if (dstdim > cmap->profile.maxBytesOut)
+ cmap->profile.maxBytesOut = dstdim;
+
+ return 0;
+}
+
+/************************** CMAP_CACHE **************************/
+#include "cmap_read.h"
+
+#define CMAP_CACHE_ALLOC_SIZE 16u
+
+struct CMap_cache {
+ int num;
+ int max;
+ CMap **cmaps;
+};
+
+static struct CMap_cache *__cache = NULL;
+
+#define CHECK_ID(n) do {\
+ if (! __cache)\
+ ERROR("%s: CMap cache not initialized.", CMAP_DEBUG_STR);\
+ if ((n) < 0 || (n) >= __cache->num)\
+ ERROR("Invalid CMap ID %d", (n));\
+ } while (0)
+
+#include "dpxfile.h"
+
+void
+CMap_cache_init (void)
+{
+ static unsigned char range_min[2] = {0x00, 0x00};
+ static unsigned char range_max[2] = {0xff, 0xff};
+
+ if (__cache)
+ ERROR("%s: Already initialized.", CMAP_DEBUG_STR);
+
+ __cache = NEW(1, struct CMap_cache);
+
+ __cache->max = CMAP_CACHE_ALLOC_SIZE;
+ __cache->cmaps = NEW(__cache->max, CMap *);
+ __cache->num = 0;
+
+ /* Create Identity mapping */
+ __cache->cmaps[0] = CMap_new();
+ CMap_set_name (__cache->cmaps[0], "Identity-H");
+ CMap_set_type (__cache->cmaps[0], CMAP_TYPE_IDENTITY);
+ CMap_set_wmode(__cache->cmaps[0], 0);
+ CMap_set_CIDSysInfo(__cache->cmaps[0], &CSI_IDENTITY);
+ CMap_add_codespacerange(__cache->cmaps[0], range_min, range_max, 2);
+
+ __cache->cmaps[1] = CMap_new();
+ CMap_set_name (__cache->cmaps[1], "Identity-V");
+ CMap_set_type (__cache->cmaps[1], CMAP_TYPE_IDENTITY);
+ CMap_set_wmode(__cache->cmaps[1], 1);
+ CMap_set_CIDSysInfo(__cache->cmaps[1], &CSI_IDENTITY);
+ CMap_add_codespacerange(__cache->cmaps[1], range_min, range_max, 2);
+
+ __cache->num += 2;
+}
+
+CMap *
+CMap_cache_get (int id)
+{
+ CHECK_ID(id);
+ return __cache->cmaps[id];
+}
+
+int
+CMap_cache_find (const char *cmap_name)
+{
+ int id = 0;
+ FILE *fp = NULL;
+
+ if (!__cache)
+ CMap_cache_init();
+ ASSERT(__cache);
+
+ for (id = 0; id < __cache->num; id++) {
+ char *name = NULL;
+ /* CMapName may be undefined when processing usecmap. */
+ name = CMap_get_name(__cache->cmaps[id]);
+ if (name && strcmp(cmap_name, name) == 0) {
+ return id;
+ }
+ }
+
+ fp = DPXFOPEN(cmap_name, DPX_RES_TYPE_CMAP);
+ if (!fp)
+ return -1;
+
+ if (CMap_parse_check_sig(fp) < 0) {
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ if (__verbose)
+ MESG("(CMap:%s", cmap_name);
+
+ if (__cache->num >= __cache->max) {
+ __cache->max += CMAP_CACHE_ALLOC_SIZE;
+ __cache->cmaps = RENEW(__cache->cmaps, __cache->max, CMap *);
+ }
+ id = __cache->num;
+ (__cache->num)++;
+ __cache->cmaps[id] = CMap_new();
+
+ if (CMap_parse(__cache->cmaps[id], fp) < 0)
+ ERROR("%s: Parsing CMap file failed.", CMAP_DEBUG_STR);
+
+ DPXFCLOSE(fp);
+
+ if (__verbose)
+ MESG(")");
+
+ return id;
+}
+
+int
+CMap_cache_add (CMap *cmap)
+{
+ int id;
+ char *cmap_name0, *cmap_name1;
+
+ if (!CMap_is_valid(cmap))
+ ERROR("%s: Invalid CMap.", CMAP_DEBUG_STR);
+
+ for (id = 0; id < __cache->num; id++) {
+ cmap_name0 = CMap_get_name(cmap);
+ cmap_name1 = CMap_get_name(__cache->cmaps[id]);
+ if (!strcmp(cmap_name0, cmap_name1)) {
+ ERROR("%s: CMap \"%s\" already defined.",
+ CMAP_DEBUG_STR, cmap_name0);
+ return -1;
+ }
+ }
+
+ if (__cache->num >= __cache->max) {
+ __cache->max += CMAP_CACHE_ALLOC_SIZE;
+ __cache->cmaps = RENEW(__cache->cmaps, __cache->max, CMap *);
+ }
+ id = __cache->num;
+ (__cache->num)++;
+ __cache->cmaps[id] = cmap;
+
+ return id;
+}
+
+void
+CMap_cache_close (void)
+{
+ if (__cache) {
+ int id;
+ for (id = 0; id < __cache->num; id++) {
+ CMap_release(__cache->cmaps[id]);
+ }
+ RELEASE(__cache->cmaps);
+ RELEASE(__cache);
+ __cache = NULL;
+ }
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cmap.h b/Build/source/texk/xdvipdfmx/src/cmap.h
new file mode 100644
index 00000000000..579361eb5f1
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap.h
@@ -0,0 +1,118 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap.h,v 1.15 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CMAP_H_
+#define _CMAP_H_
+
+#include "cid.h"
+
+#include <sys/types.h>
+
+typedef unsigned short CID;
+typedef unsigned short UCV16;
+
+/* Limits */
+#define CID_MAX_CID 65535
+#define CID_MAX CID_MAX_CID
+
+#define CID_NOTDEF_CHAR "\0\0"
+#define CID_NOTDEF 0
+
+#define UCS_NOTDEF_CHAR "\377\375"
+#define UCS_NOTDEF 0xfffd
+
+/*
+ * TYPE_IDENTITY and TYPE_CID_TO_CODE is not defined in the CMap spec.
+ */
+#define CMAP_TYPE_IDENTITY 0
+#define CMAP_TYPE_CODE_TO_CID 1
+#define CMAP_TYPE_TO_UNICODE 2
+#define CMAP_TYPE_CID_TO_CODE 3
+
+#define CMAP_PROF_TYPE_INBYTES_MIN 0
+#define CMAP_PROF_TYPE_INBYTES_MAX 1
+#define CMAP_PROF_TYPE_OUTBYTES_MIN 2
+#define CMAP_PROF_TYPE_OUTBYTES_MAX 3
+
+typedef struct CMap CMap;
+
+
+/************************** CMAP_MAIN **************************/
+
+extern void CMap_set_verbose (void);
+extern void CMap_set_silent (int value);
+
+extern CMap *CMap_new (void);
+extern void CMap_release (CMap *cmap);
+
+extern int CMap_is_valid (CMap *cmap);
+extern int CMap_is_Identity (CMap *cmap);
+extern int CMap_get_profile (CMap *cmap, int type);
+
+extern char *CMap_get_name (CMap *cmap);
+extern int CMap_get_type (CMap *cmap);
+extern int CMap_get_wmode(CMap *cmap);
+extern CIDSysInfo *CMap_get_CIDSysInfo(CMap *cmap);
+
+extern void CMap_set_name (CMap *cmap, const char *name);
+extern void CMap_set_type (CMap *cmap, int type);
+extern void CMap_set_wmode (CMap *cmap, int wmode);
+extern void CMap_set_usecmap(CMap *cmap, CMap *ucmap);
+extern void CMap_set_CIDSysInfo (CMap *cmap, const CIDSysInfo *csi);
+
+/* charName not supported */
+extern int CMap_add_bfchar (CMap *cmap,
+ const unsigned char *src, int srcdim,
+ const unsigned char *dest, int destdim);
+extern int CMap_add_cidchar (CMap *cmap,
+ const unsigned char *src, int srcdim, CID dest);
+extern int CMap_add_bfrange (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim,
+ const unsigned char *dest, int destdim);
+extern int CMap_add_cidrange(CMap *cmap,
+ const unsigned char *srclo, const unsigned char *hi, int srcdim,
+ CID base);
+
+extern int CMap_add_notdefchar (CMap *cmap, const unsigned char *src, int srcdim, CID dst);
+extern int CMap_add_notdefrange (CMap *cmap,
+ const unsigned char *srclo, const unsigned char *srchi, int srcdim,
+ CID dst);
+
+extern int CMap_add_codespacerange (CMap *cmap,
+ const unsigned char *codelo, const unsigned char *codehi, int dim);
+extern int CMap_match_codespace (CMap *cmap, const unsigned char *c, int dim);
+
+extern void CMap_decode_char (CMap *cmap,
+ const unsigned char **inbuf, long *inbytesleft,
+ unsigned char **outbuf, long *outbytesleft);
+
+extern long CMap_decode (CMap *cmap,
+ const unsigned char **inbuf, long *inbytesleft,
+ unsigned char **outbuf, long *outbytesleft);
+
+extern void CMap_cache_init (void);
+extern CMap *CMap_cache_get (int id);
+extern int CMap_cache_find (const char *cmap_name);
+extern void CMap_cache_close (void);
+extern int CMap_cache_add (CMap *cmap);
+
+#endif /* _CMAP_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cmap_p.h b/Build/source/texk/xdvipdfmx/src/cmap_p.h
new file mode 100644
index 00000000000..32d4250dafe
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap_p.h
@@ -0,0 +1,104 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap_p.h,v 1.4 2004/08/15 15:37:08 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CMAP_P_H_
+#define _CMAP_P_H_
+
+#include "cid.h"
+
+/* Mapping types, MAP_IS_NAME is not supported. */
+#define MAP_IS_CID (1 << 0)
+#define MAP_IS_NAME (1 << 1)
+#define MAP_IS_CODE (1 << 2)
+#define MAP_IS_NOTDEF (1 << 3)
+
+#define MAP_IS_UNDEF 0
+#define MAP_TYPE_MASK 0x00f
+
+#define MAP_DEFINED(e) (((e) & MAP_TYPE_MASK) != MAP_IS_UNDEF ? 1 : 0)
+#define MAP_TYPE(e) ((e) & MAP_TYPE_MASK)
+
+/* Lookup flags */
+#define MAP_LOOKUP_END 0
+#define MAP_LOOKUP_CONTINUE (1 << 4)
+#define LOOKUP_CONTINUE(f) ((f) & MAP_LOOKUP_CONTINUE)
+#define LOOKUP_END(f) (!LOOKUP_CONTINUE((f)))
+
+/* DEBUG */
+#define CMAP_DEBUG_STR "CMap"
+#define CMAP_DEBUG 3
+
+/* Codespacerange */
+typedef struct rangeDef {
+ int dim; /* Dimension of this codespacerange */
+ unsigned char *codeLo; /* Lower bounds of valid input code */
+ unsigned char *codeHi; /* Upper bounds of valid input code */
+} rangeDef;
+
+typedef struct mapDef {
+ int flag;
+ int len; /* 2 for CID, variable for Code.. */
+ unsigned char *code; /* CID (as 16-bit BE), Code ... */
+ struct mapDef *next; /* Next Subtbl for LOOKUP_CONTINUE */
+} mapDef;
+
+#define MEM_ALLOC_SIZE 4096
+typedef struct mapData {
+ long pos; /* Position of next free data segment */
+ unsigned char *data; /* CID, Code... MEM_ALLOC_SIZE bytes */
+ struct mapData *prev; /* Previous mapData data segment */
+} mapData;
+
+struct CMap {
+ char *name;
+ int type; /* CMapType: 1 for usual CMaps,
+ * 2 for ToUnicode CMaps,
+ * 0 for IDENTITY is also defined for convenience.
+ */
+ int wmode; /* WMode: 0 for Horizontal, 1 for Vertical. */
+ CIDSysInfo *CSI; /* CIDSystemInfo */
+
+ struct CMap *useCMap;
+
+ struct {
+ int num;
+ int max;
+ rangeDef *ranges;
+ } codespace;
+
+ mapDef *mapTbl; /* First 256 segment of mapping table */
+ mapData *mapData; /* Storage for actual CMap data */
+
+ /* Additional data used by cmap.c, etc. */
+
+ int flags; /* Decoder flags Not used yet. */
+
+ struct {
+ int minBytesIn;
+ int maxBytesIn;
+ int minBytesOut;
+ int maxBytesOut;
+ } profile;
+
+};
+
+#endif /* _CMAP_P_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cmap_read.c b/Build/source/texk/xdvipdfmx/src/cmap_read.c
new file mode 100644
index 00000000000..c40652da08d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap_read.c
@@ -0,0 +1,605 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap_read.c,v 1.2 2005/06/08 11:18:37 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxutil.h"
+#include "pst.h"
+
+#include "cmap_p.h"
+#include "cmap.h"
+
+#include "cmap_read.h"
+
+static int __verbose = 0;
+
+#define CMAP_PARSE_DEBUG_STR "CMap_parse:"
+#define CMAP_PARSE_DEBUG 3
+
+#ifdef HAVE_DPXFILE
+#include "dpxfile.h"
+#else
+#include "mfileio.h"
+
+typedef struct {
+ unsigned char *cursor;
+ unsigned char *endptr;
+
+ unsigned char *buf;
+ long max;
+ FILE *fp;
+ long unread;
+} ifreader;
+
+static ifreader *ifreader_create (FILE *fp, long remain, long bufsize);
+static long ifreader_read (ifreader *reader, long size);
+static void ifreader_destroy (ifreader *reader);
+
+static ifreader *
+ifreader_create (FILE *fp, long size, long bufsize)
+{
+ ifreader *reader;
+
+ reader = NEW(1, ifreader);
+ reader->buf = NEW(bufsize, unsigned char);
+ reader->max = bufsize;
+ reader->fp = fp;
+ reader->unread = size;
+
+ reader->cursor = reader->endptr = reader->buf;
+
+ return reader;
+}
+
+static void
+ifreader_destroy (ifreader *reader)
+{
+ ASSERT(reader);
+ if (reader->buf)
+ RELEASE(reader->buf);
+ RELEASE(reader);
+}
+
+
+static long
+ifreader_read (ifreader *reader, long size)
+{
+ long bytesread = 0, bytesrem = 0;
+
+ ASSERT(reader);
+ bytesrem = (long) reader->endptr - (long) reader->cursor;
+ if (size > reader->max) {
+ if (__verbose)
+ MESG("\nExtending buffer (%ld bytes)...\n", size);
+ reader->buf = RENEW(reader->buf, size, unsigned char);
+ reader->max = size;
+ }
+ if (reader->unread > 0 && bytesrem < size) {
+ bytesread = MIN(reader->max - bytesrem, reader->unread);
+ memmove(reader->buf, reader->cursor, bytesrem);
+ reader->cursor = reader->buf;
+ reader->endptr = reader->buf + bytesrem;
+ if (fread(reader->endptr, 1, bytesread, reader->fp) != bytesread)
+ ERROR("Reading file failed.");
+ reader->endptr += bytesread;
+ reader->unread -= bytesread;
+ if (__verbose)
+ MESG("Reading more %ld bytes (%ld bytes remains in buffer)...\n", bytesread, bytesrem);
+ }
+
+ return bytesread + bytesrem;
+}
+#define ifreader_need(f,s) ifreader_read((f),(s))
+
+#endif /* HAVE_DPXFILE */
+
+static int check_next_token (ifreader *input, const char *key);
+static int get_coderange (ifreader *input, unsigned char *codeLo, unsigned char *codeHi, int *dim, int maxlen);
+
+static int handle_codearray (CMap *cmap, ifreader *input, unsigned char *codeLo, int dim, int count);
+static int do_codespacerange (CMap *cmap, ifreader *input, int count);
+static int do_notdefrange (CMap *cmap, ifreader *input, int count);
+static int do_bfrange (CMap *cmap, ifreader *input, int count);
+static int do_cidrange (CMap *cmap, ifreader *input, int count);
+static int do_notdefchar (CMap *cmap, ifreader *input, int count);
+static int do_bfchar (CMap *cmap, ifreader *input, int count);
+static int do_cidchar (CMap *cmap, ifreader *input, int count);
+
+#define TOKEN_LEN_MAX 127
+
+static int
+check_next_token (ifreader *input, const char *key)
+{
+ int cmp;
+ pst_obj *token;
+ char *str;
+
+ if (ifreader_need(input, strlen(key)) < 0)
+ return -1;
+ if ((token = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+
+ str = (char *) pst_getSV(token);
+ cmp = strcmp(str, key) ? -1 : 0;
+ if (str)
+ RELEASE(str);
+ pst_release_obj(token);
+
+ return cmp;
+}
+
+static int
+get_coderange (ifreader *input,
+ unsigned char *codeLo, unsigned char *codeHi, int *dim, int maxlen)
+{
+ pst_obj *tok1, *tok2;
+ int dim1, dim2;
+
+ if ((tok1 = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL) {
+ pst_release_obj(tok1);
+ return -1;
+ }
+
+ if (!PST_STRINGTYPE(tok1) || !PST_STRINGTYPE(tok2)) {
+ pst_release_obj(tok1);
+ pst_release_obj(tok2);
+ return -1;
+ }
+
+ dim1 = pst_length_of(tok1);
+ dim2 = pst_length_of(tok2);
+ if (dim1 != dim2 || dim1 > maxlen) {
+ pst_release_obj(tok1);
+ pst_release_obj(tok2);
+ return -1;
+ }
+
+ memcpy(codeLo, pst_data_ptr(tok1), dim1);
+ memcpy(codeHi, pst_data_ptr(tok2), dim2);
+ pst_release_obj(tok1);
+ pst_release_obj(tok2);
+
+ *dim = dim1;
+ return 0;
+}
+
+static int
+do_codespacerange (CMap *cmap, ifreader *input, int count)
+{
+ unsigned char codeLo[TOKEN_LEN_MAX], codeHi[TOKEN_LEN_MAX];
+ int dim;
+
+ while (count-- > 0) {
+ if (get_coderange(input, codeLo, codeHi, &dim, TOKEN_LEN_MAX) < 0)
+ return -1;
+ CMap_add_codespacerange(cmap, codeLo, codeHi, dim);
+ }
+
+ return check_next_token(input, "endcodespacerange");
+}
+
+/*
+ * bfrange
+ * <codeLo> <codeHi> [destCode1 destCode2 ...]
+ */
+static int
+handle_codearray (CMap *cmap, ifreader *input, unsigned char *codeLo, int dim, int count)
+{
+ pst_obj *tok = NULL;
+
+ if (dim < 1)
+ ERROR("Invalid code range.");
+ while (count-- > 0) {
+ if ((tok = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ else if (PST_STRINGTYPE(tok)) {
+ CMap_add_bfchar(cmap, codeLo, dim, (unsigned char *) pst_data_ptr(tok), (int) pst_length_of(tok));
+ } else if (PST_MARKTYPE(tok) || !PST_NAMETYPE(tok))
+ ERROR("%s: Invalid CMap mapping record.", CMAP_PARSE_DEBUG_STR);
+ else
+ ERROR("%s: Mapping to charName not supported.", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok);
+ codeLo[dim-1] += 1;
+ }
+
+ return check_next_token(input, "]");
+}
+
+static int
+do_notdefrange (CMap *cmap, ifreader *input, int count)
+{
+ pst_obj *tok;
+ unsigned char codeLo[TOKEN_LEN_MAX], codeHi[TOKEN_LEN_MAX];
+ long dstCID;
+ int dim;
+
+ while (count-- > 0) {
+ if (ifreader_need(input, TOKEN_LEN_MAX*3) < 0)
+ return -1;
+ if (get_coderange(input, codeLo, codeHi, &dim, TOKEN_LEN_MAX) < 0 ||
+ (tok = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if (PST_INTEGERTYPE(tok)) {
+ dstCID = pst_getIV(tok);
+ if (dstCID >= 0 && dstCID <= CID_MAX)
+ CMap_add_notdefrange(cmap, codeLo, codeHi, dim, (CID) dstCID);
+ } else
+ WARN("%s: Invalid CMap mapping record. (ignored)", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok);
+ }
+
+ return check_next_token(input, "endnotdefrange");
+}
+
+static int
+do_bfrange (CMap *cmap, ifreader *input, int count)
+{
+ pst_obj *tok;
+ unsigned char codeLo[TOKEN_LEN_MAX], codeHi[TOKEN_LEN_MAX];
+ int srcdim;
+
+ while (count-- > 0) {
+ if (ifreader_need(input, TOKEN_LEN_MAX*3) < 0)
+ return -1;
+ if (get_coderange(input, codeLo, codeHi, &srcdim, TOKEN_LEN_MAX) < 0 ||
+ (tok = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if (PST_STRINGTYPE(tok)) {
+ CMap_add_bfrange(cmap, codeLo, codeHi, srcdim,
+ (unsigned char *) pst_data_ptr(tok), (int) pst_length_of(tok));
+ } else if (PST_MARKTYPE(tok)) {
+ if (handle_codearray(cmap, input, codeLo, srcdim,
+ codeHi[srcdim-1] - codeLo[srcdim-1] + 1) < 0) {
+ pst_release_obj(tok);
+ return -1;
+ }
+ } else
+ WARN("%s: Invalid CMap mapping record. (ignored)", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok);
+ }
+
+ return check_next_token(input, "endbfrange");
+}
+
+static int
+do_cidrange (CMap *cmap, ifreader *input, int count)
+{
+ pst_obj *tok;
+ unsigned char codeLo[TOKEN_LEN_MAX], codeHi[TOKEN_LEN_MAX];
+ long dstCID;
+ int dim;
+
+ while (count-- > 0) {
+ if (ifreader_need(input, TOKEN_LEN_MAX*3) < 0)
+ return -1;
+ if (get_coderange(input, codeLo, codeHi, &dim, TOKEN_LEN_MAX) < 0 ||
+ (tok = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if (PST_INTEGERTYPE(tok)) {
+ dstCID = pst_getIV(tok);
+ if (dstCID >= 0 && dstCID <= CID_MAX)
+ CMap_add_cidrange(cmap, codeLo, codeHi, dim, (CID) dstCID);
+ } else
+ WARN("%s: Invalid CMap mapping record. (ignored)", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok);
+ }
+
+ return check_next_token(input, "endcidrange");
+}
+
+static int
+do_notdefchar (CMap *cmap, ifreader *input, int count)
+{
+ pst_obj *tok1, *tok2;
+ long dstCID;
+
+ while (count-- > 0) {
+ if (ifreader_need(input, TOKEN_LEN_MAX*2) < 0)
+ return -1;
+ if ((tok1 = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL) {
+ pst_release_obj(tok1);
+ return -1;
+ }
+ if (PST_STRINGTYPE(tok1) && PST_INTEGERTYPE(tok2)) {
+ dstCID = pst_getIV(tok2);
+ if (dstCID >= 0 && dstCID <= CID_MAX)
+ CMap_add_notdefchar(cmap, pst_data_ptr(tok1), pst_length_of(tok1), (CID) dstCID);
+ } else
+ WARN("%s: Invalid CMap mapping record. (ignored)", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok1);
+ pst_release_obj(tok2);
+ }
+
+ return check_next_token(input, "endnotdefchar");
+}
+
+static int
+do_bfchar (CMap *cmap, ifreader *input, int count)
+{
+ pst_obj *tok1, *tok2;
+
+ while (count-- > 0) {
+ if (ifreader_need(input, TOKEN_LEN_MAX*2) < 0)
+ return -1;
+ if ((tok1 = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL) {
+ pst_release_obj(tok1);
+ return -1;
+ }
+ /* We only support single CID font as descendant font, charName should not come here. */
+ if (PST_STRINGTYPE(tok1) && PST_STRINGTYPE(tok2)) {
+ CMap_add_bfchar(cmap,
+ (unsigned char *) pst_data_ptr(tok1), (int) pst_length_of(tok1),
+ (unsigned char *) pst_data_ptr(tok2), (int) pst_length_of(tok2));
+ } else if (PST_NAMETYPE(tok2))
+ ERROR("%s: Mapping to charName not supported.", CMAP_PARSE_DEBUG_STR);
+ else
+ WARN("%s: Invalid CMap mapping record. (ignored)", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok1);
+ pst_release_obj(tok2);
+ }
+
+ return check_next_token(input, "endbfchar");
+}
+
+static int
+do_cidchar (CMap *cmap, ifreader *input, int count)
+{
+ pst_obj *tok1, *tok2;
+ long dstCID;
+
+ while (count-- > 0) {
+ if (ifreader_need(input, TOKEN_LEN_MAX*2) < 0)
+ return -1;
+ if ((tok1 = pst_get_token(&(input->cursor), input->endptr)) == NULL)
+ return -1;
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL) {
+ pst_release_obj(tok1);
+ return -1;
+ }
+ if (PST_STRINGTYPE(tok1) && PST_INTEGERTYPE(tok2)) {
+ dstCID = pst_getIV(tok2);
+ if (dstCID >= 0 && dstCID <= CID_MAX)
+ CMap_add_cidchar(cmap, pst_data_ptr(tok1), pst_length_of(tok1), (CID) dstCID);
+ } else
+ WARN("%s: Invalid CMap mapping record. (ignored)", CMAP_PARSE_DEBUG_STR);
+ pst_release_obj(tok1);
+ pst_release_obj(tok2);
+ }
+
+ return check_next_token(input, "endcidchar");
+}
+
+
+#define MATCH_NAME(t,n) (PST_NAMETYPE((t)) && !memcmp(pst_data_ptr((t)),(n),strlen((n))))
+#define MATCH_OP(t,n) (PST_UNKNOWNTYPE((t)) && !memcmp(pst_data_ptr((t)),(n),strlen((n))))
+
+static int
+do_cidsysteminfo (CMap *cmap, ifreader *input)
+{
+ pst_obj *tok1, *tok2;
+ CIDSysInfo csi = {NULL, NULL, -1};
+ int simpledict = 0;
+ int error = 0;
+
+ ifreader_need(input, TOKEN_LEN_MAX*2);
+ /*
+ * Assuming /CIDSystemInfo 3 dict dup begin .... end def
+ * or /CIDSystemInfo << ... >> def
+ */
+ while ((tok1 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
+ if (PST_MARKTYPE(tok1)) {
+ simpledict = 1;
+ pst_release_obj(tok1);
+ break;
+ } else if (MATCH_OP(tok1, "begin")) {
+ simpledict = 0;
+ pst_release_obj(tok1);
+ break;
+ } else {
+ pst_release_obj(tok1);
+ /* continue */
+ }
+ }
+ tok1 = tok2 = NULL;
+ while (!error &&
+ (tok1 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
+ if (MATCH_OP(tok1, ">>") && simpledict) {
+ pst_release_obj(tok1);
+ break;
+ } else if (MATCH_OP(tok1, "end") && !simpledict) {
+ pst_release_obj(tok1);
+ break;
+ } else if (MATCH_NAME(tok1, "Registry") &&
+ (tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
+ if (!PST_STRINGTYPE(tok2))
+ error = -1;
+ else if (!simpledict &&
+ check_next_token(input, "def"))
+ error = -1;
+ if (!error)
+ csi.registry = (char *) pst_getSV(tok2);
+ } else if (MATCH_NAME(tok1, "Ordering") &&
+ (tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
+ if (!PST_STRINGTYPE(tok2))
+ error = -1;
+ else if (!simpledict &&
+ check_next_token(input, "def"))
+ error = -1;
+ if (!error)
+ csi.ordering = (char *) pst_getSV(tok2);
+ } else if (MATCH_NAME(tok1, "Supplement") &&
+ (tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL) {
+ if (!PST_INTEGERTYPE(tok2))
+ error = -1;
+ else if (!simpledict &&
+ check_next_token(input, "def"))
+ error = -1;
+ if (!error)
+ csi.supplement = pst_getIV(tok2);
+ }
+ if (tok2)
+ pst_release_obj(tok2);
+ if (tok1)
+ pst_release_obj(tok1);
+ tok1 = tok2 = NULL;
+ }
+ if (!error &&
+ check_next_token(input, "def"))
+ error = -1;
+
+ if (!error &&
+ csi.registry && csi.ordering &&
+ csi.supplement >= 0) {
+ CMap_set_CIDSysInfo(cmap, &csi);
+ }
+
+ if (csi.registry)
+ RELEASE(csi.registry);
+ if (csi.ordering)
+ RELEASE(csi.ordering);
+
+ return error;
+}
+
+#define INPUT_BUF_SIZE 4096
+#define CMAP_SIG_MAX 64
+int
+CMap_parse_check_sig (FILE *fp)
+{
+ int result = -1;
+ char sig[CMAP_SIG_MAX+1];
+
+ if (!fp)
+ return -1;
+
+ rewind(fp);
+ if (fread(sig, sizeof(char), CMAP_SIG_MAX, fp) != CMAP_SIG_MAX)
+ result = -1;
+ else {
+ sig[CMAP_SIG_MAX+1] = 0;
+ if (strncmp(sig, "%!PS", 4))
+ result = -1;
+ else if (strstr(sig+4, "Resource-CMap"))
+ result = 0;
+ }
+ rewind(fp);
+
+ return result;
+}
+
+int
+CMap_parse (CMap *cmap, FILE *fp)
+{
+ pst_obj *tok1, *tok2;
+ ifreader *input;
+ int status = 0, tmpint = -1;
+
+ ASSERT(cmap && fp);
+
+ input = ifreader_create(fp, file_size(fp), INPUT_BUF_SIZE);
+
+ while (status >= 0) {
+ tok1 = tok2 = NULL;
+ ifreader_read(input, INPUT_BUF_SIZE/2);
+ tok1 = pst_get_token(&(input->cursor), input->endptr);
+ if (tok1 == NULL)
+ break;
+ else if (MATCH_NAME(tok1, "CMapName")) {
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
+ !(PST_NAMETYPE(tok2) || PST_STRINGTYPE(tok2)) ||
+ check_next_token(input, "def") < 0)
+ status = -1;
+ else
+ CMap_set_name(cmap, pst_data_ptr(tok2));
+ } else if (MATCH_NAME(tok1, "CMapType")) {
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
+ !PST_INTEGERTYPE(tok2) ||
+ check_next_token(input, "def") < 0)
+ status = -1;
+ else
+ CMap_set_type(cmap, pst_getIV(tok2));
+ } else if (MATCH_NAME(tok1, "WMode")) {
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) == NULL ||
+ !PST_INTEGERTYPE(tok2) ||
+ check_next_token(input, "def") < 0)
+ status = -1;
+ else
+ CMap_set_wmode(cmap, pst_getIV(tok2));
+ } else if (MATCH_NAME(tok1, "CIDSystemInfo")) {
+ status = do_cidsysteminfo(cmap, input);
+ } else if (MATCH_NAME(tok1, "Version") ||
+ MATCH_NAME(tok1, "UIDOffset") ||
+ MATCH_NAME(tok1, "XUID")) {
+ /* Ignore */
+ } else if (PST_NAMETYPE(tok1)) {
+ /* Possibly usecmap comes next */
+ if ((tok2 = pst_get_token(&(input->cursor), input->endptr)) != NULL &&
+ MATCH_OP(tok2, "usecmap")) {
+ int id;
+ CMap *ucmap;
+ id = CMap_cache_find(pst_data_ptr(tok1));
+ if (id < 0)
+ status = -1;
+ else {
+ ucmap = CMap_cache_get(id);
+ CMap_set_usecmap(cmap, ucmap);
+ }
+ }
+ } else if (MATCH_OP(tok1, "begincodespacerange")) {
+ status = do_codespacerange(cmap, input, tmpint);
+ } else if (MATCH_OP(tok1, "beginnotdefrange")) {
+ status = do_notdefrange(cmap, input, tmpint);
+ } else if (MATCH_OP(tok1, "beginnotdefchar")) {
+ status = do_notdefchar(cmap, input, tmpint);
+ } else if (MATCH_OP(tok1, "beginbfrange")) {
+ status = do_bfrange(cmap, input, tmpint);
+ } else if (MATCH_OP(tok1, "beginbfchar")) {
+ status = do_bfchar(cmap, input, tmpint);
+ } else if (MATCH_OP(tok1, "begincidrange")) {
+ status = do_cidrange(cmap, input, tmpint);
+ } else if (MATCH_OP(tok1, "begincidchar")) {
+ status = do_cidchar(cmap, input, tmpint);
+ } else if (PST_INTEGERTYPE(tok1)) {
+ tmpint = pst_getIV(tok1);
+ } /* else Simply ignore */
+ if (tok1)
+ pst_release_obj(tok1);
+ if (tok2)
+ pst_release_obj(tok2);
+ }
+
+ ifreader_destroy(input);
+
+ return (status < 0) ? -1 : CMap_is_valid(cmap);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cmap_read.h b/Build/source/texk/xdvipdfmx/src/cmap_read.h
new file mode 100644
index 00000000000..7e334e2263a
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap_read.h
@@ -0,0 +1,34 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap_read.h,v 1.1 2004/08/08 15:16:01 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CMAP_READ_H_
+#define _CMAP_READ_H_
+
+#include <stdio.h>
+#include "cmap.h"
+
+extern int CMap_parse_check_sig (FILE *fp);
+extern int CMap_parse (CMap *cmap, FILE *fp);
+
+#endif /* _CMAP_READ_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cmap_write.c b/Build/source/texk/xdvipdfmx/src/cmap_write.c
new file mode 100644
index 00000000000..b7e8ea75dba
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap_write.c
@@ -0,0 +1,601 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap_write.c,v 1.6 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * References:
+ *
+ * PostScript Language Reference Manual, 3rd. ed. (Adobe Systems Inc.)
+ * 5.11.4 CMap Dictionaries
+ * 5.11.5 FMapType 9 Composite Fonts
+ * Building CMap Files for CID-Keyed Fonts, Adobe Technical Note #5099
+ * CID-Keyed Font Technology Overview, Adobe Technical Note #5092
+ * Adobe CMap and CIDFont Files Specification, Adobe Technical Specification #5014
+ *
+ * Undefined Character Handling:
+ * PLRM 3rd. ed., sec. 5.11.5., "Handling Undefined Characters"
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+#include "pdfresource.h"
+
+#include "cmap_p.h"
+#include "cmap.h"
+
+#include "cmap_write.h"
+
+struct sbuf {
+ char *buf;
+ char *curptr;
+ char *limptr;
+};
+
+static int write_map (mapDef *mtab, int count,
+ unsigned char *codestr, int depth,
+ struct sbuf *wbuf, pdf_obj *stream);
+#if 0
+/* Not completed yet */
+
+/* used_slot...
+ * This is for collecting only used CIDs.
+ * add_inverse_map never supports code-to-code of
+ * cid-to-code mapping.
+ */
+static int add_inverse_map (CMap *icmap, mapDef *mtab,
+ unsigned char *codestr, int depth,
+ unsigned char *used_slot);
+static int add_map (CMap *cmap, mapDef *mtab,
+ unsigned char *codestr, int depth);
+static CMap *invert_cmap (CMap *cmap, unsigned char *used_slot);
+static CMap *flatten_cmap (CMap *cmap);
+#endif /* 0 */
+
+static int
+block_count (mapDef *mtab, int c)
+{
+ int count = 0, n;
+
+ n = mtab[c].len - 1;
+ c += 1;
+ for (; c < 256; c++) {
+ if (LOOKUP_CONTINUE(mtab[c].flag) ||
+ !MAP_DEFINED(mtab[c].flag) ||
+ (MAP_TYPE(mtab[c].flag) != MAP_IS_CID &&
+ MAP_TYPE(mtab[c].flag) != MAP_IS_CODE) ||
+ mtab[c-1].len != mtab[c].len)
+ break;
+ else if (!memcmp(mtab[c-1].code, mtab[c].code, n) &&
+ mtab[c-1].code[n] < 255 &&
+ mtab[c-1].code[n] + 1 == mtab[c].code[n])
+ count++;
+ else {
+ break;
+ }
+ }
+
+ return count;
+}
+
+static int
+write_map (mapDef *mtab, int count,
+ unsigned char *codestr, int depth,
+ struct sbuf *wbuf, pdf_obj *stream)
+{
+ int c, i, block_length;
+ mapDef *mtab1;
+ /* Must be greater than 1 */
+#define BLOCK_LEN_MIN 2
+ struct {
+ int start, count;
+ } blocks[256/BLOCK_LEN_MIN+1];
+ int num_blocks = 0;
+
+ for (c = 0; c < 256; c++) {
+ codestr[depth] = (unsigned char) (c & 0xff);
+ if (LOOKUP_CONTINUE(mtab[c].flag)) {
+ mtab1 = mtab[c].next;
+ count = write_map(mtab1, count,
+ codestr, depth + 1, wbuf, stream);
+ } else {
+ if (MAP_DEFINED(mtab[c].flag)) {
+ switch (MAP_TYPE(mtab[c].flag)) {
+ case MAP_IS_CID: case MAP_IS_CODE:
+ block_length = block_count(mtab, c);
+ if (block_length >= BLOCK_LEN_MIN) {
+ blocks[num_blocks].start = c;
+ blocks[num_blocks].count = block_length;
+ num_blocks++;
+ c += block_length;
+ } else {
+ *(wbuf->curptr)++ = '<';
+ for (i = 0; i <= depth; i++)
+ sputx(codestr[i], &(wbuf->curptr), wbuf->limptr);
+ *(wbuf->curptr)++ = '>';
+ *(wbuf->curptr)++ = ' ';
+ *(wbuf->curptr)++ = '<';
+ for (i = 0; i < mtab[c].len; i++)
+ sputx(mtab[c].code[i], &(wbuf->curptr), wbuf->limptr);
+ *(wbuf->curptr)++ = '>';
+ *(wbuf->curptr)++ = '\n';
+ count++;
+ }
+ break;
+ case MAP_IS_NAME:
+ ERROR("%s: Unexpected error...", CMAP_DEBUG_STR);
+ break;
+ case MAP_IS_NOTDEF:
+ break;
+ default:
+ ERROR("%s: Unknown mapping type: %d",
+ CMAP_DEBUG_STR, MAP_TYPE(mtab[c].flag));
+ }
+ }
+ }
+
+ /* Flush if necessary */
+ if (count >= 100 ||
+ wbuf->curptr >= wbuf->limptr ) {
+ char fmt_buf[32];
+ if (count > 100)
+ ERROR("Unexpected error....: %d", count);
+ sprintf(fmt_buf, "%d beginbfchar\n", count);
+ pdf_add_stream(stream, fmt_buf, strlen(fmt_buf));
+ pdf_add_stream(stream,
+ wbuf->buf, (long) (wbuf->curptr - wbuf->buf));
+ wbuf->curptr = wbuf->buf;
+ pdf_add_stream(stream,
+ "endbfchar\n", strlen("endbfchar\n"));
+ count = 0;
+ }
+ }
+
+ if (num_blocks > 0) {
+ char fmt_buf[32];
+
+ if (count > 0) {
+ sprintf(fmt_buf, "%d beginbfchar\n", count);
+ pdf_add_stream(stream, fmt_buf, strlen(fmt_buf));
+ pdf_add_stream(stream,
+ wbuf->buf, (long) (wbuf->curptr - wbuf->buf));
+ wbuf->curptr = wbuf->buf;
+ pdf_add_stream(stream,
+ "endbfchar\n", strlen("endbfchar\n"));
+ count = 0;
+ }
+ sprintf(fmt_buf, "%d beginbfrange\n", num_blocks);
+ pdf_add_stream(stream, fmt_buf, strlen(fmt_buf));
+ for (i = 0; i < num_blocks; i++) {
+ int j;
+
+ c = blocks[i].start;
+ *(wbuf->curptr)++ = '<';
+ for (j = 0; j < depth; j++)
+ sputx(codestr[j], &(wbuf->curptr), wbuf->limptr);
+ sputx(c, &(wbuf->curptr), wbuf->limptr);
+ *(wbuf->curptr)++ = '>';
+ *(wbuf->curptr)++ = ' ';
+ *(wbuf->curptr)++ = '<';
+ for (j = 0; j < depth; j++)
+ sputx(codestr[j], &(wbuf->curptr), wbuf->limptr);
+ sputx(c + blocks[i].count, &(wbuf->curptr), wbuf->limptr);
+ *(wbuf->curptr)++ = '>';
+ *(wbuf->curptr)++ = ' ';
+ *(wbuf->curptr)++ = '<';
+ for (j = 0; j < mtab[c].len; j++)
+ sputx(mtab[c].code[j], &(wbuf->curptr), wbuf->limptr);
+ *(wbuf->curptr)++ = '>';
+ *(wbuf->curptr)++ = '\n';
+ }
+ pdf_add_stream(stream,
+ wbuf->buf, (long) (wbuf->curptr - wbuf->buf));
+ wbuf->curptr = wbuf->buf;
+ pdf_add_stream(stream,
+ "endbfrange\n", strlen("endbfrange\n"));
+ }
+
+ return count;
+}
+
+#define CMAP_BEGIN "\
+/CIDInit /ProcSet findresource begin\n\
+12 dict begin\n\
+begincmap\n\
+"
+
+#define CMAP_END "\
+endcmap\n\
+CMapName currentdict /CMap defineresource pop\n\
+end\n\
+end\n\
+"
+
+pdf_obj *
+CMap_create_stream (CMap *cmap, int flags) /* flags unused */
+{
+ pdf_obj *stream;
+ pdf_obj *stream_dict;
+ CIDSysInfo *csi;
+ struct sbuf wbuf;
+ struct rangeDef *ranges;
+ unsigned char *codestr;
+ int i, j, count = 0;
+
+ if (!cmap || !CMap_is_valid(cmap)) {
+ WARN("Invalid CMap");
+ return NULL;
+ }
+
+ if (cmap->type == CMAP_TYPE_IDENTITY)
+ return NULL;
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+ stream_dict = pdf_stream_dict(stream);
+
+ csi = CMap_get_CIDSysInfo(cmap);
+ if (!csi) {
+ csi = (cmap->type != CMAP_TYPE_TO_UNICODE) ?
+ &CSI_IDENTITY : &CSI_UNICODE;
+ }
+
+ if (cmap->type != CMAP_TYPE_TO_UNICODE) {
+ pdf_obj *csi_dict;
+
+ csi_dict = pdf_new_dict();
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Registry"),
+ pdf_new_string(csi->registry, strlen(csi->registry)));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Ordering"),
+ pdf_new_string(csi->ordering, strlen(csi->ordering)));
+ pdf_add_dict(csi_dict,
+ pdf_new_name("Supplement"),
+ pdf_new_number(csi->supplement));
+
+ pdf_add_dict(stream_dict,
+ pdf_new_name("Type"),
+ pdf_new_name("CMap"));
+ pdf_add_dict(stream_dict,
+ pdf_new_name("CMapName"),
+ pdf_new_name(cmap->name));
+ pdf_add_dict(stream_dict,
+ pdf_new_name("CIDSystemInfo"), csi_dict);
+ if (cmap->wmode != 0)
+ pdf_add_dict(stream_dict,
+ pdf_new_name("WMode"),
+ pdf_new_number(cmap->wmode));
+ }
+
+ /* TODO:
+ * Predefined CMaps need not to be embedded.
+ */
+ if (cmap->useCMap) {
+ ERROR("UseCMap found (not supported yet)...");
+ if (CMap_is_Identity(cmap->useCMap)) { /* not sure */
+ if (CMap_get_wmode(cmap) == 1) {
+ pdf_add_dict(stream_dict,
+ pdf_new_name("UseCMap"),
+ pdf_new_name("Identity-V"));
+ } else {
+ pdf_add_dict(stream_dict,
+ pdf_new_name("UseCMap"),
+ pdf_new_name("Identity-H"));
+ }
+ } else {
+ long res_id;
+ pdf_obj *ucmap_ref;
+
+ res_id = pdf_findresource("CMap", CMap_get_name(cmap->useCMap));
+ if (res_id >= 0) {
+ ucmap_ref = pdf_get_resource_reference(res_id);
+ } else {
+ pdf_obj *ucmap_obj;
+
+ ucmap_obj = CMap_create_stream(cmap->useCMap, 0);
+ if (!ucmap_obj) {
+ ERROR("Uh ah. I cannot continue...");
+ }
+
+ res_id = pdf_defineresource("CMap",
+ CMap_get_name(cmap->useCMap),
+ ucmap_obj, PDF_RES_FLUSH_IMMEDIATE);
+ ucmap_ref = pdf_get_resource_reference(res_id);
+ }
+ pdf_add_dict(stream_dict, pdf_new_name("UseCMap"), ucmap_ref);
+ }
+ }
+
+#define WBUF_SIZE 4096
+ wbuf.buf = NEW(WBUF_SIZE, char);
+ codestr = NEW(cmap->profile.maxBytesIn, unsigned char);
+ memset(codestr, 0, cmap->profile.maxBytesIn);
+
+ wbuf.curptr = wbuf.buf;
+ wbuf.limptr = wbuf.buf + WBUF_SIZE -
+ 2 * (cmap->profile.maxBytesIn + cmap->profile.maxBytesOut) + 16;
+
+ /* Start CMap */
+ pdf_add_stream(stream, (void *) CMAP_BEGIN, strlen(CMAP_BEGIN));
+
+ wbuf.curptr += sprintf(wbuf.curptr, "/CMapName /%s def\n", cmap->name);
+ wbuf.curptr += sprintf(wbuf.curptr, "/CMapType %d def\n" , cmap->type);
+ if (cmap->wmode != 0 &&
+ cmap->type != CMAP_TYPE_TO_UNICODE)
+ wbuf.curptr += sprintf(wbuf.curptr, "/WMode %d def\n", cmap->wmode);
+
+#define CMAP_CSI_FMT "/CIDSystemInfo <<\n\
+ /Registry (%s)\n\
+ /Ordering (%s)\n\
+ /Supplement %d\n\
+>> def\n"
+ wbuf.curptr += sprintf(wbuf.curptr, CMAP_CSI_FMT,
+ csi->registry, csi->ordering, csi->supplement);
+ pdf_add_stream(stream, wbuf.buf, (long)(wbuf.curptr - wbuf.buf));
+ wbuf.curptr = wbuf.buf;
+
+ /* codespacerange */
+ ranges = cmap->codespace.ranges;
+ wbuf.curptr += sprintf(wbuf.curptr,
+ "%d begincodespacerange\n", cmap->codespace.num);
+ for (i = 0; i < cmap->codespace.num; i++) {
+ *(wbuf.curptr)++ = '<';
+ for (j = 0; j < ranges[i].dim; j++) {
+ sputx(ranges[i].codeLo[j], &(wbuf.curptr), wbuf.limptr);
+ }
+ *(wbuf.curptr)++ = '>';
+ *(wbuf.curptr)++ = ' ';
+ *(wbuf.curptr)++ = '<';
+ for (j = 0; j < ranges[i].dim; j++) {
+ sputx(ranges[i].codeHi[j], &(wbuf.curptr), wbuf.limptr);
+ }
+ *(wbuf.curptr)++ = '>';
+ *(wbuf.curptr)++ = '\n';
+ }
+ pdf_add_stream(stream, wbuf.buf, (long)(wbuf.curptr - wbuf.buf));
+ wbuf.curptr = wbuf.buf;
+ pdf_add_stream(stream,
+ "endcodespacerange\n", strlen("endcodespacerange\n"));
+
+ /* CMap body */
+ if (cmap->mapTbl) {
+ count = write_map(cmap->mapTbl,
+ 0, codestr, 0, &wbuf, stream); /* Top node */
+ if (count > 0) { /* Flush */
+ char fmt_buf[32];
+ if (count > 100)
+ ERROR("Unexpected error....: %d", count);
+ sprintf(fmt_buf, "%d beginbfchar\n", count);
+ pdf_add_stream(stream, fmt_buf, strlen(fmt_buf));
+ pdf_add_stream(stream,
+ wbuf.buf, (long) (wbuf.curptr - wbuf.buf));
+ pdf_add_stream(stream,
+ "endbfchar\n", strlen("endbfchar\n"));
+ count = 0;
+ wbuf.curptr = wbuf.buf;
+ }
+ }
+ /* End CMap */
+ pdf_add_stream(stream, CMAP_END, strlen(CMAP_END));
+
+ RELEASE(codestr);
+ RELEASE(wbuf.buf);
+
+ return stream;
+}
+
+#if 0
+/* Not completed yet */
+
+static int
+add_inverse_map (CMap *icmap, mapDef *mtab,
+ unsigned char *codestr, int depth,
+ unsigned char *used_slot)
+{
+ CID cid;
+ int c;
+ mapDef *mtab1;
+
+ for (c = 0; c < 256; c++) {
+ codestr[depth] = (unsigned char) (c & 0xff);
+ if (LOOKUP_CONTINUE(mtab[c].flag)) {
+ mtab1 = mtab[c].next;
+ add_inverse_map(icmap, mtab1, codestr, depth + 1, used_slot);
+ } else {
+ if (MAP_DEFINED(mtab[c].flag)) {
+ switch (MAP_TYPE(mtab[c].flag)) {
+ /* We should restrict it to to-CID mapping.
+ * However...
+ */
+ case MAP_IS_CID: case MAP_IS_CODE:
+ if (mtab[c].len == 2) {
+ cid = (mtab[c].code[0] << 8)|mtab[c].code[1];
+#ifndef is_used_char2
+#define is_used_char2(b,c) (((b)[(c)/8]) & (1 << (7-((c)%8))))
+#endif
+ if (!used_slot ||
+ is_used_char2(used_slot, cid)) {
+ CMap_add_bfchar(icmap,
+ mtab[c].code, mtab[c].len,
+ codestr, depth + 1);
+ }
+ }
+ break;
+ case MAP_IS_NAME:
+ ERROR("%s: Unexpected error...", CMAP_DEBUG_STR);
+ break;
+ case MAP_IS_NOTDEF:
+ break;
+ default:
+ ERROR("%s: Unknown mapping type: %d",
+ CMAP_DEBUG_STR, MAP_TYPE(mtab[c].flag));
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int
+add_map (CMap *cmap, mapDef *mtab,
+ unsigned char *codestr, int depth)
+{
+ int c;
+ mapDef *mtab1;
+
+ for (c = 0; c < 256; c++) {
+ codestr[depth] = (unsigned char) (c & 0xff);
+ if (LOOKUP_CONTINUE(mtab[c].flag)) {
+ mtab1 = mtab[c].next;
+ add_map(cmap, mtab1, codestr, depth + 1);
+ } else {
+ if (MAP_DEFINED(mtab[c].flag)) {
+ switch (MAP_TYPE(mtab[c].flag)) {
+ case MAP_IS_CID: case MAP_IS_CODE:
+ CMap_add_bfchar(cmap,
+ codestr, depth + 1,
+ mtab[c].code, mtab[c].len);
+ break;
+ case MAP_IS_NAME:
+ ERROR("%s: Unexpected error...", CMAP_DEBUG_STR);
+ break;
+ case MAP_IS_NOTDEF:
+ break;
+ default:
+ ERROR("%s: Unknown mapping type: %d",
+ CMAP_DEBUG_STR, MAP_TYPE(mtab[c].flag));
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+static CMap *
+invert_cmap (CMap *cmap, unsigned char *used_slot)
+{
+ CMap *icmap;
+ unsigned char *codestr;
+ unsigned char range_min[2] = {0x00, 0x00}; /* CID */
+ unsigned char range_max[2] = {0xff, 0xfe}; /* CID */
+
+ cmap = flatten_cmap(cmap);
+ ASSERT(cmap);
+
+ icmap = CMap_new();
+ CMap_set_type(icmap, CMAP_TYPE_CID_TO_CODE);
+ CMap_add_codespacerange(icmap, range_min, range_max, 2);
+
+ if (cmap->mapTbl) {
+ codestr = NEW(cmap->profile.maxBytesIn, unsigned char);
+ memset(codestr, 0, cmap->profile.maxBytesIn);
+ add_inverse_map(icmap, cmap->mapTbl,
+ codestr, 0, used_slot); /* top node */
+ RELEASE(codestr);
+ }
+
+ CMap_release(cmap);
+
+ return icmap;
+}
+
+static CMap *
+flatten_cmap (CMap *cmap)
+{
+ CMap *fcmap;
+ rangeDef *range;
+ int i;
+
+ ASSERT(cmap);
+
+ fcmap = CMap_new();
+
+ for (i = 0; i < cmap->codespace.num; i++) {
+ range = &(cmap->codespace.ranges[i]);
+ CMap_add_codespacerange(fcmap, range->codeLo, range->codeHi, range->dim);
+ }
+ CMap_set_CIDSysInfo(fcmap, cmap->CSI);
+ CMap_set_type (fcmap, cmap->type );
+ CMap_set_wmode(fcmap, cmap->wmode);
+
+ fcmap->flags = cmap->flags;
+ fcmap->version = cmap->version;
+
+ while (cmap) {
+ if (cmap->mapTbl) {
+ unsigned char *codestr;
+
+ codestr = NEW(cmap->profile.maxBytesIn, unsigned char);
+ memset(codestr, 0, cmap->profile.maxBytesIn);
+ add_map(fcmap, cmap->mapTbl, codestr, 0); /* top node */
+ RELEASE(codestr);
+ }
+ cmap = cmap->useCMap;
+ }
+
+ return fcmap;
+}
+
+pdf_obj *
+CMap_ToCode_stream (CMap *cmap, const char *cmap_name,
+ CIDSysInfo *csi, int cmap_type,
+ unsigned char *used_slot, int flags)
+{
+ pdf_obj *stream = NULL;
+ CMap *icmap;
+
+ ASSERT(cmap && cmap_name);
+
+ if (cmap->type !=
+ CMAP_TYPE_CODE_TO_CID)
+ return NULL;
+
+ icmap = invert_cmap(cmap, used_slot);
+ if (icmap) {
+ CMap_set_name(icmap, cmap_name);
+ if (csi)
+ CMap_set_CIDSysInfo(icmap, csi);
+ else {
+ CMap_set_CIDSysInfo(icmap, &(CSI_IDENTITY));
+ }
+ CMap_set_type(icmap, cmap_type);
+
+ stream = CMap_create_stream(icmap, flags);
+
+ CMap_release(icmap);
+ }
+
+ return stream;
+}
+#endif /* 0 */
diff --git a/Build/source/texk/xdvipdfmx/src/cmap_write.h b/Build/source/texk/xdvipdfmx/src/cmap_write.h
new file mode 100644
index 00000000000..fcb95e0ec95
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cmap_write.h
@@ -0,0 +1,35 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cmap_write.h,v 1.1 2004/08/08 15:16:01 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CMAP_WRITE_H_
+#define _CMAP_WRITE_H_
+
+#include "cmap.h"
+
+extern pdf_obj *CMap_create_stream (CMap *cmap, int flags);
+extern pdf_obj *CMap_ToCode_stream (CMap *cmap, const char *cmap_name,
+ CIDSysInfo *csi, int cmap_type,
+ unsigned char *used_slot, int flags);
+
+#endif /* _CMAP_WRITE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/cs_type2.c b/Build/source/texk/xdvipdfmx/src/cs_type2.c
new file mode 100644
index 00000000000..5c7e3d56867
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cs_type2.c
@@ -0,0 +1,807 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cs_type2.c,v 1.10 2004/02/15 12:59:43 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * Type 2 Charstring support:
+ * Decode and encode Type 2 charstring
+ *
+ * All local/global subroutine calls in a given charstring is replace by the
+ * content of subroutine charstrings. We do this because some PostScript RIP
+ * may have problems with sparse subroutine array. Workaround for this is to
+ * re-order subroutine array so that no gap appears in the subroutine array,
+ * or put dummy charstrings that contains only `return' in the gap. However,
+ * re-ordering of subroutine is rather difficult for Type 2 charstrings due
+ * to the bias which depends on the total number of subroutines. Replacing
+ * callgsubr/callsubr calls with the content of the corresponding subroutine
+ * charstring may be more efficient than putting dummy subroutines in the
+ * case of subsetted font. Adobe distiller seems doing same thing.
+ *
+ * And also note that subroutine numbers within subroutines can depend on the
+ * content of operand stack as follows:
+ *
+ * ... l m callsubr << subr #(m+bias): n add callsubr >> ...
+ *
+ * I've not implemented the `random' operator which generates a pseudo-random
+ * number in the range (0, 1] and push them into argument stack.
+ * How pseudo-random sequences are generated is not documented in the Type 2
+ * charstring spec..
+ */
+
+#include <stdio.h>
+
+/* fabs, sqrt ... */
+#include <math.h>
+
+#include "error.h"
+
+/* data types, limits */
+#include "cff_types.h"
+#include "cff_limits.h"
+
+#include "cs_type2.h"
+
+#define CS_TYPE2_DEBUG_STR "Type2 Charstring Parser"
+#define CS_TYPE2_DEBUG 5
+
+/* decoder/encoder status codes */
+#define CS_BUFFER_ERROR -3
+#define CS_STACK_ERROR -2
+#define CS_PARSE_ERROR -1
+#define CS_PARSE_OK 0
+#define CS_PARSE_END 1
+#define CS_SUBR_RETURN 2
+#define CS_CHAR_END 3
+
+static int status = CS_PARSE_ERROR;
+
+#define DST_NEED(a,b) {if ((a) < (b)) { status = CS_BUFFER_ERROR ; return ; }}
+#define SRC_NEED(a,b) {if ((a) < (b)) { status = CS_PARSE_ERROR ; return ; }}
+#define NEED(a,b) {if ((a) < (b)) { status = CS_STACK_ERROR ; return ; }}
+
+/* hintmask and cntrmask need number of stem zones */
+static int num_stems = 0;
+static int phase = 0;
+
+/* subroutine nesting */
+static int nest = 0;
+
+/* advance width */
+static int have_width = 0;
+static double width = 0.0;
+
+/*
+ * Standard Encoding Accented Characters:
+ * Optional four arguments for endchar. See, CFF spec., p.35.
+ * This is obsolete feature and is no longer supported.
+ */
+#if 0
+/* adx ady bchar achar endchar */
+static double seac[4] = {0.0, 0.0, 0.0, 0.0};
+#endif
+
+/* Operand stack and Transient array */
+static int stack_top = 0;
+static double arg_stack[CS_ARG_STACK_MAX];
+static double trn_array[CS_TRANS_ARRAY_MAX];
+
+/*
+ * Type 2 CharString encoding
+ */
+
+/*
+ * 1-byte CharString operaotrs:
+ * cs_escape is first byte of two-byte operator
+ */
+
+/* RESERVED 0 */
+#define cs_hstem 1
+/* RESERVED 2 */
+#define cs_vstem 3
+#define cs_vmoveto 4
+#define cs_rlineto 5
+#define cs_hlineto 6
+#define cs_vlineto 7
+#define cs_rrcurveto 8
+/* cs_closepath 9 : TYPE1 */
+#define cs_callsubr 10
+#define cs_return 11
+#define cs_escape 12
+/* cs_hsbw 13 : TYPE1 */
+#define cs_endchar 14
+/* RESERVED 15 */
+/* RESERVED 16 */
+/* RESERVED 17 */
+#define cs_hstemhm 18
+#define cs_hintmask 19
+#define cs_cntrmask 20
+#define cs_rmoveto 21
+#define cs_hmoveto 22
+#define cs_vstemhm 23
+#define cs_rcurveline 24
+#define cs_rlinecurve 25
+#define cs_vvcurveto 26
+#define cs_hhcurveto 27
+/* SHORTINT 28 : first byte of shortint*/
+#define cs_callgsubr 29
+#define cs_vhcurveto 30
+#define cs_hvcurveto 31
+
+/*
+ * 2-byte CharString operaotrs:
+ * "dotsection" is obsoleted in Type 2 charstring.
+ */
+
+#define cs_dotsection 0
+/* cs_vstem3 1 : TYPE1 */
+/* cs_hstem3 2 : TYPE1 */
+#define cs_and 3
+#define cs_or 4
+#define cs_not 5
+/* cs_seac 6 : TYPE1 */
+/* cs_sbw 7 : TYPE1 */
+/* RESERVED 8 */
+#define cs_abs 9
+#define cs_add 10
+#define cs_sub 11
+#define cs_div 12
+/* RESERVED 13 */
+#define cs_neg 14
+#define cs_eq 15
+/* cs_callothersubr 16 : TYPE1 */
+/* cs_pop 17 : TYPE1 */
+#define cs_drop 18
+/* RESERVED 19 */
+#define cs_put 20
+#define cs_get 21
+#define cs_ifelse 22
+#define cs_random 23
+#define cs_mul 24
+/* RESERVED 25 */
+#define cs_sqrt 26
+#define cs_dup 27
+#define cs_exch 28
+#define cs_index 29
+#define cs_roll 30
+/* cs_setcurrentpoint 31 : TYPE1 */
+/* RESERVED 32 */
+/* RESERVED 33 */
+#define cs_hflex 34
+#define cs_flex 35
+#define cs_hflex1 36
+#define cs_flex1 37
+
+/*
+ * clear_stack() put all operands sotred in operand stack to dest.
+ */
+static void
+clear_stack (card8 **dest, card8 *limit)
+{
+ int i;
+
+ for (i = 0; i < stack_top; i++) {
+ double value;
+ long ivalue;
+ value = arg_stack[i];
+ /* Nearest integer value */
+ ivalue = (long) floor(value+0.5);
+ if (value >= 0x8000L || value <= (-0x8000L - 1)) {
+ /*
+ * This number cannot be represented as a single operand.
+ * We must use `a b mul ...' or `a c div' to represent large values.
+ */
+ ERROR("%s: Argument value too large. (This is bug)", CS_TYPE2_DEBUG_STR);
+ } else if (fabs(value - ivalue) > 3.0e-5) {
+ /* 16.16-bit signed fixed value */
+ DST_NEED(limit, *dest + 5);
+ *(*dest)++ = 255;
+ ivalue = (long) floor(value); /* mantissa */
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ ivalue = (long)((value - ivalue) * 0x10000l); /* fraction */
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ /* Everything else are integers. */
+ } else if (ivalue >= -107 && ivalue <= 107) {
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = ivalue + 139;
+ } else if (ivalue >= 108 && ivalue <= 1131) {
+ DST_NEED(limit, *dest + 2);
+ ivalue = 0xf700u + ivalue - 108;
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ } else if (ivalue >= -1131 && ivalue <= -108) {
+ DST_NEED(limit, *dest + 2);
+ ivalue = 0xfb00u - ivalue - 108;
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ } else if (ivalue >= -32768 && ivalue <= 32767) { /* shortint */
+ DST_NEED(limit, *dest + 3);
+ *(*dest)++ = 28;
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = (ivalue) & 0xff;
+ } else { /* Shouldn't come here */
+ ERROR("%s: Unexpected error.", CS_TYPE2_DEBUG_STR);
+ }
+ }
+
+ stack_top = 0; /* clear stack */
+
+ return;
+}
+
+/*
+ * Single byte operators:
+ * Path construction, Operator for finishing a path, Hint operators.
+ *
+ * phase:
+ * 0: inital state
+ * 1: hint declaration, first stack-clearing operator appeared
+ * 2: in path construction
+ */
+
+static void
+do_operator1 (card8 **dest, card8 *limit, card8 **data, card8 *endptr)
+{
+ card8 op = **data;
+
+ *data += 1;
+
+ switch (op) {
+ case cs_hstemhm:
+ case cs_vstemhm:
+ /* charstring may have hintmask if above operator have seen */
+ case cs_hstem:
+ case cs_vstem:
+ if (phase == 0 && (stack_top % 2)) {
+ have_width = 1;
+ width = arg_stack[0];
+ }
+ num_stems += stack_top/2;
+ clear_stack(dest, limit);
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = op;
+ phase = 1;
+ break;
+ case cs_hintmask:
+ case cs_cntrmask:
+ if (phase < 2) {
+ if (phase == 0 && (stack_top % 2)) {
+ have_width = 1;
+ width = arg_stack[0];
+ }
+ num_stems += stack_top/2;
+ }
+ clear_stack(dest, limit);
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = op;
+ if (num_stems > 0) {
+ int masklen = (num_stems + 7) / 8;
+ DST_NEED(limit, *dest + masklen);
+ SRC_NEED(endptr, *data + masklen);
+ memmove(*dest, *data, masklen);
+ *data += masklen;
+ *dest += masklen;
+ }
+ phase = 2;
+ break;
+ case cs_rmoveto:
+ if (phase == 0 && (stack_top % 2)) {
+ have_width = 1;
+ width = arg_stack[0];
+ }
+ clear_stack(dest, limit);
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = op;
+ phase = 2;
+ break;
+ case cs_hmoveto:
+ case cs_vmoveto:
+ if (phase == 0 && (stack_top % 2) == 0) {
+ have_width = 1;
+ width = arg_stack[0];
+ }
+ clear_stack(dest, limit);
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = op;
+ phase = 2;
+ break;
+ case cs_endchar:
+ if (stack_top == 1) {
+ have_width = 1;
+ width = arg_stack[0];
+ clear_stack(dest, limit);
+ } else if (stack_top == 4 || stack_top == 5) {
+ WARN("\"seac\" character deprecated in Type 2 charstring.");
+ status = CS_PARSE_ERROR;
+ return;
+ } else if (stack_top > 0) {
+ WARN("%s: Operand stack not empty.", CS_TYPE2_DEBUG_STR);
+ }
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = op;
+ status = CS_CHAR_END;
+ break;
+ /* above oprators are candidate for first stack-clearing operator */
+ case cs_rlineto:
+ case cs_hlineto:
+ case cs_vlineto:
+ case cs_rrcurveto:
+ case cs_rcurveline:
+ case cs_rlinecurve:
+ case cs_vvcurveto:
+ case cs_hhcurveto:
+ case cs_vhcurveto:
+ case cs_hvcurveto:
+ if (phase < 2) {
+ WARN("%s: Broken Type 2 charstring.", CS_TYPE2_DEBUG_STR);
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ clear_stack(dest, limit);
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = op;
+ break;
+ /* all operotors above are stack-clearing operator */
+ /* no output */
+ case cs_return:
+ case cs_callgsubr:
+ case cs_callsubr:
+ ERROR("%s: Unexpected call(g)subr/return", CS_TYPE2_DEBUG_STR);
+ break;
+ default:
+ /* no-op ? */
+ WARN("%s: Unknown charstring operator: 0x%02x", CS_TYPE2_DEBUG_STR, op);
+ status = CS_PARSE_ERROR;
+ break;
+ }
+
+ return;
+}
+
+/*
+ * Double byte operators:
+ * Flex, arithmetic, conditional, and storage operators.
+ *
+ * Following operators are not supported:
+ * random: How random ?
+ */
+static void
+do_operator2 (card8 **dest, card8 *limit, card8 **data, card8 *endptr)
+{
+ card8 op;
+
+ *data += 1;
+
+ SRC_NEED(endptr, *data + 1);
+
+ op = **data;
+ *data += 1;
+
+ switch(op) {
+ case cs_dotsection: /* deprecated */
+ WARN("Operator \"dotsection\" deprecated in Type 2 charstring.");
+ status = CS_PARSE_ERROR;
+ return;
+ break;
+ case cs_hflex:
+ case cs_flex:
+ case cs_hflex1:
+ case cs_flex1:
+ if (phase < 2) {
+ WARN("%s: Broken Type 2 charstring.", CS_TYPE2_DEBUG_STR);
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ clear_stack(dest, limit);
+ DST_NEED(limit, *dest + 2);
+ *(*dest)++ = cs_escape;
+ *(*dest)++ = op;
+ break;
+ /* all operator above are stack-clearing */
+ /* no output */
+ case cs_and:
+ NEED(stack_top, 2);
+ stack_top--;
+ if (arg_stack[stack_top] && arg_stack[stack_top-1]) {
+ arg_stack[stack_top-1] = 1.0;
+ } else {
+ arg_stack[stack_top-1] = 0.0;
+ }
+ break;
+ case cs_or:
+ NEED(stack_top, 2);
+ stack_top--;
+ if (arg_stack[stack_top] || arg_stack[stack_top-1]) {
+ arg_stack[stack_top-1] = 1.0;
+ } else {
+ arg_stack[stack_top-1] = 0.0;
+ }
+ break;
+ case cs_not:
+ NEED(stack_top, 1);
+ if (arg_stack[stack_top-1]) {
+ arg_stack[stack_top-1] = 0.0;
+ } else {
+ arg_stack[stack_top-1] = 1.0;
+ }
+ break;
+ case cs_abs:
+ NEED(stack_top, 1);
+ arg_stack[stack_top-1] = fabs(arg_stack[stack_top-1]);
+ break;
+ case cs_add:
+ NEED(stack_top, 2);
+ arg_stack[stack_top-2] += arg_stack[stack_top-1];
+ stack_top--;
+ break;
+ case cs_sub:
+ NEED(stack_top, 2);
+ arg_stack[stack_top-2] -= arg_stack[stack_top-1];
+ stack_top--;
+ break;
+ case cs_div: /* doesn't check overflow */
+ NEED(stack_top, 2);
+ arg_stack[stack_top-2] /= arg_stack[stack_top-1];
+ stack_top--;
+ break;
+ case cs_neg:
+ NEED(stack_top, 1);
+ arg_stack[stack_top-1] *= -1.0;
+ break;
+ case cs_eq:
+ NEED(stack_top, 2);
+ stack_top--;
+ if (arg_stack[stack_top] == arg_stack[stack_top-1]) {
+ arg_stack[stack_top-1] = 1.0;
+ } else {
+ arg_stack[stack_top-1] = 0.0;
+ }
+ break;
+ case cs_drop:
+ NEED(stack_top, 1);
+ stack_top--;
+ break;
+ case cs_put:
+ NEED(stack_top, 2);
+ {
+ int idx = (int)arg_stack[--stack_top];
+ NEED(CS_TRANS_ARRAY_MAX, idx);
+ trn_array[idx] = arg_stack[--stack_top];
+ }
+ break;
+ case cs_get:
+ NEED(stack_top, 1);
+ {
+ int idx = (int)arg_stack[stack_top-1];
+ NEED(CS_TRANS_ARRAY_MAX, idx);
+ arg_stack[stack_top-1] = trn_array[idx];
+ }
+ break;
+ case cs_ifelse:
+ NEED(stack_top, 4);
+ stack_top -= 3;
+ if (arg_stack[stack_top+1] > arg_stack[stack_top+2]) {
+ arg_stack[stack_top-1] = arg_stack[stack_top];
+ }
+ break;
+ case cs_mul:
+ NEED(stack_top, 2);
+ arg_stack[stack_top-2] = arg_stack[stack_top-2] * arg_stack[stack_top-1];
+ stack_top--;
+ break;
+ case cs_sqrt:
+ NEED(stack_top, 1);
+ arg_stack[stack_top-1] = sqrt(arg_stack[stack_top-1]);
+ break;
+ case cs_dup:
+ NEED(stack_top, 1);
+ NEED(CS_ARG_STACK_MAX, stack_top+1);
+ arg_stack[stack_top] = arg_stack[stack_top-1];
+ stack_top++;
+ break;
+ case cs_exch:
+ NEED(stack_top, 2);
+ {
+ double save = arg_stack[stack_top-2];
+ arg_stack[stack_top-2] = arg_stack[stack_top-1];
+ arg_stack[stack_top-1] = save;
+ }
+ break;
+ case cs_index:
+ NEED(stack_top, 2); /* need two arguments at least */
+ {
+ int idx = (int)arg_stack[stack_top-1];
+ if (idx < 0) {
+ arg_stack[stack_top-1] = arg_stack[stack_top-2];
+ } else {
+ NEED(stack_top, idx+2);
+ arg_stack[stack_top-1] = arg_stack[stack_top-idx-2];
+ }
+ }
+ break;
+ case cs_roll:
+ NEED(stack_top, 2);
+ {
+ int N, J;
+ J = (int)arg_stack[--stack_top];
+ N = (int)arg_stack[--stack_top];
+ NEED(stack_top, N);
+ if (J > 0) {
+ J = J % N;
+ while (J-- > 0) {
+ double save = arg_stack[stack_top-1];
+ int i = stack_top - 1;
+ while (i > stack_top-N) {
+ arg_stack[i] = arg_stack[i-1];
+ i--;
+ }
+ arg_stack[i] = save;
+ }
+ } else {
+ J = (-J) % N;
+ while (J-- > 0) {
+ double save = arg_stack[stack_top-N];
+ int i = stack_top - N;
+ while (i < stack_top-1) {
+ arg_stack[i] = arg_stack[i+1];
+ i++;
+ }
+ arg_stack[i] = save;
+ }
+ }
+ }
+ break;
+ case cs_random:
+ WARN("%s: Charstring operator \"random\" found.", CS_TYPE2_DEBUG_STR);
+ NEED(CS_ARG_STACK_MAX, stack_top+1);
+ arg_stack[stack_top++] = 1.0;
+ break;
+ default:
+ /* no-op ? */
+ WARN("%s: Unknown charstring operator: 0x0c%02x", CS_TYPE2_DEBUG_STR, op);
+ status = CS_PARSE_ERROR;
+ break;
+ }
+
+ return;
+}
+
+/*
+ * integer:
+ * exactly the same as the DICT encoding (except 29)
+ */
+static void
+get_integer (card8 **data, card8 *endptr)
+{
+ long result = 0;
+ card8 b0 = **data, b1, b2;
+
+ *data += 1;
+
+ if (b0 == 28) { /* shortint */
+ SRC_NEED(endptr, *data + 2);
+ b1 = **data;
+ b2 = *(*data+1);
+ result = b1*256+b2;
+ if (result > 0x7fff)
+ result -= 0x10000L;
+ *data += 2;
+ } else if (b0 >= 32 && b0 <= 246) { /* int (1) */
+ result = b0 - 139;
+ } else if (b0 >= 247 && b0 <= 250) { /* int (2) */
+ SRC_NEED(endptr, *data + 1);
+ b1 = **data;
+ result = (b0-247)*256+b1+108;
+ *data += 1;
+ } else if (b0 >= 251 && b0 <= 254) {
+ SRC_NEED(endptr, *data + 1);
+ b1 = **data;
+ result = -(b0-251)*256-b1-108;
+ *data += 1;
+ } else {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+
+ NEED(CS_ARG_STACK_MAX, stack_top+1);
+ arg_stack[stack_top++] = (double) result;
+
+ return;
+}
+
+/*
+ * Signed 16.16-bits fixed number for Type 2 charstring encoding
+ */
+static void
+get_fixed (card8 **data, card8 *endptr)
+{
+ long ivalue;
+ double rvalue;
+
+ *data += 1;
+
+ SRC_NEED(endptr, *data + 4);
+
+ ivalue = *(*data) * 0x100 + *(*data+1);
+ rvalue = (ivalue > 0x7fffL) ? (ivalue - 0x10000L) : ivalue;
+ ivalue = *(*data+2) * 0x100 + *(*data+3);
+ rvalue += ((double) ivalue) / 0x10000L;
+
+ NEED(CS_ARG_STACK_MAX, stack_top+1);
+ arg_stack[stack_top++] = rvalue;
+ *data += 4;
+
+ return;
+}
+
+/*
+ * Subroutines:
+ * The bias for subroutine number is introduced in type 2 charstrings.
+ *
+ * subr: set to a pointer to the subroutine charstring.
+ * len: set to the length of subroutine charstring.
+ * subr_idx: CFF INDEX data that contains subroutines.
+ * id: biased subroutine number.
+ */
+static void
+get_subr (card8 **subr, long *len, cff_index *subr_idx, long id)
+{
+ card16 count;
+
+ if (subr_idx == NULL)
+ ERROR("%s: Subroutine called but no subroutine found.", CS_TYPE2_DEBUG_STR);
+
+ count = subr_idx->count;
+
+ /* Adding bias number */
+ if (count < 1240) {
+ id += 107;
+ } else if (count < 33900) {
+ id += 1131;
+ } else {
+ id += 32768;
+ }
+
+ if (id > count)
+ ERROR("%s: Invalid Subr index: %ld (max=%u)", CS_TYPE2_DEBUG_STR, id, count);
+
+ *len = (subr_idx->offset)[id + 1] - (subr_idx->offset)[id];
+ *subr = subr_idx->data + (subr_idx->offset)[id] - 1;
+
+ return;
+}
+
+/*
+ * NOTE:
+ * The Type 2 interpretation of a number encoded in five-bytes (those with
+ * an initial byte value of 255) differs from how it is interpreted in the
+ * Type 1 format.
+ */
+
+static void
+do_charstring (card8 **dest, card8 *limit,
+ card8 **data, card8 *endptr,
+ cff_index *gsubr_idx, cff_index *subr_idx)
+{
+ card8 b0 = 0, *subr;
+ long len;
+
+ if (nest > CS_SUBR_NEST_MAX)
+ ERROR("%s: Subroutine nested too deeply.", CS_TYPE2_DEBUG_STR);
+
+ nest++;
+
+ while (*data < endptr && status == CS_PARSE_OK) {
+ b0 = **data;
+ if (b0 == 255) { /* 16-bit.16-bit fixed signed number */
+ get_fixed(data, endptr);
+ } else if (b0 == cs_return) {
+ status = CS_SUBR_RETURN;
+ } else if (b0 == cs_callgsubr) {
+ if (stack_top < 1) {
+ status = CS_STACK_ERROR;
+ } else {
+ stack_top--;
+ get_subr(&subr, &len, gsubr_idx, (long) arg_stack[stack_top]);
+ if (*dest + len > limit)
+ ERROR("%s: Possible buffer overflow.", CS_TYPE2_DEBUG_STR);
+ do_charstring(dest, limit, &subr, subr + len,
+ gsubr_idx, subr_idx);
+ *data += 1;
+ }
+ } else if (b0 == cs_callsubr) {
+ if (stack_top < 1) {
+ status = CS_STACK_ERROR;
+ } else {
+ stack_top--;
+ get_subr(&subr, &len, subr_idx, (long) arg_stack[stack_top]);
+ if (limit < *dest + len)
+ ERROR("%s: Possible buffer overflow.", CS_TYPE2_DEBUG_STR);
+ do_charstring(dest, limit, &subr, subr + len,
+ gsubr_idx, subr_idx);
+ *data += 1;
+ }
+ } else if (b0 == cs_escape) {
+ do_operator2(dest, limit, data, endptr);
+ } else if (b0 < 32 && b0 != 28) { /* 19, 20 need mask */
+ do_operator1(dest, limit, data, endptr);
+ } else if ((b0 <= 22 && b0 >= 27) || b0 == 31) { /* reserved */
+ status = CS_PARSE_ERROR; /* not an error ? */
+ } else { /* integer */
+ get_integer(data, endptr);
+ }
+ }
+
+ if (status == CS_SUBR_RETURN) {
+ status = CS_PARSE_OK;
+ } else if (status == CS_CHAR_END && *data < endptr) {
+ WARN("%s: Garbage after endchar.", CS_TYPE2_DEBUG_STR);
+ } else if (status < CS_PARSE_OK) { /* error */
+ ERROR("%s: Parsing charstring failed: (status=%d, stack=%d)",
+ CS_TYPE2_DEBUG_STR, status, stack_top);
+ }
+
+ nest--;
+
+ return;
+}
+
+static void
+cs_parse_init (void)
+{
+ status = CS_PARSE_OK;
+ nest = 0;
+ phase = 0;
+ num_stems = 0;
+ stack_top = 0;
+}
+
+/*
+ * Not just copying...
+ */
+long
+cs_copy_charstring (card8 *dst, long dstlen,
+ card8 *src, long srclen,
+ cff_index *gsubr, cff_index *subr,
+ double default_width, double nominal_width, cs_ginfo *ginfo)
+{
+ card8 *save = dst;
+
+ cs_parse_init();
+
+ width = 0.0;
+ have_width = 0;
+
+ /* expand call(g)subrs */
+ do_charstring(&dst, dst + dstlen, &src, src + srclen, gsubr, subr);
+
+ if (ginfo) {
+ ginfo->flags = 0; /* not used */
+ if (have_width) {
+ ginfo->wx = nominal_width + width;
+ } else {
+ ginfo->wx = default_width;
+ }
+ }
+
+ return (long)(dst - save);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/cs_type2.h b/Build/source/texk/xdvipdfmx/src/cs_type2.h
new file mode 100644
index 00000000000..ab489159873
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/cs_type2.h
@@ -0,0 +1,45 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/cs_type2.h,v 1.4 2004/02/15 12:59:43 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _CS_TYPE2_H_
+#define _CS_TYPE2_H_
+
+#include "cff_types.h"
+
+typedef struct {
+ int flags; /* unused in Type 2 charstring */
+ double wx, wy;
+ struct {
+ double llx, lly, urx, ury;
+ } bbox;
+ struct {
+ double asb, adx, ady;
+ card8 bchar, achar;
+ } seac; /* unused in Type 2 charstring */
+} cs_ginfo;
+
+extern long cs_copy_charstring (card8 *dest, long destlen,
+ card8 *src, long srclen,
+ cff_index *gsubr, cff_index *subr,
+ double default_width, double nominal_width, cs_ginfo *ginfo);
+
+#endif /* _CS_TYPE2_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dpxconf.c b/Build/source/texk/xdvipdfmx/src/dpxconf.c
new file mode 100644
index 00000000000..9004573228e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxconf.c
@@ -0,0 +1,110 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxconf.c,v 1.1 2005/07/20 10:41:54 hirata Exp $
+
+ This is DVIPDFMx, an eXtended version of DVIPDFM by Mark A. Wicks.
+
+ Copyright (C) 2002-2003 by Jin-Hwan Cho and Shunsaku Hirata,
+ the DVIPDFMx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxconf.h"
+
+#ifndef HAVE_LIBPAPER
+const struct paper paperspecs[] = {
+ {"letter", 612.00, 792.00},
+ {"legal" , 612.00, 1008.00},
+ {"ledger", 1224.00, 792.00},
+ {"tabloid", 792.00, 1224.00},
+ {"a6", 297.64, 420.91},
+ {"a5", 420.91, 595.27},
+ {"a4", 595.27, 841.82},
+ {"a3", 841.82, 1190.16},
+ /*
+ * The B series paper formats were first introduced in Japanese
+ * patch (jpatch). The size of b6, ..., b5var paper is JIS paper
+ * size for this reason. Please modify the following line or use
+ * libpaper if you need ISO paper sizes.
+ */
+#if defined(USE_ISO_PAPERSIZE) || defined(ISO_PAPERSIZE)
+ {"b6", 354, 499},
+ {"b5", 501, 709},
+ {"b4", 709, 1002},
+ {"b3", 1002, 1418},
+#else
+ {"b6", 364.25, 515.91},
+ {"b5", 515.91, 728.50},
+ {"b4", 728.50, 1031.81},
+ {"b3", 1031.81, 1457.00},
+ {"b5var", 515.91, 651.97},
+#endif /* USE_ISO_PAPERSIZE */
+ /* Alias for JIS and ISO */
+ {"jisb6", 364.25, 515.91},
+ {"jisb5", 515.91, 728.50},
+ {"jisb4", 728.50, 1031.81},
+ {"jisb3", 1031.81, 1457.00},
+ {"isob6", 354, 499},
+ {"isob5", 501, 709},
+ {"isob4", 709, 1002},
+ {"isob3", 1002, 1418},
+ /* -- */
+ {NULL, 0, 0},
+};
+
+const struct paper *
+paperinfo (const char *ppformat)
+{
+ const struct paper *ppinfo;
+
+ if (!ppformat)
+ return NULL;
+
+ ppinfo = paperfirst();
+ while (ppinfo && papername(ppinfo)) {
+ if (!strcmp(ppformat, papername(ppinfo)))
+ break;
+ ppinfo = papernext(ppinfo);
+ }
+
+ return ((ppinfo && papername(ppinfo)) ? ppinfo : NULL);
+}
+
+#endif /* HAVE_LIBPAPER */
+
+void
+dumppaperinfo (void)
+{
+ const struct paper *ppinfo;
+ ppinfo = paperfirst();
+ while (ppinfo && papername(ppinfo)) {
+ double wd, ht;
+ wd = paperpswidth (ppinfo);
+ ht = paperpsheight(ppinfo);
+ fprintf(stdout, "%s: %.2f %.2f (%.2fmm %.2fmm)\n",
+ papername(ppinfo), wd, ht, 25.4 * wd / 72.0, 25.4 * ht / 72.0);
+ ppinfo = papernext(ppinfo);
+ }
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/dpxconf.h b/Build/source/texk/xdvipdfmx/src/dpxconf.h
new file mode 100644
index 00000000000..8e097d93533
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxconf.h
@@ -0,0 +1,60 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxconf.h,v 1.1 2005/07/20 10:41:54 hirata Exp $
+
+ This is DVIPDFMx, an eXtended version of DVIPDFM by Mark A. Wicks.
+
+ Copyright (C) 2002-2003 by Jin-Hwan Cho and Shunsaku Hirata,
+ the DVIPDFMx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _DPXCONF_H_
+#define _DPXCONF_H_
+
+#ifdef HAVE_LIBPAPER
+#include <paper.h>
+#else
+struct paper {
+ const char* name;
+ double pswidth, psheight;
+};
+
+#ifndef DEFAULT_PAPER_NAME
+#define DEFAULT_PAPER_NAME "a4"
+#endif
+
+extern const struct paper paperspecs[];
+extern const struct paper *paperinfo (const char *ppformat);
+
+#define paperinit()
+#define paperdone()
+#define paperpswidth(p) (((p) && (p)->name) ? p->pswidth : 0.0)
+#define paperpsheight(p) (((p) && (p)->name) ? p->psheight : 0.0)
+#define papername(p) (((p) && (p)->name) ? p->name : NULL)
+#define paperfirst() &(paperspecs[0])
+#define papernext(p) ((((p)+1) && ((p)+1)->name) ? (p+1) : NULL)
+
+#define defaultpapername() DEFAULT_PAPER_NAME
+#define systempapername() DEFAULT_PAPER_NAME
+
+#define defaultpapersizefile() NULL
+#define systempapersizefile() NULL
+#endif /* HAVE_LIBPAPER */
+
+extern void dumppaperinfo (void);
+
+#endif /* _DPXCONF_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dpxcrypt.c b/Build/source/texk/xdvipdfmx/src/dpxcrypt.c
new file mode 100644
index 00000000000..36174f28e6f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxcrypt.c
@@ -0,0 +1,366 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxcrypt.c,v 1.2 2004/07/27 12:08:46 hirata Exp $
+
+ This is DVIPDFMx, an eXtended version of DVIPDFM by Mark A. Wicks.
+
+ Copyright (C) 2003 by Jin-Hwan Cho and Shunsaku Hirata,
+ the DVIPDFMx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "dpxcrypt.h"
+
+static void _gcry_burn_stack (int bytes)
+{
+ char buf[64];
+
+ memset(buf, 0, sizeof buf);
+ bytes -= sizeof buf;
+ if (bytes > 0) _gcry_burn_stack(bytes);
+}
+
+/* Rotate a 32 bit integer by n bytes */
+#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+
+/*
+ * The following codes for MD5 Message-Digest Algorithm were modified
+ * by Jin-Hwan Cho on August 5, 2003 based on libgrypt-1.1.42.
+ *
+ * Copyright (C) 1995,1996,1998,1999,2001,2002,2003 Free Software Foundation, Inc.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * According to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc.
+ * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+ * heavily modified for GnuPG by Werner Koch <wk@gnupg.org>
+ */
+
+void MD5_init (MD5_CONTEXT *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->nblocks = 0;
+ ctx->count = 0;
+}
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ * and defined in the RFC 1321. The first function is a little bit optimized
+ * (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF(d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* transform n*64 bytes */
+static void transform (MD5_CONTEXT *ctx, unsigned char *data)
+{
+ unsigned long correct_words[16];
+ register unsigned long A = ctx->A;
+ register unsigned long B = ctx->B;
+ register unsigned long C = ctx->C;
+ register unsigned long D = ctx->D;
+ unsigned long *cwp = correct_words;
+
+#ifdef WORDS_BIGENDIAN
+ { int i; unsigned char *p1, *p2;
+ for (i = 0, p1 = data, p2 = (unsigned char *)correct_words; i < 16; i++, p2 += 4 ) {
+ p2[3] = *p1++; p2[2] = *p1++; p2[1] = *p1++; p2[0] = *p1++;
+ }
+ }
+#else
+ memcpy(correct_words, data, 64);
+#endif
+
+#define OP(a, b, c, d, s, T) \
+ do { a += FF(b, c, d) + (*cwp++) + T; a = rol(a, s); a += b; } while (0)
+
+ /* Before we start, one word about the strange constants.
+ * They are defined in RFC 1321 as
+ *
+ * T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP(A, B, C, D, 7, 0xd76aa478);
+ OP(D, A, B, C, 12, 0xe8c7b756);
+ OP(C, D, A, B, 17, 0x242070db);
+ OP(B, C, D, A, 22, 0xc1bdceee);
+ OP(A, B, C, D, 7, 0xf57c0faf);
+ OP(D, A, B, C, 12, 0x4787c62a);
+ OP(C, D, A, B, 17, 0xa8304613);
+ OP(B, C, D, A, 22, 0xfd469501);
+ OP(A, B, C, D, 7, 0x698098d8);
+ OP(D, A, B, C, 12, 0x8b44f7af);
+ OP(C, D, A, B, 17, 0xffff5bb1);
+ OP(B, C, D, A, 22, 0x895cd7be);
+ OP(A, B, C, D, 7, 0x6b901122);
+ OP(D, A, B, C, 12, 0xfd987193);
+ OP(C, D, A, B, 17, 0xa679438e);
+ OP(B, C, D, A, 22, 0x49b40821);
+
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do { a += f(b, c, d) + correct_words[k] + T; a = rol(a, s); a += b; } while (0)
+
+ /* Round 2. */
+ OP(FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP(FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP(FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP(FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP(FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP(FG, D, A, B, C, 10, 9, 0x02441453);
+ OP(FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP(FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP(FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP(FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP(FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP(FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP(FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP(FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP(FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP(FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP(FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP(FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP(FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP(FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP(FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP(FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP(FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP(FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP(FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP(FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP(FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP(FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP(FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP(FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP(FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP(FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP(FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP(FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP(FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP(FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP(FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP(FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP(FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP(FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP(FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP(FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP(FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP(FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP(FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP(FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP(FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP(FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Put checksum in context given as argument. */
+ ctx->A += A;
+ ctx->B += B;
+ ctx->C += C;
+ ctx->D += D;
+}
+
+/* The routine updates the message-digest context to
+ * account for the presence of each of the characters inBuf[0..inLen-1]
+ * in the message whose digest is being computed. */
+void MD5_write (MD5_CONTEXT *hd, unsigned char *inbuf, unsigned long inlen)
+{
+ if (hd->count == 64) { /* flush the buffer */
+ transform(hd, hd->buf);
+ _gcry_burn_stack(80+6*sizeof(void*));
+ hd->count = 0;
+ hd->nblocks++;
+ }
+ if (!inbuf) return;
+ if (hd->count) {
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+ MD5_write(hd, NULL, 0);
+ if (!inlen) return;
+ }
+ _gcry_burn_stack(80+6*sizeof(void*));
+
+ while (inlen >= 64) {
+ transform(hd, inbuf);
+ hd->count = 0;
+ hd->nblocks++;
+ inlen -= 64;
+ inbuf += 64;
+ }
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+}
+
+/* The routine final terminates the message-digest computation and
+ * ends with the desired message digest in mdContext->digest[0...15].
+ * The handle is prepared for a new MD5 cycle.
+ * Returns 16 bytes representing the digest. */
+
+void MD5_final (unsigned char *outbuf, MD5_CONTEXT *hd)
+{
+ unsigned long t, msb, lsb;
+ unsigned char *p;
+
+ MD5_write(hd, NULL, 0); /* flush */
+
+ t = hd->nblocks;
+ /* multiply by 64 to make a byte count */
+ lsb = t << 6;
+ msb = t >> 26;
+ /* add the count */
+ t = lsb;
+ if ((lsb += hd->count) < t) msb++;
+ /* multiply by 8 to make a bit count */
+ t = lsb;
+ lsb <<= 3;
+ msb <<= 3;
+ msb |= t >> 29;
+
+ if (hd->count < 56) { /* enough room */
+ hd->buf[hd->count++] = 0x80; /* pad */
+ while (hd->count < 56) hd->buf[hd->count++] = 0; /* pad */
+ } else { /* need one extra block */
+ hd->buf[hd->count++] = 0x80; /* pad character */
+ while (hd->count < 64) hd->buf[hd->count++] = 0;
+ MD5_write(hd, NULL, 0); /* flush */
+ memset(hd->buf, 0, 56); /* fill next block with zeroes */
+ }
+ /* append the 64 bit count */
+ hd->buf[56] = lsb;
+ hd->buf[57] = lsb >> 8;
+ hd->buf[58] = lsb >> 16;
+ hd->buf[59] = lsb >> 24;
+ hd->buf[60] = msb;
+ hd->buf[61] = msb >> 8;
+ hd->buf[62] = msb >> 16;
+ hd->buf[63] = msb >> 24;
+ transform(hd, hd->buf);
+ _gcry_burn_stack(80+6*sizeof(void*));
+
+ p = outbuf; /* p = hd->buf; */
+#ifdef WORDS_BIGENDIAN
+#define X(a) do { *p++ = hd->a; *p++ = hd->a >> 8; \
+ *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while (0)
+#else /* little endian */
+#define X(a) do { *(unsigned long *)p = (*hd).a ; p += 4; } while (0)
+#endif
+ X(A);
+ X(B);
+ X(C);
+ X(D);
+#undef X
+}
+
+/*
+ * The following codes for the arcfour stream cipher were modified
+ * by Jin-Hwan Cho on August 5, 2003 based on libgrypt-1.1.42.
+ *
+ * Copyright (C) 2000,2001,2002,2003 Free Software Foundation, Inc.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * According to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc.
+ * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+ * heavily modified for GnuPG by Werner Koch <wk@gnupg.org>
+ */
+
+static void do_encrypt_stream (ARC4_KEY *ctx, unsigned char *outbuf, const unsigned char *inbuf, unsigned long len)
+{
+ register int i = ctx->idx_i;
+ register int j = ctx->idx_j;
+ register unsigned char *sbox = ctx->sbox;
+ register int t;
+
+ while (len--) {
+ i++;
+ i = i & 255; /* and seems to be faster than mod */
+ j += sbox[i];
+ j &= 255;
+ t = sbox[i]; sbox[i] = sbox[j]; sbox[j] = t;
+ *outbuf++ = *inbuf++ ^ sbox[(sbox[i] + sbox[j]) & 255];
+ }
+
+ ctx->idx_i = i;
+ ctx->idx_j = j;
+}
+
+void ARC4 (ARC4_KEY *ctx, unsigned long len, const unsigned char *inbuf, unsigned char *outbuf)
+{
+ do_encrypt_stream(ctx, outbuf, inbuf, len);
+ _gcry_burn_stack(64);
+}
+
+static void do_arcfour_setkey (ARC4_KEY *ctx, const unsigned char *key, unsigned int keylen)
+{
+ int i, j;
+ unsigned char karr[256];
+
+ ctx->idx_i = ctx->idx_j = 0;
+ for (i = 0; i < 256; i++) ctx->sbox[i] = i;
+ for (i = 0; i < 256; i++) karr[i] = key[i%keylen];
+ for (i = j = 0; i < 256; i++) {
+ int t;
+ j = (j + ctx->sbox[i] + karr[i]) % 256;
+ t = ctx->sbox[i];
+ ctx->sbox[i] = ctx->sbox[j];
+ ctx->sbox[j] = t;
+ }
+ memset(karr, 0, 256);
+}
+
+void ARC4_set_key (ARC4_KEY *ctx, unsigned int keylen, const unsigned char *key)
+{
+ do_arcfour_setkey(ctx, key, keylen);
+ _gcry_burn_stack(300);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/dpxcrypt.h b/Build/source/texk/xdvipdfmx/src/dpxcrypt.h
new file mode 100644
index 00000000000..98155a6e3e1
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxcrypt.h
@@ -0,0 +1,49 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxcrypt.h,v 1.1 2003/08/05 07:09:09 chofchof Exp $
+
+ This is DVIPDFMx, an eXtended version of DVIPDFM by Mark A. Wicks.
+
+ Copyright (C) 2003 by Jin-Hwan Cho and Shunsaku Hirata,
+ the DVIPDFMx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _DPXCRYPT_H_
+#define _DPXCRYPT_H_
+
+#include <stdio.h>
+
+/* libgcrypt md5 */
+typedef struct {
+ unsigned long A,B,C,D; /* chaining variables */
+ unsigned long nblocks;
+ unsigned char buf[64];
+ int count;
+} MD5_CONTEXT;
+
+void MD5_init (MD5_CONTEXT *ctx);
+void MD5_write (MD5_CONTEXT *ctx, unsigned char *inbuf, unsigned long inlen);
+void MD5_final (unsigned char *outbuf, MD5_CONTEXT *ctx);
+
+/* libgcrypt arcfour */
+typedef struct {
+ int idx_i, idx_j;
+ unsigned char sbox[256];
+} ARC4_KEY;
+
+void ARC4 (ARC4_KEY *ctx, unsigned long len, const unsigned char *inbuf, unsigned char *outbuf);
+void ARC4_set_key (ARC4_KEY *ctx, unsigned int keylen, const unsigned char *key);
+
+#endif /* _DPXCRYPT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dpxfile.c b/Build/source/texk/xdvipdfmx/src/dpxfile.c
new file mode 100644
index 00000000000..3a9920eaf72
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxfile.c
@@ -0,0 +1,930 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxfile.c,v 1.14 2005/12/18 14:56:47 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxutil.h"
+#include "mfileio.h"
+
+#include "dpxfile.h"
+
+static int verbose = 0;
+
+void
+dpx_file_set_verbose (void)
+{
+ verbose++;
+}
+
+
+/* Kpathsea library does not check file type. */
+static int qcheck_filetype (const char *fqpn, int type);
+
+/* For testing MIKTEX enabled compilation */
+#if defined(TESTCOMPILE) && !defined(MIKTEX)
+# define MIKTEX 1
+# define PATH_SEP_CHR '/'
+# define _MAX_PATH 256
+
+static int
+miktex_get_acrobat_font_dir (char *buf)
+{
+ strcpy(buf, "/usr/share/ghostscript/Resource/Font/");
+ return 1;
+}
+
+static int
+miktex_find_file (const char *filename, const char *dirlist, char *buf)
+{
+ int r = 0;
+ char *fqpn;
+
+ fqpn = kpse_path_search(dirlist, filename, 0);
+ if (!fqpn)
+ return 0;
+ if (strlen(fqpn) > _MAX_PATH)
+ r = 0;
+ else {
+ strcpy(buf, fqpn);
+ r = 1;
+ }
+ RELEASE(fqpn);
+
+ return r;
+}
+
+static int
+miktex_find_app_input_file (const char *progname, const char *filename, char *buf)
+{
+ int r = 0;
+ char *fqpn;
+
+ kpse_reset_program_name(progname);
+ fqpn = kpse_find_file (filename, kpse_program_text_format, false);
+ kpse_reset_program_name("dvipdfm");
+
+ if (!fqpn)
+ return 0;
+ if (strlen(fqpn) > _MAX_PATH)
+ r = 0;
+ else {
+ strcpy(buf, fqpn);
+ r = 1;
+ }
+ RELEASE(fqpn);
+
+ return r;
+}
+
+static int
+miktex_find_psheader_file (const char *filename, char *buf)
+{
+ int r;
+ char *fqpn;
+
+ fqpn = kpse_find_file(filename, kpse_tex_ps_header_format, 0);
+
+ if (!fqpn)
+ return 0;
+ if (strlen(fqpn) > _MAX_PATH)
+ r = 0;
+ else {
+ strcpy(buf, fqpn);
+ r = 1;
+ }
+ RELEASE(fqpn);
+
+ return r;
+}
+
+#endif /* TESTCOMPILE */
+
+#ifdef MIKTEX
+#ifndef PATH_SEP_CHR
+# define PATH_SEP_CHR '\\'
+#endif
+static char _tmpbuf[_MAX_PATH+1];
+#endif /* MIKTEX */
+
+#if 1
+static char *
+ensuresuffix (const char *basename, const char *sfx)
+{
+ char *q, *p;
+
+ p = NEW(strlen(basename) + strlen(sfx) + 1, char);
+ strcpy(p, basename);
+ q = strrchr(p, '.');
+ if (!q && sfx[0])
+ strcat(p, sfx);
+
+ return p;
+}
+#endif
+
+#ifdef MIKTEX
+static char *
+dpx_find__app__xyz (const char *filename,
+ const char *suffix, int is_text)
+{
+ char *fqpn = NULL;
+ int r;
+ char *q;
+
+ q = ensuresuffix(filename, suffix);
+ r = miktex_find_app_input_file("dvipdfm", q, _tmpbuf);
+ if (!r && strcmp(q, filename))
+ r = miktex_find_app_input_file("dvipdfm", filename, _tmpbuf);
+ if (r) {
+ fqpn = NEW(strlen(_tmpbuf) + 1, char);
+ strcpy(fqpn, _tmpbuf);
+ }
+ RELEASE(q);
+
+ return fqpn;
+}
+
+static char *
+dpx_foolsearch (const char *foolname,
+ const char *filename,
+ int is_text)
+{
+ char *fqpn = NULL;
+ int r;
+
+ r = miktex_find_app_input_file(foolname, filename, _tmpbuf);
+ if (r) {
+ fqpn = NEW(strlen(_tmpbuf) + 1, char);
+ strcpy(fqpn, _tmpbuf);
+ }
+
+ return fqpn;
+}
+#else /* TEXK */
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+# define TDS11DOC "http://www.tug.org/ftp/tex/tds-1.1/tds.html#Fonts"
+static void
+insistupdate (const char *filename,
+ const char *fqpn,
+ const char *foolname,
+ kpse_file_format_type foolformat,
+ kpse_file_format_type realformat)
+{
+ kpse_format_info_type *fif;
+ kpse_format_info_type *fir;
+ if (verbose < 1)
+ return;
+ fif = &kpse_format_info[foolformat];
+ fir = &kpse_format_info[realformat];
+ WARN("File name=\"%s\" format=\"%s\" might be found in different location than I expected:",
+ filename, fir->type);
+ WARN(">> %s", fqpn);
+ WARN(">> Please adjust your TEXMF as conformant with:");
+ WARN(">> " TDS11DOC);
+ WARN(">> I searched it with fooling kpathsea as progname=\"%s\" format=\"%s\".",
+ foolname, fif->type);
+ WARN(">> Default search path for this format file is:");
+ WARN(">> %s", fir->default_path);
+ WARN(">> Please read \"README\" file.");
+}
+#endif /* TDS 1.1 */
+
+static char *
+dpx_find__app__xyz (const char *filename,
+ const char *suffix, int is_text)
+{
+ char *fqpn = NULL;
+ char *q;
+
+ q = ensuresuffix(filename, suffix);
+ fqpn = kpse_find_file(q,
+ (is_text ?
+ kpse_program_text_format : kpse_program_binary_format), 0);
+ if (!fqpn && strcmp(q, filename))
+ fqpn = kpse_find_file(filename,
+ (is_text ?
+ kpse_program_text_format : kpse_program_binary_format), 0);
+ RELEASE(q);
+
+ return fqpn;
+}
+
+static char *
+dpx_foolsearch (const char *foolname,
+ const char *filename,
+ int is_text)
+{
+ char *fqpn = NULL;
+
+ kpse_reset_program_name(foolname);
+ fqpn = kpse_find_file (filename,
+ (is_text ?
+ kpse_program_text_format :
+ kpse_program_binary_format),
+ false);
+ kpse_reset_program_name("dvipdfm");
+
+ return fqpn;
+}
+#endif /* MIKTEX */
+
+static char *dpx_find_fontmap_file (const char *filename);
+static char *dpx_find_agl_file (const char *filename);
+static char *dpx_find_sfd_file (const char *filename);
+static char *dpx_find_cmap_file (const char *filename);
+static char *dpx_find_enc_file (const char *filename);
+static char *dpx_find_iccp_file (const char *filename);
+
+#if 0
+static char *dpx_find_fonts_map (const char *filename);
+
+static char *dpx_find_fonts_enc (const char *filename);
+static char *dpx_find_fonts_cmap (const char *filename);
+
+static char *dpx_find_fonts_type1 (const char *filename);
+static char *dpx_find_fonts_truetype (const char *filename);
+static char *dpx_find_fonts_opentype (const char *filename);
+
+static char *dpx_find_unicode_agl (const char *filename);
+static char *dpx_find_unicode_cmap (const char *filename);
+
+static char *dpx_find_color_icc (const char *filename);
+#endif
+
+FILE *
+dpx_open_file (const char *filename, int type)
+{
+ FILE *fp = NULL;
+ char *fqpn = NULL;
+
+ switch (type) {
+ case DPX_RES_TYPE_FONTMAP:
+ fqpn = dpx_find_fontmap_file(filename);
+ break;
+ case DPX_RES_TYPE_T1FONT:
+ fqpn = dpx_find_type1_file(filename);
+ break;
+ case DPX_RES_TYPE_TTFONT:
+ fqpn = dpx_find_truetype_file(filename);
+ break;
+ case DPX_RES_TYPE_OTFONT:
+ fqpn = dpx_find_opentype_file(filename);
+ break;
+ case DPX_RES_TYPE_PKFONT:
+ break;
+ case DPX_RES_TYPE_CMAP:
+ fqpn = dpx_find_cmap_file(filename);
+ break;
+ case DPX_RES_TYPE_ENC:
+ fqpn = dpx_find_enc_file(filename);
+ break;
+ case DPX_RES_TYPE_SFD:
+ fqpn = dpx_find_sfd_file(filename);
+ break;
+ case DPX_RES_TYPE_AGL:
+ fqpn = dpx_find_agl_file(filename);
+ break;
+ case DPX_RES_TYPE_ICCPROFILE:
+ fqpn = dpx_find_iccp_file(filename);
+ break;
+ default:
+ ERROR("Unknown resource type: %d", type);
+ break;
+ }
+ if (fqpn) {
+ fp = MFOPEN(fqpn, FOPEN_RBIN_MODE);
+ RELEASE(fqpn);
+ }
+
+ return fp;
+}
+
+/* color/icc ? */
+static char *
+dpx_find_iccp_file (const char *filename)
+{
+ char *fqpn = NULL;
+
+ fqpn = dpx_find__app__xyz(filename, "", 0);
+ if (fqpn || strrchr(filename, '.'))
+ return fqpn;
+
+ fqpn = dpx_find__app__xyz(filename, ".icc", 0);
+ if (fqpn)
+ return fqpn;
+
+ fqpn = dpx_find__app__xyz(filename, ".icm", 0);
+
+ return fqpn;
+}
+
+
+static char *
+dpx_find_fontmap_file (const char *filename)
+{
+ char *fqpn = NULL;
+ char *q;
+
+ q = ensuresuffix(filename, ".map");
+#ifdef MIKTEX
+ fqpn = dpx_find__app__xyz(q, ".map", 1);
+#else /* !MIKTEX */
+ fqpn = kpse_find_file(q, kpse_fontmap_format, 0);
+ if (!fqpn) {
+ fqpn = dpx_find__app__xyz(q, ".map", 1);
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ if (fqpn)
+ insistupdate(q, fqpn, "dvipdfm",
+ kpse_program_text_format, kpse_fontmap_format);
+#endif
+ }
+#endif /* MIKETEX */
+ RELEASE(q);
+
+ return fqpn;
+}
+
+
+static char *
+dpx_find_agl_file (const char *filename)
+{
+ char *fqpn = NULL;
+ char *q;
+
+ q = ensuresuffix(filename, ".txt");
+#ifdef MIKTEX
+ fqpn = dpx_find__app__xyz(q, ".txt", 1);
+#else /* !MIKTEX */
+ fqpn = kpse_find_file(q, kpse_fontmap_format, 0);
+ if (!fqpn) {
+ fqpn = dpx_find__app__xyz(q, ".txt", 1);
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ if (fqpn)
+ insistupdate(q, fqpn, "dvipdfm",
+ kpse_program_text_format, kpse_fontmap_format);
+#endif
+ }
+#endif /* MIKETEX */
+ RELEASE(q);
+
+ return fqpn;
+}
+
+
+/* cmap.sty put files into tex/latex/cmap */
+static char *
+dpx_find_cmap_file (const char *filename)
+{
+ char *fqpn = NULL;
+ static const char *fools[] = {
+ "cmap", "dvipdfm", "tex", NULL
+ };
+ int i;
+
+#if defined(MIKTEX)
+ /* Find in Acrobat's Resource/CMap dir */
+ {
+ char _acrodir[_MAX_PATH+1];
+ char *q;
+ int r;
+
+ memset(_acrodir, 0, _MAX_PATH+1);
+ r = miktex_get_acrobat_font_dir(_acrodir);
+ if (r &&
+ strlen(_acrodir) > strlen("Font")) {
+ /* ....\Font\ */
+ q = strrchr(_acrodir, PATH_SEP_CHR);
+ if (q && q[1] == '\0')
+ q[0] = '\0';
+ q = strrchr(_acrodir, PATH_SEP_CHR);
+ if (q && !strcmp(q + 1, "Font")) {
+ sprintf(q, "%cCMap%c", PATH_SEP_CHR, PATH_SEP_CHR);
+ r = miktex_find_file(filename, _acrodir, _tmpbuf);
+ if (r) {
+ fqpn = NEW(strlen(_tmpbuf) + 1, char);
+ strcpy(fqpn, _tmpbuf);
+ }
+ }
+ }
+ memset(_tmpbuf, 0, _MAX_PATH+1);
+ }
+#else
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ fqpn = kpse_find_file(filename, kpse_cmap_format, 0);
+#endif
+#endif
+
+ /* Files found above are assumed to be CMap,
+ * if it's not really CMap it will cause an error.
+ */
+ for (i = 0; !fqpn && fools[i]; i++) {
+ fqpn = dpx_foolsearch(fools[i], filename, 1);
+ if (fqpn) {
+#ifndef MIKTEX
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ insistupdate(filename, fqpn, fools[i],
+ kpse_program_text_format, kpse_cmap_format);
+#endif
+#endif
+ if (!qcheck_filetype(fqpn, DPX_RES_TYPE_CMAP)) {
+ WARN("Found file \"%s\" for PostScript CMap but it doesn't look like a CMap...", fqpn);
+ RELEASE(fqpn);
+ fqpn = NULL;
+ }
+ }
+ }
+
+ return fqpn;
+}
+
+/* Search order:
+ * SFDFONTS (TDS 1.1)
+ * ttf2pk (text file)
+ * ttf2tfm (text file)
+ * dvipdfm (text file)
+ */
+static char *
+dpx_find_sfd_file (const char *filename)
+{
+ char *fqpn = NULL;
+ char *q;
+ static const char *fools[] = {
+ "ttf2pk", "ttf2tfm", "dvipdfm", NULL
+ };
+ int i;
+
+ q = ensuresuffix(filename, ".sfd");
+#ifndef MIKTEX
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ fqpn = kpse_find_file(q, kpse_sfd_format, 0);
+#endif
+#endif /* !MIKTEX */
+
+ for (i = 0; !fqpn && fools[i]; i++) {
+ fqpn = dpx_foolsearch(fools[i], q, 1);
+#ifndef MIKTEX
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ if (fqpn)
+ insistupdate(filename, fqpn, fools[i],
+ kpse_program_text_format, kpse_sfd_format);
+#endif
+#endif
+ }
+ RELEASE(q);
+
+ return fqpn;
+}
+
+static char *
+dpx_find_enc_file (const char *filename)
+{
+ char *fqpn = NULL;
+ char *q;
+ static const char *fools[] = {
+ "dvips", "dvipdfm", NULL
+ };
+ int i;
+
+ q = ensuresuffix(filename, ".enc");
+#ifdef MIKTEX
+ if (miktex_find_psheader_file(q, _tmpbuf)) {
+ fqpn = NEW(strlen(_tmpbuf) + 1, char);
+ strcpy(fqpn, _tmpbuf);
+ }
+#else
+# if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ fqpn = kpse_find_file(filename, kpse_enc_format, 0);
+# else
+ fqpn = kpse_find_file(filename, kpse_tex_ps_header_format, 0);
+# endif
+#endif /* MIKTEX */
+
+ for (i = 0; !fqpn && fools[i]; i++) {
+ fqpn = dpx_foolsearch(fools[i], q, 1);
+#ifndef MIKTEX
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ if (fqpn)
+ insistupdate(filename, fqpn, fools[i],
+ kpse_program_text_format, kpse_enc_format);
+#endif
+#endif
+ }
+ RELEASE(q);
+
+ return fqpn;
+}
+
+static int
+is_absolute_path(const char *filename)
+{
+#ifdef WIN32
+ if (isalpha(filename[0]) && filename[1] == ':')
+ return 1;
+ if (filename[0] == '\\' && filename[1] == '\\')
+ return 1;
+#else
+ if (filename[0] == '/')
+ return 1;
+#endif
+ return 0;
+}
+
+char *
+dpx_find_type1_file (const char *filename)
+{
+ char *fqpn = NULL;
+
+ if (is_absolute_path(filename))
+ fqpn = strdup(filename);
+ else
+ fqpn = kpse_find_file(filename, kpse_type1_format, 0);
+ if (fqpn && !qcheck_filetype(fqpn, DPX_RES_TYPE_T1FONT)) {
+#if 0
+ WARN("Found file \"%s\" for PFB font but it doesn't look like a PFB...", fqpn);
+#endif
+ RELEASE(fqpn);
+ fqpn = NULL;
+ }
+
+ return fqpn;
+}
+
+char *
+dpx_find_truetype_file (const char *filename)
+{
+ char *fqpn = NULL;
+
+ if (is_absolute_path(filename))
+ fqpn = strdup(filename);
+ else
+ fqpn = kpse_find_file(filename, kpse_truetype_format, 0);
+ if (fqpn && !qcheck_filetype(fqpn, DPX_RES_TYPE_TTFONT)) {
+#if 0
+ WARN("Found file \"%s\" for TrueType font but it doesn't look like a TrueType...", fqpn);
+#endif
+ RELEASE(fqpn);
+ fqpn = NULL;
+ }
+
+ return fqpn;
+}
+
+
+char *
+dpx_find_opentype_file (const char *filename)
+{
+ char *fqpn = NULL;
+ char *q;
+ static const char *fools[] = {
+ "dvipdfm", NULL
+ };
+ int i;
+
+ q = ensuresuffix(filename, ".otf");
+#ifndef MIKTEX
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ if (is_absolute_path(q))
+ fqpn = strdup(q);
+ else
+ fqpn = kpse_find_file(q, kpse_opentype_format, 0);
+#endif
+#endif
+
+ for (i = 0; !fqpn && fools[i]; i++) {
+ fqpn = dpx_foolsearch(fools[i], q, 0);
+#ifndef MIKTEX
+#if defined(__TDS_VERSION__) && __TDS_VERSION__ >= 0x200406L
+ if (fqpn)
+ insistupdate(filename, fqpn, fools[i],
+ kpse_program_binary_format, kpse_opentype_format);
+#endif
+#endif
+ }
+ RELEASE(q);
+
+ /* *We* use "opentype" for ".otf" (CFF). */
+ if (fqpn && !qcheck_filetype(fqpn, DPX_RES_TYPE_OTFONT)) {
+#if 0
+ WARN("Found file \"%s\" for OpenType font but it doesn't look like a .otf...", fqpn);
+#endif
+ RELEASE(fqpn);
+ fqpn = NULL;
+ }
+
+ return fqpn;
+}
+
+
+#ifdef HAVE_MKSTEMP
+# include <stdlib.h>
+/* extern int mkstemp(const char *); */
+#endif
+
+/* Please fix: GCC warning
+ * warning: implicit declaration of function `mkstemp'
+ * mkstemp may not be declared in stdlib.h.
+ */
+char *
+dpx_create_temp_file (void)
+{
+ char *tmp = NULL;
+
+#if defined(MIKTEX)
+ {
+ tmp = NEW(_MAX_PATH + 1, char);
+ miktex_create_temp_file(tmp); /* FIXME_FIXME */
+ }
+#elif defined(HAVE_MKSTEMP)
+# define __TMPDIR "/tmp"
+# define TEMPLATE "/dvipdfmx.XXXXXX"
+ {
+ char *_tmpd;
+ int _fd = -1;
+# ifdef HAVE_GETENV
+ _tmpd = getenv("TMPDIR");
+ if (!_tmpd)
+ _tmpd = (char *) __TMPDIR;
+# else
+ _tmpd = (char *) __TMPDIR;
+# endif /* HAVE_GETENV */
+ tmp = NEW(strlen(_tmpd) + strlen(TEMPLATE) + 1, char);
+ strcpy(tmp, _tmpd);
+ strcat(tmp, TEMPLATE);
+ _fd = mkstemp(tmp);
+ if (_fd != -1)
+#ifdef WIN32
+ _close(_fd);
+#else
+ close(_fd);
+#endif /* WIN32 */
+ else {
+ RELEASE(tmp);
+ tmp = NULL;
+ }
+ }
+#else /* use tmpnam */
+ {
+ char *_tmpa = NEW(L_tmpnam + 1, char);
+ tmp = tmpnam(_tmpa);
+ if (!tmp)
+ RELEASE(_tmpa);
+ }
+#endif /* MIKTEX */
+
+ return tmp;
+}
+
+void
+dpx_delete_temp_file (char *tmp)
+{
+ if (!tmp)
+ return;
+ remove (tmp);
+ RELEASE(tmp);
+
+ return;
+}
+
+#ifdef HAVE_SYSTEM
+/* dpx_file_apply_filter() is used for converting unsupported graphics
+ * format to one of the formats that dvipdfmx can natively handle.
+ * 'input' is the filename of the original file and 'output' is actually
+ * temporal files 'generated' by the above routine.
+ * This should be system dependent. (MiKTeX may want something different)
+ * Please modify as appropriate (see also pdfximage.c and dvipdfmx.c).
+ */
+int
+dpx_file_apply_filter (const char *cmdtmpl, const char *input, const char *output)
+{
+ char *cmd = NULL;
+ char *p, *q;
+ size_t n, size;
+ int error = 0;
+
+ if (!cmdtmpl)
+ return -1;
+ else if (!input || !output)
+ return -1;
+
+ size = strlen(cmdtmpl) + strlen(input) + strlen(output) + 3;
+ cmd = NEW(size, char);
+ memset(cmd, 0, size);
+ for (n = 0, p = (char *) cmdtmpl; *p != 0; p++) {
+#define need(s,l,m,n) \
+if ((l) + (n) >= (m)) { \
+ (m) += (n) + 128; \
+ (s) = RENEW((s), (m), char); \
+}
+ if (p[0] == '%') {
+ p++;
+ switch (p[0]) {
+ case 'o': /* Output file name */
+ need(cmd, n, size, strlen(output));
+ strcpy(cmd + n, output); n += strlen(output);
+ break;
+ case 'i': /* Input filename */
+ need(cmd, n, size, strlen(input));
+ strcpy(cmd + n, input); n += strlen(input);
+ break;
+ case 'b':
+ need(cmd, n, size, strlen(input));
+ q = strrchr(input, '.'); /* wrong */
+ if (q) {
+ memcpy(cmd + n, input, (int) (q - input));
+ n += (int) (q - input);
+ } else {
+ strcpy(cmd + n, input); n += strlen(input);
+ }
+ case 0:
+ break;
+ case '%':
+ need(cmd, n, size, 1);
+ cmd[n] = '%'; n++;
+ break;
+ }
+ } else {
+ need(cmd, n, size, 1);
+ cmd[n] = p[0]; n++;
+ }
+ }
+ need(cmd, n, size, 1);
+ cmd[n] = '\0';
+ if (strlen(cmd) == 0) {
+ RELEASE(cmd);
+ return -1;
+ }
+
+ error = system(cmd);
+ if (error)
+ WARN("Filtering file via command -->%s<-- failed.", cmd);
+ RELEASE(cmd);
+
+ return error;
+}
+#else
+int
+dpx_file_apply_filter (const char *cmdtmpl, const char *input, const char *output)
+{
+ WARN("Your system does not have system().");
+ return -1;
+}
+#endif /* HAVE_SYSTEM */
+
+#if 1
+static char _sbuf[128];
+/*
+ * SFNT type sigs:
+ * `true' (0x74727565): TrueType (Mac)
+ * `typ1' (0x74797031) (Mac): PostScript font housed in a sfnt wrapper
+ * 0x00010000: TrueType (Win)/OpenType
+ * `OTTO': PostScript CFF font with OpenType wrapper
+ * `ttcf': TrueType Collection
+ */
+static int
+istruetype (FILE *fp)
+{
+ int n;
+
+ rewind(fp);
+ n = fread(_sbuf, 1, 4, fp);
+ rewind(fp);
+
+ if (n != 4)
+ return 0;
+ else if (!memcmp(_sbuf, "true", 4) ||
+ !memcmp(_sbuf, "\0\1\0\0", 4)) /* This doesn't help... */
+ return 1;
+ else if (!memcmp(_sbuf, "ttcf", 4))
+ return 1;
+
+ return 0;
+}
+
+/* "OpenType" is only for ".otf" here */
+static int
+isopentype (FILE *fp)
+{
+ int n;
+
+ rewind(fp);
+ n = fread(_sbuf, 1, 4, fp);
+ rewind(fp);
+
+ if (n != 4)
+ return 0;
+ else if (!memcmp(_sbuf, "OTTO", 4))
+ return 1;
+ else
+ return 0;
+}
+
+static int
+ist1binary (FILE *fp)
+{
+ char *p;
+ int n;
+
+ rewind(fp);
+ n = fread(_sbuf, 1, 21, fp);
+ rewind(fp);
+
+ p = _sbuf;
+ if (n != 21)
+ return 0;
+ else if (p[0] != (char) 0x80 || p[1] < 0 || p[1] > 3)
+ return 0;
+ else if (!memcmp(p + 6, "%!PS-AdobeFont", 14) ||
+ !memcmp(p + 6, "%!FontType1", 11))
+ return 1;
+ else if (!memcmp(p + 6, "%!PS", 4)) {
+#if 0
+ p[20] = '\0'; p += 6;
+ WARN("Ambiguous PostScript resource type: %s", (char *) p);
+#endif
+ return 1;
+ }
+ /* Otherwise ambiguious */
+ return 0;
+}
+
+/* %!PS-Adobe-x.y Resource-CMap */
+static int
+ispscmap (FILE *fp)
+{
+ char *p;
+ p = mfgets(_sbuf, 128, fp); p[127] = '\0';
+ if (!p || strlen(p) < 4 || memcmp(p, "%!PS", 4))
+ return 0;
+ for (p += 4; *p && !isspace(*p); p++);
+ for ( ; *p && (*p == ' ' || *p == '\t'); p++);
+ if (*p == '\0' || strlen(p) < strlen("Resource-CMap"))
+ return 0;
+ else if (!memcmp(p, "Resource-CMap", strlen("Resource-CMap")))
+ return 1;
+ /* Otherwise ambiguious */
+ return 0;
+}
+
+/* This actually opens files. */
+static int
+qcheck_filetype (const char *fqpn, int type)
+{
+ int r = 1;
+ FILE *fp;
+
+ if (!fqpn)
+ return 0;
+
+ fp = MFOPEN(fqpn, FOPEN_RBIN_MODE);
+ if (!fp) {
+ WARN("File \"%s\" found but I could not open that...", fqpn);
+ return 0;
+ }
+ switch (type) {
+ case DPX_RES_TYPE_T1FONT:
+ r = ist1binary(fp);
+ break;
+ case DPX_RES_TYPE_TTFONT:
+ r = istruetype(fp);
+ break;
+ case DPX_RES_TYPE_OTFONT:
+ r = isopentype(fp);
+ break;
+ case DPX_RES_TYPE_CMAP:
+ r = ispscmap(fp);
+ break;
+ }
+ MFCLOSE(fp);
+
+ return r;
+}
+
+#endif /* 1 */
+
diff --git a/Build/source/texk/xdvipdfmx/src/dpxfile.h b/Build/source/texk/xdvipdfmx/src/dpxfile.h
new file mode 100644
index 00000000000..7bcf9407f85
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxfile.h
@@ -0,0 +1,58 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxfile.h,v 1.6 2005/07/20 10:41:54 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _DPXFILE_H_
+#define _DPXFILE_H_
+
+#define DPX_RES_TYPE_FONTMAP 0x00
+
+#define DPX_RES_TYPE_T1FONT 0x10
+#define DPX_RES_TYPE_TTFONT 0x11
+#define DPX_RES_TYPE_OTFONT 0x12
+#define DPX_RES_TYPE_PKFONT 0x13
+
+#define DPX_RES_TYPE_ENC 0x20
+#define DPX_RES_TYPE_CMAP 0x21
+#define DPX_RES_TYPE_SFD 0x22
+#define DPX_RES_TYPE_AGL 0x23
+
+#define DPX_RES_TYPE_ICCPROFILE 0x30
+
+#include "mfileio.h"
+extern FILE *dpx_open_file (const char *filename, int type);
+
+extern char * dpx_find_type1_file (const char *filename);
+extern char * dpx_find_truetype_file (const char *filename);
+extern char * dpx_find_opentype_file (const char *filename);
+
+#define DPXFOPEN(n,t) dpx_open_file((const char *)(n),(t))
+#define DPXFCLOSE(f) MFCLOSE((f))
+
+extern void dpx_file_set_verbose (void);
+
+extern int dpx_file_apply_filter (const char *cmdtmpl, const char *input, const char *output);
+extern char *dpx_create_temp_file (void);
+extern void dpx_delete_temp_file (char *tmp); /* tmp freed here */
+
+#endif /* _DPXFILE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dpxutil.c b/Build/source/texk/xdvipdfmx/src/dpxutil.c
new file mode 100644
index 00000000000..2b0cf946b79
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxutil.c
@@ -0,0 +1,643 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxutil.c,v 1.7 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "mem.h"
+#include "error.h"
+
+#include "dpxutil.h"
+
+int
+xtoi (char c)
+{
+ if (c >= '0' && c <= '9')
+ return (c - '0');
+ else if (c >= 'a' && c <= 'f')
+ return (c - 'W');
+ else if (c >= 'A' && c <= 'F')
+ return (c - '7');
+ else
+ return -1;
+}
+
+int
+sputx (unsigned char c, char **s, char *end)
+{
+ char hi = (c >> 4), lo = c & 0x0f;
+
+ if (*s + 2 > end)
+ ERROR("Buffer overflow.");
+ **s = (hi < 10) ? hi + '0' : hi + '7';
+ *(*s+1) = (lo < 10) ? lo + '0' : lo + '7';
+ *s += 2;
+
+ return 2;
+}
+
+int
+getxpair (unsigned char **s)
+{
+ int hi, lo;
+ hi = xtoi(**s);
+ if (hi < 0)
+ return hi;
+ (*s)++;
+ lo = xtoi(**s);
+ if (lo < 0)
+ return lo;
+ (*s)++;
+ return ((hi << 4)| lo);
+}
+
+int
+putxpair (unsigned char c, char **s)
+{
+ char hi = (c >> 4), lo = c & 0x0f;
+
+ **s = (hi < 10) ? hi + '0' : hi + '7';
+ *(*s+1) = (lo < 10) ? lo + '0' : lo + '7';
+ *s += 2;
+
+ return 2;
+}
+
+/* Overflowed value is set to invalid char. */
+unsigned char
+ostrtouc (unsigned char **inbuf, unsigned char *inbufend, unsigned char *valid)
+{
+ unsigned char *cur = *inbuf;
+ unsigned int val = 0;
+
+ while (cur < inbufend && cur < *inbuf + 3 &&
+ (*cur >= '0' && *cur <= '7')) {
+ val = (val << 3) | (*cur - '0');
+ cur++;
+ }
+ if (val > 255 || cur == *inbuf)
+ *valid = 0;
+ else
+ *valid = 1;
+
+ *inbuf = cur;
+ return (unsigned char) val;
+}
+
+unsigned char
+esctouc (unsigned char **inbuf, unsigned char *inbufend, unsigned char *valid)
+{
+ unsigned char unescaped, escaped;
+
+ escaped = **inbuf;
+ *valid = 1;
+ switch (escaped) {
+ /* Backslash, unbalanced paranthes */
+ case '\\': case ')': case '(':
+ unescaped = escaped;
+ (*inbuf)++;
+ break;
+ /* Other escaped char */
+ case 'n': unescaped = '\n'; (*inbuf)++; break;
+ case 'r': unescaped = '\r'; (*inbuf)++; break;
+ case 't': unescaped = '\t'; (*inbuf)++; break;
+ case 'b': unescaped = '\b'; (*inbuf)++; break;
+ case 'f': unescaped = '\f'; (*inbuf)++; break;
+ /*
+ * An end-of-line marker preceeded by backslash is not part of a
+ * literal string
+ */
+ case '\r':
+ unescaped = 0;
+ *valid = 0;
+ *inbuf += (*inbuf < inbufend - 1 && *(*inbuf+1) == '\n') ? 2 : 1;
+ break;
+ case '\n':
+ unescaped = 0;
+ *valid = 0;
+ (*inbuf)++;
+ break;
+ /* Possibly octal notion */
+ default:
+ unescaped = ostrtouc(inbuf, inbufend, valid);
+ }
+
+ return unescaped;
+}
+
+void
+skip_white_spaces (unsigned char **s, unsigned char *endptr)
+{
+ while (*s < endptr)
+ if (!is_space(**s))
+ break;
+ else
+ (*s)++;
+}
+
+void
+ht_init_table (struct ht_table *ht)
+{
+ int i;
+
+ ASSERT(ht);
+
+ for (i = 0; i < HASH_TABLE_SIZE; i++) {
+ ht->table[i] = NULL;
+ }
+ ht->count = 0;
+}
+
+void
+ht_clear_table (struct ht_table *ht, void (*hval_free_fn) (void *))
+{
+ int i;
+
+ ASSERT(ht);
+
+ for (i = 0; i < HASH_TABLE_SIZE; i++) {
+ struct ht_entry *hent, *next;
+
+ hent = ht->table[i];
+ while (hent) {
+ if (hent->value) {
+ hval_free_fn(hent->value);
+ }
+ hent->value = NULL;
+ if (hent->key) {
+ RELEASE(hent->key);
+ }
+ hent->key = NULL;
+ next = hent->next;
+ RELEASE(hent);
+ hent = next;
+ }
+ ht->table[i] = NULL;
+ }
+ ht->count = 0;
+}
+
+static unsigned int
+get_hash (const void *key, int keylen)
+{
+ unsigned int hkey = 0;
+ int i;
+
+ for (i = 0; i < keylen; i++) {
+ hkey = (hkey << 5) + hkey + ((char *)key)[i];
+ }
+
+ return (hkey % HASH_TABLE_SIZE);
+}
+
+void *
+ht_lookup_table (struct ht_table *ht, const void *key, int keylen)
+{
+ struct ht_entry *hent;
+ unsigned int hkey;
+
+ ASSERT(ht && key);
+
+ hkey = get_hash(key, keylen);
+ hent = ht->table[hkey];
+ while (hent) {
+ if (hent->keylen == keylen &&
+ !memcmp(hent->key, key, keylen)) {
+ return hent->value;
+ }
+ hent = hent->next;
+ }
+
+ return NULL;
+}
+
+void
+ht_remove_table (struct ht_table *ht,
+ const void *key, int keylen, void (*hval_free_fn) (void *))
+{
+ struct ht_entry *hent, *prev;
+ unsigned int hkey;
+
+ ASSERT(ht && key);
+
+ hkey = get_hash(key, keylen);
+ hent = ht->table[hkey];
+ prev = NULL;
+ while (hent) {
+ if (hent->keylen == keylen &&
+ !memcmp(hent->key, key, keylen)) {
+ break;
+ }
+ prev = hent;
+ hent = hent->next;
+ }
+ if (hent) {
+ if (hent->key)
+ RELEASE(hent->key);
+ hent->key = NULL;
+ hent->keylen = 0;
+ hval_free_fn(hent->value);
+ hent->value = NULL;
+ if (prev) {
+ prev->next = hent->next;
+ } else {
+ ht->table[hkey] = hent->next;
+ }
+ RELEASE(hent);
+ ht->count--;
+ }
+}
+
+/* replace... */
+void
+ht_insert_table (struct ht_table *ht,
+ const void *key, int keylen, void *value,
+ void (*hval_free_fn) (void *))
+{
+ struct ht_entry *hent, *prev;
+ unsigned int hkey;
+
+ ASSERT(ht && key);
+
+ hkey = get_hash(key, keylen);
+ hent = ht->table[hkey];
+ prev = NULL;
+ while (hent) {
+ if (hent->keylen == keylen &&
+ !memcmp(hent->key, key, keylen)) {
+ break;
+ }
+ prev = hent;
+ hent = hent->next;
+ }
+ if (hent) {
+ hval_free_fn(hent->value);
+ hent->value = value;
+ } else {
+ hent = NEW(1, struct ht_entry);
+ hent->key = NEW(keylen, char);
+ memcpy(hent->key, key, keylen);
+ hent->keylen = keylen;
+ hent->value = value;
+ hent->next = NULL;
+ if (prev) {
+ prev->next = hent;
+ } else {
+ ht->table[hkey] = hent;
+ }
+ ht->count++;
+ }
+}
+
+void
+ht_append_table (struct ht_table *ht,
+ const void *key, int keylen, void *value)
+{
+ struct ht_entry *hent, *last;
+ unsigned int hkey;
+
+ hkey = get_hash(key, keylen);
+ hent = ht->table[hkey];
+ if (!hent) {
+ hent = NEW(1, struct ht_entry);
+ ht->table[hkey] = hent;
+ } else {
+ while (hent) {
+ last = hent;
+ hent = hent->next;
+ }
+ hent = NEW(1, struct ht_entry);
+ last->next = hent;
+ }
+ hent->key = NEW(keylen, char);
+ memcpy(hent->key, key, keylen);
+ hent->keylen = keylen;
+ hent->value = value;
+ hent->next = NULL;
+
+ ht->count++;
+}
+
+int
+ht_set_iter (struct ht_table *ht, struct ht_iter *iter)
+{
+ int i;
+
+ ASSERT(ht && ht->table && iter);
+
+ for (i = 0; i < HASH_TABLE_SIZE; i++) {
+ if (ht->table[i]) {
+ iter->index = i;
+ iter->curr = ht->table[i];
+ iter->hash = ht;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+void
+ht_clear_iter (struct ht_iter *iter)
+{
+ if (iter) {
+ iter->index = HASH_TABLE_SIZE;
+ iter->curr = NULL;
+ iter->hash = NULL;
+ }
+}
+
+char *
+ht_iter_getkey (struct ht_iter *iter, int *keylen)
+{
+ struct ht_entry *hent;
+
+ hent = (struct ht_entry *) iter->curr;
+ if (iter && hent) {
+ *keylen = hent->keylen;
+ return hent->key;
+ } else {
+ *keylen = 0;
+ return NULL;
+ }
+}
+
+void *
+ht_iter_getval (struct ht_iter *iter)
+{
+ struct ht_entry *hent;
+
+ hent = (struct ht_entry *) iter->curr;
+ if (iter && hent) {
+ return hent->value;
+ } else {
+ return NULL;
+ }
+}
+
+int
+ht_iter_next (struct ht_iter *iter)
+{
+ struct ht_entry *hent;
+ struct ht_table *ht;
+
+ ASSERT(iter);
+
+ ht = iter->hash;
+ hent = (struct ht_entry *) iter->curr;
+ hent = hent->next;
+ while (!hent &&
+ ++iter->index < HASH_TABLE_SIZE) {
+ hent = ht->table[iter->index];
+ }
+ iter->curr = hent;
+
+ return (hent ? 0 : -1);
+}
+
+
+static int
+read_c_escchar (char *r, char **pp, char *endptr)
+{
+ int c = 0, l = 1;
+ char *p = *pp;
+
+ switch (p[0]) {
+ case 'a' : c = '\a'; p++; break;
+ case 'b' : c = '\b'; p++; break;
+ case 'f' : c = '\f'; p++; break;
+ case 'n' : c = '\n'; p++; break;
+ case 'r' : c = '\r'; p++; break;
+ case 't' : c = '\t'; p++; break;
+ case 'v' : c = '\v'; p++; break;
+ case '\\': case '?': case '\'': case '\"':
+ c = p[0]; p++;
+ break;
+ case '\n': l = 0; p++; break;
+ case '\r':
+ {
+ p++;
+ if (p < endptr && p[0] == '\n')
+ p++;
+ l = 0;
+ }
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ {
+ int i;
+ for (c = 0, i = 0;
+ i < 3 && p < endptr &&
+ p[0] >= '0' && p[0] <= '7'; i++, p++)
+ c = (c << 3) + (p[0] - '0');
+ }
+ break;
+ case 'x':
+ {
+ int i;
+ for (c = 0, i = 0, p++;
+ i < 2 && p < endptr && isxdigit(p[0]);
+ i++, p++)
+ c = (c << 4) +
+ (isdigit(p[0]) ?
+ p[0] - '0' :
+ (islower(p[0]) ? p[0] - 'a' + 10: p[0] - 'A' + 10));
+ }
+ break;
+ default:
+ WARN("Unknown escape char sequence: \\%c", p[0]);
+ l = 0; p++;
+ break;
+ }
+
+ if (r)
+ *r = (char) c;
+ *pp = p;
+ return l;
+}
+
+#define C_QUOTE '"'
+#define C_ESCAPE '\\'
+static int
+read_c_litstrc (char *q, int len, char **pp, char *endptr)
+{
+ char *p;
+ int l = 0;
+#define Q_TERM 0
+#define Q_CONT -1
+#define Q_ERROR_UNTERM -1
+#define Q_ERROR_INVAL -2
+#define Q_ERROR_BUFF -3
+ int s = Q_CONT;
+
+ for (l = 0, p = *pp;
+ s == Q_CONT && p < endptr; ) {
+ switch (p[0]) {
+ case C_QUOTE:
+ s = Q_TERM; p++;
+ break;
+ case C_ESCAPE:
+ if (q && l == len)
+ s = Q_ERROR_BUFF;
+ else {
+ p++;
+ l += read_c_escchar(q ? &q[l] : NULL, &p, endptr);
+ }
+ break;
+ case '\n': case '\r':
+ s = Q_ERROR_INVAL;
+ break;
+ default:
+ if (q && l == len)
+ s = Q_ERROR_BUFF;
+ else {
+ if (!q)
+ l++;
+ else
+ q[l++] = p[0];
+ p++;
+ }
+ break;
+ }
+ }
+ if (s == Q_TERM) {
+ if (q && l == len)
+ s = Q_ERROR_BUFF;
+ else if (q)
+ q[l++] = '\0';
+ }
+
+ *pp = p;
+ return ((s == Q_TERM) ? l : s);
+}
+
+char *
+parse_c_string (char **pp, char *endptr)
+{
+ char *q = NULL;
+ char *p = *pp;
+ int l = 0;
+
+ if (p >= endptr || p[0] != C_QUOTE)
+ return NULL;
+
+ p++;
+ l = read_c_litstrc(NULL, 0, &p, endptr);
+ if (l >= 0) {
+ q = NEW(l + 1, char);
+ p = *pp + 1;
+ l = read_c_litstrc(q, l + 1, &p, endptr);
+ }
+
+ *pp = p;
+ return q;
+}
+
+#define ISCNONDIGITS(c) ( \
+ (c) == '_' || \
+ ((c) >= 'a' && (c) <= 'z') || \
+ ((c) >= 'A' && (c) <= 'Z') \
+)
+#define ISCIDENTCHAR(c) ( \
+ ISCNONDIGITS((c)) || \
+ ((c) >= '0' && (c) <= '9') \
+)
+
+char *
+parse_c_ident (char **pp, char *endptr)
+{
+ char *q = NULL;
+ char *p = *pp;
+ int n;
+
+ if (p >= endptr || !ISCNONDIGITS(*p))
+ return NULL;
+
+ for (n = 0; p < endptr && ISCIDENTCHAR(*p); p++, n++);
+ q = NEW(n + 1, char);
+ memcpy(q, *pp, n); q[n] = '\0';
+
+ *pp = p;
+ return q;
+}
+
+char *
+parse_float_decimal (char **pp, char *endptr)
+{
+ char *q = NULL;
+ char *p = *pp;
+ int s = 0, n = 0;
+
+ if (p >= endptr)
+ return NULL;
+
+ if (p[0] == '+' || p[0] == '-')
+ p++;
+
+ /* 1. .01 001 001E-001 */
+ for (s = 0, n = 0; p < endptr && s >= 0; ) {
+ switch (p[0]) {
+ case '+': case '-':
+ if (s != 2)
+ s = -1;
+ else {
+ s = 3; p++;
+ }
+ break;
+ case '.':
+ if (s > 0)
+ s = -1;
+ else {
+ s = 1; p++;
+ }
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ n++; p++;
+ break;
+ case 'E': case 'e':
+ if (n == 0 || s == 2)
+ s = -1;
+ else {
+ s = 2; p++;
+ }
+ break;
+ default:
+ s = -1;
+ break;
+ }
+ }
+
+ if (n != 0) {
+ n = (int) (p - *pp);
+ q = NEW(n + 1, char);
+ memcpy(q, *pp, n); q[n] = '\0';
+ }
+
+ *pp = p;
+ return q;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/dpxutil.h b/Build/source/texk/xdvipdfmx/src/dpxutil.h
new file mode 100644
index 00000000000..54fc8e8cd09
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dpxutil.h
@@ -0,0 +1,101 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dpxutil.h,v 1.7 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _DPXUTIL_H_
+#define _DPXUTIL_H_
+
+#undef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#undef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#undef ABS
+#define ABS(a) (((a) < 0) ? -(a) : (a))
+
+#ifndef is_space
+#define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\f' || \
+ (c) == '\r' || (c) == '\n' || (c) == '\0')
+#endif
+#ifndef is_delim
+#define is_delim(c) ((c) == '(' || (c) == '/' || \
+ (c) == '<' || (c) == '>' || \
+ (c) == '[' || (c) == ']' || \
+ (c) == '{' || (c) == '}' || \
+ (c) == '%')
+#endif
+
+extern void skip_white_spaces (unsigned char **s, unsigned char *endptr);
+extern int xtoi (char c);
+extern int getxpair (unsigned char **str);
+extern int putxpair (unsigned char c, char **str);
+extern int sputx (unsigned char c, char **buf, char *endptr);
+
+extern unsigned char ostrtouc (unsigned char **inbuf,
+ unsigned char *inbufend, unsigned char *valid);
+extern unsigned char esctouc (unsigned char **inbuf,
+ unsigned char *inbufend, unsigned char *valid);
+
+#define HASH_TABLE_SIZE 503
+
+struct ht_entry {
+ char *key;
+ int keylen;
+
+ void *value;
+
+ struct ht_entry *next;
+};
+
+struct ht_table {
+ long count;
+ struct ht_entry *table[HASH_TABLE_SIZE];
+};
+
+extern void ht_init_table (struct ht_table *ht);
+extern void ht_clear_table (struct ht_table *ht, void (*hval_free_fn) (void *));
+extern void *ht_lookup_table (struct ht_table *ht, const void *key, int keylen);
+extern void ht_append_table (struct ht_table *ht,
+ const void *key, int keylen, void *value) ;
+extern void ht_remove_table (struct ht_table *ht,
+ const void *key, int keylen, void (*hval_free_fn) (void*));
+extern void ht_insert_table (struct ht_table *ht,
+ const void *key, int keylen, void *value,
+ void (*hval_free_fn) (void *));
+
+struct ht_iter {
+ int index;
+ void *curr;
+ struct ht_table *hash;
+};
+
+extern int ht_set_iter (struct ht_table *ht, struct ht_iter *iter);
+extern void ht_clear_iter (struct ht_iter *iter);
+extern char *ht_iter_getkey (struct ht_iter *iter, int *keylen);
+extern void *ht_iter_getval (struct ht_iter *iter);
+extern int ht_iter_next (struct ht_iter *iter);
+
+extern char *parse_float_decimal (char **pp, char *endptr);
+extern char *parse_c_string (char **pp, char *endptr);
+extern char *parse_c_ident (char **pp, char *endptr);
+
+#endif /* _DPXUTIL_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dvi.c b/Build/source/texk/xdvipdfmx/src/dvi.c
new file mode 100644
index 00000000000..515f940a4ba
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dvi.c
@@ -0,0 +1,2632 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dvi.c,v 1.37 2005/08/18 08:46:21 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#ifdef WIN32
+#include <fcntl.h>
+#include <io.h>
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+#include "numbers.h"
+
+#include "pdfdev.h"
+#include "pdfdoc.h"
+#include "pdfparse.h"
+
+#include "fontmap.h"
+
+#include "dvicodes.h"
+#include "tfm.h"
+#include "vf.h"
+#include "subfont.h"
+
+#include "spc_util.h"
+#include "specials.h"
+
+#include "dvi.h"
+
+#ifdef XETEX
+#include "pdfcolor.h"
+#include "pdfximage.h"
+#include "ft2build.h"
+#include FT_FREETYPE_H
+#include FT_TRUETYPE_TABLES_H
+#endif
+
+#define DVI_STACK_DEPTH_MAX 256u
+#define TEX_FONTS_ALLOC_SIZE 16u
+#define VF_NESTING_MAX 16u
+
+/* Interal Variables */
+static FILE *dvi_file = NULL;
+static char linear = 0; /* set to 1 for strict linear processing of the input */
+
+static unsigned long *page_loc = NULL;
+static unsigned long num_pages = 0;
+
+static unsigned long dvi_file_size = 0;
+
+static struct dvi_header
+{
+ UNSIGNED_QUAD unit_num;
+ UNSIGNED_QUAD unit_den;
+ UNSIGNED_QUAD mag;
+ UNSIGNED_QUAD media_width, media_height;
+ UNSIGNED_PAIR stackdepth;
+ char comment[257];
+} dvi_info = {
+ 25400000 , /* num */
+ 473628672, /* den */
+ 1000, /* mag */
+ 0, 0, /* media width and height */
+ 0, /* stackdepth */
+ {'\0'} /* comment */
+};
+
+static double dev_origin_x = 72.0, dev_origin_y = 770.0;
+
+#define PHYSICAL 1
+#define VIRTUAL 2
+#define SUBFONT 3
+#ifdef XETEX
+#define NATIVE 4
+#endif
+#define DVI 1
+#define VF 2
+
+static struct loaded_font
+{
+ int type; /* Type is physical or virtual */
+ int font_id; /* id returned by dev (for PHYSICAL fonts)
+ * or by vf module for (VIRTUAL fonts)
+ */
+ int subfont_id; /* id returned by subfont_locate_font() */
+ int tfm_id;
+ spt_t size;
+ int source; /* Source is either DVI or VF */
+#ifdef XETEX
+ unsigned long rgba_color;
+ FT_Face ft_face;
+ unsigned short *glyph_widths;
+ int layout_dir;
+#endif
+} *loaded_fonts = NULL;
+static int num_loaded_fonts = 0, max_loaded_fonts = 0;
+
+static void
+need_more_fonts (unsigned n)
+{
+ if (num_loaded_fonts + n > max_loaded_fonts) {
+ max_loaded_fonts += TEX_FONTS_ALLOC_SIZE;
+ loaded_fonts = RENEW (loaded_fonts, max_loaded_fonts, struct loaded_font);
+ }
+}
+
+static struct font_def
+{
+ long tex_id;
+ spt_t point_size;
+ spt_t design_size;
+ char *font_name;
+ int font_id; /* index of _loaded_ font in loaded_fonts array */
+ int used;
+#ifdef XETEX
+ char *fam_name, *sty_name; /* only used for native fonts in XeTeX */
+ unsigned long rgba_color; /* only used for native fonts in XeTeX */
+ int layout_dir; /* 1 = vertical, 0 = horizontal */
+#endif
+} *def_fonts = NULL;
+
+#ifdef XETEX
+#define XDV_FLAG_FONTTYPE_ATSUI 0x0001
+#define XDV_FLAG_FONTTYPE_ICU 0x0002
+#define XDV_FLAG_VERTICAL 0x0100
+#define XDV_FLAG_COLORED 0x0200
+#define XDV_FLAG_FEATURES 0x0400
+#define XDV_FLAG_VARIATIONS 0x0800
+#endif
+
+static int num_def_fonts = 0, max_def_fonts = 0;
+static int compute_boxes = 0, link_annot = 1;
+static int verbose = 0;
+
+#define DVI_PAGE_BUF_CHUNK 0x10000UL /* 64K should be plenty for most pages */
+
+static unsigned char* dvi_page_buffer;
+static unsigned long dvi_page_buf_size;
+static unsigned long dvi_page_buf_index;
+
+/* functions to read numbers from the dvi file and store them in dvi_page_buffer */
+static UNSIGNED_BYTE get_and_buffer_unsigned_byte (FILE *file)
+{
+ int ch;
+ if ((ch = fgetc (file)) < 0)
+ ERROR ("File ended prematurely\n");
+ if (dvi_page_buf_index >= dvi_page_buf_size) {
+ dvi_page_buf_size += DVI_PAGE_BUF_CHUNK;
+ dvi_page_buffer = RENEW(dvi_page_buffer, dvi_page_buf_size, unsigned char);
+ }
+ dvi_page_buffer[dvi_page_buf_index++] = ch;
+ return (UNSIGNED_BYTE) ch;
+}
+
+static SIGNED_BYTE get_and_buffer_signed_byte (FILE *file)
+{
+ int byte;
+ byte = get_and_buffer_unsigned_byte(file);
+ if (byte >= 0x80)
+ byte -= 0x100;
+ return (SIGNED_BYTE) byte;
+}
+
+static UNSIGNED_PAIR get_and_buffer_unsigned_pair (FILE *file)
+{
+ int i;
+ UNSIGNED_BYTE byte;
+ UNSIGNED_PAIR pair = 0;
+ for (i=0; i<2; i++) {
+ byte = get_and_buffer_unsigned_byte(file);
+ pair = pair*0x100u + byte;
+ }
+ return pair;
+}
+
+static SIGNED_PAIR get_and_buffer_signed_pair (FILE *file)
+{
+ int i;
+ long pair = 0;
+ for (i=0; i<2; i++) {
+ pair = pair*0x100 + get_and_buffer_unsigned_byte(file);
+ }
+ if (pair >= 0x8000) {
+ pair -= 0x10000l;
+ }
+ return (SIGNED_PAIR) pair;
+}
+
+static UNSIGNED_TRIPLE get_and_buffer_unsigned_triple(FILE *file)
+{
+ int i;
+ long triple = 0;
+ for (i=0; i<3; i++) {
+ triple = triple*0x100u + get_and_buffer_unsigned_byte(file);
+ }
+ return (UNSIGNED_TRIPLE) triple;
+}
+
+static SIGNED_TRIPLE get_and_buffer_signed_triple(FILE *file)
+{
+ int i;
+ long triple = 0;
+ for (i=0; i<3; i++) {
+ triple = triple*0x100 + get_and_buffer_unsigned_byte(file);
+ }
+ if (triple >= 0x800000l)
+ triple -= 0x1000000l;
+ return (SIGNED_TRIPLE) triple;
+}
+
+static SIGNED_QUAD get_and_buffer_signed_quad(FILE *file)
+{
+ int byte, i;
+ long quad = 0;
+
+ /* Check sign on first byte before reading others */
+ byte = get_and_buffer_unsigned_byte(file);
+ quad = byte;
+ if (quad >= 0x80)
+ quad = byte - 0x100;
+ for (i=0; i<3; i++) {
+ quad = quad*0x100 + get_and_buffer_unsigned_byte(file);
+ }
+ return (SIGNED_QUAD) quad;
+}
+
+static UNSIGNED_QUAD get_and_buffer_unsigned_quad(FILE *file)
+{
+ int i;
+ unsigned long quad = 0;
+ for (i=0; i<4; i++) {
+ quad = quad*0x100u + get_and_buffer_unsigned_byte(file);
+ }
+ return (UNSIGNED_QUAD) quad;
+}
+
+static void get_and_buffer_bytes(FILE *file, unsigned int count)
+{
+ if (dvi_page_buf_index + count >= dvi_page_buf_size) {
+ dvi_page_buf_size = dvi_page_buf_index + count + DVI_PAGE_BUF_CHUNK;
+ dvi_page_buffer = RENEW(dvi_page_buffer, dvi_page_buf_size, unsigned char);
+ }
+ if (fread(dvi_page_buffer + dvi_page_buf_index, 1, count, file) != count)
+ ERROR ("File ended prematurely\n");
+ dvi_page_buf_index += count;
+}
+
+/* functions to fetch values from dvi_page_buffer */
+
+static UNSIGNED_BYTE get_buffered_unsigned_byte ()
+{
+ return dvi_page_buffer[dvi_page_buf_index++];
+}
+
+static SIGNED_BYTE get_buffered_signed_byte ()
+{
+ int byte;
+ byte = dvi_page_buffer[dvi_page_buf_index++];
+ if (byte >= 0x80)
+ byte -= 0x100;
+ return (SIGNED_BYTE) byte;
+}
+
+static UNSIGNED_PAIR get_buffered_unsigned_pair ()
+{
+ int i;
+ UNSIGNED_BYTE byte;
+ UNSIGNED_PAIR pair = 0;
+ for (i=0; i<2; i++) {
+ byte = dvi_page_buffer[dvi_page_buf_index++];
+ pair = pair*0x100u + byte;
+ }
+ return pair;
+}
+
+static SIGNED_PAIR get_buffered_signed_pair ()
+{
+ int i;
+ long pair = 0;
+ for (i=0; i<2; i++) {
+ pair = pair*0x100 + dvi_page_buffer[dvi_page_buf_index++];
+ }
+ if (pair >= 0x8000) {
+ pair -= 0x10000l;
+ }
+ return (SIGNED_PAIR) pair;
+}
+
+static UNSIGNED_TRIPLE get_buffered_unsigned_triple()
+{
+ int i;
+ long triple = 0;
+ for (i=0; i<3; i++) {
+ triple = triple*0x100u + dvi_page_buffer[dvi_page_buf_index++];
+ }
+ return (UNSIGNED_TRIPLE) triple;
+}
+
+static SIGNED_TRIPLE get_buffered_signed_triple()
+{
+ int i;
+ long triple = 0;
+ for (i=0; i<3; i++) {
+ triple = triple*0x100 + dvi_page_buffer[dvi_page_buf_index++];
+ }
+ if (triple >= 0x800000l)
+ triple -= 0x1000000l;
+ return (SIGNED_TRIPLE) triple;
+}
+
+static SIGNED_QUAD get_buffered_signed_quad()
+{
+ int byte, i;
+ long quad = 0;
+
+ /* Check sign on first byte before reading others */
+ byte = dvi_page_buffer[dvi_page_buf_index++];
+ quad = byte;
+ if (quad >= 0x80)
+ quad = byte - 0x100;
+ for (i=0; i<3; i++) {
+ quad = quad*0x100 + dvi_page_buffer[dvi_page_buf_index++];
+ }
+ return (SIGNED_QUAD) quad;
+}
+
+static UNSIGNED_QUAD get_buffered_unsigned_quad()
+{
+ int i;
+ unsigned long quad = 0;
+ for (i=0; i<4; i++) {
+ quad = quad*0x100u + dvi_page_buffer[dvi_page_buf_index++];
+ }
+ return (UNSIGNED_QUAD) quad;
+}
+
+
+
+void
+dvi_set_verbose (void)
+{
+ verbose++;
+ subfont_set_verbose();
+ tfm_set_verbose();
+ vf_set_verbose ();
+ spc_set_verbose();
+}
+
+unsigned
+dvi_npages (void)
+{
+ return num_pages;
+}
+
+static const char invalid_signature[] =
+"Something is wrong. Are you sure this is a DVI file?";
+
+#define range_check_loc(loc) \
+ if ((loc) > dvi_file_size) {\
+ ERROR(invalid_signature); \
+ }
+
+static long
+find_post (void)
+{
+ long current;
+ int ch;
+
+ /* First find end of file */
+ dvi_file_size = file_size(dvi_file);
+ current = dvi_file_size;
+
+ /* Scan backwards through PADDING */
+ do {
+ current--;
+ seek_absolute(dvi_file, current);
+ } while ((ch = fgetc(dvi_file)) == PADDING &&
+ current > 0);
+
+ /* file_position now points to last non padding character or
+ * beginning of file */
+ if (dvi_file_size - current < 4 || current == 0 ||
+#ifdef XETEX
+ !(ch == DVI_ID || ch == DVIV_ID || ch == XDVI_ID)) {
+#else
+ !(ch == DVI_ID || ch == DVIV_ID)) {
+#endif
+ MESG("DVI ID = %d\n", ch);
+ ERROR(invalid_signature);
+ }
+
+ /* Make sure post_post is really there */
+ current = current - 5;
+ seek_absolute(dvi_file, current);
+ if ((ch = fgetc(dvi_file)) != POST_POST) {
+ MESG("Found %d where post_post opcode should be\n", ch);
+ ERROR(invalid_signature);
+ }
+ current = get_signed_quad(dvi_file);
+ seek_absolute(dvi_file, current);
+ if ((ch = fgetc(dvi_file)) != POST) {
+ MESG("Found %d where post_post opcode should be\n", ch);
+ ERROR(invalid_signature);
+ }
+
+ return current;
+}
+
+static void
+get_page_info (long post_location)
+{
+ int i;
+
+ seek_absolute(dvi_file, post_location + 27);
+ num_pages = get_unsigned_pair(dvi_file);
+ if (num_pages == 0) {
+ ERROR("Page count is 0!");
+ }
+ if (verbose > 2) {
+ MESG("Page count:\t %4d\n", num_pages);
+ }
+
+ page_loc = NEW(num_pages, unsigned long);
+
+ seek_absolute(dvi_file, post_location + 1);
+ page_loc[num_pages-1] = get_unsigned_quad(dvi_file);
+ range_check_loc(page_loc[num_pages-1] + 41);
+ for (i = num_pages - 2; i >= 0; i--) {
+ seek_absolute(dvi_file, page_loc[i+1] + 41);
+ page_loc[i] = get_unsigned_quad(dvi_file);
+ range_check_loc(page_loc[num_pages-1] + 41);
+ }
+}
+
+/* Following are computed "constants" used for unit conversion */
+static double dvi2pts = 1.52018, total_mag = 1.0;
+
+double
+dvi_tell_mag (void)
+{
+ return total_mag;
+}
+
+static void
+do_scales (double mag)
+{
+ total_mag = (double) dvi_info.mag / 1000.0 * mag;
+ dvi2pts = (double) dvi_info.unit_num / (double) dvi_info.unit_den;
+ dvi2pts *= (72.0 / 254000.0);
+}
+
+static void
+get_dvi_info (long post_location)
+{
+ seek_absolute(dvi_file, post_location + 5);
+
+ dvi_info.unit_num = get_unsigned_quad(dvi_file);
+ dvi_info.unit_den = get_unsigned_quad(dvi_file);
+ dvi_info.mag = get_unsigned_quad(dvi_file);
+
+ dvi_info.media_height = get_unsigned_quad(dvi_file);
+ dvi_info.media_width = get_unsigned_quad(dvi_file);
+
+ dvi_info.stackdepth = get_unsigned_pair(dvi_file);
+
+ if (dvi_info.stackdepth > DVI_STACK_DEPTH_MAX) {
+ WARN("DVI need stack depth of %d,", dvi_info.stackdepth);
+ WARN("but DVI_STACK_DEPTH_MAX is %d.", DVI_STACK_DEPTH_MAX);
+ ERROR("Capacity exceeded.");
+ }
+
+ if (verbose > 2) {
+ MESG("DVI File Info\n");
+ MESG("Unit: %ld / %ld\n", dvi_info.unit_num, dvi_info.unit_den);
+ MESG("Magnification: %ld\n", dvi_info.mag);
+ MESG("Media Height: %ld\n", dvi_info.media_height);
+ MESG("Media Width: %ld\n", dvi_info.media_width);
+ MESG("Stack Depth: %d\n", dvi_info.stackdepth);
+ }
+}
+
+static void
+get_preamble_dvi_info (void)
+{
+ UNSIGNED_BYTE ch;
+
+ ch = get_unsigned_byte(dvi_file);
+ if (ch != PRE) {
+ MESG("Found %d where PRE was expected\n", ch);
+ ERROR(invalid_signature);
+ }
+
+ ch = get_unsigned_byte(dvi_file);
+#ifdef XETEX
+ if (!(ch == DVI_ID || ch == DVIV_ID || ch == XDVI_ID)) {
+#else
+ if (!(ch == DVI_ID || ch == DVIV_ID)) {
+#endif
+ MESG("DVI ID = %d\n", ch);
+ ERROR(invalid_signature);
+ }
+
+ dvi_info.unit_num = get_unsigned_quad(dvi_file);
+ dvi_info.unit_den = get_unsigned_quad(dvi_file);
+ dvi_info.mag = get_unsigned_quad(dvi_file);
+
+ ch = get_unsigned_byte(dvi_file);
+ if (fread(dvi_info.comment,
+ 1, ch, dvi_file) != ch) {
+ ERROR(invalid_signature);
+ }
+ dvi_info.comment[ch] = '\0';
+
+ if (verbose > 2) {
+ MESG("DVI File Info\n");
+ MESG("Unit: %ld / %ld\n", dvi_info.unit_num, dvi_info.unit_den);
+ MESG("Magnification: %ld\n", dvi_info.mag);
+ }
+
+ if (verbose) {
+ MESG("DVI Comment: %s\n", dvi_info.comment);
+ }
+
+ num_pages = 0x7FFFFFFUL; /* for linear processing: we just keep going! */
+}
+
+const char *
+dvi_comment (void)
+{
+ return dvi_info.comment;
+}
+
+static void
+read_font_record (SIGNED_QUAD tex_id)
+{
+ UNSIGNED_BYTE dir_length, name_length;
+ UNSIGNED_QUAD checksum, point_size, design_size;
+ char *directory, *font_name;
+
+ if (num_def_fonts >= max_def_fonts) {
+ max_def_fonts += TEX_FONTS_ALLOC_SIZE;
+ def_fonts = RENEW (def_fonts, max_def_fonts, struct font_def);
+ }
+ checksum = get_unsigned_quad(dvi_file);
+ point_size = get_unsigned_quad(dvi_file);
+ design_size = get_unsigned_quad(dvi_file);
+ dir_length = get_unsigned_byte(dvi_file);
+ name_length = get_unsigned_byte(dvi_file);
+
+ directory = NEW(dir_length + 1, char);
+ if (fread(directory, 1, dir_length, dvi_file) != dir_length) {
+ ERROR(invalid_signature);
+ }
+ directory[dir_length] = '\0';
+ RELEASE(directory); /* unused */
+
+ font_name = NEW(name_length + 1, char);
+ if (fread(font_name, 1, name_length, dvi_file) != name_length) {
+ ERROR(invalid_signature);
+ }
+ font_name[name_length] = '\0';
+ def_fonts[num_def_fonts].tex_id = tex_id;
+ def_fonts[num_def_fonts].font_name = font_name;
+ def_fonts[num_def_fonts].point_size = point_size;
+ def_fonts[num_def_fonts].design_size = design_size;
+ def_fonts[num_def_fonts].used = 0;
+#ifdef XETEX
+ def_fonts[num_def_fonts].fam_name = NULL;
+ def_fonts[num_def_fonts].sty_name = NULL;
+ def_fonts[num_def_fonts].rgba_color = 0xffffffff;
+ def_fonts[num_def_fonts].layout_dir = 0;
+#endif
+ num_def_fonts++;
+
+ return;
+}
+
+#ifdef XETEX
+static void
+read_native_font_record (SIGNED_QUAD tex_id)
+{
+ UNSIGNED_PAIR flags;
+ UNSIGNED_QUAD point_size;
+ char *font_name, *fam_name, *sty_name;
+ int plen, flen, slen;
+
+ if (num_def_fonts >= max_def_fonts) {
+ max_def_fonts += TEX_FONTS_ALLOC_SIZE;
+ def_fonts = RENEW (def_fonts, max_def_fonts, struct font_def);
+ }
+ point_size = get_unsigned_quad(dvi_file);
+ flags = get_unsigned_pair(dvi_file);
+
+ if ((flags & XDV_FLAG_FONTTYPE_ICU) || (flags & XDV_FLAG_FONTTYPE_ATSUI)) {
+ plen = (int) get_unsigned_byte(dvi_file); /* PS name length */
+ flen = (int) get_unsigned_byte(dvi_file); /* family name length */
+ slen = (int) get_unsigned_byte(dvi_file); /* style name length */
+ font_name = NEW(plen + 1, char);
+ if (fread(font_name, 1, plen, dvi_file) != plen) {
+ ERROR(invalid_signature);
+ }
+ font_name[plen] = '\0';
+ fam_name = NEW(flen + 1, char);
+ if (fread(fam_name, 1, flen, dvi_file) != flen) {
+ ERROR(invalid_signature);
+ }
+ fam_name[flen] = '\0';
+ sty_name = NEW(slen + 1, char);
+ if (fread(sty_name, 1, slen, dvi_file) != slen) {
+ ERROR(invalid_signature);
+ }
+ sty_name[slen] = '\0';
+ def_fonts[num_def_fonts].tex_id = tex_id;
+ def_fonts[num_def_fonts].font_name = font_name;
+ def_fonts[num_def_fonts].fam_name = fam_name;
+ def_fonts[num_def_fonts].sty_name = sty_name;
+ def_fonts[num_def_fonts].point_size = point_size;
+ def_fonts[num_def_fonts].design_size = 655360; /* hard-code as 10pt for now, not used anyway */
+ def_fonts[num_def_fonts].used = 0;
+ if (flags & XDV_FLAG_VERTICAL)
+ def_fonts[num_def_fonts].layout_dir = 1;
+ else
+ def_fonts[num_def_fonts].layout_dir = 0;
+ if (flags & XDV_FLAG_COLORED) {
+ def_fonts[num_def_fonts].rgba_color = get_unsigned_quad(dvi_file);
+ } else {
+ def_fonts[num_def_fonts].rgba_color = 0xffffffff;
+ }
+ if (flags & XDV_FLAG_VARIATIONS) {
+ int v, nvars = get_unsigned_pair(dvi_file);
+ for (v = 0; v < nvars * 2; ++v)
+ (void)get_unsigned_quad(dvi_file); /* skip axis and value for each variation setting */
+ WARN("Variation axes are not supported; ignoring variation settings for font %s.\n", font_name);
+ }
+ num_def_fonts++;
+ } else {
+ ERROR("Unknown native_font flags.");
+ }
+
+ return;
+}
+#endif
+
+static void
+get_dvi_fonts (long post_location)
+{
+ UNSIGNED_BYTE code;
+ SIGNED_QUAD tex_id = 0;
+
+ seek_absolute(dvi_file, post_location + 29);
+ while ((code = get_unsigned_byte(dvi_file)) != POST_POST) {
+ switch (code) {
+ case FNT_DEF1:
+ tex_id = get_unsigned_byte(dvi_file);
+ break;
+ case FNT_DEF2:
+ tex_id = get_unsigned_pair(dvi_file);
+ break;
+ case FNT_DEF3:
+ tex_id = get_unsigned_triple(dvi_file);
+ break;
+ case FNT_DEF4:
+#ifdef XETEX
+ case XDV_NATIVE_FONT_DEF:
+#endif
+ tex_id = get_signed_quad(dvi_file);
+ break;
+ default:
+ MESG("Unexpected op code: %3d\n", code);
+ ERROR(invalid_signature);
+ }
+#ifdef XETEX
+ if (code != XDV_NATIVE_FONT_DEF) {
+ read_font_record(tex_id);
+ } else {
+ read_native_font_record(tex_id);
+ }
+#else
+ read_font_record(tex_id);
+#endif
+ }
+ if (verbose > 2) {
+ unsigned i;
+
+ MESG("\n");
+ MESG("DVI file font info\n");
+ for (i = 0; i < num_def_fonts; i++) {
+ MESG("TeX Font: %10s loaded at ID=%5ld, ",
+ def_fonts[i].font_name, def_fonts[i].tex_id);
+ MESG("size=%5.2fpt (scaled %4.1f%%)",
+ def_fonts[i].point_size * dvi2pts,
+ 100.0 * ((double) def_fonts[i].point_size / def_fonts[i].design_size));
+ MESG("\n");
+ }
+ }
+}
+
+static void get_comment (void)
+{
+ UNSIGNED_BYTE length;
+
+ seek_absolute(dvi_file, 14);
+ length = get_unsigned_byte(dvi_file);
+ if (fread(dvi_info.comment,
+ 1, length, dvi_file) != length) {
+ ERROR(invalid_signature);
+ }
+ dvi_info.comment[length] = '\0';
+ if (verbose) {
+ MESG("DVI Comment: %s\n", dvi_info.comment);
+ }
+}
+
+/*
+ * The section below this line deals with the actual processing of the
+ * dvi file.
+ *
+ * The dvi file processor state is contained in the following variables:
+ */
+
+struct dvi_registers
+{
+ SIGNED_QUAD h, v, w, x, y, z, d;
+};
+
+static struct dvi_registers dvi_state;
+static struct dvi_registers dvi_stack[DVI_STACK_DEPTH_MAX];
+static unsigned dvi_stack_depth = 0 ;
+static int current_font = -1;
+static int processing_page = 0 ;
+
+static void
+clear_state (void)
+{
+ dvi_state.h = 0; dvi_state.v = 0; dvi_state.w = 0;
+ dvi_state.x = 0; dvi_state.y = 0; dvi_state.z = 0;
+ dvi_state.d = 0; /* direction */
+ dvi_stack_depth = 0;
+ current_font = -1;
+}
+
+/* Migrated from pdfdev.c:
+ * The following codes are originally put into pdfdev.c.
+ * But they are moved to here to make PDF output independent
+ * from DVI input.
+ * pdfdoc, pdfspecial and htex are also modified. pdfspecial
+ * and htex does tag/untag depth. pdfdev and pdfdoc now does
+ * not care about line-breaking at all.
+ */
+static unsigned marked_depth = 0;
+static int tagged_depth = -1;
+
+static void
+dvi_mark_depth (void)
+{
+ /* If decreasing below tagged_depth */
+ if (link_annot &&
+ marked_depth == tagged_depth &&
+ dvi_stack_depth == tagged_depth - 1) {
+ /*
+ * See if this appears to be the end of a "logical unit"
+ * that's been broken. If so, flush the logical unit.
+ */
+ pdf_doc_break_annot();
+ }
+ marked_depth = dvi_stack_depth;
+}
+
+/*
+ * The following routines setup and tear down a callback at a
+ * certain stack depth. This is used to handle broken (linewise)
+ * links.
+ */
+void
+dvi_tag_depth (void)
+{
+ tagged_depth = marked_depth;
+ dvi_compute_boxes(1);
+}
+
+void
+dvi_untag_depth (void)
+{
+ tagged_depth = -1;
+ dvi_compute_boxes(0);
+}
+
+void
+dvi_compute_boxes (int flag)
+{
+ compute_boxes = flag;
+}
+
+void
+dvi_link_annot (int flag)
+{
+ link_annot = flag;
+}
+
+void
+dvi_do_special (const void *buffer, UNSIGNED_QUAD size)
+{
+ double x_user, y_user, mag;
+ char *p;
+
+ if (size > 0x7fffffffUL) {
+ WARN("Special more than %ul bytes???", size);
+ return;
+ }
+
+ graphics_mode();
+
+ p = (char *) buffer;
+
+ x_user = dvi_state.h * dvi2pts;
+ y_user = -dvi_state.v * dvi2pts;
+ mag = dvi_tell_mag();
+
+ if (spc_exec_special(p, (long) size, x_user, y_user, mag) < 0) {
+ if (verbose) {
+ dump(p, p + size);
+ }
+ }
+
+ return;
+}
+
+double
+dvi_unit_size (void)
+{
+ return dvi2pts;
+}
+
+
+int
+dvi_locate_font (const char *tfm_name, spt_t ptsize)
+{
+ int cur_id = -1;
+ const char *name = tfm_name;
+ int subfont_id = -1, font_id; /* VF or device font ID */
+ fontmap_rec *mrec;
+
+ if (verbose)
+ MESG("<%s@%.2fpt", tfm_name, ptsize * dvi2pts);
+
+ need_more_fonts(1);
+
+ /* This routine needs to be recursive/reentrant. Load current high water
+ * mark into an automatic variable.
+ */
+ cur_id = num_loaded_fonts++;
+
+ mrec = pdf_lookup_fontmap_record(tfm_name);
+ /* Load subfont mapping table */
+ if (mrec && mrec->charmap.sfd_name && mrec->charmap.subfont_id) {
+ subfont_id = sfd_load_record(mrec->charmap.sfd_name, mrec->charmap.subfont_id);
+ }
+
+ /* TFM must exist here. */
+ loaded_fonts[cur_id].tfm_id = tfm_open(tfm_name, 1);
+ loaded_fonts[cur_id].subfont_id = subfont_id;
+ loaded_fonts[cur_id].size = ptsize;
+ /* This will be reset later if it was really generated by the dvi file. */
+ loaded_fonts[cur_id].source = VF;
+
+ /* The order of searching fonts is as follows:
+ *
+ * 1. If mrec is null, that is, there is no map entry matching
+ * with tfm_name, then search a virtual font matching with
+ * tfm_name at first. If no virtual font is found, search a
+ * PK font matching with tfm_name.
+ *
+ * 2. If mrec is non-null, search a physical scalable font.
+ *
+ * 3. Notice that every subfont gets non-null mrec. In this case,
+ * enc_name corresponding to mrec will be used instead of mrec.
+ * That is enc_name is NULL, search a virtual font for Omega (.ovf)
+ * matching with the base name of the subfont. If no virtual font
+ * for Omega is found, it is a fatal error because there is no PK font
+ * for Omega.
+ */
+ if (!mrec) {
+ font_id = vf_locate_font(tfm_name, ptsize);
+ if (font_id >= 0) {
+ loaded_fonts[cur_id].type = VIRTUAL;
+ loaded_fonts[cur_id].font_id = font_id;
+ if (verbose)
+ MESG("(VF)>");
+ return cur_id;
+ }
+ }
+#if 1
+ /* Sorry, I don't understand this well... Please fix.
+ * The purpose of this seems to be:
+ *
+ * Map 8-bit char codes in subfont to 16-bit code with SFD mapping
+ * and map subfonts to single OVF font.
+ *
+ * But it apparently only does TFM -> OVF mapping but no character
+ * code mapping. Please see dvi_set(), you can't have both font->type
+ * VIRTUAL and font->subfont_id >= 0. Am I missing something?
+ */
+ else if (subfont_id >= 0 && mrec->map_name)
+ {
+ fontmap_rec *mrec1 = pdf_lookup_fontmap_record(mrec->map_name);
+ /* enc_name=NULL should be used only for 'built-in' encoding.
+ * Please fix this!
+ */
+ if (mrec1 && !mrec1->enc_name) {
+ font_id = vf_locate_font(mrec1->font_name, ptsize);
+ if (font_id < 0)
+ WARN("Could not locate Omega Virtual Font \"%s\" for \"%s\".",
+ mrec1->font_name, tfm_name);
+ else {
+ loaded_fonts[cur_id].type = VIRTUAL;
+ loaded_fonts[cur_id].font_id = font_id;
+ if (verbose)
+ MESG("(OVF)>");
+ return cur_id;
+ }
+ }
+ }
+#endif /* 1 */
+
+ /* Failed to load a virtual font so we try to load a physical font. */
+
+ /* If mrec->map_name is not NULL, font name identified in PDF output
+ * is different than tfm_name, this can happen for subfonts grouped
+ * into a single "intermediate" font foo@SFD@.
+ * This is necessary for optimal output; to avoid unnecessary creation
+ * of multiple instances of a same font, to avoid frequent font selection
+ * and break of string_mode.
+ */
+ if (mrec && mrec->map_name) {
+ name = mrec->map_name;
+ } else {
+ name = tfm_name;
+ }
+
+ /* We need ptsize for PK font creation. */
+ font_id = pdf_dev_locate_font(name, ptsize);
+ if (font_id < 0) {
+ WARN("Could not locate a virtual/physical font for TFM \"%s\".", tfm_name);
+ if (mrec && mrec->map_name) { /* has map_name */
+ fontmap_rec *mrec1 = pdf_lookup_fontmap_record(mrec->map_name);
+ WARN(">> This font is mapped to an intermediate 16-bit font \"%s\" with SFD charmap=<%s,%s>,",
+ mrec->map_name, mrec->charmap.sfd_name, mrec->charmap.subfont_id);
+ if (!mrec1)
+ WARN(">> but I couldn't find font mapping for \"%s\".", mrec->map_name);
+ else {
+ WARN(">> and then mapped to a physical font \"%s\" by fontmap.", mrec1->font_name);
+ WARN(">> Please check if kpathsea library can find this font: %s", mrec1->font_name);
+ }
+ } else if (mrec && !mrec->map_name) {
+ WARN(">> This font is mapped to a physical font \"%s\".", mrec->font_name);
+ WARN(">> Please check if kpathsea library can find this font: %s", mrec->font_name);
+ } else {
+ WARN(">> There are no valid font mapping entry for this font.");
+ WARN(">> Font file name \"%s\" was assumed but failed to locate that font.", tfm_name);
+ }
+ ERROR("Cannot proceed without .vf or \"physical\" font for PDF output...");
+ }
+ loaded_fonts[cur_id].type = PHYSICAL;
+ loaded_fonts[cur_id].font_id = font_id;
+
+ if (verbose)
+ MESG(">");
+
+ return cur_id;
+}
+
+#ifdef XETEX
+static int
+dvi_locate_native_font (const char *ps_name, const char *fam_name,
+ const char *sty_name, spt_t ptsize, int layout_dir)
+{
+ int cur_id = -1;
+ fontmap_rec *mrec;
+ int i;
+ char *fontmap_key = malloc(strlen(ps_name) + 3);
+
+ if (verbose)
+ MESG("<%s(%s:%s)@%.2fpt", ps_name, fam_name, sty_name, ptsize * dvi2pts);
+
+ need_more_fonts(1);
+
+ cur_id = num_loaded_fonts++;
+
+ sprintf(fontmap_key, "%s/%c", ps_name, layout_dir == 0 ? 'H' : 'V');
+ mrec = pdf_lookup_fontmap_record(fontmap_key);
+ if (mrec == NULL) {
+ if (pdf_load_native_font(ps_name, fam_name, sty_name, layout_dir) == -1) {
+ ERROR("Cannot proceed without the \"native\" font: %s (%s %s)...",
+ ps_name, fam_name, sty_name);
+ }
+ mrec = pdf_lookup_fontmap_record(fontmap_key);
+ /* FIXME: would be more efficient if pdf_load_native_font returned the mrec ptr (or NULL for error)
+ so we could avoid doing a second lookup for the item we just inserted */
+ }
+ loaded_fonts[cur_id].font_id = pdf_dev_locate_font(fontmap_key, ptsize);
+ loaded_fonts[cur_id].size = ptsize;
+ loaded_fonts[cur_id].type = NATIVE;
+ free(fontmap_key);
+
+ loaded_fonts[cur_id].ft_face = mrec->opt.ft_face;
+ if (mrec->opt.glyph_widths == NULL) {
+ /* this is the first loaded_font that refers to this fontmap record,
+ so allocate the glyph_width cache and save it in the fontmap */
+ mrec->opt.glyph_widths = NEW(mrec->opt.ft_face->num_glyphs, unsigned short);
+ for (i = 0; i < mrec->opt.ft_face->num_glyphs; ++i)
+ mrec->opt.glyph_widths[i] = 0xffff;
+ }
+ loaded_fonts[cur_id].glyph_widths = mrec->opt.glyph_widths;
+ loaded_fonts[cur_id].layout_dir = layout_dir;
+
+ if (verbose)
+ MESG(">");
+
+ return cur_id;
+}
+#endif
+
+double
+dvi_dev_xpos (void)
+{
+ return dvi_state.h * dvi2pts;
+}
+
+double
+dvi_dev_ypos (void)
+{
+ return -(dvi_state.v * dvi2pts);
+}
+
+static void do_moveto (SIGNED_QUAD x, SIGNED_QUAD y)
+{
+ dvi_state.h = x;
+ dvi_state.v = y;
+}
+
+void dvi_right (SIGNED_QUAD x)
+{
+ if (!dvi_state.d) {
+ dvi_state.h += x;
+ } else {
+ dvi_state.v += x;
+ }
+}
+
+void dvi_down (SIGNED_QUAD y)
+{
+ if (!dvi_state.d) {
+ dvi_state.v += y;
+ } else {
+ dvi_state.h -= y;
+ }
+}
+
+/* Please remove this.
+ * Optimization for 8-bit encodings.
+ */
+static void
+do_string (unsigned char *s, int len)
+{
+ struct loaded_font *font;
+ spt_t width, height, depth;
+ int i;
+
+ if (current_font < 0)
+ ERROR("No font selected!");
+
+ font = &loaded_fonts[current_font];
+
+ width = tfm_string_width(font->tfm_id, s, len);
+ width = sqxfw(font->size, width);
+
+ switch (font->type) {
+ case PHYSICAL:
+ if (font->subfont_id < 0) {
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, s, len,
+ width, font->font_id, 1);
+ if (compute_boxes && link_annot &&
+ marked_depth >= tagged_depth) {
+ pdf_rect rect;
+
+ height = tfm_string_height(font->tfm_id, s, len);
+ depth = tfm_string_depth (font->tfm_id, s, len);
+ height = sqxfw(font->size, height);
+ depth = sqxfw(font->size, depth);
+
+ pdf_dev_set_rect (&rect, dvi_state.h, -dvi_state.v,
+ width, height, depth);
+ pdf_doc_expand_box(&rect);
+ }
+ } else { /* Subfonts */
+ dvi_push();
+ for (i = 0; i < len; i++) {
+ dvi_set(s[i]);
+ }
+ dvi_pop();
+ }
+ break;
+ case VIRTUAL:
+ dvi_push();
+ for (i = 0; i < len; i++) {
+ dvi_set(s[i]);
+ }
+ dvi_pop();
+ }
+ if (!dvi_state.d) {
+ dvi_state.h += width;
+ } else {
+ dvi_state.v += width;
+ }
+}
+
+/* _FIXME_
+ * CMap decoder wants multibyte strings as input but
+ * how DVI char codes are converted to multibyte sting
+ * is not clear.
+ */
+void
+dvi_set (SIGNED_QUAD ch)
+{
+ struct loaded_font *font;
+ spt_t width, height, depth;
+ unsigned char wbuf[2];
+
+ if (current_font < 0) {
+ ERROR("No font selected!");
+ }
+ /* The division by dvi2pts seems strange since we actually know the
+ * "dvi" size of the fonts contained in the DVI file. In other
+ * words, we converted from DVI units to pts and back again!
+ * The problem comes from fonts defined in VF files where we don't know
+ * the DVI size. It's keeping me sane to keep *point sizes* of *all*
+ * fonts in the dev.c file and convert them back if necessary.
+ */
+ font = &loaded_fonts[current_font];
+
+ width = tfm_get_fw_width(font->tfm_id, ch);
+ width = sqxfw(font->size, width);
+
+ switch (font->type) {
+ case PHYSICAL:
+ if (ch > 255) { /* _FIXME_ */
+ wbuf[0] = (ch >> 8) & 0xff;
+ wbuf[1] = ch & 0xff;
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, wbuf, 2,
+ width, font->font_id, 2);
+ } else if (font->subfont_id >= 0) {
+ unsigned short uch = lookup_sfd_record(font->subfont_id, (unsigned char) ch);
+ wbuf[0] = (uch >> 8) & 0xff;
+ wbuf[1] = uch & 0xff;
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, wbuf, 2,
+ width, font->font_id, 2);
+ } else {
+ wbuf[0] = (unsigned char) ch;
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, wbuf, 1,
+ width, font->font_id, 1);
+ }
+ if (compute_boxes && link_annot &&
+ marked_depth >= tagged_depth) {
+ pdf_rect rect;
+
+ height = tfm_get_fw_height(font->tfm_id, ch);
+ depth = tfm_get_fw_depth (font->tfm_id, ch);
+ height = sqxfw(font->size, height);
+ depth = sqxfw(font->size, depth);
+
+ pdf_dev_set_rect (&rect, dvi_state.h, -dvi_state.v,
+ width, height, depth);
+ pdf_doc_expand_box(&rect);
+ }
+ break;
+ case VIRTUAL:
+#if 0
+ /* See comment in locate_font() */
+ if (font->subfont_id >= 0)
+ ch = lookup_sfd_record(font->subfont_id, (unsigned char) ch);
+#endif /* 0 */
+ vf_set_char(ch, font->font_id); /* push/pop invoked */
+ break;
+ }
+
+ if (!dvi_state.d) {
+ dvi_state.h += width;
+ } else {
+ dvi_state.v += width;
+ }
+}
+
+void
+dvi_put (SIGNED_QUAD ch)
+{
+ struct loaded_font *font;
+ spt_t width, height, depth;
+ unsigned char wbuf[2];
+
+ if (current_font < 0) {
+ ERROR("No font selected!");
+ }
+
+ font = &loaded_fonts[current_font];
+
+ switch (font->type) {
+ case PHYSICAL:
+ width = tfm_get_fw_width(font->tfm_id, ch);
+ width = sqxfw(font->size, width);
+
+ /* Treat a single character as a one byte string and use the
+ * string routine.
+ */
+ if (ch > 255) { /* _FIXME_ */
+ wbuf[0] = (ch >> 8) & 0xff;
+ wbuf[1] = ch & 0xff;
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, wbuf, 2,
+ width, font->font_id, 2);
+ } else if (font->subfont_id >= 0) {
+ unsigned int uch;
+
+ uch = lookup_sfd_record(font->subfont_id, (unsigned char) ch);
+ wbuf[0] = (uch >> 8) & 0xff;
+ wbuf[1] = uch & 0xff;
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, wbuf, 2,
+ width, font->font_id, 2);
+ } else {
+ wbuf[0] = (unsigned char) ch;
+ pdf_dev_set_string(dvi_state.h, -dvi_state.v, wbuf, 1,
+ width, font->font_id, 1);
+ }
+ if (compute_boxes && link_annot &&
+ marked_depth >= tagged_depth) {
+ pdf_rect rect;
+
+ height = tfm_get_fw_height(font->tfm_id, ch);
+ depth = tfm_get_fw_depth (font->tfm_id, ch);
+ height = sqxfw(font->size, height);
+ depth = sqxfw(font->size, depth);
+
+ pdf_dev_set_rect (&rect, dvi_state.h, -dvi_state.v,
+ width, height, depth);
+ pdf_doc_expand_box(&rect);
+ }
+ break;
+ case VIRTUAL:
+#if 0
+ /* See comment in locate_font() */
+ if (font->subfont_id >= 0)
+ ch = lookup_sfd_record(font->subfont_id, (unsigned char) ch);
+#endif /* 0 */
+ vf_set_char(ch, font->font_id);
+ break;
+ }
+
+ return;
+}
+
+
+void
+dvi_rule (SIGNED_QUAD width, SIGNED_QUAD height)
+{
+ do_moveto(dvi_state.h, dvi_state.v);
+
+ if (!dvi_state.d) {
+ pdf_dev_set_rule(dvi_state.h, -dvi_state.v, width, height);
+ } else { /* right ? */
+ pdf_dev_set_rule(dvi_state.h, -dvi_state.v - width, height, width);
+ }
+}
+
+void
+dvi_dir (UNSIGNED_BYTE dir)
+{
+ dvi_state.d = dir ? 1 : 0;
+ pdf_dev_set_dirmode(dvi_state.d); /* 0: horizontal, 1: vertical */
+}
+
+static void
+do_set1 (void)
+{
+ dvi_set(get_buffered_unsigned_byte());
+}
+
+static void
+do_set2 (void)
+{
+ dvi_set(get_buffered_unsigned_pair());
+}
+
+static void
+do_setrule (void)
+{
+ SIGNED_QUAD width, height;
+
+ height = get_buffered_signed_quad();
+ width = get_buffered_signed_quad();
+ if (width > 0 && height > 0) {
+ dvi_rule(width, height);
+ }
+ dvi_right(width);
+}
+
+static void
+do_putrule (void)
+{
+ SIGNED_QUAD width, height;
+
+ height = get_buffered_signed_quad ();
+ width = get_buffered_signed_quad ();
+ if (width > 0 && height > 0) {
+ dvi_rule(width, height);
+ }
+}
+
+static void
+do_put1 (void)
+{
+ dvi_put(get_buffered_unsigned_byte());
+}
+
+static void
+do_put2 (void)
+{
+ dvi_put(get_buffered_unsigned_pair());
+}
+
+void
+dvi_push (void)
+{
+ if (dvi_stack_depth >= DVI_STACK_DEPTH_MAX)
+ ERROR("DVI stack exceeded limit.");
+
+ dvi_stack[dvi_stack_depth++] = dvi_state;
+}
+
+void
+dvi_pop (void)
+{
+ if (dvi_stack_depth <= 0)
+ ERROR ("Tried to pop an empty stack.");
+
+ dvi_state = dvi_stack[--dvi_stack_depth];
+ do_moveto(dvi_state.h, dvi_state.v);
+ pdf_dev_set_dirmode(dvi_state.d); /* 0: horizontal, 1: vertical */
+}
+
+
+static void
+do_right1 (void)
+{
+ dvi_right(get_buffered_signed_byte());
+}
+
+static void
+do_right2 (void)
+{
+ dvi_right(get_buffered_signed_pair());
+}
+
+static void
+do_right3 (void)
+{
+ dvi_right(get_buffered_signed_triple());
+}
+
+static void
+do_right4 (void)
+{
+ dvi_right(get_buffered_signed_quad());
+}
+
+void
+dvi_w (SIGNED_QUAD ch)
+{
+ dvi_state.w = ch;
+ dvi_right(ch);
+}
+
+void
+dvi_w0 (void)
+{
+ dvi_right(dvi_state.w);
+}
+
+static void
+do_w1 (void)
+{
+ dvi_w(get_buffered_signed_byte());
+}
+
+static void
+do_w2 (void)
+{
+ dvi_w(get_buffered_signed_pair());
+}
+
+static void
+do_w3 (void)
+{
+ dvi_w(get_buffered_signed_triple());
+}
+
+static void
+do_w4 (void)
+{
+ dvi_w(get_buffered_signed_quad());
+}
+
+void
+dvi_x (SIGNED_QUAD ch)
+{
+ dvi_state.x = ch;
+ dvi_right(ch);
+}
+
+void
+dvi_x0 (void)
+{
+ dvi_right(dvi_state.x);
+}
+
+static void
+do_x1 (void)
+{
+ dvi_x(get_buffered_signed_byte());
+}
+
+static void
+do_x2 (void)
+{
+ dvi_x(get_buffered_signed_pair());
+}
+
+static void
+do_x3 (void)
+{
+ dvi_x(get_buffered_signed_triple());
+}
+
+static void
+do_x4 (void)
+{
+ dvi_x(get_buffered_signed_quad());
+}
+
+static void
+do_down1 (void)
+{
+ dvi_down(get_buffered_signed_byte());
+}
+
+static void
+do_down2 (void)
+{
+ dvi_down(get_buffered_signed_pair());
+}
+
+static void
+do_down3 (void)
+{
+ dvi_down(get_buffered_signed_triple());
+}
+
+static void
+do_down4 (void)
+{
+ dvi_down(get_buffered_signed_quad());
+}
+
+void
+dvi_y (SIGNED_QUAD ch)
+{
+ dvi_state.y = ch;
+ dvi_down(ch);
+}
+
+void
+dvi_y0 (void)
+{
+ dvi_down(dvi_state.y);
+}
+
+static
+void do_y1 (void)
+{
+ dvi_y(get_buffered_signed_byte());
+}
+
+static
+void do_y2 (void)
+{
+ dvi_y(get_buffered_signed_pair());
+}
+
+static
+void do_y3 (void)
+{
+ dvi_y(get_buffered_signed_triple());
+}
+
+static
+void do_y4 (void)
+{
+ dvi_y(get_buffered_signed_quad());
+}
+
+void
+dvi_z (SIGNED_QUAD ch)
+{
+ dvi_state.z = ch;
+ dvi_down(ch);
+}
+
+void
+dvi_z0 (void)
+{
+ dvi_down(dvi_state.z);
+}
+
+static void
+do_z1 (void)
+{
+ dvi_z(get_buffered_signed_byte());
+}
+
+static void
+do_z2 (void)
+{
+ dvi_z(get_buffered_signed_pair());
+}
+
+static void
+do_z3 (void)
+{
+ dvi_z(get_buffered_signed_triple());
+}
+
+static void
+do_z4 (void)
+{
+ dvi_z(get_buffered_signed_quad());
+}
+
+static void
+skip_fntdef (void)
+{
+ int area_len, name_len, i;
+
+ get_signed_quad(dvi_file);
+ get_signed_quad(dvi_file);
+ get_signed_quad(dvi_file);
+ area_len = get_unsigned_byte(dvi_file);
+ name_len = get_unsigned_byte(dvi_file);
+ for (i = 0; i < area_len + name_len; i++) {
+ get_unsigned_byte(dvi_file);
+ }
+}
+
+static void
+do_fntdef1 (int scanning)
+{
+ if (scanning) {
+ /* when pre-scanning the page, we process fntdef and don't buffer it */
+ SIGNED_QUAD tex_id = get_unsigned_byte(dvi_file);
+ if (linear) {
+ read_font_record(tex_id);
+ }
+ else {
+ skip_fntdef();
+ }
+ --dvi_page_buf_index; /* remove the fntdef opcode from the buffer */
+ }
+}
+
+static void
+do_fntdef2 (int scanning)
+{
+ if (scanning) {
+ SIGNED_QUAD tex_id = get_unsigned_pair(dvi_file);
+ if (linear) {
+ read_font_record(tex_id);
+ }
+ else {
+ skip_fntdef();
+ }
+ --dvi_page_buf_index;
+ }
+}
+
+static void
+do_fntdef3 (int scanning)
+{
+ if (scanning) {
+ SIGNED_QUAD tex_id = get_unsigned_triple(dvi_file);
+ if (linear) {
+ read_font_record(tex_id);
+ }
+ else {
+ skip_fntdef();
+ }
+ --dvi_page_buf_index;
+ }
+}
+
+static void
+do_fntdef4 (int scanning)
+{
+ if (scanning) {
+ SIGNED_QUAD tex_id = get_signed_quad(dvi_file);
+ if (linear) {
+ read_font_record(tex_id);
+ }
+ else {
+ skip_fntdef();
+ }
+ --dvi_page_buf_index;
+ }
+}
+
+void
+dvi_set_font (int font_id)
+{
+ current_font = font_id;
+}
+
+static void
+do_fnt (SIGNED_QUAD tex_id)
+{
+ int i;
+
+ for (i = 0; i < num_def_fonts; i++) {
+ if (def_fonts[i].tex_id == tex_id)
+ break;
+ }
+
+ if (i == num_def_fonts) {
+ ERROR("Tried to select a font that hasn't been defined: id=%ld", tex_id);
+ }
+
+ if (!def_fonts[i].used) {
+ int font_id;
+
+#ifdef XETEX
+ if (def_fonts[i].fam_name) {
+ font_id = dvi_locate_native_font(def_fonts[i].font_name,
+ def_fonts[i].fam_name,
+ def_fonts[i].sty_name,
+ def_fonts[i].point_size,
+ def_fonts[i].layout_dir);
+ } else {
+ font_id = dvi_locate_font(def_fonts[i].font_name,
+ def_fonts[i].point_size);
+ }
+ loaded_fonts[font_id].rgba_color = def_fonts[i].rgba_color;
+#else
+ font_id = dvi_locate_font(def_fonts[i].font_name, def_fonts[i].point_size);
+#endif
+ loaded_fonts[font_id].source = DVI;
+ def_fonts[i].used = 1;
+ def_fonts[i].font_id = font_id;
+ }
+ current_font = def_fonts[i].font_id;
+}
+
+static void
+do_fnt1 (void)
+{
+ SIGNED_QUAD tex_id;
+
+ tex_id = get_buffered_unsigned_byte();
+ do_fnt(tex_id);
+}
+
+static void
+do_fnt2 (void)
+{
+ SIGNED_QUAD tex_id;
+
+ tex_id = get_buffered_unsigned_pair();
+ do_fnt(tex_id);
+}
+
+static void
+do_fnt3 (void)
+{
+ SIGNED_QUAD tex_id;
+
+ tex_id = get_buffered_unsigned_triple();
+ do_fnt(tex_id);
+}
+
+static void
+do_fnt4 (void)
+{
+ SIGNED_QUAD tex_id;
+
+ tex_id = get_buffered_signed_quad();
+ do_fnt(tex_id);
+}
+
+static void
+do_xxx (UNSIGNED_QUAD size)
+{
+ UNSIGNED_QUAD i;
+ Ubyte *buffer; /* FIXME - no need for new buffer here */
+
+ buffer = NEW(size+1, Ubyte);
+ for (i = 0; i < size; i++) {
+ buffer[i] = get_buffered_unsigned_byte();
+ }
+ dvi_do_special(buffer, size);
+ RELEASE(buffer);
+}
+
+static void
+do_xxx1 (void)
+{
+ SIGNED_QUAD size;
+
+ size = get_buffered_unsigned_byte();
+ do_xxx(size);
+}
+
+static void
+do_xxx2 (void)
+{
+ SIGNED_QUAD size;
+
+ size = get_buffered_unsigned_pair();
+ do_xxx(size);
+}
+
+static void
+do_xxx3 (void)
+{
+ SIGNED_QUAD size;
+
+ size = get_buffered_unsigned_triple();
+ do_xxx(size);
+}
+
+static void
+do_xxx4 (void)
+{
+ SIGNED_QUAD size;
+
+ size = get_buffered_unsigned_quad();
+ do_xxx(size);
+}
+
+static void
+do_bop (void)
+{
+ int i;
+
+ if (processing_page)
+ ERROR("Got a bop in the middle of a page!");
+
+ /* For now, ignore TeX's count registers */
+ for (i = 0; i < 10; i++) {
+ get_buffered_signed_quad();
+ }
+ /* Ignore previous page pointer since we have already
+ * saved this information
+ */
+ get_buffered_signed_quad();
+ clear_state();
+ processing_page = 1;
+
+ pdf_doc_begin_page(dvi_tell_mag(), dev_origin_x, dev_origin_y);
+ spc_exec_at_begin_page();
+
+ return;
+}
+
+static void
+do_eop (void)
+{
+ processing_page = 0;
+
+ if (dvi_stack_depth != 0) {
+ ERROR("DVI stack depth is not zero at end of page");
+ }
+ spc_exec_at_end_page();
+
+ pdf_doc_end_page();
+
+ return;
+}
+
+static void
+do_dir (void)
+{
+ dvi_state.d = get_buffered_unsigned_byte() ? 1 : 0;
+ pdf_dev_set_dirmode(dvi_state.d); /* 0: horizontal, 1: vertical */
+}
+
+#ifdef XETEX
+static void
+do_native_font_def (int scanning)
+{
+ if (scanning) {
+ SIGNED_QUAD tex_id = get_signed_quad(dvi_file);
+ if (linear) {
+ read_native_font_record(tex_id);
+ }
+ else {
+ UNSIGNED_PAIR flags;
+ int name_length, nvars, i;
+
+ get_unsigned_quad(dvi_file); /* skip point size */
+ flags = get_unsigned_pair(dvi_file);
+ if ((flags & XDV_FLAG_FONTTYPE_ICU) || (flags & XDV_FLAG_FONTTYPE_ATSUI)) {
+ name_length = (int) get_unsigned_byte(dvi_file);
+ name_length += (int) get_unsigned_byte(dvi_file);
+ name_length += (int) get_unsigned_byte(dvi_file);
+ for (i = 0; i < name_length; ++i)
+ get_unsigned_byte(dvi_file);
+ if (flags & XDV_FLAG_COLORED) {
+ get_unsigned_quad(dvi_file);
+ }
+ if (flags & XDV_FLAG_VARIATIONS) {
+ nvars = get_unsigned_pair(dvi_file);
+ for (i = 0; i < nvars * 2; ++i)
+ get_unsigned_quad(dvi_file); /* skip axis and value for each variation setting */
+ }
+ } else {
+ ERROR(invalid_signature);
+ }
+ }
+ --dvi_page_buf_index; /* don't buffer the opcode */
+ }
+}
+
+static void
+do_glyph_array (int yLocsPresent)
+{
+ struct loaded_font *font;
+ spt_t width, height, depth, *xloc, *yloc, glyph_width = 0;
+ unsigned char wbuf[2];
+ unsigned int i, glyph_id, slen = 0;
+
+ if (current_font < 0)
+ ERROR("No font selected!");
+
+ font = &loaded_fonts[current_font];
+
+ width = get_buffered_signed_quad();
+
+ slen = (unsigned int) get_buffered_unsigned_pair();
+ xloc = NEW(slen, spt_t);
+ yloc = NEW(slen, spt_t);
+ for (i = 0; i < slen; i++) {
+ xloc[i] = get_buffered_signed_quad();
+ yloc[i] = yLocsPresent ? get_buffered_signed_quad() : 0;
+ }
+
+ if (font->rgba_color != 0xffffffff) {
+ pdf_color color;
+ pdf_color_push();
+ pdf_color_rgbcolor(&color,
+ (double)((unsigned char)(font->rgba_color >> 24) & 0xff) / 255,
+ (double)((unsigned char)(font->rgba_color >> 16) & 0xff) / 255,
+ (double)((unsigned char)(font->rgba_color >> 8) & 0xff) / 255);
+ pdf_dev_setcolor(&color, 0); /* stroke color */
+ pdf_dev_setcolor(&color, 1); /* fill color */
+ }
+ for (i = 0; i < slen; i++) {
+ glyph_id = get_buffered_unsigned_pair(); /* freetype glyph index */
+ if (glyph_id < font->ft_face->num_glyphs) {
+ if (font->glyph_widths[glyph_id] == 0xffff) {
+ if (FT_IS_SFNT(font->ft_face)) {
+ /* CFF driver of freetype does not set vertical metrics correctly,
+ so we'll read the metrics directly */
+ TT_HoriHeader *dir_hea; /* vhea structure is identical */
+ dir_hea = FT_Get_Sfnt_Table(font->ft_face, (font->layout_dir == 0)
+ ? ft_sfnt_hhea
+ : ft_sfnt_vhea);
+ if (dir_hea) {
+ FT_UShort *metrics = (FT_UShort*) dir_hea->long_metrics;
+ /* each metrics record is two shorts, advance and sidebearing */
+ if (glyph_id < dir_hea->number_Of_HMetrics)
+ font->glyph_widths[glyph_id] = metrics[glyph_id * 2];
+ else
+ font->glyph_widths[glyph_id] = metrics[2 * (dir_hea->number_Of_HMetrics - 1)];
+ } else
+ font->glyph_widths[glyph_id] = 0;
+ }
+ else {
+ FT_Load_Glyph(font->ft_face, glyph_id, FT_LOAD_NO_SCALE);
+ font->glyph_widths[glyph_id] = (font->layout_dir == 0)
+ ? font->ft_face->glyph->metrics.horiAdvance
+ : font->ft_face->glyph->metrics.vertAdvance;
+ }
+ }
+ glyph_width = (double)font->size * (double)font->glyph_widths[glyph_id] / (double)font->ft_face->units_per_EM;
+ if (compute_boxes && link_annot && marked_depth >= tagged_depth) {
+ pdf_rect rect;
+ height = (double)font->size * (double)font->ft_face->ascender / (double)font->ft_face->units_per_EM;
+ depth = (double)font->size * -(double)font->ft_face->descender / (double)font->ft_face->units_per_EM;
+ pdf_dev_set_rect(&rect, dvi_state.h + xloc[i], -dvi_state.v - yloc[i], glyph_width, height, depth);
+ pdf_doc_expand_box(&rect);
+ }
+ }
+ wbuf[0] = glyph_id >> 8;
+ wbuf[1] = glyph_id & 0xff;
+ pdf_dev_set_string(dvi_state.h + xloc[i], -dvi_state.v - yloc[i], wbuf, 2,
+ glyph_width, font->font_id, -1);
+ }
+ if (font->rgba_color != 0xffffffff) {
+ pdf_color_pop();
+ }
+ RELEASE(xloc);
+ RELEASE(yloc);
+
+ if (!dvi_state.d) {
+ dvi_state.h += width;
+ } else {
+ dvi_state.v += width;
+ }
+
+ return;
+}
+
+void
+do_pic_file()
+ /* parameters for XDV_PIC_FILE opcode: pdf_box[1] t[4][6] p[2] len[2] path[l] */
+{
+ UNSIGNED_BYTE pdf_box;
+ int page_no;
+ UNSIGNED_PAIR len;
+ char *path;
+ int i;
+ int xobj_id;
+ transform_info ti;
+
+ transform_info_clear(&ti);
+
+ pdf_box = get_buffered_unsigned_byte();
+
+ ti.matrix.a = get_buffered_signed_quad() / 65536.0; /* convert 16.16 Fixed to floating-point */
+ ti.matrix.b = get_buffered_signed_quad() / 65536.0;
+ ti.matrix.c = get_buffered_signed_quad() / 65536.0;
+ ti.matrix.d = get_buffered_signed_quad() / 65536.0;
+ ti.matrix.e = get_buffered_signed_quad() / 65536.0;
+ ti.matrix.f = get_buffered_signed_quad() / 65536.0;
+
+ page_no = get_buffered_signed_pair();
+ len = get_buffered_unsigned_pair();
+ path = NEW(len + 1, char);
+ for (i = 0; i < len; ++i)
+ path[i] = get_buffered_unsigned_byte();
+ path[len] = 0;
+
+ /*
+ now we need to place page /page_no/ of the graphic file from /path/, applying /transform/
+ if pdf_box=0 the file is a raster image (.jpg, .png, .tif, etc; need to determine format
+ by examining the file)
+ else it is a PDF document, pdf_box tells which PDF box (media, trim, crop, etc) to use
+ page_no is currently only used with PDF documents, though in theory could be used
+ with multi-page TIFFs, etc
+ transform is a 3x2 affine transform matrix expressed in fixed-point values
+ */
+
+ if (page_no > 0)
+ --page_no; /* convert 1-based page number to 0-based index */
+ xobj_id = pdf_ximage_findresource(path, page_no, pdf_box);
+ if (xobj_id >= 0) {
+ /* FIXME: this seems to work for 72dpi JPEGs, but isn't right for others;
+ need to take the actual image resolution into account in pdf_dev_put_image,
+ not just assume the "original" size is 100dpi
+ */
+ pdf_dev_put_image(xobj_id, &ti, dvi_dev_xpos(), dvi_dev_ypos());
+ }
+
+ RELEASE(path);
+}
+#endif
+
+/* Note to be absolutely certain that the string escape buffer doesn't
+ * hit its limit, FORMAT_BUF_SIZE should set to 4 times S_BUFFER_SIZE
+ * in pdfobj.c. Is there any application that genenerate words with
+ * 1k characters?
+ */
+
+#define SBUF_SIZE 1024
+
+/* Most of the work of actually interpreting
+ * the dvi file is here.
+ */
+void
+dvi_do_page (long n,
+ double paper_width, double paper_height,
+ double hmargin, double vmargin)
+{
+ unsigned char opcode;
+ unsigned char sbuf[SBUF_SIZE];
+ unsigned int slen = 0;
+
+ /* before this is called, we have scanned the page for papersize specials
+ and the complete DVI data is now in dvi_page_buffer */
+ dvi_page_buf_index = 0;
+
+ /* DVI coordinate */
+ dev_origin_x = hmargin;
+ dev_origin_y = paper_height - vmargin;
+
+ dvi_stack_depth = 0;
+ for (;;) {
+ /* The most likely opcodes are individual setchars.
+ * These are buffered for speed. */
+ slen = 0;
+ while ((opcode = get_buffered_unsigned_byte()) <= SET_CHAR_127 &&
+ slen < SBUF_SIZE) {
+ sbuf[slen++] = opcode;
+ }
+ if (slen > 0) {
+ do_string(sbuf, slen);
+ }
+ if (slen == SBUF_SIZE)
+ continue;
+
+ /* If we are here, we have an opcode that is something
+ * other than SET_CHAR.
+ */
+ if (opcode >= FNT_NUM_0 && opcode <= FNT_NUM_63) {
+ do_fnt(opcode - FNT_NUM_0);
+ continue;
+ }
+
+ switch (opcode) {
+ case SET1: do_set1(); break;
+ case SET2: do_set2(); break;
+ case SET3: case SET4:
+ ERROR("Multibyte (>16 bits) character not supported!");
+ break;
+
+ case SET_RULE:
+ do_setrule();
+ break;
+
+ case PUT1: do_put1(); break;
+ case PUT2: do_put2(); break;
+ case PUT3: case PUT4:
+ ERROR ("Multibyte character (>16 bits) not supported!");
+ break;
+
+ case PUT_RULE:
+ do_putrule();
+ break;
+
+ case NOP:
+ break;
+
+ case BOP:
+ do_bop();
+ MESG("[%d", n+1);
+ break;
+ case EOP:
+ do_eop();
+ MESG("]");
+ return;
+ break;
+
+ case PUSH:
+ dvi_push();
+ /* The following line needs to go here instead of in
+ * dvi_push() since logical structure of document is
+ * oblivous to virtual fonts. For example the last line on a
+ * page could be at stack level 3 and the page footer should
+ * be at stack level 3. However, if the page footer contains
+ * virtual fonts (or other nested constructions), it could
+ * fool the link breaker into thinking it was a continuation
+ * of the link */
+ dvi_mark_depth();
+ break;
+ case POP:
+ dvi_pop();
+ /* Above explanation holds for following line too */
+ dvi_mark_depth();
+ break;
+
+ case RIGHT1: do_right1(); break;
+ case RIGHT2: do_right2(); break;
+ case RIGHT3: do_right3(); break;
+ case RIGHT4: do_right4(); break;
+
+ case W0: dvi_w0(); break;
+ case W1: do_w1 (); break;
+ case W2: do_w2 (); break;
+ case W3: do_w3 (); break;
+ case W4: do_w4 (); break;
+
+ case X0: dvi_x0(); break;
+ case X1: do_x1 (); break;
+ case X2: do_x2 (); break;
+ case X3: do_x3 (); break;
+ case X4: do_x4 (); break;
+
+ case DOWN1: do_down1(); break;
+ case DOWN2: do_down2(); break;
+ case DOWN3: do_down3(); break;
+ case DOWN4: do_down4(); break;
+
+ case Y0: dvi_y0(); break;
+ case Y1: do_y1 (); break;
+ case Y2: do_y2 (); break;
+ case Y3: do_y3 (); break;
+ case Y4: do_y4 (); break;
+
+ case Z0: dvi_z0(); break;
+ case Z1: do_z1 (); break;
+ case Z2: do_z2 (); break;
+ case Z3: do_z3 (); break;
+ case Z4: do_z4 (); break;
+
+ case FNT1: do_fnt1(); break;
+ case FNT2: do_fnt2(); break;
+ case FNT3: do_fnt3(); break;
+ case FNT4: do_fnt4(); break;
+
+ /* Specials */
+ case XXX1: do_xxx1(); break;
+ case XXX2: do_xxx2(); break;
+ case XXX3: do_xxx3(); break;
+ case XXX4: do_xxx4(); break;
+
+ /* Font definition - skipped except in linear mode. */
+ /* actually, these should not occur! */
+ case FNT_DEF1: do_fntdef1(0); break;
+ case FNT_DEF2: do_fntdef2(0); break;
+ case FNT_DEF3: do_fntdef3(0); break;
+ case FNT_DEF4: do_fntdef4(0); break;
+
+ /* pTeX extension */
+ case DIR:
+ do_dir();
+ break;
+
+#ifdef XETEX
+ /* XeTeX extension */
+ case XDV_GLYPH_STRING:
+ do_glyph_array(0);
+ break;
+ case XDV_GLYPH_ARRAY:
+ do_glyph_array(1);
+ break;
+ case XDV_NATIVE_FONT_DEF:
+ do_native_font_def(0); /* should not occur - processed during pre-scanning */
+ break;
+ case XDV_PIC_FILE:
+ do_pic_file();
+ break;
+#endif
+ case POST:
+ if (linear && !processing_page) {
+ /* for linear processing, this means there are no more pages */
+ num_pages = 0; /* force loop to terminate */
+ return;
+ }
+ /* else fall through to error case */
+ case PRE: case POST_POST:
+ ERROR("Unexpected preamble or postamble in dvi file");
+ break;
+ default:
+ ERROR("Unexpected opcode or DVI file ended prematurely");
+ }
+ }
+}
+
+double
+dvi_init (char *dvi_filename, double mag)
+{
+ long post_location;
+
+ if (dvi_filename == NULL) { /* no filename: reading from stdin, probably a pipe */
+#ifdef WIN32
+ setmode(fileno(stdin), _O_BINARY);
+#endif
+ dvi_file = stdin;
+ linear = 1;
+
+ get_preamble_dvi_info();
+ do_scales(mag);
+ }
+ else {
+ dvi_file = MFOPEN(dvi_filename, FOPEN_RBIN_MODE);
+ if (!dvi_file) {
+ if ((strlen(dvi_filename) > 4)
+ && ( strcmp(dvi_filename + strlen(dvi_filename) - 4, ".dvi") != 0
+#ifdef XETEX
+ || strcmp(dvi_filename + strlen(dvi_filename) - 4, ".xdv") != 0
+#endif
+ )) {
+#ifdef XETEX
+ strcat(dvi_filename, ".xdv");
+ dvi_file = MFOPEN(dvi_filename, FOPEN_RBIN_MODE);
+ if (!dvi_file) {
+ dvi_filename[strlen(dvi_filename) - 4] = '\0';
+#endif
+ strcat(dvi_filename, ".dvi");
+ dvi_file = MFOPEN(dvi_filename, FOPEN_RBIN_MODE);
+#ifdef XETEX
+ }
+#endif
+ }
+ }
+ if (!dvi_file) {
+#ifdef XETEX
+ ERROR("Could not open specified DVI (or XDV) file: %s", dvi_filename);
+#else
+ ERROR("Could not open specified DVI file: %s", dvi_filename);
+#endif
+ return 0.0;
+ }
+
+ /* DVI files are most easily read backwards by
+ * searching for post_post and then post opcode.
+ */
+ post_location = find_post();
+ get_dvi_info(post_location);
+ do_scales(mag);
+ get_page_info(post_location);
+ get_comment();
+ get_dvi_fonts(post_location);
+ }
+
+ clear_state();
+
+ dvi_page_buf_size = DVI_PAGE_BUF_CHUNK;
+ dvi_page_buffer = NEW(dvi_page_buf_size, unsigned char);
+
+ return dvi2pts;
+}
+
+void
+dvi_close (void)
+{
+ int i;
+
+ if (linear) {
+ /* probably reading a pipe from xetex; consume any remaining data */
+ while (fgetc(dvi_file) != EOF)
+ ;
+ }
+
+ /* We add comment in dvi_close instead of dvi_init so user
+ * has a change to overwrite it. The docinfo dictionary is
+ * treated as a write-once record.
+ */
+
+ /* Do some house cleaning */
+ MFCLOSE(dvi_file);
+ dvi_file = NULL;
+
+ if (def_fonts) {
+ for (i = 0; i < num_def_fonts; i++) {
+ if (def_fonts[i].font_name)
+ RELEASE(def_fonts[i].font_name);
+ def_fonts[i].font_name = NULL;
+#ifdef XETEX
+ if (def_fonts[i].fam_name)
+ RELEASE(def_fonts[i].fam_name);
+ def_fonts[i].fam_name = NULL;
+ if (def_fonts[i].sty_name)
+ RELEASE(def_fonts[i].sty_name);
+ def_fonts[i].sty_name = NULL;
+#endif
+ }
+ RELEASE(def_fonts);
+ }
+ def_fonts = NULL;
+
+ if (page_loc)
+ RELEASE(page_loc);
+ page_loc = NULL;
+ num_pages = 0;
+
+ if (loaded_fonts)
+ RELEASE(loaded_fonts);
+ loaded_fonts = NULL;
+ num_loaded_fonts = 0;
+
+ vf_close_all_fonts();
+ tfm_close_all ();
+
+ if (dvi_page_buffer) {
+ RELEASE(dvi_page_buffer);
+ dvi_page_buffer = NULL;
+ dvi_page_buf_size = 0;
+ }
+}
+
+/* The following are need to implement virtual fonts
+ According to documentation, the vf "subroutine"
+ must have state pushed and must have
+ w,v,y, and z set to zero. The current font
+ is determined by the virtual font header, which
+ may be undefined */
+
+static int saved_dvi_font[VF_NESTING_MAX];
+static int num_saved_fonts = 0;
+
+void
+dvi_vf_init (int dev_font_id)
+{
+ dvi_push();
+
+ dvi_state.w = 0; dvi_state.x = 0;
+ dvi_state.y = 0; dvi_state.z = 0;
+
+ /* do not reset dvi_state.d. */
+ if (num_saved_fonts < VF_NESTING_MAX) {
+ saved_dvi_font[num_saved_fonts++] = current_font;
+ } else
+ ERROR("Virtual fonts nested too deeply!");
+ current_font = dev_font_id;
+}
+
+/* After VF subroutine is finished, we simply pop the DVI stack */
+void
+dvi_vf_finish (void)
+{
+ dvi_pop();
+ if (num_saved_fonts > 0)
+ current_font = saved_dvi_font[--num_saved_fonts];
+ else {
+ ERROR("Tried to pop an empty font stack");
+ }
+}
+
+
+/* Scan various specials */
+#include "dpxutil.h"
+
+/* This need to allow 'true' prefix for unit and
+ * length value must be divided by current magnification.
+ */
+static int
+read_length (double *vp, double mag, char **pp, char *endptr)
+{
+ char *q, *p = *pp;
+ double v, u = 1.0;
+ const char *_ukeys[] = {
+#define K_UNIT__PT 0
+#define K_UNIT__IN 1
+#define K_UNIT__CM 2
+#define K_UNIT__MM 3
+#define K_UNIT__BP 4
+ "pt", "in", "cm", "mm", "bp",
+ NULL
+ };
+ int k, error = 0;
+
+ q = parse_float_decimal(&p, endptr);
+ if (!q) {
+ *vp = 0.0; *pp = p;
+ return -1;
+ }
+
+ v = atof(q);
+ RELEASE(q);
+
+ q = parse_c_ident(&p, endptr);
+ if (q) {
+ if (strlen(q) > strlen("true") &&
+ !memcmp(q, "true", strlen("true"))) {
+ u /= mag != 0.0 ? mag : 1.0; /* inverse magnify */
+ q += strlen("true");
+ }
+ for (k = 0; _ukeys[k] && strcmp(_ukeys[k], q); k++);
+ switch (k) {
+ case K_UNIT__PT: u *= 72.0 / 72.27; break;
+ case K_UNIT__IN: u *= 72.0; break;
+ case K_UNIT__CM: u *= 72.0 / 2.54 ; break;
+ case K_UNIT__MM: u *= 72.0 / 25.4 ; break;
+ case K_UNIT__BP: u *= 1.0 ; break;
+ default:
+ WARN("Unknown unit of measure: %s", q);
+ error = -1;
+ break;
+ }
+ RELEASE(q);
+ }
+
+ *vp = v * u; *pp = p;
+ return error;
+}
+
+
+static int
+scan_special (double *wd, double *ht, char *lm, const char *buf, UNSIGNED_QUAD size)
+{
+ char *q, *p = (char *) buf;
+ char *endptr;
+ int ns_pdf = 0, error = 0;
+
+ endptr = p + size;
+
+ skip_white(&p, endptr);
+
+ q = parse_c_ident(&p, endptr);
+ if (q && !strcmp(q, "pdf")) {
+ skip_white(&p, endptr);
+ if (p < endptr && *p == ':') {
+ p++;
+ skip_white(&p, endptr);
+ RELEASE(q);
+ q = parse_c_ident(&p, endptr); ns_pdf = 1;
+ }
+ }
+ skip_white(&p, endptr);
+
+ if (q) {
+ if (!strcmp(q, "landscape")) {
+ *lm = 1;
+ } else if (ns_pdf && !strcmp(q, "pagesize")) {
+ while (!error && p < endptr) {
+ char *kp = parse_c_ident(&p, endptr);
+ if (!kp)
+ break;
+ else {
+ skip_white(&p, endptr);
+ if (!strcmp(kp, "width")) {
+ error = read_length(wd, dvi_tell_mag(), &p, endptr);
+ if (!error)
+ *wd *= dvi_tell_mag();
+ } else if (!strcmp(kp, "height")) {
+ error = read_length(ht, dvi_tell_mag(), &p, endptr);
+ if (!error)
+ *ht *= dvi_tell_mag();
+ }
+ RELEASE(kp);
+ }
+ skip_white(&p, endptr);
+ }
+ } else if (!strcmp(q, "papersize")) {
+ char qchr = 0;
+ if (*p == '=') p++;
+ skip_white(&p, endptr);
+ if (p < endptr && (*p == '\'' || *p == '\"')) {
+ qchr = *p; p++;
+ skip_white(&p, endptr);
+ }
+ error = read_length(wd, 1.0, &p, endptr);
+ if (!error) {
+ skip_white(&p, endptr);
+ if (p < endptr && *p == ',') {
+ p++; skip_white(&p, endptr);
+ }
+ error = read_length(ht, 1.0, &p, endptr);
+ skip_white(&p, endptr);
+ }
+ if (!error && qchr) { /* Check if properly quoted */
+ if (p >= endptr || *p != qchr)
+ error = -1;
+ }
+ }
+ RELEASE(q);
+ }
+
+ return error;
+}
+
+
+void
+dvi_scan_paper_size (long page_no,
+ double *page_width, double *page_height, char *landscape)
+{
+ FILE *fp = dvi_file;
+ long offset;
+ unsigned char opcode;
+ static long buffered_page = -1;
+
+ if (page_no == buffered_page)
+ return; /* because dvipdfmx wants to scan first page twice! */
+ buffered_page = page_no;
+
+ dvi_page_buf_index = 0;
+
+ if (!linear) {
+ if (page_no >= num_pages)
+ ERROR("Invalid page number: %u", page_no);
+ offset = page_loc[page_no];
+
+ seek_absolute(fp, offset);
+ }
+
+ while ((opcode = get_and_buffer_unsigned_byte(fp)) != EOP) {
+ if (opcode <= SET_CHAR_127 ||
+ (opcode >= FNT_NUM_0 && opcode <= FNT_NUM_63))
+ continue;
+ else if (opcode == XXX1 || opcode == XXX2 ||
+ opcode == XXX3 || opcode == XXX4) {
+ UNSIGNED_QUAD size = 0UL;
+ switch (opcode) {
+ case XXX1: size = get_and_buffer_unsigned_byte(fp); break;
+ case XXX2: size = get_and_buffer_unsigned_pair(fp); break;
+ case XXX3: size = get_and_buffer_unsigned_triple(fp); break;
+ case XXX4: size = get_and_buffer_unsigned_quad(fp); break;
+ }
+ if (dvi_page_buf_index + size >= dvi_page_buf_size) {
+ dvi_page_buf_size = (dvi_page_buf_index + size + DVI_PAGE_BUF_CHUNK);
+ dvi_page_buffer = RENEW(dvi_page_buffer, dvi_page_buf_size, unsigned char);
+ }
+ if (fread(dvi_page_buffer + dvi_page_buf_index, sizeof(char), size, fp) != size)
+ ERROR("Reading DVI file failed!");
+ scan_special(page_width, page_height, landscape,
+ (char*)dvi_page_buffer + dvi_page_buf_index, size);
+ dvi_page_buf_index += size;
+ continue;
+ }
+
+ /* Skipping... */
+ switch (opcode) {
+ case BOP:
+ get_and_buffer_bytes(fp, 44);
+ break;
+ case NOP: case PUSH: case POP:
+ case W0: case X0: case Y0: case Z0:
+ break;
+ case SET1: case PUT1: case RIGHT1: case DOWN1:
+ case W1: case X1: case Y1: case Z1: case FNT1:
+ get_and_buffer_unsigned_byte(fp);
+ break;
+
+ case SET2: case PUT2: case RIGHT2: case DOWN2:
+ case W2: case X2: case Y2: case Z2: case FNT2:
+ get_and_buffer_signed_pair(fp);
+ break;
+
+ case SET3: case PUT3: case RIGHT3: case DOWN3:
+ case W3: case X3: case Y3: case Z3: case FNT3:
+ get_and_buffer_signed_triple(fp);
+ break;
+
+ case SET4: case PUT4: case RIGHT4: case DOWN4:
+ case W4: case X4: case Y4: case Z4: case FNT4:
+ get_and_buffer_signed_quad(fp);
+ break;
+
+ case SET_RULE: case PUT_RULE:
+ get_and_buffer_bytes(fp, 8);
+ break;
+
+ case FNT_DEF1: do_fntdef1(1); break;
+ case FNT_DEF2: do_fntdef2(1); break;
+ case FNT_DEF3: do_fntdef3(1); break;
+ case FNT_DEF4: do_fntdef4(1); break;
+
+#ifdef XETEX
+ case XDV_GLYPH_STRING:
+ {
+ UNSIGNED_PAIR count;
+ get_and_buffer_unsigned_quad(fp); /* width */
+ count = get_and_buffer_unsigned_pair(fp); /* glyph count */
+ get_and_buffer_bytes(fp, count * 6); /* 2 bytes ID + 4 bytes x-location per glyph */
+ }
+ break;
+ case XDV_GLYPH_ARRAY:
+ {
+ UNSIGNED_PAIR count;
+ get_and_buffer_unsigned_quad(fp); /* width */
+ count = get_and_buffer_unsigned_pair(fp); /* glyph count */
+ get_and_buffer_bytes(fp, count * 10); /* 2 bytes ID + 8 bytes x,y-location per glyph */
+ }
+ break;
+ case XDV_NATIVE_FONT_DEF:
+ do_native_font_def(1);
+ break;
+ case XDV_PIC_FILE:
+ /* params: flags[1] t[4][6] p[2] len[2] path[l] */
+ {
+ UNSIGNED_PAIR len;
+ get_and_buffer_bytes(fp, 1 + 4 * 6 + 2);
+ len = get_and_buffer_unsigned_pair(fp); /* length of pathname */
+ get_and_buffer_bytes(fp, len);
+ }
+ break;
+#endif
+ case DIR:
+ get_and_buffer_unsigned_byte(fp);
+ break;
+
+ case POST:
+ if (linear && dvi_page_buf_index == 1) {
+ /* this is actually an indication that we've reached the end of the input */
+ return;
+ }
+ /* else fall through to error case */
+
+ default: /* case PRE: case POST_POST: and others */
+ ERROR("Unexpected opcode %d at pos=0x%x", opcode, tell_position(fp));
+ break;
+ }
+ }
+
+ return;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/dvi.h b/Build/source/texk/xdvipdfmx/src/dvi.h
new file mode 100644
index 00000000000..e47aebc130e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dvi.h
@@ -0,0 +1,92 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dvi.h,v 1.12 2004/09/02 12:23:06 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _DVI_H_
+#define _DVI_H_
+
+#include "error.h"
+#include "numbers.h"
+/* spt_t */
+#include "pdfdev.h"
+
+extern void dvi_set_verbose (void);
+
+/* returns scale (dvi2pts) */
+extern double dvi_init (char *dvi_filename, double mag); /* may append .dvi or .xdv to filename */
+extern void dvi_close (void); /* Closes data structures created by dvi_open */
+
+extern double dvi_tell_mag (void);
+extern double dvi_unit_size (void);
+extern double dvi_dev_xpos (void);
+extern double dvi_dev_ypos (void);
+extern unsigned dvi_npages (void);
+extern const char *dvi_comment (void);
+
+extern void dvi_vf_init (int dev_font_id);
+extern void dvi_vf_finish (void);
+
+extern void dvi_set_font (int font_id);
+extern void dvi_set (SIGNED_QUAD ch);
+extern void dvi_rule (SIGNED_QUAD width, SIGNED_QUAD height);
+
+extern void dvi_right (SIGNED_QUAD x);
+extern void dvi_put (SIGNED_QUAD ch);
+extern void dvi_push (void);
+extern void dvi_pop (void);
+extern void dvi_w0 (void);
+extern void dvi_w (SIGNED_QUAD ch);
+extern void dvi_x0 (void);
+extern void dvi_x (SIGNED_QUAD ch);
+extern void dvi_down (SIGNED_QUAD y);
+extern void dvi_y (SIGNED_QUAD ch);
+extern void dvi_y0 (void);
+extern void dvi_z (SIGNED_QUAD ch);
+extern void dvi_z0 (void);
+extern void dvi_dir (UNSIGNED_BYTE dir);
+
+extern void dvi_do_page (long page_no,
+ double paper_width, double paper_height,
+ double x_offset, double y_offset);
+extern void dvi_scan_paper_size (long page_no,
+ double *width, double *height,
+ char *landscape);
+extern int dvi_locate_font (const char *name, spt_t ptsize);
+
+/* link or nolink:
+ * See dvipdfm (not x) user's manual on pdf:link and pdf:nolink.
+ * This is workaround for preventing inclusion of pagenation artifact such as
+ * footnote and page number in link annotation.
+ */
+extern void dvi_link_annot (int flag);
+/* The followings are for calculating bounding box of text for annotation.
+ * DVI uses push/pop to do line-feed-carriage-return. So line breaking is
+ * handled by inspecting current depth of DVI register stack.
+ */
+extern void dvi_tag_depth (void);
+extern void dvi_untag_depth (void);
+extern void dvi_compute_boxes (int flag);
+
+extern void dvi_do_special (const void *buffer, UNSIGNED_QUAD size);
+
+#endif /* _DVI_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dvicodes.h b/Build/source/texk/xdvipdfmx/src/dvicodes.h
new file mode 100644
index 00000000000..6987f5c21ac
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dvicodes.h
@@ -0,0 +1,131 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dvicodes.h,v 1.4 2002/10/30 02:27:08 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _DVICODES_H_
+#define _DVICODES_H_
+
+/* DVI op codes */
+#define SET_CHAR_0 0
+#define SET_CHAR_1 1
+/* etc. */
+#define SET_CHAR_127 127
+#define SET1 128 /* Typesets its single operand between 128 and 255 */
+#define SET2 129 /* Typesets its single two byte unsigned operand */
+#define SET3 130 /* Typesets its single three byte unsigned operand */
+#define SET4 131 /* Typesets its single four byte unsigned operand */
+#define SET_RULE 132 /* Sets a rule of height param1(four bytes) and width param2(four bytes) */
+ /* These are *signed*. Nothing typeset for nonpositive values */
+ /* However, negative value *do* change current point */
+#define PUT1 133 /* Like SET1, but point doesn't change */
+#define PUT2 134 /* Like SET2 */
+#define PUT3 135 /* Like SET3 */
+#define PUT4 136 /* Like SET4 */
+#define PUT_RULE 137 /* Like SET_RULE */
+#define NOP 138
+#define BOP 139 /* Followed by 10 four byte count registers (signed?). Last parameter points to */
+ /* previous BOP (backward linked, first BOP has -1). BOP clears stack and resets current point. */
+#define EOP 140
+#define PUSH 141 /* Pushes h,v,w,x,y,z */
+#define POP 142 /* Opposite of push*/
+#define RIGHT1 143 /* Move right by one byte signed operand */
+#define RIGHT2 144 /* Move right by two byte signed operand */
+#define RIGHT3 145 /* Move right by three byte signed operand */
+#define RIGHT4 146 /* Move right by four byte signed operand */
+#define W0 147 /* Move right w */
+#define W1 148 /* w <- single byte signed operand. Move right by same amount */
+#define W2 149 /* Same as W1 with two byte signed operand */
+#define W3 150 /* Three byte signed operand */
+#define W4 151 /* Four byte signed operand */
+#define X0 152 /* Move right x */
+#define X1 153 /* Like W1 */
+#define X2 154 /* Like W2 */
+#define X3 155 /* Like W3 */
+#define X4 156 /* Like W4 */
+#define DOWN1 157 /* Move down by one byte signed operand */
+#define DOWN2 158 /* Two byte signed operand */
+#define DOWN3 159 /* Three byte signed operand */
+#define DOWN4 160 /* Four byte signed operand */
+#define Y0 161 /* Move down by y */
+#define Y1 162 /* Move down by one byte signed operand, which replaces Y */
+#define Y2 163 /* Two byte signed operand */
+#define Y3 164 /* Three byte signed operand */
+#define Y4 165 /* Four byte signed operand */
+#define Z0 166 /* Like Y0, but use z */
+#define Z1 167 /* Like Y1 */
+#define Z2 168 /* Like Y2 */
+#define Z3 169 /* Like Y3 */
+#define Z4 170 /* Like Y4 */
+#define FNT_NUM_0 171 /* Switch to font 0 */
+#define FNT_NUM_1 172 /* Switch to font 1 */
+/* etc. */
+#define FNT_NUM_63 234 /* Switch to font 63 */
+#define FNT1 235 /* Switch to font described by single byte unsigned operand */
+#define FNT2 236 /* Switch to font described by two byte unsigned operand */
+#define FNT3 237 /* Three byte font descriptor */
+#define FNT4 238 /* Four byte operator (Knuth says signed, but what would be the point? */
+#define XXX1 239 /* Special. Operand is one byte length. Special follows immediately */
+#define XXX2 240 /* Two byte operand */
+#define XXX3 241 /* Three byte operand */
+#define XXX4 242 /* Four byte operand (Knuth says TeX uses only XXX1 and XXX4 */
+#define FNT_DEF1 243 /* One byte font number, four byte checksum, four byte magnified size (DVI units),
+ four byte designed size, single byte directory length, single byte name length,
+ followed by complete name (area+name) */
+#define FNT_DEF2 244 /* Same for two byte font number */
+#define FNT_DEF3 245 /* Same for three byte font number */
+#define FNT_DEF4 246 /* Four byte font number (Knuth says signed) */
+#define PRE 247 /* Preamble:
+ one byte DVI version (should be 2)
+ four byte unsigned numerator
+ four byte unsigned denominator -- one DVI unit = den/num*10^(-7) m
+ four byte magnification (multiplied by 1000)
+ one byte unsigned comment length followed by comment. */
+#define DVI_ID 2 /* ID Byte for current DVI file */
+#define DVIV_ID 3 /* with Ascii pTeX VW mode extension */
+#ifdef XETEX
+#define XDVI_ID 5 /* XeTeX ".xdv" output that uses XDV opcodes below */
+#endif
+#define POST 248 /* Postamble- -- similar to preamble
+ four byte pointer to final bop
+ four byte numerator
+ four byte denominator
+ four byte mag
+ four byte maximum height (signed?)
+ four byte maximum width
+ two byte max stack depth required to process file
+ two byte number of pages */
+#define POST_POST 249 /* End of postamble
+ four byte pointer to POST command
+ Version byte (same as preamble)
+ Padded by four or more 223's to the end of the file. */
+#define PADDING 223
+#define DIR 255 /* Ascii pTeX DIR command */
+
+#ifdef XETEX
+#define XDV_PIC_FILE 251 /* include graphic or PDF file */
+#define XDV_NATIVE_FONT_DEF 252 /* fontdef for native platform font */
+#define XDV_GLYPH_ARRAY 253 /* string of glyph IDs with X and Y positions */
+#define XDV_GLYPH_STRING 254 /* string of glyph IDs with X-positions only */
+#endif
+
+#endif /* _DVICODES_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/dvipdfmx.c b/Build/source/texk/xdvipdfmx/src/dvipdfmx.c
new file mode 100644
index 00000000000..8339a315c06
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/dvipdfmx.c
@@ -0,0 +1,898 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/dvipdfmx.c,v 1.45 2005/07/30 11:44:18 hirata Exp $
+
+ This is xdvipdfmx, an extended version of...
+
+ DVIPDFMx, an eXtended version of DVIPDFM by Mark A. Wicks.
+
+ Copyright (c) 2006 SIL International (Jonathan Kew) and Jin-Hwan Cho
+ (xdvipdfmx extensions for XeTeX support)
+
+ Copyright (C) 2002-2003 by Jin-Hwan Cho and Shunsaku Hirata,
+ the DVIPDFMx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+
+#include "system.h"
+#include "mem.h"
+
+#include "dpxconf.h"
+#include "dpxfile.h"
+#include "dpxutil.h"
+
+#include "dvi.h"
+
+#include "pdfdoc.h"
+#include "pdfdev.h"
+#include "pdfparse.h"
+#include "pdfencrypt.h"
+
+#include "spc_tpic.h"
+#include "specials.h"
+
+#include "mpost.h"
+
+#include "fontmap.h"
+#include "pdffont.h"
+#include "pdfximage.h"
+#include "cid.h"
+
+extern void error_cleanup (void);
+
+static int verbose = 0;
+
+static int mp_mode = 0;
+
+static long opt_flags = 0;
+#define OPT_TPIC_TRANSPARENT_FILL (1 << 1)
+#define OPT_CIDFONT_FIXEDPITCH (1 << 2)
+#define OPT_FONTMAP_FIRST_MATCH (1 << 3)
+
+static char ignore_colors = 0;
+static double annot_grow = 0.0;
+static int bookmark_open = 0;
+static double mag = 1.0;
+static int font_dpi = 600;
+static int really_quiet = 0;
+/*
+ * Precision is essentially limited to 0.01pt.
+ * See, dev_set_string() in pdfdev.c.
+ */
+static int pdfdecimaldigits = 2;
+
+/* Encryption */
+static int do_encryption = 0;
+static unsigned key_bits = 40;
+static unsigned permission = 0x003C;
+
+/* Page device */
+static double paper_width = 595.0;
+static double paper_height = 842.0;
+static double x_offset = 72.0;
+static double y_offset = 72.0;
+static char landscape_mode = 0;
+
+int always_embed = 0; /* always embed fonts, regardless of licensing flags */
+
+char *dvi_filename = NULL, *pdf_filename = NULL;
+
+static void
+set_default_pdf_filename(void)
+{
+ const char *dvi_base;
+
+ dvi_base = xbasename(dvi_filename);
+ if (mp_mode &&
+ strlen(dvi_base) > 4 &&
+ !strncmp(".mps", dvi_base + strlen(dvi_base) - 4, 4)) {
+ pdf_filename = NEW(strlen(dvi_base)+1, char);
+ strncpy(pdf_filename, dvi_base, strlen(dvi_base) - 4);
+ pdf_filename[strlen(dvi_base)-4] = '\0';
+ } else if (strlen(dvi_base) > 4 &&
+#ifdef XETEX
+ (!strncmp(".dvi", dvi_base+strlen(dvi_base)-4, 4) ||
+ !strncmp(".xdv", dvi_base+strlen(dvi_base)-4, 4))) {
+#else
+ !strncmp(".dvi", dvi_base+strlen(dvi_base)-4, 4)) {
+#endif
+ pdf_filename = NEW(strlen(dvi_base)+1, char);
+ strncpy(pdf_filename, dvi_base, strlen(dvi_base)-4);
+ pdf_filename[strlen(dvi_base)-4] = '\0';
+ } else {
+ pdf_filename = NEW(strlen(dvi_base)+5, char);
+ strcpy(pdf_filename, dvi_base);
+ }
+
+ strcat (pdf_filename, ".pdf");
+}
+
+static void
+usage (void)
+{
+ fprintf (stdout, "\nThis is %s-%s by Jonathan Kew and Jin-Hwan Cho,\n", PACKAGE, VERSION);
+ fprintf (stdout, "an extended version of DVIPDFMx, which in turn was\n");
+ fprintf (stdout, "an extended version of dvipdfm-0.13.2c developed by Mark A. Wicks.\n");
+ fprintf (stdout, "\nCopyright (c) 2006 SIL International and Jin-Hwan Cho.\n");
+ fprintf (stdout, "\nThis is free software; you can redistribute it and/or modify\n");
+ fprintf (stdout, "it under the terms of the GNU General Public License as published by\n");
+ fprintf (stdout, "the Free Software Foundation; either version 2 of the License, or\n");
+ fprintf (stdout, "(at your option) any later version.\n");
+ fprintf (stdout, "\nUsage: xdvipdfmx [options] xdvfile\n");
+ fprintf (stdout, "-c \t\tIgnore color specials (for B&W printing)\n");
+ fprintf (stdout, "-d number\tSet PDF decimal digits (0-5) [2]\n");
+ fprintf (stdout, "-l \t\tLandscape mode\n");
+#if 0
+ /* Not supported */
+ fprintf (stdout, "-e \t\tDisable partial font embedding [default is enabled]\n");
+#endif
+ fprintf (stdout, "-f filename\tSet font map file name [t1fonts.map]\n");
+ fprintf (stdout, "-m number\tSet additional magnification\n");
+ fprintf (stdout, "-o filename\tSet output file name [dvifile.pdf]\n");
+ fprintf (stdout, "-p papersize\tSet papersize [a4]\n");
+ fprintf (stdout, "-r resolution\tSet resolution (in DPI) for raster fonts [600]\n");
+ fprintf (stdout, "-s pages\tSelect page ranges (-)\n");
+ fprintf (stdout, "-t \t\tEmbed thumbnail images\n");
+ fprintf (stdout, "-x dimension\tSet horizontal offset [1.0in]\n");
+ fprintf (stdout, "-y dimension\tSet vertical offset [1.0in]\n");
+ fprintf (stdout, "-z number \tSet zlib compression level (0-9) [9]\n");
+
+ fprintf (stdout, "-v \tBe verbose\n");
+ fprintf (stdout, "-vv \tBe more verbose\n");
+ fprintf (stdout, "-C number\tSpecify miscellaneous option flags [0]:\n");
+ fprintf (stdout, "\t\t 0x0001 reserved\n");
+ fprintf (stdout, "\t\t 0x0002 Use semi-transparent filling for tpic shading command,\n");
+ fprintf (stdout, "\t\t instead of opaque gray color. (requires PDF 1.4)\n");
+ fprintf (stdout, "\t\t 0x0004 Treat all CIDFont as fixed-pitch font.\n");
+ fprintf (stdout, "\t\t 0x0008 Do not replace duplicate fontmap entries.\n");
+ fprintf (stdout, "\t\tPositive values are always ORed with previously given flags.\n");
+ fprintf (stdout, "\t\tAnd negative values replace old values.\n");
+ fprintf (stdout, "-E \tAlways try to embed fonts, regardless of licensing flags.\n");
+ fprintf (stdout, "-O number\tSet maximum depth of open bookmark items [0]\n");
+ fprintf (stdout, "-P number\tSet permission flags for PDF encryption [0x003C]\n");
+ fprintf (stdout, "-S \tEnable PDF encryption\n");
+ fprintf (stdout, "-T \tEmbed thumbnail images. Remove images files when finished.\n");
+ fprintf (stdout, "-M \tExperimental mps-to-pdf mode\n");
+ fprintf (stdout, "-V number\tSet PDF minor version [3]\n");
+ fprintf (stdout, "\nAll dimensions entered on the command line are \"true\" TeX dimensions.\n");
+ fprintf (stdout, "Argument of \"-s\" lists physical page ranges separated by commas, e.g., \"-s 1-3,5-6\"\n");
+ fprintf (stdout, "Papersize is specified by paper format (e.g., \"a4\") or by w<unit>,h<unit> (e.g., \"20cm,30cm\").\n");
+
+ exit(1);
+}
+
+
+static int
+read_length (double *vp, char **pp, char *endptr)
+{
+ char *q, *p = *pp;
+ double v, u = 1.0;
+ const char *_ukeys[] = {
+#define K_UNIT__PT 0
+#define K_UNIT__IN 1
+#define K_UNIT__CM 2
+#define K_UNIT__MM 3
+#define K_UNIT__BP 4
+ "pt", "in", "cm", "mm", "bp",
+ NULL
+ };
+ int k, error = 0;
+
+ q = parse_float_decimal(&p, endptr);
+ if (!q) {
+ *vp = 0.0; *pp = p;
+ return -1;
+ }
+
+ v = atof(q);
+ RELEASE(q);
+
+ q = parse_c_ident(&p, endptr);
+ if (q) {
+ if (strlen(q) > strlen("true") &&
+ !memcmp(q, "true", strlen("true"))) {
+ q += strlen("true"); /* just skip "true" */
+ }
+ for (k = 0; _ukeys[k] && strcmp(_ukeys[k], q); k++);
+ switch (k) {
+ case K_UNIT__PT: u *= 72.0 / 72.27; break;
+ case K_UNIT__IN: u *= 72.0; break;
+ case K_UNIT__CM: u *= 72.0 / 2.54 ; break;
+ case K_UNIT__MM: u *= 72.0 / 25.4 ; break;
+ case K_UNIT__BP: u *= 1.0 ; break;
+ default:
+ WARN("Unknown unit of measure: %s", q);
+ error = -1;
+ break;
+ }
+ RELEASE(q);
+ }
+
+ *vp = v * u; *pp = p;
+ return error;
+}
+
+static void
+select_paper (const char *paperspec)
+{
+ const struct paper *pi;
+ int error = 0;
+
+ pi = paperinfo(paperspec);
+ if (pi && papername(pi)) {
+ paper_width = paperpswidth (pi);
+ paper_height = paperpsheight(pi);
+ } else {
+ char *p = (char *) paperspec, *endptr, *comma;
+ comma = strchr(p, ',');
+ endptr = p + strlen(p);
+ if (!comma)
+ ERROR("Unrecognized paper format: %s", paperspec);
+ error = read_length(&paper_width, &p, comma);
+ p = comma + 1;
+ error = read_length(&paper_height, &p, endptr);
+ }
+ if (error || paper_width <= 0.0 || paper_height <= 0.0)
+ ERROR("Invalid paper size: %s (%.2fx%.2f)", paperspec, paper_width, paper_height);
+}
+
+struct page_range
+{
+ long first, last;
+} *page_ranges = NULL;
+
+int num_page_ranges = 0;
+int max_page_ranges = 0;
+
+static void
+select_pages (const char *pagespec)
+{
+ char *q, *p = (char *) pagespec;
+
+ while (*p != '\0') {
+ /* Enlarge page range table if necessary */
+ if (num_page_ranges >= max_page_ranges) {
+ max_page_ranges += 4;
+ page_ranges = RENEW(page_ranges, max_page_ranges, struct page_range);
+ }
+
+ page_ranges[num_page_ranges].first = 0;
+ page_ranges[num_page_ranges].last = 0;
+
+ for ( ; *p && isspace(*p); p++);
+ q = parse_unsigned(&p, p + strlen(p)); /* Can't be signed. */
+ if (q) { /* '-' is allowed here */
+ page_ranges[num_page_ranges].first = atoi(q) - 1;
+ page_ranges[num_page_ranges].last = page_ranges[num_page_ranges].first;
+ RELEASE(q);
+ }
+ for ( ; *p && isspace(*p); p++);
+
+ if (*p == '-') {
+ for (++p; *p && isspace(*p); p++);
+ page_ranges[num_page_ranges].last = -1;
+ if (*p) {
+ q = parse_unsigned(&p, p + strlen(p));
+ if (q) {
+ page_ranges[num_page_ranges].last = atoi(q) - 1;
+ RELEASE(q);
+ }
+ for ( ; *p && isspace(*p); p++);
+ }
+ } else {
+ page_ranges[num_page_ranges].last = page_ranges[num_page_ranges].first;
+ }
+
+ num_page_ranges++;
+
+ if (*p == ',')
+ p++;
+ else {
+ for ( ; *p && isspace(*p); p++);
+ if (*p)
+ ERROR("Bad page range specification: %s", p);
+ }
+ }
+ return;
+}
+
+#define POP_ARG() {argv += 1; argc -= 1;}
+/* It doesn't work as expected (due to dvi filename). */
+#define CHECK_ARG(n,m) if (argc < (n) + 1) {\
+ fprintf (stderr, "\nMissing %s after \"-%c\".\n", (m), *flag);\
+ usage();\
+}
+
+static void
+do_args (int argc, char *argv[])
+{
+ while (argc > 0 && *argv[0] == '-') {
+ char *flag, *nextptr;
+
+ for (flag = argv[0] + 1; *flag != 0; flag++) {
+ switch (*flag) {
+ case 'D':
+ CHECK_ARG(1, "PS->PDF conversion command line template");
+ set_distiller_template(argv[1]);
+ POP_ARG();
+ break;
+ case 'r':
+ CHECK_ARG(1, "bitmap font dpi");
+ font_dpi = atoi(argv[1]);
+ if (font_dpi <= 0)
+ ERROR("Invalid bitmap font dpi specified: %s", argv[1]);
+ POP_ARG();
+ break;
+ case 'm':
+ CHECK_ARG(1, "magnification value");
+ mag = strtod(argv[1], &nextptr);
+ if (mag < 0.0 || nextptr == argv[1])
+ ERROR("Invalid magnification specifiied: %s", argv[1]);
+ POP_ARG();
+ break;
+ case 'g':
+ CHECK_ARG(1, "annotation \"grow\" amount");
+ nextptr = argv[1];
+ read_length(&annot_grow, &nextptr, nextptr + strlen(nextptr));
+ POP_ARG();
+ break;
+ case 'x':
+ CHECK_ARG(1, "horizontal offset value");
+ nextptr = argv[1];
+ read_length(&x_offset, &nextptr, nextptr + strlen(nextptr));
+ POP_ARG();
+ break;
+ case 'y':
+ CHECK_ARG(1, "vertical offset value");
+ nextptr = argv[1];
+ read_length(&y_offset, &nextptr, nextptr + strlen(nextptr));
+ POP_ARG();
+ break;
+ case 'o':
+ CHECK_ARG(1, "output file name");
+ pdf_filename = NEW (strlen(argv[1])+1,char);
+ strcpy(pdf_filename, argv[1]);
+ POP_ARG();
+ break;
+ case 's':
+ CHECK_ARG(1, "page selection specification");
+ select_pages(argv[1]);
+ POP_ARG();
+ break;
+#ifndef NO_THUMBNAIL
+ case 'T':
+ pdf_doc_enable_thumbnails(1); /* remove after... */
+ break;
+ case 't':
+ pdf_doc_enable_thumbnails(0);
+ break;
+#endif /* !NO_THUMBNAIL */
+ case 'p':
+ CHECK_ARG(1, "paper format/size");
+ select_paper(argv[1]);
+ POP_ARG();
+ break;
+ case 'c':
+ ignore_colors = 1;
+ break;
+ case 'l':
+ landscape_mode = 1;
+ break;
+ case 'f':
+ CHECK_ARG(1, "fontmap file name");
+ if (opt_flags & OPT_FONTMAP_FIRST_MATCH)
+ pdf_load_fontmap_file(argv[1], FONTMAP_RMODE_APPEND);
+ else
+ pdf_load_fontmap_file(argv[1], FONTMAP_RMODE_REPLACE);
+ POP_ARG();
+ break;
+ case 'e':
+ WARN("dvipdfm \"-e\" option not supported.");
+ break;
+ case 'q':
+ really_quiet = 1;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'V':
+ {
+ int ver_minor;
+
+ if (isdigit(*(flag+1))) {
+ flag++;
+ ver_minor = atoi(flag);
+ } else {
+ CHECK_ARG(1, "PDF minor version number");
+ ver_minor = atoi(argv[1]);
+ POP_ARG();
+ }
+ if (ver_minor < 3 || ver_minor > 5) {
+ WARN("PDF version 1.%d not supported. (1.3 used instead)", ver_minor);
+ ver_minor = 3;
+ }
+ pdf_set_version((unsigned) ver_minor);
+ }
+ break;
+ case 'z':
+ {
+ int level;
+
+ if (isdigit(*(flag+1))) {
+ flag++;
+ level = atoi(flag);
+ } else {
+ CHECK_ARG(1, "compression level");
+ level = atoi(argv[1]);
+ POP_ARG();
+ }
+ pdf_set_compression(level);
+ }
+ break;
+ case 'd':
+ if (isdigit(*(flag+1))) {
+ flag++;
+ pdfdecimaldigits = atoi(flag);
+ } else {
+ CHECK_ARG(1, "number of fractional digits");
+ pdfdecimaldigits = atoi(argv[1]);
+ POP_ARG();
+ }
+ break;
+ case 'S':
+ do_encryption = 1;
+ break;
+ case 'K':
+ CHECK_ARG(1, "encryption key bits");
+ key_bits = (unsigned) atoi(argv[1]);
+ if (key_bits < 40 || key_bits > 128)
+ ERROR("Invalid encryption key bits specified: %s", argv[1]);
+ POP_ARG();
+ break;
+ case 'P':
+ CHECK_ARG(1, "encryption permission flag");
+ permission = (unsigned) strtoul(argv[1], &nextptr, 0);
+ if (nextptr == argv[1])
+ ERROR("Invalid encryption permission flag: %s", argv[1]);
+ POP_ARG();
+ break;
+ case 'O':
+ /* Bookmark open level */
+ CHECK_ARG(1, "bookmark open level");
+ bookmark_open = atoi(argv[1]);
+ POP_ARG();
+ break;
+ case 'M':
+ mp_mode = 1;
+ break;
+ case 'C':
+ CHECK_ARG(1, "a number");
+ {
+ long flags;
+
+ flags = (unsigned) strtol(argv[1], &nextptr, 0);
+ if (nextptr == argv[1])
+ ERROR("Invalid flag: %s", argv[1]);
+ if (flags < 0)
+ opt_flags = -flags;
+ else
+ opt_flags |= flags;
+ }
+ POP_ARG();
+ break;
+ case 'E':
+ always_embed = 1;
+ break;
+ default:
+ fprintf (stderr, "Unknown option in \"%s\"", flag);
+ usage();
+ break;
+ }
+ }
+ POP_ARG();
+ }
+
+ if (!really_quiet) {
+ int i;
+
+ for (i = 0; i < verbose; i++) {
+ dvi_set_verbose();
+ pdf_fontmap_set_verbose();
+ pdf_dev_set_verbose();
+ pdf_doc_set_verbose();
+ pdf_enc_set_verbose();
+ pdf_obj_set_verbose();
+ dpx_file_set_verbose();
+ }
+ }
+
+ if (argc > 1) {
+ fprintf(stderr, "Multiple dvi filenames?");
+ usage();
+ } else if (argc > 0) {
+ /*
+ * The only legitimate way to have argc == 0 here is
+ * is do_args was called from config file. In that case, there is
+ * no dvi file name. Check for that case .
+ */
+ dvi_filename = NEW(strlen(argv[0]) + 5, char); /* space to append .dvi */
+ strcpy(dvi_filename, argv[0]);
+ }
+}
+
+static void
+cleanup (void)
+{
+ if (dvi_filename)
+ RELEASE(dvi_filename);
+ if (pdf_filename)
+ RELEASE(pdf_filename);
+ if (page_ranges)
+ RELEASE(page_ranges);
+}
+
+static const char *default_config_file = "dvipdfmx.cfg";
+
+static void
+read_config_file (const char *config)
+{
+ char *fullname;
+ char *start, *end, *option;
+ FILE *fp;
+
+#ifdef MIKTEX
+ if (!miktex_find_app_input_file("dvipdfm", config, fullname = work_buffer))
+ return;
+#else
+ if ((fullname = kpse_find_file(config, kpse_program_text_format, 1)) == NULL)
+ return;
+#endif
+
+ if (!(fp = MFOPEN (fullname, FOPEN_R_MODE))) {
+ WARN("Could not open config file \"%s\".", fullname);
+ return;
+ }
+ while ((start = mfgets (work_buffer, WORK_BUFFER_SIZE, fp)) != NULL) {
+ char *argv[2];
+ int argc;
+
+ argc = 0;
+ end = work_buffer + strlen(work_buffer);
+ skip_white (&start, end);
+ if (start >= end)
+ continue;
+ /* Build up an argument list as if it were passed on the command
+ line */
+ if ((option = parse_ident (&start, end))) {
+ argc = 1;
+ argv[0] = NEW (strlen(option)+2, char);
+ strcpy (argv[0]+1, option);
+ RELEASE (option);
+ *argv[0] = '-';
+ skip_white (&start, end);
+ if (start < end) {
+ argc += 1;
+ if (*start == '"') {
+ argv[1] = parse_c_string (&start, end);
+ }
+ else
+ argv[1] = parse_ident (&start, end);
+ }
+ }
+ do_args (argc, argv);
+ while (argc > 0) {
+ RELEASE (argv[--argc]);
+ }
+ }
+ if (fp)
+ MFCLOSE(fp);
+}
+
+static void
+system_default (void)
+{
+ if (systempapername() != NULL) {
+ select_paper(systempapername());
+ } else if (defaultpapername() != NULL) {
+ select_paper(defaultpapername());
+ }
+}
+
+void
+error_cleanup (void)
+{
+ pdf_error_cleanup();
+ if (pdf_filename) {
+ remove(pdf_filename);
+ fprintf(stderr, "\nOutput file removed.\n");
+ }
+}
+
+#define SWAP(v1,v2) do {\
+ double _tmp = (v1);\
+ (v1) = (v2);\
+ (v2) = _tmp;\
+ } while (0)
+
+static void
+do_dvi_pages (void)
+{
+ long page_no, page_count, i, step;
+ double page_width, page_height;
+ pdf_rect mediabox;
+
+ spc_exec_at_begin_document();
+
+ if (num_page_ranges == 0) {
+ if (!page_ranges) {
+ page_ranges = NEW(1, struct page_range);
+ max_page_ranges = 1;
+ }
+ page_ranges[0].first = 0;
+ page_ranges[0].last = -1; /* last page */
+ num_page_ranges = 1;
+ }
+
+ page_width = paper_width;
+ page_height = paper_height;
+ page_count = 0;
+
+ mediabox.llx = 0.0;
+ mediabox.lly = 0.0;
+ mediabox.urx = paper_width;
+ mediabox.ury = paper_height;
+
+ pdf_doc_set_creator (dvi_comment());
+ pdf_doc_set_mediabox(0, &mediabox); /* Root node */
+
+ for (i = 0; i < num_page_ranges && dvi_npages() > 0; i++) {
+ if (page_ranges[i].last < 0)
+ page_ranges[i].last += dvi_npages();
+
+ step = (page_ranges[i].first <= page_ranges[i].last) ? 1 : -1;
+ page_no = page_ranges[i].first;
+ while (dvi_npages() > 0) {
+ if (page_no < dvi_npages()) {
+ double w, h;
+ char lm;
+
+ /* Users want to change page size even after page is started! */
+ w = page_width; h = page_height; lm = landscape_mode;
+ dvi_scan_paper_size(page_no, &w, &h, &lm);
+ if (lm != landscape_mode) {
+ SWAP(w, h);
+ landscape_mode = lm;
+ }
+ if (page_width != w || page_height != h) {
+ page_width = w;
+ page_height = h;
+ }
+ if (page_width != paper_width ||
+ page_height != paper_height) {
+ mediabox.llx = 0.0;
+ mediabox.lly = 0.0;
+ mediabox.urx = page_width;
+ mediabox.ury = page_height;
+ pdf_doc_set_mediabox(page_count+1, &mediabox);
+ }
+ dvi_do_page(page_no,
+ page_width, page_height, x_offset, y_offset);
+ page_count++;
+ }
+
+ if (step > 0 &&
+ page_no >= page_ranges[i].last)
+ break;
+ else if (step < 0 &&
+ page_no <= page_ranges[i].last)
+ break;
+ else {
+ page_no += step;
+ }
+ }
+ }
+
+ if (page_count < 1) {
+ ERROR("No pages fall in range!");
+ }
+
+ spc_exec_at_end_document();
+}
+
+static void
+do_mps_pages (void)
+{
+ FILE *fp;
+
+ /* _FIXME_ */
+ fp = MFOPEN(dvi_filename, FOPEN_RBIN_MODE);
+ if (fp) {
+ mps_do_page(fp);
+ MFCLOSE(fp);
+ } else {
+ int i, page_no, step, page_count = 0;
+ char *filename;
+ /* Process filename.1, filename.2,... */
+ filename = NEW(strlen(dvi_filename) + 16 + 1, char);
+ for (i = 0; i < num_page_ranges; i++) {
+ if (page_ranges[i].last < 0)
+ ERROR("Invalid page number for MPS input: -1");
+
+ step = (page_ranges[i].first <= page_ranges[i].last) ? 1 : -1;
+ page_no = page_ranges[i].first;
+ for (;;) {
+ sprintf(filename, "%s.%d", dvi_filename, page_no + 1);
+ fp = MFOPEN(filename, FOPEN_RBIN_MODE);
+ if (fp) {
+ MESG("[%d<%s>", page_no + 1, filename);
+ mps_do_page(fp);
+ page_count++;
+ MESG("]");
+ MFCLOSE(fp);
+ }
+ if (step > 0 &&
+ page_no >= page_ranges[i].last)
+ break;
+ else if (step < 0 &&
+ page_no <= page_ranges[i].last)
+ break;
+ else {
+ page_no += step;
+ }
+ }
+ }
+ RELEASE(filename);
+ if (page_count == 0)
+ ERROR("No page output for \"%s\".", dvi_filename);
+ }
+}
+
+
+/* TODO: MetaPost mode */
+int CDECL
+main (int argc, char *argv[])
+{
+ double dvi2pts;
+
+ if (argc < 2) {
+ fprintf(stderr, "No dvi filename specified.");
+ usage();
+ return 1;
+ }
+
+#ifdef MIKTEX
+ miktex_initialize();
+#else
+ kpse_set_program_name(argv[0], "dvipdfm");
+#endif
+
+ paperinit();
+ system_default();
+
+ argv+=1;
+ argc-=1;
+
+ pdf_init_fontmaps(); /* This must come before parsing options... */
+
+ /* Process config file, if any */
+ if (default_config_file) {
+ read_config_file(default_config_file);
+ }
+
+ do_args (argc, argv);
+
+ if (really_quiet)
+ shut_up();
+
+#ifndef MIKTEX
+ kpse_init_prog("", font_dpi, NULL, NULL);
+ kpse_set_program_enabled(kpse_pk_format, true, kpse_src_texmf_cnf);
+#endif
+ pdf_font_set_dpi(font_dpi);
+
+ if (dvi_filename == NULL) {
+ if (pdf_filename == NULL) {
+ WARN("No dvi or pdf filename specified.");
+ usage();
+ return 1;
+ }
+ else {
+ if (verbose)
+ MESG("No dvi filename specified, reading standard input.");
+ }
+ }
+
+ if (pdf_filename == NULL)
+ set_default_pdf_filename();
+
+ if (do_encryption) {
+ pdf_enc_set_passwd(key_bits, permission, dvi_filename, pdf_filename);
+ if (key_bits > 40)
+ pdf_set_version(4);
+ }
+
+ if (mp_mode) {
+ x_offset = 0.0;
+ y_offset = 0.0;
+ dvi2pts = 0.01; /* dvi2pts controls accuracy. */
+ } else {
+ /* Dependency between DVI and PDF side is rather complicated... */
+ dvi2pts = dvi_init(dvi_filename, mag);
+ if (dvi2pts == 0.0)
+ ERROR("dvi_init() failed!");
+
+ dvi_scan_paper_size(0, &paper_width, &paper_height, &landscape_mode);
+ if (landscape_mode) {
+ SWAP(paper_width, paper_height);
+ }
+ }
+
+ MESG("%s -> %s\n", dvi_filename == NULL ? "stdin" : dvi_filename, pdf_filename);
+
+ /* Set default paper size here so that all page's can inherite it.
+ * annot_grow: Margin of annotation.
+ * bookmark_open: Miximal depth of open bookmarks.
+ */
+ pdf_open_document(pdf_filename,
+ paper_width, paper_height, annot_grow, bookmark_open);
+
+ /* Ignore_colors placed here since
+ * they are considered as device's capacity.
+ */
+ pdf_init_device(dvi2pts, pdfdecimaldigits, ignore_colors);
+
+ if (opt_flags & OPT_CIDFONT_FIXEDPITCH)
+ CIDFont_set_flags(CIDFONT_FORCE_FIXEDPITCH);
+
+ /* Please move this to spc_init_specials(). */
+ if (opt_flags & OPT_TPIC_TRANSPARENT_FILL)
+ tpic_set_fill_mode(1);
+
+ if (mp_mode) {
+ do_mps_pages();
+ } else {
+ do_dvi_pages();
+ }
+
+ /* Order of close... */
+ pdf_close_device ();
+ /* pdf_close_document flushes XObject (image) and other resources. */
+ pdf_close_document();
+
+ pdf_close_fontmaps(); /* pdf_font may depend on fontmap. */
+
+ if (!mp_mode)
+ dvi_close();
+
+ MESG("\n");
+ cleanup();
+
+ paperdone();
+#ifdef MIKTEX
+ miktex_uninitialize ();
+#endif
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/epdf.c b/Build/source/texk/xdvipdfmx/src/epdf.c
new file mode 100644
index 00000000000..c041bb1e7b5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/epdf.c
@@ -0,0 +1,523 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/epdf.c,v 1.14 2004/09/12 11:57:49 hirata Exp $
+
+ This is dvipdfm, a DVI to PDF translator.
+ Copyright (C) 1998, 1999 by Mark A. Wicks
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ The author may be contacted via the e-mail address
+
+ mwicks@kettering.edu
+*/
+
+
+/*
+ * Concatinating content streams are only supported for streams that only uses
+ * single FlateDecode filter, i.e.,
+ *
+ * /Filter /FlateDecode or /Filter [/FlateDecode]
+ *
+ * TrimBox, BleedBox, ArtBox, Rotate ...
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "mfileio.h"
+#include "error.h"
+
+#if HAVE_ZLIB
+#include <zlib.h>
+#endif
+
+#include "pdfobj.h"
+#include "pdfdev.h"
+
+#include "pdfximage.h"
+
+#include "epdf.h"
+
+#if HAVE_ZLIB
+static int add_stream_flate (pdf_obj *dst, const void *data, long len);
+#endif
+static int concat_stream (pdf_obj *dst, pdf_obj *src);
+static void print_bbox_info (pdf_obj *rect, const char *type, pdf_obj *crop_box);
+static int rect_equal (pdf_obj *rect1, pdf_obj *rect2);
+
+/*
+ * From PDF Reference 4th ed.
+ *
+ * MediaBox rectangle (Required; inheritable)
+ *
+ * A rectangle, expressed in default user space units, defining the boundaries of the
+ * physical medium on which the page is intended to be displayed or printed.
+ *
+ * CropBox rectangle (Optional; inheritable)
+ *
+ * A rectangle, expressed in default user space units, defining the visible region of
+ * default user space. When the page is displayed or printed, its contents are to be
+ * clipped (cropped) to this rectangle and then imposed on the output medium in some
+ * implementation-defined manner.
+ * Default value: the value of MediaBox.
+ *
+ * BleedBox rectangle (Optional; PDF 1.3)
+ *
+ * A rectangle, expressed in default user space units, defining the region to which the
+ * contents of the page should be clipped when output in a production environment.
+ * Default value: the value of CropBox.
+ *
+ * TrimBox rectangle (Optional; PDF 1.3)
+ *
+ * A rectangle, expressed in default user space units, defining the intended dimensions
+ * of the finished page after trimming.
+ * Default value: the value of CropBox.
+ *
+ * ArtBox rectangle (Optional; PDF 1.3)
+ *
+ * A rectangle, expressed in default user space units, defining the extent of the page's
+ * meaningful content (including potential white space) as intended by the page's creator
+ * Default value: the value of CropBox.
+ *
+ * Rotate integer (Optional; inheritable)
+ *
+ * The number of degrees by which the page should be rotated clockwise when displayed or
+ * printed. The value must be a multiple of 90.
+ * Default value: 0.
+ */
+
+static int
+rect_equal (pdf_obj *rect1, pdf_obj *rect2)
+{
+ int i;
+
+ if (!rect1 || !rect2)
+ return 0;
+ for (i = 0; i < 4; i++) {
+ if (pdf_number_value(pdf_get_array(rect1, i)) !=
+ pdf_number_value(pdf_get_array(rect2, i)))
+ return 0;
+ }
+
+ return 1;
+}
+
+static void
+print_bbox_info (pdf_obj *rect, const char *type, pdf_obj *crop_box)
+{
+ WARN("\"%s\" different from current CropBox found.", type);
+ WARN("%s (PDF): [ %g %g %g %g ]", type,
+ pdf_number_value(pdf_get_array(rect, 0)),
+ pdf_number_value(pdf_get_array(rect, 1)),
+ pdf_number_value(pdf_get_array(rect, 2)),
+ pdf_number_value(pdf_get_array(rect, 3)));
+ WARN("CropBox/MediaBox (PDF) : [ %g %g %g %g ]",
+ pdf_number_value(pdf_get_array(crop_box, 0)),
+ pdf_number_value(pdf_get_array(crop_box, 1)),
+ pdf_number_value(pdf_get_array(crop_box, 2)),
+ pdf_number_value(pdf_get_array(crop_box, 3)));
+}
+
+int
+pdf_include_page (pdf_ximage *ximage, FILE *image_file, int page_index, int pdf_box)
+{
+ xform_info info;
+ pdf_obj *contents, *contents_ref, *contents_dict;
+ pdf_obj *page_tree;
+ pdf_obj *bbox, *resources, *rotate, *matrix;
+ int page_count;
+
+ pdf_ximage_init_form_info(&info);
+ /*
+ * Get Page Tree.
+ */
+ page_tree = NULL;
+ {
+ pdf_obj *trailer, *catalog;
+ pdf_obj *markinfo, *tmp;
+
+ trailer = pdf_open(image_file);
+ if (!trailer) {
+ WARN("Trailer not found! Corrupt PDF file?");
+ pdf_close();
+ return -1;
+ }
+
+ if (pdf_lookup_dict(trailer, "Encrypt")) {
+ WARN("This PDF document is encrypted.");
+ pdf_release_obj(trailer);
+ pdf_close();
+ return -1;
+ }
+
+ catalog = pdf_deref_obj(pdf_lookup_dict(trailer, "Root"));
+ if (!catalog) {
+ WARN("Catalog isn't where I expect it.");
+ pdf_close();
+ return -1;
+ }
+ pdf_release_obj(trailer);
+
+ markinfo = pdf_deref_obj(pdf_lookup_dict(catalog, "MarkInfo"));
+ if (markinfo) {
+ tmp = pdf_lookup_dict(markinfo, "Marked");
+ pdf_release_obj(markinfo);
+ if (tmp && pdf_boolean_value(tmp)) {
+ WARN("Tagged PDF not supported.");
+ pdf_release_obj(catalog);
+ pdf_close();
+ return -1;
+ }
+ }
+
+ page_tree = pdf_deref_obj(pdf_lookup_dict(catalog, "Pages"));
+ pdf_release_obj(catalog);
+ }
+ if (!page_tree) {
+ WARN("Page tree not found.");
+ pdf_close();
+ return -1;
+ }
+
+ page_count = (int)pdf_number_value(pdf_lookup_dict(page_tree, "Count"));
+ if (page_index >= page_count)
+ page_index = page_count - 1;
+ else if (page_index < 0) {
+ page_index = page_count + page_index;
+ if (page_index < 0)
+ page_index = 0;
+ }
+
+ /*
+ * Seek required page. Get Media/Crop Box.
+ * Media box and resources can be inherited.
+ */
+ {
+ pdf_obj *kids_ref, *kids;
+ pdf_obj *crop_box;
+ pdf_obj *tmp;
+
+ tmp = pdf_lookup_dict(page_tree, "MediaBox");
+ bbox = tmp ? pdf_deref_obj(tmp) : NULL;
+ tmp = pdf_lookup_dict(page_tree, "CropBox");
+ crop_box = tmp ? pdf_deref_obj(tmp) : NULL;
+ tmp = pdf_lookup_dict(page_tree, "Rotate");
+ rotate = tmp ? pdf_deref_obj(tmp) : NULL;
+
+ tmp = pdf_lookup_dict(page_tree, "Resources");
+ resources = tmp ? pdf_deref_obj(tmp) : pdf_new_dict();
+
+ while ((kids_ref = pdf_lookup_dict(page_tree, "Kids")) != NULL) {
+ /* page_tree is a Pages object: figure out which of its Kids we need */
+ int kid_index;
+ kids = pdf_deref_obj(kids_ref);
+ for (kid_index = 0; ; ++kid_index) {
+ pdf_release_obj(page_tree);
+ page_tree = pdf_deref_obj(pdf_get_array(kids, kid_index));
+ /* page_tree might be a Page or another Pages node */
+ tmp = pdf_lookup_dict(page_tree, "Count");
+ if (tmp) {
+ /* it's a subtree: check if the required page is within this tree */
+ page_count = (int)pdf_number_value(tmp);
+ if (page_index < page_count)
+ break;
+ else
+ page_index -= page_count;
+ }
+ else {
+ /* it's a page: break if it's the one we want */
+ if (page_index == 0)
+ break;
+ else
+ --page_index;
+ }
+ }
+ pdf_release_obj(kids);
+
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "MediaBox")))) {
+ if (bbox)
+ pdf_release_obj(bbox);
+ bbox = tmp;
+ }
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "CropBox")))) {
+ if (crop_box)
+ pdf_release_obj(crop_box);
+ crop_box = tmp;
+ }
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Rotate")))) {
+ if (rotate)
+ pdf_release_obj(rotate);
+ rotate = tmp;
+ }
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "Resources")))) {
+#if 0
+ pdf_merge_dict(tmp, resources);
+#endif
+ if (resources)
+ pdf_release_obj(resources);
+ resources = tmp;
+ }
+ }
+ if (crop_box) {
+ pdf_release_obj(bbox);
+ bbox = crop_box;
+ }
+ }
+ if (!bbox) {
+ WARN("No BoundingBox information available.");
+ pdf_release_obj(page_tree);
+ pdf_release_obj(resources);
+ if (rotate)
+ pdf_release_obj(rotate);
+ pdf_close();
+ return -1;
+ }
+
+ /*
+ * BleedBox, TrimBox, and ArtBox are not inheritable.
+ */
+ {
+ pdf_obj *tmp;
+
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "TrimBox")))) {
+ if (!rect_equal(tmp, bbox)) {
+ print_bbox_info(tmp, "TrimBox", bbox);
+ if (bbox)
+ pdf_release_obj(bbox);
+ bbox = tmp;
+ }
+ }
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "BleedBox")))) {
+ if (!rect_equal(tmp, bbox)) {
+ print_bbox_info(tmp, "BleedBox", bbox);
+ if (bbox)
+ pdf_release_obj(bbox);
+ bbox = tmp;
+ }
+ }
+ if ((tmp = pdf_deref_obj(pdf_lookup_dict(page_tree, "ArtBox")))) {
+ if (!rect_equal(tmp, bbox)) {
+ print_bbox_info(tmp, "ArtBox", bbox);
+ if (bbox)
+ pdf_release_obj(bbox);
+ bbox = tmp;
+ }
+ }
+ if (rotate) {
+ if (pdf_number_value(rotate) != 0.0)
+ WARN("<< /Rotate %d >> found. (Not supported yet)", (int)pdf_number_value(rotate));
+ pdf_release_obj(rotate);
+ rotate = NULL;
+ }
+
+ info.bbox.llx = pdf_number_value(pdf_get_array(bbox, 0));
+ info.bbox.lly = pdf_number_value(pdf_get_array(bbox, 1));
+ info.bbox.urx = pdf_number_value(pdf_get_array(bbox, 2));
+ info.bbox.ury = pdf_number_value(pdf_get_array(bbox, 3));
+ }
+
+ /*
+ * Handle page content stream.
+ * page_tree is now set to the first page.
+ */
+ contents_ref = contents = NULL;
+ {
+ contents = pdf_deref_obj(pdf_lookup_dict(page_tree, "Contents"));
+ pdf_release_obj(page_tree);
+ if (!contents) {
+ pdf_release_obj(bbox);
+ pdf_close();
+ return -1;
+ }
+
+ /*
+ * Concatinate all content streams.
+ */
+ if (PDF_OBJ_ARRAYTYPE(contents)) {
+ pdf_obj *content_seg, *content_new;
+ int idx = 0;
+ content_new = pdf_new_stream(STREAM_COMPRESS);
+ for (;;) {
+ content_seg = pdf_deref_obj(pdf_get_array(contents, idx));
+ if (!content_seg)
+ break;
+ else if (PDF_OBJ_NULLTYPE(content_seg)) {
+ /* Silently ignore. */
+ } else if (!PDF_OBJ_STREAMTYPE(content_seg)) {
+ WARN("Page content not a stream object. Broken PDF file?");
+ pdf_release_obj(content_new);
+ pdf_release_obj(bbox);
+ pdf_close();
+ return -1;
+ } else if (concat_stream(content_new, content_seg) < 0) {
+ WARN("Could not handle content stream with multiple segment.");
+ pdf_release_obj(content_new);
+ pdf_release_obj(bbox);
+ pdf_close();
+ return -1;
+ }
+ pdf_release_obj(content_seg);
+ idx++;
+ }
+ pdf_release_obj(contents);
+ contents = content_new;
+ }
+ if (!contents) {
+ pdf_release_obj(bbox);
+ pdf_close();
+ return -1;
+ }
+ }
+
+ {
+ pdf_obj *tmp;
+
+ tmp = pdf_import_object(resources);
+ pdf_release_obj(resources);
+ resources = tmp;
+ }
+
+ pdf_close();
+
+ contents_dict = pdf_stream_dict(contents);
+ pdf_add_dict(contents_dict,
+ pdf_new_name("Type"),
+ pdf_new_name("XObject"));
+ pdf_add_dict(contents_dict,
+ pdf_new_name("Subtype"),
+ pdf_new_name("Form"));
+ pdf_add_dict(contents_dict,
+ pdf_new_name("FormType"),
+ pdf_new_number(1.0));
+
+ pdf_add_dict(contents_dict, pdf_new_name("BBox"), bbox);
+
+ matrix = pdf_new_array();
+ pdf_add_array(matrix, pdf_new_number(1.0));
+ pdf_add_array(matrix, pdf_new_number(0.0));
+ pdf_add_array(matrix, pdf_new_number(0.0));
+ pdf_add_array(matrix, pdf_new_number(1.0));
+ pdf_add_array(matrix, pdf_new_number(0.0));
+ pdf_add_array(matrix, pdf_new_number(0.0));
+
+ pdf_add_dict(contents_dict, pdf_new_name("Matrix"), matrix);
+
+ pdf_add_dict(contents_dict, pdf_new_name("Resources"), resources);
+
+ pdf_ximage_set_form(ximage, &info, contents);
+
+ return 0;
+}
+
+#define WBUF_SIZE 4096
+#if HAVE_ZLIB
+static int
+add_stream_flate (pdf_obj *dst, const void *data, long len)
+{
+ z_stream z;
+ Bytef wbuf[WBUF_SIZE];
+
+ z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL;
+
+ z.next_in = (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);
+}
+#endif
+
+static int
+concat_stream (pdf_obj *dst, pdf_obj *src)
+{
+ const char *stream_data;
+ long stream_length;
+ pdf_obj *stream_dict;
+ pdf_obj *filter;
+
+ if (!PDF_OBJ_STREAMTYPE(dst) || !PDF_OBJ_STREAMTYPE(src))
+ ERROR("Invalid type.");
+
+ stream_data = pdf_stream_dataptr(src);
+ stream_length = pdf_stream_length (src);
+ stream_dict = pdf_stream_dict (src);
+
+ if (pdf_lookup_dict(stream_dict, "DecodeParms")) {
+ WARN("DecodeParams not supported.");
+ return -1;
+ }
+
+ filter = pdf_lookup_dict(stream_dict, "Filter");
+ if (!filter) {
+ pdf_add_stream(dst, stream_data, stream_length);
+ return 0;
+#if HAVE_ZLIB
+ } else {
+ char *filter_name;
+ if (PDF_OBJ_NAMETYPE(filter)) {
+ filter_name = pdf_name_value(filter);
+ if (filter_name && !strcmp(filter_name, "FlateDecode"))
+ return add_stream_flate(dst, stream_data, stream_length);
+ else {
+ WARN("DecodeFilter \"%s\" not supported.", filter_name);
+ return -1;
+ }
+ } else if (PDF_OBJ_ARRAYTYPE(filter)) {
+ if (pdf_array_length(filter) > 1) {
+ WARN("Multiple DecodeFilter not supported.");
+ return -1;
+ } else {
+ filter_name = pdf_name_value(pdf_get_array(filter, 0));
+ if (filter_name && !strcmp(filter_name, "FlateDecode"))
+ return add_stream_flate(dst, stream_data, stream_length);
+ else {
+ WARN("DecodeFilter \"%s\" not supported.", filter_name);
+ return -1;
+ }
+ }
+ } else
+ ERROR("Broken PDF file?");
+#endif /* HAVE_ZLIB */
+ }
+
+ return -1;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/epdf.h b/Build/source/texk/xdvipdfmx/src/epdf.h
new file mode 100644
index 00000000000..d99f3a63856
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/epdf.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/epdf.h,v 1.8 2004/09/11 14:50:28 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _EPDF_H_
+#define _EPDF_H_
+
+#include "mfileio.h"
+#include "pdfximage.h"
+
+#define pdfbox_crop 1
+#define pdfbox_media 2
+#define pdfbox_bleed 3
+#define pdfbox_trim 4
+#define pdfbox_art 5
+
+extern int pdf_include_page (pdf_ximage *ximage, FILE *file, int page_index, int pdf_box);
+
+#endif /* _EPDF_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/error.c b/Build/source/texk/xdvipdfmx/src/error.c
new file mode 100644
index 00000000000..ac0a1d8a79f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/error.c
@@ -0,0 +1,94 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/error.c,v 1.4 2004/03/11 11:50:20 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "error.h"
+
+#define DPX_MESG 0
+#define DPX_MESG_WARN 1
+#define DPX_MESG_ERROR 2
+
+static int _mesg_type = DPX_MESG;
+#define WANT_NEWLINE() (_mesg_type != DPX_MESG_WARN && _mesg_type != DPX_MESG_ERROR)
+
+static int really_quiet = 0;
+
+void
+shut_up (void)
+{
+ really_quiet = 1;
+}
+
+void
+MESG (const char *fmt, ...)
+{
+ va_list argp;
+
+ if (!really_quiet) {
+ va_start(argp, fmt);
+ vfprintf(stderr, fmt, argp);
+ va_end(argp);
+ _mesg_type = DPX_MESG;
+ }
+}
+
+void
+WARN (const char *fmt, ...)
+{
+ va_list argp;
+
+ if (!really_quiet) {
+ if (WANT_NEWLINE())
+ fprintf(stderr, "\n");
+ fprintf(stderr, "** WARNING ** ");
+ va_start(argp, fmt);
+ vfprintf(stderr, fmt, argp);
+ va_end(argp);
+ fprintf(stderr, "\n");
+
+ _mesg_type = DPX_MESG_WARN;
+ }
+}
+
+extern void error_cleanup (void);
+
+void
+ERROR (const char *fmt, ...)
+{
+ va_list argp;
+
+ if (!really_quiet) {
+ if (WANT_NEWLINE())
+ fprintf(stderr, "\n");
+ fprintf(stderr, "** ERROR ** ");
+ va_start(argp, fmt);
+ vfprintf(stderr, fmt, argp);
+ va_end(argp);
+ fprintf(stderr, "\n");
+ }
+ error_cleanup();
+ exit( 1 );
+}
diff --git a/Build/source/texk/xdvipdfmx/src/error.h b/Build/source/texk/xdvipdfmx/src/error.h
new file mode 100644
index 00000000000..68b414d20c5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/error.h
@@ -0,0 +1,46 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/error.h,v 1.7 2004/03/11 11:50:21 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _ERROR_H_
+#define _ERROR_H_
+
+#include "system.h"
+
+extern void error_cleanup();
+
+#define FATAL_ERROR -1
+#define NO_ERROR 0
+
+#include <assert.h>
+#include <stdio.h>
+
+extern void shut_up (void);
+
+extern void ERROR (const char *fmt, ...);
+extern void MESG (const char *fmt, ...);
+extern void WARN (const char *fmt, ...);
+
+#define ASSERT(e) assert(e)
+
+#endif /* _ERROR_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/fontmap.c b/Build/source/texk/xdvipdfmx/src/fontmap.c
new file mode 100644
index 00000000000..4e007bfc948
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/fontmap.c
@@ -0,0 +1,1527 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/fontmap.c,v 1.33 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+#include "dpxutil.h"
+
+#include "subfont.h"
+
+#include "fontmap.h"
+
+#ifdef XETEX
+#ifdef XETEX_MAC
+#include <CoreFoundation/CoreFoundation.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include "ft2build.h"
+#include FT_FREETYPE_H
+#else
+#include "fontconfig/fontconfig.h"
+#include "fontconfig/fcfreetype.h"
+#endif
+#endif
+
+/* CIDFont */
+static char *strip_options (const char *map_name, fontmap_opt *opt);
+
+static int verbose = 0;
+void
+pdf_fontmap_set_verbose (void)
+{
+ verbose++;
+}
+
+
+void
+pdf_init_fontmap_record (fontmap_rec *mrec)
+{
+ ASSERT(mrec);
+
+ mrec->map_name = NULL;
+
+ /* SFD char mapping */
+ mrec->charmap.sfd_name = NULL;
+ mrec->charmap.subfont_id = NULL;
+ /* for OFM */
+ mrec->opt.mapc = -1; /* compatibility */
+
+ mrec->font_name = NULL;
+ mrec->enc_name = NULL;
+
+ mrec->opt.slant = 0.0;
+ mrec->opt.extend = 1.0;
+ mrec->opt.bold = 0.0;
+
+ mrec->opt.flags = 0;
+
+ mrec->opt.design_size = -1.0;
+
+ mrec->opt.tounicode = NULL;
+ mrec->opt.otl_tags = NULL; /* deactivated */
+ mrec->opt.index = 0;
+ mrec->opt.charcoll = NULL;
+ mrec->opt.style = FONTMAP_STYLE_NONE;
+
+#ifdef XETEX
+ mrec->opt.ft_face = NULL;
+ mrec->opt.glyph_widths = NULL;
+#endif
+}
+
+void
+pdf_clear_fontmap_record (fontmap_rec *mrec)
+{
+ ASSERT(mrec);
+
+ if (mrec->map_name)
+ RELEASE(mrec->map_name);
+ if (mrec->charmap.sfd_name)
+ RELEASE(mrec->charmap.sfd_name);
+ if (mrec->charmap.subfont_id)
+ RELEASE(mrec->charmap.subfont_id);
+ if (mrec->enc_name)
+ RELEASE(mrec->enc_name);
+ if (mrec->font_name)
+ RELEASE(mrec->font_name);
+
+ if (mrec->opt.tounicode)
+ RELEASE(mrec->opt.tounicode);
+ if (mrec->opt.otl_tags)
+ RELEASE(mrec->opt.otl_tags);
+ if (mrec->opt.charcoll)
+ RELEASE(mrec->opt.charcoll);
+ pdf_init_fontmap_record(mrec);
+}
+
+/* strdup: just returns NULL for NULL */
+static char *
+mstrdup (const char *s)
+{
+ char *r;
+ if (!s)
+ return NULL;
+ r = NEW(strlen(s) + 1, char);
+ strcpy(r, s);
+ return r;
+}
+
+static void
+pdf_copy_fontmap_record (fontmap_rec *dst, const fontmap_rec *src)
+{
+ ASSERT( dst && src );
+
+ dst->map_name = mstrdup(src->map_name);
+
+ dst->charmap.sfd_name = mstrdup(src->charmap.sfd_name);
+ dst->charmap.subfont_id = mstrdup(src->charmap.subfont_id);
+
+ dst->font_name = mstrdup(src->font_name);
+ dst->enc_name = mstrdup(src->enc_name);
+
+ dst->opt.slant = src->opt.slant;
+ dst->opt.extend = src->opt.extend;
+ dst->opt.bold = src->opt.bold;
+
+ dst->opt.flags = src->opt.flags;
+ dst->opt.mapc = src->opt.mapc;
+
+ dst->opt.tounicode = mstrdup(src->opt.tounicode);
+ dst->opt.otl_tags = mstrdup(src->opt.otl_tags);
+ dst->opt.index = src->opt.index;
+ dst->opt.charcoll = mstrdup(src->opt.charcoll);
+ dst->opt.style = src->opt.style;
+
+#ifdef XETEX
+ dst->opt.ft_face = src->opt.ft_face;
+ dst->opt.glyph_widths = src->opt.glyph_widths;
+#endif
+}
+
+
+static void
+hval_free (void *vp)
+{
+ fontmap_rec *mrec = (fontmap_rec *) vp;
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+}
+
+
+static void
+fill_in_defaults (fontmap_rec *mrec, const char *tex_name)
+{
+ if (mrec->enc_name &&
+ (!strcmp(mrec->enc_name, "default") ||
+ !strcmp(mrec->enc_name, "none"))) {
+ RELEASE(mrec->enc_name);
+ mrec->enc_name = NULL;
+ }
+ if (mrec->font_name &&
+ (!strcmp(mrec->font_name, "default") ||
+ !strcmp(mrec->font_name, "none"))) {
+ RELEASE(mrec->font_name);
+ mrec->font_name = NULL;
+ }
+ /* We *must* fill font_name either explicitly or by default */
+ if (!mrec->font_name) {
+ mrec->font_name = NEW(strlen(tex_name)+1, char);
+ strcpy(mrec->font_name, tex_name);
+ }
+
+ mrec->map_name = NEW(strlen(tex_name)+1, char);
+ strcpy(mrec->map_name, tex_name);
+
+#ifndef WITHOUT_COMPAT
+ /* Use "UCS" character collection for Unicode SFD
+ * and Identity CMap combination. For backward
+ * compatibility.
+ */
+ if (mrec->charmap.sfd_name && mrec->enc_name &&
+ !mrec->opt.charcoll) {
+ if ((!strcmp(mrec->enc_name, "Identity-H") ||
+ !strcmp(mrec->enc_name, "Identity-V"))
+ &&
+ (strstr(mrec->charmap.sfd_name, "Uni") ||
+ strstr(mrec->charmap.sfd_name, "UBig") ||
+ strstr(mrec->charmap.sfd_name, "UBg") ||
+ strstr(mrec->charmap.sfd_name, "UGB") ||
+ strstr(mrec->charmap.sfd_name, "UKS") ||
+ strstr(mrec->charmap.sfd_name, "UJIS"))) {
+ mrec->opt.charcoll = NEW(strlen("UCS")+1, char);
+ strcpy(mrec->opt.charcoll, "UCS");
+ }
+ }
+#endif /* WITHOUT_COMPAT */
+
+ return;
+}
+
+static char *
+readline (char *buf, int buf_len, FILE *fp)
+{
+ char *p, *q;
+ ASSERT( buf && buf_len > 0 && fp );
+ p = mfgets(buf, buf_len, fp);
+ if (!p)
+ return NULL;
+ q = strchr(p, '%'); /* we don't have quoted string */
+ if (q)
+ *q = '\0';
+ return p;
+}
+
+#ifndef ISBLANK
+# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+static void
+skip_blank (char **pp, char *endptr)
+{
+ char *p = *pp;
+ if (!p || p >= endptr)
+ return;
+ for ( ; p < endptr && ISBLANK(*p); p++);
+ *pp = p;
+}
+
+static char *
+parse_string_value (char **pp, char *endptr)
+{
+ char *q = NULL, *p = *pp;
+ int n;
+
+ if (!p || p >= endptr)
+ return NULL;
+ if (*p == '"')
+ q = parse_c_string(&p, endptr);
+ else {
+ for (n = 0; p < endptr && !isspace(*p); p++, n++);
+ if (n == 0)
+ return NULL;
+ q = NEW(n + 1, char);
+ memcpy(q, *pp, n); q[n] = '\0';
+ }
+
+ *pp = p;
+ return q;
+}
+
+/* no preceeding spaces allowed */
+static char *
+parse_integer_value (char **pp, char *endptr, int base)
+{
+ char *q, *p = *pp;
+ int has_sign = 0, has_prefix = 0, n;
+
+ ASSERT( base == 0 || (base >= 2 && base <= 36) );
+
+ if (!p || p >= endptr)
+ return NULL;
+
+ if (*p == '-' || *p == '+') {
+ p++; has_sign = 1;
+ }
+ if ((base == 0 || base == 16) &&
+ p + 2 <= endptr &&
+ p[0] == '0' && p[1] == 'x') {
+ p += 2; has_prefix = 1;
+ }
+ if (base == 0) {
+ if (has_prefix)
+ base = 16;
+ else if (p < endptr && *p == '0')
+ base = 8;
+ else {
+ base = 10;
+ }
+ }
+#define ISDIGIT_WB(c,b) ( \
+ ((b) <= 10 && (c) >= '0' && (c) < '0' + (b)) || \
+ ((b) > 10 && ( \
+ ((c) >= '0' && (c) <= '9') || \
+ ((c) >= 'a' && (c) < 'a' + ((b) - 10)) || \
+ ((c) >= 'A' && (c) < 'A' + ((b) - 10)) \
+ ) \
+ ) \
+)
+ for (n = 0; p < endptr && ISDIGIT_WB(*p, base); p++, n++);
+ if (n == 0)
+ return NULL;
+ if (has_sign)
+ n += 1;
+ if (has_prefix)
+ n += 2;
+
+ q = NEW(n + 1, char);
+ memcpy(q, *pp, n); q[n] = '\0';
+
+ *pp = p;
+ return q;
+}
+
+static int
+fontmap_parse_mapdef (fontmap_rec *mrec,
+ const char *mapdef, char *endptr)
+{
+ char *p = (char *) mapdef;
+
+ /*
+ * Parse record line in map file. First two fields (after TeX font
+ * name) are position specific. Arguments start at the first token
+ * beginning with a '-'.
+ *
+ * NOTE:
+ * Dvipdfm basically uses parse_ident() for parsing enc_name,
+ * font_name, and other string values which assumes PostScript-like
+ * syntax.
+ * skip_white() skips '\r' and '\n' but they should terminate
+ * fontmap line here.
+ */
+
+ skip_blank(&p, endptr);
+ /* encoding field */
+ if (p < endptr && *p != '-') { /* May be NULL */
+ mrec->enc_name = parse_string_value(&p, endptr);
+ skip_blank(&p, endptr);
+ }
+
+ /* fontname or font filename field */
+ if (p < endptr && *p != '-') { /* May be NULL */
+ mrec->font_name = parse_string_value(&p, endptr);
+ skip_blank(&p, endptr);
+ }
+ if (mrec->font_name) {
+ char *tmp;
+ /* Several options are encoded in font_name for
+ * compatibility with dvipdfm.
+ */
+ tmp = strip_options(mrec->font_name, &mrec->opt);
+ if (tmp) {
+ RELEASE(mrec->font_name);
+ mrec->font_name = tmp;
+ }
+ }
+
+ skip_blank(&p, endptr);
+ /* Parse any remaining arguments */
+ while (p + 1 < endptr &&
+ *p != '\r' && *p != '\n' && *p == '-') {
+ char *q, mopt = p[1];
+ long v;
+
+ p += 2; skip_blank(&p, endptr);
+ switch (mopt) {
+
+ case 's': /* Slant option */
+ q = parse_float_decimal(&p, endptr);
+ if (!q) {
+ WARN("Missing a number value for 's' option.");
+ return -1;
+ }
+ mrec->opt.slant = atof(q);
+ RELEASE(q);
+ break;
+ case 'e': /* Extend option */
+ q = parse_float_decimal(&p, endptr);
+ if (!q) {
+ WARN("Missing a number value for 'e' option.");
+ return -1;
+ }
+ mrec->opt.extend = atof(q);
+ if (mrec->opt.extend <= 0.0) {
+ WARN("Invalid value for 'e' option: %s", q);
+ return -1;
+ }
+ RELEASE(q);
+ break;
+ case 'b': /* Fake-bold option */
+ q = parse_float_decimal(&p, endptr);
+ if (!q) {
+ WARN("Missing a number value for 'b' option.");
+ return -1;
+ }
+ mrec->opt.bold = atof(q);
+ if (mrec->opt.bold <= 0.0) {
+ WARN("Invalid value for 'b' option: %s", q);
+ return -1;
+ }
+ RELEASE(q);
+ break;
+
+ case 'r': /* Remap option */
+ mrec->opt.flags |= FONTMAP_OPT_REMAP;
+ break;
+
+#if 1
+ case 'i': /* TTC index */
+ q = parse_integer_value(&p, endptr, 10);
+ if (!q) {
+ WARN("Missing TTC index number...");
+ return -1;
+ }
+ mrec->opt.index = atoi(q);
+ if (mrec->opt.index < 0) {
+ WARN("Invalid TTC index number: %s", q);
+ return -1;
+ }
+ RELEASE(q);
+ break;
+
+ case 'p': /* UCS plane: just for testing */
+ q = parse_integer_value(&p, endptr, 0);
+ if (!q) {
+ WARN("Missing a number for 'p' option.");
+ return -1;
+ }
+ v = strtol(q, NULL, 0);
+ if (v < 0 || v > 16)
+ WARN("Invalid valur for option 'p': %s", q);
+ else {
+ mrec->opt.mapc |= v << 16;
+ }
+ RELEASE(q);
+ break;
+
+ case 'u': /* ToUnicode */
+ q = parse_string_value(&p, endptr);
+ if (q)
+ mrec->opt.tounicode = q;
+ else {
+ WARN("Missing string value for option 'u'.");
+ return -1;
+ }
+ break;
+#endif
+
+ /* Omega uses both single-byte and double-byte set_char command
+ * even for double-byte OFMs. This confuses CMap decoder.
+ */
+ case 'm':
+ /* Map single bytes char 0xab to double byte char 0xcdab */
+ if (p + 4 <= endptr &&
+ p[0] == '<' && p[3] == '>') {
+ p++;
+ q = parse_integer_value(&p, endptr, 16);
+ if (!q) {
+ WARN("Invalid value for option 'm'.");
+ return -1;
+ } else if (p < endptr && *p != '>') {
+ WARN("Invalid value for option 'm': %s", q);
+ RELEASE(q);
+ return -1;
+ }
+ v = strtol(q, NULL, 16);
+ mrec->opt.mapc = ((v << 8) & 0x0000ff00L);
+ RELEASE(q); p++;
+ } else if (p + 4 <= endptr &&
+ !memcmp(p, "sfd:", strlen("sfd:"))) {
+ char *r;
+ /* SFD mapping: sfd:Big5,00 */
+ p += 4; skip_blank(&p, endptr);
+ q = parse_string_value(&p, endptr);
+ if (!q) {
+ WARN("Missing value for option 'm'.");
+ return -1;
+ }
+ r = strchr(q, ',');
+ if (!r) {
+ WARN("Invalid value for option 'm': %s", q);
+ RELEASE(q);
+ return -1;
+ }
+ *r = 0; r++; skip_blank(&r, r + strlen(r));
+ if (*r == '\0') {
+ WARN("Invalid value for option 'm': %s,", q);
+ RELEASE(q);
+ return -1;
+ }
+ mrec->charmap.sfd_name = mstrdup(q);
+ mrec->charmap.subfont_id = mstrdup(r);
+ RELEASE(q);
+ } else if (p + 4 < endptr &&
+ !memcmp(p, "pad:", strlen("pad:"))) {
+ p += 4; skip_blank(&p, endptr);
+ q = parse_integer_value(&p, endptr, 16);
+ if (!q) {
+ WARN("Invalid value for option 'm'.");
+ return -1;
+ } else if (p < endptr && !isspace(*p)) {
+ WARN("Invalid value for option 'm': %s", q);
+ RELEASE(q);
+ return -1;
+ }
+ v = strtol(q, NULL, 16);
+ mrec->opt.mapc = ((v << 8) & 0x0000ff00L);
+ RELEASE(q);
+ } else {
+ WARN("Invalid value for option 'm'.");
+ return -1;
+ }
+ break;
+
+#if 1
+ case 'w': /* Writing mode (for unicode encoding) */
+ if (!mrec->enc_name ||
+ strcmp(mrec->enc_name, "unicode")) {
+ WARN("Fontmap option 'w' meaningless for encoding other than \"unicode\".");
+ return -1;
+ }
+ q = parse_integer_value(&p, endptr, 10);
+ if (!q) {
+ WARN("Missing wmode value...");
+ return -1;
+ }
+ if (atoi(q) == 1)
+ mrec->opt.flags |= FONTMAP_OPT_VERT;
+ else if (atoi(q) == 0)
+ mrec->opt.flags &= ~FONTMAP_OPT_VERT;
+ else {
+ WARN("Invalid value for option 'w': %s", q);
+ }
+ RELEASE(q);
+ break;
+#endif
+
+ default:
+ WARN("Unrecognized font map option: '%c'", mopt);
+ return -1;
+ break;
+ }
+ skip_blank(&p, endptr);
+ }
+
+ if (p < endptr && *p != '\r' && *p != '\n') {
+ WARN("Invalid char in fontmap line: %c", *p);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+
+static struct ht_table *fontmap = NULL;
+
+#define fontmap_invalid(m) (!(m) || !(m)->map_name || !(m)->font_name)
+static char *
+chop_sfd_name (const char *tex_name, char **sfd_name)
+{
+ char *fontname;
+ char *p, *q;
+ int m, n, len;
+
+ *sfd_name = NULL;
+
+ p = strchr((char *) tex_name, '@');
+ if (!p ||
+ p[1] == '\0' || p == tex_name) {
+ return NULL;
+ }
+ m = (int) (p - tex_name);
+ p++;
+ q = strchr(p, '@');
+ if (!q || q == p) {
+ return NULL;
+ }
+ n = (int) (q - p);
+ q++;
+
+ len = strlen(tex_name) - n;
+ fontname = NEW(len+1, char);
+ memcpy(fontname, tex_name, m);
+ fontname[m] = '\0';
+ if (*q)
+ strcat(fontname, q);
+
+ *sfd_name = NEW(n+1, char);
+ memcpy(*sfd_name, p, n);
+ (*sfd_name)[n] = '\0';
+
+ return fontname;
+}
+
+static char *
+make_subfont_name (const char *map_name, const char *sfd_name, const char *sub_id)
+{
+ char *tfm_name;
+ int n, m;
+ char *p, *q;
+
+ p = strchr(map_name, '@');
+ if (!p || p == map_name)
+ return NULL;
+ m = (int) (p - map_name);
+ q = strchr(p + 1, '@');
+ if (!q || q == p + 1)
+ return NULL;
+ n = (int) (q - p) + 1; /* including two '@' */
+ if (strlen(sfd_name) != n - 2 ||
+ memcmp(p + 1, sfd_name, n - 2))
+ return NULL;
+ tfm_name = NEW(strlen(map_name) - n + strlen(sub_id) + 1, char);
+ memcpy(tfm_name, map_name, m);
+ tfm_name[m] = '\0';
+ strcat(tfm_name, sub_id);
+ if (q[1]) /* not ending with '@' */
+ strcat(tfm_name, q + 1);
+
+ return tfm_name;
+}
+
+/* "foo@A@ ..." is expanded to
+ * fooab ... -m sfd:A,ab
+ * ...
+ * fooyz ... -m sfd:A,yz
+ * where 'ab' ... 'yz' is subfont IDs in SFD 'A'.
+ */
+int
+pdf_append_fontmap_record (const char *kp, const fontmap_rec *vp)
+{
+ fontmap_rec *mrec;
+ char *fnt_name, *sfd_name = NULL;
+
+ if (!kp || fontmap_invalid(vp)) {
+ WARN("Invalid fontmap record...");
+ return -1;
+ }
+
+ if (verbose > 3)
+ MESG("fontmap>> append key=\"%s\"...", kp);
+
+ fnt_name = chop_sfd_name(kp, &sfd_name);
+ if (fnt_name && sfd_name) {
+ char *tfm_name;
+ char **subfont_ids;
+ int n = 0;
+ subfont_ids = sfd_get_subfont_ids(sfd_name, &n);
+ if (!subfont_ids)
+ return -1;
+ while (n-- > 0) {
+ tfm_name = make_subfont_name(kp, sfd_name, subfont_ids[n]);
+ if (!tfm_name)
+ continue;
+ mrec = ht_lookup_table(fontmap, tfm_name, strlen(tfm_name));
+ if (!mrec) {
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ mrec->map_name = mstrdup(kp); /* link */
+ mrec->charmap.sfd_name = mstrdup(sfd_name);
+ mrec->charmap.subfont_id = mstrdup(subfont_ids[n]);
+ ht_insert_table(fontmap, tfm_name, strlen(tfm_name), mrec, hval_free);
+ }
+ RELEASE(tfm_name);
+ }
+ RELEASE(fnt_name);
+ RELEASE(sfd_name);
+ }
+
+ mrec = ht_lookup_table(fontmap, kp, strlen(kp));
+ if (!mrec) {
+ mrec = NEW(1, fontmap_rec);
+ pdf_copy_fontmap_record(mrec, vp);
+ if (mrec->map_name && !strcmp(kp, mrec->map_name)) {
+ RELEASE(mrec->map_name);
+ mrec->map_name = NULL;
+ }
+ ht_insert_table(fontmap, kp, strlen(kp), mrec, hval_free);
+ }
+ if (verbose > 3)
+ MESG("\n");
+
+ return 0;
+}
+
+int
+pdf_remove_fontmap_record (const char *kp)
+{
+ char *fnt_name, *sfd_name = NULL;
+
+ if (!kp)
+ return -1;
+
+ if (verbose > 3)
+ MESG("fontmap>> remove key=\"%s\"...", kp);
+
+ fnt_name = chop_sfd_name(kp, &sfd_name);
+ if (fnt_name && sfd_name) {
+ char *tfm_name;
+ char **subfont_ids;
+ int n = 0;
+ subfont_ids = sfd_get_subfont_ids(sfd_name, &n);
+ if (!subfont_ids)
+ return -1;
+ if (verbose > 3)
+ MESG("\nfontmap>> Expand @%s@:", sfd_name);
+ while (n-- > 0) {
+ tfm_name = make_subfont_name(kp, sfd_name, subfont_ids[n]);
+ if (!tfm_name)
+ continue;
+ if (verbose > 3)
+ MESG(" %s", tfm_name);
+ ht_remove_table(fontmap, tfm_name, strlen(tfm_name), hval_free);
+ RELEASE(tfm_name);
+ }
+ RELEASE(fnt_name);
+ RELEASE(sfd_name);
+ }
+
+ ht_remove_table(fontmap, kp, strlen(kp), hval_free);
+
+ if (verbose > 3)
+ MESG("\n");
+
+ return 0;
+}
+
+int
+pdf_insert_fontmap_record (const char *kp, const fontmap_rec *vp)
+{
+ fontmap_rec *mrec;
+ char *fnt_name, *sfd_name;
+
+ if (!kp || fontmap_invalid(vp)) {
+ WARN("Invalid fontmap record...");
+ return -1;
+ }
+
+ if (verbose > 3)
+ MESG("fontmap>> insert key=\"%s\"...", kp);
+
+ fnt_name = chop_sfd_name(kp, &sfd_name);
+ if (fnt_name && sfd_name) {
+ char *tfm_name;
+ char **subfont_ids;
+ int n = 0;
+ subfont_ids = sfd_get_subfont_ids(sfd_name, &n);
+ if (!subfont_ids)
+ return -1;
+ if (verbose > 3)
+ MESG("\nfontmap>> Expand @%s@:", sfd_name);
+ while (n-- > 0) {
+ tfm_name = make_subfont_name(kp, sfd_name, subfont_ids[n]);
+ if (!tfm_name)
+ continue;
+ if (verbose > 3)
+ MESG(" %s", tfm_name);
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ mrec->map_name = mstrdup(kp); /* link to this entry */
+ mrec->charmap.sfd_name = mstrdup(sfd_name);
+ mrec->charmap.subfont_id = mstrdup(subfont_ids[n]);
+ ht_insert_table(fontmap, tfm_name, strlen(tfm_name), mrec, hval_free);
+ RELEASE(tfm_name);
+ }
+ RELEASE(fnt_name);
+ RELEASE(sfd_name);
+ }
+
+ mrec = NEW(1, fontmap_rec);
+ pdf_copy_fontmap_record(mrec, vp);
+ if (mrec->map_name && !strcmp(kp, mrec->map_name)) {
+ RELEASE(mrec->map_name);
+ mrec->map_name = NULL;
+ }
+ ht_insert_table(fontmap, kp, strlen(kp), mrec, hval_free);
+
+ if (verbose > 3)
+ MESG("\n");
+
+ return 0;
+}
+
+
+int
+pdf_read_fontmap_line (fontmap_rec *mrec, const char *mline, long mline_len)
+{
+ int error;
+ char *q, *p, *endptr;
+
+
+ ASSERT(mrec);
+
+ p = (char *) mline;
+ endptr = p + mline_len;
+
+ skip_blank(&p, endptr);
+ if (p >= endptr)
+ return -1;
+
+ q = parse_string_value(&p, endptr);
+ if (!q)
+ return -1;
+
+ error = fontmap_parse_mapdef(mrec, p, endptr);
+ if (!error) {
+ char *fnt_name, *sfd_name = NULL;
+ fnt_name = chop_sfd_name(q, &sfd_name);
+ if (fnt_name && sfd_name) {
+ if (!mrec->font_name) {
+ /* In the case of subfonts, the base name (before the character '@')
+ * will be used as a font_name by default.
+ * Otherwise tex_name will be used as a font_name by default.
+ */
+ mrec->font_name = fnt_name;
+ } else {
+ RELEASE(fnt_name);
+ }
+ if (mrec->charmap.sfd_name)
+ RELEASE(mrec->charmap.sfd_name);
+ mrec->charmap.sfd_name = sfd_name ;
+ }
+ fill_in_defaults(mrec, q);
+ }
+ RELEASE(q);
+
+ return error;
+}
+
+/* Dvips format:
+ * String enclosed by '"' --> PostScript code(!)
+ * '<' or '<<' followed by *.enc, *.pfb, or *.pfa
+ */
+static int
+is_pdfm_mapline (const char *mline) /* NULL terminated. */
+{
+ int r = 1;
+ char *q, *p, *endptr;
+
+ p = (char *) mline;
+ endptr = p + strlen(mline);
+
+ skip_blank(&p, endptr);
+ /* Break if '-' preceeded by blanks is found. */
+ while (r && p < endptr && *p != '-') {
+ switch (p[0]) {
+ case '"':
+ q = parse_c_string(&p, endptr); /* wrong */
+ if (q) {
+ if (strstr(q, "SlantFont") ||
+ strstr(q, "ExtendFont") ||
+ strstr(q, "ReEncodeFont")) {
+ r = 0;
+ }
+ RELEASE(q);
+ }
+ break;
+ case '<':
+ r = 0;
+ break;
+ }
+ for ( ; p < endptr && !ISBLANK(*p); p++);
+ skip_blank(&p, endptr);
+ }
+
+ return r;
+}
+
+static void
+delete_records (FILE *fp, long num_lines)
+{
+ char *q, *p;
+
+ while (num_lines-- > 0 &&
+ (p = readline(work_buffer, WORK_BUFFER_SIZE, fp)) != NULL) {
+ skip_blank(&p, p + strlen(p));
+ if (*p == 0)
+ continue;
+ q = parse_string_value(&p, p + strlen(p));
+ if (q) {
+ WARN("Deleting fontmap record for \"%s\"", q);
+ pdf_remove_fontmap_record(q);
+ RELEASE(q);
+ }
+ }
+ return;
+}
+
+int
+pdf_load_fontmap_file (const char *filename, int mode)
+{
+ fontmap_rec *mrec;
+ FILE *fp;
+ char *p = NULL, *endptr;
+ long llen, lpos = 0;
+ int error = 0;
+
+ ASSERT(filename);
+ ASSERT(fontmap) ;
+
+ if (verbose)
+ MESG("<FONTMAP:%s", filename);
+
+ fp = DPXFOPEN(filename, DPX_RES_TYPE_FONTMAP);
+ if (!fp) {
+ WARN("Couldn't open font map file \"%s\".", filename);
+ return -1;
+ }
+
+ while (!error &&
+ (p = readline(work_buffer, WORK_BUFFER_SIZE, fp)) != NULL) {
+
+ lpos++;
+ llen = strlen(work_buffer);
+ endptr = p + llen;
+
+ skip_blank(&p, endptr);
+ if (p == endptr)
+ continue;
+
+ if (!is_pdfm_mapline(p)) {
+ WARN("This .map file looks like a dvips format fotmap file.");
+ WARN("-- Current input buffer is: %s", p);
+ WARN("-- Reading fontmap file stopped at: file=\"%s\", line=%d.",
+ filename, lpos);
+ rewind(fp);
+ delete_records(fp, lpos - 1);
+ break;
+ }
+
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ error = pdf_read_fontmap_line(mrec, p, llen);
+ if (error) {
+ WARN("Invalid map record in fontmap file.");
+ WARN("-- Current input buffer is: %s", p);
+ WARN("-- Reading fontmap file stopped at: file=\"%s\", line=%d.",
+ filename, lpos);
+ rewind(fp);
+ delete_records(fp, lpos - 1);
+ } else {
+ switch (mode) {
+ case FONTMAP_RMODE_REPLACE:
+ pdf_insert_fontmap_record(mrec->map_name, mrec);
+ break;
+ case FONTMAP_RMODE_APPEND:
+ pdf_append_fontmap_record(mrec->map_name, mrec);
+ break;
+ case FONTMAP_RMODE_REMOVE:
+ pdf_remove_fontmap_record(mrec->map_name);
+ break;
+ }
+ }
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+ }
+ DPXFCLOSE(fp);
+
+ if (verbose)
+ MESG(">");
+
+ return error;
+}
+
+#ifdef XETEX
+
+static int
+pdf_insert_native_fontmap_record (const char *name, const char *path, int index, FT_Face face, int layout_dir)
+{
+ char *fontmap_key;
+ fontmap_rec *mrec;
+
+ ASSERT(name);
+ ASSERT(path || face);
+
+ fontmap_key = malloc(strlen(name) + 3);
+ sprintf(fontmap_key, "%s/%c", name, layout_dir == 0 ? 'H' : 'V');
+
+ if (verbose)
+ MESG("<NATIVE-FONTMAP:%s", fontmap_key);
+
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+
+ mrec->map_name = mstrdup(fontmap_key);
+ mrec->enc_name = mstrdup(layout_dir == 0 ? "Identity-H" : "Identity-V");
+ mrec->font_name = (path != NULL) ? mstrdup(path) : NULL;
+ mrec->opt.index = index;
+ mrec->opt.ft_face = face;
+ mrec->opt.glyph_widths = NULL;
+ if (layout_dir != 0)
+ mrec->opt.flags |= FONTMAP_OPT_VERT;
+
+ fill_in_defaults(mrec, fontmap_key);
+ pdf_insert_fontmap_record(mrec->map_name, mrec);
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+
+ if (verbose)
+ MESG(">");
+
+ return 0;
+}
+
+static FT_Library ftLib;
+
+static int
+pdf_load_native_font_from_path(const char *ps_name, int layout_dir)
+{
+ const char *p;
+ char *filename = NEW(strlen(ps_name), char);
+ char *q = filename;
+ int index = 0;
+ FT_Face face = NULL;
+ int error = -1;
+
+#ifdef WIN32
+ for (p = ps_name + 1; *p && *p != ']'; ++p) {
+ if (*p == ':') {
+ if (p == ps_name+2 && isalpha(*(p-1)) && (*(p+1) == '/' || *(p+1) == '\\'))
+ *q++ = *p;
+ else
+ break;
+ }
+ else
+ *q++ = *p;
+ }
+#else
+ for (p = ps_name + 1; *p && *p != ':' && *p != ']'; ++p)
+ *q++ = *p;
+#endif
+ *q = 0;
+ if (*p == ':') {
+ ++p;
+ while (*p && *p != ']')
+ index = index * 10 + *p++ - '0';
+ }
+
+ if ( (q = dpx_find_opentype_file(filename)) != NULL
+ || (q = dpx_find_truetype_file(filename)) != NULL
+ || (q = dpx_find_type1_file(filename)) != NULL) {
+ error = FT_New_Face(ftLib, q, index, &face);
+ RELEASE(q);
+ }
+
+ if (error == 0)
+ return pdf_insert_native_fontmap_record(ps_name, filename, index, face, layout_dir);
+ else
+ return error;
+}
+
+int
+pdf_load_native_font (const char *ps_name,
+ const char *fam_name, const char *sty_name,
+ int layout_dir)
+{
+ static int sInitialized = 0;
+ int error = -1;
+
+#ifdef XETEX_MAC
+
+ if (!sInitialized) {
+ if (FT_Init_FreeType(&ftLib) != 0) {
+ WARN("FreeType initialization failed.");
+ return error;
+ }
+ sInitialized = 1;
+ }
+
+ if (ps_name[0] == '[') {
+ error = pdf_load_native_font_from_path(ps_name, layout_dir);
+ }
+ else {
+ ATSFontRef fontRef;
+ CFStringRef theName = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault,
+ ps_name, kCFStringEncodingASCII, kCFAllocatorNull);
+ fontRef = ATSFontFindFromPostScriptName(theName, kATSOptionFlagsDefault);
+ CFRelease(theName);
+ if (fontRef != 0) {
+ CFStringRef atsName = NULL;
+ OSStatus status = ATSFontGetName(fontRef, kATSOptionFlagsDefault, &atsName);
+ if (status == noErr) {
+ FSSpec pathSpec;
+ FT_Long index;
+ int bufferSize = CFStringGetLength(atsName) * 4 + 1;
+ char* fontName = NEW(bufferSize, char);
+ if (CFStringGetCString(atsName, fontName, bufferSize, kCFStringEncodingUTF8)) {
+ FT_Error ftErr = FT_GetFile_From_Mac_ATS_Name(fontName, &pathSpec, &index);
+ if (ftErr == 0) {
+ FT_Face face;
+ ftErr = FT_New_Face_From_FSSpec(ftLib, &pathSpec, index, &face);
+ if (ftErr == 0) {
+ error = pdf_insert_native_fontmap_record(ps_name, NULL, 0, face, layout_dir);
+ }
+ }
+ }
+ RELEASE(fontName);
+ }
+ CFRelease(atsName);
+ }
+ }
+
+#else
+
+ int i;
+
+ FcObjectSet *os;
+ FcPattern *pat;
+ FcFontSet *matches;
+
+ if (!sInitialized) {
+ if (FcInit() == FcFalse) {
+ WARN("Fontconfig initialization failed.");
+ return error;
+ }
+ if (FT_Init_FreeType(&ftLib) != 0) {
+ WARN("FreeType initialization failed.");
+ return error;
+ }
+ sInitialized = 1;
+ }
+
+ if (ps_name[0] == '[') {
+ error = pdf_load_native_font_from_path(ps_name, layout_dir);
+ }
+ else {
+ os = FcObjectSetBuild(FC_FILE, FC_INDEX, FC_FAMILY, FC_STYLE, NULL);
+ pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, fam_name,
+ FC_STYLE, FcTypeString, sty_name,
+ FC_OUTLINE, FcTypeBool, FcTrue, NULL);
+ matches = FcFontList(FcConfigGetCurrent(), pat, os);
+ FcObjectSetDestroy(os);
+ FcPatternDestroy(pat);
+
+ for (i = 0; i < matches->nfont; i++) {
+ FcChar8 *path;
+ char *name;
+ int index;
+ FT_Face face;
+ if (FcPatternGetString(matches->fonts[i],
+ FC_FILE, 0, &path) == FcResultMatch &&
+ FcPatternGetInteger(matches->fonts[i],
+ FC_INDEX, 0, &index) == FcResultMatch) {
+ FT_New_Face(ftLib, (char*)path, index, &face);
+ name = (char *)FT_Get_Postscript_Name(face);
+ if (!strcmp(name, ps_name)) {
+ error = pdf_insert_native_fontmap_record(ps_name, (char*)path, index, face, layout_dir);
+ /* don't dispose of the FT_Face, as we'll be using it to retrieve font data */
+ break;
+ }
+ FT_Done_Face(face);
+ }
+ }
+ }
+
+#endif
+
+ return error;
+}
+#endif
+
+#if 0
+/* tfm_name="dmjhira10", map_name="dmj@DNP@10", sfd_name="DNP"
+ * --> sub_id="hira"
+ * Test if tfm_name can be really considered as subfont.
+ */
+static int
+test_subfont (const char *tfm_name, const char *map_name, const char *sfd_name)
+{
+ int r = 0;
+ char **ids;
+ int n, m;
+ char *p = (char *) map_name;
+ char *q = (char *) tfm_name;
+
+ ASSERT( tfm_name && map_name && sfd_name );
+
+ /* until first occurence of '@' */
+ for ( ; *p && *q && *p == *q && *p != '@'; p++, q++);
+ if (*p != '@')
+ return 0;
+ p++;
+ /* compare sfd_name (should be always true here) */
+ if (strlen(p) <= strlen(sfd_name) ||
+ memcmp(p, sfd_name, strlen(sfd_name)) ||
+ p[strlen(sfd_name)] != '@')
+ return 0;
+ /* check tfm_name follows second '@' */
+ p += strlen(sfd_name) + 1;
+ if (*p) {
+ char *r = (char *) tfm_name;
+ r += strlen(tfm_name) - strlen(p);
+ if (strcmp(r, p))
+ return 0;
+ }
+ /* Now 'p' is located at next to SFD name terminator
+ * (second '@') in map_name and 'q' is at first char
+ * of subfont_id substring in tfm_name.
+ */
+ n = strlen(q) - strlen(p); /* length of subfont_id string */
+ if (n <= 0)
+ return 0;
+ /* check if n-length substring 'q' is valid as subfont ID */
+ ids = sfd_get_subfont_ids(sfd_name, &m);
+ if (!ids)
+ return 0;
+ while (!r && m-- > 0) {
+ if (strlen(ids[m]) == n &&
+ !memcmp(q, ids[m], n)) {
+ r = 1;
+ }
+ }
+
+ return r;
+}
+#endif /* 0 */
+
+
+fontmap_rec *
+pdf_lookup_fontmap_record (const char *tfm_name)
+{
+ fontmap_rec *mrec = NULL;
+
+ if (fontmap && tfm_name)
+ mrec = ht_lookup_table(fontmap, tfm_name, strlen(tfm_name));
+
+ return mrec;
+}
+
+
+void
+pdf_init_fontmaps (void)
+{
+ fontmap = NEW(1, struct ht_table);
+ ht_init_table(fontmap);
+}
+
+void
+pdf_close_fontmaps (void)
+{
+ if (fontmap) {
+ ht_clear_table(fontmap, hval_free);
+ RELEASE(fontmap);
+ }
+ fontmap = NULL;
+}
+
+void
+pdf_clear_fontmaps (void)
+{
+ pdf_close_fontmaps();
+ pdf_init_fontmaps();
+}
+
+/* CIDFont options
+ *
+ * FORMAT:
+ *
+ * (:int:)?!?string(/string)?(,string)?
+ */
+
+static char *
+substr (char **str, char stop)
+{
+ char *sstr, *endptr;
+
+ endptr = strchr(*str, stop);
+ if (!endptr || endptr == *str)
+ return NULL;
+ sstr = NEW(endptr-(*str)+1, char);
+ memcpy(sstr, *str, endptr-(*str));
+ sstr[endptr-(*str)] = '\0';
+
+ *str = endptr+1;
+ return sstr;
+}
+
+#include <ctype.h>
+#define CID_MAPREC_CSI_DELIM '/'
+
+static char *
+strip_options (const char *map_name, fontmap_opt *opt)
+{
+ char *font_name;
+ char *p, *next = NULL;
+ int have_csi = 0, have_style = 0;
+
+ ASSERT(opt);
+
+ p = (char *) map_name;
+ font_name = NULL;
+ opt->charcoll = NULL;
+ opt->index = 0;
+ opt->style = FONTMAP_STYLE_NONE;
+ opt->flags = 0;
+
+ if (*p == ':' && isdigit(*(p+1))) {
+ opt->index = (int) strtoul(p+1, &next, 10);
+ if (*next == ':')
+ p = next + 1;
+ else {
+ opt->index = 0;
+ }
+ }
+ if (*p == '!') { /* no-embedding */
+ if (*(++p) == '\0')
+ ERROR("Invalid map record: %s (--> %s)", map_name, p);
+ opt->flags |= FONTMAP_OPT_NOEMBED;
+ }
+
+ if ((next = strchr(p, CID_MAPREC_CSI_DELIM)) != NULL) {
+ if (next == p)
+ ERROR("Invalid map record: %s (--> %s)", map_name, p);
+ font_name = substr(&p, CID_MAPREC_CSI_DELIM);
+ have_csi = 1;
+ } else if ((next = strchr(p, ',')) != NULL) {
+ if (next == p)
+ ERROR("Invalid map record: %s (--> %s)", map_name, p);
+ font_name = substr(&p, ',');
+ have_style = 1;
+ } else {
+ font_name = NEW(strlen(p)+1, char);
+ strcpy(font_name, p);
+ }
+
+ if (have_csi) {
+ if ((next = strchr(p, ',')) != NULL) {
+ opt->charcoll = substr(&p, ',');
+ have_style = 1;
+ } else if (p[0] == '\0') {
+ ERROR("Invalid map record: %s.", map_name);
+ } else {
+ opt->charcoll = NEW(strlen(p)+1, char);
+ strcpy(opt->charcoll, p);
+ }
+ }
+
+ if (have_style) {
+ if (!strncmp(p, "BoldItalic", 10)) {
+ if (*(p+10))
+ ERROR("Invalid map record: %s (--> %s)", map_name, p);
+ opt->style = FONTMAP_STYLE_BOLDITALIC;
+ } else if (!strncmp(p, "Bold", 4)) {
+ if (*(p+4))
+ ERROR("Invalid map record: %s (--> %s)", map_name, p);
+ opt->style = FONTMAP_STYLE_BOLD;
+ } else if (!strncmp(p, "Italic", 6)) {
+ if (*(p+6))
+ ERROR("Invalid map record: %s (--> %s)", map_name, p);
+ opt->style = FONTMAP_STYLE_ITALIC;
+ }
+ }
+
+ return font_name;
+}
+
+#if DPXTEST
+static void
+dump_fontmap_rec (const char *key, const fontmap_rec *mrec)
+{
+ fontmap_opt *opt = (fontmap_opt *) &mrec->opt;
+
+ if (mrec->map_name)
+ fprintf(stdout, " <!-- subfont");
+ else
+ fprintf(stdout, " <insert");
+ fprintf(stdout, " id=\"%s\"", key);
+ if (mrec->map_name)
+ fprintf(stdout, " map-name=\"%s\"", mrec->map_name);
+ if (mrec->enc_name)
+ fprintf(stdout, " enc-name=\"%s\"", mrec->enc_name);
+ if (mrec->font_name)
+ fprintf(stdout, " font-name=\"%s\"", mrec->font_name);
+ if (mrec->charmap.sfd_name && mrec->charmap.subfont_id) {
+ fprintf(stdout, " charmap=\"sfd:%s,%s\"",
+ mrec->charmap.sfd_name, mrec->charmap.subfont_id);
+ }
+ if (opt->slant != 0.0)
+ fprintf(stdout, " font-slant=\"%g\"", opt->slant);
+ if (opt->extend != 1.0)
+ fprintf(stdout, " font-extend=\"%g\"", opt->extend);
+ if (opt->charcoll)
+ fprintf(stdout, " glyph-order=\"%s\"", opt->charcoll);
+ if (opt->tounicode)
+ fprintf(stdout, " tounicode=\"%s\"", opt->tounicode);
+ if (opt->index != 0)
+ fprintf(stdout, " ttc-index=\"%d\"", opt->index);
+ if (opt->flags & FONTMAP_OPT_REMAP)
+ fprintf(stdout, " remap=\"true\"");
+ if (opt->flags & FONTMAP_OPT_NOEMBED)
+ fprintf(stdout, " embedding=\"no\"");
+ if (opt->mapc >= 0) {
+ fprintf(stdout, " charmap=\"pad:");
+ if (opt->mapc > 0xffff)
+ fprintf(stdout, "%02x %02x", (opt->mapc >> 16) & 0xff, (opt->mapc >> 8) & 0xff);
+ else
+ fprintf(stdout, "%02x", (opt->mapc >> 8) & 0xff);
+ fprintf(stdout, "\"");
+ }
+ if (opt->flags & FONTMAP_OPT_VERT)
+ fprintf(stdout, " writing-mode=\"vertical\"");
+ if (opt->style != FONTMAP_STYLE_NONE) {
+ fprintf(stdout, " font-style=\"");
+ switch (opt->style) {
+ case FONTMAP_STYLE_BOLD:
+ fprintf(stdout, "bold");
+ break;
+ case FONTMAP_STYLE_ITALIC:
+ fprintf(stdout, "italic");
+ break;
+ case FONTMAP_STYLE_BOLDITALIC:
+ fprintf(stdout, "bolditalic");
+ break;
+ }
+ fprintf(stdout, "\"");
+ }
+ if (mrec->map_name)
+ fprintf(stdout, " / -->\n");
+ else
+ fprintf(stdout, " />\n");
+}
+
+void
+dump_fontmaps (void)
+{
+ struct ht_iter iter;
+ fontmap_rec *mrec;
+ char key[128], *kp;
+ int kl;
+
+ if (!fontmap)
+ return;
+
+ fprintf(stdout, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+ fprintf(stdout, "<!DOCTYPE fontmap SYSTEM \"fontmap.dtd\">\n");
+ fprintf(stdout, "<fontmap id=\"%s\">\n", "foo");
+ if (ht_set_iter(fontmap, &iter) == 0) {
+ do {
+ kp = ht_iter_getkey(&iter, &kl);
+ mrec = ht_iter_getval(&iter);
+ if (kl > 127)
+ continue;
+ memcpy(key, kp, kl); key[kl] = 0;
+ dump_fontmap_rec(key, mrec);
+ } while (!ht_iter_next(&iter));
+ }
+ ht_clear_iter(&iter);
+ fprintf(stdout, "</fontmap>\n");
+
+ return;
+}
+
+void
+test_fontmap_help (void)
+{
+ fprintf(stdout, "usage: fontmap [options] [mapfile...]\n");
+ fprintf(stdout, "-l, --lookup string\n");
+ fprintf(stdout, " Lookup fontmap entry for 'string' after loading mapfile(s).\n");
+}
+
+int
+test_fontmap_main (int argc, char *argv[])
+{
+ int i;
+ char *key = NULL;
+
+ for (;;) {
+ int c, optidx = 0;
+ static struct option long_options[] = {
+ {"lookup", 1, 0, 'l'},
+ {"help", 0, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+ c = getopt_long(argc, argv, "l:h", long_options, &optidx);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'l':
+ key = optarg;
+ break;
+ case 'h':
+ test_fontmap_help();
+ return 0;
+ break;
+ default:
+ test_fontmap_help();
+ return -1;
+ break;
+ }
+ }
+
+ pdf_init_fontmaps();
+ for (i = optind; i < argc; i++)
+ pdf_load_fontmap_file(argv[i], FONTMAP_RMODE_REPLACE);
+
+ if (key == NULL)
+ dump_fontmaps();
+ else {
+ fontmap_rec *mrec;
+ mrec = pdf_lookup_fontmap_record(key);
+ if (mrec)
+ dump_fontmap_rec(key, mrec);
+ else {
+ WARN("Fontmap entry \"%s\" not found.", key);
+ }
+ }
+ pdf_close_fontmaps();
+
+ return 0;
+}
+#endif /* DPXTEST */
diff --git a/Build/source/texk/xdvipdfmx/src/fontmap.h b/Build/source/texk/xdvipdfmx/src/fontmap.h
new file mode 100644
index 00000000000..4069cf69e52
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/fontmap.h
@@ -0,0 +1,107 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/fontmap.h,v 1.19 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _FONTMAP_H_
+#define _FONTMAP_H_
+
+#define FONTMAP_RMODE_REPLACE 0
+#define FONTMAP_RMODE_APPEND '+'
+#define FONTMAP_RMODE_REMOVE '-'
+
+#define FONTMAP_OPT_REMAP (1 << 0)
+#define FONTMAP_OPT_NOEMBED (1 << 1)
+#define FONTMAP_OPT_VERT (1 << 2)
+
+#define FONTMAP_STYLE_NONE 0
+#define FONTMAP_STYLE_BOLD 1
+#define FONTMAP_STYLE_ITALIC 2
+#define FONTMAP_STYLE_BOLDITALIC 3
+
+#ifdef XETEX
+#include "ft2build.h"
+#include FT_FREETYPE_H
+#endif
+
+/* Options */
+typedef struct fontmap_opt {
+ /* Synthetic font */
+ double slant, extend, bold;
+ /* comaptibility and other flags */
+ long mapc, flags;
+
+ char *otl_tags; /* currently unused */
+ char *tounicode; /* not implemented yet */
+
+ double design_size; /* unused */
+
+ char *charcoll; /* Adobe-Japan1-4, etc. */
+ int index; /* TTC index */
+ int style; /* ,Bold, etc. */
+#ifdef XETEX
+ FT_Face ft_face;
+ unsigned short *glyph_widths;
+#endif
+} fontmap_opt;
+
+typedef struct fontmap_rec {
+ char *map_name;
+
+ char *font_name;
+ char *enc_name;
+
+ /* Subfont mapping: translate 8-bit charcode to 16-bit charcode
+ * via SFD.
+ */
+ struct {
+ char *sfd_name;
+ char *subfont_id;
+ } charmap;
+
+ fontmap_opt opt;
+} fontmap_rec;
+
+extern void pdf_fontmap_set_verbose (void);
+
+extern void pdf_init_fontmaps (void);
+extern void pdf_clear_fontmaps (void);
+extern void pdf_close_fontmaps (void);
+
+extern void pdf_init_fontmap_record (fontmap_rec *mrec);
+extern void pdf_clear_fontmap_record (fontmap_rec *mrec);
+
+extern int pdf_load_fontmap_file (const char *filename, int mode);
+extern int pdf_read_fontmap_line (fontmap_rec *mrec,
+ const char *mline, long mline_strlen);
+
+extern int pdf_append_fontmap_record (const char *kp, const fontmap_rec *mrec);
+extern int pdf_remove_fontmap_record (const char *kp);
+extern int pdf_insert_fontmap_record (const char *kp, const fontmap_rec *mrec);
+extern fontmap_rec *pdf_lookup_fontmap_record (const char *kp);
+#ifdef XETEX
+extern int pdf_load_native_font (const char *ps_name,
+ const char *fam_name, const char *sty_name,
+ int layout_dir);
+#endif
+
+#endif /* _FONTMAP_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/jpegimage.c b/Build/source/texk/xdvipdfmx/src/jpegimage.c
new file mode 100644
index 00000000000..a5f1986815c
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/jpegimage.c
@@ -0,0 +1,749 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/jpegimage.c,v 1.8 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * JPEG SUPPORT
+ *
+ * Accroding to Libjpeg document:
+ *
+ * CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK
+ * JPEG files: 0 represents 100% ink coverage, rather than 0% ink as you'd
+ * expect....
+ *
+ * To wrok with this problem, we must detect whether CMYK JPEG file is
+ * created by Photoshop. But there are no reliable way to determine this.
+ *
+ * According to Adobe Technical Note #5516,
+ * "Supporting the DCT Filters in PostScript Level 2", Section 18, p.27.
+ *
+ * DCTDecode ignores and skips any APPE marker segment does not begin with
+ * the `Adobe' 5-character string.
+ *
+ * PDF Reference Manual 4th ed., p.61-62.
+ *
+ * The JPEG filter implementation in Adobe Acrobat products does not
+ * support features of the JPEG standard that are irrelevant to images.
+ * In addition, certain choices have been made regarding reserved marker
+ * codes and other optional features of the standard. For details, see
+ * Adobe Technical Note #5116, Supporting the DCT Filters in PostScript
+ * Level 2.
+ */
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "mfileio.h"
+#include "numbers.h"
+
+#include "pdfobj.h"
+
+#include "jpegimage.h"
+#include "pdfcolor.h"
+
+#include "pdfximage.h"
+
+#define JPEG_DEBUG_STR "JPEG"
+#define JPEG_DEBUG 3
+
+#ifdef HAVE_LIBJPEG
+#include <jpeglib.h>
+#endif /* HAVE_LIBJPEG */
+
+/* JPEG Markers */
+typedef enum {
+ JM_SOF0 = 0xc0,
+ JM_SOF1 = 0xc1,
+ JM_SOF2 = 0xc2,
+ JM_SOF3 = 0xc3,
+ JM_SOF5 = 0xc5,
+ JM_DHT = 0xc4,
+ JM_SOF6 = 0xc6,
+ JM_SOF7 = 0xc7,
+ JM_SOF9 = 0xc9,
+ JM_SOF10 = 0xca,
+ JM_SOF11 = 0xcb,
+ JM_DAC = 0xcc,
+ JM_SOF13 = 0xcd,
+ JM_SOF14 = 0xce,
+ JM_SOF15 = 0xcf,
+
+ JM_RST0 = 0xd0,
+ JM_RST1 = 0xd1,
+ JM_RST2 = 0xd2,
+ JM_RST3 = 0xd3,
+ JM_RST4 = 0xd4,
+ JM_RST5 = 0xd5,
+ JM_RST6 = 0xd6,
+ JM_RST7 = 0xd7,
+
+ JM_SOI = 0xd8,
+ JM_EOI = 0xd9,
+ JM_SOS = 0xda,
+ JM_DQT = 0xdb,
+ JM_DNL = 0xdc,
+ JM_DRI = 0xdd,
+ JM_DHP = 0xde,
+ JM_EXP = 0xdf,
+
+ JM_APP0 = 0xe0,
+ JM_APP2 = 0xe2,
+ JM_APP14 = 0xee,
+ JM_APP15 = 0xef,
+
+ JM_COM = 0xfe
+} JPEG_marker;
+
+typedef enum {
+ JS_APPn_JFIF,
+ JS_APPn_ADOBE,
+ JS_APPn_ICC
+} JPEG_APPn_sig;
+
+struct JPEG_APPn_JFIF /* APP0 */
+{
+ unsigned short version;
+ unsigned char units; /* 0: only aspect ratio
+ * 1: dots per inch
+ * 2: dots per cm
+ */
+ unsigned short Xdensity;
+ unsigned short Ydensity;
+ unsigned char Xthumbnail;
+ unsigned char Ythumbnail;
+ unsigned char *thumbnail; /* Thumbnail data. */
+};
+
+struct JPEG_APPn_ICC /* APP2 */
+{
+ unsigned char seq_id;
+ unsigned char num_chunks;
+ unsigned char *chunk;
+
+ /* Length of ICC profile data in this chunk. */
+ unsigned short length;
+};
+
+struct JPEG_APPn_Adobe /* APP14 */
+{
+ unsigned short version;
+ unsigned short flag0;
+ unsigned short flag1;
+ unsigned char transform; /* color transform code */
+};
+
+struct JPEG_ext
+{
+ JPEG_marker marker;
+ JPEG_APPn_sig app_sig;
+ void *app_data;
+};
+
+#define MAX_COUNT 1024
+struct JPEG_info
+{
+ unsigned short height;
+ unsigned short width;
+
+ unsigned char bits_per_component;
+ unsigned char num_components;
+
+ double xdpi;
+ double ydpi;
+
+ /* Application specific extensions */
+ int flags;
+ int num_appn, max_appn;
+ struct JPEG_ext *appn;
+
+ /* Skip chunks not necessary. */
+ char skipbits[MAX_COUNT / 8 + 1];
+};
+
+#define HAVE_APPn_JFIF (1 << 0)
+#define HAVE_APPn_ADOBE (1 << 1)
+#define HAVE_APPn_ICC (1 << 2)
+
+static int JPEG_scan_file (struct JPEG_info *j_info, FILE *fp);
+static int JPEG_copy_stream (struct JPEG_info *j_info,
+ pdf_obj *stream, FILE *fp, int flags); /* flags unused yet */
+
+static void JPEG_info_init (struct JPEG_info *j_info);
+static void JPEG_info_clear (struct JPEG_info *j_info);
+static pdf_obj *JPEG_get_iccp (struct JPEG_info *j_info);
+
+int
+check_for_jpeg (FILE *fp)
+{
+ unsigned char jpeg_sig[2];
+
+ rewind(fp);
+ if (fread(jpeg_sig, sizeof(unsigned char), 2, fp) != 2)
+ return 0;
+ else if (jpeg_sig[0] != 0xff || jpeg_sig[1] != JM_SOI)
+ return 0;
+
+ return 1;
+}
+
+int
+jpeg_include_image (pdf_ximage *ximage, FILE *fp)
+{
+ pdf_obj *stream;
+ pdf_obj *stream_dict;
+ pdf_obj *colorspace;
+ int colortype;
+ ximage_info info;
+ struct JPEG_info j_info;
+
+ if (!check_for_jpeg(fp)) {
+ WARN("%s: Not a JPEG file?", JPEG_DEBUG_STR);
+ rewind(fp);
+ return -1;
+ }
+ /* File position is 2 here... */
+
+ pdf_ximage_init_image_info(&info);
+
+ JPEG_info_init(&j_info);
+
+ if (JPEG_scan_file(&j_info, fp) < 0) {
+ WARN("%s: Not a JPEG file?", JPEG_DEBUG_STR);
+ JPEG_info_clear(&j_info);
+ return -1;
+ }
+
+ switch (j_info.num_components) {
+ case 1:
+ colortype = PDF_COLORSPACE_TYPE_GRAY;
+ break;
+ case 3:
+ colortype = PDF_COLORSPACE_TYPE_RGB;
+ break;
+ case 4:
+ colortype = PDF_COLORSPACE_TYPE_CMYK;
+ break;
+ default:
+ WARN("%s: Unknown color space (num components: %d)",
+ JPEG_DEBUG_STR, info.num_components);
+ JPEG_info_clear(&j_info);
+ return -1;
+ }
+
+ /* JPEG image use DCTDecode. */
+ stream = pdf_new_stream (0);
+ stream_dict = pdf_stream_dict(stream);
+ pdf_add_dict(stream_dict,
+ pdf_new_name("Filter"), pdf_new_name("DCTDecode"));
+
+ colorspace = NULL;
+ if (j_info.flags & HAVE_APPn_ICC) {
+ pdf_obj *icc_stream, *intent;
+
+ icc_stream = JPEG_get_iccp(&j_info);
+
+ if (!icc_stream)
+ colorspace = NULL;
+ else {
+ int cspc_id;
+
+ if (iccp_check_colorspace(colortype,
+ pdf_stream_dataptr(icc_stream),
+ pdf_stream_length (icc_stream)) < 0)
+ colorspace = NULL;
+ else {
+ cspc_id = iccp_load_profile(NULL, /* noname */
+ pdf_stream_dataptr(icc_stream),
+ pdf_stream_length (icc_stream));
+ if (cspc_id < 0)
+ colorspace = NULL;
+ else {
+ colorspace = pdf_get_colorspace_reference(cspc_id);
+ intent = iccp_get_rendering_intent(pdf_stream_dataptr(icc_stream),
+ pdf_stream_length (icc_stream));
+ if (intent)
+ pdf_add_dict(stream_dict, pdf_new_name("Intent"), intent);
+ }
+ }
+ pdf_release_obj(icc_stream);
+ }
+ }
+
+ /* No ICC or invalid ICC profile. */
+ if (!colorspace) {
+ switch (colortype) {
+ case PDF_COLORSPACE_TYPE_GRAY:
+ colorspace = pdf_new_name("DeviceGray");
+ break;
+ case PDF_COLORSPACE_TYPE_RGB:
+ colorspace = pdf_new_name("DeviceRGB");
+ break;
+ case PDF_COLORSPACE_TYPE_CMYK:
+ colorspace = pdf_new_name("DeviceCMYK");
+ break;
+ }
+ }
+ pdf_add_dict(stream_dict, pdf_new_name("ColorSpace"), colorspace);
+
+#define IS_ADOBE_CMYK(j) (((j).flags & HAVE_APPn_ADOBE) && (j).num_components == 4)
+
+ if (IS_ADOBE_CMYK(j_info)) {
+ pdf_obj *decode;
+ int i;
+
+ WARN("Adobe CMYK JPEG: Inverted color assumed.");
+ decode = pdf_new_array();
+ for (i = 0; i < j_info.num_components; i++) {
+ pdf_add_array(decode, pdf_new_number(1.0));
+ pdf_add_array(decode, pdf_new_number(0.0));
+ }
+ pdf_add_dict(stream_dict, pdf_new_name("Decode"), decode);
+ }
+
+ /* Copy file */
+ JPEG_copy_stream(&j_info, stream, fp, 0);
+
+ info.width = j_info.width;
+ info.height = j_info.height;
+ info.bits_per_component = j_info.bits_per_component;
+ info.num_components = j_info.num_components;
+
+ info.xdpi = j_info.xdpi;
+ info.ydpi = j_info.ydpi;
+
+ pdf_ximage_set_image(ximage, &info, stream);
+ JPEG_info_clear(&j_info);
+
+ return 0;
+}
+
+static void
+JPEG_info_init (struct JPEG_info *j_info)
+{
+ j_info->width = 0;
+ j_info->height = 0;
+ j_info->bits_per_component = 0;
+ j_info->num_components = 0;
+
+ j_info->xdpi = 0;
+ j_info->ydpi = 0;
+
+ j_info->flags = 0;
+ j_info->num_appn = 0;
+ j_info->max_appn = 0;
+ j_info->appn = NULL;
+
+ memset(j_info->skipbits, 0, MAX_COUNT / 8 + 1);
+}
+
+static void
+JPEG_release_APPn_data (JPEG_marker marker, JPEG_APPn_sig app_sig, void *app_data)
+{
+ if (marker == JM_APP0 &&
+ app_sig == JS_APPn_JFIF) {
+ struct JPEG_APPn_JFIF *data;
+
+ data = (struct JPEG_APPn_JFIF *) app_data;
+ if (data->thumbnail)
+ RELEASE(data->thumbnail);
+ data->thumbnail = NULL;
+
+ RELEASE(data);
+ } else if (marker == JM_APP2 &&
+ app_sig == JS_APPn_ICC) {
+ struct JPEG_APPn_ICC *data;
+
+ data = (struct JPEG_APPn_ICC *) app_data;
+ if (data->chunk)
+ RELEASE(data->chunk);
+ data->chunk = NULL;
+
+ RELEASE(data);
+ } else if (marker == JM_APP14 &&
+ app_sig == JS_APPn_ADOBE) {
+ struct JPEG_APPn_Adobe *data;
+
+ data = (struct JPEG_APPn_Adobe *) app_data;
+
+ RELEASE(data);
+ }
+}
+
+static void
+JPEG_info_clear (struct JPEG_info *j_info)
+{
+ if (j_info->num_appn > 0 &&
+ j_info->appn != NULL) {
+ int i;
+
+ for (i = 0; i < j_info->num_appn; i++)
+ JPEG_release_APPn_data(j_info->appn[i].marker,
+ j_info->appn[i].app_sig, j_info->appn[i].app_data);
+ RELEASE(j_info->appn);
+ }
+ j_info->appn = NULL;
+ j_info->num_appn = 0;
+ j_info->max_appn = 0;
+ j_info->flags = 0;
+}
+
+static pdf_obj *
+JPEG_get_iccp (struct JPEG_info *j_info)
+{
+ pdf_obj *icc_stream;
+ struct JPEG_APPn_ICC *icc;
+ int i, prev_id = 0, num_icc_seg = -1;
+
+ icc_stream = pdf_new_stream(STREAM_COMPRESS);
+ for (i = 0; i < j_info->num_appn; i++) {
+ if (j_info->appn[i].marker != JM_APP2 ||
+ j_info->appn[i].app_sig != JS_APPn_ICC)
+ continue;
+ icc = (struct JPEG_APPn_ICC *) j_info->appn[i].app_data;
+ if (num_icc_seg < 0 && prev_id == 0) {
+ num_icc_seg = icc->num_chunks;
+ /* ICC chunks are sorted? */
+ } else if (icc->seq_id != prev_id + 1 ||
+ num_icc_seg != icc->num_chunks ||
+ icc->seq_id > icc->num_chunks) {
+ WARN("Invalid JPEG ICC chunk: %d (p:%d, n:%d)",
+ icc->seq_id, prev_id, icc->num_chunks);
+ pdf_release_obj(icc_stream);
+ icc_stream = NULL;
+ break;
+ }
+ pdf_add_stream(icc_stream, icc->chunk, icc->length);
+ prev_id = icc->seq_id;
+ num_icc_seg = icc->num_chunks;
+ }
+
+ return icc_stream;
+}
+
+static JPEG_marker
+JPEG_get_marker (FILE *fp)
+{
+ int c;
+
+ c = fgetc(fp);
+ if (c != 255)
+ return -1;
+
+ for (;;) {
+ c = fgetc(fp);
+ if (c < 0)
+ return -1;
+ else if (c > 0 && c < 255) {
+ return c;
+ }
+ }
+
+ return -1;
+}
+
+static int
+add_APPn_marker (struct JPEG_info *j_info,
+ JPEG_marker marker, int app_sig, void *app_data)
+{
+ int n;
+
+ if (j_info->num_appn >= j_info->max_appn) {
+ j_info->max_appn += 16;
+ j_info->appn = RENEW(j_info->appn, j_info->max_appn, struct JPEG_ext);
+ }
+ n = j_info->num_appn;
+
+ j_info->appn[n].marker = marker;
+ j_info->appn[n].app_sig = app_sig;
+ j_info->appn[n].app_data = app_data;
+
+ j_info->num_appn += 1;
+
+ return n;
+}
+
+static unsigned short
+read_APP14_Adobe (struct JPEG_info *j_info, FILE *fp, unsigned short length)
+{
+ struct JPEG_APPn_Adobe *app_data;
+
+ app_data = NEW(1, struct JPEG_APPn_Adobe);
+ app_data->version = get_unsigned_pair(fp);
+ app_data->flag0 = get_unsigned_pair(fp);
+ app_data->flag1 = get_unsigned_pair(fp);
+ app_data->transform = get_unsigned_byte(fp);
+
+ add_APPn_marker(j_info, JM_APP14, JS_APPn_ADOBE, app_data);
+
+ return 7;
+}
+
+static unsigned short
+read_APP0_JFIF (struct JPEG_info *j_info, FILE *fp, unsigned short length)
+{
+ struct JPEG_APPn_JFIF *app_data;
+ unsigned short thumb_data_len;
+
+ app_data = NEW(1, struct JPEG_APPn_JFIF);
+ app_data->version = get_unsigned_pair(fp);
+ app_data->units = get_unsigned_byte(fp);
+ app_data->Xdensity = get_unsigned_pair(fp);
+ app_data->Ydensity = get_unsigned_pair(fp);
+ app_data->Xthumbnail = get_unsigned_byte(fp);
+ app_data->Ythumbnail = get_unsigned_byte(fp);
+ thumb_data_len = 3 * app_data->Xthumbnail * app_data->Ythumbnail;
+ if (thumb_data_len > 0) {
+ app_data->thumbnail = NEW(thumb_data_len, unsigned char);
+ fread(app_data->thumbnail, 1, thumb_data_len, fp);
+ } else {
+ app_data->thumbnail = NULL;
+ }
+
+ add_APPn_marker(j_info, JM_APP0, JS_APPn_JFIF, app_data);
+
+ switch (app_data->units) {
+ case 1:
+ j_info->xdpi = app_data->Xdensity;
+ j_info->ydpi = app_data->Ydensity;
+ break;
+ case 2: /* density is in pixels per cm */
+ j_info->xdpi = app_data->Xdensity * 2.54;
+ j_info->ydpi = app_data->Ydensity * 2.54;
+ break;
+ default: /* FIXME: not sure what to do with this.... */
+ j_info->xdpi = 72.0;
+ j_info->ydpi = 72.0 * app_data->Ydensity / app_data->Xdensity;
+ break;
+ }
+
+ return (9 + thumb_data_len);
+}
+
+static unsigned short
+read_APP0_JFXX (struct JPEG_info *j_info, FILE *fp, unsigned short length)
+{
+ unsigned char extension_code;
+
+ extension_code = get_unsigned_byte(fp);
+ /* Extension Code:
+ *
+ * 0x10: Thumbnail coded using JPEG
+ * 0x11: Thumbnail stored using 1 byte/pixel
+ * 0x13: Thumbnail stored using 3 bytes/pixel
+ */
+ seek_relative(fp, length-1); /* Thunbnail image */
+
+ /* Ignore */
+
+ return length;
+}
+
+static unsigned short
+read_APP2_ICC (struct JPEG_info *j_info, FILE *fp, unsigned short length)
+{
+ struct JPEG_APPn_ICC *app_data;
+
+ app_data = NEW(1, struct JPEG_APPn_ICC);
+ app_data->seq_id = get_unsigned_byte(fp); /* Starting at 1 */
+ app_data->num_chunks = get_unsigned_byte(fp);
+ app_data->length = length - 2;
+ app_data->chunk = NEW(app_data->length, unsigned char);
+ fread(app_data->chunk, 1, app_data->length, fp);
+
+ add_APPn_marker(j_info, JM_APP2, JS_APPn_ICC, app_data);
+
+ return length;
+}
+
+static int
+JPEG_copy_stream (struct JPEG_info *j_info,
+ pdf_obj *stream, FILE *fp, int flags) /* flags unused yet */
+{
+ JPEG_marker marker;
+ long length, nb_read;
+ int found_SOFn, count;
+
+ rewind(fp);
+ count = 0;
+ found_SOFn = 0;
+ while (!found_SOFn &&
+ count < MAX_COUNT &&
+ (marker = JPEG_get_marker(fp)) >= 0) {
+ if (marker == JM_SOI ||
+ (marker >= JM_RST0 && marker <= JM_RST7)) {
+ work_buffer[0] = (char) 0xff;
+ work_buffer[1] = (char) marker;
+ pdf_add_stream(stream, work_buffer, 2);
+ count++;
+ continue;
+ }
+ length = get_unsigned_pair(fp) - 2;
+ switch (marker) {
+ case JM_SOF0: case JM_SOF1: case JM_SOF2: case JM_SOF3:
+ case JM_SOF5: case JM_SOF6: case JM_SOF7: case JM_SOF9:
+ case JM_SOF10: case JM_SOF11: case JM_SOF13: case JM_SOF14:
+ case JM_SOF15:
+ work_buffer[0] = (char) 0xff;
+ work_buffer[1] = (char) marker;
+ work_buffer[2] = ((length + 2) >> 8) & 0xff;
+ work_buffer[3] = (length + 2) & 0xff;
+ pdf_add_stream(stream, work_buffer, 4);
+ while (length > 0) {
+ nb_read = fread(work_buffer, sizeof(char),
+ MIN(length, WORK_BUFFER_SIZE), fp);
+ if (nb_read > 0)
+ pdf_add_stream(stream, work_buffer, nb_read);
+ length -= nb_read;
+ }
+ found_SOFn = 1;
+ break;
+ default:
+ if (j_info->skipbits[count / 8] & (1 << (7 - (count % 8)))) {
+ /* skip */
+ while (length > 0) {
+ nb_read = fread(work_buffer, sizeof(char),
+ MIN(length, WORK_BUFFER_SIZE), fp);
+ length -= nb_read;
+ }
+ } else {
+ work_buffer[0] = (char) 0xff;
+ work_buffer[1] = (char) marker;
+ work_buffer[2] = ((length + 2) >> 8) & 0xff;
+ work_buffer[3] = (length + 2) & 0xff;
+ pdf_add_stream(stream, work_buffer, 4);
+ while (length > 0) {
+ nb_read = fread(work_buffer, sizeof(char),
+ MIN(length, WORK_BUFFER_SIZE), fp);
+ if (nb_read > 0)
+ pdf_add_stream(stream, work_buffer, nb_read);
+ length -= nb_read;
+ }
+ }
+ }
+ count++;
+ }
+
+ while ((length = fread(work_buffer,
+ sizeof(char), WORK_BUFFER_SIZE, fp)) > 0) {
+ pdf_add_stream(stream, work_buffer, length);
+ }
+
+ return (found_SOFn ? 0 : -1);
+}
+
+static int
+JPEG_scan_file (struct JPEG_info *j_info, FILE *fp)
+{
+ JPEG_marker marker;
+ unsigned short length;
+ int found_SOFn, count;
+ char app_sig[128];
+
+ rewind(fp);
+ count = 0;
+ found_SOFn = 0;
+ while (!found_SOFn &&
+ (marker = JPEG_get_marker(fp)) >= 0) {
+ if (marker == JM_SOI ||
+ (marker >= JM_RST0 && marker <= JM_RST7)) {
+ count++;
+ continue;
+ }
+ length = get_unsigned_pair(fp) - 2;
+ switch (marker) {
+ case JM_SOF0: case JM_SOF1: case JM_SOF2: case JM_SOF3:
+ case JM_SOF5: case JM_SOF6: case JM_SOF7: case JM_SOF9:
+ case JM_SOF10: case JM_SOF11: case JM_SOF13: case JM_SOF14:
+ case JM_SOF15:
+ j_info->bits_per_component = get_unsigned_byte(fp);
+ j_info->height = get_unsigned_pair(fp);
+ j_info->width = get_unsigned_pair(fp);
+ j_info->num_components = get_unsigned_byte(fp);
+ found_SOFn = 1;
+ break;
+ case JM_APP0:
+ if (length > 5) {
+ if (fread(app_sig, sizeof(char), 5, fp) != 5)
+ return -1;
+ length -= 5;
+ if (!memcmp(app_sig, "JFIF\000", 5)) {
+ j_info->flags |= HAVE_APPn_JFIF;
+ length -= read_APP0_JFIF(j_info, fp, length);
+ } else if (!memcmp(app_sig, "JFXX", 5)) {
+ length -= read_APP0_JFXX(j_info, fp, length);
+ }
+ }
+ seek_relative(fp, length);
+ break;
+ case JM_APP2:
+ if (length >= 14) {
+ if (fread(app_sig, sizeof(char), 12, fp) != 12)
+ return -1;
+ length -= 12;
+ if (!memcmp(app_sig, "ICC_PROFILE\000", 12)) {
+ j_info->flags |= HAVE_APPn_ICC;
+ length -= read_APP2_ICC(j_info, fp, length);
+ if (count < MAX_COUNT) {
+ j_info->skipbits[count / 8] |= (1 << (7 - (count % 8)));
+ }
+ }
+ }
+ seek_relative(fp, length);
+ break;
+ case JM_APP14:
+ if (length > 5) {
+ if (fread(app_sig, sizeof(char), 5, fp) != 5)
+ return -1;
+ length -= 5;
+ if (!memcmp(app_sig, "Adobe", 5)) {
+ j_info->flags |= HAVE_APPn_ADOBE;
+ length -= read_APP14_Adobe(j_info, fp, length);
+ } else {
+ if (count < MAX_COUNT) {
+ j_info->skipbits[count/8] |= (1 << (7 - (count % 8)));
+ }
+ }
+ }
+ seek_relative(fp, length);
+ break;
+ default:
+ seek_relative(fp, length);
+ if (marker >= JM_APP0 &&
+ marker <= JM_APP15) {
+ if (count < MAX_COUNT) {
+ j_info->skipbits[count / 8] |= (1 << (7 - (count % 8)));
+ }
+ }
+ break;
+ }
+ count++;
+ }
+
+ return (found_SOFn ? 0 : -1);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/jpegimage.h b/Build/source/texk/xdvipdfmx/src/jpegimage.h
new file mode 100644
index 00000000000..a47da0c0434
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/jpegimage.h
@@ -0,0 +1,36 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/jpegimage.h,v 1.2 2004/03/11 11:50:21 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _JPEGIMAGE_H_
+#define _JPEGIMAGE_H_
+
+#include "mfileio.h"
+#include "pdfximage.h"
+
+extern int check_for_jpeg (FILE *fp);
+extern int jpeg_include_image (pdf_ximage *ximage, FILE *fp);
+
+#endif /* _JPEGIMAGE_H_ */
+
+
diff --git a/Build/source/texk/xdvipdfmx/src/mem.c b/Build/source/texk/xdvipdfmx/src/mem.c
new file mode 100644
index 00000000000..382f0dd8e81
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mem.c
@@ -0,0 +1,94 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/mem.c,v 1.3 2002/10/30 02:27:11 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mem.h"
+
+#ifdef MEM_DEBUG
+FILE *debugfile = NULL;
+static long int event = 0;
+#endif /* MEM_DEBUG */
+
+#ifdef MEM_DEBUG
+void mem_debug_init(void)
+{
+ if (debugfile == NULL) {
+ debugfile = fopen ("malloc.log", "w");
+ fprintf (stderr, "*** Memory Debugging Log started ***\n");
+ }
+}
+#endif /* MEM_DEBUG */
+
+void *new (size_t size, char *function, int line)
+{
+ void *result;
+ if ((result = malloc (size)) == NULL) {
+ fprintf (stderr, "Out of memory in %s:%d\n", function, line);
+ fprintf (stderr, "Asked for %lu\n", (unsigned long) size);
+ exit (1);
+ }
+
+#ifdef MEM_DEBUG
+ mem_debug_init();
+ event += 1;
+ fprintf (debugfile, "%p %07ld [new] %s:%d\n", result, event, function, line);
+#endif /* MEM_DEBUG */
+
+ return result;
+}
+
+void *renew (void *mem, size_t size, char *function, int line)
+{
+ void *result;
+#ifdef MEM_DEBUG
+ mem_debug_init();
+ event += 1;
+ if (mem)
+ fprintf (debugfile, "%p %07ld [fre] %s:%d\n", mem,
+ event, function, line);
+#endif /* MEM_DEBUG */
+ if ((result = realloc (mem, size)) == NULL) {
+ fprintf (stderr, "Out of memory!\n");
+ exit (1);
+ }
+#ifdef MEM_DEBUG
+ if (result)
+ fprintf (debugfile, "%p %07ld [new] %s:%d\n", result, event, function, line);
+#endif /* MEM_DEBUG */
+ return result;
+}
+
+void release (void *mem, char *function, int line)
+{
+
+#ifdef MEM_DEBUG
+ mem_debug_init();
+ event += 1;
+ fprintf (debugfile, "%p %07ld [fre] %s:%d\n", mem, event, function, line);
+#endif /* MEM_DEBUG */
+
+ free (mem);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/mem.h b/Build/source/texk/xdvipdfmx/src/mem.h
new file mode 100644
index 00000000000..da690d4c588
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mem.h
@@ -0,0 +1,50 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/mem.h,v 1.3 2002/10/30 02:27:11 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _MEM_H_
+#define _MEM_H_
+
+#include <stdlib.h>
+
+extern void *new (size_t size, char *function, int line);
+extern void *renew (void *p, size_t size, char *function, int line);
+extern void release (void *mem, char *function, int line);
+
+#ifdef MEM_DEBUG
+extern void mem_debug_init(void);
+extern FILE *debugfile;
+#define NEW(n,type) (type *)(new (((size_t) (n))*sizeof(type),__FUNCTION__,__LINE__))
+#define RENEW(p,n,type) (type *)(renew ((p),(n)*sizeof(type),__FUNCTION__,__LINE__))
+#define RELEASE(p) release ((p),__FUNCTION__,__LINE__)
+#define MEM_START {mem_debug_init();fprintf (debugfile, "Entered %s\n", __FUNCTION__);}
+#define MEM_END fprintf (debugfile, "Leaving %s\n", __FUNCTION__);
+#else /* MEM_DEBUG */
+#define MEM_START
+#define MEM_END
+#define NEW(n,type) (type *)(new (((size_t) (n))*sizeof(type),NULL,0))
+#define RENEW(p,n,type) (type *)(renew ((p),(n)*sizeof(type),NULL,0))
+#define RELEASE(p) release ((p),NULL,0)
+#endif /* MEM_DEBUG */
+
+#endif /* _MEM_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/mfileio.c b/Build/source/texk/xdvipdfmx/src/mfileio.c
new file mode 100644
index 00000000000..425ab1fe474
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mfileio.c
@@ -0,0 +1,127 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/mfileio.c,v 1.3 2002/10/30 02:27:11 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "system.h"
+#include "mfileio.h"
+#include "error.h"
+
+#ifdef IODEBUG
+static FILE *iodebug_file = NULL;
+static long event = 0;
+static void io_debug_init(void)
+{
+ if (!iodebug_file) {
+ iodebug_file = fopen ("fopen.log", "wb");
+ fprintf (stderr, "\n*** File IO debugging started ***\n");
+ }
+ if (!iodebug_file) {
+ fprintf (stderr, "\nError opening io log\n");
+ }
+}
+#endif
+
+#ifdef IODEBUG
+FILE *mfopen(const char *name, const char *mode, const char *function, int line)
+{
+ FILE *tmp;
+ io_debug_init();
+ tmp = fopen (name, mode);
+ event += 1;
+ fprintf(iodebug_file, "%p %07ld [fopen] %s:%d\n", tmp, event,
+ function, line);
+ return tmp;
+}
+int mfclose(FILE *file, const char *function, int line)
+{
+ io_debug_init();
+ event += 1;
+ fprintf(iodebug_file, "%p %07ld [fclose] %s:%d\n", file, event,
+ function, line);
+ return fclose(file);
+}
+#endif
+
+static void os_error()
+{
+ ERROR ("io: An OS command failed that should not have.\n");
+}
+
+void seek_absolute (FILE *file, long pos)
+{
+ if (fseek(file, pos, SEEK_SET)) {
+ os_error();
+ }
+}
+
+void seek_relative (FILE *file, long pos)
+{
+ if (fseek(file, pos, SEEK_CUR)) {
+ os_error();
+ }
+}
+
+
+void seek_end (FILE *file)
+{
+ if (fseek(file, 0L, SEEK_END)) {
+ os_error();
+ }
+}
+
+long tell_position (FILE *file)
+{
+ long size;
+ if ((size = ftell (file)) < 0) {
+ os_error();
+ }
+ return size;
+}
+
+long file_size (FILE *file)
+{
+ long size;
+ /* Seek to end */
+ seek_end (file);
+ size = tell_position (file);
+ rewind (file);
+ return (size);
+}
+
+/* Unlike fgets, mfgets works with \r, \n, or \r\n end of lines. */
+char *mfgets (char *buffer, unsigned long length, FILE *file)
+{
+ int ch = 0, i = 0;
+ while (i < length-1 && (ch = fgetc (file)) >= 0 && ch != '\n' && ch != '\r')
+ buffer[i++] = ch;
+ buffer[i] = 0;
+ if (ch < 0 && i == 0)
+ return NULL;
+ if (ch == '\r' && (ch = fgetc (file)) >= 0 && (ch != '\n'))
+ ungetc (ch, file);
+ return buffer;
+}
+
+char work_buffer[WORK_BUFFER_SIZE];
diff --git a/Build/source/texk/xdvipdfmx/src/mfileio.h b/Build/source/texk/xdvipdfmx/src/mfileio.h
new file mode 100644
index 00000000000..e31fef23244
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mfileio.h
@@ -0,0 +1,61 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/mfileio.h,v 1.3 2002/10/30 02:27:12 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _MFILEIO_H_
+#define _MFILEIO_H_
+
+#include <stdio.h>
+#include "numbers.h"
+
+#ifdef IODEBUG
+FILE *mfopen (const char *name, const char *mode,
+ const char *function, int line);
+int mfclose (FILE *file, const char *function, int line);
+#define MFOPEN(name,mode) \
+ mfopen((name),(mode),__FUNCTION__,__LINE__)
+#define MFCLOSE(file) \
+ mfclose((file),__FUNCTION__,__LINE__)
+#else
+#define MFOPEN(name,mode) fopen((name),(mode))
+#define MFCLOSE(file) fclose(file)
+#endif
+
+extern UNSIGNED_BYTE read_byte (FILE *);
+
+extern void seek_absolute (FILE *file, long pos);
+extern void seek_relative (FILE *file, long pos);
+
+extern void seek_end (FILE *file);
+
+extern long tell_position (FILE *file);
+
+extern long file_size (FILE *file);
+
+extern char *mfgets (char *buffer, unsigned long size, FILE *file);
+
+extern char work_buffer[];
+
+#define WORK_BUFFER_SIZE 1024
+
+#endif /* _MFILEIO_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/mk_agl_standard_c.pl b/Build/source/texk/xdvipdfmx/src/mk_agl_standard_c.pl
new file mode 100755
index 00000000000..93a7b7984fd
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mk_agl_standard_c.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+
+# mk_agl_standard_nam_c.pl -- convert STANDARD.NAM and glyphlist.txt
+# to C source for xdvipdfmx;
+# this allows us to have the standard list compiled into the binary,
+# and so the user doesn't have to install a glyphlist file separately.
+
+# usage:
+#
+# mk_agl_standard_nam_c.pl STANDARD.NAM glyphlist.txt > agl_standard.c
+#
+# where STANDARD.NAM is the glyph name list in FontLab's format,
+# and glyphlist.txt is the Adobe glyph name list as found at
+# http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt
+#
+# xdvipdfmx includes data derived from STANDARD.NAM
+# by kind permission of Adam Twardoch.
+
+print << "__EOT__";
+#include "agl.h"
+
+char* agl_standard_names[] = {
+__EOT__
+
+my %knownNames;
+while (<ARGV>) {
+ s/ *[\r\n]+$//;
+ s/[\#%].*//;
+ next if $_ eq '';
+ if (m/^0x[0-9A-Fa-f]{4}/) {
+ my ($unicode, $name) = split(/ +/);
+ next unless defined $name and defined $unicode;
+ $name =~ s/^!//;
+ next if exists $knownNames{$name};
+ $knownNames{$name} = 1;
+ $unicode =~ s/^0x//;
+ print " \"$name;$unicode\",\n";
+ next;
+ }
+ if (m/^.+;[0-9A-Fa-f]{4}/) {
+ my ($name, $unicodes) = split(/;/);
+ next unless defined $name and defined $unicodes;
+ next if exists $knownNames{$name};
+ print " \"$name;$unicodes\",\n";
+ }
+}
+
+print << "__EOT__";
+ "" /* terminator */
+};
+__EOT__
diff --git a/Build/source/texk/xdvipdfmx/src/mpost.c b/Build/source/texk/xdvipdfmx/src/mpost.c
new file mode 100644
index 00000000000..16a60a54b50
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mpost.c
@@ -0,0 +1,1627 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/mpost.c,v 1.35 2005/08/30 07:56:08 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+#include "numbers.h"
+
+#include "tfm.h"
+
+#include "pdfobj.h"
+#include "pdfparse.h"
+#include "pdfdev.h"
+#include "pdfdoc.h"
+
+#include "pdfcolor.h"
+#include "pdfdraw.h"
+
+#include "fontmap.h"
+#include "subfont.h"
+
+#include "pdfximage.h"
+
+#include "mpost.h"
+
+/*
+ * In PDF, current path is not a part of graphics state parameter.
+ * Hence, current path is not saved by the "q" operator and is not
+ * recovered by the "Q" operator. This means that the following PS
+ * code
+ *
+ * <path construction> gsave <path painting> grestore ...
+ *
+ * can't be translated to PDF code
+ *
+ * <path construction> q <path painting> Q ...
+ *
+ * . Only clipping path (which is graphics state parameter in PDF
+ * too) is treated in the same way. So, we write clipping path
+ * immediately and forget about it but remember current path.
+ */
+
+static int mp_parse_body (char **start, char *end, double x_user, double y_user);
+
+static struct mp_font
+{
+ char *font_name;
+ int font_id;
+ int tfm_id; /* Used for text width calculation */
+ int subfont_id;
+ double pt_size;
+} font_stack[PDF_GSAVE_MAX] = {
+ {NULL, -1, -1, -1, 0}
+};
+static int currentfont = -1;
+
+#define CURRENT_FONT() ((currentfont < 0) ? NULL : &font_stack[currentfont])
+
+/* Compatibility */
+#define MP_CMODE_MPOST 0
+#define MP_CMODE_DVIPSK 1
+#define MP_CMODE_PTEXVERT 2
+static int mp_cmode = MP_CMODE_MPOST;
+
+static int
+mp_setfont (const char *font_name, double pt_size)
+{
+ const char *name = font_name;
+ struct mp_font *font;
+ int subfont_id = -1;
+ fontmap_rec *mrec;
+
+ font = CURRENT_FONT();
+
+ if (font) {
+ if (!strcmp(font->font_name, font_name) &&
+ font->pt_size == pt_size)
+ return 0;
+ } else { /* No currentfont */
+/* ***TODO*** Here some problem exists! */
+ font = &font_stack[0];
+ font->font_name = NULL;
+ currentfont = 0;
+ }
+
+ mrec = pdf_lookup_fontmap_record(font_name);
+ if (mrec && mrec->charmap.sfd_name && mrec->charmap.subfont_id) {
+ subfont_id = sfd_load_record(mrec->charmap.sfd_name, mrec->charmap.subfont_id);
+ }
+
+ /* See comments in dvi_locate_font() in dvi.c. */
+ if (mrec && mrec->map_name) {
+ name = mrec->map_name;
+ } else {
+ name = font_name;
+ }
+
+ if (font->font_name)
+ RELEASE(font->font_name);
+ font->font_name = NEW(strlen(font_name) + 1, char);
+ strcpy(font->font_name, font_name);
+ font->subfont_id = subfont_id;
+ font->pt_size = pt_size;
+ font->tfm_id = tfm_open(font_name, 0); /* Need not exist in MP mode */
+ font->font_id = pdf_dev_locate_font(name,
+ (spt_t) (pt_size * dev_unit_dviunit()));
+
+ if (font->font_id < 0) {
+ ERROR("MPOST: No physical font assigned for \"%s\".", font_name);
+ return 1;
+ }
+
+ return 0;
+}
+
+static void
+save_font (void)
+{
+ struct mp_font *current, *next;
+
+ if (currentfont < 0) {
+ font_stack[0].font_name = NEW(strlen("Courier") + 1, char);
+ strcpy(font_stack[0].font_name, "Courier");
+ font_stack[0].pt_size = 1;
+ font_stack[0].tfm_id = 0;
+ font_stack[0].subfont_id = 0;
+ currentfont = 0;
+ }
+
+ current = &font_stack[currentfont++];
+ next = &font_stack[currentfont ];
+ next->font_name = NEW(strlen(current->font_name)+1, char);
+ strcpy(next->font_name, current->font_name);
+ next->pt_size = current->pt_size;
+
+ next->subfont_id = current->subfont_id;
+ next->tfm_id = current->tfm_id;
+}
+
+static void
+restore_font (void)
+{
+ struct mp_font *current;
+
+ current = CURRENT_FONT();
+ if (current) {
+ if (current->font_name)
+ RELEASE(current->font_name);
+ current->font_name = NULL;
+ } else {
+ ERROR("No currentfont...");
+ }
+
+ currentfont--;
+}
+
+static void
+clear_fonts (void)
+{
+ while (currentfont >= 0) {
+ if (font_stack[currentfont].font_name)
+ RELEASE(font_stack[currentfont].font_name);
+ currentfont--;
+ }
+}
+
+static int
+is_fontname (const char *token)
+{
+ fontmap_rec *mrec;
+
+ mrec = pdf_lookup_fontmap_record(token);
+ if (mrec)
+ return 1;
+
+ return tfm_exists(token);
+}
+
+int
+mps_scan_bbox (char **pp, char *endptr, pdf_rect *bbox)
+{
+ char *number;
+ double values[4];
+ int i;
+
+ /* skip_white() skips lines starting '%'... */
+ while (*pp < endptr && isspace(**pp))
+ (*pp)++;
+
+ /* Scan for bounding box record */
+ while (*pp < endptr && **pp == '%') {
+ if (*pp + 14 < endptr &&
+ !strncmp(*pp, "%%BoundingBox:", 14)) {
+
+ *pp += 14;
+
+ for (i = 0; i < 4; i++) {
+ skip_white(pp, endptr);
+ number = parse_number(pp, endptr);
+ if (!number) {
+ break;
+ }
+ values[i] = atof(number);
+ RELEASE(number);
+ }
+ if (i < 4) {
+ return -1;
+ } else {
+ bbox->llx = values[0];
+ bbox->lly = values[1];
+ bbox->urx = values[2];
+ bbox->ury = values[3];
+
+ return 0;
+ }
+ }
+ skip_line (pp, endptr);
+ while (*pp < endptr && isspace(**pp))
+ (*pp)++;
+ }
+
+ return -1;
+}
+
+static void
+skip_prolog (char **start, char *end)
+{
+ int found_prolog = 0;
+ char *save;
+
+ save = *start;
+ while (*start < end) {
+ skip_white(start, end);
+ if (*start >= end)
+ break;
+ if (!strncmp(*start, "%%EndProlog", 11)) {
+ found_prolog = 1;
+ skip_line(start, end);
+ break;
+ } else if (!strncmp(*start, "%%Page:", 7)) {
+ skip_line(start, end);
+ break;
+ }
+ skip_line(start, end);
+ }
+ if (!found_prolog) {
+ *start = save;
+ }
+
+ return;
+}
+
+/* PostScript Operators */
+
+#define ADD 1
+#define SUB 2
+#define MUL 3
+#define DIV 4
+#define NEG 5
+#define TRUNCATE 6
+
+#define CLEAR 10
+#define EXCH 11
+#define POP 12
+
+#define NEWPATH 31
+#define CLOSEPATH 32
+#define MOVETO 33
+#define RMOVETO 34
+#define CURVETO 35
+#define RCURVETO 36
+#define LINETO 37
+#define RLINETO 38
+#define ARC 39
+#define ARCN 40
+
+#define FILL 41
+#define STROKE 42
+#define SHOW 43
+
+#define CLIP 44
+#define EOCLIP 45
+
+#define SHOWPAGE 49
+
+#define GSAVE 50
+#define GRESTORE 51
+
+#define CONCAT 52
+#define SCALE 53
+#define TRANSLATE 54
+#define ROTATE 55
+
+#define SETLINEWIDTH 60
+#define SETDASH 61
+#define SETLINECAP 62
+#define SETLINEJOIN 63
+#define SETMITERLIMIT 64
+
+#define SETGRAY 70
+#define SETRGBCOLOR 71
+#define SETCMYKCOLOR 72
+
+#define CURRENTPOINT 80
+#define IDTRANSFORM 81
+#define DTRANSFORM 82
+
+#define FINDFONT 201
+#define SCALEFONT 202
+#define SETFONT 203
+#define CURRENTFONT 204
+
+#define STRINGWIDTH 210
+
+#define FSHOW 1001
+#define STEXFIG 1002
+#define ETEXFIG 1003
+
+static struct operators
+{
+ const char *token;
+ int opcode;
+} ps_operators[] = {
+ {"add", ADD},
+ {"mul", MUL},
+ {"div", DIV},
+ {"neg", NEG},
+ {"sub", SUB},
+ {"truncate", TRUNCATE},
+
+ {"clear", CLEAR},
+ {"exch", EXCH},
+ {"pop", POP},
+
+ {"clip", CLIP},
+ {"eoclip", EOCLIP},
+ {"closepath", CLOSEPATH},
+ {"concat", CONCAT},
+
+ {"newpath", NEWPATH},
+ {"moveto", MOVETO},
+ {"rmoveto", RMOVETO},
+ {"lineto", LINETO},
+ {"rlineto", RLINETO},
+ {"curveto", CURVETO},
+ {"rcurveto", RCURVETO},
+ {"arc", ARC},
+ {"arcn", ARCN},
+
+ {"stroke", STROKE},
+ {"fill", FILL},
+ {"show", SHOW},
+ {"showpage", SHOWPAGE},
+
+ {"gsave", GSAVE},
+ {"grestore", GRESTORE},
+ {"translate", TRANSLATE},
+ {"rotate", ROTATE},
+ {"scale", SCALE},
+
+ {"setlinecap", SETLINECAP},
+ {"setlinejoin", SETLINEJOIN},
+ {"setlinewidth", SETLINEWIDTH},
+ {"setmiterlimit", SETMITERLIMIT},
+ {"setdash", SETDASH},
+
+ {"setgray", SETGRAY},
+ {"setrgbcolor", SETRGBCOLOR},
+ {"setcmykcolor", SETCMYKCOLOR},
+
+ {"currentpoint", CURRENTPOINT}, /* This is here for rotate support
+ in graphics package-not MP support */
+ {"dtransform", DTRANSFORM},
+ {"idtransform", IDTRANSFORM},
+
+ {"findfont", FINDFONT},
+ {"scalefont", SCALEFONT},
+ {"setfont", SETFONT},
+ {"currentfont", CURRENTFONT},
+
+ {"stringwidth", STRINGWIDTH}
+};
+
+static struct operators mps_operators[] = {
+ {"fshow", FSHOW},
+ {"startTexFig", STEXFIG},
+ {"endTexFig", ETEXFIG}
+};
+
+#define NUM_PS_OPERATORS (sizeof(ps_operators)/sizeof(ps_operators[0]))
+#define NUM_MPS_OPERATORS (sizeof(mps_operators)/sizeof(mps_operators[0]))
+static int
+get_opcode (const char *token)
+{
+ int i;
+
+ for (i = 0; i < NUM_PS_OPERATORS; i++) {
+ if (!strcmp(token, ps_operators[i].token)) {
+ return ps_operators[i].opcode;
+ }
+ }
+
+ for (i = 0; i < NUM_MPS_OPERATORS; i++) {
+ if (!strcmp(token, mps_operators[i].token)) {
+ return mps_operators[i].opcode;
+ }
+ }
+
+ return -1;
+}
+
+#define PS_STACK_SIZE 1024
+
+static pdf_obj *stack[PS_STACK_SIZE];
+static unsigned top_stack = 0;
+
+#define POP_STACK() ((top_stack > 0) ? stack[--top_stack] : NULL)
+#define PUSH_STACK(o,e) { \
+ if (top_stack < PS_STACK_SIZE) { \
+ stack[top_stack++] = (o); \
+ } else { \
+ WARN("PS stack overflow including MetaPost file or inline PS code"); \
+ *(e) = 1; \
+ } \
+}
+
+static int
+do_exch (void)
+{
+ pdf_obj *tmp;
+
+ if (top_stack < 2)
+ return -1;
+
+ tmp = stack[top_stack-1];
+ stack[top_stack-1] = stack[top_stack-2];
+ stack[top_stack-2] = tmp;
+
+ return 0;
+}
+
+static int
+do_clear (void)
+{
+ pdf_obj *tmp;
+
+ while (top_stack > 0) {
+ tmp = POP_STACK();
+ if (tmp)
+ pdf_release_obj(tmp);
+ }
+
+ return 0;
+}
+
+/* This should be set_bottom and clear (or
+ * have independent stack) to ensure stack
+ * depth do not go below real stack bottom.
+ */
+static void
+mps_stack_clear_to (int depth)
+{
+ pdf_obj *tmp;
+
+ while (top_stack > depth) {
+ tmp = POP_STACK();
+ if (tmp)
+ pdf_release_obj(tmp);
+ }
+
+ return;
+}
+
+static int
+pop_get_numbers (double *values, int count)
+{
+ pdf_obj *tmp;
+
+ while (count-- > 0) {
+ tmp = POP_STACK();
+ if (!tmp) {
+ WARN("mpost: Stack underflow.");
+ break;
+ } else if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ WARN("mpost: Not a number!");
+ pdf_release_obj(tmp);
+ break;
+ }
+ values[count] = pdf_number_value(tmp);
+ pdf_release_obj(tmp);
+ }
+
+ return (count + 1);
+}
+
+static int
+cvr_array (pdf_obj *array, double *values, int count)
+{
+ if (!PDF_OBJ_ARRAYTYPE(array)) {
+ WARN("mpost: Not an array!");
+ } else {
+ pdf_obj *tmp;
+
+ while (count-- > 0) {
+ tmp = pdf_get_array(array, count);
+ if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ WARN("mpost: Not a number!");
+ break;
+ }
+ values[count] = pdf_number_value(tmp);
+ }
+ }
+ if (array)
+ pdf_release_obj(array);
+
+ return (count + 1);
+}
+
+static int
+is_fontdict (pdf_obj *dict)
+{
+ pdf_obj *tmp;
+
+ if (!PDF_OBJ_DICTTYPE(dict))
+ return 0;
+
+ tmp = pdf_lookup_dict(dict, "Type");
+ if (!tmp || !PDF_OBJ_NAMETYPE(tmp) ||
+ strcmp(pdf_name_value(tmp), "Font")) {
+ return 0;
+ }
+
+ tmp = pdf_lookup_dict(dict, "FontName");
+ if (!tmp || !PDF_OBJ_NAMETYPE(tmp)) {
+ return 0;
+ }
+
+ tmp = pdf_lookup_dict(dict, "FontScale");
+ if (!tmp || !PDF_OBJ_NUMBERTYPE(tmp)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static int
+do_findfont (void)
+{
+ int error = 0;
+ pdf_obj *font_dict, *font_name;
+
+ font_name = POP_STACK();
+ if (!font_name)
+ return 1;
+ else if (PDF_OBJ_STRINGTYPE(font_name) ||
+ PDF_OBJ_NAMETYPE(font_name)) {
+ /* Do not check the existence...
+ * The reason for this is that we cannot locate PK font without
+ * font scale.
+ */
+ font_dict = pdf_new_dict();
+ pdf_add_dict(font_dict,
+ pdf_new_name("Type"), pdf_new_name("Font"));
+ if (PDF_OBJ_STRINGTYPE(font_name)) {
+ pdf_add_dict(font_dict,
+ pdf_new_name("FontName"),
+ pdf_new_name(pdf_string_value(font_name)));
+ pdf_release_obj(font_name);
+ } else {
+ pdf_add_dict(font_dict,
+ pdf_new_name("FontName"), font_name);
+ }
+ pdf_add_dict(font_dict,
+ pdf_new_name("FontScale"), pdf_new_number(1.0));
+
+ if (top_stack < PS_STACK_SIZE) {
+ stack[top_stack++] = font_dict;
+ } else {
+ WARN("PS stack overflow including MetaPost file or inline PS code");
+ pdf_release_obj(font_dict);
+ error = 1;
+ }
+ } else {
+ error = 1;
+ }
+
+ return error;
+}
+
+static int
+do_scalefont (void)
+{
+ int error = 0;
+ pdf_obj *font_dict;
+ pdf_obj *font_scale;
+ double scale;
+
+ error = pop_get_numbers(&scale, 1);
+ if (error)
+ return error;
+
+ font_dict = POP_STACK();
+ if (!font_dict)
+ error = 1;
+ else if (is_fontdict(font_dict)) {
+ font_scale = pdf_lookup_dict(font_dict, "FontScale");
+ pdf_set_number(font_scale, pdf_number_value(font_scale)*scale);
+ if (top_stack < PS_STACK_SIZE) {
+ stack[top_stack++] = font_dict;
+ } else {
+ WARN("PS stack overflow including MetaPost file or inline PS code");
+ pdf_release_obj(font_dict);
+ error = 1;
+ }
+ } else {
+ error = 1;
+ }
+
+ return error;
+}
+
+static int
+do_setfont (void)
+{
+ int error = 0;
+ char *font_name;
+ double font_scale;
+ pdf_obj *font_dict;
+
+ font_dict = POP_STACK();
+ if (!is_fontdict(font_dict))
+ error = 1;
+ else {
+ /* Subfont support prevent us from managing
+ * font in a single place...
+ */
+ font_name = pdf_name_value (pdf_lookup_dict(font_dict, "FontName"));
+ font_scale = pdf_number_value(pdf_lookup_dict(font_dict, "FontScale"));
+
+ error = mp_setfont(font_name, font_scale);
+ }
+ pdf_release_obj(font_dict);
+
+ return error;
+}
+
+/* Push dummy font dict onto PS stack */
+static int
+do_currentfont (void)
+{
+ int error = 0;
+ struct mp_font *font;
+ pdf_obj *font_dict;
+
+ font = CURRENT_FONT();
+ if (!font) {
+ WARN("Currentfont undefined...");
+ return 1;
+ } else {
+ font_dict = pdf_new_dict();
+ pdf_add_dict(font_dict,
+ pdf_new_name("Type"),
+ pdf_new_name("Font"));
+ pdf_add_dict(font_dict,
+ pdf_new_name("FontName"),
+ pdf_new_name(font->font_name));
+ pdf_add_dict(font_dict,
+ pdf_new_name("FontScale"),
+ pdf_new_number(font->pt_size));
+ if (top_stack < PS_STACK_SIZE) {
+ stack[top_stack++] = font_dict;
+ } else {
+ WARN("PS stack overflow...");
+ pdf_release_obj(font_dict);
+ error = 1;
+ }
+ }
+
+ return error;
+}
+
+static int
+do_show (void)
+{
+ struct mp_font *font;
+ pdf_coord cp;
+ pdf_obj *text_str;
+ int length;
+ unsigned char *strptr;
+ double text_width;
+
+ font = CURRENT_FONT();
+ if (!font) {
+ WARN("Currentfont not set."); /* Should not be error... */
+ return 1;
+ }
+
+ pdf_dev_currentpoint(&cp);
+
+ text_str = POP_STACK();
+ if (!PDF_OBJ_STRINGTYPE(text_str)) {
+ if (text_str)
+ pdf_release_obj(text_str);
+ return 1;
+ }
+ if (font->font_id < 0) {
+ WARN("mpost: not set."); /* Should not be error... */
+ pdf_release_obj(text_str);
+ return 1;
+ }
+
+ strptr = pdf_string_value (text_str);
+ length = pdf_string_length(text_str);
+
+ if (font->tfm_id < 0) {
+ WARN("mpost: TFM not found for \"%s\".", font->font_name);
+ WARN("mpost: Text width not calculated...");
+ }
+
+ text_width = 0.0;
+ if (font->subfont_id >= 0) {
+ unsigned short uch;
+ unsigned char *ustr;
+ int i;
+
+ ustr = NEW(length * 2, unsigned char);
+ for (i = 0; i < length; i++) {
+ uch = lookup_sfd_record(font->subfont_id, strptr[i]);
+ ustr[2*i ] = uch >> 8;
+ ustr[2*i+1] = uch & 0xff;
+ if (font->tfm_id >= 0) {
+ text_width += tfm_get_width(font->tfm_id, strptr[i]);
+ }
+ }
+ text_width *= font->pt_size;
+
+ pdf_dev_set_string((spt_t)(cp.x * dev_unit_dviunit()),
+ (spt_t)(cp.y * dev_unit_dviunit()),
+ ustr, length * 2,
+ (spt_t)(text_width*dev_unit_dviunit()),
+ font->font_id, 0);
+ RELEASE(ustr);
+ } else {
+#define FWBASE ((double) (1<<20))
+ if (font->tfm_id >= 0) {
+ text_width = (double) tfm_string_width(font->tfm_id, strptr, length)/FWBASE;
+ text_width *= font->pt_size;
+ }
+ pdf_dev_set_string((spt_t)(cp.x * dev_unit_dviunit()),
+ (spt_t)(cp.y * dev_unit_dviunit()),
+ strptr, length,
+ (spt_t)(text_width*dev_unit_dviunit()),
+ font->font_id, 0);
+ }
+
+ if (pdf_dev_get_font_wmode(font->font_id)) {
+ pdf_dev_rmoveto(0.0, -text_width);
+ } else {
+ pdf_dev_rmoveto(text_width, 0.0);
+ }
+
+ graphics_mode();
+ pdf_release_obj(text_str);
+
+ return 0;
+}
+
+static const char *ps_code_fshow = "exch findfont exch scalefont setfont show";
+/*
+ * string tfmname scale fshow -
+ *
+ * exch findfont exch scalefont setfont show
+ */
+static int
+do_mpost_fshow (int opcode, double x_user, double y_user)
+{
+ int error = 0;
+ char *start, *end;
+
+ start = (char *) ps_code_fshow;
+ end = start + strlen(start);
+
+ error = mp_parse_body(&start, end, x_user, y_user);
+
+ return error;
+}
+
+static int
+do_texfig_operator (int opcode, double x_user, double y_user)
+{
+ static transform_info fig_p;
+ static int in_tfig = 0;
+ static int xobj_id = -1;
+ static int count = 0;
+ double values[6];
+ int error = 0;
+
+ switch (opcode) {
+ case STEXFIG:
+ error = pop_get_numbers(values, 6);
+ if (!error) {
+ double dvi2pts;
+ char resname[256];
+
+ transform_info_clear(&fig_p);
+ dvi2pts = 1.0/dev_unit_dviunit();
+
+ fig_p.width = values[0] * dvi2pts;
+ fig_p.height = values[1] * dvi2pts;
+ fig_p.bbox.llx = values[2] * dvi2pts;
+ fig_p.bbox.lly = -values[3] * dvi2pts;
+ fig_p.bbox.urx = values[4] * dvi2pts;
+ fig_p.bbox.ury = -values[5] * dvi2pts;
+ fig_p.flags |= INFO_HAS_USER_BBOX;
+
+ sprintf(resname, "__tf%d__", count);
+ xobj_id = pdf_doc_begin_grabbing(resname,
+ fig_p.bbox.llx, fig_p.bbox.ury, &fig_p.bbox);
+
+ in_tfig = 1;
+ count++;
+ }
+ break;
+ case ETEXFIG:
+ if (!in_tfig)
+ ERROR("endTexFig without valid startTexFig!.");
+
+ pdf_doc_end_grabbing();
+ pdf_dev_put_image(xobj_id, &fig_p, x_user, y_user);
+ in_tfig = 0;
+ break;
+ default:
+ error = 1;
+ }
+
+ return error;
+}
+
+/*
+ * buggy...
+ */
+
+/*
+ * CTM(Current Transformation Matrix) means the transformation of User Space
+ * to Device Space coordinates. Because DVIPDFMx does not know the resolution
+ * of Device Space, we assume that the resolution is 1/1000.
+ */
+#define DEVICE_RESOLUTION 1000
+static int
+ps_dev_CTM (pdf_tmatrix *M)
+{
+ pdf_dev_currentmatrix(M);
+ M->a *= DEVICE_RESOLUTION; M->b *= DEVICE_RESOLUTION;
+ M->c *= DEVICE_RESOLUTION; M->d *= DEVICE_RESOLUTION;
+ M->e *= DEVICE_RESOLUTION; M->f *= DEVICE_RESOLUTION;
+
+ return 0;
+}
+
+/*
+ * Again, the only piece that needs x_user and y_user is
+ * that piece dealing with texfig.
+ */
+static int
+do_operator (const char *token, double x_user, double y_user)
+{
+ int error = 0;
+ int opcode = 0;
+ double values[12];
+ pdf_obj *tmp = NULL;
+ pdf_tmatrix matrix;
+ pdf_coord cp;
+ pdf_color color;
+
+#define PUSH(o) { \
+ if (top_stack < PS_STACK_SIZE) { \
+ stack[top_stack++] = (o); \
+ } else { \
+ WARN("PS stack overflow including MetaPost file or inline PS code"); \
+ error=1; \
+ break;\
+ } \
+}
+
+ opcode = get_opcode(token);
+
+ switch (opcode) {
+
+ /*
+ * Arithmetic operators
+ */
+ case ADD:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ PUSH(pdf_new_number(values[0] + values[1]));
+ break;
+ case MUL:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ PUSH(pdf_new_number(values[0]*values[1]));
+ break;
+ case NEG:
+ error = pop_get_numbers(values, 1);
+ if (!error)
+ PUSH(pdf_new_number(-values[0]));
+ break;
+ case SUB:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ PUSH(pdf_new_number(values[0] - values[1]));
+ break;
+ case DIV:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ PUSH(pdf_new_number(values[0]/values[1]));
+ break;
+ case TRUNCATE: /* Round toward zero. */
+ error = pop_get_numbers(values, 1);
+ if (!error)
+ PUSH(pdf_new_number(((values[0] > 0) ? floor(values[0]) : ceil(values[0]))));
+ break;
+
+ /* Stack operation */
+ case CLEAR:
+ error = do_clear();
+ break;
+ case POP:
+ tmp = POP_STACK();
+ if (tmp)
+ pdf_release_obj(tmp);
+ break;
+ case EXCH:
+ error = do_exch();
+ break;
+
+ /* Path construction */
+ case MOVETO:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ error = pdf_dev_moveto(values[0], values[1]);
+ break;
+ case RMOVETO:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ error = pdf_dev_rmoveto(values[0], values[1]);
+ break;
+ case LINETO:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ error = pdf_dev_lineto(values[0], values[1]);
+ break;
+ case RLINETO:
+ error = pop_get_numbers(values, 2);
+ if (!error)
+ error = pdf_dev_rlineto(values[0], values[1]);
+ break;
+ case CURVETO:
+ error = pop_get_numbers(values, 6);
+ if (!error)
+ error = pdf_dev_curveto(values[0], values[1],
+ values[2], values[3],
+ values[4], values[5]);
+ break;
+ case RCURVETO:
+ error = pop_get_numbers(values, 6);
+ if (!error)
+ error = pdf_dev_rcurveto(values[0], values[1],
+ values[2], values[3],
+ values[4], values[5]);
+ break;
+ case CLOSEPATH:
+ error = pdf_dev_closepath();
+ break;
+ case ARC:
+ error = pop_get_numbers(values, 5);
+ if (!error)
+ error = pdf_dev_arc(values[0], values[1],
+ values[2], /* rad */
+ values[3], values[4]);
+ break;
+ case ARCN:
+ error = pop_get_numbers(values, 5);
+ if (!error)
+ error = pdf_dev_arcn(values[0], values[1],
+ values[2], /* rad */
+ values[3], values[4]);
+ break;
+
+ case NEWPATH:
+ pdf_dev_newpath();
+ break;
+ case STROKE:
+ /* fill rule not supported yet */
+ pdf_dev_flushpath('S', PDF_FILL_RULE_NONZERO);
+ break;
+ case FILL:
+ pdf_dev_flushpath('f', PDF_FILL_RULE_NONZERO);
+ break;
+
+ case CLIP:
+ error = pdf_dev_clip();
+ break;
+ case EOCLIP:
+ error = pdf_dev_eoclip();
+ break;
+
+ /* Graphics state operators: */
+ case GSAVE:
+ error = pdf_dev_gsave();
+ save_font();
+ break;
+ case GRESTORE:
+ error = pdf_dev_grestore();
+ restore_font();
+ break;
+
+ case CONCAT:
+ tmp = POP_STACK();
+ error = cvr_array(tmp, values, 6); /* This does pdf_release_obj() */
+ tmp = NULL;
+ if (error)
+ WARN("Missing array before \"concat\".");
+ else {
+ pdf_setmatrix(&matrix,
+ values[0], values[1],
+ values[2], values[3],
+ values[4], values[5]);
+ error = pdf_dev_concat(&matrix);
+ }
+ break;
+ case SCALE:
+ error = pop_get_numbers(values, 2);
+ if (!error) {
+ switch (mp_cmode) {
+#ifndef WITHOUT_ASCII_PTEX
+ case MP_CMODE_PTEXVERT:
+ pdf_setmatrix(&matrix,
+ values[1], 0.0,
+ 0.0 , values[0],
+ 0.0 , 0.0);
+ break;
+#endif /* !WITHOUT_ASCII_PTEX */
+ default:
+ pdf_setmatrix(&matrix,
+ values[0], 0.0,
+ 0.0 , values[1],
+ 0.0 , 0.0);
+ break;
+ }
+
+ error = pdf_dev_concat(&matrix);
+ }
+ break;
+ /* Positive angle means clock-wise direction in graphicx-dvips??? */
+ case ROTATE:
+ error = pop_get_numbers(values, 1);
+ if (!error) {
+ values[0] = values[0] * M_PI / 180;
+
+ switch (mp_cmode) {
+ case MP_CMODE_DVIPSK:
+ case MP_CMODE_MPOST: /* Really? */
+#ifndef WITHOUT_ASCII_PTEX
+ case MP_CMODE_PTEXVERT:
+#endif /* !WITHOUT_ASCII_PTEX */
+ pdf_setmatrix(&matrix,
+ cos(values[0]), -sin(values[0]),
+ sin(values[0]), cos(values[0]),
+ 0.0, 0.0);
+ break;
+ default:
+ pdf_setmatrix(&matrix,
+ cos(values[0]) , sin(values[0]),
+ -sin(values[0]), cos(values[0]),
+ 0.0, 0.0);
+ break;
+ }
+ error = pdf_dev_concat(&matrix);
+ }
+ break;
+ case TRANSLATE:
+ error = pop_get_numbers(values, 2);
+ if (!error) {
+ pdf_setmatrix(&matrix,
+ 1.0, 0.0,
+ 0.0, 1.0,
+ values[0], values[1]);
+ error = pdf_dev_concat(&matrix);
+ }
+ break;
+
+ case SETDASH:
+ error = pop_get_numbers(values, 1);
+ if (!error) {
+ pdf_obj *pattern, *dash;
+ int i, num_dashes;
+ double dash_values[PDF_DASH_SIZE_MAX];
+ double offset;
+
+ offset = values[0];
+ pattern = POP_STACK();
+ if (!PDF_OBJ_ARRAYTYPE(pattern)) {
+ if (pattern)
+ pdf_release_obj(pattern);
+ error = 1;
+ break;
+ }
+ num_dashes = pdf_array_length(pattern);
+ if (num_dashes > PDF_DASH_SIZE_MAX) {
+ WARN("Too many dashes...");
+ pdf_release_obj(pattern);
+ error = 1;
+ break;
+ }
+ for (i = 0;
+ i < num_dashes && !error ; i++) {
+ dash = pdf_get_array(pattern, i);
+ if (!PDF_OBJ_NUMBERTYPE(dash))
+ error = 1;
+ else {
+ dash_values[i] = pdf_number_value(dash);
+ }
+ }
+ pdf_release_obj(pattern);
+ if (!error) {
+ error = pdf_dev_setdash(num_dashes, dash_values, offset);
+ }
+ }
+ break;
+ case SETLINECAP:
+ error = pop_get_numbers(values, 1);
+ if (!error)
+ error = pdf_dev_setlinecap(values[0]);
+ break;
+ case SETLINEJOIN:
+ error = pop_get_numbers(values, 1);
+ if (!error)
+ error = pdf_dev_setlinejoin(values[0]);
+ break;
+ case SETLINEWIDTH:
+ error = pop_get_numbers(values, 1);
+ if (!error)
+ error = pdf_dev_setlinewidth(values[0]);
+ break;
+ case SETMITERLIMIT:
+ error = pop_get_numbers(values, 1);
+ if (!error)
+ error = pdf_dev_setmiterlimit(values[0]);
+ break;
+
+ case SETCMYKCOLOR:
+ error = pop_get_numbers(values, 4);
+ /* Not handled properly */
+ if (!error) {
+ pdf_color_cmykcolor(&color,
+ values[0], values[1],
+ values[2], values[3]);
+ pdf_dev_setcolor(&color, 0);
+ pdf_dev_setcolor(&color, 1);
+ }
+ break;
+ case SETGRAY:
+ /* Not handled properly */
+ error = pop_get_numbers(values, 1);
+ if (!error) {
+ pdf_color_graycolor(&color, values[0]);
+ pdf_dev_setcolor(&color, 0);
+ pdf_dev_setcolor(&color, 1);
+ }
+ break;
+ case SETRGBCOLOR:
+ error = pop_get_numbers(values, 3);
+ if (!error) {
+ pdf_color_rgbcolor(&color,
+ values[0], values[1], values[2]);
+ pdf_dev_setcolor(&color, 0);
+ pdf_dev_setcolor(&color, 1);
+ }
+ break;
+
+ case SHOWPAGE: /* Let's ignore this for now */
+ break;
+
+ case CURRENTPOINT:
+ error = pdf_dev_currentpoint(&cp);
+ if (!error) {
+ PUSH(pdf_new_number(cp.x));
+ PUSH(pdf_new_number(cp.y));
+ }
+ break;
+
+ case DTRANSFORM:
+ {
+ int has_matrix = 0;
+
+ tmp = POP_STACK();
+ if (PDF_OBJ_ARRAYTYPE(tmp)) {
+ error = cvr_array(tmp, values, 6); /* This does pdf_release_obj() */
+ tmp = NULL;
+ if (error)
+ break;
+ pdf_setmatrix(&matrix,
+ values[0], values[1],
+ values[2], values[3],
+ values[4], values[5]);
+ tmp = POP_STACK();
+ has_matrix = 1;
+ }
+
+ if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ error = 1;
+ break;
+ }
+ cp.y = pdf_number_value(tmp);
+ pdf_release_obj(tmp);
+
+ tmp = POP_STACK();
+ if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ error = 1;
+ break;
+ }
+ cp.x = pdf_number_value(tmp);
+ pdf_release_obj(tmp);
+
+ if (!has_matrix) {
+ ps_dev_CTM(&matrix); /* Here, we need real PostScript CTM */
+ }
+ pdf_dev_dtransform(&cp, &matrix);
+ PUSH(pdf_new_number(cp.x));
+ PUSH(pdf_new_number(cp.y));
+ }
+ break;
+
+ case IDTRANSFORM:
+ {
+ int has_matrix = 0;
+
+ tmp = POP_STACK();
+ if (PDF_OBJ_ARRAYTYPE(tmp)) {
+ error = cvr_array(tmp, values, 6); /* This does pdf_release_obj() */
+ tmp = NULL;
+ if (error)
+ break;
+ pdf_setmatrix(&matrix,
+ values[0], values[1],
+ values[2], values[3],
+ values[4], values[5]);
+ tmp = POP_STACK();
+ has_matrix = 1;
+ }
+
+ if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ error = 1;
+ break;
+ }
+ cp.y = pdf_number_value(tmp);
+ pdf_release_obj(tmp);
+
+ tmp = POP_STACK();
+ if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ error = 1;
+ break;
+ }
+ cp.x = pdf_number_value(tmp);
+ pdf_release_obj(tmp);
+
+ if (!has_matrix) {
+ ps_dev_CTM(&matrix); /* Here, we need real PostScript CTM */
+ }
+ pdf_dev_idtransform(&cp, &matrix);
+ PUSH(pdf_new_number(cp.x));
+ PUSH(pdf_new_number(cp.y));
+ break;
+ }
+
+ case FINDFONT:
+ error = do_findfont();
+ break;
+ case SCALEFONT:
+ error = do_scalefont();
+ break;
+ case SETFONT:
+ error = do_setfont();
+ break;
+ case CURRENTFONT:
+ error = do_currentfont();
+ break;
+
+ case SHOW:
+ error = do_show();
+ break;
+
+ case STRINGWIDTH:
+ error = 1;
+ break;
+
+ /* Extensions */
+ case FSHOW:
+ error = do_mpost_fshow(opcode, x_user, y_user);
+ /* Treat fshow as a path terminator of sorts */
+ break;
+ case STEXFIG:
+ case ETEXFIG:
+ error = do_texfig_operator(opcode, x_user, y_user);
+ break;
+
+ default:
+ if (is_fontname(token)) {
+ PUSH(pdf_new_name(token));
+ } else {
+ WARN("Unknown token \"%s\"", token);
+ error = 1;
+ }
+ break;
+ }
+
+ return error;
+}
+
+/*
+ * The only sections that need to know x_user and y _user are those
+ * dealing with texfig.
+ */
+static int
+mp_parse_body (char **start, char *end, double x_user, double y_user)
+{
+ char *token;
+ pdf_obj *obj;
+ int error = 0;
+
+ skip_white(start, end);
+ while (*start < end && !error) {
+ if (isdigit(**start) ||
+ (*start < end - 1 &&
+ (**start == '+' || **start == '-' || **start == '.' ))) {
+ double value;
+ char *next;
+
+ value = strtod(*start, &next);
+ if (next < end && !strchr("<([{/%", *next) && !isspace(*next)) {
+ WARN("Unkown PostScript operator.");
+ dump(*start, next);
+ error = 1;
+ } else {
+ PUSH(pdf_new_number(value));
+ *start = next;
+ }
+ /*
+ * PDF parser can't handle PS operator inside arrays.
+ * This shouldn't use parse_pdf_array().
+ */
+ } else if (**start == '[' &&
+ (obj = parse_pdf_array(start, end))) {
+ PUSH(obj);
+ /* This cannot handle ASCII85 string. */
+ } else if (*start < end - 1 &&
+ (**start == '<' && *(*start+1) == '<') &&
+ (obj = parse_pdf_dict(start, end))) {
+ PUSH(obj);
+ } else if ((**start == '(' || **start == '<') &&
+ (obj = parse_pdf_string (start, end))) {
+ PUSH(obj);
+ } else if (**start == '/' &&
+ (obj = parse_pdf_name(start, end))) {
+ PUSH(obj);
+ } else {
+ token = parse_ident(start, end);
+ if (!token)
+ error = 1;
+ else {
+ error = do_operator(token, x_user, y_user);
+ RELEASE(token);
+ }
+ }
+ skip_white(start, end);
+ }
+
+ return error;
+}
+
+void
+mps_eop_cleanup (void)
+{
+ clear_fonts();
+ do_clear();
+}
+
+int
+mps_stack_depth (void)
+{
+ return top_stack;
+}
+
+int
+mps_exec_inline (char **p, char *endptr,
+ double x_user, double y_user)
+{
+ int error;
+ int dirmode, autorotate;
+
+ /* Compatibility for dvipsk. */
+ dirmode = pdf_dev_get_dirmode();
+ if (dirmode) {
+ mp_cmode = MP_CMODE_PTEXVERT;
+ } else {
+ mp_cmode = MP_CMODE_DVIPSK;
+ }
+
+ autorotate = pdf_dev_get_param(PDF_DEV_PARAM_AUTOROTATE);
+ pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, 0);
+ pdf_color_push(); /* ... */
+
+ /* Comment in dvipdfm:
+ * Remember that x_user and y_user are off by 0.02 %
+ */
+ pdf_dev_moveto(x_user, y_user);
+ error = mp_parse_body(p, endptr, x_user, y_user);
+
+ pdf_color_pop(); /* ... */
+ pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, autorotate);
+ pdf_dev_set_dirmode(dirmode);
+
+ return error;
+}
+
+/* mp inclusion is a bit of a hack. The routine
+ * starts a form at the lower left corner of
+ * the page and then calls begin_form_xobj telling
+ * it to record the image drawn there and bundle it
+ * up in an xojbect. This allows us to use the coordinates
+ * in the MP file directly. This appears to be the
+ * easiest way to be able to use the pdf_dev_set_string()
+ * command (with its scaled and extended fonts) without
+ * getting all confused about the coordinate system.
+ * After the xobject is created, the whole thing can
+ * be scaled any way the user wants
+ */
+
+/* Should implement save and restore. */
+int
+mps_include_page (const char *ident, FILE *fp)
+{
+ int form_id;
+ xform_info info;
+ int st_depth, gs_depth;
+ char *buffer, *p, *endptr;
+ long length, nb_read;
+ int dirmode, autorotate, error;
+
+ rewind(fp);
+
+ length = file_size(fp);
+ if (length < 1) {
+ WARN("Can't read any byte in the MPS file.");
+ return -1;
+ }
+
+ buffer = NEW(length + 1, char);
+ p = buffer;
+ endptr = p + length;
+ endptr[0] = '\0';
+
+ while (length > 0) {
+ nb_read = fread(buffer, sizeof(char), length, fp);
+ if (nb_read < 0) {
+ RELEASE(buffer);
+ WARN("Reading file failed...");
+ return -1;
+ }
+ length -= nb_read;
+ }
+
+ error = mps_scan_bbox(&p, endptr, &(info.bbox));
+ if (error) {
+ WARN("Error occured while scanning MetaPost file headers: Could not find BoundingBox.");
+ RELEASE(buffer);
+ return -1;
+ }
+ skip_prolog(&p, endptr);
+
+ dirmode = pdf_dev_get_dirmode();
+ autorotate = pdf_dev_get_param(PDF_DEV_PARAM_AUTOROTATE);
+ pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, 0);
+ pdf_color_push();
+
+ form_id = pdf_doc_begin_grabbing(ident, 0.0, 0.0, &(info.bbox));
+
+ mp_cmode = MP_CMODE_MPOST;
+ gs_depth = pdf_dev_current_depth();
+ st_depth = mps_stack_depth();
+ /* At this point the gstate must be initialized, since it starts a new
+ * XObject. Note that it increase gs_depth by 1. */
+ pdf_dev_push_gstate();
+
+ error = mp_parse_body(&p, endptr, 0.0, 0.0);
+ RELEASE(buffer);
+
+ if (error) {
+ WARN("Errors occured while interpreting PostScript file.");
+ WARN("Leaving garbage in output PDF file.");
+ form_id = -1;
+ }
+
+ /* It's time to pop the new gstate above. */
+ pdf_dev_pop_gstate();
+ mps_stack_clear_to (st_depth);
+ pdf_dev_grestore_to(gs_depth);
+
+ pdf_doc_end_grabbing();
+
+ pdf_color_pop();
+ pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, autorotate);
+ pdf_dev_set_dirmode(dirmode);
+
+ return form_id;
+}
+
+int
+mps_do_page (FILE *image_file)
+{
+ int error = 0;
+ pdf_rect bbox;
+ char *buffer, *start, *end;
+ long size;
+ int dir_mode;
+
+ rewind(image_file);
+ if ((size = file_size(image_file)) == 0) {
+ WARN("Can't read any byte in the MPS file.");
+ return -1;
+ }
+
+ buffer = NEW(size+1, char);
+ fread(buffer, sizeof(char), size, image_file);
+ buffer[size] = 0;
+ start = buffer;
+ end = buffer + size;
+
+ error = mps_scan_bbox(&start, end, &bbox);
+ if (error) {
+ WARN("Error occured while scanning MetaPost file headers: Could not find BoundingBox.");
+ RELEASE(buffer);
+ return -1;
+ }
+
+ mp_cmode = MP_CMODE_MPOST;
+
+ pdf_doc_begin_page (1.0, 0.0, 0.0); /* scale, xorig, yorig */
+ pdf_doc_set_mediabox(pdf_doc_current_page_number(), &bbox);
+
+ dir_mode = pdf_dev_get_dirmode();
+ pdf_dev_set_autorotate(0);
+
+ skip_prolog(&start, end);
+
+ error = mp_parse_body(&start, end, 0.0, 0.0);
+
+ if (error) {
+ WARN("Errors occured while interpreting MetaPost file.");
+ }
+
+ pdf_dev_set_autorotate(1);
+ pdf_dev_set_dirmode(dir_mode);
+
+ pdf_doc_end_page();
+
+ RELEASE(buffer);
+
+ /*
+ * The reason why we don't return XObject itself is
+ * PDF inclusion may not be made so.
+ */
+ return (error ? -1 : 0);
+}
+
+int
+check_for_mp (FILE *image_file)
+{
+ int try_count = 10;
+
+ rewind (image_file);
+ mfgets(work_buffer, WORK_BUFFER_SIZE, image_file);
+ if (strncmp(work_buffer, "%!PS", 4))
+ return 0;
+
+ while (try_count > 0) {
+ mfgets(work_buffer, WORK_BUFFER_SIZE, image_file);
+ if (!strncmp(work_buffer, "%%Creator:", 10)) {
+ if (strlen(work_buffer+10) >= 8 &&
+ strstr(work_buffer+10, "MetaPost"))
+ break;
+ }
+ try_count--;
+ }
+
+ return ((try_count > 0) ? 1 : 0);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/mpost.h b/Build/source/texk/xdvipdfmx/src/mpost.h
new file mode 100644
index 00000000000..7020b3775da
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/mpost.h
@@ -0,0 +1,47 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/mpost.h,v 1.11 2004/09/11 14:50:28 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _MPOST_H_
+#define _MPOST_H_
+
+#include "mfileio.h"
+#include "pdfximage.h"
+#include "pdfdev.h"
+
+extern int check_for_mp (FILE *fp);
+
+extern int mps_scan_bbox (char **pp, char *endptr, pdf_rect *bbox);
+
+/* returns xobj_id */
+extern int mps_include_page (const char *ident, FILE *fp);
+
+extern int mps_exec_inline (char **buffer, char *endptr,
+ double x_user, double y_user);
+extern int mps_stack_depth (void);
+
+extern void mps_eop_cleanup (void);
+
+extern int mps_do_page (FILE *fp);
+
+#endif /* _MPOST_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/numbers.c b/Build/source/texk/xdvipdfmx/src/numbers.c
new file mode 100644
index 00000000000..2a0b2c3a0c2
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/numbers.c
@@ -0,0 +1,224 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/numbers.c,v 1.8 2004/03/03 13:19:00 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include "system.h"
+#include "error.h"
+#include "mfileio.h"
+#include "numbers.h"
+
+UNSIGNED_BYTE get_unsigned_byte (FILE *file)
+{
+ int ch;
+ if ((ch = fgetc (file)) < 0)
+ ERROR ("File ended prematurely\n");
+ return (UNSIGNED_BYTE) ch;
+}
+
+UNSIGNED_BYTE sget_unsigned_byte (char *s)
+{
+ return *((unsigned char *) s);
+}
+
+SIGNED_BYTE get_signed_byte (FILE *file)
+{
+ int byte;
+ byte = get_unsigned_byte(file);
+ if (byte >= 0x80)
+ byte -= 0x100;
+ return (SIGNED_BYTE) byte;
+}
+
+UNSIGNED_PAIR get_unsigned_pair (FILE *file)
+{
+ int i;
+ UNSIGNED_BYTE byte;
+ UNSIGNED_PAIR pair = 0;
+ for (i=0; i<2; i++) {
+ byte = get_unsigned_byte(file);
+ pair = pair*0x100u + byte;
+ }
+ return pair;
+}
+
+UNSIGNED_PAIR sget_unsigned_pair (unsigned char *s)
+{
+ int i;
+ UNSIGNED_BYTE byte;
+ UNSIGNED_PAIR pair = 0;
+ for (i=0; i<2; i++) {
+ byte = *(s++);
+ pair = pair*0x100u + byte;
+ }
+ return pair;
+}
+
+SIGNED_PAIR get_signed_pair (FILE *file)
+{
+ int i;
+ long pair = 0;
+ for (i=0; i<2; i++) {
+ pair = pair*0x100 + get_unsigned_byte(file);
+ }
+ if (pair >= 0x8000) {
+ pair -= 0x10000l;
+ }
+ return (SIGNED_PAIR) pair;
+}
+
+
+UNSIGNED_TRIPLE get_unsigned_triple(FILE *file)
+{
+ int i;
+ long triple = 0;
+ for (i=0; i<3; i++) {
+ triple = triple*0x100u + get_unsigned_byte(file);
+ }
+ return (UNSIGNED_TRIPLE) triple;
+}
+
+SIGNED_TRIPLE get_signed_triple(FILE *file)
+{
+ int i;
+ long triple = 0;
+ for (i=0; i<3; i++) {
+ triple = triple*0x100 + get_unsigned_byte(file);
+ }
+ if (triple >= 0x800000l)
+ triple -= 0x1000000l;
+ return (SIGNED_TRIPLE) triple;
+}
+
+SIGNED_QUAD get_signed_quad(FILE *file)
+{
+ int byte, i;
+ long quad = 0;
+
+ /* Check sign on first byte before reading others */
+ byte = get_unsigned_byte(file);
+ quad = byte;
+ if (quad >= 0x80)
+ quad = byte - 0x100;
+ for (i=0; i<3; i++) {
+ quad = quad*0x100 + get_unsigned_byte(file);
+ }
+ return (SIGNED_QUAD) quad;
+}
+
+UNSIGNED_QUAD get_unsigned_quad(FILE *file)
+{
+ int i;
+ unsigned long quad = 0;
+ for (i=0; i<4; i++) {
+ quad = quad*0x100u + get_unsigned_byte(file);
+ }
+ return (UNSIGNED_QUAD) quad;
+}
+
+SIGNED_QUAD sqxfw (SIGNED_QUAD sq, fixword fw)
+{
+ int sign = 1;
+ unsigned long a, b, c, d, ad, bd, bc, ac;
+ unsigned long e, f, g, h, i, j, k;
+ unsigned long result;
+ /* Make positive. */
+ if (sq < 0) {
+ sign = -sign;
+ sq = -sq;
+ }
+ if (fw < 0) {
+ sign = -sign;
+ fw = -fw;
+ }
+ a = ((unsigned long) sq) >> 16u;
+ b = ((unsigned long) sq) & 0xffffu;
+ c = ((unsigned long) fw) >> 16u;
+ d = ((unsigned long) fw) & 0xffffu;
+ ad = a*d; bd = b*d; bc = b*c; ac = a*c;
+ e = bd >> 16u;
+ f = ad >> 16u;
+ g = ad & 0xffffu;
+ h = bc >> 16u;
+ i = bc & 0xffffu;
+ j = ac >> 16u;
+ k = ac & 0xffffu;
+ result = (e+g+i + (1<<3)) >> 4u; /* 1<<3 is for rounding */
+ result += (f+h+k) << 12u;
+ result += j << 28u;
+ return (sign > 0) ? result : result * -1L;
+}
+
+SIGNED_QUAD axboverc (SIGNED_QUAD n1, SIGNED_QUAD n2, SIGNED_QUAD divide)
+{
+ int sign = 1;
+ unsigned long a, b, c, d, ad, bd, bc, ac, e, f, g, h, i, j, o;
+ unsigned long high, low;
+ SIGNED_QUAD result = 0;
+ /* Make positive. */
+ if (n1 < 0) {
+ sign = -sign;
+ n1 = -n1;
+ }
+ if (n2 < 0) {
+ sign = -sign;
+ n2 = -n2;
+ }
+ if (divide < 0) {
+ sign = -sign;
+ divide = -divide;
+ }
+ a = ((unsigned long) n1) >> 16u;
+ b = ((unsigned long) n1) & 0xffffu;
+ c = ((unsigned long) n2) >> 16u;
+ d = ((unsigned long) n2) & 0xffffu;
+ ad = a*d; bd = b*d; bc = b*c; ac = a*c;
+ e = bd >> 16u; f = bd & 0xffffu;
+ g = ad >> 16u; h = ad & 0xffffu;
+ i = bc >> 16u; j = bc & 0xffffu;
+ o = e+h+j;
+ high = g+i+(o>>16u)+ac; o &= 0xffffu;
+ low = (o << 16) + f;
+ if (high >= divide)
+ ERROR ("Overflow in axboc");
+ {
+ int k;
+ for (k=0; k<32; k++) {
+ high *= 2;
+ result *= 2;
+ if (low >= 0x80000000) {
+ low -= 0x80000000;
+ high += 1;
+ }
+ low *= 2;
+ if (high > divide) {
+ high -= divide;
+ result += 1;
+ }
+ }
+ }
+ high *= 2;
+ if (high >= divide)
+ result += 1;
+ return (sign>0)?result:-result;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/numbers.h b/Build/source/texk/xdvipdfmx/src/numbers.h
new file mode 100644
index 00000000000..9e6b2306508
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/numbers.h
@@ -0,0 +1,82 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/numbers.h,v 1.9 2005/07/20 10:41:54 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _NUMBERS_H_
+#define _NUMBERS_H_
+
+#include <stdio.h>
+#include <math.h>
+
+typedef unsigned char Ubyte;
+typedef int UNSIGNED_BYTE, SIGNED_BYTE, SIGNED_PAIR;
+typedef unsigned UNSIGNED_PAIR;
+typedef long UNSIGNED_TRIPLE, SIGNED_TRIPLE, SIGNED_QUAD;
+typedef unsigned long UNSIGNED_QUAD;
+
+extern UNSIGNED_BYTE get_unsigned_byte (FILE *);
+extern UNSIGNED_BYTE sget_unsigned_byte (char *);
+extern SIGNED_BYTE get_signed_byte (FILE *);
+extern UNSIGNED_PAIR get_unsigned_pair (FILE *);
+extern UNSIGNED_PAIR sget_unsigned_pair (unsigned char *);
+extern SIGNED_PAIR get_signed_pair (FILE *);
+extern UNSIGNED_TRIPLE get_unsigned_triple (FILE *);
+extern SIGNED_TRIPLE get_signed_triple (FILE *);
+extern SIGNED_QUAD get_signed_quad (FILE *);
+extern UNSIGNED_QUAD get_unsigned_quad (FILE *);
+
+typedef signed long fixword;
+
+extern SIGNED_QUAD sqxfw (SIGNED_QUAD sq, fixword fw);
+extern SIGNED_QUAD axboverc (SIGNED_QUAD n1, SIGNED_QUAD n2, SIGNED_QUAD divide);
+
+#ifndef MAX
+# define MAX(a,b) ((a)>(b)?(a):(b))
+#endif
+#ifndef MIN
+# define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+#define ISODD(n) (((n)/2)*2!=(n))
+#define ISEVEN(n) (((n)/2)*2==(n))
+
+#ifndef M_PI
+# define M_PI (4.0*atan(1.0))
+#endif
+
+#define ROUND(n,acc) (floor(((double)n)/(acc)+0.5)*(acc))
+
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+# define __C99__
+#endif
+
+#ifndef __C99__
+# ifndef round
+# define round(v) (floor((v) + 0.5))
+# endif
+# ifndef trunc
+# define trunc(v) ((v) > 0.0 ? floor((v)) : ceil((v)))
+# endif
+#endif
+#define round_at(v,acc) (round(((double)(v))/(acc))*(acc))
+
+#endif /* _NUMBERS_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/otl_conf.c b/Build/source/texk/xdvipdfmx/src/otl_conf.c
new file mode 100644
index 00000000000..298384961ff
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/otl_conf.c
@@ -0,0 +1,654 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/otl_conf.c,v 1.6 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifdef _HAVE_CONFIG_H
+#include "config.h"
+#endif /* _HAVE_CONFIG_H */
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+#include "dpxfile.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+#include "pdfparse.h"
+
+#include "agl.h"
+
+#include "otl_conf.h"
+
+#define VERBOSE_LEVEL_MIN 0
+static int verbose = 0;
+void
+otl_conf_set_verbose (void)
+{
+ verbose++;
+}
+
+static pdf_obj *
+parse_uc_coverage (pdf_obj *gclass, char **pp, char *endptr)
+{
+ pdf_obj *coverage;
+ pdf_obj *value;
+ long ucv = 0;
+ char *glyphname, *glyphclass;
+
+ if (*pp + 1 >= endptr)
+ return NULL;
+
+ if (**pp == '[')
+ (*pp)++;
+
+ coverage = pdf_new_array();
+
+ while (*pp < endptr) {
+ skip_white(pp, endptr);
+ switch (**pp) {
+ case ']': case ';':
+ (*pp)++;
+ return coverage;
+ break;
+ case ',':
+ (*pp)++;
+ break;
+ case '@':
+ {
+ pdf_obj *cvalues;
+ int i, size;
+
+ (*pp)++;
+ glyphclass = parse_c_ident(pp, endptr);
+ cvalues = pdf_lookup_dict(gclass, glyphclass);
+ if (!cvalues)
+ ERROR("%s not defined...", glyphclass);
+ size = pdf_array_length(cvalues);
+ for (i = 0; i < size; i++) {
+ pdf_add_array(coverage,
+ pdf_link_obj(pdf_get_array(cvalues, i)));
+ }
+ }
+ break;
+ default:
+ glyphname = parse_c_ident(pp, endptr);
+ if (!glyphname)
+ ERROR("Invalid Unicode character specified.");
+
+ skip_white(pp, endptr);
+ if (*pp + 1 < endptr && **pp == '-') {
+ value = pdf_new_array();
+
+ if (agl_get_unicodes(glyphname, &ucv, 1) != 1)
+ ERROR("Invalid Unicode char: %s", glyphname);
+ pdf_add_array(value, pdf_new_number(ucv));
+ RELEASE(glyphname);
+
+ (*pp)++; skip_white(pp, endptr);
+ glyphname = parse_c_ident(pp, endptr);
+ if (!glyphname)
+ ERROR("Invalid Unicode char: %s", glyphname);
+ if (agl_get_unicodes(glyphname, &ucv, 1) != 1)
+ ERROR("Invalid Unicode char: %s", glyphname);
+ pdf_add_array(value, pdf_new_number(ucv));
+ RELEASE(glyphname);
+
+ } else {
+ if (agl_get_unicodes(glyphname, &ucv, 1) != 1)
+ ERROR("Invalid Unicode char: %s", glyphname);
+ value = pdf_new_number(ucv);
+ RELEASE(glyphname);
+ }
+ pdf_add_array(coverage, value);
+ break;
+ }
+ skip_white(pp, endptr);
+ }
+
+ return coverage;
+}
+
+static pdf_obj *parse_block (pdf_obj *gclass, char **pp, char *endptr);
+
+static void
+add_rule (pdf_obj *rule, pdf_obj *gclass,
+ char *first, char *second, char *suffix)
+{
+ pdf_obj *glyph1, *glyph2;
+#define MAX_UNICODES 16
+ long unicodes[MAX_UNICODES];
+ int i, n_unicodes;
+
+ if (first[0] == '@') {
+ glyph1 = pdf_lookup_dict(gclass, &first[1]);
+ if (!glyph1) {
+ WARN("No glyph class \"%s\" found.", &first[1]);
+ return;
+ }
+ pdf_link_obj(glyph1);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Output glyph sequence: %s\n", first);
+ }
+
+ } else {
+ n_unicodes = agl_get_unicodes(first, unicodes, MAX_UNICODES);
+ if (n_unicodes < 1) {
+ WARN("Failed to convert glyph \"%s\" to Unicode sequence.",
+ first);
+ return;
+ }
+ glyph1 = pdf_new_array();
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Output glyph sequence: %s ->", first);
+ }
+
+ for (i = 0; i < n_unicodes; i++) {
+ pdf_add_array(glyph1, pdf_new_number(unicodes[i]));
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ if (unicodes[i] < 0x10000) {
+ MESG(" U+%04X", unicodes[i]);
+ } else {
+ MESG(" U+%06X", unicodes[i]);
+ }
+ }
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("\n");
+ }
+ }
+
+ if (second[0] == '@') {
+ glyph2 = pdf_lookup_dict(gclass, &second[1]);
+ if (!glyph2) {
+ WARN("No glyph class \"%s\" found.", &second[1]);
+ return;
+ }
+ pdf_link_obj(glyph2);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Input glyph sequence: %s (%s)\n", second, suffix);
+ }
+
+ } else {
+ n_unicodes = agl_get_unicodes(second, unicodes, 16);
+ if (n_unicodes < 1) {
+ WARN("Failed to convert glyph \"%s\" to Unicode sequence.",
+ second);
+ return;
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ if (suffix)
+ MESG("otl_conf>> Input glyph sequence: %s.%s ->", second, suffix);
+ else
+ MESG("otl_conf>> Input glyph sequence: %s ->", second);
+ }
+
+ glyph2 = pdf_new_array();
+ for (i = 0; i < n_unicodes; i++) {
+ pdf_add_array(glyph2, pdf_new_number(unicodes[i]));
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ if (unicodes[i] < 0x10000) {
+ MESG(" U+%04X", unicodes[i]);
+ } else {
+ MESG(" U+%06X", unicodes[i]);
+ }
+ }
+ }
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG(" (%s)\n", suffix);
+ }
+ }
+
+ /* OK */
+ if (suffix) {
+ pdf_add_array(rule, pdf_new_string(suffix, strlen(suffix)));
+ } else {
+ pdf_add_array(rule, pdf_new_null());
+ }
+ pdf_add_array(rule, glyph1);
+ pdf_add_array(rule, glyph2);
+}
+
+static pdf_obj *
+parse_substrule (pdf_obj *gclass, char **pp, char *endptr)
+{
+ pdf_obj *substrule;
+ char *token;
+
+ skip_white(pp, endptr);
+ if (*pp < endptr && **pp == '{')
+ (*pp)++;
+
+ skip_white(pp, endptr);
+ if (*pp >= endptr)
+ return NULL;
+
+ substrule = pdf_new_array();
+ while (*pp < endptr && **pp != '}') {
+ skip_white(pp, endptr);
+ if (*pp >= endptr)
+ break;
+
+ if (**pp == '#') {
+ while (*pp < endptr) {
+ if (**pp == '\r' || **pp == '\n') {
+ (*pp)++;
+ break;
+ }
+ (*pp)++;
+ }
+ continue;
+ } else if (**pp == ';') {
+ (*pp)++;
+ continue;
+ }
+
+ skip_white(pp, endptr);
+ token = parse_c_ident(pp, endptr);
+ if (!token)
+ break;
+
+ if (!strcmp(token, "assign") || !strcmp(token, "substitute")) {
+ char *tmp, *first, *second, *suffix;
+
+ skip_white(pp, endptr);
+
+ first = parse_c_ident(pp, endptr);
+ if (!first)
+ ERROR("Syntax error (1)");
+
+ skip_white(pp, endptr);
+ tmp = parse_c_ident(pp, endptr);
+ if (strcmp(tmp, "by") && strcmp(tmp, "to"))
+ ERROR("Syntax error (2): %s", *pp);
+
+ skip_white(pp, endptr);
+ second = parse_c_ident(pp, endptr); /* allows @ */
+ if (!second)
+ ERROR("Syntax error (3)");
+
+ /* (assign|substitute) tag dst src */
+ pdf_add_array(substrule, pdf_new_name(token));
+ if (*pp + 1 < endptr && **pp == '.') {
+ (*pp)++;
+ suffix = parse_c_ident(pp, endptr);
+ } else {
+ suffix = NULL;
+ }
+ add_rule(substrule, gclass, first, second, suffix);
+
+ RELEASE(first);
+ RELEASE(tmp);
+ RELEASE(second);
+ if (suffix)
+ RELEASE(suffix);
+ } else {
+ ERROR("Unkown command %s.", token);
+ }
+ RELEASE(token);
+ skip_white(pp, endptr);
+ }
+
+ if (*pp < endptr && **pp == '}')
+ (*pp)++;
+ return substrule;
+}
+
+static pdf_obj *
+parse_block (pdf_obj *gclass, char **pp, char *endptr)
+{
+ pdf_obj *rule;
+ char *token, *tmp;
+
+ skip_white(pp, endptr);
+ if (*pp < endptr && **pp == '{')
+ (*pp)++;
+
+ skip_white(pp, endptr);
+ if (*pp >= endptr)
+ return NULL;
+
+ rule = pdf_new_dict();
+ while (*pp < endptr && **pp != '}') {
+ skip_white(pp, endptr);
+ if (*pp >= endptr)
+ break;
+ if (**pp == '#') {
+ while (*pp < endptr) {
+ if (**pp == '\r' || **pp == '\n') {
+ (*pp)++;
+ break;
+ }
+ (*pp)++;
+ }
+ continue;
+ } else if (**pp == ';') {
+ (*pp)++;
+ continue;
+ }
+
+ skip_white(pp, endptr);
+ token = parse_c_ident(pp, endptr);
+ if (!token)
+ break;
+
+ if (!strcmp(token, "script") ||
+ !strcmp(token, "language")) {
+ int i, len;
+
+ skip_white(pp, endptr);
+ len = 0;
+ while (*pp + len < endptr && *(*pp + len) != ';') {
+ len++;
+ }
+ if (len > 0) {
+ tmp = NEW(len+1, char);
+ memset(tmp, 0, len+1);
+ for (i = 0; i < len; i++) {
+ if (!isspace(**pp))
+ tmp[i] = **pp;
+ (*pp)++;
+ }
+ pdf_add_dict(rule,
+ pdf_new_name(token),
+ pdf_new_string(tmp, strlen(tmp)));
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Current %s set to \"%s\"\n", token, tmp);
+ }
+
+ RELEASE(tmp);
+ }
+ } else if (!strcmp(token, "option")) {
+ pdf_obj *opt_dict, *opt_rule;
+
+ opt_dict = pdf_lookup_dict(rule, "option");
+ if (!opt_dict) {
+ opt_dict = pdf_new_dict();
+ pdf_add_dict(rule,
+ pdf_new_name("option"), opt_dict);
+ }
+
+ skip_white(pp, endptr);
+ tmp = parse_c_ident(pp, endptr);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Reading option \"%s\"\n", tmp);
+ }
+
+ skip_white(pp, endptr);
+ opt_rule = parse_block(gclass, pp, endptr);
+ pdf_add_dict(opt_dict, pdf_new_name(tmp), opt_rule);
+
+ RELEASE(tmp);
+ } else if (!strcmp(token, "prefered") ||
+ !strcmp(token, "required") ||
+ !strcmp(token, "optional")) {
+ pdf_obj *subst, *rule_block;
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Reading block (%s)\n", token);
+ }
+
+ skip_white(pp, endptr);
+ if (*pp >= endptr || **pp != '{')
+ ERROR("Syntax error (1)");
+
+ rule_block = parse_substrule(gclass, pp, endptr);
+ subst = pdf_lookup_dict(rule, "rule");
+ if (!subst) {
+ subst = pdf_new_array();
+ pdf_add_dict(rule, pdf_new_name("rule"), subst);
+ }
+ pdf_add_array(subst, pdf_new_number(token[0]));
+ pdf_add_array(subst, rule_block);
+ } else if (token[0] == '@') {
+ pdf_obj *coverage;
+
+ skip_white(pp, endptr);
+ (*pp)++; /* = */
+ skip_white(pp, endptr);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_conf>> Glyph class \"%s\"\n", token);
+ }
+
+ coverage = parse_uc_coverage(gclass, pp, endptr);
+ if (!coverage)
+ ERROR("No valid Unicode characters...");
+
+ pdf_add_dict(gclass,
+ pdf_new_name(&token[1]), coverage);
+ }
+ RELEASE(token);
+ skip_white(pp, endptr);
+ }
+
+ if (*pp < endptr && **pp == '}')
+ (*pp)++;
+ return rule;
+}
+
+
+static pdf_obj *
+otl_read_conf (const char *conf_name)
+{
+ pdf_obj *rule;
+ pdf_obj *gclass;
+ FILE *fp;
+ char *fullname, *filename;
+ char *wbuf, *p, *endptr;
+ long size, len;
+
+ filename = NEW(strlen(conf_name)+strlen(".otl")+1, char);
+ strcpy(filename, conf_name);
+ strcat(filename, ".otl");
+#ifdef MIKTEX
+ if (!miktex_find_app_input_file("dvipdfm", filename, work_buffer))
+ fullname = NULL;
+ else {
+ fullname = work_buffer;
+ }
+#else /* !MIKTEX */
+ fullname = kpse_find_file(filename, kpse_program_text_format, 0);
+#endif
+ RELEASE(filename);
+ if (!fullname) {
+ WARN("Layout file %s not found.", conf_name);
+ return NULL;
+ }
+
+ fp = MFOPEN(fullname, FOPEN_RBIN_MODE);
+ if (!fp) {
+ RELEASE(fullname);
+ return NULL;
+ }
+
+ size = file_size(fp);
+ rewind(fp);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("\n");
+ MESG("otl_conf>> Layout config. \"%s\" found: file=\"%s\" (%ld bytes)\n",
+ conf_name, fullname, size);
+ }
+ if (size < 1)
+ return NULL;
+
+ wbuf = NEW(size, char);
+ p = wbuf; endptr = p + size;
+ while (size > 0 && p < endptr) {
+ len = fread(p, sizeof(char), size, fp);
+ p += len;
+ size -= len;
+ }
+
+ p = wbuf;
+ gclass = pdf_new_dict();
+ rule = parse_block(gclass, &p, endptr);
+ pdf_release_obj(gclass);
+
+ RELEASE(wbuf);
+
+ return rule;
+}
+
+static pdf_obj *otl_confs = NULL;
+
+pdf_obj *
+otl_find_conf (const char *conf_name)
+{
+ pdf_obj *rule;
+ pdf_obj *script, *language;
+ pdf_obj *options;
+
+ return NULL;
+
+ if (otl_confs)
+ rule = pdf_lookup_dict(otl_confs, conf_name);
+ else {
+ otl_confs = pdf_new_dict();
+ rule = NULL;
+ }
+
+ if (!rule) {
+ rule = otl_read_conf(conf_name);
+ if (rule) {
+ pdf_add_dict(otl_confs,
+ pdf_new_name(conf_name), rule);
+ script = pdf_lookup_dict(rule, "script");
+ language = pdf_lookup_dict(rule, "language");
+ options = pdf_lookup_dict(rule, "option");
+ if (!script) {
+ script = pdf_new_string("*", 1);
+ pdf_add_dict(rule,
+ pdf_new_name("script"),
+ script);
+ WARN("Script unspecified in \"%s\"...", conf_name);
+ }
+ if (!language) {
+ language = pdf_new_string("dflt", 4);
+ pdf_add_dict(rule,
+ pdf_new_name("language"),
+ language);
+ WARN("Language unspecified in \"%s\"...", conf_name);
+ }
+
+ if (options) {
+ pdf_obj *optkeys, *opt, *key;
+ long i, num_opts;
+
+ optkeys = pdf_dict_keys(options);
+ num_opts = pdf_array_length(optkeys);
+ for (i = 0; i < num_opts; i++) {
+ key = pdf_get_array(optkeys, i);
+ opt = pdf_lookup_dict(options, pdf_name_value(key));
+ if (!pdf_lookup_dict(opt, "script"))
+ pdf_add_dict(opt,
+ pdf_new_name("script"),
+ pdf_link_obj(script));
+ if (!pdf_lookup_dict(opt, "language"))
+ pdf_add_dict(opt,
+ pdf_new_name("language"),
+ pdf_link_obj(language));
+ }
+ pdf_release_obj(optkeys);
+ }
+
+ }
+ }
+
+ return rule;
+}
+
+
+char *
+otl_conf_get_script (pdf_obj *conf)
+{
+ pdf_obj *script;
+
+ ASSERT(conf);
+
+ script = pdf_lookup_dict(conf, "script");
+
+ return pdf_string_value(script);
+}
+
+char *
+otl_conf_get_language (pdf_obj *conf)
+{
+ pdf_obj *language;
+
+ ASSERT(conf);
+
+ language = pdf_lookup_dict(conf, "language");
+
+ return pdf_string_value(language);
+}
+
+pdf_obj *
+otl_conf_get_rule (pdf_obj *conf)
+{
+ ASSERT(conf);
+ return pdf_lookup_dict(conf, "rule");
+}
+
+pdf_obj *
+otl_conf_find_opt (pdf_obj *conf, const char *opt_tag)
+{
+ pdf_obj *opt_conf = NULL;
+ pdf_obj *options;
+
+ ASSERT(conf);
+
+ options = pdf_lookup_dict(conf, "option");
+ if (options && opt_tag)
+ opt_conf = pdf_lookup_dict(options, opt_tag);
+ else
+ opt_conf = NULL;
+
+ return opt_conf;
+}
+
+void
+otl_init_conf (void)
+{
+ if (otl_confs)
+ pdf_release_obj(otl_confs);
+ otl_confs = pdf_new_dict();
+
+ if (verbose > VERBOSE_LEVEL_MIN + 10) {
+ pdf_release_obj(pdf_ref_obj(otl_confs));
+ }
+}
+
+void
+otl_close_conf (void)
+{
+ pdf_release_obj(otl_confs);
+ otl_confs = NULL;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/otl_conf.h b/Build/source/texk/xdvipdfmx/src/otl_conf.h
new file mode 100644
index 00000000000..bf63303ae42
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/otl_conf.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/otl_conf.h,v 1.1 2004/08/22 10:26:24 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _OTL_CONF_H_
+#define _OTL_CONF_H_
+
+extern void otl_conf_set_verbose (void);
+
+extern pdf_obj *otl_find_conf (const char *conf_name);
+extern void otl_init_conf (void);
+extern void otl_close_conf (void);
+
+extern pdf_obj *otl_conf_get_class (pdf_obj *conf, const char *ident);
+
+extern char *otl_conf_get_script (pdf_obj *conf);
+extern char *otl_conf_get_language (pdf_obj *conf);
+extern pdf_obj *otl_conf_get_rule (pdf_obj *conf);
+extern pdf_obj *otl_conf_find_opt (pdf_obj *conf, const char *opt_tag);
+
+#endif /* _OTL_CONF_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/otl_opt.c b/Build/source/texk/xdvipdfmx/src/otl_opt.c
new file mode 100644
index 00000000000..3ccab257ea0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/otl_opt.c
@@ -0,0 +1,343 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/otl_opt.c,v 1.3 2004/08/22 10:26:24 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifdef _HAVE_CONFIG_H
+#include "config.h"
+#endif /* _HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+#include "mfileio.h"
+
+#include "otl_opt.h"
+
+struct bt_node {
+ int flag;
+
+ struct bt_node *left;
+ struct bt_node *right;
+
+ char data[4];
+};
+
+#define FLAG_NOT (1 << 0)
+#define FLAG_AND (1 << 1)
+
+static int match_expr (struct bt_node *expr, const char *key);
+static int
+match_expr (struct bt_node *expr, const char *key)
+{
+ int retval = 1;
+ int i;
+
+ if (expr) {
+ if (!expr->left && !expr->right) {
+ for (i = 0; i < 4; i++) {
+ if (expr->data[i] != '?' &&
+ expr->data[i] != key[i]) {
+ retval = 0;
+ break;
+ }
+ }
+ } else {
+ if (expr->left) {
+ retval = match_expr(expr->left, key);
+ }
+ if (expr->right) {
+ if (retval && (expr->flag & FLAG_AND)) /* and */
+ retval &= match_expr(expr->right, key);
+ else if (!retval && !(expr->flag & FLAG_AND)) /* or */
+ retval = match_expr(expr->right, key);
+ }
+ }
+ if (expr->flag & FLAG_NOT) /* not */
+ retval = retval ? 0 : 1;
+
+ }
+
+ return retval;
+}
+
+static struct bt_node *
+bt_new_tree (void)
+{
+ struct bt_node *expr;
+
+ expr = NEW(1, struct bt_node);
+ expr->flag = 0;
+ expr->left = NULL;
+ expr->right = NULL;
+ memset(expr->data, 0, 4);
+
+ return expr;
+}
+
+static void bt_release_tree (struct bt_node *tree);
+
+static void
+bt_release_tree (struct bt_node *tree)
+{
+ if (tree) {
+ if (tree->left)
+ bt_release_tree(tree->left);
+ if (tree->right)
+ bt_release_tree(tree->right);
+ RELEASE(tree);
+ }
+}
+
+static struct bt_node *
+parse_expr (char **pp, char *endptr)
+{
+ struct bt_node *root, *curr;
+
+ if (*pp >= endptr)
+ return NULL;
+
+ root = curr = bt_new_tree();
+ while (*pp < endptr) {
+ switch (**pp) {
+ case '!':
+ if (curr->flag & 2)
+ curr->flag &= ~FLAG_NOT;
+ else
+ curr->flag |= FLAG_NOT;
+ (*pp)++;
+ break;
+ case '(':
+ (*pp)++;
+ if (*pp < endptr) {
+ struct bt_node *expr;
+
+ expr = parse_expr(pp, endptr);
+ if (!expr) {
+ WARN("Syntax error: %s\n", *pp);
+ return NULL;
+ }
+ if (**pp != ')') {
+ WARN("Syntax error: Unbalanced ()\n");
+ return NULL;
+ }
+ curr->left = expr->left;
+ curr->right = expr->right;
+ memcpy(curr->data, expr->data, 4);
+
+ RELEASE(expr);
+ } else {
+ WARN("Syntax error: Unbalanced ()\n");
+ bt_release_tree(root);
+ return NULL;
+ }
+ (*pp)++;
+ break;
+ case ')':
+ return root;
+ break;
+ case '|': case '&':
+ if (*pp >= endptr) {
+ WARN("Syntax error: %s\n", *pp);
+ bt_release_tree(root);
+ return NULL;
+ } else {
+ struct bt_node *tmp;
+
+ tmp = bt_new_tree();
+ tmp->left = root;
+ tmp->right = curr = bt_new_tree();
+ if (**pp == '&')
+ tmp->flag = 1;
+ else
+ tmp->flag = 0;
+ root = tmp;
+ }
+ (*pp)++;
+ break;
+ case '*':
+ memset(curr->data, '?', 4);
+ (*pp)++;
+ break;
+ default:
+ if (*pp + 4 <= endptr) {
+ int i;
+
+ for (i = 0; i < 4; i++) {
+ if (**pp == ' ' || **pp == '?' ||
+ isalpha(**pp) || isdigit(**pp))
+ curr->data[i] = **pp;
+ else if (**pp == '_')
+ curr->data[i] = ' ';
+ else {
+ WARN("Invalid char in tag: %c\n", **pp);
+ bt_release_tree(root);
+ return NULL;
+ }
+ (*pp)++;
+ }
+ } else {
+ WARN("Syntax error: %s\n", *pp);
+ bt_release_tree(root);
+ return NULL;
+ }
+ break;
+ }
+ }
+
+ return root;
+}
+
+
+struct otl_opt
+{
+ struct bt_node *rule;
+};
+
+otl_opt *
+otl_new_opt (void)
+{
+ struct otl_opt *opt;
+
+ opt = NEW(1, struct otl_opt);
+ opt->rule = NULL;
+
+ return (otl_opt *) opt;
+}
+
+
+void
+otl_release_opt (otl_opt *opt)
+{
+ if (opt->rule) {
+ bt_release_tree(opt->rule);
+ }
+ opt->rule = NULL;
+ RELEASE(opt);
+}
+
+#if 0
+struct lv_range
+{
+ long start, end;
+};
+
+struct uc_coverage
+{
+ long count;
+ struct lv_range *ranges;
+};
+
+static int CDECL
+range_cmp (const void *v1, const void *v2)
+{
+ struct lv_range *sv1, *sv2;
+
+ sv1 = (struct lv_range *) v1;
+ sv2 = (struct lv_range *) v2;
+
+ if (sv1->start < sv2->start)
+ return -1;
+ else
+ return 1;
+
+ return 0;
+}
+
+static int CDECL
+range_overlap (const void *v1, const void *v2)
+{
+ struct lv_range *sv1, *sv2;
+
+ sv1 = (struct lv_range *) v1;
+ sv2 = (struct lv_range *) v2;
+
+ /* Must be first sort in increasing start order */
+ if (sv1->end >= sv2->start)
+ return 0;
+ else if (sv1->end < sv2->start)
+ return -1;
+
+ return 1;
+}
+
+static void
+check_uc_coverage (struct uc_coverage *coverage)
+{
+ struct lv_range *r1, *r2;
+ long i;
+
+ for (i = 0; i < coverage->count; i++) {
+ r1 = &coverage->ranges[i];
+ r2 = bsearch(r1, coverage->ranges,
+ coverage->count, sizeof(struct lv_range),
+ range_overlap);
+ if (r2 && r1 != r2) {
+ WARN("Overlapping Unicode range found:");
+ WARN("[%x-%x], [%x-%x] ==> [%x-%x]",
+ r1->start, r1->end, r2->start, r2->end,
+ MIN(r1->start, r2->start), MAX(r1->end, r2->end));
+ r2->start = MIN(r1->start, r2->start);
+ r2->end = MAX(r1->end , r2->end );
+ if (i < coverage->count - 1) {
+ memmove(&coverage->ranges[i], &coverage->ranges[i+1],
+ (coverage->count - i - 1) * sizeof(struct lv_range));
+ coverage->count -= 1;
+ }
+ }
+ }
+ /* ... */
+ if (coverage->count == 0) {
+ RELEASE(coverage->ranges);
+ coverage->ranges = NULL;
+ }
+}
+#endif
+
+int
+otl_parse_optstring (otl_opt *opt, const char *optstr)
+{
+ char *p, *endptr;
+
+ ASSERT(opt);
+
+ if (optstr) {
+ p = (char *) optstr;
+ endptr = p + strlen(optstr);
+ opt->rule = parse_expr(&p, endptr);
+ }
+
+ return 0;
+}
+
+int
+otl_match_optrule (otl_opt *opt, const char *tag)
+{
+ ASSERT(tag);
+
+ if (!opt || !opt->rule)
+ return 1;
+
+ return match_expr(opt->rule, tag);
+}
diff --git a/Build/source/texk/xdvipdfmx/src/otl_opt.h b/Build/source/texk/xdvipdfmx/src/otl_opt.h
new file mode 100644
index 00000000000..b3442dfc101
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/otl_opt.h
@@ -0,0 +1,37 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/otl_opt.h,v 1.3 2004/08/22 10:26:24 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _OTL_OPT_H_
+#define _OTL_OPT_H_
+
+
+typedef struct otl_opt otl_opt;
+
+#define OTL_OPTSTR_SEP '+'
+
+extern otl_opt *otl_new_opt (void);
+extern void otl_release_opt (otl_opt *opt);
+
+extern int otl_parse_optstring (otl_opt *opt, const char *optstr);
+extern int otl_match_optrule (otl_opt *opt, const char *tag);
+
+#endif /* _OTL_OPT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfcolor.c b/Build/source/texk/xdvipdfmx/src/pdfcolor.c
new file mode 100644
index 00000000000..0e0162f04ce
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfcolor.c
@@ -0,0 +1,1644 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfcolor.c,v 1.11 2005/08/18 04:36:20 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/* No page independence here...
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+
+#include "pdfdoc.h"
+#include "pdfdev.h"
+
+#include "pdfcolor.h"
+
+
+static int verbose = 0;
+void
+pdf_color_set_verbose (void)
+{
+ verbose++;
+}
+
+int
+pdf_color_rgbcolor (pdf_color *color, double r, double g, double b)
+{
+ ASSERT(color);
+
+ if (r < 0.0 || r > 1.0) {
+ WARN("Invalid color value specified: red=%g", r);
+ return -1;
+ }
+ if (g < 0.0 || g > 1.0) {
+ WARN("Invalid color value specified: green=%g", g);
+ return -1;
+ }
+ if (b < 0.0 || b > 1.0) {
+ WARN("Invalid color value specified: blue=%g", b);
+ return -1;
+ }
+ color->values[0] = r;
+ color->values[1] = g;
+ color->values[2] = b;
+
+ color->num_components = 3;
+
+ return 0;
+}
+
+int
+pdf_color_cmykcolor (pdf_color *color,
+ double c, double m, double y, double k)
+{
+ ASSERT(color);
+
+ if (c < 0.0 || c > 1.0) {
+ WARN("Invalid color value specified: cyan=%g", c);
+ return -1;
+ }
+ if (m < 0.0 || m > 1.0) {
+ WARN("Invalid color value specified: magenta=%g", m);
+ return -1;
+ }
+ if (y < 0.0 || y > 1.0) {
+ WARN("Invalid color value specified: yellow=%g", y);
+ return -1;
+ }
+ if (k < 0.0 || k > 1.0) {
+ WARN("Invalid color value specified: black=%g", k);
+ return -1;
+ }
+
+ color->values[0] = c;
+ color->values[1] = m;
+ color->values[2] = y;
+ color->values[3] = k;
+
+ color->num_components = 4;
+
+ return 0;
+}
+
+int
+pdf_color_graycolor (pdf_color *color, double g)
+{
+ ASSERT(color);
+
+ if (g < 0.0 || g > 1.0) {
+ WARN("Invalid color value specified: gray=%g", g);
+ return -1;
+ }
+
+ color->values[0] = g;
+
+ color->num_components = 1;
+
+ return 0;
+}
+
+
+void
+pdf_color_copycolor (pdf_color *color1, const pdf_color *color2)
+{
+ ASSERT(color1 && color2);
+
+ memcpy(color1, color2, sizeof(pdf_color));
+}
+
+int
+pdf_color_is_white (pdf_color *color)
+{
+ int is_white = 0;
+
+ ASSERT(color);
+
+ switch (color->num_components) {
+ case 1:
+ if (color->values[0] == 1.0)
+ is_white = 1;
+ break;
+ case 4:
+ if (color->values[0] == 0.0 &&
+ color->values[1] == 0.0 &&
+ color->values[2] == 0.0 &&
+ color->values[3] == 0.0) {
+ is_white = 1;
+ }
+ break;
+ case 3:
+ if (color->values[0] == 1.0 &&
+ color->values[1] == 1.0 &&
+ color->values[2] == 1.0) {
+ is_white = 1;
+ }
+ break;
+ default:
+ is_white = 0;
+ break;
+ }
+
+ return is_white;
+}
+
+pdf_color current_fill = {
+ 1,
+ {0.0, 0.0, 0.0, 0.0}
+};
+
+pdf_color current_stroke = {
+ 1,
+ {0.0, 0.0, 0.0, 0.0}
+};
+
+#if 0
+/*
+ * This routine is not a real color matching.
+ */
+static int
+compare_color (const pdf_color *color1, const pdf_color *color2)
+{
+ if (color1->num_components != color2->num_components)
+ return -1;
+
+ switch (color1->num_components) {
+ case 4:
+ if (color1->values[0] == color2->values[0] &&
+ color1->values[1] == color2->values[1] &&
+ color1->values[2] == color2->values[2] &&
+ color1->values[3] == color2->values[3])
+ return 0;
+ break;
+ case 3:
+ if (color1->values[0] == color2->values[0] &&
+ color1->values[1] == color2->values[1] &&
+ color1->values[2] == color2->values[2])
+ return 0;
+ break;
+ case 1:
+ if (color1->values[0] == color2->values[0])
+ return 0;
+ break;
+ }
+
+ return -1;
+}
+#endif
+
+static int
+valid_color_values (pdf_color *validated, const pdf_color *color)
+{
+ int i, num_components = 0;
+
+ num_components = color->num_components;
+ if (num_components != 1 &&
+ num_components != 3 &&
+ num_components != 4) {
+ ERROR("Only RGB/CMYK/Gray currently supported.");
+ return -1;
+ }
+
+ for (i = 0; i < num_components; i++) {
+ if (color->values[i] < 0.0 || color->values[i] > 1.0) {
+ WARN("Invalid color value: %g", color->values[i]);
+ return -1;
+ } else {
+ validated->values[i] = color->values[i];
+ }
+ }
+ validated->num_components = color->num_components;
+
+ return 0;
+}
+
+int
+pdf_dev_currentcolor (pdf_color *color, int is_fill)
+{
+ ASSERT(color);
+
+ if (is_fill) {
+ memcpy(color, &current_fill, sizeof(pdf_color));
+ } else {
+ memcpy(color, &current_stroke, sizeof(pdf_color));
+ }
+
+ return 0;
+}
+
+int
+pdf_dev_setcolor (const pdf_color *color, int is_fill)
+{
+ int len = 0, colormode;
+ int i;
+ char format_buffer[128];
+ pdf_color validated;
+
+ if (!color) {
+ WARN("No color specified.");
+ return -1;
+ }
+
+ colormode = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE);
+ if (!colormode) {
+ WARN("setcolor ignored. (Ignore color option set)");
+ return 0;
+ }
+
+ if (valid_color_values(&validated, color) < 0) {
+ return -1;
+ }
+
+#if 0
+ /* There are much problems in this :( */
+ if (is_fill) {
+ if (!compare_color(&validated, &current_fill)) {
+ return 0;
+ }
+ } else {
+ if (!compare_color(&validated, &current_stroke)) {
+ return 0;
+ }
+ }
+#endif
+
+ graphics_mode();
+
+ for (i = 0; i < validated.num_components; i++) {
+ len = sprintf(format_buffer, " %g", ROUND(validated.values[i], 0.01));
+ pdf_doc_add_page_content(format_buffer, len);
+ }
+
+ switch (validated.num_components) {
+ case 3:
+ pdf_doc_add_page_content((is_fill ? " rg" : " RG"), 3);
+ break;
+ case 4:
+ pdf_doc_add_page_content((is_fill ? " k" : " K" ), 2);
+ break;
+ case 1:
+ pdf_doc_add_page_content((is_fill ? " g" : " G" ), 2);
+ break;
+ default:
+ ERROR("Only RGB/CMYK/Gray currently supported.");
+ return -1;
+ break;
+ }
+
+ if (is_fill) {
+ memcpy(&current_fill, &validated, sizeof(pdf_color));
+ } else {
+ memcpy(&current_stroke, &validated, sizeof(pdf_color));
+ }
+
+ return 0;
+}
+
+
+/* Dvipdfm special */
+pdf_color default_color = {
+ 1,
+ {0.0, 0.0, 0.0, 0.0}
+};
+
+void
+pdf_color_set_default (const pdf_color *color)
+{
+ ASSERT(color);
+
+ memcpy(&default_color, color, sizeof(pdf_color));
+}
+
+
+/*
+ * Having color stack here is wrong.
+ * dvi.c or XXX_special should treat this.
+ */
+#define DEV_COLOR_STACK_MAX 128
+
+static struct {
+ int next;
+ pdf_color stroke[DEV_COLOR_STACK_MAX];
+ pdf_color fill[DEV_COLOR_STACK_MAX];
+} color_stack = {
+ 0,
+};
+
+void
+pdf_dev_reset_color (void)
+{
+ int colormode;
+ pdf_color fillcolor, strokecolor;
+
+ /* Shouldn't give a warning */
+ colormode = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE);
+ if (!colormode) {
+ return;
+ }
+
+ if (color_stack.next > 0) {
+ strokecolor = current_stroke;
+ fillcolor = current_fill;
+ } else {
+ strokecolor = default_color;
+ fillcolor = default_color;
+ }
+#if 0
+ pdf_color_graycolor(&current_stroke, 0.0);
+ pdf_color_graycolor(&current_fill, 0.0);
+#endif
+
+ pdf_dev_setcolor(&strokecolor, 0);
+ pdf_dev_setcolor(&fillcolor, 1);
+
+ return;
+}
+
+
+void
+pdf_color_clear (void)
+{
+ color_stack.next = 0;
+}
+
+void
+pdf_color_push (void)
+{
+ int current;
+
+ current = color_stack.next;
+ if (current >= DEV_COLOR_STACK_MAX) {
+ WARN("Exceeded depth of color stack.");
+ return;
+ }
+
+ memcpy(&color_stack.stroke[current],
+ &current_stroke, sizeof(pdf_color));
+ memcpy(&color_stack.fill[current],
+ &current_fill , sizeof(pdf_color));
+
+ color_stack.next += 1;
+
+ return;
+}
+
+void
+pdf_color_pop (void)
+{
+ int current;
+
+ current = --(color_stack.next);
+
+ if (current < 0) {
+ WARN("End color with no corresponding begin color.");
+ /*
+ * In the case of mismatched push and pop, color_stack.next must set
+ * to be the default value, 0. Otherwise causes segmentation fault
+ * in the next push command.
+ */
+ pdf_color_clear();
+ return;
+ }
+
+ pdf_dev_setcolor(&color_stack.stroke[current], 0);
+ pdf_dev_setcolor(&color_stack.fill[current] , 1);
+
+ return;
+}
+
+/***************************** COLOR SPACE *****************************/
+
+static int pdf_colorspace_defineresource (const char *ident,
+ int subtype,
+ void *cdata, pdf_obj *resource);
+
+static int pdf_colorspace_findresource (const char *ident,
+ int subtype, const void *cdata);
+
+#if 0
+struct calgray_cdata
+{
+ double white_point[3]; /* required, second component must
+ * be equal to 1.0
+ */
+ double black_point[3]; /* optional, default: [0 0 0] */
+ double gamma; /* optional, default: 1.0 */
+};
+
+struct calrgb_cdata
+{
+ double white_point[3]; /* required, second component must
+ * be equal to 1.0
+ */
+ double black_point[3]; /* optional, default: [0 0 0] */
+ double gamma[3]; /* optional, default: [1 1 1] */
+ double matrix[9]; /* optional, default: identity
+ * [1 0 0 0 1 0 0 0 1]
+ */
+};
+
+static void
+release_calrgb (void *cdata)
+{
+ struct calrgb_cdata *calrgb;
+
+ if (cdata) {
+ calrgb = (struct calrgb_cdata *) cdata;
+ RELEASE(calrgb);
+ }
+}
+
+static int
+compare_calrgb (const char *ident1, const void *cdata1,
+ const char *ident2, const void *cdata2)
+{
+ struct calrgb_cdata *calrgb1;
+ struct calrgb_cdata *calrgb2;
+
+ if (ident1 && ident2 &&
+ !strcmp(ident1, ident2)) {
+ return 0;
+ }
+}
+
+static void
+init_calrgb (struct calrgb_cdata *calrgb)
+{
+ ASSERT(calrgb);
+
+ calrgb->white_point[0] = 1.0;
+ calrgb->white_point[1] = 1.0;
+ calrgb->white_point[2] = 1.0;
+
+ calrgb->black_point[0] = 0.0;
+ calrgb->black_point[1] = 0.0;
+ calrgb->black_point[2] = 0.0;
+
+ calrgb->gamma[0] = 1.0;
+ calrgb->gamma[1] = 1.0;
+ calrgb->gamma[2] = 1.0;
+
+ calrgb->matrix[0] = 1.0;
+ calrgb->matrix[1] = 0.0;
+ calrgb->matrix[2] = 0.0;
+
+ calrgb->matrix[3] = 0.0;
+ calrgb->matrix[4] = 1.0;
+ calrgb->matrix[5] = 0.0;
+
+ calrgb->matrix[6] = 0.0;
+ calrgb->matrix[7] = 0.0;
+ calrgb->matrix[8] = 1.0;
+}
+
+static int
+valid_calrgb (struct calrgb_cdata *calrgb)
+{
+ if (calrgb->white_point[1] != 1.0 ||
+ calrgb->white_point[0] <= 0.0 ||
+ calrgb->white_point[2] <= 0.0)
+ return 0;
+
+ if (calrgb->black_point[0] < 0.0 ||
+ calrgb->black_point[1] < 0.0 ||
+ calrgb->black_point[2] < 0.0)
+ return 0;
+
+ if (calrgb->gamma[0] < 0.0 ||
+ calrgb->gamma[1] < 0.0 ||
+ calrgb->gamma[2] < 0.0)
+ return 0;
+
+ /* matrix should be invertible? */
+
+ return 1;
+}
+
+static pdf_obj *
+pdf_color_make_calrgb_resource (struct calrgb_cdata *calrgb)
+{
+ pdf_obj *colorspace;
+ pdf_obj *calparams, *tmp_array;
+
+ ASSERT(calrgb);
+
+ if (!valid_calrgb(calrgb))
+ return NULL;
+
+ colorspace = pdf_new_array();
+ calparams = pdf_new_dict();
+
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->white_point[0], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(1.0));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->white_point[2], 0.001)));
+ pdf_add_dict(calparams, pdf_new_name("WhitePoint"), tmp_array);
+
+ if (calrgb->black_point[0] != 0.0 ||
+ calrgb->black_point[1] != 0.0 ||
+ calrgb->black_point[2] != 0.0) {
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->black_point[0], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->black_point[1], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->black_point[2], 0.001)));
+ pdf_add_dict(calparams, pdf_new_name("BlackPoint"), tmp_array);
+ }
+
+ if (calrgb->gamma[0] != 1.0 ||
+ calrgb->gamma[1] != 1.0 ||
+ calrgb->gamma[2] != 1.0) {
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->gamma[0], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->gamma[1], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->gamma[2], 0.001)));
+ pdf_add_dict(calparams, pdf_new_name("Gamma"), tmp_array);
+ }
+
+ if (calrgb->matrix[0] != 1.0 ||
+ calrgb->matrix[1] != 0.0 ||
+ calrgb->matrix[2] != 0.0 ||
+ calrgb->matrix[3] != 0.0 ||
+ calrgb->matrix[4] != 1.0 ||
+ calrgb->matrix[5] != 0.0 ||
+ calrgb->matrix[6] != 0.0 ||
+ calrgb->matrix[7] != 0.0 ||
+ calrgb->matrix[8] != 1.0) {
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[0], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[1], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[2], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[3], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[4], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[5], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[6], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[7], 0.001)));
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(calrgb->matrix[8], 0.001)));
+ pdf_add_dict(calparams, pdf_new_name("Matrix"), tmp_array);
+ }
+
+ pdf_add_array(colorspace, pdf_new_name("CalRGB"));
+ pdf_add_array(colorspace, calparams);
+
+ return colorspace;
+}
+#endif
+
+static unsigned char nullbytes16[16] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static struct
+{
+ int major;
+ int minor;
+} icc_versions[] = {
+ {0, 0}, /* PDF-1.0, we don't support them */
+ {0, 0}, /* PDF-1.1, we don't support them */
+ {0, 0}, /* PDF-1.2, we don't support them */
+ {0x02, 0x10}, /* PDF-1.3 */
+ {0x02, 0x20}, /* PDF-1.4 */
+ {0x04, 0x00} /* PDF-1.5 */
+};
+
+static int
+iccp_version_supported (int major, int minor)
+{
+ int pdf_ver;
+
+ pdf_ver = pdf_get_version();
+ if (pdf_ver < 6) {
+ if (icc_versions[pdf_ver].major < major)
+ return 0;
+ else if (icc_versions[pdf_ver].major == major &&
+ icc_versions[pdf_ver].minor < minor)
+ return 0;
+ else {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+typedef unsigned long iccSig;
+static iccSig
+str2iccSig (const void *s)
+{
+ char *p;
+
+ p = (char *) s;
+
+ return (iccSig) ((p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]);
+}
+
+typedef struct
+{
+ long X, Y, Z; /* s15Fixed16Numeber */
+} iccXYZNumber;
+
+typedef struct
+{
+ long size;
+ iccSig CMMType;
+ long version;
+ iccSig devClass;
+ iccSig colorSpace;
+ iccSig PCS; /* Profile Connection Space */
+ char creationDate[12];
+ iccSig acsp;
+ iccSig platform;
+ char flags[4];
+ iccSig devMnfct;
+ iccSig devModel;
+ char devAttr[8];
+ long intent;
+ iccXYZNumber illuminant;
+ iccSig creator;
+ unsigned char ID[16]; /* MD5 checksum with Rendering intent,
+ * Header attrs, Profile ID fields are
+ * set to zeros.
+ */
+ /* 28 bytes reserved - must be set to zeros */
+} iccHeader;
+
+#define iccNullSig 0
+static void
+iccp_init_iccHeader (iccHeader *icch)
+{
+ ASSERT(icch);
+
+ icch->size = 0;
+ icch->CMMType = iccNullSig;
+ icch->version = 0xFFFFFF;
+ icch->devClass = iccNullSig;
+ icch->colorSpace = iccNullSig;
+ icch->PCS = iccNullSig;
+ memset(icch->creationDate, 0, 12);
+ icch->acsp = str2iccSig("ascp");
+ icch->platform = iccNullSig;
+ memset(icch->flags, 0, 4);
+ icch->devMnfct = iccNullSig;
+ icch->devModel = iccNullSig;
+ memset(icch->devAttr, 0, 8);
+ icch->intent = 0;
+ icch->illuminant.X = 0;
+ icch->illuminant.Y = 0;
+ icch->illuminant.Z = 0;
+ icch->creator = iccNullSig;
+ memset(icch->ID, 0, 16);
+}
+
+#define ICC_INTENT_TYPE(n) ((int) (((n) >> 16) & 0xff))
+#define ICC_INTENT_PERCEPTUAL 0
+#define ICC_INTENT_RELATIVE 1
+#define ICC_INTENT_SATURATION 2
+#define ICC_INTENT_ABSOLUTE 3
+
+/*
+ * In ICC profile stream dicrionary, there is /Range whose values must
+ * "match the information in the profile". But where is those values in?
+ *
+ * How should I treat rendering intent?
+ */
+struct iccbased_cdata
+{
+ long sig; /* 'i' 'c' 'c' 'b' */
+
+ unsigned char checksum[16]; /* 16 bytes MD5 Checksum */
+ int colorspace; /* input colorspace:
+ * RGB, Gray, CMYK, (Lab?)
+ */
+ int alternate; /* alternate colorspace (id), unused */
+};
+
+#define check_sig(d,p,q,r,s) ((d) && (d)->sig == ((p)<<24|(q)<<16|(r)<<8|(s)))
+
+static void
+init_iccbased_cdata (struct iccbased_cdata *cdata)
+{
+ ASSERT(cdata);
+
+ cdata->sig = ('i' << 24|'c' << 16|'c' << 8|'b');
+ memset(cdata->checksum, 0, 16);
+ cdata->colorspace = PDF_COLORSPACE_TYPE_INVALID;
+ cdata->alternate = -1;
+
+ return;
+}
+
+static void
+release_iccbased_cdata (struct iccbased_cdata *cdata)
+{
+ ASSERT(check_sig(cdata, 'i', 'c', 'c', 'b'));
+
+ RELEASE(cdata);
+}
+
+static int
+get_num_components_iccbased (const struct iccbased_cdata *cdata)
+{
+ int num_components = 0;
+
+ ASSERT(check_sig(cdata, 'i', 'c', 'c', 'b'));
+
+ switch (cdata->colorspace) {
+ case PDF_COLORSPACE_TYPE_RGB:
+ num_components = 3;
+ break;
+ case PDF_COLORSPACE_TYPE_CMYK:
+ num_components = 4;
+ break;
+ case PDF_COLORSPACE_TYPE_GRAY:
+ num_components = 1;
+ break;
+ case PDF_COLORSPACE_TYPE_CIELAB:
+ num_components = 3;
+ break;
+ }
+
+ return num_components;
+}
+
+static int
+compare_iccbased (const char *ident1, const struct iccbased_cdata *cdata1,
+ const char *ident2, const struct iccbased_cdata *cdata2)
+{
+ if (cdata1 && cdata2) {
+
+ ASSERT(check_sig(cdata1, 'i', 'c', 'c', 'b'));
+ ASSERT(check_sig(cdata2, 'i', 'c', 'c', 'b'));
+
+ if (memcmp(cdata1->checksum, nullbytes16, 16) &&
+ memcmp(cdata2->checksum, nullbytes16, 16)) {
+ return memcmp(cdata1->checksum, cdata2->checksum, 16);
+ }
+ if (cdata1->colorspace != cdata2->colorspace) {
+ return (cdata1->colorspace - cdata2->colorspace);
+ }
+
+ /* Continue if checksum unknown and colorspace is same. */
+ }
+
+ if (ident1 && ident2)
+ return strcmp(ident1, ident2);
+
+ /* No way to compare */
+ return -1;
+}
+
+int
+iccp_check_colorspace (int colortype, const void *profile, long proflen)
+{
+ iccSig colorspace;
+ unsigned char *p;
+
+ if (!profile || proflen < 128)
+ return -1;
+
+ p = (unsigned char *) profile;
+
+ colorspace = str2iccSig(p + 16);
+
+ switch (colortype) {
+ case PDF_COLORSPACE_TYPE_CALRGB:
+ case PDF_COLORSPACE_TYPE_RGB:
+ if (colorspace != str2iccSig("RGB ")) {
+ return -1;
+ }
+ break;
+ case PDF_COLORSPACE_TYPE_CALGRAY:
+ case PDF_COLORSPACE_TYPE_GRAY:
+ if (colorspace != str2iccSig("GRAY")) {
+ return -1;
+ }
+ break;
+ case PDF_COLORSPACE_TYPE_CMYK:
+ if (colorspace != str2iccSig("CMYK")) {
+ return -1;
+ }
+ break;
+ default:
+ return -1;
+ break;
+ }
+
+ return 0;
+}
+
+pdf_obj *
+iccp_get_rendering_intent (const void *profile, long proflen)
+{
+ pdf_obj *ri = NULL;
+ unsigned char *p;
+ long intent;
+
+ if (!profile || proflen < 128)
+ return NULL;
+
+ p = (unsigned char *) profile;
+
+ intent = (p[64] << 24)|(p[65] << 16)|(p[66] << 8)|p[67];
+ switch (ICC_INTENT_TYPE(intent)) {
+ case ICC_INTENT_SATURATION:
+ ri = pdf_new_name("Saturation");
+ break;
+ case ICC_INTENT_PERCEPTUAL:
+ ri = pdf_new_name("Perceptual");
+ break;
+ case ICC_INTENT_ABSOLUTE:
+ ri = pdf_new_name("AbsoluteColorimetric");
+ break;
+ case ICC_INTENT_RELATIVE:
+ ri = pdf_new_name("RelativeColorimetric");
+ break;
+ default:
+ WARN("Invalid rendering intent type: %d", ICC_INTENT_TYPE(intent));
+ ri = NULL;
+ }
+
+ return ri;
+}
+
+#define sget_signed_long(p) ((long) ((p)[0] << 24|(p)[1] << 16|(p)[2] << 8|(p)[3]))
+#define sget_signed_short(p) ((short) ((p)[0] << 8|(p)[1]))
+#define get_iccSig(p) ((iccSig) ((p)[0] << 24|(p)[1] << 16|(p)[2] << 8|(p)[3]))
+
+static int
+iccp_unpack_header (iccHeader *icch,
+ const void *profile, long proflen, int check_size)
+{
+ unsigned char *p, *endptr;
+
+ if (check_size) {
+ if (!profile || proflen < 128 ||
+ proflen % 4 != 0) {
+ WARN("Profile size: %ld", proflen);
+ return -1;
+ }
+ }
+
+ p = (unsigned char *) profile;
+ endptr = p + 128;
+
+ icch->size = sget_signed_long(p);
+ if (check_size) {
+ if (icch->size != proflen) {
+ WARN("ICC Profile size: %ld(header) != %ld", icch->size, proflen);
+ return -1;
+ }
+ }
+ p += 4;
+
+ icch->CMMType = str2iccSig(p);
+ p += 4;
+ icch->version = sget_signed_long(p);
+ p += 4;
+ icch->devClass = str2iccSig(p);
+ p += 4;
+ icch->colorSpace = str2iccSig(p);
+ p += 4;
+ icch->PCS = str2iccSig(p);
+ p += 4;
+ memcpy(icch->creationDate, p, 12);
+ p += 12;
+ icch->acsp = str2iccSig(p); /* acsp */
+ if (icch->acsp != str2iccSig("acsp")) {
+ WARN("Invalid ICC profile: not \"acsp\" - %c%c%c%c ",
+ p[0], p[1], p[2], p[3]);
+ return -1;
+ }
+ p += 4;
+ icch->platform = str2iccSig(p);
+ p += 4;
+ memcpy(icch->flags, p, 4);
+ p += 4;
+ icch->devMnfct = str2iccSig(p);
+ p += 4;
+ icch->devModel = str2iccSig(p);
+ p += 4;
+ memcpy(icch->devAttr, p, 8);
+ p += 8;
+ icch->intent = (p[0] << 24)|(p[1] << 16)|(p[2] << 8)|p[3];
+ p += 4;
+ icch->illuminant.X = sget_signed_long(p);
+ p += 4;
+ icch->illuminant.Y = sget_signed_long(p);
+ p += 4;
+ icch->illuminant.Z = sget_signed_long(p);
+ p += 4;
+ icch->creator = str2iccSig(p);
+ p += 4;
+ memcpy(icch->ID, p, 16);
+ p += 16;
+
+ /* 28 bytes reserved - must be set to zeros */
+ for (; p < endptr; p++) {
+ if (*p != '\0') {
+ WARN("Reserved pad not zero: %02x (at offset %ld in ICC profile header.)",
+ *p, 128 - ((long) (endptr - p)));
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/* MD5 checksum with Rendering intent,
+ * Header attrs, Profile ID fields are
+ * set to zeros.
+ */
+#define ICC_HEAD_SECT1_START 0
+#define ICC_HEAD_SECT1_LENGTH 56
+/* 8 bytes devAttr, 4 bytes intent */
+#define ICC_HEAD_SECT2_START 68
+#define ICC_HEAD_SECT2_LENGTH 16
+/* 16 bytes ID (checksum) */
+#define ICC_HEAD_SECT3_START 100
+#define ICC_HEAD_SECT3_LENGTH 28
+
+#include "dpxcrypt.h"
+static void
+iccp_get_checksum (unsigned char *checksum, const void *profile, long proflen)
+{
+ unsigned char *p;
+ MD5_CONTEXT md5;
+
+ p = (unsigned char *) profile;
+
+ MD5_init (&md5);
+ MD5_write(&md5, p + ICC_HEAD_SECT1_START, ICC_HEAD_SECT1_LENGTH);
+ MD5_write(&md5, nullbytes16, 12);
+ MD5_write(&md5, p + ICC_HEAD_SECT2_START, ICC_HEAD_SECT2_LENGTH);
+ MD5_write(&md5, nullbytes16, 16);
+ MD5_write(&md5, p + ICC_HEAD_SECT3_START, ICC_HEAD_SECT3_LENGTH);
+
+ /* body */
+ MD5_write(&md5, p + 128, proflen - 128);
+
+ MD5_final(checksum, &md5);
+}
+
+static void
+print_iccp_header (iccHeader *icch, unsigned char *checksum)
+{
+ int i;
+
+ ASSERT(icch);
+
+#define print_iccSig(s,t) if ((s) == 0) {\
+ MESG("pdf_color>> %s:\t(null)\n", (t)); \
+ } else if (!isprint(((s) >> 24) & 0xff) || \
+ !isprint(((s) >> 16) & 0xff) || \
+ !isprint(((s) >> 8) & 0xff) || \
+ !isprint((s) & 0xff)) { \
+ MESG("pdf_color>> %s:\t(invalid)\n", (t)); \
+ } else { \
+ MESG("pdf_color>> %s:\t%c%c%c%c\n", (t), \
+ ((s) >> 24) & 0xff, ((s) >> 16) & 0xff, \
+ ((s) >> 8) & 0xff, (s) & 0xff); \
+}
+
+ MESG("\n");
+ MESG("pdf_color>> ICC Profile Info\n");
+ MESG("pdf_color>> Profile Size:\t%ld bytes\n", icch->size);
+ print_iccSig(icch->CMMType, "CMM Type");
+ MESG("pdf_color>> Profile Version:\t%d.%01d.%01d\n",
+ (icch->version >> 24) & 0xff,
+ (icch->version >> 20) & 0x0f,
+ (icch->version >> 16) & 0x0f);
+ print_iccSig(icch->devClass, "Device Class");
+ print_iccSig(icch->colorSpace, "Color Space");
+ print_iccSig(icch->PCS, "Connection Space");
+ MESG("pdf_color>> Creation Date:\t");
+ for (i = 0; i < 12; i += 2) {
+ if (i == 0)
+ MESG("%04u",
+ sget_unsigned_pair((unsigned char *) icch->creationDate));
+ else {
+ MESG(":%02u",
+ sget_unsigned_pair((unsigned char *) (&icch->creationDate[i])));
+ }
+ }
+ MESG("\n");
+ print_iccSig(icch->platform, "Primary Platform");
+ MESG("pdf_color>> Profile Flags:\t%02x:%02x:%02x:%02x\n",
+ icch->flags[0], icch->flags[1], icch->flags[2], icch->flags[3]);
+ print_iccSig(icch->devMnfct, "Device Mnfct");
+ print_iccSig(icch->devModel, "Device Model");
+ MESG("pdf_color>> Device Attr:\t");
+ for (i = 0; i < 8; i++) {
+ if (i == 0)
+ MESG("%02x", icch->devAttr[i]);
+ else
+ MESG(":%02x", icch->devAttr[i]);
+ }
+ MESG("\n");
+ MESG("pdf_color>> Rendering Intent:\t");
+ switch (ICC_INTENT_TYPE(icch->intent)) {
+ case ICC_INTENT_SATURATION:
+ MESG("Saturation");
+ break;
+ case ICC_INTENT_PERCEPTUAL:
+ MESG("Perceptual");
+ break;
+ case ICC_INTENT_ABSOLUTE:
+ MESG("Absolute Colorimetric");
+ break;
+ case ICC_INTENT_RELATIVE:
+ MESG("Relative Colorimetric");
+ break;
+ default:
+ MESG("(invalid)");
+ break;
+ }
+ MESG("\n");
+ print_iccSig(icch->creator, "Creator");
+ MESG("pdf_color>> Illuminant (XYZ):\t");
+ MESG("%.3f %.3f %.3f\n",
+ (double) icch->illuminant.X / 0x10000,
+ (double) icch->illuminant.Y / 0x10000,
+ (double) icch->illuminant.Z / 0x10000);
+ MESG("pdf_color>> Checksum:\t");
+ if (!memcmp(icch->ID, nullbytes16, 16)) {
+ MESG("(null)");
+ } else {
+ for (i = 0; i < 16; i++) {
+ if (i == 0)
+ MESG("%02x", icch->ID[i]);
+ else
+ MESG(":%02x", icch->ID[i]);
+ }
+ }
+ MESG("\n");
+ if (checksum) {
+ MESG("pdf_color>> Calculated:\t");
+ for (i = 0; i < 16; i++) {
+ if (i == 0)
+ MESG("%02x", checksum[i]);
+ else
+ MESG(":%02x", checksum[i]);
+ }
+ MESG("\n");
+ }
+
+ return;
+}
+
+
+static int
+iccp_devClass_allowed (int dev_class)
+{
+ int colormode;
+
+ colormode = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE);
+
+ switch (colormode) {
+#if 0
+ case PDF_DEV_COLORMODE_PDFX1:
+ break;
+ case PDF_DEV_COLORMODE_PDFX3:
+ if (dev_class != str2iccSig("prtr")) {
+ return 0;
+ }
+ break;
+#endif
+ default:
+ if (dev_class != str2iccSig("scnr") &&
+ dev_class != str2iccSig("mntr") &&
+ dev_class != str2iccSig("prtr") &&
+ dev_class != str2iccSig("spac")) {
+ return 0;
+ }
+ break;
+ }
+
+
+ return 1;
+}
+
+int
+iccp_load_profile (const char *ident,
+ const void *profile, long proflen)
+{
+ int cspc_id;
+ pdf_obj *resource;
+ pdf_obj *stream;
+ pdf_obj *stream_dict;
+ iccHeader icch;
+ int colorspace;
+ unsigned char checksum[16];
+ struct iccbased_cdata *cdata;
+
+ iccp_init_iccHeader(&icch);
+ if (iccp_unpack_header(&icch, profile, proflen, 1) < 0) { /* check size */
+ WARN("Invalid ICC profile header in \"%s\"", ident);
+ print_iccp_header(&icch, NULL);
+ return -1;
+ }
+
+ if (!iccp_version_supported((icch.version >> 24) & 0xff,
+ (icch.version >> 16) & 0xff)) {
+ WARN("ICC profile format spec. version %d.%01d.%01d"
+ " not supported in current PDF version setting.",
+ (icch.version >> 24) & 0xff,
+ (icch.version >> 20) & 0x0f,
+ (icch.version >> 16) & 0x0f);
+ WARN("ICC profile not embedded.");
+ print_iccp_header(&icch, NULL);
+ return -1;
+ }
+
+ if (!iccp_devClass_allowed(icch.devClass)) {
+ WARN("Unsupported ICC Profile Device Class:");
+ print_iccp_header(&icch, NULL);
+ return -1;
+ }
+
+ if (icch.colorSpace == str2iccSig("RGB ")) {
+ colorspace = PDF_COLORSPACE_TYPE_RGB;
+ } else if (icch.colorSpace == str2iccSig("GRAY")) {
+ colorspace = PDF_COLORSPACE_TYPE_GRAY;
+ } else if (icch.colorSpace == str2iccSig("CMYK")) {
+ colorspace = PDF_COLORSPACE_TYPE_CMYK;
+ } else {
+ WARN("Unsupported input color space.");
+ print_iccp_header(&icch, NULL);
+ return -1;
+ }
+
+ iccp_get_checksum(checksum, profile, proflen);
+ if (memcmp(icch.ID, nullbytes16, 16) &&
+ memcmp(icch.ID, checksum, 16)) {
+ WARN("Invalid ICC profile: Inconsistent checksum.");
+ print_iccp_header(&icch, checksum);
+ return -1;
+ }
+
+ cdata = NEW(1, struct iccbased_cdata);
+ init_iccbased_cdata(cdata);
+ cdata->colorspace = colorspace;
+ memcpy(cdata->checksum, checksum, 16);
+
+ cspc_id = pdf_colorspace_findresource(ident,
+ PDF_COLORSPACE_TYPE_ICCBASED, cdata);
+ if (cspc_id >= 0) {
+ if (verbose)
+ MESG("(ICCP:[id=%d])", cspc_id);
+ release_iccbased_cdata(cdata);
+ return cspc_id;
+ }
+ if (verbose > 1) {
+ print_iccp_header(&icch, checksum);
+ }
+
+ resource = pdf_new_array();
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_array(resource, pdf_new_name("ICCBased"));
+ pdf_add_array(resource, pdf_ref_obj (stream));
+
+ stream_dict = pdf_stream_dict(stream);
+ pdf_add_dict(stream_dict, pdf_new_name("N"),
+ pdf_new_number(get_num_components_iccbased(cdata)));
+
+ pdf_add_stream (stream, profile, proflen);
+ pdf_release_obj(stream);
+
+ cspc_id = pdf_colorspace_defineresource(ident,
+ PDF_COLORSPACE_TYPE_ICCBASED,
+ cdata, resource);
+
+ return cspc_id;
+}
+
+#define WBUF_SIZE 4096
+static unsigned char wbuf[WBUF_SIZE];
+
+static pdf_obj *
+iccp_load_file_stream (unsigned char *checksum, long length, FILE *fp)
+{
+ pdf_obj *stream;
+ MD5_CONTEXT md5;
+ long nb_read;
+
+ rewind(fp);
+
+ if (fread(wbuf, 1, 128, fp) != 128) {
+ return NULL;
+ }
+ length -= 128;
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+
+ MD5_init (&md5);
+ MD5_write(&md5, wbuf + ICC_HEAD_SECT1_START, ICC_HEAD_SECT1_LENGTH);
+ MD5_write(&md5, nullbytes16, 12);
+ MD5_write(&md5, wbuf + ICC_HEAD_SECT2_START, ICC_HEAD_SECT2_LENGTH);
+ MD5_write(&md5, nullbytes16, 16);
+ MD5_write(&md5, wbuf + ICC_HEAD_SECT3_START, ICC_HEAD_SECT3_LENGTH);
+
+ pdf_add_stream(stream, wbuf, 128);
+
+ /* body */
+ while (length > 0) {
+ nb_read = fread(wbuf, 1, MIN(length, WBUF_SIZE), fp);
+ MD5_write(&md5, wbuf, nb_read);
+ pdf_add_stream(stream, wbuf, nb_read);
+ length -= nb_read;
+ }
+
+ MD5_final(checksum, &md5);
+
+
+ return stream;
+}
+
+int
+pdf_colorspace_load_ICCBased (const char *ident, const char *filename)
+{
+ int cspc_id;
+ FILE *fp;
+ pdf_obj *resource;
+ pdf_obj *stream;
+ pdf_obj *stream_dict;
+ iccHeader icch;
+ int colorspace;
+ long size;
+ unsigned char checksum[16];
+ struct iccbased_cdata *cdata;
+
+
+ fp = DPXFOPEN(filename, DPX_RES_TYPE_ICCPROFILE);
+ if (!fp)
+ return -1;
+
+ size = file_size(fp);
+ if (size < 128) {
+ MFCLOSE(fp);
+ return -1;
+ }
+ if (fread(wbuf, 1, 128, fp) != 128) {
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ iccp_init_iccHeader(&icch);
+ if (iccp_unpack_header(&icch, wbuf, 128, 0) < 0) {
+ WARN("Invalid ICC profile header in \"%s\"", ident);
+ print_iccp_header(&icch, NULL);
+ DPXFCLOSE(fp);
+ return -1;
+ }
+ if (icch.size > size) {
+ WARN("File size smaller than recorded in header: %ld %ld",
+ icch.size, size);
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ if (!iccp_version_supported((icch.version >> 24) & 0xff,
+ (icch.version >> 16) & 0xff)) {
+ WARN("ICC profile format spec. version %d.%01d.%01d"
+ " not supported in current PDF version setting.",
+ (icch.version >> 24) & 0xff,
+ (icch.version >> 20) & 0x0f,
+ (icch.version >> 16) & 0x0f);
+ WARN("ICC profile not embedded.");
+ print_iccp_header(&icch, NULL);
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ if (!iccp_devClass_allowed(icch.devClass)) {
+ WARN("Unsupported ICC Profile Device Class:");
+ print_iccp_header(&icch, NULL);
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ if (icch.colorSpace == str2iccSig("RGB ")) {
+ colorspace = PDF_COLORSPACE_TYPE_RGB;
+ } else if (icch.colorSpace == str2iccSig("GRAY")) {
+ colorspace = PDF_COLORSPACE_TYPE_GRAY;
+ } else if (icch.colorSpace == str2iccSig("CMYK")) {
+ colorspace = PDF_COLORSPACE_TYPE_CMYK;
+ } else {
+ WARN("Unsupported input color space.");
+ print_iccp_header(&icch, NULL);
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ stream = iccp_load_file_stream(checksum, icch.size, fp);
+ DPXFCLOSE(fp);
+
+ if (!stream) {
+ WARN("Loading ICC Profile failed...: %s", filename);
+ return -1;
+ }
+
+ if (memcmp(icch.ID, nullbytes16, 16) &&
+ memcmp(icch.ID, checksum, 16)) {
+ WARN("Invalid ICC profile: Inconsistent checksum.");
+ print_iccp_header(&icch, NULL);
+ pdf_release_obj(stream);
+ return -1;
+ }
+
+ cdata = NEW(1, struct iccbased_cdata);
+ init_iccbased_cdata(cdata);
+ cdata->colorspace = colorspace;
+ memcpy(cdata->checksum, checksum, 16);
+
+ cspc_id = pdf_colorspace_findresource(ident,
+ PDF_COLORSPACE_TYPE_ICCBASED, cdata);
+ if (cspc_id >= 0) {
+ if (verbose)
+ MESG("(ICCP:[id=%d])", cspc_id);
+ release_iccbased_cdata(cdata);
+ pdf_release_obj(stream);
+ return cspc_id;
+ }
+ if (verbose > 1) {
+ print_iccp_header(&icch, checksum);
+ }
+
+ resource = pdf_new_array();
+
+ pdf_add_array(resource, pdf_new_name("ICCBased"));
+ pdf_add_array(resource, pdf_ref_obj (stream));
+
+ stream_dict = pdf_stream_dict(stream);
+ pdf_add_dict(stream_dict, pdf_new_name("N"),
+ pdf_new_number(get_num_components_iccbased(cdata)));
+ pdf_release_obj(stream);
+
+ cspc_id = pdf_colorspace_defineresource(ident,
+ PDF_COLORSPACE_TYPE_ICCBASED,
+ cdata, resource);
+
+ return cspc_id;
+}
+
+typedef struct {
+ char *ident;
+ int subtype;
+
+ pdf_obj *resource;
+ pdf_obj *reference;
+
+ void *cdata;
+} pdf_colorspace;
+
+static struct {
+ int count;
+ int capacity;
+ pdf_colorspace *colorspaces;
+} cspc_cache = {
+ 0, 0, NULL
+};
+
+int
+pdf_colorspace_findresource (const char *ident,
+ int type, const void *cdata)
+{
+ pdf_colorspace *colorspace;
+ int cspc_id, cmp = -1;
+
+ for (cspc_id = 0;
+ cmp && cspc_id < cspc_cache.count; cspc_id++) {
+ colorspace = &cspc_cache.colorspaces[cspc_id];
+ if (colorspace->subtype != type)
+ continue;
+
+ switch (colorspace->subtype) {
+ case PDF_COLORSPACE_TYPE_ICCBASED:
+ cmp = compare_iccbased(ident, cdata,
+ colorspace->ident, colorspace->cdata);
+ break;
+ }
+ if (!cmp)
+ return cspc_id;
+ }
+
+ return -1; /* not found */
+}
+
+static void
+pdf_init_colorspace_struct (pdf_colorspace *colorspace)
+{
+ ASSERT(colorspace);
+
+ colorspace->ident = NULL;
+ colorspace->subtype = PDF_COLORSPACE_TYPE_INVALID;
+
+ colorspace->resource = NULL;
+ colorspace->reference = NULL;
+ colorspace->cdata = NULL;
+
+ return;
+}
+
+static void
+pdf_clean_colorspace_struct (pdf_colorspace *colorspace)
+{
+ ASSERT(colorspace);
+
+ if (colorspace->ident)
+ RELEASE(colorspace->ident);
+ if (colorspace->resource)
+ pdf_release_obj(colorspace->resource);
+ if (colorspace->reference)
+ pdf_release_obj(colorspace->reference);
+ colorspace->resource = NULL;
+ colorspace->reference = NULL;
+
+ if (colorspace->cdata) {
+ switch (colorspace->subtype) {
+ case PDF_COLORSPACE_TYPE_ICCBASED:
+ release_iccbased_cdata(colorspace->cdata);
+ break;
+ }
+ }
+ colorspace->cdata = NULL;
+ colorspace->subtype = PDF_COLORSPACE_TYPE_INVALID;
+
+ return;
+}
+
+static void
+pdf_flush_colorspace (pdf_colorspace *colorspace)
+{
+ ASSERT(colorspace);
+
+ if (colorspace->resource)
+ pdf_release_obj(colorspace->resource);
+ if (colorspace->reference)
+ pdf_release_obj(colorspace->reference);
+
+ colorspace->resource = NULL;
+ colorspace->reference = NULL;
+}
+
+int
+pdf_colorspace_defineresource (const char *ident,
+ int subtype, void *cdata, pdf_obj *resource)
+{
+ int cspc_id;
+ pdf_colorspace *colorspace;
+
+ if (cspc_cache.count >= cspc_cache.capacity) {
+ cspc_cache.capacity += 16;
+ cspc_cache.colorspaces = RENEW(cspc_cache.colorspaces,
+ cspc_cache.capacity, pdf_colorspace);
+ }
+ cspc_id = cspc_cache.count;
+ colorspace = &cspc_cache.colorspaces[cspc_id];
+
+ pdf_init_colorspace_struct(colorspace);
+ if (ident) {
+ colorspace->ident = NEW(strlen(ident) + 1, char);
+ strcpy(colorspace->ident, ident);
+ }
+ colorspace->subtype = subtype;
+ colorspace->cdata = cdata;
+ colorspace->resource = resource;
+
+ if (verbose) {
+ MESG("(ColorSpace:%s", ident);
+ if (verbose > 1) {
+ switch (subtype) {
+ case PDF_COLORSPACE_TYPE_ICCBASED:
+ MESG("[ICCBased]");
+ break;
+ case PDF_COLORSPACE_TYPE_CALRGB:
+ MESG("[CalRGB]");
+ break;
+ case PDF_COLORSPACE_TYPE_CALGRAY:
+ MESG("[CalGray]");
+ break;
+ }
+ }
+ MESG(")");
+ }
+
+ cspc_cache.count++;
+
+ return cspc_id;
+}
+
+pdf_obj *
+pdf_get_colorspace_reference (int cspc_id)
+{
+ pdf_colorspace *colorspace;
+
+ colorspace = &cspc_cache.colorspaces[cspc_id];
+ if (!colorspace->reference) {
+ colorspace->reference = pdf_ref_obj(colorspace->resource);
+ pdf_release_obj(colorspace->resource); /* .... */
+ colorspace->resource = NULL;
+ }
+
+ return pdf_link_obj(colorspace->reference);
+}
+
+int
+pdf_get_colorspace_num_components (int cspc_id)
+{
+ pdf_colorspace *colorspace;
+ int num_components;
+
+ colorspace = &cspc_cache.colorspaces[cspc_id];
+
+ switch (colorspace->subtype) {
+ case PDF_COLORSPACE_TYPE_ICCBASED:
+ num_components = get_num_components_iccbased(colorspace->cdata);
+ break;
+ case PDF_COLORSPACE_TYPE_DEVICEGRAY:
+ num_components = 1;
+ break;
+ case PDF_COLORSPACE_TYPE_DEVICERGB:
+ num_components = 3;
+ break;
+ case PDF_COLORSPACE_TYPE_DEVICECMYK:
+ num_components = 4;
+ break;
+ case PDF_COLORSPACE_TYPE_CALRGB:
+ num_components = 3;
+ break;
+ case PDF_COLORSPACE_TYPE_CALGRAY:
+ num_components = 1;
+ break;
+ default:
+ num_components = 0;
+ break;
+ }
+
+ return num_components;
+}
+
+int
+pdf_get_colorspace_subtype (int cspc_id)
+{
+ pdf_colorspace *colorspace;
+
+ colorspace = &cspc_cache.colorspaces[cspc_id];
+
+ return colorspace->subtype;
+}
+
+void
+pdf_init_colors (void)
+{
+ cspc_cache.count = 0;
+ cspc_cache.capacity = 0;
+ cspc_cache.colorspaces = NULL;
+}
+
+void
+pdf_close_colors (void)
+{
+ int i;
+
+ for (i = 0; i < cspc_cache.count; i++) {
+ pdf_colorspace *colorspace;
+
+ colorspace = &cspc_cache.colorspaces[i];
+ pdf_flush_colorspace(colorspace);
+ pdf_clean_colorspace_struct(colorspace);
+ }
+ RELEASE(cspc_cache.colorspaces);
+ cspc_cache.colorspaces = NULL;
+ cspc_cache.count = cspc_cache.capacity = 0;
+
+}
+
+#define PDF_COLORSPACE_FAMILY_DEVICE 0
+#define PDF_COLORSPACE_FAMILY_CIEBASED 1
+#define PDF_COLORSPACE_FAMILY_SPECIAL 2
diff --git a/Build/source/texk/xdvipdfmx/src/pdfcolor.h b/Build/source/texk/xdvipdfmx/src/pdfcolor.h
new file mode 100644
index 00000000000..00c421f9349
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfcolor.h
@@ -0,0 +1,98 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfcolor.h,v 1.6 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDF_COLOR_H_
+#define _PDF_COLOR_H_
+
+#include "pdfobj.h"
+
+#define PDF_COLORSPACE_TYPE_DEVICECMYK -4
+#define PDF_COLORSPACE_TYPE_DEVICERGB -3
+#define PDF_COLORSPACE_TYPE_DEVICEGRAY -1
+#define PDF_COLORSPACE_TYPE_INVALID 0
+#define PDF_COLORSPACE_TYPE_CALGRAY 1
+#define PDF_COLORSPACE_TYPE_CIELAB 2
+#define PDF_COLORSPACE_TYPE_CALRGB 3
+#define PDF_COLORSPACE_TYPE_ICCBASED 4
+
+#define PDF_COLORSPACE_TYPE_CMYK PDF_COLORSPACE_TYPE_DEVICECMYK
+#define PDF_COLORSPACE_TYPE_RGB PDF_COLORSPACE_TYPE_DEVICERGB
+#define PDF_COLORSPACE_TYPE_GRAY PDF_COLORSPACE_TYPE_DEVICEGRAY
+
+
+#define PDF_COLOR_COMPONENT_MAX 4
+
+typedef struct
+{
+ int num_components;
+ double values[PDF_COLOR_COMPONENT_MAX];
+} pdf_color;
+
+extern void pdf_color_set_verbose (void);
+
+extern int pdf_dev_setcolor (const pdf_color *color, int is_fill);
+
+extern int pdf_dev_currentcolor (pdf_color *color, int is_fill);
+
+extern int pdf_color_rgbcolor (pdf_color *color,
+ double r, double g, double b);
+extern int pdf_color_cmykcolor (pdf_color *color,
+ double c, double m, double y, double k);
+extern int pdf_color_graycolor (pdf_color *color, double g);
+extern void pdf_color_copycolor (pdf_color *color1, const pdf_color *color2);
+
+extern int pdf_color_is_white (pdf_color *color);
+
+/* Not check size */
+extern pdf_obj *iccp_get_rendering_intent (const void *profile, long proflen);
+extern int iccp_check_colorspace (int colortype,
+ const void *profile, long proflen);
+
+/* returns colorspace ID */
+extern int iccp_load_profile (const char *ident,
+ const void *profile, long proflen);
+
+extern void pdf_init_colors (void);
+extern void pdf_close_colors (void);
+
+extern pdf_obj *pdf_get_colorspace_reference (int cspc_id);
+extern int pdf_get_colorspace_num_components (int cspc_id);
+extern int pdf_get_colorspace_subtype (int cspc_id);
+
+/* Not working */
+extern int pdf_colorspace_load_ICCBased (const char *ident,
+ const char *profile_filename);
+
+/* Color special
+ * See remark in spc_color.c.
+ */
+extern void pdf_color_set_default (const pdf_color *color);
+extern void pdf_color_push (void);
+extern void pdf_color_pop (void);
+extern void pdf_color_clear (void);
+
+/* Reinstall color */
+extern void pdf_dev_reset_color (void);
+
+#endif /* _PDF_COLOR_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdev.c b/Build/source/texk/xdvipdfmx/src/pdfdev.c
new file mode 100644
index 00000000000..18e0080794c
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfdev.c
@@ -0,0 +1,1820 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfdev.c,v 1.60 2005/08/12 18:22:24 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "mfileio.h"
+#include "numbers.h"
+
+#include "pdfdoc.h"
+#include "pdfobj.h"
+
+#include "pdffont.h"
+#include "fontmap.h"
+#include "cmap.h"
+#include "pdfximage.h"
+
+#include "pdfdraw.h"
+#include "pdfcolor.h"
+
+#include "pdflimits.h"
+
+#include "pdfdev.h"
+
+static int verbose = 0;
+
+void
+pdf_dev_set_verbose (void)
+{
+ verbose++;
+}
+
+/* Not working yet... */
+double
+pdf_dev_scale (void)
+{
+ return 1.0;
+}
+
+/*
+ * Unit conversion, formatting and others.
+ */
+
+#define TEX_ONE_HUNDRED_BP 6578176
+static struct {
+ double dvi2pts;
+ long min_bp_val; /* Shortest resolvable distance in the output PDF. */
+ int precision; /* Number of decimal digits (in fractional part) kept. */
+} dev_unit = {
+ 0.0,
+ 658,
+ 2
+};
+
+
+double
+dev_unit_dviunit (void)
+{
+ return (1.0/dev_unit.dvi2pts);
+}
+
+#define DEV_PRECISION_MAX 8
+static unsigned long ten_pow[10] = {
+ 1ul, 10ul, 100ul, 1000ul, 10000ul, 100000ul, 1000000ul, 10000000ul, 100000000ul, 1000000000ul
+};
+
+static double ten_pow_inv[10] = {
+ 1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0.00000001, 0.000000001
+};
+
+#define bpt2spt(b) ( (spt_t) round( (b) / dev_unit.dvi2pts ) )
+#define spt2bpt(s) ( (s) * dev_unit.dvi2pts )
+#define dround_at(v,p) (ROUND( (v), ten_pow_inv[(p)] ))
+
+static int
+p_itoa (long value, char *buf)
+{
+ int sign, ndigits;
+ char *p = buf;
+
+ if (value < 0) {
+ *p++ = '-';
+ value = -value;
+ sign = 1;
+ } else {
+ sign = 0;
+ }
+
+ ndigits = 0;
+ /* Generate at least one digit in reverse order */
+ do {
+ p[ndigits++] = (value % 10) + '0';
+ value /= 10;
+ } while (value != 0);
+
+ /* Reverse the digits */
+ {
+ int i;
+
+ for (i = 0; i < ndigits / 2 ; i++) {
+ char tmp = p[i];
+ p[i] = p[ndigits-i-1];
+ p[ndigits-i-1] = tmp;
+ }
+ }
+ p[ndigits] = '\0';
+
+ return (sign ? ndigits + 1 : ndigits);
+}
+
+/* ... */
+static int
+p_dtoa (double value, int prec, char *buf)
+{
+ int n;
+ char *p, *q;
+
+ n = sprintf(buf, "%.*f", prec, value);
+ /* find decimal-point */
+ for (p = buf + n - 1; p > buf && *p != '.'; p--);
+ if (p > buf) {
+ /* chop trailing zeros */
+ for (q = buf + n - 1; q > p && *q == '0'; q--) {
+ *q = '\0'; n--;
+ }
+ /* If a decimal point appears, at least one digit appears
+ * before it.
+ */
+ if (q == p) {
+ *q = '\0'; n--;
+ }
+ }
+ /* -0 --> 0 */
+ if (n == 2 && buf[0] == '-' && buf[1] == '0') {
+ buf[0] = '0'; buf[1] = '\0'; n = 1;
+ }
+
+ return n;
+}
+
+static int
+dev_sprint_bp (char *buf, spt_t value, spt_t *error)
+{
+ double value_in_bp;
+ double error_in_bp;
+ int prec = dev_unit.precision;
+
+ value_in_bp = spt2bpt(value);
+ if (error) {
+ error_in_bp = value_in_bp - dround_at(value_in_bp, prec);
+ *error = bpt2spt(error_in_bp);
+ }
+
+ return p_dtoa(value_in_bp, prec, buf);
+}
+
+/* They are affected by precision (set at device initialization). */
+int
+pdf_sprint_matrix (char *buf, const pdf_tmatrix *M)
+{
+ int len;
+ int prec2 = MIN(dev_unit.precision + 2, DEV_PRECISION_MAX);
+ int prec0 = MAX(dev_unit.precision, 2);
+
+ len = p_dtoa(M->a, prec2, buf);
+ buf[len++] = ' ';
+ len += p_dtoa(M->b, prec2, buf+len);
+ buf[len++] = ' ';
+ len += p_dtoa(M->c, prec2, buf+len);
+ buf[len++] = ' ';
+ len += p_dtoa(M->d, prec2, buf+len);
+ buf[len++] = ' ';
+ len += p_dtoa(M->e, prec0, buf+len);
+ buf[len++] = ' ';
+ len += p_dtoa(M->f, prec0, buf+len);
+ buf[len] = '\0'; /* xxx_sprint_xxx NULL terminates strings. */
+
+ return len;
+}
+
+int
+pdf_sprint_rect (char *buf, const pdf_rect *rect)
+{
+ int len;
+
+ len = p_dtoa(rect->llx, dev_unit.precision, buf);
+ buf[len++] = ' ';
+ len += p_dtoa(rect->lly, dev_unit.precision, buf+len);
+ buf[len++] = ' ';
+ len += p_dtoa(rect->urx, dev_unit.precision, buf+len);
+ buf[len++] = ' ';
+ len += p_dtoa(rect->ury, dev_unit.precision, buf+len);
+ buf[len] = '\0'; /* xxx_sprint_xxx NULL terminates strings. */
+
+ return len;
+}
+
+int
+pdf_sprint_coord (char *buf, const pdf_coord *p)
+{
+ int len;
+
+ len = p_dtoa(p->x, dev_unit.precision, buf);
+ buf[len++] = ' ';
+ len += p_dtoa(p->y, dev_unit.precision, buf+len);
+ buf[len] = '\0'; /* xxx_sprint_xxx NULL terminates strings. */
+
+ return len;
+}
+
+int
+pdf_sprint_length (char *buf, double value)
+{
+ int len;
+
+ len = p_dtoa(value, dev_unit.precision, buf);
+ buf[len] = '\0'; /* xxx_sprint_xxx NULL terminates strings. */
+
+ return len;
+}
+
+
+int
+pdf_sprint_number (char *buf, double value)
+{
+ int len;
+
+ len = p_dtoa(value, DEV_PRECISION_MAX, buf);
+ buf[len] = '\0'; /* xxx_sprint_xxx NULL terminates strings. */
+
+ return len;
+}
+
+
+static struct
+{
+ /* Text composition (direction) mode is ignored (always same
+ * as font's writing mode) if autorotate is unset (value zero).
+ */
+ int autorotate;
+
+ /*
+ * Ignore color migrated to here. This is device's capacity.
+ * colormode 0 for ignore colors
+ */
+ int colormode;
+
+} dev_param = {
+ 1, /* autorotate */
+ 1, /* colormode */
+};
+
+/*
+ * Text handling routines.
+ */
+
+/* Motion state:
+ * GRAPHICS_MODE Initial state (not within BT/ET block nor in string)
+ * TEXT_MODE Text section is started via BT operator but not
+ * in string.
+ * STRING_MODE In string. A string or array of strings are currently
+ * in process. May started '[', '<' or '('.
+ */
+#define GRAPHICS_MODE 1
+#define TEXT_MODE 2
+#define STRING_MODE 3
+
+static int motion_state = GRAPHICS_MODE;
+
+#define FORMAT_BUF_SIZE 4096
+static char format_buffer[FORMAT_BUF_SIZE];
+
+/*
+ * In PDF, vertical text positioning is always applied when current font
+ * is vertical font. While ASCII pTeX manages current writing direction
+ * and font's WMode separately.
+ *
+ * 00/11 WMODE_HH/VV h(v) font, h(v) direction.
+ * 01 WMODE_HV -90 deg. rotated
+ * 10 WMODE_VH +90 deg. rotated
+ *
+ * In MetaPost PostScript file processing (mp_mode = 1), only HH/VV mode
+ * is applied.
+ */
+#define TEXT_WMODE_HH 0
+#define TEXT_WMODE_HV 1
+#define TEXT_WMODE_VH 2
+#define TEXT_WMODE_VV 3
+
+#define ANGLE_CHANGES(m1,m2) ((abs((m1)-(m2)) % 3) == 0 ? 0 : 1)
+#define ROTATE_TEXT(m) ((m) != TEXT_WMODE_HH && (m) != TEXT_WMODE_VV)
+
+static struct {
+
+ /* Current font.
+ * This is index within dev_fonts.
+ */
+ int font_id;
+
+ /* Dvipdfmx does compression of text by doing text positioning
+ * in relative motion and uses string array [(foo) -250 (bar)]
+ * with kerning (negative kern is used for white space as suited
+ * for TeX). This is offset within current string.
+ */
+ spt_t offset;
+
+ /* This is reference point of strings.
+ * It may include error correction induced by rounding.
+ */
+ spt_t ref_x;
+ spt_t ref_y;
+
+ /* Using text raise and leading is highly recommended for
+ * text extraction to work properly. But not implemented yet.
+ * We can't do consice output for \TeX without this.
+ */
+ spt_t raise; /* unused */
+ spt_t leading; /* unused */
+
+ /* This is not always text matrix but rather font matrix.
+ * We do not use horizontal scaling in PDF text state parameter
+ * since they always apply scaling in fixed direction regardless
+ * of writing mode.
+ */
+ struct {
+ double slant;
+ double extend;
+ int rotate; /* TEXT_WMODE_XX */
+ } matrix;
+
+ /* Fake bold parameter:
+ * If bold_param is positive, use text rendering mode
+ * fill-then-stroke with stroking line width specified
+ * by bold_param.
+ */
+ double bold_param;
+
+ /* Text composition (direction) mode. */
+ int dir_mode;
+
+ /* internal */
+
+ /* Flag indicating text matrix to be forcibly reset.
+ * Enabled if synthetic font features (slant, extend, etc)
+ * are used for current font or when text rotation mode
+ * changes.
+ */
+ int force_reset;
+
+ /* This information is duplicated from dev[font_id].format.
+ * Set to 1 if font is composite (Type0) font.
+ */
+ int is_mb;
+} text_state = {
+ -1, /* font */
+ 0, /* offset */
+ 0, 0, /* ref_x, ref_y */
+ 0, 0, /* raise, leading */
+ {0.0, 1.0, 0},
+
+ 0.0, /* Experimental boldness param */
+
+ 0, /* dir_mode */
+
+ /* internal */
+ 0, /* force_reset */
+ 0 /* is_mb */
+};
+
+#define PDF_FONTTYPE_SIMPLE 1
+#define PDF_FONTTYPE_BITMAP 2
+#define PDF_FONTTYPE_COMPOSITE 3
+
+struct dev_font {
+ /* Needs to be big enough to hold name "Fxxx"
+ * where xxx is number of largest font
+ */
+ char short_name[7]; /* Resource name */
+ int used_on_this_page;
+
+ char *tex_name; /* String identifier of this font */
+ spt_t sptsize; /* Point size */
+
+ /* Returned values from font/encoding layer:
+ *
+ * The font_id and enc_id is font and encoding (CMap) identifier
+ * used in pdf_font or encoding/cmap layer.
+ * The PDF object "resource" is an indirect reference object
+ * pointing font resource of this font. The used_chars is somewhat
+ * misleading, this is actually used_glyphs in CIDFont for Type0
+ * and is 65536/8 bytes binary data with each bits representing
+ * whether the glyph is in-use or not. It is 256 char array for
+ * simple font.
+ */
+ int font_id;
+ int enc_id;
+#ifdef XETEX
+ unsigned short *ft_to_gid;
+#endif
+
+ /* if >= 0, index of a dev_font that really has the resource and used_chars */
+ int real_font_index;
+
+ pdf_obj *resource;
+ char *used_chars;
+
+ /* Font format:
+ * simple, composite or bitmap.
+ */
+ int format;
+
+ /* Writing mode:
+ * Non-zero for vertical. Duplicated from CMap.
+ */
+ int wmode;
+
+ /* Syntetic Font:
+ *
+ * We use text matrix for creating extended or slanted font,
+ * but not with font's FontMatrix since TrueType and Type0
+ * font don't support them.
+ */
+ double extend;
+ double slant;
+ double bold; /* Boldness prameter */
+
+ /* Compatibility */
+ int remap; /* Obsolete */
+ int mapc; /* Nasty workaround for Omega */
+
+ /* There are no font metric format supporting four-bytes
+ * charcter code. So we should provide an option to specify
+ * UCS group and plane.
+ */
+ int ucs_group;
+ int ucs_plane;
+
+ int is_unicode;
+};
+static struct dev_font *dev_fonts = NULL;
+
+static int num_dev_fonts = 0;
+static int max_dev_fonts = 0;
+static int num_phys_fonts = 0;
+
+#define CURRENTFONT() ((text_state.font_id < 0) ? NULL : &(dev_fonts[text_state.font_id]))
+#define GET_FONT(n) (&(dev_fonts[(n)]))
+
+
+static void
+dev_set_text_matrix (spt_t xpos, spt_t ypos, double slant, double extend, int rotate)
+{
+ pdf_tmatrix tm;
+ int len = 0;
+
+ /* slant is negated for vertical font so that right-side
+ * is always lower. */
+ switch (rotate) {
+ case TEXT_WMODE_VH:
+ /* Vertical font */
+ tm.a = slant ; tm.b = 1.0;
+ tm.c = -extend; tm.d = 0.0 ;
+ break;
+ case TEXT_WMODE_HV:
+ /* Horizontal font */
+ tm.a = 0.0; tm.b = -extend;
+ tm.c = 1.0; tm.d = -slant ;
+ break;
+ case TEXT_WMODE_HH:
+ /* Horizontal font */
+ tm.a = extend; tm.b = 0.0;
+ tm.c = slant ; tm.d = 1.0;
+ break;
+ case TEXT_WMODE_VV:
+ /* Vertical font */
+ tm.a = 1.0; tm.b = -slant;
+ tm.c = 0.0; tm.d = extend;
+ break;
+ }
+ tm.e = xpos * dev_unit.dvi2pts;
+ tm.f = ypos * dev_unit.dvi2pts;
+
+ format_buffer[len++] = ' ';
+ len += pdf_sprint_matrix(format_buffer+len, &tm);
+ format_buffer[len++] = ' ';
+ format_buffer[len++] = 'T';
+ format_buffer[len++] = 'm';
+
+ pdf_doc_add_page_content(format_buffer, len);
+
+ text_state.ref_x = xpos;
+ text_state.ref_y = ypos;
+ text_state.matrix.slant = slant;
+ text_state.matrix.extend = extend;
+ text_state.matrix.rotate = rotate;
+}
+
+/*
+ * reset_text_state() outputs a BT and does any necessary coordinate
+ * transformations to get ready to ship out text.
+ */
+
+static void
+reset_text_state (void)
+{
+ /*
+ * We need to reset the line matrix to handle slanted fonts.
+ */
+ pdf_doc_add_page_content(" BT", 3);
+ /*
+ * text_state.matrix is identity at top of page.
+ * This sometimes write unnecessary "Tm"s when transition from
+ * GRAPHICS_MODE to TEXT_MODE occurs.
+ */
+ if (text_state.force_reset ||
+ text_state.matrix.slant != 0.0 ||
+ text_state.matrix.extend != 1.0 ||
+ ROTATE_TEXT(text_state.matrix.rotate)) {
+ dev_set_text_matrix(0, 0,
+ text_state.matrix.slant,
+ text_state.matrix.extend,
+ text_state.matrix.rotate);
+ }
+ text_state.ref_x = 0;
+ text_state.ref_y = 0;
+ text_state.offset = 0;
+ text_state.force_reset = 0;
+}
+
+static void
+text_mode (void)
+{
+ switch (motion_state) {
+ case TEXT_MODE:
+ break;
+ case STRING_MODE:
+ pdf_doc_add_page_content(text_state.is_mb ? ">]TJ" : ")]TJ", 4);
+ break;
+ case GRAPHICS_MODE:
+ reset_text_state();
+ break;
+ }
+ motion_state = TEXT_MODE;
+ text_state.offset = 0;
+}
+
+void
+graphics_mode (void)
+{
+ switch (motion_state) {
+ case GRAPHICS_MODE:
+ break;
+ case STRING_MODE:
+ pdf_doc_add_page_content(text_state.is_mb ? ">]TJ" : ")]TJ", 4);
+ /* continue */
+ case TEXT_MODE:
+ pdf_doc_add_page_content(" ET", 3);
+ text_state.force_reset = 0;
+ text_state.font_id = -1;
+ break;
+ }
+ motion_state = GRAPHICS_MODE;
+}
+
+static void
+start_string (spt_t xpos, spt_t ypos, double slant, double extend, int rotate)
+{
+ spt_t delx, dely, error_delx, error_dely;
+ spt_t desired_delx, desired_dely;
+ int len = 0;
+
+ delx = xpos - text_state.ref_x;
+ dely = ypos - text_state.ref_y;
+ /*
+ * Precompensating for line transformation matrix.
+ *
+ * Line transformation matrix L for horizontal font in horizontal
+ * mode and it's inverse I is
+ *
+ * | e 0| | 1/e 0|
+ * L_hh = | | , I_hh = | |
+ * | s 1| |-s/e 1|
+ *
+ * For vertical font in vertical mode,
+ *
+ * | 1 -s| | 1 s/e|
+ * L_vv = | | , I_vv = | |
+ * | 0 e| | 0 1/e|
+ *
+ * For vertical font in horizontal mode,
+ *
+ * | s 1| | 0 1|
+ * L_vh = | | = L_vv x | |
+ * |-e 0| |-1 0|
+ *
+ * | 0 -1|
+ * I_vh = | | x I_vv
+ * | 1 0|
+ *
+ * For horizontal font in vertical mode,
+ *
+ * | 0 -e| | 0 -1|
+ * L_hv = | | = L_hh x | |
+ * | 1 -s| | 1 0|
+ *
+ * | 0 1|
+ * I_hv = | | x I_hh
+ * |-1 0|
+ *
+ */
+ switch (rotate) {
+ case TEXT_WMODE_VH:
+ /* Vertical font in horizontal mode: rot = +90
+ * | 0 -1/e|
+ * d_user = d x I_vh = d x | |
+ * | 1 s/e|
+ */
+ desired_delx = dely;
+ desired_dely = (spt_t) (-(delx - dely*slant)/extend);
+
+ /* error_del is in device space
+ *
+ * | 0 1|
+ * e = e_user x | | = (-e_user_y, e_user_x)
+ * |-1 0|
+ *
+ * We must care about rotation here but not extend/slant...
+ * The extend and slant actually is font matrix.
+ */
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_delx, &error_dely);
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_dely, &error_delx);
+ error_delx = -error_delx;
+ break;
+ case TEXT_WMODE_HV:
+ /* Horizontal font in vertical mode: rot = -90
+ *
+ * |-s/e 1|
+ * d_user = d x I_hv = d x | |
+ * |-1/e 0|
+ */
+ desired_delx = (spt_t)(-(dely + delx*slant)/extend);
+ desired_dely = delx;
+
+ /*
+ * e = (e_user_y, -e_user_x)
+ */
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_delx, &error_dely);
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_dely, &error_delx);
+ error_dely = -error_dely;
+ break;
+ case TEXT_WMODE_HH:
+ /* Horizontal font in horizontal mode:
+ * | 1/e 0|
+ * d_user = d x I_hh = d x | |
+ * |-s/e 1|
+ */
+ desired_delx = (spt_t)((delx - dely*slant)/extend);
+ desired_dely = dely;
+
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_delx, &error_delx);
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_dely, &error_dely);
+ break;
+ case TEXT_WMODE_VV:
+ /* Vertical font in vertical mode:
+ * | 1 s/e|
+ * d_user = d x I_vv = d x | |
+ * | 0 1/e|
+ */
+ desired_delx = delx;
+ desired_dely = (spt_t)((dely + delx*slant)/extend);
+
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_delx, &error_delx);
+ format_buffer[len++] = ' ';
+ len += dev_sprint_bp(format_buffer+len, desired_dely, &error_dely);
+ break;
+ }
+ pdf_doc_add_page_content(format_buffer, len);
+ /*
+ * dvipdfm wrongly using "TD" in place of "Td".
+ * The TD operator set leading, but we are not using T* etc.
+ */
+ pdf_doc_add_page_content(text_state.is_mb ? " Td[<" : " Td[(", 5);
+
+ /* Error correction */
+ text_state.ref_x = xpos - error_delx;
+ text_state.ref_y = ypos - error_dely;
+
+ text_state.offset = 0;
+}
+
+static void
+string_mode (spt_t xpos, spt_t ypos, double slant, double extend, int rotate)
+{
+ switch (motion_state) {
+ case STRING_MODE:
+ break;
+ case GRAPHICS_MODE:
+ reset_text_state();
+ /* continue */
+ case TEXT_MODE:
+ if (text_state.force_reset) {
+ dev_set_text_matrix(xpos, ypos, slant, extend, rotate);
+ pdf_doc_add_page_content(text_state.is_mb ? "[<" : "[(", 2);
+ text_state.force_reset = 0;
+ } else {
+ start_string(xpos, ypos, slant, extend, rotate);
+ }
+ break;
+ }
+ motion_state = STRING_MODE;
+}
+
+/*
+ * The purpose of the following routine is to force a Tf only
+ * when it's actually necessary. This became a problem when the
+ * VF code was added. The VF spec says to instantiate the
+ * first font contained in the VF file before drawing a virtual
+ * character. However, that font may not be used for
+ * many characters (e.g. small caps fonts). For this reason,
+ * dev_select_font() should not force a "physical" font selection.
+ * This routine prevents a PDF Tf font selection until there's
+ * really a character in that font.
+ */
+
+static int
+dev_set_font (int font_id)
+{
+ struct dev_font *font;
+ struct dev_font *real_font;
+ int text_rotate;
+ double font_scale;
+ int len;
+ int vert_dir, vert_font;
+
+ /* text_mode() must come before text_state.is_mb is changed. */
+ text_mode();
+
+ font = GET_FONT(font_id);
+ ASSERT(font); /* Caller should check font_id. */
+
+ if (font->real_font_index >= 0)
+ real_font = GET_FONT(font->real_font_index);
+ else
+ real_font = font;
+
+ text_state.is_mb = (font->format == PDF_FONTTYPE_COMPOSITE) ? 1 : 0;
+
+ vert_font = font->wmode ? 1 : 0;
+ if (dev_param.autorotate) {
+ vert_dir = text_state.dir_mode ? 1 : 0;
+ } else {
+ vert_dir = vert_font;
+ }
+ text_rotate = (vert_font << 1)|vert_dir;
+
+ if (font->slant != text_state.matrix.slant ||
+ font->extend != text_state.matrix.extend ||
+ ANGLE_CHANGES(text_rotate, text_state.matrix.rotate)) {
+ text_state.force_reset = 1;
+ }
+ text_state.matrix.slant = font->slant;
+ text_state.matrix.extend = font->extend;
+ text_state.matrix.rotate = text_rotate;
+
+ if (!real_font->resource) {
+ real_font->resource = pdf_get_font_reference(real_font->font_id);
+ real_font->used_chars = pdf_get_font_usedchars(real_font->font_id);
+ }
+
+ if (!real_font->used_on_this_page) {
+ pdf_doc_add_page_resource("Font",
+ real_font->short_name,
+ pdf_link_obj(real_font->resource));
+ real_font->used_on_this_page = 1;
+ }
+
+ font_scale = (double) font->sptsize * dev_unit.dvi2pts;
+ len = sprintf(format_buffer, " /%s", real_font->short_name); /* space not necessary. */
+ format_buffer[len++] = ' ';
+ len += p_dtoa(font_scale, MIN(dev_unit.precision+1, DEV_PRECISION_MAX), format_buffer+len);
+ format_buffer[len++] = ' ';
+ format_buffer[len++] = 'T';
+ format_buffer[len++] = 'f';
+ pdf_doc_add_page_content(format_buffer, len);
+
+ if (font->bold > 0.0 || font->bold != text_state.bold_param) {
+ if (font->bold <= 0.0)
+ len = sprintf(format_buffer, " 0 Tr");
+ else
+ len = sprintf(format_buffer, " 2 Tr %.2f w", font->bold); /* _FIXME_ */
+ pdf_doc_add_page_content(format_buffer, len);
+ }
+ text_state.bold_param = font->bold;
+
+ text_state.font_id = font_id;
+
+ return 0;
+}
+
+
+/* Access text state parameters.
+ */
+int
+pdf_dev_currentfont (void)
+{
+ return text_state.font_id;
+}
+
+double
+pdf_dev_get_font_ptsize (int font_id)
+{
+ struct dev_font *font;
+
+ font = GET_FONT(font_id);
+ if (font) {
+ return font->sptsize * dev_unit.dvi2pts;
+ }
+
+ return 1.0;
+}
+
+int
+pdf_dev_get_font_wmode (int font_id)
+{
+ struct dev_font *font;
+
+ font = GET_FONT(font_id);
+ if (font) {
+ return font->wmode;
+ }
+
+ return 0;
+}
+
+static unsigned char sbuf0[FORMAT_BUF_SIZE];
+static unsigned char sbuf1[FORMAT_BUF_SIZE];
+
+static int
+handle_remap (unsigned char **str_ptr, int length)
+{
+ unsigned char *p;
+ int i;
+
+ p = *str_ptr;
+
+#define twiddle(n) ( \
+ ( \
+ ((n) <= 9) ? \
+ ((n) + 161) : \
+ (((n) <= 32) ? \
+ ((n) + 163) : \
+ (((n) == 127) ? 196: (n)) \
+ ) \
+ ) \
+)
+
+ for (i = 0; i < length; i++) {
+ sbuf0[i] = twiddle(p[i]);
+ }
+
+ *str_ptr = sbuf0;
+ return 0;
+}
+
+static int
+handle_multibyte_string (struct dev_font *font,
+ unsigned char **str_ptr, int *str_len, int ctype)
+{
+ unsigned char *p;
+ int i, length;
+
+ p = *str_ptr;
+ length = *str_len;
+
+#ifdef XETEX
+ if (ctype == -1) { /* freetype glyph indexes */
+ if (font->ft_to_gid) {
+ /* convert freetype glyph indexes to physical GID */
+ unsigned char *inbuf = p;
+ unsigned char *outbuf = sbuf0;
+ for (i = 0; i < length; i += 2) {
+ unsigned int gid;
+ gid = *inbuf++ << 8;
+ gid += *inbuf++;
+ gid = font->ft_to_gid[gid];
+ *outbuf++ = gid >> 8;
+ *outbuf++ = gid & 0xff;
+ }
+ p = sbuf0;
+ length = outbuf - sbuf0;
+ }
+ }
+ else
+#endif
+ /* _FIXME_ */
+ if (font->is_unicode) { /* UCS-4 */
+ if (ctype == 1) {
+ if (length * 4 >= FORMAT_BUF_SIZE) {
+ WARN("Too long string...");
+ return -1;
+ }
+ for (i = 0; i < length; i++) {
+ sbuf1[i*4 ] = font->ucs_group;
+ sbuf1[i*4+1] = font->ucs_plane;
+ sbuf1[i*4+2] = '\0';
+ sbuf1[i*4+3] = p[i];
+ }
+ length *= 4;
+ } else if (ctype == 2) {
+ if (length * 2 >= FORMAT_BUF_SIZE) {
+ WARN("Too long string...");
+ return -1;
+ }
+ for (i = 0; i < length; i += 2) {
+ sbuf1[i*2 ] = font->ucs_group;
+ sbuf1[i*2+1] = font->ucs_plane;
+ sbuf1[i*2+2] = p[i];
+ sbuf1[i*2+3] = p[i+1];
+ }
+ length *= 2;
+ }
+ p = sbuf1;
+ } else if (ctype == 1 && font->mapc >= 0) {
+ /* Omega workaround...
+ * Translate single-byte chars to double byte code space.
+ */
+ if (length * 2 >= FORMAT_BUF_SIZE) {
+ WARN("Too long string...");
+ return -1;
+ }
+ for (i = 0; i < length; i++) {
+ sbuf1[i*2 ] = (font->mapc & 0xff);
+ sbuf1[i*2+1] = p[i];
+ }
+ length *= 2;
+ p = sbuf1;
+ }
+
+ /*
+ * Font is double-byte font. Output is assumed to be 16-bit fixed length
+ * encoding.
+ * TODO: A character decomposed to multiple characters.
+ */
+ if (ctype != -1 && font->enc_id >= 0) {
+ unsigned char *inbuf, *outbuf;
+ long inbytesleft, outbytesleft;
+ CMap *cmap;
+
+ cmap = CMap_cache_get(font->enc_id);
+ inbuf = p;
+ outbuf = sbuf0;
+ inbytesleft = length;
+ outbytesleft = FORMAT_BUF_SIZE;
+
+ CMap_decode(cmap,
+ (const unsigned char **) &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (inbytesleft != 0) {
+ WARN("CMap conversion failed. (%d bytes remains)", inbytesleft);
+ return -1;
+ }
+ length = FORMAT_BUF_SIZE - outbytesleft;
+ p = sbuf0;
+ }
+
+ *str_ptr = p;
+ *str_len = length;
+ return 0;
+}
+
+/*
+ * ctype:
+#ifdef XETEX
+ * -1 input string contains 2-byte Freetype glyph index values
+#endif
+ * 0 byte-width of char can be variable and input string
+ * is properly encoded.
+ * n Single character cosumes n bytes in input string.
+ *
+ * _FIXME_
+ * -->
+ * selectfont(font_name, point_size) and show_string(pos, string)
+ */
+void
+pdf_dev_set_string (spt_t xpos, spt_t ypos,
+ const void *instr_ptr, int instr_len,
+ spt_t width,
+ int font_id, int ctype)
+{
+ struct dev_font *font;
+ struct dev_font *real_font;
+ unsigned char *str_ptr; /* Pointer to the reencoded string. */
+ int length, i, len = 0;
+ spt_t kern, delh, delv;
+ spt_t text_xorigin;
+ spt_t text_yorigin;
+
+ if (font_id < 0 || font_id >= num_dev_fonts) {
+ ERROR("Invalid font: %d (%d)", font_id, num_dev_fonts);
+ return;
+ }
+ if (font_id != text_state.font_id) {
+ dev_set_font(font_id);
+ }
+
+ font = CURRENTFONT();
+ if (!font) {
+ ERROR("Currentfont not set.");
+ return;
+ }
+
+ if (font->real_font_index >= 0)
+ real_font = GET_FONT(font->real_font_index);
+ else
+ real_font = font;
+
+ text_xorigin = text_state.ref_x;
+ text_yorigin = text_state.ref_y;
+
+ str_ptr = (unsigned char *) instr_ptr;
+ length = instr_len;
+
+ if (font->format == PDF_FONTTYPE_COMPOSITE) {
+ if (handle_multibyte_string(font, &str_ptr, &length, ctype) < 0) {
+ ERROR("Error in converting input string...");
+ return;
+ }
+ if (real_font->used_chars != NULL) {
+ for (i = 0; i < length; i += 2)
+ add_to_used_chars2(real_font->used_chars,
+ (unsigned short) (str_ptr[i] << 8)|str_ptr[i+1]);
+ }
+ } else {
+ if (font->remap)
+ handle_remap(&str_ptr, length); /* length unchanged. */
+ if (real_font->used_chars != NULL) {
+ for (i = 0; i < length; i++)
+ real_font->used_chars[str_ptr[i]] = 1;
+ }
+ }
+
+ /*
+ * Kern is in units of character units, i.e., 1000 = 1 em.
+ *
+ * Positive kern means kerning (reduce excess white space).
+ *
+ * The following formula is of the form a*x/b where a, x, and b are signed long
+ * integers. Since in integer arithmetic (a*x) could overflow and a*(x/b) would
+ * not be accurate, we use floating point arithmetic rather than trying to do
+ * this all with integer arithmetic.
+ *
+ * 1000.0 / (font->extend * font->sptsize) is caluculated each times...
+ * Is accuracy really a matter? Character widths are always rounded to integer
+ * (in 1000 units per em) but dvipdfmx does not take into account of this...
+ */
+
+ if (text_state.dir_mode) {
+ /* Top-to-bottom */
+ delh = ypos - text_yorigin + text_state.offset;
+ delv = xpos - text_xorigin;
+ } else {
+ /* Left-to-right */
+ delh = text_xorigin + text_state.offset - xpos;
+ delv = ypos - text_yorigin;
+ }
+
+ /* White-space more than 3em is not considered as a part of single text.
+ * So we will break string mode in that case.
+ * Dvipdfmx spend most of time processing strings with kern = 0 (but far
+ * more times in font handling).
+ * You may want to use pre-calculated value for WORD_SPACE_MAX.
+ * More text compression may be possible by replacing kern with space char
+ * when -kern is equal to space char width.
+ */
+#define WORD_SPACE_MAX(f) (spt_t) (3.0 * (f)->extend * (f)->sptsize)
+
+ if (text_state.force_reset ||
+ labs(delv) > dev_unit.min_bp_val ||
+ labs(delh) > WORD_SPACE_MAX(font)) {
+ text_mode();
+ kern = 0;
+ } else {
+ kern = (spt_t) (1000.0 / font->extend * delh / font->sptsize);
+ }
+
+ /* Inaccucary introduced by rounding of character width appears within
+ * single text block. There are point_size/1000 rounding error per character.
+ * If you really care about accuracy, you should compensate this here too.
+ */
+ if (motion_state != STRING_MODE)
+ string_mode(xpos, ypos,
+ font->slant, font->extend, text_state.matrix.rotate);
+ else if (kern != 0) {
+ /*
+ * Same issues as earlier. Use floating point for simplicity.
+ * This routine needs to be fast, so we don't call sprintf() or strcpy().
+ */
+#if 0
+ text_state.offset -=
+ (spt_t) (kern * font->extend * (font->sptsize / 1000.0));
+#endif
+ text_state.offset -= delh;
+ format_buffer[len++] = text_state.is_mb ? '>' : ')';
+ if (font->wmode)
+ len += p_itoa(-kern, format_buffer + len);
+ else {
+ len += p_itoa( kern, format_buffer + len);
+ }
+ format_buffer[len++] = text_state.is_mb ? '<' : '(';
+ pdf_doc_add_page_content(format_buffer, len);
+ len = 0;
+ }
+
+ if (text_state.is_mb) {
+ if (FORMAT_BUF_SIZE - len < 2 * length)
+ ERROR("Buffer overflow...");
+ for (i = 0; i < length; i++) {
+ int first, second;
+
+ first = (str_ptr[i] >> 4) & 0x0f;
+ second = str_ptr[i] & 0x0f;
+ format_buffer[len++] = ((first >= 10) ? first + 'W' : first + '0');
+ format_buffer[len++] = ((second >= 10) ? second + 'W' : second + '0');
+ }
+ } else {
+ len += pdfobj_escape_str(format_buffer + len,
+ FORMAT_BUF_SIZE - len, str_ptr, length);
+ }
+ /* I think if you really care about speed, you should avoid memcopy here. */
+ pdf_doc_add_page_content(format_buffer, len);
+
+ text_state.offset += width;
+}
+
+void
+pdf_init_device (double dvi2pts, int precision, int black_and_white)
+{
+ if (precision < 0 ||
+ precision > DEV_PRECISION_MAX)
+ WARN("Number of decimal digits out of range [0-%d].",
+ DEV_PRECISION_MAX);
+
+ if (precision < 0) {
+ dev_unit.precision = 0;
+ } else if (precision > DEV_PRECISION_MAX) {
+ dev_unit.precision = DEV_PRECISION_MAX;
+ } else {
+ dev_unit.precision = precision;
+ }
+ dev_unit.dvi2pts = dvi2pts;
+ dev_unit.min_bp_val = (long) ROUND(1.0/(ten_pow[dev_unit.precision]*dvi2pts), 1);
+ if (dev_unit.min_bp_val < 0)
+ dev_unit.min_bp_val = -dev_unit.min_bp_val;
+
+ dev_param.colormode = (black_and_white ? 0 : 1);
+
+ graphics_mode();
+ pdf_color_clear();
+ pdf_dev_init_gstates();
+
+ num_dev_fonts = 0;
+ max_dev_fonts = 0;
+ dev_fonts = NULL;
+}
+
+void
+pdf_close_device (void)
+{
+ if (dev_fonts) {
+ int i;
+
+ for (i = 0; i < num_dev_fonts; i++) {
+ if (dev_fonts[i].tex_name)
+ RELEASE(dev_fonts[i].tex_name);
+ if (dev_fonts[i].resource)
+ pdf_release_obj(dev_fonts[i].resource);
+ dev_fonts[i].tex_name = NULL;
+ dev_fonts[i].resource = NULL;
+ }
+ RELEASE(dev_fonts);
+ }
+ dev_fonts = NULL;
+ num_dev_fonts = 0;
+ max_dev_fonts = 0;
+
+ pdf_dev_clean_gstates();
+}
+
+/*
+ * BOP, EOP, and FONT section.
+ * BOP and EOP manipulate some of the same data structures
+ * as the font stuff.
+ */
+
+
+/*
+ * The following routine is here for forms. Since a form is
+ * self-contained, it will need its own Tf command at the
+ * beginningg even if it is continuing to set type in the
+ * current font. This routine simply forces reinstantiation
+ * of the current font.
+ */
+void
+pdf_dev_reset (void)
+{
+ pdf_dev_reset_fonts();
+ pdf_dev_reset_color();
+}
+
+void
+pdf_dev_reset_fonts (void)
+{
+ int i;
+
+ for (i = 0; i < num_dev_fonts; i++) {
+ dev_fonts[i].used_on_this_page = 0;
+ }
+
+ text_state.font_id = -1;
+
+ text_state.matrix.slant = 0.0;
+ text_state.matrix.extend = 1.0;
+ text_state.matrix.rotate = TEXT_WMODE_HH;
+
+ text_state.bold_param = 0.0;
+
+ text_state.is_mb = 0;
+}
+
+/* Not working */
+void
+pdf_dev_set_origin (double phys_x, double phys_y)
+{
+ pdf_tmatrix M0, M1;
+
+ pdf_dev_currentmatrix(&M0);
+ pdf_dev_currentmatrix(&M1);
+ pdf_invertmatrix(&M1);
+ M0.e = phys_x; M0.f = phys_y;
+ pdf_concatmatrix(&M1, &M0);
+
+ pdf_dev_concat(&M1);
+}
+
+static pdf_color saved_sc, saved_fc;
+static int have_saved_color = 0;
+
+void
+pdf_dev_bop (const pdf_tmatrix *M)
+{
+ graphics_mode();
+
+ text_state.force_reset = 0;
+
+ pdf_dev_gsave();
+ pdf_dev_concat(M);
+
+ pdf_dev_reset();
+
+ if (have_saved_color) {
+ pdf_dev_setcolor(&saved_sc, 0);
+ pdf_dev_setcolor(&saved_fc, 1);
+ }
+}
+
+void
+pdf_dev_eop (void)
+{
+ int depth;
+
+ graphics_mode();
+
+ /* preserve the current color for start of next page, so \special{color...}
+ doesn't cease to have any effect at a page break;
+ note that printing pages out of order will break the assumptions here */
+ pdf_dev_currentcolor(&saved_sc, 0);
+ pdf_dev_currentcolor(&saved_fc, 1);
+ have_saved_color = 1;
+
+ depth = pdf_dev_current_depth();
+ if (depth != 1) {
+ WARN("Unbalenced q/Q nesting...: %d", depth);
+ pdf_dev_grestore_to(0);
+ } else {
+ pdf_dev_grestore();
+ }
+}
+
+static void
+print_fontmap (const char *font_name, fontmap_rec *mrec)
+{
+ if (!mrec)
+ return;
+
+ MESG("\n");
+
+ MESG("fontmap: %s -> %s", font_name, mrec->font_name);
+ if (mrec->enc_name)
+ MESG("(%s)", mrec->enc_name);
+ if (mrec->opt.extend != 1.0)
+ MESG("[extend:%g]", mrec->opt.extend);
+ if (mrec->opt.slant != 0.0)
+ MESG("[slant:%g]", mrec->opt.slant);
+ if (mrec->opt.bold != 0.0)
+ MESG("[bold:%g]", mrec->opt.bold);
+ if (mrec->opt.flags & FONTMAP_OPT_REMAP)
+ MESG("[remap]");
+ if (mrec->opt.flags & FONTMAP_OPT_NOEMBED)
+ MESG("[noemb]");
+ if (mrec->opt.mapc >= 0)
+ MESG("[map:<%02x>]", mrec->opt.mapc);
+ if (mrec->opt.charcoll)
+ MESG("[csi:%s]", mrec->opt.charcoll);
+ if (mrec->opt.index)
+ MESG("[index:%d]", mrec->opt.index);
+
+ switch (mrec->opt.style) {
+ case FONTMAP_STYLE_BOLD:
+ MESG("[style:bold]");
+ break;
+ case FONTMAP_STYLE_ITALIC:
+ MESG("[style:italic]");
+ break;
+ case FONTMAP_STYLE_BOLDITALIC:
+ MESG("[style:bolditalic]");
+ break;
+ }
+ MESG("\n");
+
+}
+
+/* _FIXME_
+ * Font is identified with font_name and point_size as in DVI here.
+ * However, except for PDF_FONTTYPE_BITMAP, we can share the
+ * short_name, resource and used_chars between multiple instances
+ * of the same font at different sizes.
+ */
+int
+pdf_dev_locate_font (const char *font_name, spt_t ptsize)
+{
+ int i;
+ fontmap_rec *mrec;
+ struct dev_font *font;
+
+ if (!font_name)
+ return -1;
+
+ if (ptsize == 0) {
+ ERROR("pdf_dev_locate_font() called with the zero ptsize.");
+ return -1;
+ }
+
+ for (i = 0; i < num_dev_fonts; i++) {
+ if (strcmp(font_name, dev_fonts[i].tex_name) == 0) {
+ if (ptsize == dev_fonts[i].sptsize)
+ return i; /* found a dev_font that matches the request */
+ if (dev_fonts[i].format != PDF_FONTTYPE_BITMAP)
+ break; /* new dev_font will share pdf resource with /i/ */
+ }
+ }
+
+ /*
+ * Make sure we have room for a new one, even though we may not
+ * actually create one.
+ */
+ if (num_dev_fonts >= max_dev_fonts) {
+ max_dev_fonts += 16;
+ dev_fonts = RENEW(dev_fonts, max_dev_fonts, struct dev_font);
+ }
+
+ font = &dev_fonts[num_dev_fonts];
+
+ /* New font */
+ mrec = pdf_lookup_fontmap_record(font_name);
+
+ if (verbose > 1)
+ print_fontmap(font_name, mrec);
+
+ font->font_id = pdf_font_findresource(font_name, ptsize * dev_unit.dvi2pts, mrec);
+ if (font->font_id < 0)
+ return -1;
+
+ /* We found device font here. */
+ if (i < num_dev_fonts) {
+ font->real_font_index = i;
+ strcpy(font->short_name, dev_fonts[i].short_name);
+ }
+ else {
+ font->real_font_index = -1;
+ font->short_name[0] = 'F';
+ p_itoa(num_phys_fonts + 1, &font->short_name[1]); /* NULL terminated here */
+ num_phys_fonts++;
+ }
+
+ font->used_on_this_page = 0;
+
+ font->tex_name = NEW(strlen(font_name) + 1, char);
+ strcpy(font->tex_name, font_name);
+ font->sptsize = ptsize;
+
+ switch (pdf_get_font_subtype(font->font_id)) {
+ case PDF_FONT_FONTTYPE_TYPE3:
+ font->format = PDF_FONTTYPE_BITMAP;
+ break;
+ case PDF_FONT_FONTTYPE_TYPE0:
+ font->format = PDF_FONTTYPE_COMPOSITE;
+ break;
+ default:
+ font->format = PDF_FONTTYPE_SIMPLE;
+ break;
+ }
+
+ font->wmode = pdf_get_font_wmode (font->font_id);
+ font->enc_id = pdf_get_font_encoding(font->font_id);
+#ifdef XETEX
+ font->ft_to_gid = pdf_get_font_ft_to_gid(font->font_id);
+#endif
+
+ font->resource = NULL; /* Don't ref obj until font is actually used. */
+ font->used_chars = NULL;
+
+ font->extend = 1.0;
+ font->slant = 0.0;
+ font->bold = 0.0;
+ font->remap = 0;
+ font->mapc = -1;
+ font->is_unicode = 0;
+ font->ucs_group = 0;
+ font->ucs_plane = 0;
+
+ if (mrec) {
+ font->extend = mrec->opt.extend;
+ font->slant = mrec->opt.slant;
+ font->bold = mrec->opt.bold;
+ font->remap = (int) (mrec->opt.flags & FONTMAP_OPT_REMAP);
+ if (mrec->opt.mapc >= 0)
+ font->mapc = (mrec->opt.mapc >> 8) & 0xff;
+ else {
+ font->mapc = -1;
+ }
+ if (mrec->enc_name &&
+ !strcmp(mrec->enc_name, "unicode")) {
+ font->is_unicode = 1;
+ if (mrec->opt.mapc >= 0) {
+ font->ucs_group = (mrec->opt.mapc >> 24) & 0xff;
+ font->ucs_plane = (mrec->opt.mapc >> 16) & 0xff;
+ } else {
+ font->ucs_group = 0;
+ font->ucs_plane = 0;
+ }
+ } else {
+ font->is_unicode = 0;
+ }
+ }
+
+ return num_dev_fonts++;
+}
+
+
+/* This does not remember current stroking width. */
+static int
+dev_sprint_line (char *buf, spt_t width,
+ spt_t p0_x, spt_t p0_y, spt_t p1_x, spt_t p1_y)
+{
+ int len = 0;
+ double w;
+
+ w = width * dev_unit.dvi2pts;
+
+ len += p_dtoa(w, MIN(dev_unit.precision+1, DEV_PRECISION_MAX), buf+len);
+ buf[len++] = ' ';
+ buf[len++] = 'w';
+ buf[len++] = ' ';
+ len += dev_sprint_bp(buf+len, p0_x, NULL);
+ buf[len++] = ' ';
+ len += dev_sprint_bp(buf+len, p0_y, NULL);
+ buf[len++] = ' ';
+ buf[len++] = 'm';
+ buf[len++] = ' ';
+ len += dev_sprint_bp(buf+len, p1_x, NULL);
+ buf[len++] = ' ';
+ len += dev_sprint_bp(buf+len, p1_y, NULL);
+ buf[len++] = ' ';
+ buf[len++] = 'l';
+ buf[len++] = ' ';
+ buf[len++] = 'S';
+
+ return len;
+}
+
+/* Not optimized. */
+#define PDF_LINE_THICKNESS_MAX 5.0
+void
+pdf_dev_set_rule (spt_t xpos, spt_t ypos, spt_t width, spt_t height)
+{
+ int len = 0;
+ double width_in_bp;
+
+ graphics_mode();
+
+ format_buffer[len++] = ' ';
+ format_buffer[len++] = 'q';
+ format_buffer[len++] = ' ';
+ /* Don't use too thick line. */
+ width_in_bp = ((width < height) ? width : height) * dev_unit.dvi2pts;
+ if (width_in_bp < 0.0 || /* Shouldn't happen */
+ width_in_bp > PDF_LINE_THICKNESS_MAX) {
+ pdf_rect rect;
+
+ rect.llx = dev_unit.dvi2pts * xpos;
+ rect.lly = dev_unit.dvi2pts * ypos;
+ rect.urx = dev_unit.dvi2pts * width;
+ rect.ury = dev_unit.dvi2pts * height;
+ len += pdf_sprint_rect(format_buffer+len, &rect);
+ format_buffer[len++] = ' ';
+ format_buffer[len++] = 'r';
+ format_buffer[len++] = 'e';
+ format_buffer[len++] = ' ';
+ format_buffer[len++] = 'f';
+ } else {
+ if (width > height) {
+ /* NOTE:
+ * A line width of 0 denotes the thinnest line that can be rendered at
+ * device resolution. See, PDF Reference Manual 4th ed., sec. 4.3.2,
+ * "Details of Graphics State Parameters", p. 185.
+ */
+ if (height < dev_unit.min_bp_val) {
+ WARN("Too thin line: height=%ld (%g bp)", height, width_in_bp);
+ WARN("Please consider using \"-d\" option.");
+ }
+ len += dev_sprint_line(format_buffer+len,
+ height,
+ xpos,
+ ypos + height/2,
+ xpos + width,
+ ypos + height/2);
+ } else {
+ if (width < dev_unit.min_bp_val) {
+ WARN("Too thin line: width=%ld (%g bp)", width, width_in_bp);
+ WARN("Please consider using \"-d\" option.");
+ }
+ len += dev_sprint_line(format_buffer+len,
+ width,
+ xpos + width/2,
+ ypos,
+ xpos + width/2,
+ ypos + height);
+ }
+ }
+ format_buffer[len++] = ' ';
+ format_buffer[len++] = 'Q';
+ pdf_doc_add_page_content(format_buffer, len);
+}
+
+/* Rectangle in device space coordinate. */
+void
+pdf_dev_set_rect (pdf_rect *rect,
+ spt_t x_user, spt_t y_user,
+ spt_t width, spt_t height, spt_t depth)
+{
+ double dev_x, dev_y;
+ pdf_coord p0, p1, p2, p3;
+ double min_x, min_y, max_x, max_y;
+
+ dev_x = x_user * dev_unit.dvi2pts;
+ dev_y = y_user * dev_unit.dvi2pts;
+ if (text_state.dir_mode) {
+ p0.x = dev_x - dev_unit.dvi2pts * depth;
+ p0.y = dev_y - dev_unit.dvi2pts * width;
+ p1.x = dev_x + dev_unit.dvi2pts * height;
+ p1.y = p0.y;
+ p2.x = p1.x;
+ p2.y = dev_y;
+ p3.x = p0.x;
+ p3.y = p2.y;
+ } else {
+ p0.x = dev_x;
+ p0.y = dev_y - dev_unit.dvi2pts * depth;
+ p1.x = dev_x + dev_unit.dvi2pts * width;
+ p1.y = p0.y;
+ p2.x = p1.x;
+ p2.y = dev_y + dev_unit.dvi2pts * height;
+ p3.x = p0.x;
+ p3.y = p2.y;
+ }
+
+ pdf_dev_transform(&p0, NULL); /* currentmatrix */
+ pdf_dev_transform(&p1, NULL);
+ pdf_dev_transform(&p2, NULL);
+ pdf_dev_transform(&p3, NULL);
+
+ min_x = MIN(p0.x , p1.x);
+ min_x = MIN(min_x, p2.x);
+ min_x = MIN(min_x, p3.x);
+
+ max_x = MAX(p0.x , p1.x);
+ max_x = MAX(max_x, p2.x);
+ max_x = MAX(max_x, p3.x);
+
+ min_y = MIN(p0.y , p1.y);
+ min_y = MIN(min_y, p2.y);
+ min_y = MIN(min_y, p3.y);
+
+ max_y = MAX(p0.y , p1.y);
+ max_y = MAX(max_y, p2.y);
+ max_y = MAX(max_y, p3.y);
+
+ rect->llx = min_x;
+ rect->lly = min_y;
+ rect->urx = max_x;
+ rect->ury = max_y;
+
+ return;
+}
+
+int
+pdf_dev_get_dirmode (void)
+{
+ return text_state.dir_mode;
+}
+
+void
+pdf_dev_set_dirmode (int text_dir)
+{
+ struct dev_font *font;
+ int text_rotate;
+ int vert_dir, vert_font;
+
+ font = CURRENTFONT();
+
+ vert_font = (font && font->wmode) ? 1 : 0;
+ if (dev_param.autorotate) {
+ vert_dir = text_dir ? 1 : 0;
+ } else {
+ vert_dir = vert_font;
+ }
+ text_rotate = (vert_font << 1)|vert_dir;
+
+ if (font &&
+ ANGLE_CHANGES(text_rotate, text_state.matrix.rotate)) {
+ text_state.force_reset = 1;
+ }
+
+ text_state.matrix.rotate = text_rotate;
+ text_state.dir_mode = text_dir;
+}
+
+static void
+dev_set_param_autorotate (int auto_rotate)
+{
+ struct dev_font *font;
+ int text_rotate, vert_font, vert_dir;
+
+ font = CURRENTFONT();
+
+ vert_font = (font && font->wmode) ? 1 : 0;
+ if (auto_rotate) {
+ vert_dir = text_state.dir_mode ? 1 : 0;
+ } else {
+ vert_dir = vert_font;
+ }
+ text_rotate = (vert_font << 1)|vert_dir;
+
+ if (ANGLE_CHANGES(text_rotate, text_state.matrix.rotate)) {
+ text_state.force_reset = 1;
+ }
+ text_state.matrix.rotate = text_rotate;
+ dev_param.autorotate = auto_rotate;
+}
+
+int
+pdf_dev_get_param (int param_type)
+{
+ int value = 0;
+
+ switch (param_type) {
+ case PDF_DEV_PARAM_AUTOROTATE:
+ value = dev_param.autorotate;
+ break;
+ case PDF_DEV_PARAM_COLORMODE:
+ value = dev_param.colormode;
+ break;
+ default:
+ ERROR("Unknown device parameter: %d", param_type);
+ }
+
+ return value;
+}
+
+void
+pdf_dev_set_param (int param_type, int value)
+{
+ switch (param_type) {
+ case PDF_DEV_PARAM_AUTOROTATE:
+ dev_set_param_autorotate(value);
+ break;
+ case PDF_DEV_PARAM_COLORMODE:
+ dev_param.colormode = value; /* 0 for B&W */
+ break;
+ default:
+ ERROR("Unknown device parameter: %d", param_type);
+ }
+
+ return;
+}
+
+
+int
+pdf_dev_put_image (int id,
+ transform_info *p,
+ double ref_x,
+ double ref_y)
+{
+ char *res_name;
+ pdf_tmatrix M;
+ pdf_rect r;
+ int len = 0;
+
+ pdf_copymatrix(&M, &(p->matrix));
+ M.e += ref_x; M.f += ref_y;
+ /* Just rotate by -90, but not tested yet. Any problem if M has scaling? */
+ if (dev_param.autorotate &&
+ text_state.dir_mode) {
+ double tmp;
+ tmp = -M.a; M.a = M.b; M.b = tmp;
+ tmp = -M.c; M.c = M.d; M.d = tmp;
+ }
+
+ graphics_mode();
+ pdf_dev_gsave();
+
+ pdf_dev_concat(&M);
+
+ pdf_ximage_scale_image(id, &M, &r, p);
+ pdf_dev_concat(&M);
+
+ /* Clip */
+ if (p->flags & INFO_DO_CLIP) {
+#if 0
+ pdf_dev_newpath();
+ pdf_dev_moveto(r.llx, r.lly);
+ pdf_dev_lineto(r.urx, r.lly);
+ pdf_dev_lineto(r.urx, r.ury);
+ pdf_dev_lineto(r.llx, r.ury);
+ pdf_dev_closepath();
+ pdf_dev_clip();
+ pdf_dev_newpath();
+#else
+ pdf_dev_rectclip(r.llx, r.lly, r.urx - r.llx, r.ury - r.lly);
+#endif
+ }
+
+ res_name = pdf_ximage_get_resname(id);
+ len = sprintf(work_buffer, " /%s Do", res_name);
+ pdf_doc_add_page_content(work_buffer, len);
+
+ pdf_dev_grestore();
+
+ pdf_doc_add_page_resource("XObject",
+ res_name,
+ pdf_ximage_get_reference(id));
+
+ return 0;
+}
+
+
+void
+transform_info_clear (transform_info *info)
+{
+ /* Physical dimensions */
+ info->width = 0.0;
+ info->height = 0.0;
+ info->depth = 0.0;
+
+ info->bbox.llx = 0.0;
+ info->bbox.lly = 0.0;
+ info->bbox.urx = 0.0;
+ info->bbox.ury = 0.0;
+
+ /* Transformation matrix */
+ pdf_setmatrix(&(info->matrix), 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
+
+ info->flags = 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdev.h b/Build/source/texk/xdvipdfmx/src/pdfdev.h
new file mode 100644
index 00000000000..dbc28cf36fb
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfdev.h
@@ -0,0 +1,220 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfdev.h,v 1.18 2005/08/12 18:22:24 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFDEV_H_
+#define _PDFDEV_H_
+
+#include "numbers.h"
+#include "pdfobj.h"
+
+typedef signed long spt_t;
+
+typedef struct pdf_tmatrix
+{
+ double a, b, c, d, e, f;
+} pdf_tmatrix;
+
+typedef struct pdf_rect
+{
+ double llx, lly, urx, ury;
+} pdf_rect;
+
+typedef struct pdf_coord
+{
+ double x, y;
+} pdf_coord;
+
+/* The name transform_info is misleading.
+ * I'll put this here for a moment...
+ */
+typedef struct
+{
+ /* Physical dimensions
+ *
+ * If those values are given, images will be scaled
+ * and/or shifted to fit within a box described by
+ * those values.
+ */
+ double width;
+ double height;
+ double depth;
+
+ pdf_tmatrix matrix; /* transform matrix */
+ pdf_rect bbox; /* user_bbox */
+
+ int flags;
+} transform_info;
+#define INFO_HAS_USER_BBOX (1 << 0)
+#define INFO_HAS_WIDTH (1 << 1)
+#define INFO_HAS_HEIGHT (1 << 2)
+#define INFO_DO_CLIP (1 << 3)
+extern void transform_info_clear (transform_info *info);
+
+
+extern void pdf_dev_set_verbose (void);
+
+/* Not in spt_t. */
+extern int pdf_sprint_matrix (char *buf, const pdf_tmatrix *p);
+extern int pdf_sprint_rect (char *buf, const pdf_rect *p);
+extern int pdf_sprint_coord (char *buf, const pdf_coord *p);
+extern int pdf_sprint_length (char *buf, double value);
+extern int pdf_sprint_number (char *buf, double value);
+
+/* unit_conv: multiplier for input unit (spt_t) to bp conversion.
+ * precision: How many fractional digits preserved in output (not real
+ * accuracy control).
+ * is_bw: Ignore color related special instructions.
+ */
+extern void pdf_init_device (double unit_conv, int precision, int is_bw);
+extern void pdf_close_device (void);
+
+/* returns 1.0/unit_conv */
+extern double dev_unit_dviunit (void);
+
+#if 0
+/* DVI interpreter knows text positioning in relative motion.
+ * However, pdf_dev_set_string() recieves text string with placement
+ * in absolute position in user space, and it convert absolute
+ * positioning back to relative positioning. It is quite wasteful.
+ *
+ * TeX using DVI register stack operation to do CR and then use down
+ * command for LF. DVI interpreter knows hint for current leading
+ * and others (raised or lowered), but they are mostly lost in
+ * pdf_dev_set_string().
+ */
+
+typedef struct
+{
+ int argc;
+
+ struct {
+ int is_kern; /* kern or string */
+
+ spt_t kern; /* negative kern means space */
+
+ int offset; /* offset to sbuf */
+ int length; /* length of string */
+ } args[];
+
+ unsigned char sbuf[PDF_STRING_LEN_MAX];
+
+} pdf_text_string;
+
+/* Something for handling raise, leading, etc. here. */
+
+#endif
+
+/* Draw texts and rules:
+ *
+ * xpos, ypos, width, and height are all fixed-point numbers
+ * converted to big-points by multiplying unit_conv (dvi2pts).
+ * They must be position in the user space.
+ *
+ * ctype:
+ * 0 - input string is in multi-byte encoding.
+ * 1 - input string is in 8-bit encoding.
+ * 2 - input string is in 16-bit encoding.
+ */
+extern void pdf_dev_set_string (spt_t xpos, spt_t ypos,
+ const void *instr_ptr, int instr_len,
+ spt_t text_width,
+ int font_id, int ctype);
+extern void pdf_dev_set_rule (spt_t xpos, spt_t ypos,
+ spt_t width, spt_t height);
+
+/* Place XObject */
+extern int pdf_dev_put_image (int xobj_id,
+ transform_info *p, double ref_x, double ref_y);
+
+/* The design_size and ptsize required by PK font support...
+ */
+extern int pdf_dev_locate_font (const char *font_name, spt_t ptsize);
+
+extern int pdf_dev_setfont (const char *font_name, spt_t ptsize);
+
+/* The following two routines are NOT WORKING.
+ * Dvipdfmx doesn't manage gstate well..
+ */
+/* pdf_dev_translate() or pdf_dev_concat() should be used. */
+extern void pdf_dev_set_origin (double orig_x, double orig_y);
+/* Always returns 1.0, please rename this. */
+extern double pdf_dev_scale (void);
+
+/* Access text state parameters. */
+extern int pdf_dev_currentfont (void); /* returns font_id */
+extern double pdf_dev_get_font_ptsize (int font_id);
+extern int pdf_dev_get_font_wmode (int font_id); /* ps: special support want this (pTeX). */
+
+/* Text composition (direction) mode
+ * This affects only when auto_rotate is enabled.
+ */
+extern int pdf_dev_get_dirmode (void);
+extern void pdf_dev_set_dirmode (int dir_mode);
+
+/* Set rect to rectangle in device space.
+ * Unit conversion spt_t to bp and transformation applied within it.
+ */
+extern void pdf_dev_set_rect (pdf_rect *rect,
+ spt_t x_pos, spt_t y_pos,
+ spt_t width, spt_t height, spt_t depth);
+
+/* Accessor to various device parameters.
+ */
+#define PDF_DEV_PARAM_AUTOROTATE 1
+#define PDF_DEV_PARAM_COLORMODE 2
+
+extern int pdf_dev_get_param (int param_type);
+extern void pdf_dev_set_param (int param_type, int value);
+
+/* Text composition mode is ignored (always same as font's
+ * writing mode) and glyph rotation is not enabled if
+ * auto_rotate is unset.
+ */
+#define pdf_dev_set_autorotate(v) pdf_dev_set_param(PDF_DEV_PARAM_AUTOROTATE, (v))
+#define pdf_dev_set_colormode(v) pdf_dev_set_param(PDF_DEV_PARAM_COLORMODE, (v))
+
+/*
+ * For pdf_doc, pdf_draw and others.
+ */
+
+/* Force reselecting font and color:
+ * XFrom (content grabbing) and Metapost support want them.
+ */
+extern void pdf_dev_reset_fonts (void);
+extern void pdf_dev_reset_color (void);
+extern void pdf_dev_reset (void); /* Does both font and color */
+
+/* Initialization of transformation matrix with M and others.
+ * They are called within pdf_doc_begin_page() and pdf_doc_end_page().
+ */
+extern void pdf_dev_bop (const pdf_tmatrix *M);
+extern void pdf_dev_eop (void);
+
+/* Text is normal and line art is not normal in dvipdfmx. So we don't have
+ * begin_text (BT in PDF) and end_text (ET), but instead we have graphics_mode()
+ * to terminate text section. pdf_dev_flushpath() and others call this.
+ */
+extern void graphics_mode (void);
+
+#endif /* _PDFDEV_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdoc.c b/Build/source/texk/xdvipdfmx/src/pdfdoc.c
new file mode 100644
index 00000000000..a15c4773ba5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfdoc.c
@@ -0,0 +1,2362 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfdoc.c,v 1.43 2005/09/06 04:17:15 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * TODO: Many things...
+ * {begin,end}_{bead,article}, box stack, name tree (not limited to dests)...
+ */
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <time.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+
+#include "numbers.h"
+
+#include "pdfobj.h"
+#include "pdfparse.h"
+#include "pdfnames.h"
+
+#include "pdfencrypt.h"
+
+#include "pdfdev.h"
+#include "pdfdraw.h"
+#include "pdfcolor.h"
+
+#include "pdfresource.h"
+#include "pdffont.h"
+#include "pdfximage.h"
+
+#include "pdflimits.h"
+
+#ifndef NO_THUMBNAIL
+#include "pngimage.h"
+#include "jpegimage.h"
+#endif /* !NO_THUMBNAIL */
+
+#include "pdfdoc.h"
+
+#define PDFDOC_PAGES_ALLOC_SIZE 128u
+#define PDFDOC_ARTICLE_ALLOC_SIZE 16
+#define PDFDOC_BEAD_ALLOC_SIZE 16
+
+static int verbose = 0;
+
+#ifndef NO_THUMBNAIL
+static char thumb_enabled = 0;
+static char *thumb_basename = NULL;
+static char thumb_remove = 0;
+
+void
+pdf_doc_enable_thumbnails (int t_remove)
+{
+#if HAVE_LIBPNG
+ thumb_enabled = 1;
+ thumb_remove = t_remove;
+#else
+ WARN("Thumbnail support not available without PNG support.");
+#endif
+}
+
+#define DEFAULT_TMPDIR "/tmp"
+static char *
+guess_thumb_name (const char *thumb_filename)
+{
+ /* Build path name for anticipated thumbnail image */
+ char *tmpdir, *tmpname;
+
+ if (!(tmpdir = getenv("TMP")) &&
+ !(tmpdir = getenv("TEMP")))
+ tmpdir = (char *) DEFAULT_TMPDIR;
+ tmpname = NEW(strlen(tmpdir) +
+ strlen(thumb_filename) + strlen(DIR_SEP_STRING) + 1,
+ char);
+ strcpy(tmpname, tmpdir);
+ if (!IS_DIR_SEP(tmpname[strlen(tmpname)-1])) {
+ strcat(tmpname, DIR_SEP_STRING);
+ }
+ strcat(tmpname, thumb_filename);
+
+ return tmpname;
+}
+
+#ifndef HAVE_LIBPNG
+static pdf_obj *
+read_thumbnail (const char *thumb_filename)
+{
+ WARN("Thumbnail support not available without PNG support.");
+}
+#else /* HAVE_LIBPNG */
+static pdf_obj *
+read_thumbnail (const char *thumb_filename)
+{
+ pdf_obj *image_ref;
+ int xobj_id;
+ char *guess_filename = NULL;
+ int found_in_cwd = 0;
+ FILE *fp;
+
+ guess_filename = guess_thumb_name(thumb_filename);
+ if ((fp = MFOPEN(thumb_filename, FOPEN_RBIN_MODE))) {
+ found_in_cwd = 1;
+ } else {
+ fp = MFOPEN(guess_filename, FOPEN_RBIN_MODE);
+ }
+
+ if (!fp) {
+ WARN("Could not open thumbnail file \"%s\"", thumb_filename);
+ if (guess_filename)
+ RELEASE(guess_filename);
+ return NULL;
+ } else if (!check_for_png(fp) && !check_for_jpeg(fp)) {
+ WARN("Thumbnail \"%s\" not a png/jpeg file!", thumb_filename);
+ MFCLOSE(fp);
+ if (guess_filename)
+ RELEASE(guess_filename);
+ return NULL;
+ }
+ MFCLOSE(fp);
+
+ if (found_in_cwd) {
+ xobj_id = pdf_ximage_findresource(thumb_filename, 0, 0);
+ } else {
+ xobj_id = pdf_ximage_findresource(guess_filename, 0, 0);
+ }
+
+ if (xobj_id < 0) {
+ WARN("Could not read thumbnail file \"%s\".", thumb_filename);
+ image_ref = NULL;
+ } else {
+ image_ref = pdf_ximage_get_reference(xobj_id);
+ }
+
+ if (thumb_remove && found_in_cwd) {
+ if (verbose > 1)
+ MESG("\ndeleting thumbnail file \"%s\"...\n", thumb_filename);
+ remove(thumb_filename);
+ } else if (thumb_remove) {
+ if (verbose > 1)
+ MESG("\ndeleting thumbnail file \"%s\"...\n", guess_filename);
+ remove(guess_filename);
+ }
+
+ if (guess_filename)
+ RELEASE(guess_filename);
+
+ return image_ref;
+}
+
+#endif /* HAVE_LIBPNG */
+#endif /* !NO_THUMBNAIL */
+
+void
+pdf_doc_set_verbose (void)
+{
+ verbose++;
+ pdf_font_set_verbose();
+ pdf_color_set_verbose();
+ pdf_ximage_set_verbose();
+}
+
+typedef struct pdf_form
+{
+ char *ident;
+
+ pdf_tmatrix matrix;
+ pdf_rect cropbox;
+
+ pdf_obj *resources;
+ pdf_obj *contents;
+} pdf_form;
+
+struct form_list_node
+{
+ int q_depth;
+ pdf_form form;
+
+ struct form_list_node *prev;
+};
+
+#define USE_MY_MEDIABOX (1 << 0)
+typedef struct pdf_page
+{
+ pdf_obj *page_obj;
+ pdf_obj *page_ref;
+
+ int flags;
+
+ double ref_x, ref_y;
+ pdf_rect cropbox;
+
+ pdf_obj *resources;
+
+ /* Contents */
+ pdf_obj *background;
+ pdf_obj *contents;
+
+ /* global bop, background, contents, global eop */
+ pdf_obj *content_refs[4];
+
+ pdf_obj *annots;
+ pdf_obj *beads;
+} pdf_page;
+
+typedef struct pdf_olitem
+{
+ pdf_obj *dict;
+
+ int is_open;
+
+ struct pdf_olitem *first;
+ struct pdf_olitem *parent;
+
+ struct pdf_olitem *next;
+} pdf_olitem;
+
+typedef struct pdf_bead
+{
+ char *id;
+ long page_no;
+ pdf_rect rect;
+} pdf_bead;
+
+typedef struct pdf_article
+{
+ char *id;
+ pdf_obj *info;
+ long num_beads;
+ long max_beads;
+ pdf_bead *beads;
+} pdf_article;
+
+struct name_dict
+{
+ char *category;
+ struct ht_table *data;
+};
+
+
+typedef struct pdf_doc
+{
+ struct {
+ pdf_obj *dict;
+
+ pdf_obj *viewerpref;
+ pdf_obj *pagelabels;
+ pdf_obj *pages;
+ pdf_obj *names;
+ pdf_obj *threads;
+ } root;
+
+ pdf_obj *info;
+
+ struct {
+ pdf_rect mediabox;
+ pdf_obj *bop, *eop;
+
+ long num_entries; /* This is not actually total number of pages. */
+ long max_entries;
+ pdf_page *entries;
+ } pages;
+
+ struct {
+ pdf_olitem *first;
+ pdf_olitem *current;
+ int current_depth;
+ } outlines;
+
+ struct {
+ long num_entries;
+ long max_entries;
+ pdf_article *entries;
+ } articles;
+
+ struct name_dict *names;
+
+ struct {
+ int outline_open_depth;
+ double annot_grow;
+ } opt;
+
+ struct form_list_node *pending_forms;
+
+} pdf_doc;
+static pdf_doc pdoc;
+
+static void
+pdf_doc_init_catalog (pdf_doc *p)
+{
+ p->root.viewerpref = NULL;
+ p->root.pagelabels = NULL;
+ p->root.pages = NULL;
+ p->root.names = NULL;
+ p->root.threads = NULL;
+
+ p->root.dict = pdf_new_dict();
+ pdf_set_root(p->root.dict);
+
+ return;
+}
+
+static void
+pdf_doc_close_catalog (pdf_doc *p)
+{
+ pdf_obj *tmp;
+
+ if (p->root.viewerpref) {
+ tmp = pdf_lookup_dict(p->root.dict, "ViewerPreferences");
+ if (!tmp) {
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("ViewerPreferences"),
+ pdf_ref_obj (p->root.viewerpref));
+ } else if (PDF_OBJ_DICTTYPE(tmp)) {
+ pdf_merge_dict(p->root.viewerpref, tmp);
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("ViewerPreferences"),
+ pdf_ref_obj (p->root.viewerpref));
+ } else { /* Maybe reference */
+ /* What should I do? */
+ WARN("Could not modify ViewerPreferences.");
+ }
+ pdf_release_obj(p->root.viewerpref);
+ p->root.viewerpref = NULL;
+ }
+
+ if (p->root.pagelabels) {
+ tmp = pdf_lookup_dict(p->root.dict, "PageLabels");
+ if (!tmp) {
+ tmp = pdf_new_dict();
+ pdf_add_dict(tmp, pdf_new_name("Nums"), pdf_link_obj(p->root.pagelabels));
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("PageLabels"), pdf_ref_obj(tmp));
+ pdf_release_obj(tmp);
+ } else { /* Maybe reference */
+ /* What should I do? */
+ WARN("Could not modify PageLabels.");
+ }
+ pdf_release_obj(p->root.pagelabels);
+ p->root.pagelabels = NULL;
+ }
+
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("Type"), pdf_new_name("Catalog"));
+ pdf_release_obj(p->root.dict);
+ p->root.dict = NULL;
+
+ return;
+}
+
+/*
+ * Pages are starting at 1.
+ * The page count does not increase until the page is finished.
+ */
+#define LASTPAGE(p) (&(p->pages.entries[p->pages.num_entries]))
+#define FIRSTPAGE(p) (&(p->pages.entries[0]))
+#define PAGECOUNT(p) (p->pages.num_entries)
+#define MAXPAGES(p) (p->pages.max_entries)
+
+static void
+doc_resize_page_entries (pdf_doc *p, long size)
+{
+ if (size > MAXPAGES(p)) {
+ long i;
+
+ p->pages.entries = RENEW(p->pages.entries, size, struct pdf_page);
+ for (i = p->pages.max_entries; i < size; i++) {
+ p->pages.entries[i].page_obj = NULL;
+ p->pages.entries[i].page_ref = NULL;
+ p->pages.entries[i].flags = 0;
+ p->pages.entries[i].resources = NULL;
+ p->pages.entries[i].background = NULL;
+ p->pages.entries[i].contents = NULL;
+ p->pages.entries[i].content_refs[0] = NULL; /* global bop */
+ p->pages.entries[i].content_refs[1] = NULL; /* background */
+ p->pages.entries[i].content_refs[2] = NULL; /* page body */
+ p->pages.entries[i].content_refs[3] = NULL; /* global eop */
+ p->pages.entries[i].annots = NULL;
+ p->pages.entries[i].beads = NULL;
+ }
+ p->pages.max_entries = size;
+ }
+
+ return;
+}
+
+static pdf_page *
+doc_get_page_entry (pdf_doc *p, unsigned long page_no)
+{
+ pdf_page *page;
+
+ if (page_no > 65535ul) {
+ ERROR("Page number %ul too large!", page_no);
+ } else if (page_no == 0) {
+ ERROR("Invalid Page number %ul.", page_no);
+ }
+
+ if (page_no > MAXPAGES(p)) {
+ doc_resize_page_entries(p, page_no + PDFDOC_PAGES_ALLOC_SIZE);
+ }
+
+ page = &(p->pages.entries[page_no - 1]);
+
+ return page;
+}
+
+static void pdf_doc_init_page_tree (pdf_doc *p, double media_width, double media_height);
+static void pdf_doc_close_page_tree (pdf_doc *p);
+
+static void pdf_doc_init_names (pdf_doc *p);
+static void pdf_doc_close_names (pdf_doc *p);
+
+static void pdf_doc_init_docinfo (pdf_doc *p);
+static void pdf_doc_close_docinfo (pdf_doc *p);
+
+static void pdf_doc_init_articles (pdf_doc *p);
+static void pdf_doc_close_articles (pdf_doc *p);
+static void pdf_doc_init_bookmarks (pdf_doc *p, int bm_open_depth);
+static void pdf_doc_close_bookmarks (pdf_doc *p);
+
+void
+pdf_doc_set_bop_content (const char *content, unsigned length)
+{
+ pdf_doc *p = &pdoc;
+
+ ASSERT(p);
+
+ if (p->pages.bop) {
+ pdf_release_obj(p->pages.bop);
+ p->pages.bop = NULL;
+ }
+
+ if (length > 0) {
+ p->pages.bop = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(p->pages.bop, content, length);
+ } else {
+ p->pages.bop = NULL;
+ }
+
+ return;
+}
+
+void
+pdf_doc_set_eop_content (const char *content, unsigned length)
+{
+ pdf_doc *p = &pdoc;
+
+ if (p->pages.eop) {
+ pdf_release_obj(p->pages.eop);
+ p->pages.eop = NULL;
+ }
+
+ if (length > 0) {
+ p->pages.eop = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(p->pages.eop, content, length);
+ } else {
+ p->pages.eop = NULL;
+ }
+
+ return;
+}
+
+/*
+ * Docinfo
+ */
+static long
+asn_date (char *date_string)
+{
+#if 0 /* this is non-portable, as not all systems have the tm_gmtoff field */
+ time_t current_time;
+ struct tm *bd_time;
+
+ time(&current_time);
+ bd_time = localtime(&current_time);
+ sprintf(date_string, "D:%04d%02d%02d%02d%02d%02d%+03ld'%02ld'",
+ bd_time->tm_year + 1900, bd_time->tm_mon + 1, bd_time->tm_mday,
+ bd_time->tm_hour, bd_time->tm_min, bd_time->tm_sec,
+ -(bd_time->tm_gmtoff / 3600), (bd_time->tm_gmtoff % 3600) / 60);
+ return strlen(date_string);
+#else /* simplified version that should work everywhere */
+ time_t current_time;
+ char *time_str;
+ int len;
+ time(&current_time);
+ time_str = ctime(&current_time);
+ strcpy(date_string, time_str);
+ len = strlen(date_string);
+ if (len > 0 && date_string[len-1] == '\n')
+ date_string[--len] = '\0';
+ return len;
+#endif
+}
+
+static void
+pdf_doc_init_docinfo (pdf_doc *p)
+{
+ p->info = pdf_new_dict();
+ pdf_set_info(p->info);
+
+ return;
+}
+
+static void
+pdf_doc_close_docinfo (pdf_doc *p)
+{
+ pdf_obj *docinfo = p->info;
+
+ /*
+ * Excerpt from PDF Reference 4th ed., sec. 10.2.1.
+ *
+ * Any entry whose value is not known should be omitted from the dictionary,
+ * rather than included with an empty string as its value.
+ *
+ * ....
+ *
+ * Note: Although viewer applications can store custom metadata in the document
+ * information dictionary, it is inappropriate to store private content or
+ * structural information there; such information should be stored in the
+ * document catalog instead (see Section 3.6.1, Document Catalog ).
+ */
+ const char *keys[] = {
+ "Title", "Author", "Subject", "Keywords", "Creator", "Producer",
+ "CreationDate", "ModDate", /* Date */
+ NULL
+ };
+ pdf_obj *value;
+ char *banner;
+ int i;
+
+ for (i = 0; keys[i] != NULL; i++) {
+ value = pdf_lookup_dict(docinfo, keys[i]);
+ if (value) {
+ if (!PDF_OBJ_STRINGTYPE(value)) {
+ WARN("\"%s\" in DocInfo dictionary not string type.", keys[i]);
+ pdf_remove_dict(docinfo, keys[i]);
+ WARN("\"%s\" removed from DocInfo.", keys[i]);
+ } else if (pdf_string_length(value) == 0) {
+ /* The hyperref package often uses emtpy strings. */
+ pdf_remove_dict(docinfo, keys[i]);
+ }
+ }
+ }
+
+ banner = NEW(strlen(PACKAGE)+strlen(VERSION)+4, char);
+ sprintf(banner, "%s (%s)", PACKAGE, VERSION);
+ pdf_add_dict(docinfo,
+ pdf_new_name("Producer"),
+ pdf_new_string(banner, strlen(banner)));
+ RELEASE(banner);
+
+ if (!pdf_lookup_dict(docinfo, "CreationDate")) {
+ char now[32];
+
+ asn_date(now);
+ pdf_add_dict(docinfo,
+ pdf_new_name ("CreationDate"),
+ pdf_new_string(now, strlen(now)));
+ }
+
+ pdf_release_obj(docinfo);
+ p->info = NULL;
+
+ return;
+}
+
+static pdf_obj *
+pdf_doc_get_page_resources (pdf_doc *p, const char *category)
+{
+ pdf_obj *resources;
+ pdf_page *currentpage;
+ pdf_obj *res_dict;
+
+ if (!p || !category) {
+ return NULL;
+ }
+
+ if (p->pending_forms) {
+ if (p->pending_forms->form.resources) {
+ res_dict = p->pending_forms->form.resources;
+ } else {
+ res_dict = p->pending_forms->form.resources = pdf_new_dict();
+ }
+ } else {
+ currentpage = LASTPAGE(p);
+ if (currentpage->resources) {
+ res_dict = currentpage->resources;
+ } else {
+ res_dict = currentpage->resources = pdf_new_dict();
+ }
+ }
+ resources = pdf_lookup_dict(res_dict, category);
+ if (!resources) {
+ resources = pdf_new_dict();
+ pdf_add_dict(res_dict, pdf_new_name(category), resources);
+ }
+
+ return resources;
+}
+
+void
+pdf_doc_add_page_resource (const char *category,
+ const char *resource_name, pdf_obj *resource_ref)
+{
+ pdf_doc *p = &pdoc;
+ pdf_obj *resources;
+ pdf_obj *duplicate;
+
+ if (!PDF_OBJ_INDIRECTTYPE(resource_ref)) {
+ WARN("Passed non indirect reference...");
+ resource_ref = pdf_ref_obj(resource_ref); /* leak */
+ }
+ resources = pdf_doc_get_page_resources(p, category);
+ duplicate = pdf_lookup_dict(resources, resource_name);
+ if (duplicate && pdf_compare_reference(duplicate, resource_ref)) {
+ WARN("Conflicting page resource found (page: %ld, category: %s, name: %s).",
+ pdf_doc_current_page_number(), category, resource_name);
+ WARN("Ignoring...");
+ pdf_release_obj(resource_ref);
+ } else {
+ pdf_add_dict(resources, pdf_new_name(resource_name), resource_ref);
+ }
+
+ return;
+}
+
+static void
+doc_flush_page (pdf_doc *p, pdf_page *page, pdf_obj *parent_ref)
+{
+ pdf_obj *contents_array;
+ int count;
+
+ pdf_add_dict(page->page_obj,
+ pdf_new_name("Type"), pdf_new_name("Page"));
+ pdf_add_dict(page->page_obj,
+ pdf_new_name("Parent"), parent_ref);
+
+ /*
+ * Clipping area specified by CropBox is affected by MediaBox which
+ * might be inherit from parent node. If MediaBox of the root node
+ * does not have enough size to cover all page's imaging area, using
+ * CropBox here gives incorrect result.
+ */
+ if (page->flags & USE_MY_MEDIABOX) {
+ pdf_obj *mediabox;
+
+ mediabox = pdf_new_array();
+ pdf_add_array(mediabox,
+ pdf_new_number(ROUND(page->cropbox.llx, 0.01)));
+ pdf_add_array(mediabox,
+ pdf_new_number(ROUND(page->cropbox.lly, 0.01)));
+ pdf_add_array(mediabox,
+ pdf_new_number(ROUND(page->cropbox.urx, 0.01)));
+ pdf_add_array(mediabox,
+ pdf_new_number(ROUND(page->cropbox.ury, 0.01)));
+ pdf_add_dict(page->page_obj, pdf_new_name("MediaBox"), mediabox);
+ }
+
+ count = 0;
+ contents_array = pdf_new_array();
+ if (page->content_refs[0]) { /* global bop */
+ pdf_add_array(contents_array, page->content_refs[0]);
+ count++;
+ } else if (p->pages.bop &&
+ pdf_stream_length(p->pages.bop) > 0) {
+ pdf_add_array(contents_array, pdf_ref_obj(p->pages.bop));
+ count++;
+ }
+ if (page->content_refs[1]) { /* background */
+ pdf_add_array(contents_array, page->content_refs[1]);
+ count++;
+ }
+ if (page->content_refs[2]) { /* page body */
+ pdf_add_array(contents_array, page->content_refs[2]);
+ count++;
+ }
+ if (page->content_refs[3]) { /* global eop */
+ pdf_add_array(contents_array, page->content_refs[3]);
+ count++;
+ } else if (p->pages.eop &&
+ pdf_stream_length(p->pages.eop) > 0) {
+ pdf_add_array(contents_array, pdf_ref_obj(p->pages.eop));
+ count++;
+ }
+
+ if (count == 0) {
+ WARN("Page with empty content found!!!");
+ }
+ page->content_refs[0] = NULL;
+ page->content_refs[1] = NULL;
+ page->content_refs[2] = NULL;
+ page->content_refs[3] = NULL;
+
+ pdf_add_dict(page->page_obj,
+ pdf_new_name("Contents"), contents_array);
+
+
+ if (page->annots) {
+ pdf_add_dict(page->page_obj,
+ pdf_new_name("Annots"), pdf_ref_obj(page->annots));
+ pdf_release_obj(page->annots);
+ }
+ if (page->beads) {
+ pdf_add_dict(page->page_obj,
+ pdf_new_name("B"), pdf_ref_obj(page->beads));
+ pdf_release_obj(page->beads);
+ }
+ pdf_release_obj(page->page_obj);
+ pdf_release_obj(page->page_ref);
+
+ page->page_obj = NULL;
+ page->page_ref = NULL;
+ page->annots = NULL;
+ page->beads = NULL;
+
+ return;
+}
+
+/* B-tree? */
+#define PAGE_CLUSTER 4
+static pdf_obj *
+build_page_tree (pdf_doc *p,
+ pdf_page *firstpage, long num_pages,
+ pdf_obj *parent_ref)
+{
+ pdf_obj *self, *self_ref, *kids;
+ long i;
+
+ self = pdf_new_dict();
+ /*
+ * This is a slight kludge which allow the subtree dictionary
+ * generated by this routine to be merged with the real
+ * page_tree dictionary, while keeping the indirect object
+ * references right.
+ */
+ self_ref = parent_ref ? pdf_ref_obj(self) : pdf_ref_obj(p->root.pages);
+
+ pdf_add_dict(self, pdf_new_name("Type"), pdf_new_name("Pages"));
+ pdf_add_dict(self, pdf_new_name("Count"), pdf_new_number((double) num_pages));
+
+ if (parent_ref != NULL)
+ pdf_add_dict(self, pdf_new_name("Parent"), parent_ref);
+
+ kids = pdf_new_array();
+ if (num_pages > 0 && num_pages <= PAGE_CLUSTER) {
+ for (i = 0; i < num_pages; i++) {
+ pdf_page *page;
+
+ page = firstpage + i;
+ if (!page->page_ref)
+ page->page_ref = pdf_ref_obj(page->page_obj);
+ pdf_add_array (kids, pdf_link_obj(page->page_ref));
+ doc_flush_page(p, page, pdf_link_obj(self_ref));
+ }
+ } else if (num_pages > 0) {
+ for (i = 0; i < PAGE_CLUSTER; i++) {
+ long start, end;
+
+ start = (i*num_pages)/PAGE_CLUSTER;
+ end = ((i+1)*num_pages)/PAGE_CLUSTER;
+ if (end - start > 1) {
+ pdf_obj *subtree;
+
+ subtree = build_page_tree(p, firstpage + start, end - start,
+ pdf_link_obj(self_ref));
+ pdf_add_array(kids, pdf_ref_obj(subtree));
+ pdf_release_obj(subtree);
+ } else {
+ pdf_page *page;
+
+ page = firstpage + start;
+ if (!page->page_ref)
+ page->page_ref = pdf_ref_obj(page->page_obj);
+ pdf_add_array (kids, pdf_link_obj(page->page_ref));
+ doc_flush_page(p, page, pdf_link_obj(self_ref));
+ }
+ }
+ }
+ pdf_add_dict(self, pdf_new_name("Kids"), kids);
+ pdf_release_obj(self_ref);
+
+ return self;
+}
+
+static void
+pdf_doc_init_page_tree (pdf_doc *p, double media_width, double media_height)
+{
+ /*
+ * Create empty page tree.
+ * The docroot.pages is kept open until the document is closed.
+ * This allows the user to write to pages if he so choses.
+ */
+ p->root.pages = pdf_new_dict();
+
+ p->pages.num_entries = 0;
+ p->pages.max_entries = 0;
+ p->pages.entries = NULL;
+
+ p->pages.bop = NULL;
+ p->pages.eop = NULL;
+
+ p->pages.mediabox.llx = 0.0;
+ p->pages.mediabox.lly = 0.0;
+ p->pages.mediabox.urx = media_width;
+ p->pages.mediabox.ury = media_height;
+
+ return;
+}
+
+static void
+pdf_doc_close_page_tree (pdf_doc *p)
+{
+ pdf_obj *page_tree_root;
+ pdf_obj *mediabox;
+ long page_no;
+
+ /*
+ * Do consistency check on forward references to pages.
+ */
+ for (page_no = PAGECOUNT(p) + 1; page_no <= MAXPAGES(p); page_no++) {
+ pdf_page *page;
+
+ page = doc_get_page_entry(p, page_no);
+ if (page->page_obj) {
+ WARN("Nonexistent page #%ld refered.", page_no);
+ pdf_release_obj(page->page_ref);
+ page->page_ref = NULL;
+ }
+ if (page->page_obj) {
+ WARN("Entry for a nonexistent page #%ld created.", page_no);
+ pdf_release_obj(page->page_obj);
+ page->page_obj = NULL;
+ }
+ if (page->annots) {
+ WARN("Annotation attached to a nonexistent page #%ld.", page_no);
+ pdf_release_obj(page->annots);
+ page->annots = NULL;
+ }
+ if (page->beads) {
+ WARN("Article beads attached to a nonexistent page #%ld.", page_no);
+ pdf_release_obj(page->beads);
+ page->beads = NULL;
+ }
+ if (page->resources) {
+ pdf_release_obj(page->resources);
+ page->resources = NULL;
+ }
+ }
+
+ /*
+ * Connect page tree to root node.
+ */
+ page_tree_root = build_page_tree(p, FIRSTPAGE(p), PAGECOUNT(p), NULL);
+ pdf_merge_dict (p->root.pages, page_tree_root);
+ pdf_release_obj(page_tree_root);
+
+ /* They must be after build_page_tree() */
+ if (p->pages.bop) {
+ pdf_add_stream (p->pages.bop, "\n", 1);
+ pdf_release_obj(p->pages.bop);
+ p->pages.bop = NULL;
+ }
+ if (p->pages.eop) {
+ pdf_add_stream (p->pages.eop, "\n", 1);
+ pdf_release_obj(p->pages.eop);
+ p->pages.eop = NULL;
+ }
+
+ /* Create media box at root node and let the other pages inherit it. */
+ mediabox = pdf_new_array();
+ pdf_add_array(mediabox, pdf_new_number(ROUND(p->pages.mediabox.llx, 0.01)));
+ pdf_add_array(mediabox, pdf_new_number(ROUND(p->pages.mediabox.lly, 0.01)));
+ pdf_add_array(mediabox, pdf_new_number(ROUND(p->pages.mediabox.urx, 0.01)));
+ pdf_add_array(mediabox, pdf_new_number(ROUND(p->pages.mediabox.ury, 0.01)));
+ pdf_add_dict(p->root.pages, pdf_new_name("MediaBox"), mediabox);
+
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("Pages"),
+ pdf_ref_obj (p->root.pages));
+ pdf_release_obj(p->root.pages);
+ p->root.pages = NULL;
+
+ RELEASE(p->pages.entries);
+ p->pages.entries = NULL;
+ p->pages.num_entries = 0;
+ p->pages.max_entries = 0;
+
+ return;
+}
+
+
+#ifndef BOOKMARKS_OPEN_DEFAULT
+#define BOOKMARKS_OPEN_DEFAULT 0
+#endif
+
+static int clean_bookmarks (pdf_olitem *item);
+static int flush_bookmarks (pdf_olitem *item,
+ pdf_obj *parent_ref,
+ pdf_obj *parent_dict);
+
+static void
+pdf_doc_init_bookmarks (pdf_doc *p, int bm_open_depth)
+{
+ pdf_olitem *item;
+
+#define MAX_OUTLINE_DEPTH 256u
+ p->opt.outline_open_depth =
+ ((bm_open_depth >= 0) ?
+ bm_open_depth : MAX_OUTLINE_DEPTH - bm_open_depth);
+
+ p->outlines.current_depth = 1;
+
+ item = NEW(1, pdf_olitem);
+ item->dict = NULL;
+ item->next = NULL;
+ item->first = NULL;
+ item->parent = NULL;
+ item->is_open = 1;
+
+ p->outlines.current = item;
+ p->outlines.first = item;
+
+ return;
+}
+
+static int
+clean_bookmarks (pdf_olitem *item)
+{
+ pdf_olitem *next;
+
+ while (item) {
+ next = item->next;
+ if (item->dict)
+ pdf_release_obj(item->dict);
+ if (item->first)
+ clean_bookmarks(item->first);
+ RELEASE(item);
+
+ item = next;
+ }
+
+ return 0;
+}
+
+static int
+flush_bookmarks (pdf_olitem *node,
+ pdf_obj *parent_ref, pdf_obj *parent_dict)
+{
+ int retval;
+ int count;
+ pdf_olitem *item;
+ pdf_obj *this_ref, *prev_ref, *next_ref;
+
+ ASSERT(node->dict);
+
+ this_ref = pdf_ref_obj(node->dict);
+ pdf_add_dict(parent_dict,
+ pdf_new_name("First"), pdf_link_obj(this_ref));
+
+ retval = 0;
+ for (item = node, prev_ref = NULL;
+ item && item->dict; item = item->next) {
+ if (item->first && item->first->dict) {
+ count = flush_bookmarks(item->first, this_ref, item->dict);
+ if (item->is_open) {
+ pdf_add_dict(item->dict,
+ pdf_new_name("Count"),
+ pdf_new_number(count));
+ retval += count;
+ } else {
+ pdf_add_dict(item->dict,
+ pdf_new_name("Count"),
+ pdf_new_number(-count));
+ }
+ }
+ pdf_add_dict(item->dict,
+ pdf_new_name("Parent"),
+ pdf_link_obj(parent_ref));
+ if (prev_ref) {
+ pdf_add_dict(item->dict,
+ pdf_new_name("Prev"),
+ prev_ref);
+ }
+ if (item->next && item->next->dict) {
+ next_ref = pdf_ref_obj(item->next->dict);
+ pdf_add_dict(item->dict,
+ pdf_new_name("Next"),
+ pdf_link_obj(next_ref));
+ } else {
+ next_ref = NULL;
+ }
+
+ pdf_release_obj(item->dict);
+ item->dict = NULL;
+
+ prev_ref = this_ref;
+ this_ref = next_ref;
+ retval++;
+ }
+
+ pdf_add_dict(parent_dict,
+ pdf_new_name("Last"),
+ pdf_link_obj(prev_ref));
+
+ pdf_release_obj(node->dict);
+ node->dict = NULL;
+
+ return retval;
+}
+
+int
+pdf_doc_bookmarks_up (void)
+{
+ pdf_doc *p = &pdoc;
+ pdf_olitem *parent, *item;
+
+ item = p->outlines.current;
+ if (!item || !item->parent) {
+ WARN("Can't go up above the bookmark root node!");
+ return -1;
+ }
+ parent = item->parent;
+ item = parent->next;
+ if (!parent->next) {
+ parent->next = item = NEW(1, pdf_olitem);
+ item->dict = NULL;
+ item->first = NULL;
+ item->next = NULL;
+ item->is_open = 0;
+ item->parent = parent->parent;
+ }
+ p->outlines.current = item;
+ p->outlines.current_depth--;
+
+ return 0;
+}
+
+int
+pdf_doc_bookmarks_down (void)
+{
+ pdf_doc *p = &pdoc;
+ pdf_olitem *item, *first;
+
+ item = p->outlines.current;
+ if (!item->dict) {
+ pdf_obj *tcolor, *action;
+
+ WARN("Empty bookmark node!");
+ WARN("You have tried to jump more than 1 level.");
+
+ item->dict = pdf_new_dict();
+
+#define TITLE_STRING "<No Title>"
+ pdf_add_dict(item->dict,
+ pdf_new_name("Title"),
+ pdf_new_string(TITLE_STRING, strlen(TITLE_STRING)));
+
+ tcolor = pdf_new_array();
+ pdf_add_array(tcolor, pdf_new_number(1.0));
+ pdf_add_array(tcolor, pdf_new_number(0.0));
+ pdf_add_array(tcolor, pdf_new_number(0.0));
+ pdf_add_dict (item->dict,
+ pdf_new_name("C"), pdf_link_obj(tcolor));
+ pdf_release_obj(tcolor);
+
+ pdf_add_dict (item->dict,
+ pdf_new_name("F"), pdf_new_number(1.0));
+
+#define JS_CODE "app.alert(\"The author of this document made this bookmark item empty!\", 3, 0)"
+ action = pdf_new_dict();
+ pdf_add_dict(action,
+ pdf_new_name("S"), pdf_new_name("JavaScript"));
+ pdf_add_dict(action,
+ pdf_new_name("JS"), pdf_new_string(JS_CODE, strlen(JS_CODE)));
+ pdf_add_dict(item->dict,
+ pdf_new_name("A"), pdf_link_obj(action));
+ pdf_release_obj(action);
+ }
+
+ item->first = first = NEW(1, pdf_olitem);
+ first->dict = NULL;
+ first->is_open = 0;
+ first->parent = item;
+ first->next = NULL;
+ first->first = NULL;
+
+ p->outlines.current = first;
+ p->outlines.current_depth++;
+
+ return 0;
+}
+
+int
+pdf_doc_bookmarks_depth (void)
+{
+ pdf_doc *p = &pdoc;
+
+ return p->outlines.current_depth;
+}
+
+void
+pdf_doc_bookmarks_add (pdf_obj *dict, int is_open)
+{
+ pdf_doc *p = &pdoc;
+ pdf_olitem *item, *next;
+
+ ASSERT(p && dict);
+
+ item = p->outlines.current;
+
+ if (!item) {
+ item = NEW(1, pdf_olitem);
+ item->parent = NULL;
+ p->outlines.first = item;
+ } else if (item->dict) { /* go to next item */
+ item = item->next;
+ }
+
+#define BMOPEN(b,p) (((b) < 0) ? (((p)->outlines.current_depth > (p)->opt.outline_open_depth) ? 0 : 1) : (b))
+
+#if 0
+ item->dict = pdf_link_obj(dict);
+#endif
+ item->dict = dict;
+ item->first = NULL;
+ item->is_open = BMOPEN(is_open, p);
+
+ item->next = next = NEW(1, pdf_olitem);
+ next->dict = NULL;
+ next->parent = item->parent;
+ next->first = NULL;
+ next->is_open = -1;
+ next->next = NULL;
+
+ p->outlines.current = item;
+
+ return;
+}
+
+static void
+pdf_doc_close_bookmarks (pdf_doc *p)
+{
+ pdf_obj *catalog = p->root.dict;
+ pdf_olitem *item;
+ int count;
+ pdf_obj *bm_root, *bm_root_ref;
+
+ item = p->outlines.first;
+ if (item->dict) {
+ bm_root = pdf_new_dict();
+ bm_root_ref = pdf_ref_obj(bm_root);
+ count = flush_bookmarks(item, bm_root_ref, bm_root);
+ pdf_add_dict(bm_root,
+ pdf_new_name("Count"),
+ pdf_new_number(count));
+ pdf_add_dict(catalog,
+ pdf_new_name("Outlines"),
+ bm_root_ref);
+ pdf_release_obj(bm_root);
+ }
+ clean_bookmarks(item);
+
+ p->outlines.first = NULL;
+ p->outlines.current = NULL;
+ p->outlines.current_depth = 0;
+
+ return;
+}
+
+
+static const char *name_dict_categories[] = {
+ "Dests", "AP", "JavaScript", "Pages",
+ "Templates", "IDS", "URLS", "EmbeddedFiles",
+ "AlternatePresentations", "Renditions"
+};
+#define NUM_NAME_CATEGORY (sizeof(name_dict_categories)/sizeof(name_dict_categories[0]))
+
+static void
+pdf_doc_init_names (pdf_doc *p)
+{
+ int i;
+
+ p->root.names = NULL;
+
+ p->names = NEW(NUM_NAME_CATEGORY + 1, struct name_dict);
+ for (i = 0; i < NUM_NAME_CATEGORY; i++) {
+ p->names[i].category = (char *) name_dict_categories[i];
+ p->names[i].data = NULL;
+ }
+ p->names[NUM_NAME_CATEGORY].category = NULL;
+ p->names[NUM_NAME_CATEGORY].data = NULL;
+
+ return;
+}
+
+int
+pdf_doc_add_names (const char *category,
+ const void *key, int keylen, pdf_obj *value)
+{
+ pdf_doc *p = &pdoc;
+ int i;
+
+ for (i = 0; p->names[i].category != NULL; i++) {
+ if (!strcmp(p->names[i].category, category)) {
+ break;
+ }
+ }
+ if (p->names[i].category == NULL) {
+ WARN("Unknown name dictionary category \"%s\".", category);
+ return -1;
+ }
+ if (!p->names[i].data) {
+ p->names[i].data = pdf_new_name_tree();
+ }
+
+ return pdf_names_add_object(p->names[i].data, key, keylen, value);
+}
+
+static void
+pdf_doc_close_names (pdf_doc *p)
+{
+ pdf_obj *tmp;
+ int i;
+
+ for (i = 0; p->names[i].category != NULL; i++) {
+ if (p->names[i].data) {
+ pdf_obj *name_tree;
+
+ name_tree = pdf_names_create_tree(p->names[i].data);
+ if (!p->root.names) {
+ p->root.names = pdf_new_dict();
+ }
+ pdf_add_dict(p->root.names,
+ pdf_new_name(p->names[i].category), pdf_ref_obj(name_tree));
+ pdf_release_obj(name_tree);
+ pdf_delete_name_tree(&p->names[i].data);
+ }
+ }
+
+ if (p->root.names) {
+ tmp = pdf_lookup_dict(p->root.dict, "Names");
+ if (!tmp) {
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("Names"),
+ pdf_ref_obj (p->root.names));
+ } else if (PDF_OBJ_DICTTYPE(tmp)) {
+ pdf_merge_dict(p->root.names, tmp);
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("Names"),
+ pdf_ref_obj (p->root.names));
+ } else { /* Maybe reference */
+ /* What should I do? */
+ WARN("Could not modify Names dictionary.");
+ }
+ pdf_release_obj(p->root.names);
+ p->root.names = NULL;
+ }
+
+ RELEASE(p->names);
+ p->names = NULL;
+
+ return;
+}
+
+
+void
+pdf_doc_add_annot (unsigned page_no, const pdf_rect *rect, pdf_obj *annot_dict)
+{
+ pdf_doc *p = &pdoc;
+ pdf_page *page;
+ pdf_obj *rect_array;
+ double annot_grow = p->opt.annot_grow;
+
+ page = doc_get_page_entry(p, page_no);
+ if (!page->annots)
+ page->annots = pdf_new_array();
+
+#if 1
+ {
+ pdf_rect mediabox;
+
+ pdf_doc_get_mediabox(page_no, &mediabox);
+ if (rect->llx < mediabox.llx ||
+ rect->urx > mediabox.urx ||
+ rect->lly < mediabox.lly ||
+ rect->ury > mediabox.ury) {
+ WARN("Annotation out of page boundary.");
+ WARN("Current page's MediaBox: [%g %g %g %g]",
+ mediabox.llx, mediabox.lly, mediabox.urx, mediabox.ury);
+ WARN("Annotation: [%g %g %g %g]",
+ rect->llx, rect->lly, rect->urx, rect->ury);
+ WARN("Maybe incorrect paper size specified.");
+ }
+ if (rect->llx > rect->urx || rect->lly > rect->ury) {
+ WARN("Rectangle with negative width/height: [%g %g %g %g]",
+ rect->llx, rect->lly, rect->urx, rect->ury);
+ }
+ }
+#endif
+
+ rect_array = pdf_new_array();
+ pdf_add_array(rect_array, pdf_new_number(ROUND(rect->llx - annot_grow, 0.01)));
+ pdf_add_array(rect_array, pdf_new_number(ROUND(rect->lly - annot_grow, 0.01)));
+ pdf_add_array(rect_array, pdf_new_number(ROUND(rect->urx + annot_grow, 0.01)));
+ pdf_add_array(rect_array, pdf_new_number(ROUND(rect->ury + annot_grow, 0.01)));
+ pdf_add_dict (annot_dict, pdf_new_name("Rect"), rect_array);
+
+ pdf_add_array(page->annots, pdf_ref_obj(annot_dict));
+
+ return;
+}
+
+
+/*
+ * PDF Article Thread
+ */
+static void
+pdf_doc_init_articles (pdf_doc *p)
+{
+ p->root.threads = NULL;
+
+ p->articles.num_entries = 0;
+ p->articles.max_entries = 0;
+ p->articles.entries = NULL;
+
+ return;
+}
+
+void
+pdf_doc_begin_article (const char *article_id, pdf_obj *article_info)
+{
+ pdf_doc *p = &pdoc;
+ pdf_article *article;
+
+ if (article_id == NULL || strlen(article_id) == 0)
+ ERROR("Article thread without internal identifier.");
+
+ if (p->articles.num_entries >= p->articles.max_entries) {
+ p->articles.max_entries += PDFDOC_ARTICLE_ALLOC_SIZE;
+ p->articles.entries = RENEW(p->articles.entries,
+ p->articles.max_entries, struct pdf_article);
+ }
+ article = &(p->articles.entries[p->articles.num_entries]);
+
+ article->id = NEW(strlen(article_id)+1, char);
+ strcpy(article->id, article_id);
+ article->info = article_info;
+ article->num_beads = 0;
+ article->max_beads = 0;
+ article->beads = NULL;
+
+ p->articles.num_entries++;
+
+ return;
+}
+
+void
+pdf_doc_end_article (const char *article_id)
+{
+ return; /* no-op */
+}
+
+static pdf_bead *
+find_bead (pdf_article *article, const char *bead_id)
+{
+ pdf_bead *bead;
+ long i;
+
+ bead = NULL;
+ for (i = 0; i < article->num_beads; i++) {
+ if (!strcmp(article->beads[i].id, bead_id)) {
+ bead = &(article->beads[i]);
+ break;
+ }
+ }
+
+ return bead;
+}
+
+void
+pdf_doc_add_bead (const char *article_id,
+ const char *bead_id, long page_no, const pdf_rect *rect)
+{
+ pdf_doc *p = &pdoc;
+ pdf_article *article;
+ pdf_bead *bead;
+ long i;
+
+ if (!article_id) {
+ ERROR("No article identifier specified.");
+ }
+
+ article = NULL;
+ for (i = 0; i < p->articles.num_entries; i++) {
+ if (!strcmp(p->articles.entries[i].id, article_id)) {
+ article = &(p->articles.entries[i]);
+ break;
+ }
+ }
+ if (!article) {
+ ERROR("Specified article thread that doesn't exist.");
+ return;
+ }
+
+ bead = bead_id ? find_bead(article, bead_id) : NULL;
+ if (!bead) {
+ if (article->num_beads >= article->max_beads) {
+ article->max_beads += PDFDOC_BEAD_ALLOC_SIZE;
+ article->beads = RENEW(article->beads,
+ article->max_beads, struct pdf_bead);
+ for (i = article->num_beads; i < article->max_beads; i++) {
+ article->beads[i].id = NULL;
+ article->beads[i].page_no = -1;
+ }
+ }
+ bead = &(article->beads[article->num_beads]);
+ if (bead_id) {
+ bead->id = NEW(strlen(bead_id)+1, char);
+ strcpy(bead->id, bead_id);
+ } else {
+ bead->id = NULL;
+ }
+ article->num_beads++;
+ }
+ bead->rect.llx = rect->llx;
+ bead->rect.lly = rect->lly;
+ bead->rect.urx = rect->urx;
+ bead->rect.ury = rect->ury;
+ bead->page_no = page_no;
+
+ return;
+}
+
+static pdf_obj *
+make_article (pdf_doc *p,
+ pdf_article *article,
+ const char **bead_ids, int num_beads,
+ pdf_obj *article_info)
+{
+ pdf_obj *art_dict;
+ pdf_obj *first, *prev, *last;
+ long i, n;
+
+ if (!article)
+ return NULL;
+
+ art_dict = pdf_new_dict();
+ first = prev = last = NULL;
+ /*
+ * The bead_ids represents logical order of beads in an article thread.
+ * If bead_ids is not given, we create an article thread in the order of
+ * beads appeared.
+ */
+ n = bead_ids ? num_beads : article->num_beads;
+ for (i = 0; i < n; i++) {
+ pdf_bead *bead;
+
+ bead = bead_ids ? find_bead(article, bead_ids[i]) : &(article->beads[i]);
+ if (!bead || bead->page_no < 0) {
+ continue;
+ }
+ last = pdf_new_dict();
+ if (prev == NULL) {
+ first = last;
+ pdf_add_dict(first,
+ pdf_new_name("T"), pdf_ref_obj(art_dict));
+ } else {
+ pdf_add_dict(prev,
+ pdf_new_name("N"), pdf_ref_obj(last));
+ pdf_add_dict(last,
+ pdf_new_name("V"), pdf_ref_obj(prev));
+ /* We must link first to last. */
+ if (prev != first)
+ pdf_release_obj(prev);
+ }
+
+ /* Realize bead now. */
+ {
+ pdf_page *page;
+ pdf_obj *rect;
+
+ page = doc_get_page_entry(p, bead->page_no);
+ if (!page->beads) {
+ page->beads = pdf_new_array();
+ }
+ pdf_add_dict(last, pdf_new_name("P"), pdf_link_obj(page->page_ref));
+ rect = pdf_new_array();
+ pdf_add_array(rect, pdf_new_number(ROUND(bead->rect.llx, 0.01)));
+ pdf_add_array(rect, pdf_new_number(ROUND(bead->rect.lly, 0.01)));
+ pdf_add_array(rect, pdf_new_number(ROUND(bead->rect.urx, 0.01)));
+ pdf_add_array(rect, pdf_new_number(ROUND(bead->rect.ury, 0.01)));
+ pdf_add_dict (last, pdf_new_name("R"), rect);
+ pdf_add_array(page->beads, pdf_ref_obj(last));
+ }
+
+ prev = last;
+ }
+
+ if (first && last) {
+ pdf_add_dict(last,
+ pdf_new_name("N"), pdf_ref_obj(first));
+ pdf_add_dict(first,
+ pdf_new_name("V"), pdf_ref_obj(last));
+ if (first != last) {
+ pdf_release_obj(last);
+ }
+ pdf_add_dict(art_dict,
+ pdf_new_name("F"), pdf_ref_obj(first));
+ /* If article_info is supplied, we override article->info. */
+ if (article_info) {
+ pdf_add_dict(art_dict,
+ pdf_new_name("I"), article_info);
+ } else if (article->info) {
+ pdf_add_dict(art_dict,
+ pdf_new_name("I"), pdf_ref_obj(article->info));
+ pdf_release_obj(article->info);
+ article->info = NULL; /* We do not write as object reference. */
+ }
+ pdf_release_obj(first);
+ } else {
+ pdf_release_obj(art_dict);
+ art_dict = NULL;
+ }
+
+ return art_dict;
+}
+
+static void
+clean_article (pdf_article *article)
+{
+ if (!article)
+ return;
+
+ if (article->beads) {
+ long i;
+
+ for (i = 0; i < article->num_beads; i++) {
+ if (article->beads[i].id)
+ RELEASE(article->beads[i].id);
+ }
+ RELEASE(article->beads);
+ article->beads = NULL;
+ }
+
+ if (article->id)
+ RELEASE(article->id);
+ article->id = NULL;
+ article->num_beads = 0;
+ article->max_beads = 0;
+
+ return;
+}
+
+static void
+pdf_doc_close_articles (pdf_doc *p)
+{
+ int i;
+
+ for (i = 0; i < p->articles.num_entries; i++) {
+ pdf_article *article;
+
+ article = &(p->articles.entries[i]);
+ if (article->beads) {
+ pdf_obj *art_dict;
+
+ art_dict = make_article(p, article, NULL, 0, NULL);
+ if (!p->root.threads) {
+ p->root.threads = pdf_new_array();
+ }
+ pdf_add_array(p->root.threads, pdf_ref_obj(art_dict));
+ pdf_release_obj(art_dict);
+ }
+ clean_article(article);
+ }
+ RELEASE(p->articles.entries);
+ p->articles.entries = NULL;
+ p->articles.num_entries = 0;
+ p->articles.max_entries = 0;
+
+ if (p->root.threads) {
+ pdf_add_dict(p->root.dict,
+ pdf_new_name("Threads"),
+ pdf_ref_obj (p->root.threads));
+ pdf_release_obj(p->root.threads);
+ p->root.threads = NULL;
+ }
+
+ return;
+}
+
+/* page_no = 0 for root page tree node. */
+void
+pdf_doc_set_mediabox (unsigned page_no, const pdf_rect *mediabox)
+{
+ pdf_doc *p = &pdoc;
+ pdf_page *page;
+
+ if (page_no == 0) {
+ p->pages.mediabox.llx = mediabox->llx;
+ p->pages.mediabox.lly = mediabox->lly;
+ p->pages.mediabox.urx = mediabox->urx;
+ p->pages.mediabox.ury = mediabox->ury;
+ } else {
+ page = doc_get_page_entry(p, page_no);
+ page->cropbox.llx = mediabox->llx;
+ page->cropbox.lly = mediabox->lly;
+ page->cropbox.urx = mediabox->urx;
+ page->cropbox.ury = mediabox->ury;
+ page->flags |= USE_MY_MEDIABOX;
+ }
+
+ return;
+}
+
+void
+pdf_doc_get_mediabox (unsigned page_no, pdf_rect *mediabox)
+{
+ pdf_doc *p = &pdoc;
+ pdf_page *page;
+
+ if (page_no == 0) {
+ mediabox->llx = p->pages.mediabox.llx;
+ mediabox->lly = p->pages.mediabox.lly;
+ mediabox->urx = p->pages.mediabox.urx;
+ mediabox->ury = p->pages.mediabox.ury;
+ } else {
+ page = doc_get_page_entry(p, page_no);
+ if (page->flags & USE_MY_MEDIABOX) {
+ mediabox->llx = page->cropbox.llx;
+ mediabox->lly = page->cropbox.lly;
+ mediabox->urx = page->cropbox.urx;
+ mediabox->ury = page->cropbox.ury;
+ } else {
+ mediabox->llx = p->pages.mediabox.llx;
+ mediabox->lly = p->pages.mediabox.lly;
+ mediabox->urx = p->pages.mediabox.urx;
+ mediabox->ury = p->pages.mediabox.ury;
+ }
+ }
+
+ return;
+}
+
+pdf_obj *
+pdf_doc_current_page_resources (void)
+{
+ pdf_obj *resources;
+ pdf_doc *p = &pdoc;
+ pdf_page *currentpage;
+
+ if (p->pending_forms) {
+ if (p->pending_forms->form.resources) {
+ resources = p->pending_forms->form.resources;
+ } else {
+ resources = p->pending_forms->form.resources = pdf_new_dict();
+ }
+ } else {
+ currentpage = LASTPAGE(p);
+ if (currentpage->resources) {
+ resources = currentpage->resources;
+ } else {
+ resources = currentpage->resources = pdf_new_dict();
+ }
+ }
+
+ return resources;
+}
+
+pdf_obj *
+pdf_doc_get_dictionary (const char *category)
+{
+ pdf_doc *p = &pdoc;
+ pdf_obj *dict = NULL;
+
+ ASSERT(category);
+
+ if (!strcmp(category, "Names")) {
+ if (!p->root.names)
+ p->root.names = pdf_new_dict();
+ dict = p->root.names;
+ } else if (!strcmp(category, "Pages")) {
+ if (!p->root.pages)
+ p->root.pages = pdf_new_dict();
+ dict = p->root.pages;
+ } else if (!strcmp(category, "Catalog")) {
+ if (!p->root.dict)
+ p->root.dict = pdf_new_dict();
+ dict = p->root.dict;
+ } else if (!strcmp(category, "Info")) {
+ if (!p->info)
+ p->info = pdf_new_dict();
+ dict = p->info;
+ } else if (!strcmp(category, "@THISPAGE")) {
+ /* Sorry for this... */
+ pdf_page *currentpage;
+
+ currentpage = LASTPAGE(p);
+ dict = currentpage->page_obj;
+ }
+
+ if (!dict) {
+ ERROR("Document dict. \"%s\" not exist. ", category);
+ }
+
+ return dict;
+}
+
+long
+pdf_doc_current_page_number (void)
+{
+ pdf_doc *p = &pdoc;
+
+ return (long) (PAGECOUNT(p) + 1);
+}
+
+pdf_obj *
+pdf_doc_ref_page (unsigned long page_no)
+{
+ pdf_doc *p = &pdoc;
+ pdf_page *page;
+
+ page = doc_get_page_entry(p, page_no);
+ if (!page->page_obj) {
+ page->page_obj = pdf_new_dict();
+ page->page_ref = pdf_ref_obj(page->page_obj);
+ }
+
+ return pdf_link_obj(page->page_ref);
+}
+
+pdf_obj *
+pdf_doc_get_reference (const char *category)
+{
+ pdf_obj *ref = NULL;
+ long page_no;
+
+ ASSERT(category);
+
+ page_no = pdf_doc_current_page_number();
+ if (!strcmp(category, "@THISPAGE")) {
+ ref = pdf_doc_ref_page(page_no);
+ } else if (!strcmp(category, "@PREVPAGE")) {
+ if (page_no <= 1) {
+ ERROR("Reference to previous page, but no pages have been completed yet.");
+ }
+ ref = pdf_doc_ref_page(page_no - 1);
+ } else if (!strcmp(category, "@NEXTPAGE")) {
+ ref = pdf_doc_ref_page(page_no + 1);
+ }
+
+ if (!ref) {
+ ERROR("Reference to \"%s\" not exist. ", category);
+ }
+
+ return ref;
+}
+
+static void
+pdf_doc_new_page (pdf_doc *p)
+{
+ pdf_page *currentpage;
+
+ if (PAGECOUNT(p) >= MAXPAGES(p)) {
+ doc_resize_page_entries(p, MAXPAGES(p) + PDFDOC_PAGES_ALLOC_SIZE);
+ }
+
+ /*
+ * This is confusing. pdf_doc_finish_page() have increased page count!
+ */
+ currentpage = LASTPAGE(p);
+ /* Was this page already instantiated by a forward reference to it? */
+ if (!currentpage->page_ref) {
+ currentpage->page_obj = pdf_new_dict();
+ currentpage->page_ref = pdf_ref_obj(currentpage->page_obj);
+ }
+
+ currentpage->background = NULL;
+ currentpage->contents = pdf_new_stream(STREAM_COMPRESS);
+ currentpage->resources = pdf_new_dict();
+
+ currentpage->annots = NULL;
+ currentpage->beads = NULL;
+
+ return;
+}
+
+/* This only closes contents and resources. */
+static void
+pdf_doc_finish_page (pdf_doc *p)
+{
+ pdf_page *currentpage;
+
+ if (p->pending_forms) {
+ ERROR("A pending form XObject at the end of page.");
+ }
+
+ currentpage = LASTPAGE(p);
+ if (!currentpage->page_obj)
+ currentpage->page_obj = pdf_new_dict();
+
+ /*
+ * Make Contents array.
+ */
+
+ /*
+ * Global BOP content stream.
+ * pdf_ref_obj() returns reference itself when the object is
+ * indirect reference, not reference to the indirect reference.
+ * We keep bop itself but not reference to it since it is
+ * expected to be small.
+ */
+ if (p->pages.bop &&
+ pdf_stream_length(p->pages.bop) > 0) {
+ currentpage->content_refs[0] = pdf_ref_obj(p->pages.bop);
+ } else {
+ currentpage->content_refs[0] = NULL;
+ }
+ /*
+ * Current page background content stream.
+ */
+ if (currentpage->background) {
+ if (pdf_stream_length(currentpage->background) > 0) {
+ currentpage->content_refs[1] = pdf_ref_obj(currentpage->background);
+ pdf_add_stream (currentpage->background, "\n", 1);
+ }
+ pdf_release_obj(currentpage->background);
+ currentpage->background = NULL;
+ } else {
+ currentpage->content_refs[1] = NULL;
+ }
+
+ /* Content body of current page */
+ currentpage->content_refs[2] = pdf_ref_obj(currentpage->contents);
+ pdf_add_stream (currentpage->contents, "\n", 1);
+ pdf_release_obj(currentpage->contents);
+ currentpage->contents = NULL;
+
+ /*
+ * Global EOP content stream.
+ */
+ if (p->pages.eop &&
+ pdf_stream_length(p->pages.eop) > 0) {
+ currentpage->content_refs[3] = pdf_ref_obj(p->pages.eop);
+ } else {
+ currentpage->content_refs[3] = NULL;
+ }
+
+ /*
+ * Page resources.
+ */
+ if (currentpage->resources) {
+ pdf_obj *procset;
+ /*
+ * ProcSet is obsolete in PDF-1.4 but recommended for compatibility.
+ */
+
+ procset = pdf_new_array ();
+ pdf_add_array(procset, pdf_new_name("PDF"));
+ pdf_add_array(procset, pdf_new_name("Text"));
+ pdf_add_array(procset, pdf_new_name("ImageC"));
+ pdf_add_array(procset, pdf_new_name("ImageB"));
+ pdf_add_array(procset, pdf_new_name("ImageI"));
+ pdf_add_dict(currentpage->resources, pdf_new_name("ProcSet"), procset);
+
+ pdf_add_dict(currentpage->page_obj,
+ pdf_new_name("Resources"),
+ pdf_ref_obj(currentpage->resources));
+ pdf_release_obj(currentpage->resources);
+ currentpage->resources = NULL;
+ }
+
+#ifndef NO_THUMBNAIL
+ if (thumb_enabled) {
+ char *thumb_filename;
+ pdf_obj *thumb_ref;
+
+ thumb_filename = NEW(strlen(thumb_basename)+7, char);
+ sprintf(thumb_filename, "%s.%ld",
+ thumb_basename, (p->pages.num_entries % 99999) + 1L);
+ thumb_ref = read_thumbnail(thumb_filename);
+ RELEASE(thumb_filename);
+ if (thumb_ref)
+ pdf_add_dict(currentpage->page_obj, pdf_new_name("Thumb"), thumb_ref);
+ }
+#endif /* !NO_THUMBNAIL */
+
+ p->pages.num_entries++;
+
+ return;
+}
+
+
+static pdf_color bgcolor = { 1, { 1.0 } };
+void
+pdf_doc_set_bgcolor (const pdf_color *color)
+{
+ if (color)
+ memcpy(&bgcolor, color, sizeof(pdf_color));
+ else { /* as clear... */
+ pdf_color_graycolor(&bgcolor, 1.0);
+ }
+}
+
+static void
+doc_fill_page_background (pdf_doc *p)
+{
+ pdf_page *currentpage;
+ pdf_rect r;
+ int cm;
+ pdf_obj *saved_content;
+
+ cm = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE);
+ if (!cm || pdf_color_is_white(&bgcolor)) {
+ return;
+ }
+
+ pdf_doc_get_mediabox(pdf_doc_current_page_number(), &r);
+
+ currentpage = LASTPAGE(p);
+ ASSERT(currentpage);
+
+ if (!currentpage->background)
+ currentpage->background = pdf_new_stream(STREAM_COMPRESS);
+
+ saved_content = currentpage->contents;
+ currentpage->contents = currentpage->background;
+
+ pdf_dev_gsave();
+ pdf_color_push();
+ pdf_dev_setcolor(&bgcolor, 1); /* is_fill */
+ pdf_dev_rectfill(r.llx, r.lly, r.urx - r.llx, r.ury - r.lly);
+ pdf_color_pop();
+ pdf_dev_grestore();
+
+ currentpage->contents = saved_content;
+
+ return;
+}
+
+void
+pdf_doc_begin_page (double scale, double x_origin, double y_origin)
+{
+ pdf_doc *p = &pdoc;
+ pdf_tmatrix M;
+
+ M.a = scale; M.b = 0.0;
+ M.c = 0.0 ; M.d = scale;
+ M.e = x_origin;
+ M.f = y_origin;
+
+ /* pdf_doc_new_page() allocates page content stream. */
+ pdf_doc_new_page(p);
+ pdf_dev_bop(&M);
+
+ return;
+}
+
+void
+pdf_doc_end_page (void)
+{
+ pdf_doc *p = &pdoc;
+
+ pdf_dev_eop();
+ doc_fill_page_background(p);
+
+ pdf_doc_finish_page(p);
+
+ return;
+}
+
+void
+pdf_doc_add_page_content (const char *buffer, unsigned length)
+{
+ pdf_doc *p = &pdoc;
+ pdf_page *currentpage;
+
+ if (p->pending_forms) {
+ pdf_add_stream(p->pending_forms->form.contents, buffer, length);
+ } else {
+ currentpage = LASTPAGE(p);
+ pdf_add_stream(currentpage->contents, buffer, length);
+ }
+
+ return;
+}
+
+static char *doccreator = NULL; /* Ugh */
+
+void
+pdf_open_document (const char *filename,
+ double media_width, double media_height,
+ double annot_grow_amount, int bookmark_open_depth)
+{
+ pdf_doc *p = &pdoc;
+
+ pdf_out_init(filename);
+
+ pdf_doc_init_catalog(p);
+
+ p->opt.annot_grow = annot_grow_amount;
+ p->opt.outline_open_depth = bookmark_open_depth;
+
+ pdf_init_resources();
+ pdf_init_colors();
+ pdf_init_fonts();
+ /* Thumbnail want this to be initialized... */
+ pdf_init_images();
+
+ pdf_doc_init_docinfo(p);
+ if (doccreator) {
+ pdf_add_dict(p->info,
+ pdf_new_name("Creator"),
+ pdf_new_string(doccreator, strlen(doccreator)));
+ RELEASE(doccreator); doccreator = NULL;
+ }
+
+ pdf_doc_init_bookmarks(p, bookmark_open_depth);
+ pdf_doc_init_articles (p);
+ pdf_doc_init_names (p);
+ pdf_doc_init_page_tree(p, media_width, media_height);
+
+ create_encrypt();
+
+#ifndef NO_THUMBNAIL
+ /* Create a default name for thumbnail image files */
+ if (thumb_enabled) {
+ if (strlen(filename) > 4 &&
+ !strncmp(".pdf", filename + strlen(filename) - 4, 4)) {
+ thumb_basename = NEW(strlen(filename)-4+1, char);
+ strncpy(thumb_basename, filename, strlen(filename)-4);
+ thumb_basename[strlen(filename)-4] = 0;
+ } else {
+ thumb_basename = NEW(strlen(filename)+1, char);
+ strcpy(thumb_basename, filename);
+ }
+ }
+#endif /* !NO_THUMBNAIL */
+
+ p->pending_forms = NULL;
+
+ return;
+}
+
+void
+pdf_doc_set_creator (const char *creator)
+{
+ if (!creator ||
+ creator[0] == '\0')
+ return;
+
+ doccreator = NEW(strlen(creator)+1, char);
+ strcpy(doccreator, creator); /* Ugh */
+}
+
+
+void
+pdf_close_document (void)
+{
+ pdf_doc *p = &pdoc;
+
+ /*
+ * Following things were kept around so user can add dictionary items.
+ */
+ pdf_doc_close_articles (p);
+ pdf_doc_close_names (p);
+ pdf_doc_close_bookmarks(p);
+ pdf_doc_close_page_tree(p);
+ pdf_doc_close_docinfo (p);
+
+ pdf_doc_close_catalog (p);
+
+ pdf_close_images();
+ pdf_close_fonts ();
+ pdf_close_colors();
+
+ pdf_close_resources(); /* Should be at last. */
+
+ pdf_out_flush();
+
+#ifndef NO_THUMBNAIL
+ if (thumb_basename) {
+ RELEASE(thumb_basename);
+ }
+#endif /* !NO_THUMBNAIL */
+
+ return;
+}
+
+/*
+ * All this routine does is give the form a name and add a unity scaling matrix.
+ * It fills in required fields. The caller must initialize the stream.
+ */
+void
+pdf_doc_make_xform (pdf_obj *xform,
+ pdf_rect *bbox,
+ pdf_tmatrix *matrix,
+ pdf_obj *resources)
+{
+ pdf_obj *xform_dict;
+ pdf_obj *tmp;
+
+ xform_dict = pdf_stream_dict(xform);
+ pdf_add_dict(xform_dict,
+ pdf_new_name("Type"), pdf_new_name("XObject"));
+ pdf_add_dict(xform_dict,
+ pdf_new_name("Subtype"), pdf_new_name("Form"));
+ pdf_add_dict(xform_dict,
+ pdf_new_name("FormType"), pdf_new_number(1.0));
+
+ if (!bbox)
+ ERROR("No BoundingBox supplied.");
+
+ tmp = pdf_new_array();
+ pdf_add_array(tmp, pdf_new_number(ROUND(bbox->llx, .001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(bbox->lly, .001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(bbox->urx, .001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(bbox->ury, .001)));
+ pdf_add_dict(xform_dict, pdf_new_name("BBox"), tmp);
+
+ if (matrix) {
+ tmp = pdf_new_array();
+ pdf_add_array(tmp, pdf_new_number(ROUND(matrix->a, .00001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(matrix->b, .00001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(matrix->c, .00001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(matrix->d, .00001)));
+ pdf_add_array(tmp, pdf_new_number(ROUND(matrix->e, .001 )));
+ pdf_add_array(tmp, pdf_new_number(ROUND(matrix->f, .001 )));
+ pdf_add_dict(xform_dict, pdf_new_name("Matrix"), tmp);
+ }
+
+ pdf_add_dict(xform_dict, pdf_new_name("Resources"), resources);
+
+ return;
+}
+
+/*
+ * begin_form_xobj creates an xobject with its "origin" at
+ * xpos and ypos that is clipped to the specified bbox. Note
+ * that the origin is not the lower left corner of the bbox.
+ */
+int
+pdf_doc_begin_grabbing (const char *ident,
+ double ref_x, double ref_y, const pdf_rect *cropbox)
+{
+ int xobj_id = -1;
+ pdf_doc *p = &pdoc;
+ pdf_form *form;
+ struct form_list_node *fnode;
+ xform_info info;
+
+ fnode = NEW(1, struct form_list_node);
+
+ fnode->prev = p->pending_forms;
+ fnode->q_depth = pdf_dev_current_depth();
+ form = &fnode->form;
+
+ /*
+ * The reference point of an Xobject is at the lower left corner
+ * of the bounding box. Since we would like to have an arbitrary
+ * reference point, we use a transformation matrix, translating
+ * the reference point to (0,0).
+ */
+
+ form->matrix.a = 1.0; form->matrix.b = 0.0;
+ form->matrix.c = 0.0; form->matrix.d = 1.0;
+ form->matrix.e = -ref_x;
+ form->matrix.f = -ref_y;
+
+ form->cropbox.llx = ref_x + cropbox->llx;
+ form->cropbox.lly = ref_y + cropbox->lly;
+ form->cropbox.urx = ref_x + cropbox->urx;
+ form->cropbox.ury = ref_y + cropbox->ury;
+
+ form->contents = pdf_new_stream(STREAM_COMPRESS);
+ form->resources = pdf_new_dict();
+
+ pdf_ximage_init_form_info(&info);
+
+ info.matrix.a = 1.0; info.matrix.b = 0.0;
+ info.matrix.c = 0.0; info.matrix.d = 1.0;
+ info.matrix.e = -ref_x;
+ info.matrix.f = -ref_y;
+
+ info.bbox.llx = cropbox->llx;
+ info.bbox.lly = cropbox->lly;
+ info.bbox.urx = cropbox->urx;
+ info.bbox.ury = cropbox->ury;
+
+ /* Use reference since content itself isn't available yet. */
+ xobj_id = pdf_ximage_defineresource(ident,
+ PDF_XOBJECT_TYPE_FORM,
+ &info, pdf_ref_obj(form->contents));
+
+ p->pending_forms = fnode;
+
+ /*
+ * Make sure the object is self-contained by adding the
+ * current font and color to the object stream.
+ */
+ pdf_dev_reset_fonts();
+ pdf_dev_reset_color();
+
+ return xobj_id;
+}
+
+void
+pdf_doc_end_grabbing (void)
+{
+ pdf_form *form;
+ pdf_obj *procset;
+ pdf_doc *p = &pdoc;
+ struct form_list_node *fnode;
+
+ if (!p->pending_forms) {
+ WARN("Tried to close a nonexistent form XOject.");
+ return;
+ }
+
+ fnode = p->pending_forms;
+ form = &fnode->form;
+
+ pdf_dev_grestore_to(fnode->q_depth);
+
+ /*
+ * ProcSet is obsolete in PDF-1.4 but recommended for compatibility.
+ */
+ procset = pdf_new_array();
+ pdf_add_array(procset, pdf_new_name("PDF"));
+ pdf_add_array(procset, pdf_new_name("Text"));
+ pdf_add_array(procset, pdf_new_name("ImageC"));
+ pdf_add_array(procset, pdf_new_name("ImageB"));
+ pdf_add_array(procset, pdf_new_name("ImageI"));
+ pdf_add_dict (form->resources, pdf_new_name("ProcSet"), procset);
+
+ pdf_doc_make_xform(form->contents,
+ &form->cropbox, &form->matrix,
+ pdf_ref_obj(form->resources));
+ pdf_release_obj(form->resources);
+ pdf_release_obj(form->contents);
+
+ p->pending_forms = fnode->prev;
+
+ /* Here we do not need pdf_dev_reset_color(). */
+ pdf_dev_reset_fonts();
+
+ RELEASE(fnode);
+
+ return;
+}
+
+static struct
+{
+ int dirty;
+ pdf_obj *annot_dict;
+ pdf_rect rect;
+} breaking_state = {0, NULL, {0.0, 0.0, 0.0, 0.0}};
+
+static void
+reset_box (void)
+{
+ breaking_state.rect.llx = 10000.0; /* large value */
+ breaking_state.rect.lly = 10000.0; /* large value */
+ breaking_state.rect.urx = 0.0; /* small value */
+ breaking_state.rect.ury = 0.0; /* small value */
+ breaking_state.dirty = 0;
+}
+
+void
+pdf_doc_begin_annot (pdf_obj *dict)
+{
+ breaking_state.annot_dict = dict;
+ reset_box();
+}
+
+void
+pdf_doc_end_annot (void)
+{
+ pdf_doc_break_annot();
+ breaking_state.annot_dict = NULL;
+}
+
+void
+pdf_doc_break_annot (void)
+{
+ if (breaking_state.dirty) {
+ pdf_obj *annot_dict;
+
+ /* 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), annot_dict);
+ pdf_release_obj(annot_dict);
+ }
+ reset_box();
+}
+
+void
+pdf_doc_expand_box (const pdf_rect *rect)
+{
+ breaking_state.rect.llx = MIN(breaking_state.rect.llx, rect->llx);
+ breaking_state.rect.lly = MIN(breaking_state.rect.lly, rect->lly);
+ breaking_state.rect.urx = MAX(breaking_state.rect.urx, rect->urx);
+ breaking_state.rect.ury = MAX(breaking_state.rect.ury, rect->ury);
+ breaking_state.dirty = 1;
+}
+
+/* This should be number tree */
+void
+pdf_doc_set_pagelabel (long pg_start,
+ const char *type,
+ const void *prefix, int prfx_len, long start)
+{
+ pdf_doc *p = &pdoc;
+ pdf_obj *label_dict;
+
+ if (!p->root.pagelabels)
+ p->root.pagelabels = pdf_new_array();
+
+ label_dict = pdf_new_dict();
+ if (!type || type[0] == '\0') /* Set back to default. */
+ pdf_add_dict(label_dict, pdf_new_name("S"), pdf_new_name("D"));
+ else {
+ if (type)
+ pdf_add_dict(label_dict, pdf_new_name("S"), pdf_new_name(type));
+ if (prefix && prfx_len > 0)
+ pdf_add_dict(label_dict,
+ pdf_new_name("P"),
+ pdf_new_string(prefix, prfx_len));
+ if (start != 1)
+ pdf_add_dict(label_dict,
+ pdf_new_name("St"), pdf_new_number(start));
+ }
+
+ pdf_add_array(p->root.pagelabels, pdf_new_number(pg_start));
+ pdf_add_array(p->root.pagelabels, label_dict);
+
+ return;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdoc.h b/Build/source/texk/xdvipdfmx/src/pdfdoc.h
new file mode 100644
index 00000000000..0d160e18a7f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfdoc.h
@@ -0,0 +1,138 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfdoc.h,v 1.19 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFDOC_H_
+#define _PDFDOC_H_
+
+#include "pdfobj.h"
+#include "pdfdev.h"
+
+#define PDF_DOC_GRABBING_NEST_MAX 4
+
+extern void pdf_doc_set_verbose (void);
+
+extern void pdf_open_document (const char *filename,
+ double media_width, double media_height,
+ double annot_grow_amount, int bookmark_open_depth);
+extern void pdf_close_document (void);
+
+
+/* PDF document metadata */
+extern void pdf_doc_set_creator (const char *creator);
+
+
+/* They just return PDF dictionary object.
+ * Callers are completely responsible for doing right thing...
+ */
+extern pdf_obj *pdf_doc_get_dictionary (const char *category);
+extern pdf_obj *pdf_doc_get_reference (const char *category);
+
+#define pdf_doc_page_tree() pdf_doc_get_dictionary("Pages")
+#define pdf_doc_catalog() pdf_doc_get_dictionary("Catalog")
+#define pdf_doc_docinfo() pdf_doc_get_dictionary("Info")
+#define pdf_doc_names() pdf_doc_get_dictionary("Names")
+#define pdf_doc_this_page() pdf_doc_get_dictionary("@THISPAGE")
+
+extern long pdf_doc_current_page_number (void);
+extern pdf_obj *pdf_doc_current_page_resources (void);
+
+extern pdf_obj *pdf_doc_ref_page (unsigned long page_no);
+#define pdf_doc_this_page_ref() pdf_doc_get_reference("@THISPAGE")
+#define pdf_doc_next_page_ref() pdf_doc_get_reference("@NEXTPAGE")
+#define pdf_doc_prev_page_ref() pdf_doc_get_reference("@PREVPAGE")
+
+/* Not really managing tree...
+ * There should be something for number tree.
+ */
+extern int pdf_doc_add_names (const char *category,
+ const void *key, int keylen, pdf_obj *value);
+
+extern void pdf_doc_set_bop_content (const char *str, unsigned length);
+extern void pdf_doc_set_eop_content (const char *str, unsigned length);
+
+/* Page */
+extern void pdf_doc_begin_page (double scale, double x_origin, double y_origin);
+extern void pdf_doc_end_page (void);
+
+extern void pdf_doc_set_mediabox (unsigned page_no, const pdf_rect *mediabox);
+extern void pdf_doc_get_mediabox (unsigned page_no, pdf_rect *mediabox);
+
+extern void pdf_doc_add_page_content (const char *buffer, unsigned length);
+extern void pdf_doc_add_page_resource (const char *category,
+ const char *resource_name, pdf_obj *resources);
+
+/* Article thread */
+extern void pdf_doc_begin_article (const char *article_id, pdf_obj *info);
+extern void pdf_doc_end_article (const char *article_id); /* Do nothing... */
+extern void pdf_doc_make_article (const char *article_id,
+ const char **bead_order, int num_beads);
+extern void pdf_doc_add_bead (const char *article_id,
+ const char *bead_id,
+ long page_no, const pdf_rect *rect);
+
+/* Bookmarks */
+extern int pdf_doc_bookmarks_up (void);
+extern int pdf_doc_bookmarks_down (void);
+extern void pdf_doc_bookmarks_add (pdf_obj *dict, int is_open);
+extern int pdf_doc_bookmarks_depth (void);
+
+
+/* Form XObject */
+extern void pdf_doc_make_xform (pdf_obj *xform,
+ pdf_rect *bbox, /* const */
+ pdf_tmatrix *matrix, /* const */
+ pdf_obj *resources_ref);
+
+/* Returns xobj_id of started xform. */
+extern int pdf_doc_begin_grabbing (const char *ident,
+ double ref_x, double ref_y,
+ const pdf_rect *cropbox);
+extern void pdf_doc_end_grabbing (void);
+
+
+/* Annotation */
+extern void pdf_doc_add_annot (unsigned page_no,
+ const pdf_rect *rect, pdf_obj *annot_dict);
+
+/* Annotation with auto- clip and line (or page) break */
+extern void pdf_doc_begin_annot (pdf_obj *dict);
+extern void pdf_doc_end_annot (void);
+
+extern void pdf_doc_break_annot (void);
+extern void pdf_doc_expand_box (const pdf_rect *rect);
+
+/* Thumbnail */
+extern void pdf_doc_enable_thumbnails (int thumb_remove);
+
+/* PageLabels - */
+extern void pdf_doc_set_pagelabel (long page_start,
+ const char *type,
+ const void *prefix, int pfrx_len,
+ long counter_start);
+
+/* Similar to bop_content */
+#include "pdfcolor.h"
+extern void pdf_doc_set_bgcolor (const pdf_color *color);
+
+#endif /* _PDFDOC_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdraw.c b/Build/source/texk/xdvipdfmx/src/pdfdraw.c
new file mode 100644
index 00000000000..ec4f8b1981d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfdraw.c
@@ -0,0 +1,1836 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfdraw.c,v 1.12 2005/08/31 08:22:42 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+#include "mfileio.h"
+#include "dpxutil.h"
+#include "numbers.h"
+
+#include "pdfdoc.h"
+#include "pdfdev.h"
+#include "pdfcolor.h"
+
+#include "pdfdraw.h"
+
+#if 1
+typedef void pdf_dev;
+#endif
+
+
+/*
+ * Numbers are rounding to 0-5 fractional digits
+ * in output routine.
+ */
+#define detM(M) ((M).a * (M).d - (M).b * (M).c)
+#define detP(M) ((M)->a * (M)->d - (M)->b * (M)->c)
+
+
+static /* __inline__ */ int
+inversematrix (pdf_tmatrix *W, const pdf_tmatrix *M)
+{
+ double det;
+
+ det = detP(M);
+ if (fabs(det) < 1.e-8) {
+#if 1
+ WARN("Inverting matrix with zero determinant...");
+#endif
+ return -1; /* result is undefined. */
+ }
+
+ W->a = (M->d) / det; W->b = -(M->b) / det;
+ W->c = -(M->c) / det; W->d = (M->a) / det;
+ W->e = (M->c) * (M->f) - (M->d) * (M->e);
+ W->f = (M->b) * (M->e) - (M->a) * (M->f);
+
+ return 0;
+}
+
+/* pdf_coord as vector */
+#define vecprd(v,w) ((v).x * (w).x + (v).y * (w).y)
+#define vecrot(v,w) ((v).x * (w).y - (v).y * (w).x)
+#define dsign(v) (((v) >= 0.0) ? 1.0 : -1.0)
+/* acos => [0, pi] */
+#define vecang(v,w) ( \
+ dsign(vecrot((v),(w))) * \
+ acos(vecprd((v),(w)) / sqrt(vecprd((v),(v)) * vecprd((w),(w)))) \
+)
+
+static /* __inline__ */ int
+pdf_coord__equal (const pdf_coord *p1, const pdf_coord *p2)
+{
+ if (fabs(p1->x - p2->x) < 1.e-7 &&
+ fabs(p1->y - p2->y) < 1.e-7)
+ return 1;
+ return 0;
+}
+#define COORD_EQUAL(p,q) pdf_coord__equal((p),(q))
+
+#if 0
+static int
+pdf_coord__sort_compar_X (const void *pp1, const void *pp2)
+{
+ pdf_coord *p1 = (pdf_coord *)pp1;
+ pdf_coord *p2 = (pdf_coord *)pp2;
+
+ if (pdf_coord__equal(p1, p2))
+ return 0;
+ else
+ return (int) dsign(p1->x - p2->x);
+
+ return 1;
+}
+
+static int
+pdf_coord__sort_compar_Y (const void *pp1, const void *pp2)
+{
+ pdf_coord *p1 = (pdf_coord *)pp1;
+ pdf_coord *p2 = (pdf_coord *)pp2;
+
+ if (pdf_coord__equal(p1, p2))
+ return 0;
+ else
+ return (int) dsign(p1->y - p2->y);
+
+ return 1;
+}
+#endif
+
+
+static /* __inline__ */ int
+pdf_coord__transform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ double x, y;
+
+ x = p->x; y = p->y;
+ p->x = x * M->a + y * M->c + M->e;
+ p->y = x * M->b + y * M->d + M->f;
+
+ return 0;
+}
+
+static /* __inline__ */ int
+pdf_coord__itransform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ pdf_tmatrix W;
+ double x, y;
+ int error;
+
+ error = inversematrix(&W, M);
+ if (error)
+ return error;
+
+ x = p->x; y = p->y;
+ p->x = x * W.a + y * W.c + W.e;
+ p->y = x * W.b + y * W.d + W.f;
+
+ return 0;
+}
+
+static /* __inline__ */ int
+pdf_coord__dtransform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ double x, y;
+
+ x = p->x; y = p->y;
+ p->x = x * M->a + y * M->c;
+ p->y = x * M->b + y * M->d;
+
+ return 0;
+}
+
+static /* __inline__ */ int
+pdf_coord__idtransform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ pdf_tmatrix W;
+ double x, y;
+ int error;
+
+ error = inversematrix(&W, M);
+ if (error)
+ return error;
+
+ x = p->x; y = p->y;
+ p->x = x * W.a + y * W.c;
+ p->y = x * W.b + y * W.d;
+
+ return 0;
+}
+
+
+/* Modify M itself */
+void
+pdf_invertmatrix (pdf_tmatrix *M)
+{
+ pdf_tmatrix W;
+ double det;
+
+ ASSERT(M);
+
+ det = detP(M);
+ if (fabs(det) < 1.e-8) {
+ WARN("Inverting matrix with zero determinant...");
+ W.a = 1.0; W.c = 0.0;
+ W.b = 0.0; W.d = 1.0;
+ W.e = 0.0; W.f = 0.0;
+ } else {
+ W.a = (M->d) / det; W.b = -(M->b) / det;
+ W.c = -(M->c) / det; W.d = (M->a) / det;
+ W.e = (M->c) * (M->f) - (M->d) * (M->e);
+ W.f = (M->b) * (M->e) - (M->a) * (M->f);
+ }
+
+ pdf_copymatrix(M, &W);
+
+ return;
+}
+
+
+typedef struct pa_elem_
+{
+ int type;
+ pdf_coord p[3];
+} pa_elem;
+
+/* each subpath delimitted by moveto */
+struct pdf_path_
+{
+ int num_paths;
+ int max_paths;
+ pa_elem *path;
+};
+
+static const struct {
+ char opchr; /* PDF operator char */
+ int n_pts; /* number of *points* */
+ const char *strkey;
+} petypes[] = {
+#define PE_TYPE__INVALID -1
+#define PE_TYPE__MOVETO 0
+ {'m', 1, "moveto" },
+#define PE_TYPE__LINETO 1
+ {'l', 1, "lineto" },
+#define PE_TYPE__CURVETO 2
+ {'c', 3, "curveto" },
+ /* no PS correspondence for v and y */
+#define PE_TYPE__CURVETO_V 3
+ {'v', 2, "vcurveto"}, /* current point replicated */
+#define PE_TYPE__CURVETO_Y 4
+ {'y', 2, "ycurveto"}, /* last point replicated */
+#define PE_TYPE__CLOSEPATH 5
+ {'h', 0, "closepath"},
+#define PE_TYPE__TERMINATE 6
+ {' ', 0, NULL}
+};
+
+#define PE_VALID(p) ((p) && \
+ (p)->type > PE_TYPE__INVALID && (p)->type < PE_TYPE__TERMINATE)
+#define PE_N_PTS(p) (PE_VALID((p)) ? petypes[(p)->type].n_pts : 0)
+#define PE_OPCHR(p) (PE_VALID((p)) ? petypes[(p)->type].opchr : ' ')
+
+#define PA_LENGTH(pa) ((pa)->num_paths)
+
+#define GS_FLAG_CURRENTPOINT_SET (1 << 0)
+
+
+static char fmt_buf[1024]; /* FIXME */
+#define FORMAT_BUFF_PTR(p) fmt_buf
+#define FORMAT_BUFF_LEN(p) 1024
+
+static void
+pdf_path__initpath (pdf_path *p)
+{
+ ASSERT(p);
+
+ p->num_paths = 0;
+ p->max_paths = 0;
+ p->path = NULL;
+
+ return;
+}
+
+static void
+pdf_path__clearpath (pdf_path *p)
+{
+ ASSERT(p);
+
+ p->num_paths = 0;
+
+ return;
+}
+
+static int
+pdf_path__growpath (pdf_path *p, int max_pe)
+{
+ if (max_pe < p->max_paths)
+ return 0;
+
+ p->max_paths = MAX(p->max_paths + 8, max_pe);
+ p->path = RENEW(p->path, p->max_paths, pa_elem);
+
+ return 0;
+}
+
+static void
+pdf_path__cleanpath (pdf_path *p)
+{
+ ASSERT(p);
+
+ if (p->path)
+ RELEASE(p->path);
+ p->path = NULL;
+ p->num_paths = 0;
+ p->max_paths = 0;
+
+ return;
+}
+
+static int
+pdf_path__copypath (pdf_path *p1, const pdf_path *p0)
+{
+ pa_elem *pe0, *pe1;
+ int i;
+
+ pdf_path__growpath(p1, PA_LENGTH(p0));
+ for (i = 0; i < PA_LENGTH(p0); i++) {
+ pe1 = &(p1->path[i]);
+ pe0 = &(p0->path[i]);
+ /* FIXME */
+ pe1->type = pe0->type;
+ pe1->p[0].x = pe0->p[0].x;
+ pe1->p[0].y = pe0->p[0].y;
+ pe1->p[1].x = pe0->p[1].x;
+ pe1->p[1].y = pe0->p[1].y;
+ pe1->p[2].x = pe0->p[2].x;
+ pe1->p[2].y = pe0->p[2].y;
+ }
+ p1->num_paths = PA_LENGTH(p0);
+
+ return 0;
+}
+
+
+/* start new subpath */
+static int
+pdf_path__moveto (pdf_path *pa,
+ pdf_coord *cp,
+ const pdf_coord *p0)
+{
+ pa_elem *pe;
+
+ pdf_path__growpath(pa, PA_LENGTH(pa) + 1);
+ if (PA_LENGTH(pa) > 0) {
+ pe = &pa->path[pa->num_paths-1];
+ if (pe->type == PE_TYPE__MOVETO) {
+ pe->p[0].x = cp->x = p0->x;
+ pe->p[0].y = cp->y = p0->y;
+ return 0;
+ }
+ }
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__MOVETO;
+ pe->p[0].x = cp->x = p0->x;
+ pe->p[0].y = cp->y = p0->y;
+
+ return 0;
+}
+
+/* Do 'compression' of path while adding new path elements.
+ * Sequantial moveto command will be replaced with a
+ * single moveto. If cp is not equal to the last point in pa,
+ * then moveto is inserted (starting new subpath).
+ * FIXME:
+ * 'moveto' must be used to enforce starting new path.
+ * This affects how 'closepath' is treated.
+ */
+static pa_elem *
+pdf_path__next_pe (pdf_path *pa, const pdf_coord *cp)
+{
+ pa_elem *pe;
+
+ pdf_path__growpath(pa, PA_LENGTH(pa) + 2);
+ if (PA_LENGTH(pa) == 0) {
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__MOVETO;
+ pe->p[0].x = cp->x;
+ pe->p[0].y = cp->y;
+
+ return &pa->path[pa->num_paths++];
+ }
+
+ pe = &pa->path[pa->num_paths-1];
+ switch (pe->type) {
+ case PE_TYPE__MOVETO:
+ pe->p[0].x = cp->x;
+ pe->p[0].y = cp->y;
+ break;
+ case PE_TYPE__LINETO:
+ if (!COORD_EQUAL(&pe->p[0], cp)) {
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__MOVETO;
+ pe->p[0].x = cp->x;
+ pe->p[0].y = cp->y;
+ }
+ break;
+ case PE_TYPE__CURVETO:
+ if (!COORD_EQUAL(&pe->p[2], cp)) {
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__MOVETO;
+ pe->p[0].x = cp->x;
+ pe->p[0].y = cp->y;
+ }
+ break;
+ case PE_TYPE__CURVETO_Y:
+ case PE_TYPE__CURVETO_V:
+ if (!COORD_EQUAL(&pe->p[1], cp)) {
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__MOVETO;
+ pe->p[0].x = cp->x;
+ pe->p[0].y = cp->y;
+ }
+ break;
+ case PE_TYPE__CLOSEPATH:
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__MOVETO;
+ pe->p[0].x = cp->x;
+ pe->p[0].y = cp->y;
+ break;
+ }
+
+ return &pa->path[pa->num_paths++];
+}
+
+static int
+pdf_path__transform (pdf_path *pa, const pdf_tmatrix *M)
+{
+ pa_elem *pe;
+ int n = 0, i;
+
+ ASSERT(pa && M);
+
+ for (i = 0; i < PA_LENGTH(pa); i++) {
+ pe = &(pa->path[i]);
+ n = PE_N_PTS(pe);
+ while (n-- > 0)
+ pdf_coord__transform(&(pe->p[n]), M);
+ }
+
+ return 0;
+}
+
+
+/* Path Construction */
+static int
+pdf_path__lineto (pdf_path *pa,
+ pdf_coord *cp,
+ const pdf_coord *p0)
+{
+ pa_elem *pe;
+
+ pe = pdf_path__next_pe(pa, cp);
+ pe->type = PE_TYPE__LINETO;
+ pe->p[0].x = cp->x = p0->x;
+ pe->p[0].y = cp->y = p0->y;
+
+ return 0;
+}
+
+static int
+pdf_path__curveto (pdf_path *pa,
+ pdf_coord *cp,
+ const pdf_coord *p0,
+ const pdf_coord *p1,
+ const pdf_coord *p2
+ )
+{
+ pa_elem *pe;
+
+ pe = pdf_path__next_pe(pa, cp);
+ if (COORD_EQUAL(cp, p0)) {
+ pe->type = PE_TYPE__CURVETO_V;
+ pe->p[0].x = p1->x;
+ pe->p[0].y = p1->y;
+ pe->p[1].x = cp->x = p2->x;
+ pe->p[1].y = cp->y = p2->y;
+ } else if (COORD_EQUAL(p1, p2)) {
+ pe->type = PE_TYPE__CURVETO_Y;
+ pe->p[0].x = p0->x;
+ pe->p[0].y = p0->y;
+ pe->p[1].x = cp->x = p1->x;
+ pe->p[1].y = cp->y = p1->y;
+ } else {
+ pe->type = PE_TYPE__CURVETO;
+ pe->p[0].x = p0->x;
+ pe->p[0].y = p0->y;
+ pe->p[1].x = p1->x;
+ pe->p[1].y = p1->y;
+ pe->p[2].x = cp->x = p2->x;
+ pe->p[2].y = cp->y = p2->y;
+ }
+
+ return 0;
+}
+
+#define QB_TWO_THIRD (2.0/3.0)
+#define QB_ONE_THIRD (1.0/3.0)
+
+static int
+pdf_path__curveto_QB (pdf_path *pa,
+ pdf_coord *cp,
+ const pdf_coord *p0,
+ const pdf_coord *p1
+ )
+{
+ pdf_coord q0, q1;
+
+ q0.x = cp->x + QB_TWO_THIRD * (p0->x - cp->x);
+ q0.y = cp->y + QB_TWO_THIRD * (p0->y - cp->y);
+ q1.x = p0->x + QB_ONE_THIRD * (p1->x - p0->x);
+ q1.y = p0->y + QB_ONE_THIRD * (p1->y - p0->y);
+ /* q2 == p1 */
+
+ return pdf_path__curveto(pa, cp, &q0, &q1, p1);
+}
+
+
+/* This isn't specified as cp to somewhere. */
+static int
+pdf_path__elliptarc (pdf_path *pa,
+ pdf_coord *cp,
+ const pdf_coord *ca, /* ellipsis center */
+ double r_x, /* x radius */
+ double r_y, /* y radius */
+ double xar, /* x-axis-rotation (deg!) */
+ double a_0, /* start angle */
+ double a_1, /* stop angle */
+ int a_d /* arc orientation */
+ )
+{
+ double b, b_x, b_y;
+ double d_a, q;
+ pdf_coord p0, p1, p2, p3;
+ pdf_coord e0, e1;
+ pdf_tmatrix T;
+ int n_c; /* number of segments */
+ int i, error = 0;
+
+ if (fabs(r_x) < 1.e-8 ||
+ fabs(r_y) < 1.e-8)
+ return -1;
+
+ if (a_d < 0) {
+ for ( ; a_1 > a_0; a_1 -= 360.0);
+ } else {
+ for ( ; a_1 < a_0; a_0 -= 360.0);
+ }
+
+ d_a = a_1 - a_0;
+ for (n_c = 1; fabs(d_a) > 90.0 * n_c; n_c++);
+ d_a /= n_c;
+ if (fabs(d_a) < 1.e-8)
+ return -1;
+
+ a_0 *= M_PI / 180.0;
+ a_1 *= M_PI / 180.0;
+ d_a *= M_PI / 180.0;
+ xar *= M_PI / 180.0;
+ T.a = cos(xar); T.c = -sin(xar);
+ T.b = -T.c ; T.d = T.a;
+ T.e = 0.0 ; T.f = 0.0;
+
+ /* A parameter that controls cb-curve (off-curve) points */
+ b = 4.0 * (1.0 - cos(.5 * d_a)) / (3.0 * sin(.5 * d_a));
+ b_x = r_x * b;
+ b_y = r_y * b;
+
+ p0.x = r_x * cos(a_0);
+ p0.y = r_y * sin(a_0);
+ pdf_coord__transform(&p0, &T);
+ p0.x += ca->x; p0.y += ca->y;
+ if (PA_LENGTH(pa) == 0) {
+ pdf_path__moveto(pa, cp, &p0);
+ } else if (!COORD_EQUAL(cp, &p0)) {
+ pdf_path__lineto(pa, cp, &p0); /* add line seg */
+ }
+ for (i = 0; !error && i < n_c; i++) {
+ q = a_0 + i * d_a;
+ e0.x = cos(q); e0.y = sin(q);
+ e1.x = cos(q + d_a); e1.y = sin(q + d_a);
+
+ /* Condition for tangent vector requirs
+ * d1 = p1 - p0 = f ( sin a, -cos a)
+ * d2 = p2 - p3 = g ( sin b, -cos b)
+ * and from symmetry
+ * g^2 = f^2
+ */
+ p0.x = r_x * e0.x; /* s.p. */
+ p0.y = r_y * e0.y;
+ p3.x = r_x * e1.x; /* e.p. */
+ p3.y = r_y * e1.y;
+
+ p1.x = -b_x * e0.y;
+ p1.y = b_y * e0.x;
+ p2.x = b_x * e1.y;
+ p2.y = -b_y * e1.x;
+
+ pdf_coord__transform(&p0, &T);
+ pdf_coord__transform(&p1, &T);
+ pdf_coord__transform(&p2, &T);
+ pdf_coord__transform(&p3, &T);
+ p0.x += ca->x; p0.y += ca->y;
+ p3.x += ca->x; p3.y += ca->y;
+ p1.x += p0.x ; p1.y += p0.y ;
+ p2.x += p3.x ; p2.y += p3.y ;
+
+ error = pdf_path__curveto(pa, &p0, &p1, &p2, &p3);
+ cp->x = p3.x; cp->y = p3.y;
+ }
+
+ return error;
+}
+
+static int
+pdf_path__closepath (pdf_path *pa, pdf_coord *cp /* no arg */)
+{
+ pa_elem *pe = NULL;
+ int i;
+
+ /* search for start point of the last subpath */
+ for (i = PA_LENGTH(pa) - 1; i >= 0; i--) {
+ pe = &pa->path[i];
+ if (pe->type == PE_TYPE__MOVETO)
+ break;
+ }
+
+ if (!pe || i < 0)
+ return -1; /* No path or no start point(!) */
+
+ cp->x = pe->p[0].x;
+ cp->y = pe->p[0].y;
+
+ pdf_path__growpath(pa, PA_LENGTH(pa) + 1);
+
+ /* NOTE:
+ * Manually closed path without closepath is not
+ * affected by linejoin. A path with coincidental
+ * starting and ending point is not the same as
+ * 'closed' path.
+ */
+ pe = &pa->path[pa->num_paths++];
+ pe->type = PE_TYPE__CLOSEPATH;
+
+ return 0;
+}
+
+/*
+ * x y width height re
+ *
+ * is equivalent to
+ *
+ * x y m
+ * (x + width) y l
+ * (x + width) (y + height) l
+ * x (y + height) l
+ * h
+ */
+/* Just for quick test */
+static /* __inline__ */ int
+pdf_path__isarect (pdf_path *pa,
+ int f_ir /* fill-rule is ignorable */
+ )
+{
+ pa_elem *pe0, *pe1, *pe2, *pe3, *pe4;
+
+ if (PA_LENGTH(pa) == 5) {
+ pe0 = &(pa->path[0]);
+ pe1 = &(pa->path[1]);
+ pe2 = &(pa->path[2]);
+ pe3 = &(pa->path[3]);
+ pe4 = &(pa->path[4]);
+ if (pe0->type == PE_TYPE__MOVETO &&
+ pe1->type == PE_TYPE__LINETO &&
+ pe2->type == PE_TYPE__LINETO &&
+ pe3->type == PE_TYPE__LINETO &&
+ pe4->type == PE_TYPE__CLOSEPATH) {
+ if (pe1->p[0].y - pe0->p[0].y == 0 &&
+ pe2->p[0].x - pe1->p[0].x == 0 &&
+ pe3->p[0].y - pe2->p[0].y == 0) {
+ if (pe1->p[0].x - pe0->p[0].x
+ == pe2->p[0].x - pe3->p[0].x) {
+ return 1;
+ }
+ /* Winding number is different but ignore it here. */
+ } else if (f_ir &&
+ pe1->p[0].x - pe0->p[0].x == 0 &&
+ pe2->p[0].y - pe1->p[0].y == 0 &&
+ pe3->p[0].x - pe2->p[0].x == 0) {
+ if (pe1->p[0].y - pe0->p[0].y
+ == pe2->p[0].y - pe3->p[0].y) {
+ return 1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* Path Painting */
+/* F is obsoleted */
+#define PT_OP_VALID(c) ( \
+ (c) == 'f' || (c) == 'F' || \
+ (c) == 's' || (c) == 'S' || \
+ (c) == 'b' || (c) == 'B' || \
+ (c) == 'W' \
+)
+
+static /* __inline__ */ int
+INVERTIBLE_MATRIX (const pdf_tmatrix *M)
+{
+ if (fabs(detP(M)) < 1.e-8) {
+ WARN("Transformation matrix not invertible.");
+ WARN("--- M = [%g %g %g %g %g %g]",
+ M->a, M->b, M->c, M->d, M->e, M->f);
+ return -1;
+ }
+ return 0;
+}
+
+/* rectfill, rectstroke, rectclip, recteoclip
+ *
+ * Draw isolated rectangle without actually doing
+ * gsave/grestore operation.
+ *
+ * TODO:
+ * linestyle, fill-opacity, stroke-opacity,....
+ * As this routine draw a single graphics object
+ * each time, there should be options for specifying
+ * various drawing styles, which might inherite
+ * current graphcs state parameter.
+ */
+static int
+pdf_dev__rectshape (pdf_dev *P,
+ const pdf_rect *r,
+ const pdf_tmatrix *M,
+ char opchr
+ )
+{
+ char *buf = FORMAT_BUFF_PTR(P);
+ int len = 0;
+ int isclip = 0;
+ pdf_coord p;
+ double wd, ht;
+
+ ASSERT(r && PT_OP_VALID(opchr));
+
+ isclip = (opchr == 'W') ? 1 : 0;
+
+ /* disallow matrix for clipping.
+ * q ... clip Q does nothing and
+ * n M cm ... clip n alter CTM.
+ */
+ if (M && (isclip ||
+ !INVERTIBLE_MATRIX(M)))
+ return -1;
+
+ graphics_mode();
+
+ buf[len++] = ' ';
+ if (!isclip) {
+ buf[len++] = 'q';
+ if (M) {
+ buf[len++] = ' ';
+ len += pdf_sprint_matrix(buf + len, M);
+ buf[len++] = ' ';
+ buf[len++] = 'c'; buf[len++] = 'm';
+ }
+ buf[len++] = ' ';
+ }
+ buf[len++] = 'n';
+
+ p.x = r->llx; p.y = r->lly;
+ wd = r->urx - r->llx;
+ ht = r->ury - r->lly;
+ buf[len++] = ' ';
+ len += pdf_sprint_coord (buf + len, &p);
+ buf[len++] = ' ';
+ len += pdf_sprint_length(buf + len, wd);
+ buf[len++] = ' ';
+ len += pdf_sprint_length(buf + len, ht);
+ buf[len++] = ' ';
+ buf[len++] = 'r'; buf[len++] = 'e';
+
+ buf[len++] = ' ';
+ buf[len++] = opchr;
+
+ buf[len++] = ' ';
+ buf[len++] = isclip ? 'n' : 'Q';
+
+ pdf_doc_add_page_content(buf, len); len = 0;
+
+ return 0;
+}
+
+/* FIXME */
+static int
+pdf_dev__flushpath (pdf_dev *P,
+ pdf_path *pa,
+ char opchr,
+ int rule,
+ int ignore_rule)
+{
+ pa_elem *pe, *pe1;
+ char *b = FORMAT_BUFF_PTR(P);
+ long b_len = FORMAT_BUFF_LEN(P);
+ pdf_rect r; /* FIXME */
+ pdf_coord *pt;
+ int n_pts, n_seg;
+ int len = 0;
+ int isrect, i, j;
+
+ ASSERT(pa && PT_OP_VALID(opchr));
+
+ if (PA_LENGTH(pa) <= 0)
+ return 0;
+
+ graphics_mode();
+ isrect = pdf_path__isarect(pa, ignore_rule);
+ if (isrect) {
+ pe = &(pa->path[0]);
+ pe1 = &(pa->path[2]);
+
+ r.llx = pe->p[0].x;
+ r.lly = pe->p[0].y;
+ r.urx = pe1->p[0].x - pe->p[0].x; /* width... */
+ r.ury = pe1->p[0].y - pe->p[0].y; /* height... */
+
+ b[len++] = ' ';
+ len += pdf_sprint_rect(b + len, &r);
+ b[len++] = ' ';
+ b[len++] = 'r';
+ b[len++] = 'e';
+ pdf_doc_add_page_content(b, len); len = 0;
+ } else {
+ n_seg = PA_LENGTH(pa);
+ for (i = 0, len = 0, pe = &pa->path[0];
+ i < n_seg; pe++, i++) {
+ n_pts = PE_N_PTS(pe);
+ for (j = 0, pt = &pe->p[0];
+ j < n_pts; j++, pt++) {
+ b[len++] = ' ';
+ len += pdf_sprint_coord(b + len, pt);
+ }
+ b[len++] = ' ';
+ b[len++] = PE_OPCHR(pe);
+ if (len + 128 > b_len) {
+ pdf_doc_add_page_content(b, len); len = 0;
+ }
+ }
+ if (len > 0) {
+ pdf_doc_add_page_content(b, len); len = 0;
+ }
+ }
+
+ b[len++] = ' ';
+ b[len++] = opchr;
+ if (rule == PDF_FILL_RULE_EVENODD)
+ b[len++] = '*';
+
+ pdf_doc_add_page_content(b, len);
+
+ return 0;
+}
+
+
+/* Graphics State */
+typedef struct pdf_gstate_
+{
+ pdf_coord cp;
+
+ pdf_tmatrix matrix; /* cm, - */
+
+ pdf_color strokecolor;
+ pdf_color fillcolor;
+ /* colorspace here */
+
+ struct {
+ int num_dash;
+ double pattern[PDF_DASH_SIZE_MAX];
+ double offset;
+ } linedash; /* d, D */
+
+ double linewidth; /* w, LW */
+
+ int linecap; /* J, LC */
+ int linejoin; /* j, LJ */
+ double miterlimit; /* M, ML */
+
+ int flatness; /* i, FL, 0 to 100 (0 for use device-default) */
+
+ /* internal */
+ pdf_path path;
+ long flags;
+} pdf_gstate;
+
+
+typedef struct m_stack_elem
+{
+ void *data;
+ struct m_stack_elem *prev;
+} m_stack_elem;
+
+typedef struct m_stack
+{
+ int size;
+ m_stack_elem *top;
+ m_stack_elem *bottom;
+} m_stack;
+
+static void
+m_stack_init (m_stack *stack)
+{
+ ASSERT(stack);
+
+ stack->size = 0;
+ stack->top = NULL;
+ stack->bottom = NULL;
+
+ return;
+}
+
+static void
+m_stack_push (m_stack *stack, void *data)
+{
+ m_stack_elem *elem;
+
+ ASSERT(stack);
+
+ elem = NEW(1, m_stack_elem);
+ elem->prev = stack->top;
+ elem->data = data;
+
+ stack->top = elem;
+ if (stack->size == 0)
+ stack->bottom = elem;
+
+ stack->size++;
+
+ return;
+}
+
+static void *
+m_stack_pop (m_stack *stack)
+{
+ m_stack_elem *elem;
+ void *data;
+
+ ASSERT(stack);
+
+ if (stack->size == 0)
+ return NULL;
+
+ data = stack->top->data;
+ elem = stack->top;
+ stack->top = elem->prev;
+ if (stack->size == 1)
+ stack->bottom = NULL;
+ RELEASE(elem);
+
+ stack->size--;
+
+ return data;
+}
+
+static void *
+m_stack_top (m_stack *stack)
+{
+ void *data;
+
+ ASSERT(stack);
+
+ if (stack->size == 0)
+ return NULL;
+
+ data = stack->top->data;
+
+ return data;
+}
+
+#define m_stack_depth(s) ((s) ? (s)->size : 0)
+
+
+static m_stack _gsstck; /* FIXME */
+
+
+static void
+pdf_dev__init_gstate (pdf_gstate *gs)
+{
+ pdf_path *pa = &gs->path;
+ pdf_color *cf = &gs->fillcolor;
+ pdf_color *cs = &gs->strokecolor;
+ pdf_tmatrix *M = &gs->matrix;
+
+ gs->cp.x = 0.0;
+ gs->cp.y = 0.0;
+
+ pdf_setmatrix(M, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
+
+ pdf_color_graycolor(cs, 0.0);
+ pdf_color_graycolor(cf, 0.0);
+
+ gs->linedash.num_dash = 0;
+ gs->linedash.offset = 0;
+ gs->linecap = 0;
+ gs->linejoin = 0;
+ gs->linewidth = 1.0;
+ gs->miterlimit = 10.0;
+
+ gs->flatness = 1; /* default to 1 in PDF */
+
+ /* Internal variables */
+ gs->flags = 0;
+ pdf_path__initpath(pa);
+
+ return;
+}
+
+static void
+pdf_dev__clean_gstate (pdf_gstate *gs)
+{
+ pdf_path__cleanpath(&gs->path);
+ memset(gs, 0, sizeof(pdf_gstate));
+
+ return;
+}
+
+static void
+pdf_dev__copy_gstate (pdf_gstate *gs1, pdf_gstate *gs2)
+{
+ int i;
+
+ ASSERT(gs1 && gs2);
+
+ gs1->cp.x = gs2->cp.x;
+ gs1->cp.y = gs2->cp.y;
+
+ pdf_copymatrix(&gs1->matrix, &gs2->matrix);
+
+ /* TODO:
+ * Path should be linked list and gsave only
+ * record starting point within path rather than
+ * copying whole path.
+ */
+ pdf_path__copypath(&gs1->path, &gs2->path);
+
+ gs1->linedash.num_dash = gs2->linedash.num_dash;
+ for (i = 0; i < gs2->linedash.num_dash; i++) {
+ gs1->linedash.pattern[i] = gs2->linedash.pattern[i];
+ }
+ gs1->linedash.offset = gs2->linedash.offset;
+
+ gs1->linecap = gs2->linecap;
+ gs1->linejoin = gs2->linejoin;
+ gs1->linewidth = gs2->linewidth;
+ gs1->miterlimit = gs2->miterlimit;
+ gs1->flatness = gs2->flatness;
+
+ pdf_color_copycolor(&gs1->fillcolor , &gs2->fillcolor);
+ pdf_color_copycolor(&gs1->strokecolor, &gs2->strokecolor);
+
+ return;
+}
+
+void
+pdf_dev_init_gstates (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs;
+
+ m_stack_init(gss);
+
+ gs = NEW(1, pdf_gstate);
+ pdf_dev__init_gstate(gs);
+
+ m_stack_push(gss, gs); /* Initial state */
+
+ return;
+}
+
+void
+pdf_dev_clean_gstates (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs;
+
+ if (m_stack_depth(gss) > 1) /* at least 1 elem. */
+ WARN("GS stack depth not 0 at end of document.");
+
+ while ((gs = m_stack_pop(gss)) != NULL) {
+ pdf_dev__clean_gstate(gs);
+ RELEASE(gs);
+ }
+
+ return;
+}
+
+
+int
+pdf_dev_currentpoint (pdf_coord *p)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_coord *cpt = &gs->cp;
+
+ ASSERT(p);
+
+ p->x = cpt->x; p->y = cpt->y;
+
+ return 0;
+}
+
+int
+pdf_dev_currentmatrix (pdf_tmatrix *M)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_tmatrix *CTM = &gs->matrix;
+
+ ASSERT(M);
+
+ pdf_copymatrix(M, CTM);
+
+ return 0;
+}
+
+#if 0
+int
+pdf_dev_currentcolor (pdf_color *color, int is_fill)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_color *fcl = &gs->fillcolor;
+ pdf_color *scl = &gs->strokecolor;
+
+ ASSERT(color);
+
+ pdf_color_copycolor(color, is_fill ? fcl : scl);
+
+ return 0;
+}
+#endif /* 0 */
+
+int
+pdf_dev_concat (const pdf_tmatrix *M)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_tmatrix *CTM = &gs->matrix;
+ pdf_tmatrix W;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+ int len = 0;
+
+ ASSERT(M);
+
+ /* Adobe Reader erases page content if there are
+ * non invertible transformation.
+ */
+ if (fabs(detP(M)) < 1.0e-8) {
+ WARN("Transformation matrix not invertible.");
+ WARN("--- M = [%g %g %g %g %g %g]",
+ M->a, M->b, M->c, M->d, M->e, M->f);
+ return -1;
+ }
+
+ buf[len++] = ' ';
+ len += pdf_sprint_matrix(buf + len, M);
+ buf[len++] = ' ';
+ buf[len++] = 'c';
+ buf[len++] = 'm';
+ pdf_doc_add_page_content(buf, len);
+
+ pdf_concatmatrix(CTM, M);
+
+ inversematrix(&W, M);
+
+ pdf_path__transform (cpa, &W);
+ pdf_coord__transform(cpt, &W);
+
+ return 0;
+}
+
+
+int
+pdf_dev_gsave (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs0, *gs1;
+
+ gs0 = m_stack_top(gss);
+ gs1 = NEW(1, pdf_gstate);
+
+ pdf_dev__init_gstate(gs1);
+ pdf_dev__copy_gstate(gs1, gs0);
+
+ pdf_dev_currentcolor(&gs1->strokecolor, 0);
+ pdf_dev_currentcolor(&gs1->fillcolor, 1);
+
+ m_stack_push(gss, gs1);
+
+ pdf_doc_add_page_content(" q", 2);
+
+ return 0;
+}
+
+
+int
+pdf_dev_push_gstate (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs0;
+
+ gs0 = NEW(1, pdf_gstate);
+
+ pdf_dev__init_gstate(gs0);
+
+ m_stack_push(gss, gs0);
+
+ return 0;
+}
+
+
+int
+pdf_dev_pop_gstate (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs;
+
+ if (m_stack_depth(gss) <= 1) { /* Initial state at bottom */
+ WARN("Too many grestores.");
+ return -1;
+ }
+
+ gs = m_stack_pop(gss);
+ pdf_dev__clean_gstate(gs);
+ RELEASE(gs);
+
+ return 0;
+}
+
+
+int
+pdf_dev_current_depth (void)
+{
+ m_stack *gss = &_gsstck;
+
+ return (m_stack_depth(gss) - 1); /* 0 means initial state */
+}
+
+void
+pdf_dev_grestore_to (int depth)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs;
+
+ ASSERT(depth >= 0);
+
+ if (m_stack_depth(gss) > depth + 1) {
+ WARN("Closing pending transformations at end of page/XObject.");
+ }
+
+ while (m_stack_depth(gss) > depth + 1) {
+ pdf_doc_add_page_content(" Q", 2);
+ gs = m_stack_pop(gss);
+ pdf_dev__clean_gstate(gs);
+ RELEASE(gs);
+ }
+#if 0
+ pdf_dev_reset_fonts();
+#else
+ pdf_dev_reset();
+#endif
+
+ return;
+}
+
+int
+pdf_dev_grestore (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs;
+ pdf_color sc, fc;
+
+ if (m_stack_depth(gss) <= 1) { /* Initial state at bottom */
+ WARN("Too many grestores.");
+ return -1;
+ }
+
+ gs = m_stack_pop(gss);
+
+ pdf_color_copycolor(&sc, &gs->strokecolor);
+ pdf_color_copycolor(&fc, &gs->fillcolor);
+
+ pdf_dev__clean_gstate(gs);
+ RELEASE(gs);
+
+ pdf_doc_add_page_content(" Q", 2);
+
+#if 0
+ pdf_dev_reset_fonts();
+#else
+ pdf_dev_reset();
+#endif
+
+ pdf_dev_setcolor(&sc, 0);
+ pdf_dev_setcolor(&fc, 1);
+
+ return 0;
+}
+
+#if 0
+void
+pdf_dev_reset_color (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_color fill, stroke;
+
+ pdf_color_copycolor(&fill, &gs->fillcolor);
+ pdf_color_copycolor(&stroke, &gs->strokecolor);
+
+ /* Clear current color: */
+ pdf_color_graycolor(&gs->fillcolor, 0.0);
+ pdf_color_graycolor(&gs->strokecolor, 0.0);
+
+ pdf_dev_setcolor(&stroke, 0);
+ pdf_dev_setcolor(&fill, 1);
+
+ return;
+}
+
+int
+pdf_dev_setcolor (const pdf_color *color, int is_fill)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_color *fcl = &gs->fillcolor;
+ pdf_color *scl = &gs->strokecolor;
+ int colormode;
+ pdf_color *curcol;
+
+ if (!color) {
+ WARN("No color specified.");
+ return -1;
+ }
+
+ colormode = pdf_dev_get_param(PDF_DEV_PARAM_COLORMODE);
+ if (!colormode) {
+ WARN("setcolor ignored. (Ignore color option set)");
+ return 0;
+ }
+
+ curcol = is_fill ? fcl : scl;
+ if (!pdf_color_compare_color(color, curcol)) {
+ return 0;
+ }
+
+ graphics_mode();
+ pdf_color_print_color(color, is_fill);
+
+ pdf_color_copycolor(curcol, color);
+
+ return 0;
+}
+#endif
+
+/*
+ * num w LW linewidth (g.t. 0)
+ * int J LC linecap
+ * int j LJ linejoin
+ * num M ML miter limit (g.t. 0)
+ * array num d D line dash
+ * int ri RI renderint intnet
+ * int i FL flatness tolerance (0-100)
+ * name gs -- name: res. name of ExtGState dict.
+ */
+int
+pdf_dev_setmiterlimit (double mlimit)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ int len = 0;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+
+ if (gs->miterlimit != mlimit) {
+ buf[len++] = ' ';
+ len += pdf_sprint_length(buf + len, mlimit);
+ buf[len++] = ' ';
+ buf[len++] = 'M';
+ pdf_doc_add_page_content(buf, len);
+ gs->miterlimit = mlimit;
+ }
+
+ return 0;
+}
+
+int
+pdf_dev_setlinecap (int capstyle)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ int len = 0;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+
+ if (gs->linecap != capstyle) {
+ len = sprintf(buf, " %d J", capstyle);
+ pdf_doc_add_page_content(buf, len);
+ gs->linecap = capstyle;
+ }
+
+ return 0;
+}
+
+int
+pdf_dev_setlinejoin (int joinstyle)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ int len = 0;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+
+ if (gs->linejoin != joinstyle) {
+ len = sprintf(buf, " %d j", joinstyle);
+ pdf_doc_add_page_content(buf, len);
+ gs->linejoin = joinstyle;
+ }
+
+ return 0;
+}
+
+int
+pdf_dev_setlinewidth (double width)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ int len = 0;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+
+ if (gs->linewidth != width) {
+ buf[len++] = ' ';
+ len += pdf_sprint_length(buf + len, width);
+ buf[len++] = ' ';
+ buf[len++] = 'w';
+ pdf_doc_add_page_content(buf, len);
+ gs->linewidth = width;
+ }
+
+ return 0;
+}
+
+int
+pdf_dev_setdash (int count, double *pattern, double offset)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ int len = 0;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+ int i;
+
+ gs->linedash.num_dash = count;
+ gs->linedash.offset = offset;
+ pdf_doc_add_page_content(" [", 2);
+ for (i = 0; i < count; i++) {
+ buf[0] = ' ';
+ len = pdf_sprint_length (buf + 1, pattern[i]);
+ pdf_doc_add_page_content(buf, len + 1);
+ gs->linedash.pattern[i] = pattern[i];
+ }
+ pdf_doc_add_page_content("] ", 2);
+ len = pdf_sprint_length (buf, offset);
+ pdf_doc_add_page_content(buf, len);
+ pdf_doc_add_page_content(" d", 2);
+
+ return 0;
+}
+
+int
+pdf_dev_setflat (int flatness)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ int len = 0;
+ char *buf = FORMAT_BUFF_PTR(NULL);
+
+ if (flatness < 0 || flatness > 100)
+ return -1;
+
+ if (gs->flatness != flatness) {
+ gs->flatness = flatness;
+ len = sprintf(buf, " %d i", flatness);
+ pdf_doc_add_page_content(buf, len);
+ }
+
+ return 0;
+}
+
+/* ZSYUEDVEDEOF */
+int
+pdf_dev_clip (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+
+ return pdf_dev__flushpath(NULL, cpa, 'W', PDF_FILL_RULE_NONZERO, 0);
+}
+
+int
+pdf_dev_eoclip (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+
+ return pdf_dev__flushpath(NULL, cpa, 'W', PDF_FILL_RULE_EVENODD, 0);
+}
+
+int
+pdf_dev_flushpath (char p_op, int fill_rule)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ int error = 0;
+
+ /* last arg 'ignore_rule' is only for single object
+ * that can be converted to a rect where fill rule
+ * is inessential.
+ */
+ error = pdf_dev__flushpath(NULL, cpa, p_op, fill_rule, 1);
+ pdf_path__clearpath(cpa);
+
+ gs->flags &= ~GS_FLAG_CURRENTPOINT_SET;
+
+ return error;
+}
+
+int
+pdf_dev_newpath (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *p = &gs->path;
+
+ if (PA_LENGTH(p) > 0) {
+ pdf_path__clearpath (p);
+ }
+ /* The following is required for "newpath" operator in mpost.c. */
+ pdf_doc_add_page_content(" n", 2);
+
+ return 0;
+}
+
+int
+pdf_dev_moveto (double x, double y)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p;
+
+ p.x = x; p.y = y;
+ return pdf_path__moveto(cpa, cpt, &p); /* cpt updated */
+}
+
+int
+pdf_dev_rmoveto (double x, double y)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p;
+
+ p.x = cpt->x + x;
+ p.y = cpt->y + y;
+ return pdf_path__moveto(cpa, cpt, &p); /* cpt updated */
+}
+
+int
+pdf_dev_lineto (double x, double y)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p0;
+
+ p0.x = x; p0.y = y;
+
+ return pdf_path__lineto(cpa, cpt, &p0);
+}
+
+int
+pdf_dev_rlineto (double x, double y)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p0;
+
+ p0.x = x + cpt->x; p0.y = y + cpt->y;
+
+ return pdf_path__lineto(cpa, cpt, &p0);
+}
+
+int
+pdf_dev_curveto (double x0, double y0,
+ double x1, double y1,
+ double x2, double y2)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p0, p1, p2;
+
+ p0.x = x0; p0.y = y0;
+ p1.x = x1; p1.y = y1;
+ p2.x = x2; p2.y = y2;
+
+ return pdf_path__curveto(cpa, cpt, &p0, &p1, &p2);
+}
+
+int
+pdf_dev_rcurveto (double x0, double y0,
+ double x1, double y1,
+ double x2, double y2)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p0, p1, p2;
+
+ p0.x = x0 + cpt->x; p0.y = y0 + cpt->y;
+ p1.x = x1 + cpt->x; p1.y = y1 + cpt->y;
+ p2.x = x2 + cpt->x; p2.y = y2 + cpt->y;
+
+ return pdf_path__curveto(cpa, cpt, &p0, &p1, &p2);
+}
+
+
+int
+pdf_dev_closepath (void)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_coord *cpt = &gs->cp;
+ pdf_path *cpa = &gs->path;
+
+ return pdf_path__closepath(cpa, cpt);
+}
+
+
+void
+pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_tmatrix *CTM = &gs->matrix;
+
+ ASSERT(p);
+
+ pdf_coord__dtransform(p, (M ? M : CTM));
+
+ return;
+}
+
+void
+pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_tmatrix *CTM = &gs->matrix;
+
+ ASSERT(p);
+
+ pdf_coord__idtransform(p, (M ? M : CTM));
+
+ return;
+}
+
+void
+pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_tmatrix *CTM = &gs->matrix;
+
+ ASSERT(p);
+
+ pdf_coord__transform(p, (M ? M : CTM));
+
+ return;
+}
+
+void
+pdf_dev_itransform (pdf_coord *p, const pdf_tmatrix *M)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_tmatrix *CTM = &gs->matrix;
+
+ ASSERT(p);
+
+ pdf_coord__itransform(p, (M ? M : CTM));
+
+ return;
+}
+
+int
+pdf_dev_arc (double c_x , double c_y, double r,
+ double a_0 , double a_1)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord c;
+
+ c.x = c_x; c.y = c_y;
+
+ return pdf_path__elliptarc(cpa, cpt, &c, r, r, 0.0, a_0, a_1, +1);
+}
+
+/* *negative* arc */
+int
+pdf_dev_arcn (double c_x , double c_y, double r,
+ double a_0 , double a_1)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord c;
+
+ c.x = c_x; c.y = c_y;
+
+ return pdf_path__elliptarc(cpa, cpt, &c, r, r, 0.0, a_0, a_1, -1);
+}
+
+int
+pdf_dev_arcx (double c_x , double c_y,
+ double r_x , double r_y,
+ double a_0 , double a_1,
+ int a_d ,
+ double xar)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord c;
+
+ c.x = c_x; c.y = c_y;
+
+ return pdf_path__elliptarc(cpa, cpt, &c, r_x, r_y, xar, a_0, a_1, a_d);
+}
+
+/* Required by Tpic */
+int
+pdf_dev_bspline (double x0, double y0,
+ double x1, double y1, double x2, double y2)
+{
+ m_stack *gss = &_gsstck;
+ pdf_gstate *gs = m_stack_top(gss);
+ pdf_path *cpa = &gs->path;
+ pdf_coord *cpt = &gs->cp;
+ pdf_coord p1, p2, p3;
+
+ p1.x = x0 + 2.0 * (x1 - x0) / 3.0;
+ p1.y = y0 + 2.0 * (y1 - y0) / 3.0;
+ p2.x = x1 + (x2 - x1) / 3.0;
+ p2.y = y1 + (y2 - y1) / 3.0;
+ p3.x = x2;
+ p3.y = y2;
+
+ return pdf_path__curveto(cpa, cpt, &p1, &p2, &p3);
+}
+
+
+int
+pdf_dev_rectstroke (double x, double y,
+ double w, double h,
+ const pdf_tmatrix *M /* optional */
+ )
+{
+ pdf_rect r;
+
+ r.llx = x;
+ r.lly = y;
+ r.urx = x + w;
+ r.ury = y + h;
+
+ return pdf_dev__rectshape(NULL, &r, M, 'S');
+}
+
+int
+pdf_dev_rectfill (double x, double y,
+ double w, double h)
+{
+ pdf_rect r;
+
+ r.llx = x;
+ r.lly = y;
+ r.urx = x + w;
+ r.ury = y + h;
+
+ return pdf_dev__rectshape(NULL, &r, NULL, 'f');
+}
+
+int
+pdf_dev_rectclip (double x, double y,
+ double w, double h)
+{
+ pdf_rect r;
+
+ r.llx = x;
+ r.lly = y;
+ r.urx = x + w;
+ r.ury = y + h;
+
+ return pdf_dev__rectshape(NULL, &r, NULL, 'W');
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdraw.h b/Build/source/texk/xdvipdfmx/src/pdfdraw.h
new file mode 100644
index 00000000000..299f66b50b0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfdraw.h
@@ -0,0 +1,160 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfdraw.h,v 1.10 2005/08/31 08:22:42 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDF_DRAW_H_
+#define _PDF_DRAW_H_
+
+#include "pdfcolor.h"
+#include "pdfdev.h"
+
+#define PDF_DASH_SIZE_MAX 16
+#define PDF_GSAVE_MAX 256
+
+extern void pdf_dev_init_gstates (void);
+extern void pdf_dev_clean_gstates (void);
+
+#define pdf_copymatrix(m,n) do {\
+ (m)->a = (n)->a; (m)->b = (n)->b;\
+ (m)->c = (n)->c; (m)->d = (n)->d;\
+ (m)->e = (n)->e; (m)->f = (n)->f;\
+} while (0)
+
+#define pdf_setmatrix(m,p,q,r,s,t,u) do {\
+ (m)->a = (p); (m)->b = (q);\
+ (m)->c = (r); (m)->d = (s);\
+ (m)->e = (t); (m)->f = (u);\
+} while (0)
+
+/* m -> n x m */
+#define pdf_concatmatrix(m,n) do {\
+ double _tmp_a, _tmp_b, _tmp_c, _tmp_d; \
+ _tmp_a = (m)->a; _tmp_b = (m)->b; \
+ _tmp_c = (m)->c; _tmp_d = (m)->d; \
+ (m)->a = ((n)->a) * _tmp_a + ((n)->b) * _tmp_c; \
+ (m)->b = ((n)->a) * _tmp_b + ((n)->b) * _tmp_d; \
+ (m)->c = ((n)->c) * _tmp_a + ((n)->d) * _tmp_c; \
+ (m)->d = ((n)->c) * _tmp_b + ((n)->d) * _tmp_d; \
+ (m)->e += ((n)->e) * _tmp_a + ((n)->f) * _tmp_c; \
+ (m)->f += ((n)->e) * _tmp_b + ((n)->f) * _tmp_d; \
+} while (0)
+
+typedef struct pdf_path_ pdf_path;
+
+extern int pdf_dev_currentmatrix (pdf_tmatrix *M);
+extern int pdf_dev_currentpoint (pdf_coord *cp);
+
+extern int pdf_dev_setlinewidth (double width);
+extern int pdf_dev_setmiterlimit (double mlimit);
+extern int pdf_dev_setlinecap (int style);
+extern int pdf_dev_setlinejoin (int style);
+extern int pdf_dev_setdash (int count,
+ double *pattern,
+ double offset);
+extern int pdf_dev_setflat (int flatness);
+
+/* Path Construction */
+extern int pdf_dev_moveto (double x , double y);
+extern int pdf_dev_rmoveto (double x , double y);
+extern int pdf_dev_closepath (void);
+
+extern int pdf_dev_lineto (double x0 , double y0);
+extern int pdf_dev_rlineto (double x0 , double y0);
+extern int pdf_dev_curveto (double x0 , double y0,
+ double x1 , double y1,
+ double x2 , double y2);
+extern int pdf_dev_rcurveto (double x0 , double y0,
+ double x1 , double y1,
+ double x2 , double y2);
+extern int pdf_dev_arc (double c_x, double c_y, double r,
+ double a_0, double a_1);
+extern int pdf_dev_arcn (double c_x, double c_y, double r,
+ double a_0, double a_1);
+
+#define PDF_FILL_RULE_NONZERO 0
+#define PDF_FILL_RULE_EVENODD 1
+
+extern int pdf_dev_newpath (void);
+
+/* Path Painting */
+extern int pdf_dev_clip (void);
+extern int pdf_dev_eoclip (void);
+
+
+extern int pdf_dev_rectstroke (double x, double y,
+ double w, double h,
+ const pdf_tmatrix *M /* optional */
+ );
+extern int pdf_dev_rectfill (double x, double y, double w, double h);
+extern int pdf_dev_rectclip (double x, double y, double w, double h);
+
+extern int pdf_dev_flushpath (char p_op, int fill_rule);
+
+#define pdf_dev_fill() pdf_dev_flushpath('f', PDF_FILL_RULE_NONZERO)
+#define pdf_dev_eofill() pdf_dev_flushpath('f', PDF_FILL_RULE_EVENODD)
+#define pdf_dev_stroke() pdf_dev_flushpath('S', PDF_FILL_RULE_NONZERO)
+#define pdf_dev_fillstroke() pdf_dev_flushpath('B', PDF_FILL_RULE_NONZERO)
+
+extern int pdf_dev_concat (const pdf_tmatrix *M);
+/* NULL pointer of M mean apply current transformation */
+extern void pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M);
+extern void pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M);
+extern void pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M);
+extern void pdf_dev_itransform (pdf_coord *p, const pdf_tmatrix *M);
+
+extern int pdf_dev_gsave (void);
+extern int pdf_dev_grestore (void);
+
+/* Requires from mpost.c because new MetaPost graphics must initialize
+ * the current gstate. */
+extern int pdf_dev_push_gstate (void);
+extern int pdf_dev_pop_gstate (void);
+
+
+/* extension */
+extern int pdf_dev_arcx (double c_x, double c_y,
+ double r_x, double r_y,
+ double a_0, double a_1,
+ int a_d, /* arc direction */
+ double xar /* x-axis-rotation */
+ );
+extern int pdf_dev_bspline (double x0, double y0,
+ double x1, double y1,
+ double x2, double y2);
+
+
+extern void pdf_invertmatrix (pdf_tmatrix *M);
+
+/* The depth here is the depth of q/Q nesting.
+ * We must remember current depth of nesting when starting a page or xform,
+ * and must recover until that depth at the end of page/xform.
+ */
+extern int pdf_dev_current_depth (void);
+extern void pdf_dev_grestore_to (int depth);
+#define pdf_dev_grestoreall() pdf_dev_grestore_to(0);
+
+extern void pdf_dev_reset_color (void);
+extern int pdf_dev_currentcolor (pdf_color *color, int is_fill);
+extern int pdf_dev_setcolor (const pdf_color *color, int is_fill);
+
+#endif /* _PDF_DRAW_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfencoding.c b/Build/source/texk/xdvipdfmx/src/pdfencoding.c
new file mode 100644
index 00000000000..bbf8e03a280
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfencoding.c
@@ -0,0 +1,1178 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfencoding.c,v 1.5 2005/07/21 08:23:46 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfparse.h"
+#include "pdfobj.h"
+
+#include "dpxfile.h"
+
+#include "pdfencoding.h"
+
+#define _ENCODINGS_C_
+#include "asl_charset.h"
+#undef _ENCODINGS_C_
+
+static int is_ASL_charset (char **encoding);
+static pdf_obj *make_encoding_differences (char **encoding, char **baseenc);
+
+static unsigned char verbose = 0;
+
+static const char *MacRomanEncoding[256];
+static const char *MacExpertEncoding[256];
+static const char *WinAnsiEncoding[256];
+static const char *StandardEncoding[256];
+static const char *ISOLatin1Encoding[256];
+
+void
+pdf_encoding_set_verbose (void)
+{
+ verbose++;
+}
+
+/*
+ * ident: File name, e.g., 8a.enc.
+ * name: Name of encoding, StandardEncoding, TeXBase1Encoding, ...
+ * glyphs: List of encoded glyphs (name).
+ * flags:
+ * IS_PREDEFINED:
+ * Encoding is one of the MacRomanEncoding, MacExpertEncoding, and
+ * WinAnsiEncoding.
+ * IS_ASL_CHARSET:
+ * Encoded glyphs are only form Adobe Standard Latin Character Set.
+ * Fonts only uses encodings of this flag set can be "nonsymbolic".
+ */
+#define FLAG_IS_PREDEFINED (1 << 0)
+#define FLAG_IS_ASL_CHARSET (1 << 1)
+
+typedef struct pdf_encoding
+{
+ char *ident;
+
+ char *enc_name;
+ int flags;
+ char *glyphs[256];
+ char is_used[256];
+
+ pdf_obj *tounicode;
+ char accessible[256]; /* Flag indicating if glyphs
+ * are accessible in Unicode.
+ */
+
+ pdf_obj *resource;
+ pdf_obj *reference;
+} pdf_encoding;
+
+static void
+pdf_init_encoding_struct (pdf_encoding *encoding)
+{
+ ASSERT(encoding);
+
+ encoding->ident = NULL;
+
+ encoding->enc_name = NULL;
+
+ memset(encoding->glyphs, 0, 256*sizeof(char *));
+ memset(encoding->is_used, 0, 256);
+
+ memset(encoding->accessible, 0, 256);
+ encoding->tounicode = NULL;
+
+ encoding->resource = NULL;
+ encoding->reference = NULL;
+
+ encoding->flags = 0;
+
+ return;
+}
+
+static void
+pdf_flush_encoding (pdf_encoding *encoding)
+{
+ ASSERT(encoding);
+
+ if (encoding->resource)
+ pdf_release_obj(encoding->resource);
+ if (encoding->reference)
+ pdf_release_obj(encoding->reference);
+ if (encoding->tounicode) {
+ pdf_obj *tounicode;
+
+ tounicode = pdf_create_ToUnicode_CMap(encoding->enc_name,
+ encoding->glyphs,
+ encoding->is_used);
+ if (tounicode) {
+ pdf_add_stream(encoding->tounicode,
+ pdf_stream_dataptr(tounicode),
+ pdf_stream_length(tounicode));
+ pdf_release_obj(tounicode);
+ }
+ pdf_release_obj(encoding->tounicode);
+ encoding->tounicode = NULL;
+ }
+
+ encoding->resource = NULL;
+ encoding->reference = NULL;
+
+ return;
+}
+
+static void
+pdf_clean_encoding_struct (pdf_encoding *encoding)
+{
+ int code;
+
+ ASSERT(encoding);
+
+ if (encoding->reference)
+ ERROR("Object not flushed.");
+ if (encoding->resource)
+ ERROR("Object not flushed.");
+
+ if (encoding->tounicode)
+ pdf_release_obj(encoding->tounicode);
+ if (encoding->ident)
+ RELEASE(encoding->ident);
+ if (encoding->enc_name)
+ RELEASE(encoding->enc_name);
+
+ encoding->ident = NULL;
+ encoding->enc_name = NULL;
+
+ for (code = 0; code < 256; code++) {
+ if (encoding->glyphs[code])
+ RELEASE(encoding->glyphs[code]);
+ encoding->glyphs[code] = NULL;
+ }
+ encoding->ident = NULL;
+ encoding->enc_name = NULL;
+
+ return;
+}
+
+/*
+ * The original dvipdfm describes as:
+ *
+ * Some software doesn't like BaseEncoding key (e.g., FastLane)
+ * so this code is commented out for the moment. It may reemerge in the
+ * future
+ *
+ * and the line for BaseEncoding is commented out.
+ *
+ * I'm not sure why this happens. But maybe BaseEncoding key causes problems
+ * when the font is Symbol font or TrueType font.
+ */
+
+static void
+pdf_encoding_set_encoding (pdf_encoding *encoding,
+ char **encoding_vec, const char *baseenc_name)
+{
+ char **baseenc_vec = NULL;
+ pdf_obj *differences;
+ int code;
+
+ ASSERT(encoding);
+ ASSERT(encoding_vec);
+
+ if (encoding->reference) {
+ WARN("Object already have a label... flushing");
+ pdf_flush_encoding(encoding);
+ }
+
+ encoding->flags = 0;
+ if (!encoding->resource) {
+ encoding->resource = pdf_new_dict();
+ pdf_add_dict(encoding->resource,
+ pdf_new_name("Type"), pdf_new_name("Encoding"));
+ }
+
+ for (code = 0; code < 256; code++) {
+ if (encoding->glyphs[code])
+ RELEASE(encoding->glyphs[code]);
+ if (!encoding_vec[code] ||
+ !strcmp(encoding_vec[code], ".notdef"))
+ encoding->glyphs[code] = NULL;
+ else {
+ encoding->glyphs[code] = NEW(strlen(encoding_vec[code])+1, char);
+ strcpy(encoding->glyphs[code], encoding_vec[code]);
+ }
+ }
+
+ if (baseenc_name) {
+ if (!strcmp(baseenc_name, "WinAnsiEncoding"))
+ baseenc_vec = (char **) WinAnsiEncoding;
+ else if (!strcmp(baseenc_name, "MacRomanEncoding"))
+ baseenc_vec = (char **) MacRomanEncoding;
+ else if (!strcmp(baseenc_name, "MacExpertEncoding"))
+ baseenc_vec = (char **) MacExpertEncoding;
+ else
+ ERROR("Unknown encoding \"%s\".", baseenc_name);
+ } else {
+ baseenc_vec = NULL;
+ }
+
+ if (is_ASL_charset(encoding->glyphs)) {
+ encoding->flags |= FLAG_IS_ASL_CHARSET;
+ /* Dvipdfmx default setting. */
+ if (!baseenc_name) {
+ baseenc_vec = (char **) WinAnsiEncoding;
+ baseenc_name = (char *) "WinAnsiEncoding";
+ }
+ }
+
+ if (baseenc_name) {
+ pdf_add_dict(encoding->resource,
+ pdf_new_name("BaseEncoding"), pdf_new_name(baseenc_name));
+ }
+ differences = make_encoding_differences(encoding->glyphs, baseenc_vec);
+ if (differences) {
+ pdf_add_dict(encoding->resource, pdf_new_name("Differences"), differences);
+ }
+
+ return;
+}
+
+static int CDECL
+glycmp (const void *pv1, const void *pv2)
+{
+ char *v1, *v2;
+
+ v1 = (char *) pv1;
+ v2 = *((char **) pv2);
+
+ return strcmp(v1, v2);
+}
+
+static int
+is_ASL_charset (char **enc_vec)
+{
+ int code;
+
+ for (code = 0; code < 256; code++) {
+ if (enc_vec[code] && strcmp(enc_vec[code], ".notdef")) {
+ if (!bsearch(enc_vec[code],
+ ASL_Charset, ASL_CHARSET_MAX, sizeof(char *), glycmp))
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static pdf_obj *
+make_encoding_differences (char **enc_vec, char **baseenc)
+{
+ pdf_obj *differences = NULL;
+ int code, count = 0;
+ int skipping = 1;
+
+ ASSERT(enc_vec);
+
+ /*
+ * Write all entries (except .notdef) if baseenc is unknown.
+ */
+ differences = pdf_new_array();
+ for (code = 0; code < 256; code++) {
+ /* We skip ".notdef". Any character code mapped to ".notdef"
+ * glyph should not be used in the document.
+ */
+ if (!enc_vec[code] || !strcmp(".notdef", enc_vec[code]))
+ skipping = 1;
+ else if (!baseenc || !baseenc[code] ||
+ strcmp(baseenc[code], enc_vec[code]) != 0) {
+ /*
+ * Difference found.
+ */
+ if (skipping)
+ pdf_add_array(differences, pdf_new_number(code));
+ pdf_add_array(differences, pdf_new_name(enc_vec[code]));
+ skipping = 0;
+ count++;
+ } else
+ skipping = 1;
+ }
+
+ /*
+ * No difference found. Some PDF viewers can't handle differences without
+ * any differences. We return NULL.
+ */
+ if (count == 0) {
+ pdf_release_obj(differences);
+ differences = NULL;
+ }
+
+ return differences;
+}
+
+static int
+load_encoding_file (pdf_encoding *encoding, const char *filename)
+{
+ FILE *fp;
+ pdf_obj *encoding_array = NULL;
+ char *wbuf, *p, *endptr;
+ char *enc_vec[256];
+ int code, fsize;
+
+ if (!encoding || !filename)
+ return -1;
+
+ fp = DPXFOPEN(filename, DPX_RES_TYPE_ENC);
+ if (!fp)
+ return -1;
+ /*
+ * file_size do seek_end witout saving current position and
+ * do rewind.
+ */
+ fsize = file_size(fp);
+
+ wbuf = NEW(fsize + 1, char);
+ fread(wbuf, sizeof(char), fsize, fp);
+ DPXFCLOSE(fp);
+
+ p = wbuf;
+ endptr = wbuf + fsize;
+ p[fsize] = '\0';
+
+ skip_white(&p, endptr);
+
+ /*
+ * Skip comment lines.
+ */
+ while (p < endptr && p[0] == '%') {
+ skip_line (&p, endptr);
+ skip_white(&p, endptr);
+ }
+ if (p[0] == '/') {
+ pdf_obj *tmp;
+
+ tmp = parse_pdf_name(&p, endptr);
+
+ encoding->enc_name = NEW(strlen(pdf_name_value(tmp))+1, char);
+ strcpy(encoding->enc_name, pdf_name_value(tmp));
+ pdf_release_obj(tmp);
+ }
+
+ skip_white(&p, endptr);
+ encoding_array = parse_pdf_array(&p, endptr);
+ RELEASE(wbuf);
+ if (!encoding_array) {
+ return -1;
+ }
+
+ for (code = 0; code < 256; code++) {
+ enc_vec[code] = pdf_name_value(pdf_get_array(encoding_array, code));
+ }
+ pdf_encoding_set_encoding(encoding, enc_vec, NULL);
+ pdf_release_obj(encoding_array);
+
+ return 0;
+}
+
+#define CHECK_ID(n) do { \
+ if ((n) < 0 || (n) >= enc_cache.count) { \
+ ERROR("Invalid encoding id: %d", (n)); \
+ } \
+} while (0)
+
+#define CACHE_ALLOC_SIZE 16u
+
+struct {
+ int count;
+ int capacity;
+ pdf_encoding *encodings;
+} enc_cache = {
+ 0, 0, NULL
+};
+
+void
+pdf_init_encodings (void)
+{
+ pdf_encoding *encoding;
+ int code;
+
+ enc_cache.count = 0;
+ enc_cache.capacity = 3;
+ enc_cache.encodings = NEW(enc_cache.capacity, pdf_encoding);
+
+ /*
+ * PDF Predefined Encodings
+ */
+ encoding = &enc_cache.encodings[0];
+ pdf_init_encoding_struct(encoding);
+ encoding->ident = NEW(strlen("WinAnsiEncoding")+1, char);
+ strcpy(encoding->ident, "WinAnsiEncoding");
+ encoding->enc_name = NEW(strlen("WinAnsiEncoding")+1, char);
+ strcpy(encoding->enc_name, "WinAnsiEncoding");
+ encoding->flags = (FLAG_IS_PREDEFINED|FLAG_IS_ASL_CHARSET);
+ encoding->resource = pdf_new_name("WinAnsiEncoding");
+ for (code = 0; code < 256; code++) {
+ if (!WinAnsiEncoding[code] ||
+ !strcmp(WinAnsiEncoding[code], ".notdef"))
+ encoding->glyphs[code] = NULL;
+ else {
+ encoding->glyphs[code] = NEW(strlen(WinAnsiEncoding[code])+1, char);
+ strcpy(encoding->glyphs[code], WinAnsiEncoding[code]);
+ }
+ }
+
+ encoding = &enc_cache.encodings[1];
+ pdf_init_encoding_struct(encoding);
+ encoding->ident = NEW(strlen("MacRomanEncoding")+1, char);
+ strcpy(encoding->ident, "MacRomanEncoding");
+ encoding->enc_name = NEW(strlen("MacRomanEncoding")+1, char);
+ strcpy(encoding->enc_name, "MacRomanEncoding");
+ encoding->flags = (FLAG_IS_PREDEFINED|FLAG_IS_ASL_CHARSET);
+ encoding->resource = pdf_new_name("MacRomanEncoding");
+ for (code = 0; code < 256; code++) {
+ if (!MacRomanEncoding[code] ||
+ !strcmp(MacRomanEncoding[code], ".notdef"))
+ encoding->glyphs[code] = NULL;
+ else {
+ encoding->glyphs[code] = NEW(strlen(MacRomanEncoding[code])+1, char);
+ strcpy(encoding->glyphs[code], MacRomanEncoding[code]);
+ }
+ }
+
+ encoding = &enc_cache.encodings[2];
+ pdf_init_encoding_struct(encoding);
+ encoding->ident = NEW(strlen("MacExpertEncoding")+1, char);
+ strcpy(encoding->ident, "MacExpertEncoding");
+ encoding->enc_name = NEW(strlen("MacExpertEncoding")+1, char);
+ strcpy(encoding->enc_name, "MacExpertEncoding");
+ encoding->flags = FLAG_IS_PREDEFINED;
+ encoding->resource = pdf_new_name("MacExpertEncoding");
+ for (code = 0; code < 256; code++) {
+ if (!MacExpertEncoding[code] ||
+ !strcmp(MacExpertEncoding[code], ".notdef"))
+ encoding->glyphs[code] = NULL;
+ else {
+ encoding->glyphs[code] = NEW(strlen(MacExpertEncoding[code])+1, char);
+ strcpy(encoding->glyphs[code], MacExpertEncoding[code]);
+ }
+ }
+
+ enc_cache.count = 3;
+
+ return;
+}
+
+void
+pdf_close_encodings (void)
+{
+ int enc_id;
+
+ if (enc_cache.encodings) {
+ for (enc_id = 0; enc_id < enc_cache.count; enc_id++) {
+ pdf_encoding *encoding;
+
+ encoding = &enc_cache.encodings[enc_id];
+ if (encoding) {
+ pdf_flush_encoding(encoding);
+ pdf_clean_encoding_struct(encoding);
+ }
+ }
+ RELEASE(enc_cache.encodings);
+ }
+ enc_cache.encodings = NULL;
+ enc_cache.count = 0;
+ enc_cache.capacity = 0;
+}
+
+int
+pdf_encoding_findresource (const char *enc_name)
+{
+ int enc_id;
+ pdf_encoding *encoding;
+
+ ASSERT(enc_name);
+ for (enc_id = 0; enc_id < enc_cache.count; enc_id++) {
+ encoding = &enc_cache.encodings[enc_id];
+ if (encoding->ident &&
+ !strcmp(enc_name, encoding->ident))
+ return enc_id;
+ else if (encoding->enc_name &&
+ !strcmp(enc_name, encoding->enc_name))
+ return enc_id;
+ }
+
+ if (verbose) {
+ MESG("(Encoding:%s", enc_name);
+ }
+
+ enc_id = enc_cache.count;
+ if (enc_cache.count >= enc_cache.capacity) {
+ enc_cache.capacity += 16;
+ enc_cache.encodings = RENEW(enc_cache.encodings,
+ enc_cache.capacity, pdf_encoding);
+ }
+ encoding = &enc_cache.encodings[enc_id];
+
+ pdf_init_encoding_struct(encoding);
+ encoding->ident = NEW(strlen(enc_name)+1, char);
+ strcpy(encoding->ident, enc_name);
+ if (load_encoding_file(encoding, enc_name) < 0) {
+ pdf_clean_encoding_struct(encoding);
+ return -1;
+ }
+
+ if (verbose > 1) {
+ if (encoding->enc_name) {
+ MESG("[%s]", encoding->enc_name);
+ }
+ }
+
+ if (verbose) MESG(")");
+
+ enc_cache.count++;
+
+ return enc_id;
+}
+
+
+/*
+ * Pointer will change if other encoding is loaded...
+ */
+
+char **
+pdf_encoding_get_encoding (int enc_id)
+{
+ pdf_encoding *encoding;
+
+ CHECK_ID(enc_id);
+
+ encoding = &enc_cache.encodings[enc_id];
+
+ return encoding->glyphs;
+}
+
+pdf_obj *
+pdf_get_encoding_reference (int enc_id)
+{
+ pdf_encoding *encoding;
+
+ CHECK_ID(enc_id);
+
+ encoding = &enc_cache.encodings[enc_id];
+
+ if (!encoding->reference)
+ encoding->reference = pdf_ref_obj(encoding->resource);
+
+ return pdf_link_obj(encoding->reference);
+}
+
+int
+pdf_encoding_is_predefined (int enc_id)
+{
+ pdf_encoding *encoding;
+
+ CHECK_ID(enc_id);
+
+ encoding = &enc_cache.encodings[enc_id];
+
+ return (encoding->flags & FLAG_IS_PREDEFINED) ? 1 : 0;
+}
+
+int
+pdf_encoding_is_ASL_charset (int enc_id)
+{
+ pdf_encoding *encoding;
+
+ CHECK_ID(enc_id);
+
+ encoding = &enc_cache.encodings[enc_id];
+
+ return (encoding->flags & FLAG_IS_ASL_CHARSET) ? 1 : 0;
+}
+
+char *
+pdf_encoding_get_name (int enc_id)
+{
+ pdf_encoding *encoding;
+
+ CHECK_ID(enc_id);
+
+ encoding = &enc_cache.encodings[enc_id];
+
+ return encoding->enc_name;
+}
+
+/* CSI_UNICODE */
+#include "cid.h"
+
+#include "cmap.h"
+#include "cmap_read.h"
+#include "cmap_write.h"
+
+#include "agl.h"
+
+#define WBUF_SIZE 1024
+static unsigned char wbuf[WBUF_SIZE];
+static unsigned char range_min[1] = {0x00u};
+static unsigned char range_max[1] = {0xFFu};
+
+#define UNICODE_ACCESSIBLE 1
+#define UNICODE_INACCESSIBLE -1
+#define UNICODE_UNKNOWN 0
+
+static int
+check_unicode_mappable (pdf_encoding *encoding, char *is_used)
+{
+ int code;
+ int glyph_count, total_fail_count;
+
+ glyph_count = total_fail_count = 0;
+ for (code = 0; code <= 0xff; code++) {
+ if (is_used && !is_used[code])
+ continue;
+
+ switch (encoding->accessible[code]) {
+ case UNICODE_ACCESSIBLE:
+ break;
+ case UNICODE_INACCESSIBLE:
+ total_fail_count++;
+ break;
+ default: /* Unknown */
+ if (!encoding->glyphs[code] ||
+ !strcmp(encoding->glyphs[code], ".notdef"))
+ encoding->accessible[code] = UNICODE_INACCESSIBLE;
+ else {
+ long len;
+ int fail_count = 0;
+ unsigned char *p, *endptr;
+
+ p = wbuf;
+ endptr = wbuf + WBUF_SIZE;
+ len = agl_sput_UTF16BE(encoding->glyphs[code],
+ &p, endptr, &fail_count);
+ if (len < 1 || fail_count > 0) {
+ total_fail_count++;
+ encoding->accessible[code] = UNICODE_INACCESSIBLE;
+ } else {
+ encoding->accessible[code] = UNICODE_ACCESSIBLE;
+ }
+ }
+ }
+ glyph_count++;
+ }
+
+ if (glyph_count < 1)
+ return 0;
+
+ return (int) (100.0 * total_fail_count / glyph_count + 0.5);
+}
+
+int
+pdf_attach_ToUnicode_CMap (pdf_obj *fontdict,
+ int encoding_id, char *is_used)
+{
+ pdf_encoding *encoding;
+ int inaccessibles, code;
+
+ ASSERT(fontdict);
+
+ CHECK_ID(encoding_id);
+
+ if (pdf_encoding_is_predefined(encoding_id)) {
+ return 0;
+ }
+
+ encoding = &enc_cache.encodings[encoding_id];
+
+ inaccessibles = check_unicode_mappable(encoding, is_used);
+ if (inaccessibles > 10) { /* 10 % */
+ if (verbose) {
+ WARN("%d%% of glyph in font (encoding: %s) could not converted to Unicode.",
+ inaccessibles, encoding->enc_name);
+ WARN("ToUnicode CMap not attached for this font.");
+ }
+ return -1;
+ }
+
+ for (code = 0; code <= 0xff; code++) {
+ if (is_used && !is_used[code])
+ continue;
+ encoding->is_used[code] = 1;
+ }
+
+ if (!encoding->tounicode) {
+ encoding->tounicode = pdf_new_stream(STREAM_COMPRESS);
+ }
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("ToUnicode"),
+ pdf_ref_obj(encoding->tounicode));
+
+ return 0;
+}
+
+
+
+pdf_obj *
+pdf_create_ToUnicode_CMap (const char *enc_name,
+ char **enc_vec, char *is_used)
+{
+ pdf_obj *stream;
+ CMap *cmap;
+ int code, glyph_count, total_fail_count;
+ char *cmap_name;
+ unsigned char *p, *endptr;
+
+ ASSERT(enc_name && enc_vec);
+
+ cmap_name = NEW(strlen(enc_name)+strlen("-UTF16")+1, char);
+ sprintf(cmap_name, "%s-UTF16", enc_name);
+
+ cmap = CMap_new();
+ CMap_set_name (cmap, cmap_name);
+ CMap_set_type (cmap, CMAP_TYPE_TO_UNICODE);
+ CMap_set_wmode(cmap, 0);
+
+ CMap_set_CIDSysInfo(cmap, &CSI_UNICODE);
+
+ CMap_add_codespacerange(cmap, range_min, range_max, 1);
+
+ glyph_count = total_fail_count = 0;
+ for (code = 0; code <= 0xff; code++) {
+ if (is_used && !is_used[code])
+ continue;
+
+ if (enc_vec[code] && strcmp(enc_vec[code], ".notdef")) {
+ long len;
+ int fail_count = 0;
+
+ wbuf[0] = (code & 0xff);
+ p = wbuf + 1;
+ endptr = wbuf + WBUF_SIZE;
+ len = agl_sput_UTF16BE(enc_vec[code], &p, endptr, &fail_count);
+ if (len < 1 || fail_count > 0) {
+ total_fail_count++;
+ } else {
+ CMap_add_bfchar(cmap, wbuf, 1, wbuf + 1, len);
+ }
+ glyph_count++;
+ }
+ }
+
+ if (total_fail_count < (glyph_count + 9) / 10) {
+ stream = CMap_create_stream(cmap, 0);
+ } else {
+ if (verbose) {
+ WARN("%d (out of %d) glyphs in encoding \"%s\" missing Unicode mapping...",
+ total_fail_count, glyph_count, enc_name);
+ WARN("ToUnicode CMap \"%s\" removed.", cmap_name);
+ }
+ stream = NULL;
+ }
+ CMap_release(cmap);
+ RELEASE(cmap_name);
+
+ return stream;
+}
+
+
+pdf_obj *
+pdf_load_ToUnicode_stream (const char *ident)
+{
+ pdf_obj *stream = NULL;
+ CMap *cmap;
+ FILE *fp;
+
+ if (!ident)
+ return NULL;
+
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_CMAP);
+ if (!fp)
+ return NULL;
+ else if (CMap_parse_check_sig(fp) < 0) {
+ DPXFCLOSE(fp);
+ return NULL;
+ }
+
+ cmap = CMap_new();
+ if (CMap_parse(cmap, fp) < 0) {
+ WARN("Reading CMap file \"%s\" failed.", ident);
+ } else {
+ if (verbose) {
+ MESG("(CMap:%s)", ident);
+ }
+ stream = CMap_create_stream(cmap, 0);
+ if (!stream) {
+ WARN("Failed to creat ToUnicode CMap stream for \"%s\".", ident);
+ }
+ }
+ CMap_release(cmap);
+ DPXFCLOSE(fp);
+
+ return stream;
+}
+
+
+static const char *
+MacRomanEncoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G", "H",
+ "I", "J", "K", "L",
+ "M", "N", "O", "P",
+ "Q", "R", "S", "T",
+ "U", "V", "W", "X",
+ "Y", "Z", "bracketleft", "backslash",
+ "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ "Adieresis", "Aring", "Ccedilla", "Eacute",
+ "Ntilde", "Odieresis", "Udieresis", "aacute",
+ "agrave", "acircumflex", "adieresis", "atilde",
+ "aring", "ccedilla", "eacute", "egrave",
+ "ecircumflex", "edieresis", "iacute", "igrave",
+ "icircumflex", "idieresis", "ntilde", "oacute",
+ "ograve", "ocircumflex", "odieresis", "otilde",
+ "uacute", "ugrave", "ucircumflex", "udieresis",
+ "dagger", "degree", "cent", "sterling",
+ "section", "bullet", "paragraph", "germandbls",
+ "registered", "copyright", "trademark", "acute",
+ "dieresis", "notequal", "AE", "Oslash",
+ "infinity", "plusminus", "lessequal", "greaterequal",
+ "yen", "mu", "partialdiff", "summation",
+ "product", "pi", "integral", "ordfeminine",
+ "ordmasculine", "Omega", "ae", "oslash",
+ "questiondown", "exclamdown", "logicalnot", "radical",
+ "florin", "approxequal", "Delta", "guillemotleft",
+ "guillemotright", "ellipsis", "space", "Agrave",
+ "Atilde", "Otilde", "OE", "oe",
+ "endash", "emdash", "quotedblleft", "quotedblright",
+ "quoteleft", "quoteright", "divide", "lozenge",
+ "ydieresis", "Ydieresis", "fraction", "currency",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase",
+ "perthousand", "Acircumflex", "Ecircumflex", "Aacute",
+ "Edieresis", "Egrave", "Iacute", "Icircumflex",
+ "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+ "apple", "Ograve", "Uacute", "Ucircumflex",
+ "Ugrave", "dotlessi", "circumflex", "tilde",
+ "macron", "breve", "dotaccent", "ring",
+ "cedilla", "hungarumlaut", "ogonek", "caron"
+};
+
+static const char *
+MacExpertEncoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle",
+ "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
+ "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader",
+ "comma", "hyphen", "period", "fraction",
+ "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle",
+ "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle",
+ "eightoldstyle", "nineoldstyle", "colon", "semicolon",
+ ".notdef", "threequartersemdash", ".notdef", "questionsmall",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Ethsmall", ".notdef", ".notdef", "onequarter",
+ "onehalf", "threequarters", "oneeighth", "threeeighths",
+ "fiveeighths", "seveneighths", "onethird", "twothirds",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", "ff", "fi",
+ "fl", "ffi", "ffl", "parenleftinferior",
+ ".notdef", "parenrightinferior", "Circumflexsmall", "hypheninferior",
+ "Gravesmall", "Asmall", "Bsmall", "Csmall",
+ "Dsmall", "Esmall", "Fsmall", "Gsmall",
+ "Hsmall", "Ismall", "Jsmall", "Ksmall",
+ "Lsmall", "Msmall", "Nsmall", "Osmall",
+ "Psmall", "Qsmall", "Rsmall", "Ssmall",
+ "Tsmall", "Usmall", "Vsmall", "Wsmall",
+ "Xsmall", "Ysmall", "Zsmall", "colonmonetary",
+ "onefitted", "rupiah", "Tildesmall", ".notdef",
+ ".notdef", "asuperior", "centsuperior", ".notdef",
+ ".notdef", ".notdef", ".notdef", "Aacutesmall",
+ "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall",
+ "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall",
+ "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall",
+ "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall",
+ "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall",
+ "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall",
+ ".notdef", "eightsuperior", "fourinferior", "threeinferior",
+ "sixinferior", "eightinferior", "seveninferior", "Scaronsmall",
+ ".notdef", "centinferior", "twoinferior", ".notdef",
+ "Dieresissmall", ".notdef", "Caronsmall", "osuperior",
+ "fiveinferior", ".notdef", "commainferior", "periodinferior",
+ "Yacutesmall", ".notdef", "dollarinferior", ".notdef",
+ ".notdef", "Thornsmall", ".notdef", "nineinferior",
+ "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall",
+ "questiondownsmall", "oneinferior", "Lslashsmall", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "Cedillasmall", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", "OEsmall",
+ "figuredash", "hyphensuperior", ".notdef", ".notdef",
+ ".notdef", ".notdef", "exclamdownsmall", ".notdef",
+ "Ydieresissmall", ".notdef", "onesuperior", "twosuperior",
+ "threesuperior", "foursuperior", "fivesuperior", "sixsuperior",
+ "sevensuperior", "ninesuperior", "zerosuperior", ".notdef",
+ "esuperior", "rsuperior", "tsuperior", ".notdef",
+ ".notdef", "isuperior", "ssuperior", "dsuperior",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "lsuperior", "Ogoneksmall", "Brevesmall",
+ "Macronsmall", "bsuperior", "nsuperior", "msuperior",
+ "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+};
+
+static const char *
+WinAnsiEncoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "bullet",
+ "Euro", "bullet", "quotesinglbase", "florin",
+ "quotedblbase", "ellipsis", "dagger", "daggerdbl",
+ "circumflex", "perthousand", "Scaron", "guilsinglleft",
+ "OE", "bullet", "Zcaron", "bullet",
+ "bullet", "quoteleft", "quoteright", "quotedblleft",
+ "quotedblright", "bullet", "endash", "emdash",
+ "tilde", "trademark", "scaron", "guilsinglright",
+ "oe", "bullet", "zcaron", "Ydieresis",
+ "space", "exclamdown", "cent", "sterling",
+ "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft",
+ "logicalnot", "hyphen", "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior",
+ "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright",
+ "onequarter", "onehalf", "threequarters", "questiondown",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "Iacute", "Icircumflex", "Idieresis",
+ "Eth", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", "multiply",
+ "Oslash", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", "germandbls",
+ "agrave", "aacute", "acircumflex", "atilde",
+ "adieresis", "aring", "ae", "ccedilla",
+ "egrave", "eacute", "ecircumflex", "edieresis",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", "divide",
+ "oslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+};
+
+static const char *
+StandardEncoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling",
+ "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", ".notdef", "questiondown",
+ ".notdef", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "emdash", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "AE", ".notdef", "ordfeminine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "Lslash", "Oslash", "OE", "ordmasculine",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef",
+ ".notdef", "dotlessi", ".notdef", ".notdef",
+ "lslash", "oslash", "oe", "germandbls",
+ ".notdef", ".notdef", ".notdef", ".notdef"
+};
+
+static const char *
+ISOLatin1Encoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ "dotlessi", "quoteleft", "quoteright", "circumflex",
+ "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla",
+ ".notdef", "hungarumlaut", "ogonek", "caron",
+ "space", "exclamdown", "cent", "sterling",
+ "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft",
+ "logicalnot", "hyphen", "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior",
+ "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright",
+ "onequarter", "onehalf", "threequarters", "questiondown",
+ "Agrave", "Aacute", "Acircumflex", "Atilde",
+ "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis",
+ "Igrave", "Iacute", "Icircumflex", "Idieresis",
+ "Eth", "Ntilde", "Ograve", "Oacute",
+ "Ocircumflex", "Otilde", "Odieresis", "multiply",
+ "Oslash", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", "germandbls",
+ "agrave", "aacute", "acircumflex", "atilde",
+ "adieresis", "aring", "ae", "ccedilla",
+ "egrave", "eacute", "ecircumflex", "edieresis",
+ "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute",
+ "ocircumflex", "otilde", "odieresis", "divide",
+ "oslash", "ugrave", "uacute", "ucircumflex",
+ "udieresis", "yacute", "thorn", "ydieresis"
+};
diff --git a/Build/source/texk/xdvipdfmx/src/pdfencoding.h b/Build/source/texk/xdvipdfmx/src/pdfencoding.h
new file mode 100644
index 00000000000..05ac38d2e22
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfencoding.h
@@ -0,0 +1,83 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfencoding.h,v 1.3 2005/06/08 11:18:37 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFENCODING_H_
+#define _PDFENCODING_H_
+
+#include "pdfobj.h"
+
+extern void pdf_encoding_set_verbose (void);
+
+extern void pdf_init_encodings (void);
+extern void pdf_close_encodings (void);
+
+/* enc_name here is .enc file name or the name of predefined
+ * encodings.
+ */
+extern int pdf_encoding_findresource (const char *enc_name);
+
+/* Returns indirect reference to Encoding resource.
+ */
+extern pdf_obj *pdf_get_encoding_reference (int enc_id);
+
+extern int pdf_encoding_is_ASL_charset (int enc_id);
+extern int pdf_encoding_is_predefined (int enc_id);
+
+/* WARNING:
+ * Pointer(s) may change after another encoding is loaded.
+ */
+extern char *pdf_encoding_get_name (int enc_id);
+extern char **pdf_encoding_get_encoding (int enc_id);
+
+/*
+ * The last argument "is_used" is 256 char array, value 0
+ * indicates glyph in that slot is not used in the document
+ * (at least for that font). We need this to handle the
+ * situation that the encoding contains, e.g., 30 rarely
+ * used glyphs without Unicode mapping and 200+ glyphs with
+ * Unicode mapping.
+ * pdf_create_ToUnicode_CMap() returns stream object but not
+ * reference. This need to be renamed to other name like
+ * pdf_create_ToUnicode_stream().
+ */
+extern pdf_obj *pdf_create_ToUnicode_CMap (const char *enc_name,
+ char **enc_vec, char *is_used);
+
+/* Add /ToUnicode entry with indirect reference to ToUnicode stream
+ * to font dictionary "fontdict". This creates an empty stream object
+ * if it has not already created. Generation of actual ToUnicode CMap
+ * data is delayed until pdf_close_encodings(). This also check if
+ * glyphs can be converted to (a sequence of) Unicode and returns -1
+ * if more than 10% of glyphs can't be converted. ToUnicode CMap is
+ * not attached in that case.
+ */
+extern int pdf_attach_ToUnicode_CMap (pdf_obj *fontdict,
+ int encoding_id, char *is_used);
+
+/* Just load CMap identified with 'ident'. (parsed)
+ * PDF stream object (not reference) returned.
+ */
+extern pdf_obj *pdf_load_ToUnicode_stream (const char *ident);
+
+#endif /* _PDFENCODINGS_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfencrypt.c b/Build/source/texk/xdvipdfmx/src/pdfencrypt.c
new file mode 100644
index 00000000000..dc9b8efde20
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfencrypt.c
@@ -0,0 +1,536 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfencrypt.c,v 1.8 2005/07/20 08:49:55 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#ifdef WIN32
+#include <conio.h>
+#define getch _getch
+#else /* !WIN32 */
+#include <unistd.h>
+#endif /* WIN32 */
+
+#include "mem.h"
+#include "error.h"
+#include "pdfobj.h"
+#include "dpxcrypt.h"
+
+#include "pdfencrypt.h"
+
+#define MAX_KEY_LEN 16
+#define MAX_STR_LEN 32
+#define MAX_PWD_LEN 128
+
+static unsigned char algorithm, revision, key_size;
+static unsigned long permission;
+
+static unsigned char key_data[MAX_KEY_LEN], id_string[MAX_KEY_LEN];
+static unsigned char opwd_string[MAX_STR_LEN], upwd_string[MAX_STR_LEN];
+
+static unsigned long current_label = 0;
+static unsigned current_generation = 0;
+
+static ARC4_KEY key;
+static MD5_CONTEXT md5_ctx;
+
+static unsigned char md5_buf[MAX_KEY_LEN], key_buf[MAX_KEY_LEN];
+static unsigned char in_buf[MAX_STR_LEN], out_buf[MAX_STR_LEN];
+
+static const unsigned char padding_string[MAX_STR_LEN] = {
+ 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
+ 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
+ 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
+ 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
+};
+
+static char owner_passwd[MAX_PWD_LEN], user_passwd[MAX_PWD_LEN];
+
+static unsigned char do_encryption = 0;
+static unsigned char verbose = 0;
+
+void pdf_enc_set_verbose (void)
+{
+ if (verbose < 255) verbose++;
+}
+
+#define PRODUCER "%s-%s, Copyright \251 2002 by Jin-Hwan Cho and Shunsaku Hirata"
+static void compute_id_string (char *dviname, char *pdfname)
+{
+ char *date_string, *producer;
+ time_t current_time;
+ struct tm *bd_time;
+
+ MD5_init(&md5_ctx);
+
+ date_string = NEW (15, char);
+ time(&current_time);
+ bd_time = localtime(&current_time);
+ sprintf (date_string, "%04d%02d%02d%02d%02d%02d",
+ bd_time -> tm_year+1900, bd_time -> tm_mon+1, bd_time -> tm_mday,
+ bd_time -> tm_hour, bd_time -> tm_min, bd_time -> tm_sec);
+ MD5_write(&md5_ctx, (unsigned char *)date_string, strlen(date_string));
+ RELEASE (date_string);
+
+ producer = NEW (strlen(PRODUCER)+strlen(PACKAGE)+strlen(VERSION), char);
+ sprintf(producer, PRODUCER, PACKAGE, VERSION);
+ MD5_write(&md5_ctx, (unsigned char *)producer, strlen(producer));
+ RELEASE (producer);
+
+ MD5_write(&md5_ctx, (unsigned char *)dviname, strlen(dviname));
+ MD5_write(&md5_ctx, (unsigned char *)pdfname, strlen(pdfname));
+ MD5_final(id_string, &md5_ctx);
+}
+
+static void passwd_padding (unsigned char *src, unsigned char *dst)
+{
+ register int len = strlen((char *)src);
+
+ if (len > MAX_STR_LEN)
+ len = MAX_STR_LEN;
+
+ memcpy(dst, src, len);
+ memcpy(dst+len, padding_string, MAX_STR_LEN-len);
+}
+
+static void compute_owner_password (void)
+{
+ register unsigned char i, j;
+ /*
+ * Algorithm 3.3 Computing the encryption dictionary's O (owner password)
+ * value
+ *
+ * 1. Pad or truncate the owner password string as described in step 1
+ * of Algorithm 3.2. If there is no owner password, use the user
+ * password instead. (See implementation note 17 in Appendix H.)
+ */
+ passwd_padding((unsigned char *)(strlen(owner_passwd) > 0 ? owner_passwd : user_passwd), in_buf);
+ /*
+ * 2. Initialize the MD5 hash function and pass the result of step 1
+ * as input to this function.
+ */
+ MD5_init(&md5_ctx);
+ MD5_write(&md5_ctx, in_buf, MAX_STR_LEN);
+ MD5_final(md5_buf, &md5_ctx);
+ /*
+ * 3. (Revision 3 only) Do the following 50 times: Take the output
+ * from the previous MD5 hash and pass it as input into a new
+ * MD5 hash.
+ */
+ if (revision == 3)
+ for (i = 0; i < 50; i++) {
+ MD5_init(&md5_ctx);
+ MD5_write(&md5_ctx, md5_buf, MAX_KEY_LEN);
+ MD5_final(md5_buf, &md5_ctx);
+ }
+ /*
+ * 4. Create an RC4 encryption key using the first n bytes of the output
+ * from the final MD5 hash, where n is always 5 for revision 2 but
+ * for revision 3 depends on the value of the encryption dictionary's
+ * Length entry.
+ */
+ ARC4_set_key(&key, key_size, md5_buf);
+ /*
+ * 5. Pad or truncate the user password string as described in step 1
+ * of Algorithm 3.2.
+ */
+ passwd_padding((unsigned char *)user_passwd, in_buf);
+ /*
+ * 6. Encrypt the result of step 5, using an RC4 encryption function
+ * with the encryption key obtained in step 4.
+ */
+ ARC4(&key, MAX_STR_LEN, in_buf, out_buf);
+ /*
+ * 7. (Revision 3 only) Do the following 19 times: Take the output
+ * from the previous invocation of the RC4 function and pass it
+ * as input to a new invocation of the function; use an encryption
+ * key generated by taking each byte of the encryption key obtained
+ * in step 4 and performing an XOR (exclusive or) operation between
+ * that byte and the single-byte value of the iteration counter
+ * (from 1 to 19).
+ */
+ if (revision == 3)
+ for (i = 1; i <= 19; i++) {
+ memcpy(in_buf, out_buf, MAX_STR_LEN);
+ for (j = 0; j < key_size; j++)
+ key_buf[j] = md5_buf[j] ^ i;
+ ARC4_set_key(&key, key_size, key_buf);
+ ARC4(&key, MAX_STR_LEN, in_buf, out_buf);
+ }
+ /*
+ * 8. Store the output from the final invocation of the RC4 function
+ * as the value of the O entry in the encryption dictionary.
+ */
+ memcpy(opwd_string, out_buf, MAX_STR_LEN);
+}
+
+static void compute_encryption_key (unsigned char *pwd)
+{
+ register unsigned char i;
+ /*
+ * Algorithm 3.2 Computing an encryption key
+ *
+ * 1. Pad or truncate the password string to exactly 32 bytes. If the
+ * password string is more than 32 bytes long, use only its first
+ * 32 bytes; if it is less than 32 bytes long, pad it by appending
+ * the required number of additional bytes from the beginning of
+ * the following padding string:
+ *
+ * < 28 BF 4E 5E 4E 75 8A 41 64 00 4E 56 FF FA 01 08
+ * 2E 2E 00 B6 D0 68 3E 80 2F 0C A9 FE 64 53 69 7A >
+ *
+ * That is, if the password string is n bytes long, append the
+ * first 32 - n bytes of the padding string to the end of the
+ * password string. If the password string is empty (zero-length),
+ * meaning there is no user password, substitute the entire
+ * padding string in its place.
+ */
+ passwd_padding(pwd, in_buf);
+ /*
+ * 2. Initialize the MD5 hash function and pass the result of step 1
+ * as input to this fuction.
+ */
+ MD5_init(&md5_ctx);
+ MD5_write(&md5_ctx, in_buf, MAX_STR_LEN);
+ /*
+ * 3. Pass the value of the encryption dictionary's O entry to the
+ * MD5 hash function. (Algorithm 3.3 shows how the O value is
+ * computed.)
+ */
+ MD5_write(&md5_ctx, opwd_string, MAX_STR_LEN);
+ /*
+ * 4. Treat the value of the P entry as an unsigned 4-byte integer
+ * and pass these bytes to the MD5 hash function, low-order byte
+ * first.
+ */
+ in_buf[0] = (unsigned char)(permission) & 0xFF;
+ in_buf[1] = (unsigned char)(permission >> 8) & 0xFF;
+ in_buf[2] = (unsigned char)(permission >> 16) & 0xFF;
+ in_buf[3] = (unsigned char)(permission >> 24) & 0xFF;
+ MD5_write(&md5_ctx, in_buf, 4);
+ /*
+ * 5. Pass the first element of the file's file identifier array
+ * (the value of the ID entry in the document's trailer dictionary;
+ * see Table 3.12 on page 68) to the MD5 hash function and
+ * finish the hash.
+ */
+ MD5_write(&md5_ctx, id_string, MAX_KEY_LEN);
+ MD5_final(md5_buf, &md5_ctx);
+ /*
+ * 6. (Revision 3 only) Do the following 50 times; Take the output from
+ * the previous MD5 hash and pass it as input into a new MD5 hash.
+ */
+ if (revision == 3)
+ for (i = 0; i < 50; i++) {
+ MD5_init(&md5_ctx);
+ MD5_write(&md5_ctx, md5_buf, MAX_KEY_LEN);
+ MD5_final(md5_buf, &md5_ctx);
+ }
+ /*
+ * 7. Set the encryption key to the first n bytes of the output from
+ * the final MD5 hash, where n is always 5 for revision 2 but for
+ * revision 3 depends on the value of the encryption dictionary's
+ * Length entry.
+ */
+ memcpy(key_data, md5_buf, key_size);
+}
+
+static void compute_user_password (void)
+{
+ register unsigned char i, j;
+ /*
+ * Algorithm 3.4 Computing the encryption dictionary's U (user password)
+ * value (Revision 2)
+ *
+ * 1. Create an encryption key based on the user password string, as
+ * described in Algorithm 3.2.
+ *
+ * 2. Encrypt the 32-byte padding string shown in step 1 of Algorithm
+ * 3.2, using an RC4 encryption fuction with the encryption key from
+ * the preceeding step.
+ *
+ * 3. Store the result of step 2 as the value of the U entry in the
+ * encryption dictionary.
+ */
+ /*
+ * Algorithm 3.5 Computing the encryption dictionary's U (user password)
+ * value (Revision 3)
+ *
+ * 1. Create an encryption key based on the user password string, as
+ * described in Algorithm 3.2.
+ *
+ * 2. Initialize the MD5 hash function and pass the 32-byte padding
+ * string shown in step 1 of Algorithm 3.2 as input to this function.
+ *
+ * 3. Pass the first element of the file's file identifier array (the
+ * value of the ID entry in the document's trailer dictionary; see
+ * Table 3.12 on page 68) to the hash function and finish the hash.
+ *
+ * 4. Encrypt the 16-byte result of the hash, using an RC4 encryption
+ * function with the encryption key from step 1.
+ *
+ * 5. Do the following 19 times: Take the output from the previous
+ * invocation of the RC4 function and pass it as input to a new
+ * invocation of the function; use an encryption key generated by
+ * taking each byte of the original encryption key (obtained in
+ * step 1) and performing an XOR (exclusive or) operation between
+ * that byte and the single-byte value of the iteration counter
+ * (from 1 to 19).
+ *
+ * 6. Append 16 bytes of arbitrary padding to the output from the
+ * final invocation of the RC4 function and store the 32-byte
+ * result as the value of the U entry in the encryption dictionary.
+ */
+ compute_encryption_key((unsigned char *)user_passwd);
+
+ switch (revision) {
+ case 2:
+ ARC4_set_key(&key, key_size, key_data);
+ ARC4(&key, MAX_STR_LEN, padding_string, out_buf);
+ break;
+ case 3:
+ MD5_init(&md5_ctx);
+ MD5_write(&md5_ctx, (unsigned char *)padding_string, MAX_STR_LEN);
+
+ MD5_write(&md5_ctx, id_string, MAX_KEY_LEN);
+ MD5_final(md5_buf, &md5_ctx);
+
+ ARC4_set_key(&key, key_size, key_data);
+ ARC4(&key, MAX_KEY_LEN, md5_buf, out_buf);
+
+ for (i = 1; i <= 19; i++) {
+ memcpy(in_buf, out_buf, MAX_KEY_LEN);
+ for (j = 0; j < key_size; j++)
+ key_buf[j] = key_data[j] ^ i;
+ ARC4_set_key(&key, key_size, key_buf);
+ ARC4(&key, MAX_KEY_LEN, in_buf, out_buf);
+ }
+ break;
+ default:
+ ERROR("Invalid revision number.\n");
+ }
+
+ memcpy(upwd_string, out_buf, MAX_STR_LEN);
+}
+
+#ifdef WIN32
+static char *getpass (const char *prompt)
+{
+ static char pwd_buf[128];
+ size_t i;
+
+ fputs(prompt, stderr);
+ fflush(stderr);
+ for (i = 0; i < sizeof(pwd_buf)-1; i++) {
+ pwd_buf[i] = getch();
+ if (pwd_buf[i] == '\r')
+ break;
+ }
+ pwd_buf[i] = '\0';
+ fputs("\n", stderr);
+ return pwd_buf;
+}
+#endif
+
+void pdf_enc_set_passwd (unsigned bits, unsigned perm, char *dviname, char *pdfname)
+{
+ register char *retry_passwd;
+
+ while (1) {
+ strcpy(owner_passwd, getpass("Owner password: "));
+ retry_passwd = getpass("Re-enter owner password: ");
+ if (!strcmp(owner_passwd, retry_passwd))
+ break;
+ fputs("Password is not identical.\nTry again.\n", stderr);
+ fflush(stderr);
+ }
+
+ while (1) {
+ strcpy(user_passwd, getpass("User password: "));
+ retry_passwd = getpass("Re-enter user password: ");
+ if (!strcmp(user_passwd, retry_passwd))
+ break;
+ fputs("Password is not identical.\nTry again.\n", stderr);
+ fflush(stderr);
+ }
+
+ do_encryption = 1;
+ key_size = (unsigned char)(bits / 8);
+ algorithm = (key_size == 5 ? 1 : 2);
+ permission = (unsigned long)perm | 0x000000C0;
+ revision = ((algorithm == 1 && permission < 0x100) ? 2 : 3);
+ if (revision == 3)
+ permission |= 0xFFFFF000;
+
+ compute_id_string(dviname, pdfname);
+ compute_owner_password();
+ compute_user_password();
+}
+
+void pdf_encrypt_data (unsigned char *data, unsigned long len)
+{
+ unsigned char *result;
+
+ if (!do_encryption) return;
+
+ memcpy(in_buf, key_data, key_size);
+ in_buf[key_size] = (unsigned char)(current_label) & 0xFF;
+ in_buf[key_size+1] = (unsigned char)(current_label >> 8) & 0xFF;
+ in_buf[key_size+2] = (unsigned char)(current_label >> 16) & 0xFF;
+ in_buf[key_size+3] = (unsigned char)(current_generation) & 0xFF;
+ in_buf[key_size+4] = (unsigned char)(current_generation >> 8) & 0xFF;
+
+ MD5_init(&md5_ctx);
+ MD5_write(&md5_ctx, in_buf, key_size+5);
+ MD5_final(md5_buf, &md5_ctx);
+
+ result = NEW (len, unsigned char);
+ ARC4_set_key(&key, (key_size > 10 ? MAX_KEY_LEN : key_size+5), md5_buf);
+ ARC4(&key, len, data, result);
+ memcpy(data, result, len);
+ RELEASE (result);
+}
+
+void create_encrypt (void)
+{
+ pdf_obj *doc_encrypt;
+
+ if (!do_encryption) return;
+
+#ifdef DEBUG
+ fprintf (stderr, "(create_encrypt)");
+#endif
+
+ /* Create an empty Encryption entry and make it
+ be the root object */
+ doc_encrypt = pdf_new_dict ();
+ pdf_set_encrypt (doc_encrypt);
+
+ /* KEY : Filter
+ * TYPE : name
+ * VALUE: (Required) The name of the security handler for this document;
+ * see below. Default value: Standard, for the built-in security
+ * handler.
+ */
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("Filter"),
+ pdf_new_name ("Standard"));
+ /* KEY : V
+ * TYPE : number
+ * VALUE: (Optional but strongly recommended) A code specifying the
+ * algorithm to be used in encrypting and decrypting the document:
+ * 0 An algorithm that is undocumented and no longer supported,
+ * and whose use is strongly discouraged.
+ * 1 Algorithm 3.1 on page 73, with an encryption key length
+ * of 40 bits; see below.
+ * 2 (PDF 1.4) Algorithm 3.1 on page 73, but allowing encryption
+ * key lengths greater than 40 bits.
+ * 3 (PDF 1.4) An unpublished algorithm allowing encryption key
+ * lengths ranging from 40 to 128 bits. (This algorithm is
+ * unpublished as an export requirement of the U.S. Department
+ * of Commerce.)
+ * The default value if this entry is omitted is 0, but a value
+ * of 1 or greater is strongly recommended.
+ */
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("V"),
+ pdf_new_number (algorithm));
+ /* KEY : Length
+ * TYPE : integer
+ * VALUE: (Optional; PDF 1.4; only if V is 2 or 3) The length of the
+ * encryption key, in bits. The value must be a multiple of 8,
+ * in the range 40 to 128. Default value: 40.
+ */
+ if (algorithm > 1)
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("Length"),
+ pdf_new_number (key_size * 8));
+ /* KEY : R
+ * TYPE : number
+ * VALUE: (Required) A number specifying which revision of the standard
+ * security handler should be used to interpret this dictionary.
+ * The revison number should be 2 if the document is encrypted
+ * with a V value less than 2; otherwise this value should be 3.
+ */
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("R"),
+ pdf_new_number (revision));
+ /* KEY : O
+ * TYPE : string
+ * VALUE: (Required) A 32-byte string, based on both the owner and
+ * user passwords, that is used in computing the encryption
+ * key and in determining whether a valid owner password was
+ * entered.
+ */
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("O"),
+ pdf_new_string (opwd_string, 32));
+ /* KEY : U
+ * TYPE : string
+ * VALUE: (Required) A 32-byte string, based on the user password,
+ * that is used in determining whether to prompt the user
+ * for a password and, if so, whether a valid user or owner
+ * password was entered.
+ */
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("U"),
+ pdf_new_string (upwd_string, 32));
+ /* KEY : P
+ * TYPE : integer
+ * VALUE: (Required) A set of flags specifying which operations are
+ * permitted when the document is opened with user access.
+ */
+ pdf_add_dict (doc_encrypt,
+ pdf_new_name ("P"),
+ pdf_new_number (permission));
+
+ do_encryption = 0;
+ pdf_release_obj (doc_encrypt);
+ do_encryption = 1;
+}
+
+unsigned char *pdf_enc_id_string (void)
+{
+ register int i;
+ static unsigned char result[MAX_STR_LEN+1];
+
+ for (i = 0; i < MAX_KEY_LEN; i++)
+ sprintf((char *)(result+2*i), "%02x", id_string[i]);
+
+ return result;
+}
+
+void pdf_enc_set_label (unsigned long label)
+{
+ current_label = label;
+}
+
+void pdf_enc_set_generation (unsigned generation)
+{
+ current_generation = generation;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfencrypt.h b/Build/source/texk/xdvipdfmx/src/pdfencrypt.h
new file mode 100644
index 00000000000..daaa6f52bcc
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfencrypt.h
@@ -0,0 +1,35 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfencrypt.h,v 1.2 2002/10/30 02:27:13 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFENCRYPT_H_
+#define _PDFENCRYPT_H_
+
+extern void pdf_enc_set_verbose (void);
+extern unsigned char *pdf_enc_id_string (void);
+extern void pdf_enc_set_encryption (void);
+extern void pdf_enc_set_label (unsigned long label);
+extern void pdf_enc_set_generation (unsigned generation);
+extern void pdf_enc_set_passwd (unsigned size, unsigned perm, char *dviname, char *pdfname);
+extern void pdf_encrypt_data (unsigned char *data, unsigned long len);
+extern void create_encrypt (void);
+
+#endif /* _PDFENCRYPT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdffont.c b/Build/source/texk/xdvipdfmx/src/pdffont.c
new file mode 100644
index 00000000000..8befc76394e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdffont.c
@@ -0,0 +1,952 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdffont.c,v 1.15 2005/07/20 10:41:54 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <time.h>
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxfile.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+
+#include "pdfencoding.h"
+#include "cmap.h"
+#include "unicode.h"
+
+#include "type1.h"
+#include "type1c.h"
+#include "truetype.h"
+
+#include "pkfont.h"
+
+#include "type0.h"
+#include "tt_cmap.h"
+#include "cidtype0.h"
+#include "otl_conf.h"
+
+#include "pdffont.h"
+
+static int __verbose = 0;
+
+#define MREC_HAS_TOUNICODE(m) ((m) && (m)->opt.tounicode)
+
+void
+pdf_font_set_verbose (void)
+{
+ __verbose++;
+ CMap_set_verbose();
+ Type0Font_set_verbose();
+ CIDFont_set_verbose ();
+ pdf_encoding_set_verbose();
+ UC_set_verbose ();
+ agl_set_verbose();
+ otl_conf_set_verbose();
+ otf_cmap_set_verbose ();
+}
+
+int
+pdf_font_get_verbose (void)
+{
+ return __verbose;
+}
+
+void
+pdf_font_set_dpi (int font_dpi)
+{
+ PKFont_set_dpi(font_dpi);
+}
+
+void
+pdf_font_make_uniqueTag (char *tag)
+{
+ int i;
+ char ch;
+ static char first = 1;
+
+ if (first) {
+ srand(time(NULL));
+ first = 0;
+ }
+
+ for (i = 0; i < 6; i++) {
+ ch = rand() % 26;
+ tag[i] = ch + 'A';
+ }
+ tag[6] = '\0';
+}
+
+
+struct pdf_font
+{
+#ifdef XETEX
+ FT_Face ft_face;
+ unsigned short *ft_to_gid;
+#endif
+
+ char *ident;
+ int subtype;
+
+ char *map_name;
+
+ int encoding_id; /* encoding or CMap */
+
+ /*
+ * If subtype is Type0, it simply points font_id
+ * of Type0 font. Type0 and simple font is not
+ * unified yet.
+ */
+ int font_id;
+
+ /* For simple font */
+ char *fontname;
+ char uniqueID[7];
+
+ /*
+ * PDF font resource objects
+ */
+ pdf_obj *reference;
+ pdf_obj *resource;
+ pdf_obj *descriptor;
+
+ /*
+ * Font format specific data
+ */
+ char *usedchars;
+ int flags;
+
+ /* PK font */
+ double point_size;
+ double design_size;
+};
+
+static void
+pdf_init_font_struct (pdf_font *font)
+{
+ ASSERT(font);
+
+#ifdef XETEX
+ font->ft_face = NULL;
+#endif
+
+ font->ident = NULL;
+ font->map_name = NULL;
+ font->subtype = -1;
+ font->font_id = -1; /* Type0 ID */
+ font->fontname = NULL;
+ memset(font->uniqueID, 0, 7);
+
+ font->encoding_id = -1;
+
+ font->reference = NULL;
+ font->resource = NULL;
+ font->descriptor = NULL;
+
+ font->point_size = 0;
+ font->design_size = 0;
+
+ font->usedchars = NULL;
+ font->flags = 0;
+
+ return;
+}
+
+static void
+pdf_flush_font (pdf_font *font)
+{
+ char *fontname, *uniqueTag;
+
+ if (!font) {
+ return;
+ }
+
+ if (font->resource && font->reference) {
+ if (font->subtype != PDF_FONT_FONTTYPE_TYPE3) {
+ if (pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED)) {
+ pdf_add_dict(font->resource,
+ pdf_new_name("BaseFont"), pdf_new_name(font->fontname));
+ if (font->descriptor) {
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontName"), pdf_new_name(font->fontname));
+ }
+ } else {
+ if (!font->fontname) {
+ ERROR("Undefined in fontname... (%s)", font->ident);
+ }
+ fontname = NEW(7+strlen(font->fontname)+1, char);
+ uniqueTag = pdf_font_get_uniqueTag(font);
+ sprintf(fontname, "%6s+%s", uniqueTag, font->fontname);
+ pdf_add_dict(font->resource,
+ pdf_new_name("BaseFont"), pdf_new_name(fontname));
+ if (font->descriptor) {
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("FontName"), pdf_new_name(fontname));
+ }
+ RELEASE(fontname);
+ }
+ if (font->descriptor) {
+ pdf_add_dict(font->resource,
+ pdf_new_name("FontDescriptor"), pdf_ref_obj(font->descriptor));
+ }
+ }
+ }
+
+ if (font->resource)
+ pdf_release_obj(font->resource);
+ if (font->descriptor)
+ pdf_release_obj(font->descriptor);
+ if (font->reference)
+ pdf_release_obj(font->reference);
+
+ font->reference = NULL;
+ font->resource = NULL;
+ font->descriptor = NULL;
+
+ return;
+}
+
+static void
+pdf_clean_font_struct (pdf_font *font)
+{
+ if (font) {
+ if (font->ident)
+ RELEASE(font->ident);
+ if (font->map_name)
+ RELEASE(font->map_name);
+ if (font->fontname)
+ RELEASE(font->fontname);
+ if (font->usedchars)
+ RELEASE(font->usedchars);
+
+ if (font->reference)
+ ERROR("pdf_font>> Object not flushed.");
+ if (font->resource)
+ ERROR("pdf_font> Object not flushed.");
+ if (font->descriptor)
+ ERROR("pdf_font>> Object not flushed.");
+
+ font->ident = NULL;
+ font->map_name = NULL;
+ font->fontname = NULL;
+ font->usedchars = NULL;
+ }
+
+ return;
+}
+
+#define CACHE_ALLOC_SIZE 16u
+
+static struct {
+ int count;
+ int capacity;
+ pdf_font *fonts;
+} font_cache = {
+ 0, 0, NULL
+};
+
+void
+pdf_init_fonts (void)
+{
+ ASSERT(font_cache.fonts == NULL);
+
+ agl_init_map();
+ otl_init_conf();
+
+ CMap_cache_init();
+ pdf_init_encodings();
+
+ Type0Font_cache_init();
+
+ font_cache.count = 0;
+ font_cache.capacity = CACHE_ALLOC_SIZE;
+ font_cache.fonts = NEW(font_cache.capacity, pdf_font);
+}
+
+#define CHECK_ID(n) do {\
+ if ((n) < 0 || (n) >= font_cache.count) {\
+ ERROR("Invalid font ID: %d", (n));\
+ }\
+} while (0)
+#define GET_FONT(n) (&(font_cache.fonts[(n)]))
+
+
+pdf_obj *
+pdf_get_font_reference (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+ if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
+ Type0Font *t0font;
+
+ t0font = Type0Font_cache_get(font->font_id);
+ return Type0Font_get_resource(t0font);
+ } else {
+ if (!font->reference) {
+ font->reference = pdf_ref_obj(pdf_font_get_resource(font));
+ }
+ }
+
+ return pdf_link_obj(font->reference);
+}
+
+char *
+pdf_get_font_usedchars (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+ if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
+ Type0Font *t0font;
+
+ t0font = Type0Font_cache_get(font->font_id);
+ return Type0Font_get_usedchars(t0font);
+ } else {
+ if (!font->usedchars) {
+ font->usedchars = NEW(256, char);
+ memset(font->usedchars, 0, 256 * sizeof(char));
+ }
+ return font->usedchars;
+ }
+}
+
+int
+pdf_get_font_wmode (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+ if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
+ Type0Font *t0font;
+
+ t0font = Type0Font_cache_get(font->font_id);
+ return Type0Font_get_wmode(t0font);
+ } else {
+ return 0;
+ }
+}
+
+int
+pdf_get_font_subtype (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+
+ return font->subtype;
+}
+
+char *
+pdf_get_font_fontname (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+
+ return font->fontname;
+}
+
+int
+pdf_get_font_encoding (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+
+ return font->encoding_id;
+}
+
+/* The rule for ToUnicode creation is:
+ *
+ * If "tounicode" option is specified in fontmap, use that.
+ * If there is ToUnicode CMap with same name as TFM, use that.
+ * If no "tounicode" option is used and no ToUnicode CMap with
+ * same name as TFM is found, create ToUnicode CMap from glyph
+ * names and AGL file.
+ */
+static int
+try_load_ToUnicode_CMap (pdf_font *font)
+{
+ pdf_obj *fontdict;
+ pdf_obj *tounicode;
+ const char *cmap_name = NULL;
+ fontmap_rec *mrec; /* Be sure fontmap is still alive here */
+
+ ASSERT(font);
+
+ /* We are using different encoding for Type0 font.
+ * This feature is unavailable for them.
+ */
+ if (font->subtype == PDF_FONT_FONTTYPE_TYPE0)
+ return 0;
+
+ ASSERT(font->map_name);
+
+ mrec = pdf_lookup_fontmap_record(font->map_name);
+ if (MREC_HAS_TOUNICODE(mrec))
+ cmap_name = mrec->opt.tounicode;
+ else {
+ cmap_name = font->map_name;
+ }
+
+ fontdict = pdf_font_get_resource(font);
+ tounicode = pdf_load_ToUnicode_stream(cmap_name);
+ if (!tounicode && MREC_HAS_TOUNICODE(mrec))
+ WARN("Failed to read ToUnicode mapping \"%s\"...", mrec->opt.tounicode);
+ else if (tounicode) {
+ if (pdf_obj_typeof(tounicode) != PDF_STREAM)
+ ERROR("Object returned by pdf_load_ToUnicode_stream() not stream object! (This must be bug)");
+ else if (pdf_stream_length(tounicode) > 0) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("ToUnicode"),
+ pdf_ref_obj (tounicode)); /* _FIXME_ */
+ if (__verbose)
+ MESG("pdf_font>> ToUnicode CMap \"%s\" attached to font id=\"%s\".\n",
+ cmap_name, font->map_name);
+ }
+ pdf_release_obj(tounicode);
+ }
+
+ return 0;
+}
+
+void
+pdf_close_fonts (void)
+{
+ int font_id, retval;
+
+ for (font_id = 0;
+ font_id < font_cache.count; font_id++) {
+ pdf_font *font;
+
+ font = GET_FONT(font_id);
+
+ if (__verbose) {
+ if (font->subtype != PDF_FONT_FONTTYPE_TYPE0) {
+ MESG("(%s", pdf_font_get_ident(font));
+ if (__verbose > 2 &&
+ !pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED)) {
+ MESG("[%s+%s]",
+ pdf_font_get_uniqueTag(font),
+ pdf_font_get_fontname(font));
+ } else if (__verbose > 1) {
+ MESG("[%s]",
+ pdf_font_get_fontname(font));
+ }
+ if (__verbose > 1) {
+ if (pdf_font_get_encoding(font) >= 0) {
+ MESG("[%s]",
+ pdf_encoding_get_name(pdf_font_get_encoding(font)));
+ } else {
+ MESG("[built-in]");
+ }
+ }
+
+ }
+ }
+
+ /* Must come before load_xxx */
+ try_load_ToUnicode_CMap(font);
+
+ /* Type 0 is handled separately... */
+ switch (font->subtype) {
+ case PDF_FONT_FONTTYPE_TYPE1:
+ if (__verbose)
+ MESG("[Type1]");
+ retval = pdf_font_load_type1 (font);
+ break;
+ case PDF_FONT_FONTTYPE_TYPE1C:
+ if (__verbose)
+ MESG("[Type1C]");
+ retval = pdf_font_load_type1c (font);
+ break;
+ case PDF_FONT_FONTTYPE_TRUETYPE:
+ if (__verbose)
+ MESG("[TrueType]");
+ retval = pdf_font_load_truetype(font);
+ break;
+ case PDF_FONT_FONTTYPE_TYPE3:
+ if (__verbose)
+ MESG("[Type3/PK]");
+ retval = pdf_font_load_pkfont (font);
+ break;
+ case PDF_FONT_FONTTYPE_TYPE0:
+ break;
+ default:
+ ERROR("Unknown font type: %d", font->subtype);
+ break;
+ }
+
+ if (__verbose) {
+ if (font->subtype != PDF_FONT_FONTTYPE_TYPE0)
+ MESG(")");
+ }
+
+ pdf_flush_font(font);
+ pdf_clean_font_struct(font);
+ }
+ RELEASE(font_cache.fonts);
+ font_cache.fonts = NULL;
+ font_cache.count = 0;
+ font_cache.capacity = 0;
+
+ Type0Font_cache_close();
+
+ CMap_cache_close();
+ pdf_close_encodings();
+
+ otl_close_conf();
+ agl_close_map (); /* After encoding */
+
+ return;
+}
+
+int
+pdf_font_findresource (const char *tex_name,
+ double font_scale, fontmap_rec *mrec)
+{
+ int font_id = -1;
+ pdf_font *font;
+ int encoding_id = -1, cmap_id = -1;
+ const char *fontname;
+
+ /*
+ * Get appropriate info from map file. (PK fonts at two different
+ * point sizes would be looked up twice unecessarily.)
+ */
+ fontname = mrec ? mrec->font_name : tex_name;
+ if (mrec && mrec->enc_name) {
+#define MAYBE_CMAP(s) (!strstr((s), ".enc") || strstr((s), ".cmap"))
+ if (MAYBE_CMAP(mrec->enc_name)) {
+ cmap_id = CMap_cache_find(mrec->enc_name);
+ if (cmap_id >= 0) {
+ CMap *cmap;
+ int cmap_type, minbytes;
+
+ cmap = CMap_cache_get(cmap_id);
+ cmap_type = CMap_get_type (cmap);
+ minbytes = CMap_get_profile(cmap, CMAP_PROF_TYPE_INBYTES_MIN);
+ /*
+ * Check for output encoding.
+ */
+ if (cmap_type != CMAP_TYPE_IDENTITY &&
+ cmap_type != CMAP_TYPE_CODE_TO_CID &&
+ cmap_type != CMAP_TYPE_TO_UNICODE) {
+ WARN("Only 16-bit encoding supported for output encoding.");
+ }
+ /*
+ * Turn on map option.
+ */
+ if (minbytes == 2 && mrec->opt.mapc < 0) {
+ if (__verbose) {
+ MESG("\n");
+ MESG("pdf_font>> Input encoding \"%s\" requires at least 2 bytes.\n",
+ CMap_get_name(cmap));
+ MESG("pdf_font>> The -m <00> option will be assumed for \"%s\".\n", mrec->font_name);
+ }
+ mrec->opt.mapc = 0; /* _FIXME_ */
+ }
+ } else if (!strcmp(mrec->enc_name, "unicode")) {
+ cmap_id = otf_load_Unicode_CMap(mrec->font_name,
+ mrec->opt.index, mrec->opt.otl_tags,
+ ((mrec->opt.flags & FONTMAP_OPT_VERT) ? 1 : 0));
+ if (cmap_id < 0) {
+ cmap_id = t1_load_UnicodeCMap(mrec->font_name, mrec->opt.otl_tags,
+ ((mrec->opt.flags & FONTMAP_OPT_VERT) ? 1 : 0));
+ }
+ if (cmap_id < 0)
+ ERROR("Failed to read UCS2/UCS4 TrueType cmap...");
+ }
+ }
+ if (cmap_id < 0) {
+ encoding_id = pdf_encoding_findresource(mrec->enc_name);
+ if (encoding_id < 0)
+ ERROR("Could not find encoding file \"%s\".", mrec->enc_name);
+ }
+ }
+
+ if (mrec && cmap_id >= 0) {
+ /*
+ * Composite Font
+ */
+ int type0_id, found = 0;
+
+ type0_id = pdf_font_findfont0(mrec->font_name, cmap_id, &mrec->opt);
+ if (type0_id < 0) {
+ return -1;
+ }
+
+ for (font_id = 0;
+ font_id < font_cache.count; font_id++) {
+ font = GET_FONT(font_id);
+ if (font->subtype == PDF_FONT_FONTTYPE_TYPE0 &&
+ font->font_id == type0_id &&
+ font->encoding_id == cmap_id) {
+ found = 1;
+ if (__verbose) {
+ MESG("\npdf_font>> Type0 font \"%s\" (cmap_id=%d) found at font_id=%d.\n",
+ mrec->font_name, cmap_id, font_id);
+ }
+ break;
+ }
+ }
+
+ if (!found) {
+ font_id = font_cache.count;
+ if (font_cache.count >= font_cache.capacity) {
+ font_cache.capacity += CACHE_ALLOC_SIZE;
+ font_cache.fonts = RENEW(font_cache.fonts, font_cache.capacity, pdf_font);
+ }
+ font = GET_FONT(font_id);
+ pdf_init_font_struct(font);
+
+#ifdef XETEX
+ font->ft_to_gid = Type0Font_get_ft_to_gid(type0_id);
+ font->ft_face = mrec->opt.ft_face;
+#endif
+
+ font->font_id = type0_id;
+ font->subtype = PDF_FONT_FONTTYPE_TYPE0;
+ font->encoding_id = cmap_id;
+
+ mrec->opt.flags &= ~FONTMAP_OPT_REMAP; /* _FIXME_ */
+
+ font_cache.count++;
+
+ if (__verbose) {
+ MESG("\npdf_font>> Type0 font \"%s\"", fontname);
+ MESG(" cmap_id=<%s,%d>", mrec->enc_name, font->encoding_id);
+ MESG(" opened at font_id=<%s,%d>.\n", tex_name, font_id);
+ }
+
+ }
+ } else {
+ /*
+ * Simple Font - always embed.
+ */
+ int found = 0;
+
+ for (font_id = 0;
+ font_id < font_cache.count; font_id++) {
+ font = GET_FONT(font_id);
+ switch (font->subtype) {
+ case PDF_FONT_FONTTYPE_TYPE1:
+ case PDF_FONT_FONTTYPE_TYPE1C:
+ case PDF_FONT_FONTTYPE_TRUETYPE:
+ /* fontname here is font file name.
+ * We must compare both font file name and encoding
+ */
+ if (!strcmp(fontname, font->ident) &&
+ encoding_id == font->encoding_id) {
+ found = 1;
+ }
+ break;
+ case PDF_FONT_FONTTYPE_TYPE3:
+ /* There shouldn't be any encoding specified for PK font.
+ * It must be always font's build-in encoding.
+ */
+ if (!strcmp(fontname, font->ident) &&
+ font_scale == font->point_size) {
+ found = 1;
+ }
+ break;
+ case PDF_FONT_FONTTYPE_TYPE0:
+ break;
+ default:
+ ERROR("Unknown font type: %d", font->subtype);
+ break;
+ }
+
+ if (found) {
+ if (__verbose) {
+ MESG("\npdf_font>> Simple font \"%s\" (enc_id=%d) found at id=%d.\n",
+ fontname, encoding_id, font_id);
+ }
+ break;
+ }
+ }
+
+
+ if (!found) {
+ font_id = font_cache.count;
+ if (font_cache.count >= font_cache.capacity) {
+ font_cache.capacity += CACHE_ALLOC_SIZE;
+ font_cache.fonts = RENEW(font_cache.fonts, font_cache.capacity, pdf_font);
+ }
+
+ font = GET_FONT(font_id);
+
+ pdf_init_font_struct(font);
+
+#ifdef XETEX
+ font->ft_face = mrec ? mrec->opt.ft_face : NULL;
+#endif
+
+ font->point_size = font_scale;
+ font->encoding_id = encoding_id;
+ font->ident = NEW(strlen(fontname) + 1, char);
+ strcpy(font->ident, fontname);
+ font->map_name = NEW(strlen(tex_name) + 1, char);
+ strcpy(font->map_name, tex_name);
+
+ if (pdf_font_open_type1(font) >= 0) {
+ font->subtype = PDF_FONT_FONTTYPE_TYPE1;
+ } else if (pdf_font_open_type1c(font) >= 0) {
+ font->subtype = PDF_FONT_FONTTYPE_TYPE1C;
+ } else if (pdf_font_open_truetype(font) >= 0) {
+ font->subtype = PDF_FONT_FONTTYPE_TRUETYPE;
+ } else if (pdf_font_open_pkfont(font) >= 0) {
+ font->subtype = PDF_FONT_FONTTYPE_TYPE3;
+ } else {
+ pdf_clean_font_struct(font);
+ return -1;
+ }
+
+ font_cache.count++;
+
+ if (__verbose) {
+ MESG("\npdf_font>> Simple font \"%s\"", fontname);
+ MESG(" enc_id=<%s,%d>",
+ (mrec && mrec->enc_name) ? mrec->enc_name : "builtin", font->encoding_id);
+ MESG(" opened at font_id=<%s,%d>.\n", tex_name, font_id);
+ }
+ }
+ }
+
+ return font_id;
+}
+
+int
+pdf_font_is_in_use (pdf_font *font)
+{
+ ASSERT(font);
+
+ return ((font->reference) ? 1 : 0);
+}
+
+#ifdef XETEX
+FT_Face
+pdf_font_get_ft_face (pdf_font *font)
+{
+ ASSERT(font);
+
+ return font->ft_face;
+}
+
+unsigned short *
+pdf_get_font_ft_to_gid (int font_id)
+{
+ pdf_font *font;
+
+ CHECK_ID(font_id);
+
+ font = GET_FONT(font_id);
+
+ return font->ft_to_gid;
+}
+#endif
+
+char *
+pdf_font_get_ident (pdf_font *font)
+{
+ ASSERT(font);
+
+ return font->ident;
+}
+
+char *
+pdf_font_get_fontname (pdf_font *font)
+{
+ ASSERT(font);
+
+ return font->fontname;
+}
+
+pdf_obj *
+pdf_font_get_resource (pdf_font *font)
+{
+ ASSERT(font);
+
+ if (!font->resource) {
+ font->resource = pdf_new_dict();
+ pdf_add_dict(font->resource,
+ pdf_new_name("Type"), pdf_new_name("Font"));
+ switch (font->subtype) {
+ case PDF_FONT_FONTTYPE_TYPE1:
+ case PDF_FONT_FONTTYPE_TYPE1C:
+ pdf_add_dict(font->resource,
+ pdf_new_name("Subtype"), pdf_new_name("Type1"));
+ break;
+ case PDF_FONT_FONTTYPE_TYPE3:
+ pdf_add_dict(font->resource,
+ pdf_new_name("Subtype"), pdf_new_name("Type3"));
+ break;
+ case PDF_FONT_FONTTYPE_TRUETYPE:
+ pdf_add_dict(font->resource,
+ pdf_new_name("Subtype"), pdf_new_name("TrueType"));
+ break;
+ default:
+ break;
+ }
+ }
+
+ return font->resource;
+}
+
+pdf_obj *
+pdf_font_get_descriptor (pdf_font *font)
+{
+ ASSERT(font);
+
+ if (!font->descriptor) {
+ font->descriptor = pdf_new_dict();
+ pdf_add_dict(font->descriptor,
+ pdf_new_name("Type"), pdf_new_name("FontDescriptor"));
+ }
+
+ return font->descriptor;
+}
+
+char *
+pdf_font_get_usedchars (pdf_font *font)
+{
+ ASSERT(font);
+
+ return font->usedchars;
+}
+
+int
+pdf_font_get_encoding (pdf_font *font)
+{
+ ASSERT(font);
+
+ return font->encoding_id;
+}
+
+int
+pdf_font_get_flag (pdf_font *font, int mask)
+{
+ ASSERT(font);
+
+ return ((font->flags & mask) ? 1 : 0);
+}
+
+int
+pdf_font_get_flags (pdf_font *font)
+{
+ ASSERT(font);
+
+ return font->flags;
+}
+
+double
+pdf_font_get_param (pdf_font *font, int param_type)
+{
+ double param = 0.0;
+
+ ASSERT(font);
+
+ switch (param_type) {
+ case PDF_FONT_PARAM_DESIGN_SIZE:
+ param = font->design_size;
+ break;
+ case PDF_FONT_PARAM_POINT_SIZE:
+ param = font->point_size;
+ break;
+ default:
+ break;
+ }
+
+ return param;
+}
+
+char *
+pdf_font_get_uniqueTag (pdf_font *font)
+{
+ ASSERT(font);
+
+ if (font->uniqueID[0] == '\0') {
+ pdf_font_make_uniqueTag(font->uniqueID);
+ }
+
+ return font->uniqueID;
+}
+
+int
+pdf_font_set_fontname (pdf_font *font, const char *fontname)
+{
+ ASSERT(font && fontname);
+
+ if (strlen(fontname) > PDF_NAME_LEN_MAX) {
+ ERROR("Unexpected error...");
+ return -1;
+ }
+ if (font->fontname) {
+ RELEASE(font->fontname);
+ }
+ font->fontname = NEW(strlen(fontname)+1, char);
+ strcpy(font->fontname, fontname);
+
+ return 0;
+}
+
+int
+pdf_font_set_subtype (pdf_font *font, int subtype)
+{
+ ASSERT(font);
+
+ font->subtype = subtype;
+
+ return 0;
+}
+
+int
+pdf_font_set_flags (pdf_font *font, int flags)
+{
+ ASSERT(font);
+
+ font->flags |= flags;
+
+ return 0;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/pdffont.h b/Build/source/texk/xdvipdfmx/src/pdffont.h
new file mode 100644
index 00000000000..362f1756146
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdffont.h
@@ -0,0 +1,102 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdffont.h,v 1.8 2004/09/11 14:50:28 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFFONT_H_
+#define _PDFFONT_H_
+
+#include "pdfobj.h"
+#include "fontmap.h"
+#include "pdflimits.h"
+
+#define PDF_FONT_FONTTYPE_TYPE1 0
+#define PDF_FONT_FONTTYPE_TYPE1C 1
+#define PDF_FONT_FONTTYPE_TYPE3 2
+#define PDF_FONT_FONTTYPE_TRUETYPE 3
+
+#define PDF_FONT_FONTTYPE_TYPE0 4
+
+extern void pdf_font_set_verbose (void);
+extern int pdf_font_get_verbose (void);
+
+extern void pdf_font_set_dpi (int font_dpi);
+
+#define PDF_FONT_FLAG_NOEMBED (1 << 0)
+#define PDF_FONT_FLAG_COMPOSITE (1 << 1)
+#define PDF_FONT_FLAG_BASEFONT (1 << 2)
+
+#define PDF_FONT_PARAM_DESIGN_SIZE 1
+#define PDF_FONT_PARAM_POINT_SIZE 2
+
+typedef struct pdf_font pdf_font;
+
+/* pdf_open_document() call them. */
+extern void pdf_init_fonts (void);
+extern void pdf_close_fonts (void);
+
+/* font_name is used when mrec is NULL.
+ * font_scale (point size) used by PK font.
+ * It might be necessary if dvipdfmx supports font format with
+ * various optical sizes supported in the future.
+ */
+extern int pdf_font_findresource (const char *font_name,
+ double font_scale, fontmap_rec *mrec);
+
+extern int pdf_get_font_subtype (int font_id);
+extern pdf_obj *pdf_get_font_reference (int font_id);
+extern char *pdf_get_font_usedchars (int font_id);
+
+extern char *pdf_get_font_fontname (int font_id); /* without unique tag */
+extern int pdf_get_font_encoding (int font_id);
+extern int pdf_get_font_wmode (int font_id);
+extern unsigned short *pdf_get_font_ft_to_gid (int font_id);
+
+/* Each font drivers use the followings. */
+extern int pdf_font_is_in_use (pdf_font *font);
+
+#ifdef XETEX
+extern FT_Face pdf_font_get_ft_face (pdf_font *font);
+#endif
+
+extern char *pdf_font_get_ident (pdf_font *font);
+
+extern char *pdf_font_get_uniqueTag (pdf_font *font);
+extern char *pdf_font_get_fontname (pdf_font *font); /* without unique tag */
+
+extern pdf_obj *pdf_font_get_resource (pdf_font *font);
+extern pdf_obj *pdf_font_get_descriptor (pdf_font *font);
+
+extern char *pdf_font_get_usedchars (pdf_font *font);
+extern int pdf_font_get_encoding (pdf_font *font);
+
+extern int pdf_font_get_flag (pdf_font *font, int mask);
+extern int pdf_font_get_flags (pdf_font *font);
+extern double pdf_font_get_param (pdf_font *font, int type);
+
+extern int pdf_font_set_fontname (pdf_font *font, const char *fontname);
+extern int pdf_font_set_flags (pdf_font *font, int flags);
+extern int pdf_font_set_subtype (pdf_font *font, int subtype);
+
+extern void pdf_font_make_uniqueTag (char *tag);
+
+#endif /* _PDFFONT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdflimits.h b/Build/source/texk/xdvipdfmx/src/pdflimits.h
new file mode 100644
index 00000000000..6cc162857f6
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdflimits.h
@@ -0,0 +1,34 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdflimits.h,v 1.4 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFLIMITS_H_
+#define _PDFLIMITS_H_
+
+/*
+ * PDF_NAME_LEN_MAX: see, Appendix C of PDF Ref. v1.3, 2nd. ed.
+ * This is Acrobat implementation limit.
+ */
+#define PDF_NAME_LEN_MAX 127
+
+#endif /* _PDFLIMITS_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfnames.c b/Build/source/texk/xdvipdfmx/src/pdfnames.c
new file mode 100644
index 00000000000..5a3a0e47839
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfnames.c
@@ -0,0 +1,486 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfnames.c,v 1.1 2004/09/02 12:23:07 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include <math.h>
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "numbers.h"
+
+/* Hash */
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+
+#include "pdfnames.h"
+
+struct obj_data
+{
+ pdf_obj *object_ref;
+ pdf_obj *object;
+ int reserve; /* 1 if object is not actually defined. */
+};
+
+char *
+printable_key (const char *key, int keylen)
+{
+#define MAX_KEY 32
+ static char pkey[MAX_KEY+4];
+ int i, len;
+ unsigned char hi, lo;
+
+ for (i = 0, len = 0;
+ i < keylen && len < MAX_KEY; i++) {
+ if (isprint(key[i])) {
+ pkey[len++] = key[i];
+ } else {
+ hi = (key[i] >> 4) & 0xff;
+ lo = key[i] & 0xff;
+ pkey[len++] = '#';
+ pkey[len++] = (hi < 10) ? hi + '0' : (hi - 10) + 'A';
+ pkey[len++] = (lo < 10) ? lo + '0' : (lo - 10) + 'A';
+ }
+ }
+ pkey[len] = '\0';
+
+ return (char *) pkey;
+}
+
+struct ht_table *
+pdf_new_name_tree (void)
+{
+ struct ht_table *names;
+
+ names = NEW(1, struct ht_table);
+ ht_init_table(names);
+
+ return names;
+}
+
+static void
+flush_objects (struct ht_table *ht_tab)
+{
+ struct ht_iter iter;
+
+ if (ht_set_iter(ht_tab, &iter) >= 0) {
+ do {
+ char *key;
+ int keylen;
+ struct obj_data *value;
+
+ key = ht_iter_getkey(&iter, &keylen);
+ value = ht_iter_getval(&iter);
+ if (value->reserve) {
+ WARN("Unresolved object reference \"%s\" found!!!",
+ printable_key(key, keylen));
+ }
+ if (value->object) {
+ pdf_release_obj(value->object);
+ }
+ if (value->object_ref) {
+ pdf_release_obj(value->object_ref);
+ }
+ value->object = NULL;
+ value->object_ref = NULL;
+ value->reserve = 0;
+ } while (ht_iter_next(&iter) >= 0);
+ ht_clear_iter(&iter);
+ }
+}
+
+static void CDECL
+hval_free (void *hval)
+{
+ struct obj_data *value;
+
+ value = (struct obj_data *) hval;
+ if (value->object)
+ pdf_release_obj(value->object);
+ if (value->object_ref)
+ pdf_release_obj(value->object_ref);
+
+ value->object = NULL;
+ value->object_ref = NULL;
+ value->reserve = 0;
+
+ RELEASE(value);
+
+ return;
+}
+
+void
+pdf_delete_name_tree (struct ht_table **names)
+{
+ ASSERT(names && *names);
+
+ flush_objects (*names);
+ ht_clear_table(*names, hval_free);
+ RELEASE(*names);
+ *names = NULL;
+}
+
+int
+pdf_names_add_object (struct ht_table *names,
+ const void *key, int keylen, pdf_obj *object)
+{
+ struct obj_data *value;
+
+ ASSERT(names && object);
+
+ if (!key || keylen < 1) {
+ WARN("Null string used for name tree key.");
+ return -1;
+ }
+
+ value = ht_lookup_table(names, key, keylen);
+ if (!value) {
+ value = NEW(1, struct obj_data);
+ value->object = object;
+ value->object_ref = NULL;
+ value->reserve = 0;
+ ht_append_table(names, key, keylen, value);
+ } else {
+ if (value->reserve) {
+ /* null object is used for undefined objects */
+ pdf_copy_object(value->object, object);
+ pdf_release_obj(object); /* PLEASE FIX THIS!!! */
+ } else {
+ if (value->object || value->object_ref) {
+ WARN("Object reference with key \"%s\" is in use.",
+ printable_key(key, keylen));
+ return -1;
+ } else {
+ value->object = object;
+ }
+ }
+ value->reserve = 0;
+ }
+
+ return 0;
+}
+
+int
+pdf_names_add_reference (struct ht_table *names,
+ const void *key, int keylen, pdf_obj *object_ref)
+{
+ struct obj_data *value;
+
+ ASSERT(names);
+
+ if (!PDF_OBJ_INDIRECTTYPE(object_ref)) {
+ WARN("Invalid type: @%s is not reference...",
+ printable_key(key, keylen));
+ return -1;
+ }
+
+ value = ht_lookup_table(names, key, keylen);
+ if (!value) {
+ value = NEW(1, struct obj_data);
+ value->object = NULL;
+ value->object_ref = object_ref;
+ value->reserve = 0;
+ ht_append_table(names, key, keylen, value);
+ } else {
+ if (value->object || value->object_ref) {
+ WARN("Object reference \"%s\" is in use.",
+ printable_key(key, keylen));
+ WARN("Please close it before redefining.");
+ return -1;
+ } else {
+ value->object = NULL;
+ value->object_ref = object_ref;
+ }
+ value->reserve = 0;
+ }
+
+ return 0;
+}
+
+/*
+ * The following routine returns copies, not the original object.
+ */
+pdf_obj *
+pdf_names_lookup_reference (struct ht_table *names,
+ const void *key, int keylen)
+{
+ struct obj_data *value;
+
+ ASSERT(names);
+
+ value = ht_lookup_table(names, key, keylen);
+ /* Reserve object label */
+ if (!value) {
+ value = NEW(1, struct obj_data);
+ value->object = pdf_new_null(); /* dummy */
+ value->object_ref = NULL;
+ value->reserve = 1;
+ ht_append_table(names, key, keylen, value);
+ }
+
+ if (!value->object_ref) {
+ if (value->object)
+ value->object_ref = pdf_ref_obj(value->object);
+ else {
+ WARN("Object @%s not defined or already closed.",
+ printable_key(key, keylen));
+ }
+ }
+
+ return pdf_link_obj(value->object_ref);
+}
+
+pdf_obj *
+pdf_names_lookup_object (struct ht_table *names,
+ const void *key, int keylen)
+{
+ struct obj_data *value;
+
+ ASSERT(names);
+
+ value = ht_lookup_table(names, key, keylen);
+ if (!value)
+ return NULL;
+ else if (!value->object) {
+ WARN("Object @%s not defined or already closed.",
+ printable_key(key, keylen));
+ }
+
+ return value->object;
+}
+
+int
+pdf_names_close_object (struct ht_table *names,
+ const void *key, int keylen)
+{
+ struct obj_data *value;
+
+ ASSERT(names);
+
+ value = ht_lookup_table(names, key, keylen);
+ if (!value) {
+ WARN("Tried to release nonexistent reference: %s",
+ printable_key(key, keylen));
+ return -1;
+ }
+
+ if (value->object) {
+ pdf_release_obj(value->object);
+ value->object = NULL;
+ } else {
+ WARN("Trying to close object @%s twice?",
+ printable_key(key, keylen));
+ return -1;
+ }
+
+ return 0;
+}
+
+struct named_object
+{
+ char *key;
+ int keylen;
+ pdf_obj *value;
+};
+
+static int CDECL
+cmp_key (const void *d1, const void *d2)
+{
+ struct named_object *sd1, *sd2;
+ int keylen, cmp;
+
+ sd1 = (struct named_object *) d1;
+ sd2 = (struct named_object *) d2;
+
+ if (!sd1->key)
+ cmp = -1;
+ else if (!sd2->key)
+ cmp = 1;
+ else {
+ keylen = MIN(sd1->keylen, sd2->keylen);
+ cmp = memcmp(sd1->key, sd2->key, keylen);
+ if (!cmp) {
+ cmp = sd1->keylen - sd2->keylen;
+ }
+ }
+
+ return cmp;
+}
+
+#define NAME_CLUSTER 4
+static pdf_obj *
+build_name_tree (struct named_object *first, long num_leaves, int is_root)
+{
+ pdf_obj *result;
+ int i;
+
+ result = pdf_new_dict();
+ /*
+ * According to PDF Refrence, Third Edition (p.101-102), a name tree
+ * always has exactly one root node, which contains a SINGLE entry:
+ * either Kids or Names but not both. If the root node has a Names
+ * entry, it is the only node in the tree. If it has a Kids entry,
+ * then each of the remaining nodes is either an intermediate node,
+ * containing a Limits entry and a Kids entry, or a leaf node,
+ * containing a Limits entry and a Names entry.
+ */
+ if (!is_root) {
+ struct named_object *last;
+ pdf_obj *limits;
+
+ limits = pdf_new_array();
+ last = &first[num_leaves - 1];
+ pdf_add_array(limits, pdf_new_string(first->key, first->keylen));
+ pdf_add_array(limits, pdf_new_string(last->key , last->keylen ));
+ pdf_add_dict (result, pdf_new_name("Limits"), limits);
+ }
+
+ if (num_leaves > 0 &&
+ num_leaves <= 2 * NAME_CLUSTER) {
+ pdf_obj *names;
+
+ /* Create leaf nodes. */
+ names = pdf_new_array();
+ for (i = 0; i < num_leaves; i++) {
+ struct named_object *cur;
+
+ cur = &first[i];
+ pdf_add_array(names, pdf_new_string(cur->key, cur->keylen));
+ switch (PDF_OBJ_TYPEOF(cur->value)) {
+ case PDF_ARRAY:
+ case PDF_DICT:
+ case PDF_STREAM:
+ case PDF_STRING:
+ pdf_add_array(names, pdf_ref_obj(cur->value));
+ break;
+ case PDF_OBJ_INVALID:
+ ERROR("Invalid object...: %s", printable_key(cur->key, cur->keylen));
+ break;
+ default:
+ pdf_add_array(names, pdf_link_obj(cur->value));
+ break;
+ }
+ pdf_release_obj(cur->value);
+ cur->value = NULL;
+ }
+ pdf_add_dict(result, pdf_new_name("Names"), names);
+ } else if (num_leaves > 0) {
+ pdf_obj *kids;
+
+ /* Intermediate node */
+ kids = pdf_new_array();
+ for (i = 0; i < NAME_CLUSTER; i++) {
+ pdf_obj *subtree;
+ long start, end;
+
+ start = (i*num_leaves) / NAME_CLUSTER;
+ end = ((i+1)*num_leaves) / NAME_CLUSTER;
+ subtree = build_name_tree(&first[start], (end - start), 0);
+ pdf_add_array (kids, pdf_ref_obj(subtree));
+ pdf_release_obj(subtree);
+ }
+ pdf_add_dict(result, pdf_new_name("Kids"), kids);
+ }
+
+ return result;
+}
+
+static struct named_object *
+flat_table (struct ht_table *ht_tab, long *num_entries)
+{
+ struct named_object *objects;
+ struct ht_iter iter;
+ long count;
+
+ ASSERT(ht_tab);
+
+ *num_entries = count = ht_tab->count;
+ objects = NEW(count, struct named_object);
+ if (ht_set_iter(ht_tab, &iter) >= 0) {
+ do {
+ char *key;
+ int keylen;
+ struct obj_data *value;
+
+ count--;
+ key = ht_iter_getkey(&iter, &keylen);
+ value = ht_iter_getval(&iter);
+ if (value->reserve) {
+ WARN("Named object \"%s\" not defined!!!",
+ printable_key(key, keylen));
+ WARN("Replacing with null.");
+ objects[count].key = (char *) key;
+ objects[count].keylen = keylen;
+ objects[count].value = pdf_new_null();
+ } else if (value->object_ref) {
+ objects[count].key = (char *) key;
+ objects[count].keylen = keylen;
+ objects[count].value = pdf_link_obj(value->object_ref);
+ } else if (value->object) {
+ objects[count].key = (char *) key;
+ objects[count].keylen = keylen;
+ objects[count].value = pdf_link_obj(value->object);
+ } else {
+ WARN("Named object \"%s\" not defined!!!",
+ printable_key(key, keylen));
+ WARN("Replacing with null.");
+ objects[count].key = (char *) key;
+ objects[count].keylen = keylen;
+ objects[count].value = pdf_new_null();
+ }
+ } while (ht_iter_next(&iter) >= 0 && count > 0);
+ ht_clear_iter(&iter);
+ }
+
+ return objects;
+}
+
+pdf_obj *
+pdf_names_create_tree (struct ht_table *names)
+{
+ pdf_obj *name_tree;
+ struct named_object *flat;
+ long count;
+
+ flat = flat_table(names, &count);
+ if (!flat)
+ name_tree = NULL;
+ else {
+ if (count < 1)
+ name_tree = NULL;
+ else {
+ qsort(flat, count, sizeof(struct named_object), cmp_key);
+ name_tree = build_name_tree(flat, count, 1);
+ }
+ RELEASE(flat);
+ }
+
+ return name_tree;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfnames.h b/Build/source/texk/xdvipdfmx/src/pdfnames.h
new file mode 100644
index 00000000000..50dff170b64
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfnames.h
@@ -0,0 +1,52 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfnames.h,v 1.1 2004/09/02 12:23:07 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDF_NAMES_H_
+#define _PDF_NAMES_H_
+
+/* Hash */
+#include "dpxutil.h"
+#include "pdfobj.h"
+
+/* Not actually tree... */
+extern struct ht_table *pdf_new_name_tree (void);
+extern void pdf_delete_name_tree (struct ht_table **names);
+
+extern int pdf_names_add_object (struct ht_table *names,
+ const void *key, int keylen, pdf_obj *object);
+extern int pdf_names_add_reference (struct ht_table *names,
+ const void *key, int keylen, pdf_obj *object_ref);
+extern pdf_obj *pdf_names_lookup_reference (struct ht_table *names,
+ const void *key, int keylen);
+extern pdf_obj *pdf_names_lookup_object (struct ht_table *names,
+ const void *key, int keylen);
+extern int pdf_names_close_object (struct ht_table *names,
+ const void *key, int keylen);
+
+/* Really create name tree... */
+extern pdf_obj *pdf_names_create_tree (struct ht_table *names);
+
+extern char *printable_key (const char *key, int keylen);
+
+#endif /* _PDF_NAMES_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfobj.c b/Build/source/texk/xdvipdfmx/src/pdfobj.c
new file mode 100644
index 00000000000..7e6930bc667
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfobj.c
@@ -0,0 +1,2542 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.c,v 1.39 2005/08/30 07:53:37 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+#include "pdflimits.h"
+#include "pdfencrypt.h"
+#include "pdfparse.h"
+
+#ifdef HAVE_ZLIB
+#include <zlib.h>
+#endif /* HAVE_ZLIB */
+
+#include "pdfobj.h"
+
+#define STREAM_ALLOC_SIZE 4096u
+#define ARRAY_ALLOC_SIZE 256
+#define IND_OBJECTS_ALLOC_SIZE 512
+
+/* Any of these types can be represented as follows */
+struct pdf_obj
+{
+ int type;
+
+ unsigned long label; /* Only used for indirect objects
+ all other "label" to zero */
+ unsigned short generation; /* Only used if "label" is used */
+ unsigned refcount; /* Number of links to this object */
+ void *data;
+};
+
+struct pdf_boolean
+{
+ char value;
+};
+
+struct pdf_number
+{
+ double value;
+};
+
+struct pdf_string
+{
+ unsigned char *string;
+ unsigned short length;
+};
+
+struct pdf_name
+{
+ char *name;
+};
+
+struct pdf_array
+{
+ unsigned long max;
+ unsigned long size;
+ struct pdf_obj **values;
+};
+
+struct pdf_dict
+{
+ struct pdf_obj *key;
+ struct pdf_obj *value;
+ struct pdf_dict *next;
+};
+
+struct pdf_stream
+{
+ struct pdf_obj *dict;
+ unsigned char *stream;
+ unsigned long stream_length;
+ unsigned long max_length;
+ unsigned char _flags;
+};
+
+struct pdf_indirect
+{
+ unsigned label;
+ unsigned generation;
+ int dirty; /* Dirty objects came from an input file and were not
+ generated by this program. They have a label in a
+ different numbering sequence. These are translated
+ when the object is written out */
+ FILE *dirty_file;
+};
+
+typedef void pdf_null;
+typedef struct pdf_boolean pdf_boolean;
+typedef struct pdf_number pdf_number;
+typedef struct pdf_string pdf_string;
+typedef struct pdf_name pdf_name;
+typedef struct pdf_array pdf_array;
+typedef struct pdf_dict pdf_dict;
+typedef struct pdf_stream pdf_stream;
+typedef struct pdf_indirect pdf_indirect;
+
+static FILE *pdf_output_file = NULL;
+static FILE *pdf_input_file = NULL;
+
+static long pdf_output_file_position = 0;
+static long pdf_output_line_position = 0;
+static long compression_saved = 0;
+
+#define FORMAT_BUF_SIZE 4096
+static char format_buffer[FORMAT_BUF_SIZE];
+
+static struct xref_entry
+{
+ long file_position;
+ pdf_obj *object;
+ int used; /* Used by PDF import */
+} *output_xref = NULL;
+
+static unsigned long pdf_max_ind_objects = 0;
+static unsigned long next_label = 1;
+
+static unsigned long startxref;
+
+static unsigned pdf_root_obj = 0;
+static unsigned pdf_info_obj = 0;
+static unsigned pdf_encrypt_obj = 0;
+
+/* Internal static routines */
+
+static void pdf_flush_obj (pdf_obj *object, FILE *file);
+static void pdf_label_obj (pdf_obj *object);
+static void pdf_write_obj (pdf_obj *object, FILE *file);
+
+static void pdf_out_char (FILE *file, char c);
+static void pdf_out (FILE *file, const void *buffer, long length);
+
+static void release_indirect (pdf_indirect *data);
+static void write_indirect (pdf_indirect *indirect, FILE *file);
+
+static void release_boolean (pdf_obj *data);
+static void write_boolean (pdf_boolean *data, FILE *file);
+
+static void release_null (pdf_null *data);
+static void write_null (pdf_null *data, FILE *file);
+
+static void release_number (pdf_number *number);
+static void write_number (pdf_number *number, FILE *file);
+
+static void write_string (pdf_string *str, FILE *file);
+static void release_string (pdf_string *str);
+
+static void write_name (pdf_name *name, FILE *file);
+static void release_name (pdf_name *name);
+
+static void write_array (pdf_array *array, FILE *file);
+static void release_array (pdf_array *array);
+
+static void write_dict (pdf_dict *dict, FILE *file);
+static void release_dict (pdf_dict *dict);
+
+static void write_stream (pdf_stream *stream, FILE *file);
+static void release_stream (pdf_stream *stream);
+
+static pdf_obj *pdf_ref_file_obj (unsigned long obj_num, unsigned obj_gen);
+static pdf_obj *pdf_read_object (unsigned long obj_num, unsigned obj_gen);
+
+static int verbose = 0;
+static char compression_level = 9;
+
+void
+pdf_set_compression (int level)
+{
+#ifndef HAVE_ZLIB
+ ERROR("You don't have compression compiled in. Possibly libz wasn't found by configure.");
+#else
+#ifndef HAVE_ZLIB_COMPRESS2
+ if (level != 0)
+ WARN("Unable to set compression level -- your zlib doesn't have compress2().");
+#endif
+ if (level >= 0 && level <= 9)
+ compression_level = level;
+ else {
+ ERROR("set_compression: invalid compression level: %d", level);
+ }
+#endif /* !HAVE_ZLIB */
+
+ return;
+}
+
+static unsigned pdf_version = 3;
+
+void
+pdf_set_version (unsigned version)
+{
+ /* Don't forget to update CIDFont_stdcc_def[] in cid.c too! */
+ if (version >= 3 && version <= 6) {
+ pdf_version = version;
+ }
+}
+
+unsigned
+pdf_get_version (void)
+{
+ return pdf_version;
+}
+
+void
+pdf_obj_set_verbose(void)
+{
+ verbose++;
+}
+
+#define BINARY_MARKER "%\344\360\355\370\n"
+void
+pdf_out_init (const char *filename)
+{
+ char v;
+
+ pdf_output_file = MFOPEN(filename, FOPEN_WBIN_MODE);
+ if (!pdf_output_file) {
+ if (strlen(filename) < 128)
+ ERROR("Unable to open \"%s\".", filename);
+ else
+ ERROR("Unable to open file.");
+ }
+ pdf_out(pdf_output_file, "%PDF-1.", strlen("%PDF-1."));
+ v = '0' + pdf_version;
+ pdf_out(pdf_output_file, &v, 1);
+ pdf_out(pdf_output_file, "\n", 1);
+ pdf_out(pdf_output_file, BINARY_MARKER, strlen(BINARY_MARKER));
+}
+
+static void
+dump_xref (void)
+{
+ long length;
+ unsigned long i;
+
+ /* Record where this xref is for trailer */
+ startxref = pdf_output_file_position;
+
+ pdf_out(pdf_output_file, "xref\n", 5);
+
+ length = sprintf(format_buffer, "%d %lu\n", 0, next_label);
+ pdf_out(pdf_output_file, format_buffer, length);
+
+ length = sprintf(format_buffer, "%010ld %05ld f \n", 0L, 65535L);
+ /*
+ * Every space counts. The space after the 'f' and 'n' is * *essential*.
+ * The PDF spec says the lines must be 20 characters long including the
+ * end of line character.
+ */
+ pdf_out(pdf_output_file, format_buffer, length);
+ for (i = 1; i < next_label; i++){
+ length = sprintf(format_buffer, "%010ld %05ld n \n",
+ output_xref[i-1].file_position, 0L);
+ pdf_out(pdf_output_file, format_buffer, length);
+ }
+ /* Done with xref table */
+ RELEASE(output_xref);
+ output_xref = NULL;
+}
+
+static void
+dump_trailer (void)
+{
+ long length;
+ unsigned long starttrailer;
+
+ starttrailer = pdf_output_file_position;
+
+ pdf_out(pdf_output_file, "trailer\n", 8);
+ pdf_out(pdf_output_file, "<<\n", 3);
+
+ length = sprintf(format_buffer, "/Size %lu\n", next_label);
+ pdf_out(pdf_output_file, format_buffer, length);
+
+ if (pdf_root_obj == 0)
+ ERROR ("dump_trailer: Invalid root object");
+ length = sprintf(format_buffer, "/Root %u %u R\n", pdf_root_obj, 0);
+ pdf_out(pdf_output_file, format_buffer, length);
+
+ if (pdf_encrypt_obj != 0) {
+ length = sprintf(format_buffer, "/Encrypt %u %u R\n", pdf_encrypt_obj, 0);
+ pdf_out(pdf_output_file, format_buffer, length);
+ }
+ if (pdf_info_obj != 0) {
+ length = sprintf(format_buffer, "/Info %u %u R\n", pdf_info_obj, 0);
+ pdf_out(pdf_output_file, format_buffer, length);
+ }
+ if (pdf_encrypt_obj != 0) {
+ unsigned char *id;
+ id = pdf_enc_id_string();
+ length = sprintf(format_buffer, "/ID [<%s> <%s>]\n", id, id);
+ pdf_out(pdf_output_file, format_buffer, length);
+ }
+ pdf_out(pdf_output_file, ">>\n", 3);
+ pdf_out(pdf_output_file, "startxref\n", 10);
+
+ length = sprintf(format_buffer, "%lu\n", startxref);
+ pdf_out(pdf_output_file, format_buffer, length);
+
+ pdf_out(pdf_output_file, "%%EOF\n", 6);
+}
+
+void
+pdf_out_flush (void)
+{
+ if (pdf_output_file) {
+ dump_xref();
+ dump_trailer();
+ MESG("\n");
+ if (verbose) {
+ if (compression_level > 0) {
+ MESG("Compression eliminated approximately %lu bytes\n", compression_saved);
+ }
+ }
+ MESG("%lu bytes written", pdf_output_file_position);
+
+ MFCLOSE(pdf_output_file);
+ }
+}
+
+void
+pdf_error_cleanup (void)
+{
+ /*
+ * This routine is the cleanup required for an abnormal exit.
+ * For now, simply close the file.
+ */
+ if (pdf_output_file)
+ MFCLOSE(pdf_output_file);
+}
+
+
+void
+pdf_set_root (pdf_obj *object)
+{
+ if (pdf_root_obj != 0) {
+ ERROR("Root object already set!");
+ }
+ if (object->label == 0) { /* Make sure this object has a label */
+ pdf_label_obj(object);
+ }
+ pdf_root_obj = object->label;
+}
+
+void
+pdf_set_info (pdf_obj *object)
+{
+ if (pdf_info_obj != 0) {
+ ERROR ("Info object already set!");
+ }
+ if (object->label == 0) { /* Make sure this object has a label */
+ pdf_label_obj(object);
+ }
+ pdf_info_obj = object->label;
+}
+
+void
+pdf_set_encrypt (pdf_obj *object)
+{
+ if (pdf_encrypt_obj != 0) {
+ ERROR("Encrypt object already set!");
+ }
+ if (object->label == 0) { /* Make sure this object has a label */
+ pdf_label_obj(object);
+ }
+ pdf_encrypt_obj = object->label;
+}
+
+static
+void pdf_out_char (FILE *file, char c)
+{
+ fputc(c, file);
+ /* Keep tallys for xref table *only* if writing a pdf file. */
+ if (file == pdf_output_file) {
+ pdf_output_file_position += 1;
+ if (c == '\n')
+ pdf_output_line_position = 0;
+ else
+ pdf_output_line_position += 1;
+ }
+}
+
+#define pdf_out_xchar(f,c) do {\
+ int __tmpnum;\
+ __tmpnum = ((c) >> 4) & 0x0f;\
+ pdf_out_char((f), (((__tmpnum) >= 10) ? (__tmpnum)+'W' : (__tmpnum)+'0'));\
+ __tmpnum = (c) & 0x0f;\
+ pdf_out_char((f), (((__tmpnum) >= 10) ? (__tmpnum)+'W' : (__tmpnum)+'0'));\
+} while (0)
+
+static
+void pdf_out (FILE *file, const void *buffer, long length)
+{
+ fwrite(buffer, 1, length, file);
+ /* Keep tallys for xref table *only* if writing a pdf file */
+ if (file == pdf_output_file) {
+ pdf_output_file_position += length;
+ pdf_output_line_position += length;
+ /* "foo\nbar\n "... */
+ if (length > 0 &&
+ ((char *)buffer)[length-1] == '\n')
+ pdf_output_line_position = 0;
+ }
+}
+
+static
+void pdf_out_white (FILE *file)
+{
+ if (file == pdf_output_file && pdf_output_line_position >= 80) {
+ pdf_out_char(file, '\n');
+ } else {
+ pdf_out_char(file, ' ');
+ }
+}
+
+#define TYPECHECK(o,t) if (!(o) || (o)->type != (t)) {\
+ ERROR("typecheck: Invalid object type. %d %d", (o) ? (o)->type : -1, (t));\
+}
+
+#define INVALIDOBJ(o) ((o) == NULL || (o)->type <= 0 || (o)->type > PDF_INDIRECT)
+
+pdf_obj *
+pdf_new_obj(int type)
+{
+ pdf_obj *result;
+
+ if (type > PDF_INDIRECT || type < PDF_UNDEFINED)
+ ERROR("Invalid object type: %d", type);
+
+ result = NEW(1, pdf_obj);
+ result->type = type;
+ result->data = NULL;
+ result->label = 0;
+ result->generation = 0;
+ result->refcount = 1;
+
+ return result;
+}
+
+int
+pdf_obj_typeof (pdf_obj *object)
+{
+ if (INVALIDOBJ(object))
+ return PDF_OBJ_INVALID;
+
+ return object->type;
+}
+
+static void
+pdf_label_obj (pdf_obj *object)
+{
+ if (INVALIDOBJ(object))
+ ERROR("pdf_label_obj(): passed invalid object.");
+
+ if (next_label > pdf_max_ind_objects) {
+ pdf_max_ind_objects += IND_OBJECTS_ALLOC_SIZE;
+ output_xref = RENEW(output_xref, pdf_max_ind_objects, struct xref_entry);
+ }
+ /*
+ * Don't change label on an already labeled object. Ignore such calls.
+ */
+ if (object->label == 0) {
+ /* Save so we can lookup this object by its number */
+ output_xref[next_label-1].object = object;
+ output_xref[next_label-1].file_position = 0L;
+ object->label = next_label;
+ object->generation = 0;
+ next_label++;
+ }
+}
+
+/*
+ * This doesn't really copy the object, but allows it to be used without
+ * fear that somebody else will free it.
+ */
+pdf_obj *
+pdf_link_obj (pdf_obj *object)
+{
+ if (INVALIDOBJ(object))
+ ERROR("pdf_link_obj(): passed invalid object.");
+
+ object->refcount += 1;
+
+ return object;
+}
+
+
+pdf_obj *
+pdf_ref_obj (pdf_obj *object)
+{
+ pdf_obj *result;
+ pdf_indirect *indirect;
+
+ if (INVALIDOBJ(object))
+ ERROR("pdf_ref_obj(): passed invalid object.");
+
+ if (object->refcount == 0) {
+ MESG("\nTrying to refer already released object!!!\n");
+ pdf_write_obj(object, stderr);
+ ERROR("Cannot continue...");
+ }
+
+ result = pdf_new_obj(PDF_INDIRECT);
+ indirect = NEW(1, pdf_indirect);
+ result->data = indirect;
+ if (object->type == PDF_INDIRECT) {
+ indirect->label = ((pdf_indirect *) (object->data))->label;
+ indirect->generation = ((pdf_indirect *) (object->data))->generation;
+ indirect->dirty = ((pdf_indirect *) (object->data))->dirty;
+ indirect->dirty_file = ((pdf_indirect *) (object->data))->dirty_file;
+ } else {
+ if (object->label == 0) {
+ pdf_label_obj(object);
+ }
+ indirect->label = object->label;
+ indirect->generation = object->generation;
+ indirect->dirty = 0;
+ indirect->dirty_file = NULL;
+ }
+
+ return result;
+}
+
+static void
+release_indirect (pdf_indirect *data)
+{
+ RELEASE(data);
+}
+
+static void
+write_indirect (pdf_indirect *indirect, FILE *file)
+{
+ long length;
+
+ if (indirect->dirty) {
+ if (file == stderr) {
+ pdf_out(file, "{d}", 3);
+ length = sprintf(format_buffer, "%d %d R", indirect->label, indirect->generation);
+ pdf_out(stderr, format_buffer, length);
+ } else {
+ pdf_obj *clean;
+
+ if (indirect->dirty_file != pdf_input_file) {
+ ERROR("Input PDF file doesn't match object: label=%d, from_file=%p, current_file=%p",
+ indirect->label, indirect->dirty_file, pdf_input_file);
+ }
+ clean = pdf_ref_file_obj(indirect->label, indirect->generation);
+ pdf_write_obj(clean, file);
+ pdf_release_obj(clean);
+ }
+ } else {
+ length = sprintf(format_buffer, "%d %d R", indirect->label, indirect->generation);
+ pdf_out(file, format_buffer, length);
+ }
+}
+
+pdf_obj *
+pdf_new_null (void)
+{
+ pdf_obj *result;
+
+ result = pdf_new_obj(PDF_NULL);
+ result->data = NULL;
+
+ return result;
+}
+
+static void
+release_null (pdf_null *obj)
+{
+ return;
+}
+
+static void
+write_null (pdf_null *obj, FILE *file)
+{
+ pdf_out(file, "null", 4);
+}
+
+pdf_obj *
+pdf_new_boolean (char value)
+{
+ pdf_obj *result;
+ pdf_boolean *data;
+
+ result = pdf_new_obj(PDF_BOOLEAN);
+ data = NEW(1, pdf_boolean);
+ data->value = value;
+ result->data = data;
+
+ return result;
+}
+
+static void
+release_boolean (pdf_obj *data)
+{
+ RELEASE (data);
+}
+
+static void
+write_boolean (pdf_boolean *data, FILE *file)
+{
+ if (data->value) {
+ pdf_out(file, "true", 4);
+ } else {
+ pdf_out(file, "false", 5);
+ }
+}
+
+void
+pdf_set_boolean (pdf_obj *object, char value)
+{
+ pdf_boolean *data;
+
+ TYPECHECK(object, PDF_BOOLEAN);
+
+ data = object->data;
+ data->value = value;
+}
+
+char
+pdf_boolean_value (pdf_obj *object)
+{
+ pdf_boolean *data;
+
+ TYPECHECK(object, PDF_BOOLEAN);
+
+ data = object->data;
+
+ return data->value;
+}
+
+pdf_obj *
+pdf_new_number (double value)
+{
+ pdf_obj *result;
+ pdf_number *data;
+
+ result = pdf_new_obj(PDF_NUMBER);
+ data = NEW(1, pdf_number);
+ data->value = value;
+ result->data = data;
+
+ return result;
+}
+
+static void
+release_number (pdf_number *data)
+{
+ RELEASE (data);
+}
+
+static void
+write_number (pdf_number *number, FILE *file)
+{
+ int count;
+
+ count = pdf_sprint_number(format_buffer, number->value);
+
+ pdf_out(file, format_buffer, count);
+}
+
+
+void
+pdf_set_number (pdf_obj *object, double value)
+{
+ pdf_number *data;
+
+ TYPECHECK(object, PDF_NUMBER);
+
+ data = object->data;
+ data->value = value;
+}
+
+double
+pdf_number_value (pdf_obj *object)
+{
+ pdf_number *data;
+
+ TYPECHECK(object, PDF_NUMBER);
+
+ data = object->data;
+
+ return data->value;
+}
+
+pdf_obj *
+pdf_new_string (const void *str, unsigned length)
+{
+ pdf_obj *result;
+ pdf_string *data;
+
+ result = pdf_new_obj(PDF_STRING);
+ data = NEW(1, pdf_string);
+ result->data = data;
+ if (length != 0) {
+ data->length = length;
+ data->string = NEW(length+1, unsigned char);
+ memcpy(data->string, str, length);
+ /* Shouldn't assume NULL terminated. */
+ data->string[length] = '\0';
+ } else {
+ data->length = 0;
+ data->string = NULL;
+ }
+
+ return result;
+}
+
+void *
+pdf_string_value (pdf_obj *object)
+{
+ pdf_string *data;
+
+ TYPECHECK(object, PDF_STRING);
+
+ data = object->data;
+
+ return data->string;
+}
+
+unsigned
+pdf_string_length (pdf_obj *object)
+{
+ pdf_string *data;
+
+ TYPECHECK(object, PDF_STRING);
+
+ data = object->data;
+
+ return (unsigned) (data->length);
+}
+
+/*
+ * This routine escapes non printable characters and control
+ * characters in an output string.
+ */
+int
+pdfobj_escape_str (char *buffer, int bufsize, const unsigned char *s, int len)
+{
+ int result = 0;
+ int i;
+
+ for (i = 0; i < len; i++) {
+ unsigned char ch;
+
+ ch = s[i];
+ if (result > bufsize - 4)
+ ERROR("pdfobj_escape_str: Buffer overflow");
+
+ /*
+ * We always write three octal digits. Optimization only gives few Kb
+ * smaller size for most documents when zlib compressed.
+ */
+ if (ch < 32 || ch > 126) {
+ buffer[result++] = '\\';
+#if 0
+ if (i < len - 1 && !isdigit(s[i+1]))
+ result += sprintf(buffer+result, "%o", ch);
+ else
+ result += sprintf(buffer+result, "%03o", ch);
+#endif
+ result += sprintf(buffer+result, "%03o", ch);
+ } else {
+ switch (ch) {
+ case '(':
+ buffer[result++] = '\\';
+ buffer[result++] = '(';
+ break;
+ case ')':
+ buffer[result++] = '\\';
+ buffer[result++] = ')';
+ break;
+ case '\\':
+ buffer[result++] = '\\';
+ buffer[result++] = '\\';
+ break;
+ default:
+ buffer[result++] = ch;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+static void
+write_string (pdf_string *str, FILE *file)
+{
+ unsigned char *s;
+ char wbuf[FORMAT_BUF_SIZE]; /* Shouldn't use format_buffer[]. */
+ int nescc = 0, i, count;
+
+ s = str->string;
+ pdf_encrypt_data(s, str->length);
+ /*
+ * Count all ASCII non-printable characters.
+ */
+ for (i = 0; i < str->length; i++) {
+ if (!isprint(s[i]))
+ nescc++;
+ }
+ /*
+ * If the string contains much escaped chars, then we write it as
+ * ASCII hex string.
+ */
+ if (nescc > str->length / 3) {
+ pdf_out_char(file, '<');
+ for (i = 0; i < str->length; i++) {
+ pdf_out_xchar(file, s[i]);
+ }
+ pdf_out_char(file, '>');
+ } else {
+ pdf_out_char(file, '(');
+ /*
+ * This section of code probably isn't speed critical. Escaping the
+ * characters in the string one at a time may seem slow, but it's
+ * safe if the formatted string length exceeds FORMAT_BUF_SIZE.
+ * Occasionally you see some long strings in PDF. pdfobj_escape_str
+ * is also used for strings of text with no kerning. These must be
+ * handled as quickly as possible since there are so many of them.
+ */
+ for (i = 0; i < str->length; i++) {
+ count = pdfobj_escape_str(wbuf, FORMAT_BUF_SIZE, &(s[i]), 1);
+ pdf_out(file, wbuf, count);
+ }
+ pdf_out_char(file, ')');
+ }
+}
+
+static void
+release_string (pdf_string *data)
+{
+ if (data->string != NULL) {
+ RELEASE(data->string);
+ data->string = NULL;
+ }
+ RELEASE(data);
+}
+
+void
+pdf_set_string (pdf_obj *object, unsigned char *str, unsigned length)
+{
+ pdf_string *data;
+
+ TYPECHECK(object, PDF_STRING);
+
+ data = object->data;
+ if (data->string != 0) {
+ RELEASE(data->string);
+ }
+ if (length != 0) {
+ data->length = length;
+ data->string = NEW(length + 1, unsigned char);
+ memcpy(data->string, str, length);
+ data->string[length] = '\0';
+ } else {
+ data->length = 0;
+ data->string = NULL;
+ }
+}
+
+/* Name does *not* include the /. */
+pdf_obj *
+pdf_new_name (const char *name)
+{
+ pdf_obj *result;
+ unsigned length;
+ pdf_name *data;
+
+ result = pdf_new_obj(PDF_NAME);
+ data = NEW (1, pdf_name);
+ result->data = data;
+ length = strlen(name);
+ if (length != 0) {
+ data->name = NEW(length+1, char);
+ memcpy(data->name, name, length);
+ data->name[length] = '\0';
+ } else {
+ data->name = NULL;
+ }
+
+ return result;
+}
+
+static void
+write_name (pdf_name *name, FILE *file)
+{
+ char *s;
+ int i, length;
+
+ s = name->name;
+ length = name->name ? strlen(name->name) : 0;
+ /*
+ * From PDF Reference, 3rd ed., p.33:
+ *
+ * Beginning with PDF 1.2, any character except null (character code 0)
+ * may be included in a name by writing its 2-digit hexadecimal code,
+ * preceded bythe number sign character (#); see implementation notes 3
+ * and 4 in Appendix H. This syntax is required in order to represent
+ * any of the delimiter or white-space characters or the number sign
+ * character itself; it is recommended but not required for characters
+ * whose codes are outside the range 33 (!) to 126 (~).
+ */
+#ifndef is_delim
+ /* Avoid '{' and '}' for PostScript compatibility? */
+#define is_delim(c) ((c) == '(' || (c) == '/' || \
+ (c) == '<' || (c) == '>' || \
+ (c) == '[' || (c) == ']' || \
+ (c) == '{' || (c) == '}' || \
+ (c) == '%')
+#endif
+ pdf_out_char(file, '/');
+ for (i = 0; i < length; i++) {
+ if (s[i] < '!' || s[i] > '~' || s[i] == '#' || is_delim(s[i])) {
+ /* ^ "space" is here. */
+ pdf_out_char (file, '#');
+ pdf_out_xchar(file, s[i]);
+ } else {
+ pdf_out_char (file, s[i]);
+ }
+ }
+}
+
+static void
+release_name (pdf_name *data)
+{
+ if (data->name != NULL) {
+ RELEASE(data->name);
+ data->name = NULL;
+ }
+ RELEASE(data);
+}
+
+void
+pdf_set_name (pdf_obj *object, const char *name)
+{
+ pdf_name *data;
+ unsigned length;
+
+ TYPECHECK(object, PDF_NAME);
+
+ length = strlen(name);
+ data = object->data;
+ if (data->name != NULL) {
+ RELEASE(data->name);
+ }
+ if (length != 0) {
+ data->name = NEW(length+1, char);
+ memcpy(data->name, name, length);
+ data->name[length] = 0;
+ } else {
+ data->name = NULL;
+ }
+}
+
+char *
+pdf_name_value (pdf_obj *object)
+{
+ pdf_name *data;
+
+ TYPECHECK(object, PDF_NAME);
+
+ data = object->data;
+
+ return data->name;
+}
+
+/*
+ * We do not have pdf_name_length() since '\0' is not allowed
+ * in PDF name object.
+ */
+
+pdf_obj *
+pdf_new_array (void)
+{
+ pdf_obj *result;
+ pdf_array *data;
+
+ result = pdf_new_obj(PDF_ARRAY);
+ data = NEW(1, pdf_array);
+ data->values = NULL;
+ data->max = 0;
+ data->size = 0;
+ result->data = data;
+
+ return result;
+}
+
+static void
+write_array (pdf_array *array, FILE *file)
+{
+ pdf_out_char(file, '[');
+ if (array->size > 0) {
+ unsigned long i;
+
+ for (i = 0; i < array->size; i++) {
+ if (i > 0)
+ pdf_out_white(file);
+ if (!array->values[i])
+ WARN("PDF array element #ld undefined.", i);
+ pdf_write_obj(array->values[i], file);
+ }
+ }
+ pdf_out_char(file, ']');
+}
+
+pdf_obj *
+pdf_get_array (pdf_obj *array, long idx)
+{
+ pdf_obj *result = NULL;
+ pdf_array *data;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = array->data;
+ if (idx < 0)
+ result = data->values[idx + data->size];
+ else if (idx < data->size) {
+ result = data->values[idx];
+ }
+
+ return result;
+}
+
+unsigned int
+pdf_array_length (pdf_obj *array)
+{
+ pdf_array *data;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = (pdf_array *) array->data;
+
+ return (unsigned int) data->size;
+}
+
+static void
+release_array (pdf_array *data)
+{
+ unsigned long i;
+
+ if (data->values) {
+ for (i = 0; i < data->size; i++) {
+ pdf_release_obj(data->values[i]);
+ data->values[i] = NULL;
+ }
+ RELEASE(data->values);
+ data->values = NULL;
+ }
+ RELEASE(data);
+}
+
+/*
+ * The name pdf_add_array is misleading. It behaves differently than
+ * pdf_add_dict(). This should be pdf_push_array().
+ */
+void
+pdf_add_array (pdf_obj *array, pdf_obj *object)
+{
+ pdf_array *data;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = array->data;
+ if (data->size >= data->max) {
+ data->max += ARRAY_ALLOC_SIZE;
+ data->values = RENEW(data->values, data->max, pdf_obj *);
+ }
+ data->values[data->size] = object;
+ data->size++;
+
+ return;
+}
+
+void
+pdf_put_array (pdf_obj *array, unsigned idx, pdf_obj *object)
+{
+ pdf_array *data;
+ long i;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = array->data;
+ if (idx + 1 > data->max) {
+ data->max += ARRAY_ALLOC_SIZE;
+ data->values = RENEW(data->values, data->max, pdf_obj *);
+ }
+ /*
+ * Rangecheck error in PostScript interpreters if
+ * idx > data->size - 1. But pdf_new_array() doesn't set
+ * array size, pdf_add_array() dynamically increases size
+ * of array. This might confusing...
+ */
+ if (idx + 1 > data->size) {
+ for (i = data->size; i < idx; i++)
+ data->values[i] = pdf_new_null(); /* release_array() won't work without this */
+ data->values[idx] = object;
+ data->size = idx + 1;
+ } else {
+ if (data->values[idx])
+ pdf_release_obj(data->values[idx]);
+ data->values[idx] = object;
+ }
+}
+
+/* Easily leaks memory... */
+pdf_obj *
+pdf_shift_array (pdf_obj *array)
+{
+ pdf_obj *result = NULL;
+ pdf_array *data;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = array->data;
+ if (data->size > 0) {
+ int i;
+
+ result = data->values[0];
+ for (i = 1; i < data->size; i++)
+ data->values[i-1] = data->values[i];
+ data->size--;
+ }
+
+ return result;
+}
+
+/* Prepend an object to an array */
+void
+pdf_unshift_array (pdf_obj *array, pdf_obj *object)
+{
+ pdf_array *data;
+ int i;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = array->data;
+ if (data->size >= data->max) {
+ data->max += ARRAY_ALLOC_SIZE;
+ data->values = RENEW(data->values, data->max, pdf_obj *);
+ }
+ for (i = 0; i < data->size; i++)
+ data->values[i+1] = data->values[i];
+ data->values[0] = object;
+ data->size++;
+}
+
+pdf_obj *
+pdf_pop_array (pdf_obj *array)
+{
+ pdf_obj *result;
+ pdf_array *data;
+
+ TYPECHECK(array, PDF_ARRAY);
+
+ data = array->data;
+ if (data->size > 0) {
+ result = data->values[data->size - 1];
+ data->size--;
+ } else {
+ result = NULL;
+ }
+
+ return result;
+}
+
+
+static void
+write_dict (pdf_dict *dict, FILE *file)
+{
+ pdf_out (file, "<<\n", 3); /* dropping \n saves few kb. */
+ while (dict->key != NULL) {
+ pdf_write_obj(dict->key, file);
+ if (((dict -> value)->type) == PDF_BOOLEAN ||
+ ((dict -> value)->type) == PDF_NUMBER ||
+ ((dict -> value)->type) == PDF_INDIRECT ||
+ ((dict -> value)->type) == PDF_NULL) {
+ pdf_out_white(file);
+ }
+ pdf_write_obj(dict->value, file);
+ pdf_out_char (file, '\n'); /* removing this saves few kb. */
+ dict = dict->next;
+ }
+ pdf_out(file, ">>", 2);
+}
+
+pdf_obj *
+pdf_new_dict (void)
+{
+ pdf_obj *result;
+ pdf_dict *data;
+
+ result = pdf_new_obj(PDF_DICT);
+ data = NEW(1, pdf_dict);
+ data->key = NULL;
+ data->value = NULL;
+ data->next = NULL;
+ result->data = data;
+
+ return result;
+}
+
+static void
+release_dict (pdf_dict *data)
+{
+ pdf_dict *next;
+
+ while (data != NULL && data->key != NULL) {
+ pdf_release_obj(data->key);
+ pdf_release_obj(data->value);
+ data->key = NULL;
+ data->value = NULL;
+ next = data->next;
+ RELEASE(data);
+ data = next;
+ }
+ RELEASE(data);
+}
+
+/* Array is ended by a node with NULL this pointer */
+void
+pdf_add_dict (pdf_obj *dict, pdf_obj *key, pdf_obj *value)
+{
+ pdf_dict *data;
+
+ TYPECHECK(dict, PDF_DICT);
+ TYPECHECK(key, PDF_NAME);
+
+ /* It seems that NULL is sometimes used for null object... */
+ if (value != NULL && INVALIDOBJ(value))
+ ERROR("pdf_add_dict(): Passed invalid value");
+
+ data = dict->data;
+ /* If this key already exists, simply replace the value */
+ while (data->key != NULL) {
+ if (!strcmp(pdf_name_value(key), pdf_name_value(data->key))) {
+ /* Release the old value */
+ pdf_release_obj(data->value);
+ /* Release the new key (we don't need it) */
+ pdf_release_obj(key);
+ data->value = value;
+ break;
+ }
+ data = data->next;
+ }
+ /*
+ * If we didn't find the key, build a new "end" node and add
+ * the new key just before the end
+ */
+ if (data->key == NULL) {
+ pdf_dict *new_node;
+
+ new_node = NEW (1, pdf_dict);
+ new_node->key = NULL;
+ new_node->value = NULL;
+ new_node->next = NULL;
+ data->next = new_node;
+ data->key = key;
+ data->value = value;
+ }
+}
+
+void
+pdf_put_dict (pdf_obj *dict, const char *key, pdf_obj *value)
+{
+ pdf_dict *data;
+
+ TYPECHECK(dict, PDF_DICT);
+
+ if (!key) {
+ ERROR("pdf_put_dict(): Passed invalid key.");
+ }
+ /* It seems that NULL is sometimes used for null object... */
+ if (value != NULL && INVALIDOBJ(value)) {
+ ERROR("pdf_add_dict(): Passed invalid value.");
+ }
+
+ data = dict->data;
+
+ while (data->key != NULL) {
+ if (!strcmp(key, pdf_name_value(data->key))) {
+ pdf_release_obj(data->value);
+ data->value = value;
+ break;
+ }
+ data = data->next;
+ }
+
+ /*
+ * If we didn't find the key, build a new "end" node and add
+ * the new key just before the end
+ */
+ if (data->key == NULL) {
+ pdf_dict *new_node;
+
+ new_node = NEW (1, pdf_dict);
+ new_node->key = NULL;
+ new_node->value = NULL;
+ new_node->next = NULL;
+ data->next = new_node;
+ data->key = pdf_new_name(key);
+ data->value = value;
+ }
+}
+
+/* pdf_merge_dict makes a link for each item in dict2 before stealing it */
+void
+pdf_merge_dict (pdf_obj *dict1, pdf_obj *dict2)
+{
+ pdf_dict *data;
+
+ TYPECHECK(dict1, PDF_DICT);
+ TYPECHECK(dict2, PDF_DICT);
+
+ data = dict2->data;
+ while (data->key != NULL) {
+ pdf_add_dict(dict1, pdf_link_obj(data->key), pdf_link_obj(data->value));
+ data = data->next;
+ }
+}
+
+int
+pdf_foreach_dict (pdf_obj *dict,
+ int (*proc) (pdf_obj *, pdf_obj *, void *), void *pdata)
+{
+ int error = 0;
+ pdf_dict *data;
+
+ ASSERT(proc);
+
+ TYPECHECK(dict, PDF_DICT);
+
+ data = dict->data;
+ while (!error &&
+ data->key != NULL) {
+ error = proc(data->key, data->value, pdata);
+ data = data->next;
+ }
+
+ return error;
+}
+
+#define pdf_match_name(o,s) ((o) && (s) && !strcmp(((pdf_name *)(o)->data)->name, (s)))
+pdf_obj *
+pdf_lookup_dict (pdf_obj *dict, const char *name)
+{
+ pdf_dict *data;
+
+ ASSERT(name);
+
+ TYPECHECK(dict, PDF_DICT);
+
+ data = dict->data;
+ while (data->key != NULL) {
+ if (!strcmp(name, pdf_name_value(data->key))) {
+ return data->value;
+ }
+ data = data->next;
+ }
+
+ return NULL;
+}
+
+/* Returns array of dictionary keys */
+pdf_obj *
+pdf_dict_keys (pdf_obj *dict)
+{
+ pdf_obj *keys;
+ pdf_dict *data;
+
+ TYPECHECK(dict, PDF_DICT);
+
+ keys = pdf_new_array();
+ for (data = dict->data; (data &&
+ data->key != NULL); data = data->next) {
+ /* We duplicate name object rather than linking keys.
+ * If we forget to free keys, broken PDF is generated.
+ */
+ pdf_add_array(keys, pdf_new_name(pdf_name_value(data->key)));
+ }
+
+ return keys;
+}
+
+void
+pdf_remove_dict (pdf_obj *dict, const char *name)
+{
+ pdf_dict *data, **data_p;
+
+ TYPECHECK(dict, PDF_DICT);
+
+ data = dict->data;
+ data_p = (pdf_dict **) &(dict->data);
+ while (data->key != NULL) {
+ if (pdf_match_name(data->key, name)) {
+ pdf_release_obj(data->key);
+ pdf_release_obj(data->value);
+ *data_p = data->next;
+ RELEASE(data);
+ break;
+ }
+ data_p = &(data->next);
+ data = data->next;
+ }
+
+ return;
+}
+
+pdf_obj *
+pdf_new_stream (int flags)
+{
+ pdf_obj *result;
+ pdf_stream *data;
+
+ result = pdf_new_obj(PDF_STREAM);
+ data = NEW(1, pdf_stream);
+ /*
+ * Although we are using an arbitrary pdf_object here, it must have
+ * type=PDF_DICT and cannot be an indirect reference. This will be
+ * checked by the output routine.
+ */
+ data->dict = pdf_new_dict();
+ data->_flags = flags;
+ data->stream = NULL;
+ data->stream_length = 0;
+ data->max_length = 0;
+
+ result->data = data;
+
+ return result;
+}
+
+static void
+write_stream (pdf_stream *stream, FILE *file)
+{
+ unsigned char *filtered;
+ unsigned long filtered_length;
+ unsigned long buffer_length;
+ unsigned char *buffer;
+
+ /*
+ * Always work from a copy of the stream. All filters read from
+ * "filtered" and leave their result in "filtered".
+ */
+#if 0
+ filtered = NEW(stream->stream_length + 1, unsigned char);
+#endif
+ filtered = NEW(stream->stream_length, unsigned char);
+ memcpy(filtered, stream->stream, stream->stream_length);
+ filtered_length = stream->stream_length;
+
+#if 0
+ if (stream->stream_length < 10)
+ stream->_flags &= ^STREAM_COMPRESS;
+#endif
+
+#ifdef HAVE_ZLIB
+ /* Apply compression filter if requested */
+ if (stream->stream_length > 0 &&
+ (stream->_flags & STREAM_COMPRESS) &&
+ compression_level > 0) {
+
+ buffer_length = filtered_length + filtered_length/1000 + 14;
+ buffer = NEW(buffer_length, unsigned char);
+ {
+ pdf_obj *filters;
+
+ filters = pdf_lookup_dict(stream->dict, "Filter");
+ if (!filters)
+ filters = pdf_new_array();
+ /*
+ * FlateDecode is the first filter to be applied to the stream.
+ */
+ pdf_unshift_array(filters, pdf_new_name("FlateDecode"));
+ pdf_add_dict(stream->dict, pdf_new_name("Filter"), filters);
+ }
+#ifdef HAVE_ZLIB_COMPRESS2
+ if (compress2(buffer, &buffer_length, filtered,
+ filtered_length, compression_level)) {
+ ERROR("Zlib error");
+ }
+#else
+ if (compress(buffer, &buffer_length, filtered,
+ filtered_length)) {
+ ERROR ("Zlib error");
+ }
+#endif /* HAVE_ZLIB_COMPRESS2 */
+ RELEASE(filtered);
+ compression_saved += filtered_length - buffer_length - strlen("/Filter [/FlateDecode]\n");
+
+ filtered = buffer;
+ filtered_length = buffer_length;
+ }
+#endif /* HAVE_ZLIB */
+
+#if 0
+ /*
+ * An optional end-of-line marker preceding the "endstream" is
+ * not part of stream data. See, PDF Reference 4th ed., p. 38.
+ */
+ /* Add a '\n' if the last character wasn't one */
+ if (filtered_length > 0 &&
+ filtered[filtered_length-1] != '\n') {
+ filtered[filtered_length] = '\n';
+ filtered_length++;
+ }
+#endif
+ pdf_add_dict(stream->dict,
+ pdf_new_name("Length"), pdf_new_number(filtered_length));
+
+ pdf_write_obj(stream->dict, file);
+
+ pdf_out(file, "\nstream\n", 8);
+ pdf_encrypt_data(filtered, filtered_length);
+ if (filtered_length > 0) {
+ pdf_out(file, filtered, filtered_length);
+ }
+ RELEASE(filtered);
+
+ /*
+ * This stream length "object" gets reset every time write_stream is
+ * called for the stream object.
+ * If this stream gets written more than once with different
+ * filters, this could be a problem.
+ */
+
+ pdf_out(file, "\n", 1);
+ pdf_out(file, "endstream", 9);
+}
+
+static void
+release_stream (pdf_stream *stream)
+{
+ pdf_release_obj(stream->dict);
+ stream->dict = NULL;
+
+ if (stream->stream) {
+ RELEASE(stream->stream);
+ stream->stream = NULL;
+ }
+ RELEASE(stream);
+}
+
+pdf_obj *
+pdf_stream_dict (pdf_obj *stream)
+{
+ pdf_stream *data;
+
+ TYPECHECK(stream, PDF_STREAM);
+
+ data = stream->data;
+
+ return data->dict;
+}
+
+const void *
+pdf_stream_dataptr (pdf_obj *stream)
+{
+ pdf_stream *data;
+
+ TYPECHECK(stream, PDF_STREAM);
+
+ data = stream->data;
+
+ return (const void *) data->stream;
+}
+
+long
+pdf_stream_length (pdf_obj *stream)
+{
+ pdf_stream *data;
+
+ TYPECHECK(stream, PDF_STREAM);
+
+ data = stream->data;
+
+ return (long) data->stream_length;
+}
+
+void
+pdf_add_stream (pdf_obj *stream, const void *stream_data, long length)
+{
+ pdf_stream *data;
+
+ TYPECHECK(stream, PDF_STREAM);
+
+ if (length < 1)
+ return;
+ data = stream->data;
+ if (data->stream_length + length > data->max_length) {
+ data->max_length += length + STREAM_ALLOC_SIZE;
+ data->stream = RENEW(data->stream, data->max_length, unsigned char);
+ }
+ memcpy(data->stream + data->stream_length, stream_data, length);
+ data->stream_length += length;
+}
+
+void
+pdf_stream_set_flags (pdf_obj *stream, int flags)
+{
+ pdf_stream *data;
+
+ TYPECHECK(stream, PDF_STREAM);
+
+ data = stream->data;
+ data->_flags = flags;
+}
+
+int
+pdf_stream_get_flags (pdf_obj *stream)
+{
+ pdf_stream *data;
+
+ TYPECHECK(stream, PDF_STREAM);
+
+ data = stream->data;
+
+ return data->_flags;
+}
+
+static void
+pdf_write_obj (pdf_obj *object, FILE *file)
+{
+ if (object == NULL) {
+ write_null(NULL, file);
+ return;
+ }
+
+ if (INVALIDOBJ(object))
+ ERROR("pdf_write_obj: Invalid object, type = %d\n", object->type);
+
+ if (file == stderr)
+ fprintf(stderr, "{%d}", object->refcount);
+
+ switch (object->type) {
+ case PDF_BOOLEAN:
+ write_boolean(object->data, file);
+ break;
+ case PDF_NUMBER:
+ write_number (object->data, file);
+ break;
+ case PDF_STRING:
+ write_string (object->data, file);
+ break;
+ case PDF_NAME:
+ write_name(object->data, file);
+ break;
+ case PDF_ARRAY:
+ write_array(object->data, file);
+ break;
+ case PDF_DICT:
+ write_dict (object->data, file);
+ break;
+ case PDF_STREAM:
+ write_stream(object->data, file);
+ break;
+ case PDF_NULL:
+ write_null(NULL, file);
+ break;
+ case PDF_INDIRECT:
+ write_indirect(object->data, file);
+ break;
+ }
+}
+
+/* Write the object to the file */
+static void
+pdf_flush_obj (pdf_obj *object, FILE *file)
+{
+ long length;
+
+ /*
+ * Record file position. No object is numbered 0, so subtract 1
+ * when using as an array index
+ */
+ output_xref[object->label-1].file_position = pdf_output_file_position;
+ length = sprintf(format_buffer, "%lu %d obj\n", object->label, object->generation);
+ pdf_enc_set_label(object->label);
+ pdf_enc_set_generation(object->generation);
+ pdf_out(file, format_buffer, length);
+ pdf_write_obj(object, file);
+ pdf_out(file, "\nendobj\n", 8);
+}
+
+void
+pdf_release_obj (pdf_obj *object)
+{
+ if (object == NULL)
+ return;
+ if (INVALIDOBJ(object) || object->refcount <= 0) {
+ MESG("\npdf_release_obj: object=%p, type=%d, refcount=%d\n",
+ object, object->type, object->refcount);
+ pdf_write_obj(object, stderr);
+ ERROR("pdf_release_obj: Called with invalid object.");
+ }
+ object->refcount -= 1;
+ if (object->refcount == 0) {
+ /*
+ * Nothing is using this object so it's okay to remove it.
+ * Nonzero "label" means object needs to be written before it's destroyed.
+ */
+ if (object->label && pdf_output_file != NULL) {
+ pdf_flush_obj(object, pdf_output_file);
+ }
+ switch (object->type) {
+ case PDF_BOOLEAN:
+ release_boolean(object->data);
+ break;
+ case PDF_NULL:
+ release_null(object->data);
+ break;
+ case PDF_NUMBER:
+ release_number(object->data);
+ break;
+ case PDF_STRING:
+ release_string(object->data);
+ break;
+ case PDF_NAME:
+ release_name(object->data);
+ break;
+ case PDF_ARRAY:
+ release_array(object->data);
+ break;
+ case PDF_DICT:
+ release_dict(object->data);
+ break;
+ case PDF_STREAM:
+ release_stream(object->data);
+ break;
+ case PDF_INDIRECT:
+ release_indirect(object->data);
+ break;
+ }
+ /* This might help detect freeing already freed objects */
+ object->type = -1;
+ object->data = NULL;
+ RELEASE(object);
+ }
+}
+
+/* Copy object data without changing object label. */
+void
+pdf_copy_object (pdf_obj *dst, pdf_obj *src)
+{
+ if (!dst || !src)
+ return;
+
+ switch (dst->type) {
+ case PDF_BOOLEAN: release_boolean(dst->data); break;
+ case PDF_NULL: release_null(dst->data); break;
+ case PDF_NUMBER: release_number(dst->data); break;
+ case PDF_STRING: release_string(dst->data); break;
+ case PDF_NAME: release_name(dst->data); break;
+ case PDF_ARRAY: release_array(dst->data); break;
+ case PDF_DICT: release_dict(dst->data); break;
+ case PDF_STREAM: release_stream(dst->data); break;
+ case PDF_INDIRECT: release_indirect(dst->data); break;
+ }
+
+ dst->type = src->type;
+ switch (src->type) {
+ case PDF_BOOLEAN:
+ dst->data = NEW(1, pdf_boolean);
+ pdf_set_boolean(dst, pdf_boolean_value(src));
+ break;
+ case PDF_NULL:
+ dst->data = NULL;
+ break;
+ case PDF_NUMBER:
+ dst->data = NEW(1, pdf_number);
+ pdf_set_number(dst, pdf_number_value(src));
+ break;
+ case PDF_STRING:
+ dst->data = NEW(1, pdf_string);
+ pdf_set_string(dst,
+ pdf_string_value(src),
+ pdf_string_length(src));
+ break;
+ case PDF_NAME:
+ dst->data = NEW(1, pdf_name);
+ pdf_set_name(dst, pdf_name_value(src));
+ break;
+ case PDF_ARRAY:
+ {
+ pdf_array *data;
+ unsigned long i;
+
+ dst->data = data = NEW(1, pdf_array);
+ data->size = 0;
+ data->max = 0;
+ data->values = NULL;
+ for (i = 0; i < pdf_array_length(src); i++) {
+ pdf_add_array(dst, pdf_link_obj(pdf_get_array(src, i)));
+ }
+ }
+ break;
+ case PDF_DICT:
+ {
+ pdf_dict *data;
+
+ dst->data = data = NEW(1, pdf_dict);
+ data->key = NULL;
+ data->value = NULL;
+ data->next = NULL;
+ pdf_merge_dict(dst, src);
+ }
+ break;
+ case PDF_STREAM:
+ {
+ pdf_stream *data;
+
+ dst->data = data = NEW(1, pdf_stream);
+ data->dict = pdf_new_dict();
+ data->_flags = ((pdf_stream *)src->data)->_flags;
+ data->stream_length = 0;
+ data->max_length = 0;
+
+ pdf_add_stream(dst, pdf_stream_dataptr(src), pdf_stream_length(src));
+ pdf_merge_dict(data->dict, pdf_stream_dict(src));
+ }
+ break;
+ case PDF_INDIRECT:
+ {
+ pdf_indirect *data;
+
+ dst->data = data = NEW(1, pdf_indirect);
+ data->label = ((pdf_indirect *) (src->data))->label;
+ data->generation = ((pdf_indirect *) (src->data))->generation;
+ data->dirty = ((pdf_indirect *) (src->data))->dirty;
+ data->dirty_file = ((pdf_indirect *) (src->data))->dirty_file;
+ }
+ break;
+ }
+
+ return;
+}
+
+static int
+backup_line (void)
+{
+ int ch = -1;
+
+ /*
+ * Note: this code should work even if \r\n is eol. It could fail on a
+ * machine where \n is eol and there is a \r in the stream --- Highly
+ * unlikely in the last few bytes where this is likely to be used.
+ */
+ if (tell_position(pdf_input_file) > 1)
+ do {
+ seek_relative (pdf_input_file, -2);
+ } while (tell_position(pdf_input_file) > 0 &&
+ (ch = fgetc(pdf_input_file)) >= 0 &&
+ (ch != '\n' && ch != '\r' ));
+ if (ch < 0) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static unsigned long pdf_file_size = 0;
+
+static long
+find_xref (void)
+{
+ long xref_pos;
+ int tries = 10;
+
+ seek_end(pdf_input_file);
+
+ pdf_file_size = tell_position(pdf_input_file);
+ do {
+ long currentpos;
+
+ if (!backup_line()) {
+ tries = 0;
+ break;
+ }
+ currentpos = tell_position(pdf_input_file);
+ fread(work_buffer, sizeof(char), strlen("startxref"), pdf_input_file);
+ seek_absolute(pdf_input_file, currentpos);
+ tries--;
+ } while (tries > 0 &&
+ strncmp(work_buffer, "startxref", strlen("startxref")));
+ if (tries <= 0)
+ return 0;
+
+ /* Skip rest of this line */
+ mfgets(work_buffer, WORK_BUFFER_SIZE, pdf_input_file);
+ /* Next line of input file should contain actual xref location */
+ mfgets(work_buffer, WORK_BUFFER_SIZE, pdf_input_file);
+
+ {
+ char *start, *end, *number;
+
+ start = work_buffer;
+ end = start + strlen(work_buffer);
+ skip_white(&start, end);
+ number = parse_number(&start, end);
+ xref_pos = (long) atof(number);
+ RELEASE(number);
+ }
+
+ return xref_pos;
+}
+
+/*
+ * This routine must be called with the file pointer located
+ * at the start of the trailer.
+ */
+static pdf_obj *
+parse_trailer (void)
+{
+ pdf_obj *result;
+ /*
+ * Fill work_buffer and hope trailer fits. This should
+ * be made a bit more robust sometime.
+ */
+ if (fread(work_buffer, sizeof(char),
+ WORK_BUFFER_SIZE, pdf_input_file) == 0 ||
+ strncmp(work_buffer, "trailer", strlen("trailer"))) {
+ WARN("No trailer. Are you sure this is a PDF file?");
+ WARN("buffer:\n->%s<-\n", work_buffer);
+ result = NULL;
+ } else {
+ char *p = work_buffer + strlen("trailer");
+ skip_white(&p, work_buffer + WORK_BUFFER_SIZE);
+ result = parse_pdf_dict(&p, work_buffer + WORK_BUFFER_SIZE);
+ }
+
+ return result;
+}
+
+struct object
+{
+ unsigned long file_position;
+ unsigned generation;
+ /*
+ * Object numbers in original file and new file must have different
+ * object numbers.
+ * new_ref provides a reference for the object in the new file object
+ * space. When it is first set, an object in the old file is copied
+ * to the new file with a new number. new_ref remains set until the
+ * file is closed so that future references can access the object via
+ * new_ref instead of copying the object again.
+ */
+ pdf_obj *direct;
+ pdf_obj *indirect;
+ int used;
+} *xref_table = NULL;
+long num_input_objects;
+
+/*
+ * This routine tries to estimate an upper bound for character position
+ * of the end of the object, so it knows how big the buffer must be.
+ * The parsing routines require that the entire object be read into
+ * memory. It would be a major pain to rewrite them. The worst case
+ * is that an object before an xref table will grab the whole table
+ * :-(
+ */
+static long
+next_object_offset (unsigned long obj_num)
+{
+ long next = pdf_file_size; /* Worst case */
+ long i, curr;
+
+ curr = xref_table[obj_num].file_position;
+ /* Check all other objects to find next one */
+ for (i = 0; i < num_input_objects; i++) {
+ if (xref_table[i].used &&
+ xref_table[i].file_position > curr &&
+ xref_table[i].file_position < next)
+ next = xref_table[i].file_position;
+ }
+
+ return next;
+}
+
+#define checklabel(n,g) ((n) > 0 && (n) < num_input_objects && \
+ xref_table[(n)].generation == (g))
+#define labelfreed(n,g) (!xref_table[(n)].used)
+
+/*
+ * The following routine returns a reference to an object existing
+ * only in the input file. It does this as follows. If the object
+ * has never been referenced before, it reads the object
+ * in and creates a reference to it. Then it writes
+ * the object out, keeping the existing reference. If the
+ * object has been read in (and written out) before, it simply
+ * returns the retained existing reference to that object
+ */
+static pdf_obj *
+pdf_ref_file_obj (unsigned long obj_num, unsigned obj_gen)
+{
+ pdf_obj *obj, *ref;
+
+ if (!checklabel(obj_num, obj_gen)) {
+ WARN("Can't resolve object: %lu %u",
+ obj_num, obj_gen);
+ return NULL;
+ }
+ ref = xref_table[obj_num].indirect;
+ if (ref != NULL)
+ return pdf_link_obj(ref);
+
+ obj = pdf_read_object(obj_num, obj_gen);
+ if (!obj) {
+ WARN("Could not read object: %lu %u",
+ obj_num, obj_gen);
+ return NULL;
+ }
+
+ ref = pdf_ref_obj(obj);
+ xref_table[obj_num].indirect = ref;
+ xref_table[obj_num].direct = obj;
+ /* Make sure the caller doesn't free this object */
+
+ return pdf_link_obj(ref);
+}
+
+
+pdf_obj *
+pdf_new_ref (unsigned long obj_num, int obj_gen)
+{
+ pdf_obj *result;
+ pdf_indirect *indirect;
+
+ if (!checklabel(obj_num, obj_gen)) {
+ WARN("Invalid object label: %lu %d", obj_num, obj_gen);
+ return NULL;
+ }
+ result = pdf_new_obj(PDF_INDIRECT);
+ indirect = NEW(1, pdf_indirect);
+ result->data = indirect;
+ indirect->label = obj_num;
+ indirect->generation = obj_gen;
+ indirect->dirty = 1;
+ indirect->dirty_file = pdf_input_file;
+
+ return result;
+}
+
+
+/* Label without corresponding object definition should
+ * be replaced with "null". But we won't do that.
+ */
+static pdf_obj *
+pdf_read_object (unsigned long obj_num, unsigned obj_gen)
+{
+ pdf_obj *result;
+ long offset, limit, length;
+ char *buffer, *p, *endptr;
+
+ if (!checklabel(obj_num, obj_gen)) {
+ WARN("Trying to read nonexistent object: %lu %u",
+ obj_num, obj_gen);
+ return NULL;
+ }
+ if (labelfreed(obj_num, obj_gen)) {
+ WARN("Trying to read deleted object: %lu %u",
+ obj_num, obj_gen);
+ return NULL;
+ }
+ offset = xref_table[obj_num].file_position;
+ limit = next_object_offset(obj_num);
+ length = limit - offset;
+
+ if (length <= 0)
+ return NULL;
+
+ buffer = NEW(length + 1, char);
+
+ seek_absolute(pdf_input_file, offset);
+ fread(buffer, sizeof(char), length, pdf_input_file);
+
+ p = buffer;
+ endptr = p + length;
+
+ /* Check for obj_num and obj_gen */
+ {
+ char *q = p; /* <== p */
+ char *sp;
+ unsigned long n, g;
+
+ skip_white(&q, endptr);
+ sp = parse_unsigned(&q, endptr);
+ if (!sp) {
+ RELEASE(buffer);
+ return NULL;
+ }
+ n = strtoul(sp, NULL, 10);
+ RELEASE(sp);
+
+ skip_white(&q, endptr);
+ sp = parse_unsigned(&q, endptr);
+ if (!sp) {
+ RELEASE(buffer);
+ return NULL;
+ }
+ g = strtoul(sp, NULL, 10);
+ RELEASE(sp);
+
+ if (n != obj_num || g != obj_gen) {
+ RELEASE(buffer);
+ return NULL;
+ }
+
+ p = q; /* ==> p */
+ }
+
+
+ skip_white(&p, endptr);
+ if (memcmp(p, "obj", strlen("obj"))) {
+ WARN("Didn't find \"obj\".");
+ RELEASE(buffer);
+ return NULL;
+ }
+ p += strlen("obj");
+
+ result = parse_pdf_object(&p, endptr);
+
+ skip_white(&p, endptr);
+ if (memcmp(p, "endobj", strlen("endobj"))) {
+ WARN("Didn't find \"endobj\".");
+ if (result)
+ pdf_release_obj(result);
+ result = NULL;
+ }
+ RELEASE(buffer);
+
+ return result;
+}
+
+/* pdf_deref_obj always returns a link instead of the original */
+pdf_obj *
+pdf_deref_obj (pdf_obj *obj)
+{
+ pdf_obj *result;
+
+ if (obj == NULL)
+ return NULL;
+ else if (pdf_obj_typeof(obj) != PDF_INDIRECT) {
+ return pdf_link_obj(obj);
+ }
+
+#define OBJ_NUM(o) (((pdf_indirect *)((o)->data))->label)
+#define OBJ_GEN(o) (((pdf_indirect *)((o)->data))->generation)
+#define ISDIRTY(o) (((pdf_indirect *)((o)->data))->dirty)
+#define OBJ_SRC(o) (((pdf_indirect *)((o)->data))->dirty_file)
+ if (!ISDIRTY(obj))
+ ERROR("Tried to deref a non-file object");
+ result = pdf_read_object(OBJ_NUM(obj), OBJ_GEN(obj));
+ while (result &&
+ pdf_obj_typeof(result) == PDF_INDIRECT
+ ) {
+ pdf_obj *tmp;
+
+ tmp = pdf_read_object(OBJ_NUM(result), OBJ_GEN(result));
+ pdf_release_obj(result);
+ result = tmp;
+ }
+
+ return result;
+}
+
+static void
+extend_xref (long new_size)
+{
+ unsigned long i;
+
+ xref_table = RENEW(xref_table, new_size, struct object);
+ for (i = num_input_objects; i < new_size; i++) {
+ xref_table[i].direct = NULL;
+ xref_table[i].indirect = NULL;
+ xref_table[i].used = 0;
+ xref_table[i].file_position = 0L;
+ }
+ num_input_objects = new_size;
+}
+
+static int
+parse_xref (void)
+{
+ unsigned long first, size;
+ unsigned long i, offset;
+ unsigned int obj_gen;
+ char flag;
+ int r;
+
+ /*
+ * This routine reads one xref segment. It must be called positioned
+ * at the beginning of an xref table. It may be called multiple times
+ * on the same file. xref tables sometimes come in pieces.
+ */
+ mfgets(work_buffer, WORK_BUFFER_SIZE, pdf_input_file);
+ if (memcmp(work_buffer, "xref", strlen("xref"))) {
+ WARN("No xref. Are you sure this is a PDF file?");
+ return 0;
+ }
+ /* Next line in file has first item and size of table */
+ for (;;) {
+ unsigned long current_pos;
+
+ current_pos = tell_position(pdf_input_file);
+ if (mfgets(work_buffer, WORK_BUFFER_SIZE, pdf_input_file) == NULL)
+ ERROR("parse_xref: premature end of PDF file while parsing xref");
+ if (!strncmp(work_buffer, "trailer", strlen ("trailer"))) {
+ /*
+ * Backup... This is ugly, but it seems like the safest thing to
+ * do. It is possible the trailer dictionary starts on the same
+ * logical line as the word trailer. In that case, the mfgets
+ * call might have started to read the trailer dictionary and
+ * parse_trailer would fail.
+ */
+ seek_absolute(pdf_input_file, current_pos);
+ break;
+ }
+ sscanf(work_buffer, "%lu %lu", &first, &size);
+ if (num_input_objects < first + size) {
+ extend_xref (first + size);
+ }
+
+ for (i = first; i < first + size; i++) {
+ fread(work_buffer, sizeof(char), 20, pdf_input_file);
+ /*
+ * Don't overwrite positions that have already been set by a
+ * modified xref table. We are working our way backwards
+ * through the reference table, so we only set "position"
+ * if it hasn't been set yet.
+ */
+#define POSITION_UNSET(t,n) ((t)[(n)].file_position == 0)
+#define SET_XREF_ENTRY(t,n,o,g) \
+do { \
+ (t)[(n)].file_position = (o); \
+ (t)[(n)].generation = (g); \
+} while (0)
+#define SET_XREF_FLAG(t,n,f) ((t)[(n)].used = ((f) == 'n') ? 1 : 0)
+ work_buffer[19] = 0;
+ offset = 0UL; obj_gen = 0; flag = 0;
+ r = sscanf(work_buffer, "%010lu %05u %c", &offset, &obj_gen, &flag);
+ if ( r != 3 ||
+ ((flag != 'n' && flag != 'f') ||
+ (flag == 'n' &&
+ (offset >= pdf_file_size || (offset > 0 && offset < 4))))) {
+ WARN("Invalid xref table entry [%lu]. PDF file is corrupt...", i);
+ return 0;
+ }
+ if (POSITION_UNSET(xref_table, i))
+ SET_XREF_ENTRY(xref_table, i, offset, obj_gen);
+ SET_XREF_FLAG(xref_table, i, flag);
+ }
+ }
+
+ return 1;
+}
+
+static pdf_obj *
+read_xref (void)
+{
+ pdf_obj *main_trailer;
+ long xref_pos;
+
+ xref_pos = find_xref();
+ if (xref_pos == 0) {
+ WARN("Can't find xref table.");
+ return NULL;
+ }
+
+ /* Read primary xref table */
+ seek_absolute(pdf_input_file, xref_pos);
+ if (!parse_xref()) {
+ WARN("Couldn't read xref table. Is this a correct PDF file?");
+ return NULL;
+ }
+ main_trailer = parse_trailer();
+ if (main_trailer == NULL) {
+ WARN("Couldn't read xref trailer. Is this a correct PDF file?");
+ return NULL;
+ }
+
+ {
+ pdf_obj *xref_size;
+
+ xref_size = pdf_lookup_dict(main_trailer, "Size");
+ if (xref_size == NULL ||
+ pdf_lookup_dict(main_trailer, "Root") == NULL) {
+ WARN("Trailer doesn't have catalog or a size. Is this a correct PDF file?");
+ return NULL;
+ }
+ if (num_input_objects < pdf_number_value(xref_size)) {
+ extend_xref((long)pdf_number_value(xref_size));
+ }
+ }
+
+ /* Read any additional xref tables */
+ {
+ pdf_obj *prev_trailer, *prev_xref;
+
+ prev_trailer = pdf_link_obj(main_trailer);
+ while ((prev_xref = pdf_lookup_dict(prev_trailer, "Prev")) != NULL) {
+ xref_pos = (long) pdf_number_value(prev_xref);
+ seek_absolute(pdf_input_file, xref_pos);
+ pdf_release_obj(prev_trailer);
+ if (!parse_xref()) {
+ WARN("Couldn't read xref table. Is this a correct PDF file?");
+ return NULL;
+ }
+ prev_trailer = parse_trailer();
+ if (prev_trailer == NULL) {
+ WARN("Couldn't read xref trailer. Is this a correct PDF file?");
+ return NULL;
+ }
+ }
+ pdf_release_obj(prev_trailer);
+ }
+
+ return main_trailer;
+}
+
+static char any_open = 0;
+
+pdf_obj *
+pdf_open (FILE *file)
+{
+ pdf_obj *trailer;
+
+ if (any_open) {
+ WARN("Only one PDF file may be open at one time.");
+ exit(1);
+ }
+ pdf_input_file = file;
+ if (!check_for_pdf(pdf_input_file)) {
+ WARN("pdf_open: Not a PDF 1.[1-3] file.");
+ return NULL;
+ }
+ if ((trailer = read_xref()) == NULL) {
+ WARN("No trailer.");
+ pdf_close();
+ return NULL;
+ }
+ any_open = 1;
+
+ return trailer;
+}
+
+void
+pdf_close (void)
+{
+ unsigned long i;
+ int done;
+
+ /*
+ * Following loop must be iterated because each write could trigger
+ * an additional indirect reference of an object with a lower number!
+ */
+ do {
+ done = 1;
+ for (i = 0; i < num_input_objects; i++) {
+ if (xref_table[i].direct != NULL) {
+ pdf_release_obj(xref_table[i].direct);
+ xref_table[i].direct = NULL;
+ done = 0;
+ }
+ }
+ } while (!done);
+ /*
+ * Now take care of the indirect objects. They had to be left around
+ * until all the direct objects were flushed.
+ */
+ for (i = 0; i < num_input_objects; i++) {
+ if (xref_table[i].indirect != NULL) {
+ pdf_release_obj(xref_table[i].indirect);
+ }
+ }
+ RELEASE(xref_table);
+ xref_table = NULL;
+ num_input_objects = 0;
+ any_open = 0;
+ pdf_input_file = NULL;
+}
+
+int
+check_for_pdf (FILE *file)
+{
+ int result = 0;
+
+ rewind(file);
+ if (fread(work_buffer, sizeof(char), strlen("%PDF-1.x"), file) ==
+ strlen("%PDF-1.x") &&
+ !strncmp(work_buffer, "%PDF-1.", strlen("%PDF-1."))) {
+ if (work_buffer[7] >= '0' && work_buffer[7] <= '0' + pdf_version)
+ result = 1;
+ else {
+ WARN("Version of PDF file (1.%c) is newer than version limit specification.",
+ work_buffer[7]);
+ }
+ }
+
+ return result;
+}
+
+static int CDECL
+import_dict (pdf_obj *key, pdf_obj *value, void *pdata)
+{
+ pdf_obj *copy;
+ pdf_obj *tmp;
+
+ copy = (pdf_obj *) pdata;
+
+ tmp = pdf_import_object(value);
+ if (!tmp) {
+ return -1;
+ }
+ pdf_add_dict(copy, pdf_link_obj(key), tmp);
+
+ return 0;
+}
+
+pdf_obj *
+pdf_import_object (pdf_obj *object)
+{
+ pdf_obj *imported;
+ pdf_obj *tmp;
+ int i;
+
+ switch (pdf_obj_typeof(object)) {
+
+ case PDF_INDIRECT:
+ if (ISDIRTY(object)) {
+ if (OBJ_SRC(object) != pdf_input_file) {
+ WARN("Different file is opened before object is imported?");
+ return NULL;
+ }
+ imported = pdf_ref_file_obj(OBJ_NUM(object), OBJ_GEN(object));
+ } else {
+ imported = pdf_link_obj(object);
+ }
+ break;
+
+ case PDF_STREAM:
+ {
+ pdf_obj *stream_dict;
+
+ tmp = pdf_import_object(pdf_stream_dict(object));
+ if (!tmp)
+ return NULL;
+
+ imported = pdf_new_stream(0);
+ stream_dict = pdf_stream_dict(imported);
+ pdf_merge_dict(stream_dict, tmp);
+ pdf_release_obj(tmp);
+ pdf_add_stream(imported,
+ pdf_stream_dataptr(object),
+ pdf_stream_length(object));
+ }
+ break;
+
+ case PDF_DICT:
+
+ imported = pdf_new_dict();
+ if (pdf_foreach_dict(object, import_dict, imported) < 0) {
+ pdf_release_obj(imported);
+ return NULL;
+ }
+
+ break;
+
+ case PDF_ARRAY:
+
+ imported = pdf_new_array();
+ for (i = 0; i < pdf_array_length(object); i++) {
+ tmp = pdf_import_object(pdf_get_array(object, i));
+ if (!tmp) {
+ pdf_release_obj(imported);
+ return NULL;
+ }
+ pdf_add_array(imported, tmp);
+ }
+ break;
+
+ default:
+ imported = pdf_link_obj(object);
+ }
+
+ return imported;
+}
+
+
+int
+pdf_compare_reference (pdf_obj *ref1, pdf_obj *ref2)
+{
+ pdf_indirect *data1, *data2;
+
+ if (!PDF_OBJ_INDIRECTTYPE(ref1) ||
+ !PDF_OBJ_INDIRECTTYPE(ref2)) {
+ ERROR("Not indirect reference...");
+ }
+
+ data1 = (pdf_indirect *) ref1->data;
+ data2 = (pdf_indirect *) ref2->data;
+
+ if (data1->dirty != data2->dirty)
+ return (int) (data1->dirty - data2->dirty);
+ if (data1->dirty_file != data2->dirty_file)
+ return (int) (data1->dirty_file - data2->dirty_file);
+ if (data1->label != data2->label)
+ return (int) (data1->label - data2->label);
+ if (data1->generation != data2->generation)
+ return (int) (data1->generation - data2->generation);
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfobj.h b/Build/source/texk/xdvipdfmx/src/pdfobj.h
new file mode 100644
index 00000000000..9ca8df47b7e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfobj.h
@@ -0,0 +1,177 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.h,v 1.21 2005/05/04 16:10:06 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFOBJ_H_
+#define _PDFOBJ_H_
+
+#include <stdio.h>
+
+/* Here is the complete list of PDF object types */
+
+#define PDF_BOOLEAN 1
+#define PDF_NUMBER 2
+#define PDF_STRING 3
+#define PDF_NAME 4
+#define PDF_ARRAY 5
+#define PDF_DICT 6
+#define PDF_STREAM 7
+#define PDF_NULL 8
+#define PDF_INDIRECT 9
+
+#define PDF_OBJ_INVALID 0
+#define PDF_UNDEFINED PDF_OBJ_INVALID
+
+#define STREAM_COMPRESS (1 << 0)
+
+typedef struct pdf_obj pdf_obj;
+
+/* External interface to pdf routines */
+
+extern void pdf_obj_set_verbose (void);
+extern void pdf_error_cleanup (void);
+
+extern void pdf_out_init (const char *filename);
+extern void pdf_out_flush (void);
+extern void pdf_set_version (unsigned version);
+extern unsigned pdf_get_version (void);
+
+extern pdf_obj *pdf_new_obj (int type);
+extern void pdf_release_obj (pdf_obj *object);
+extern int pdf_obj_typeof (pdf_obj *object);
+
+#define PDF_OBJ_NUMBERTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_NUMBER)
+#define PDF_OBJ_BOOLEANTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_BOOLEAN)
+#define PDF_OBJ_STRINGTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_STRING)
+#define PDF_OBJ_NAMETYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_NAME)
+#define PDF_OBJ_ARRAYTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_ARRAY)
+#define PDF_OBJ_NULLTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_NULL)
+#define PDF_OBJ_DICTTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_DICT)
+#define PDF_OBJ_STREAMTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_STREAM)
+#define PDF_OBJ_INDIRECTTYPE(o) ((o) && pdf_obj_typeof((o)) == PDF_INDIRECT)
+
+#define PDF_OBJ_TYPEOF(o) pdf_obj_typeof((o))
+
+
+extern pdf_obj *pdf_ref_obj (pdf_obj *object);
+extern pdf_obj *pdf_link_obj (pdf_obj *object);
+
+extern pdf_obj *pdf_new_null (void);
+
+extern pdf_obj *pdf_new_boolean (char value);
+extern void pdf_set_boolean (pdf_obj *object, char value);
+extern char pdf_boolean_value (pdf_obj *object);
+
+extern pdf_obj *pdf_new_number (double value);
+extern void pdf_set_number (pdf_obj *object, double value);
+extern double pdf_number_value (pdf_obj *number);
+
+extern pdf_obj *pdf_new_string (const void *str, unsigned length);
+extern void pdf_set_string (pdf_obj *object, unsigned char *str, unsigned length);
+extern void *pdf_string_value (pdf_obj *object);
+extern unsigned pdf_string_length (pdf_obj *object);
+
+/* Name does not include the / */
+extern pdf_obj *pdf_new_name (const char *name);
+extern void pdf_set_name (pdf_obj *object, const char *name);
+extern char *pdf_name_value (pdf_obj *object);
+
+extern pdf_obj *pdf_new_array (void);
+/* pdf_add_dict requires key but pdf_add_array does not.
+ * pdf_add_array always append elements to array.
+ * They should be pdf_put_array(array, idx, element) and
+ * pdf_put_dict(dict, key, value)
+ */
+extern void pdf_add_array (pdf_obj *array, pdf_obj *object);
+extern void pdf_put_array (pdf_obj *array, unsigned idx, pdf_obj *object);
+extern pdf_obj *pdf_get_array (pdf_obj *array, long idx);
+extern unsigned pdf_array_length (pdf_obj *array);
+
+extern void pdf_unshift_array (pdf_obj *array, pdf_obj *object);
+extern pdf_obj *pdf_shift_array (pdf_obj *array);
+extern pdf_obj *pdf_pop_array (pdf_obj *array);
+
+extern pdf_obj *pdf_new_dict (void);
+extern void pdf_remove_dict (pdf_obj *dict, const char *key);
+extern void pdf_merge_dict (pdf_obj *dict1, pdf_obj *dict2);
+extern pdf_obj *pdf_lookup_dict (pdf_obj *dict, const char *key);
+extern pdf_obj *pdf_dict_keys (pdf_obj *dict);
+
+/* pdf_add_dict() want pdf_obj as key, however, key must always be name
+ * object and pdf_lookup_dict() and pdf_remove_dict() uses const char as
+ * key. This strange difference seems come from pdfdoc that first allocate
+ * name objects frequently used (maybe 1000 times) such as /Type and does
+ * pdf_link_obj() it rather than allocate/free-ing them each time. But I
+ * already removed that.
+ */
+extern void pdf_add_dict (pdf_obj *dict, pdf_obj *key, pdf_obj *value);
+extern void pdf_put_dict (pdf_obj *dict, const char *key, pdf_obj *value);
+
+/* Apply proc(key, value, pdata) for each key-value pairs in dict, stop if proc()
+ * returned non-zero value (and that value is returned). PDF object is passed for
+ * key to allow modification (fix) of key.
+ */
+extern int pdf_foreach_dict (pdf_obj *dict,
+ int (*proc) (pdf_obj *, pdf_obj *, void *),
+ void *pdata);
+
+extern pdf_obj *pdf_new_stream (int flags);
+extern void pdf_add_stream (pdf_obj *stream,
+ const void *stream_data_ptr,
+ long stream_data_len);
+extern pdf_obj *pdf_stream_dict (pdf_obj *stream);
+extern long pdf_stream_length (pdf_obj *stream);
+extern void pdf_stream_set_flags (pdf_obj *stream, int flags);
+extern int pdf_stream_get_flags (pdf_obj *stream);
+extern const void *pdf_stream_dataptr (pdf_obj *stream);
+
+#if 0
+extern int pdf_stream_pop_filter (pdf_obj *stream);
+#endif
+
+/* Compare label of two indirect reference object.
+ */
+extern int pdf_compare_reference (pdf_obj *ref1, pdf_obj *ref2);
+
+/* The following routines are not appropriate for pdfobj.
+ */
+
+extern void pdf_set_compression (int level);
+
+extern void pdf_set_info (pdf_obj *obj);
+extern void pdf_set_root (pdf_obj *obj);
+extern void pdf_set_encrypt (pdf_obj *obj);
+
+extern int check_for_pdf (FILE *file);
+extern pdf_obj *pdf_open (FILE *file);
+extern void pdf_close (void);
+
+extern pdf_obj *pdf_deref_obj (pdf_obj *object);
+extern pdf_obj *pdf_import_object (pdf_obj *object);
+
+extern int pdfobj_escape_str (char *buffer, int size, const unsigned char *s, int len);
+
+extern pdf_obj *pdf_new_ref (unsigned long label, int generation);
+extern void pdf_copy_object (pdf_obj *dst, pdf_obj *src);
+
+#endif /* _PDFOBJ_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfparse.c b/Build/source/texk/xdvipdfmx/src/pdfparse.c
new file mode 100644
index 00000000000..c7dc79a2990
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfparse.c
@@ -0,0 +1,1071 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfparse.c,v 1.39 2005/07/21 05:05:14 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "numbers.h"
+
+#include "mfileio.h"
+
+#include "pdfobj.h"
+#include "pdfdoc.h"
+#include "pdfdev.h"
+
+#include "pdfparse.h"
+
+/* PDF */
+#ifdef is_space
+#undef is_space
+#endif
+#ifdef is_delim
+#undef is_delim
+#endif
+
+#define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\f' || \
+ (c) == '\r' || (c) == '\n' || (c) == '\0')
+#define is_delim(c) ((c) == '(' || (c) == '/' || \
+ (c) == '<' || (c) == '>' || \
+ (c) == '[' || (c) == ']' || \
+ (c) == '%')
+#define PDF_TOKEN_END(p,e) ((p) >= (e) || is_space(*(p)) || is_delim(*(p)))
+
+#define istokensep(c) (is_space((c)) || is_delim((c)))
+
+static struct {
+ int tainted;
+} parser_state = {
+ 0
+};
+
+static int xtoi (char ch);
+
+static char *save = NULL;
+
+void
+dump (const char *start, const char *end)
+{
+ const char *p = start;
+
+#define DUMP_LIMIT 50
+ MESG("\nCurrent input buffer is -->");
+ while (p < end && p < start + DUMP_LIMIT)
+ MESG("%c", *(p++));
+ if (p == start+DUMP_LIMIT)
+ MESG("...");
+ MESG("<--\n");
+}
+
+#define SAVE(s,e) do {\
+ save = (s);\
+ } while (0)
+#define DUMP_RESTORE(s,e) do {\
+ dump(save, end);\
+ (s) = save;\
+ } while (0)
+
+void
+skip_line (char **start, char *end)
+{
+ while (*start < end && **start != '\n' && **start != '\r')
+ (*start)++;
+ /* The carriage return (CR; \r; 0x0D) and line feed (LF; \n; 0x0A)
+ * characters, also called newline characters, are treated as
+ * end-of-line (EOL) markers. The combination of a carriage return
+ * followed immediately by a line feed is treated as one EOL marker.
+ */
+ if (*start < end && **start == '\r')
+ (*start)++;
+ if (*start < end && **start == '\n')
+ (*start)++;
+}
+
+void
+skip_white (char **start, char *end)
+{
+ /*
+ * The null (NUL; 0x00) character is a white-space character in PDF spec
+ * but isspace(0x00) returns FALSE; on the other hand, the vertical tab
+ * (VT; 0x0B) character is not a white-space character in PDF spec but
+ * isspace(0x0B) returns TRUE.
+ */
+ while (*start < end && (is_space(**start) || **start == '%')) {
+ if (**start == '%')
+ skip_line(start, end);
+ else
+ (*start)++;
+ }
+}
+
+
+static char *
+parsed_string (const char *start, const char *end)
+{
+ char *result = NULL;
+ int len;
+
+ len = end - start;
+ if (len > 0) {
+ result = NEW(len + 1, char);
+ memcpy(result, start, len);
+ result[len] = '\0';
+ }
+
+ return result;
+}
+
+char *
+parse_number (char **start, char *end)
+{
+ char *number, *p;
+
+ skip_white(start, end);
+ p = *start;
+ if (p < end && (*p == '+' || *p == '-'))
+ p++;
+ while (p < end && isdigit(*p))
+ p++;
+ if (p < end && *p == '.') {
+ p++;
+ while (p < end && isdigit(*p))
+ p++;
+ }
+ number = parsed_string(*start, p);
+
+ *start = p;
+ return number;
+}
+
+char *
+parse_unsigned (char **start, char *end)
+{
+ char *number, *p;
+
+ skip_white(start, end);
+ for (p = *start; p < end; p++) {
+ if (!isdigit(*p))
+ break;
+ }
+ number = parsed_string(*start, p);
+
+ *start = p;
+ return number;
+}
+
+static char *
+parse_gen_ident (char **start, char *end, const char *valid_chars)
+{
+ char *ident, *p;
+
+ /* No skip_white(start, end)? */
+ for (p = *start; p < end; p++) {
+ if (!strchr(valid_chars, *p))
+ break;
+ }
+ ident = parsed_string(*start, p);
+
+ *start = p;
+ return ident;
+}
+
+char *
+parse_ident (char **start, char *end)
+{
+ static const char *valid_chars =
+ "!\"#$&'*+,-.0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_`abcdefghijklmnopqrstuvwxyz|~";
+
+ return parse_gen_ident(start, end, valid_chars);
+}
+
+char *
+parse_val_ident (char **start, char *end)
+{
+ static const char *valid_chars =
+ "!\"#$&'*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_`abcdefghijklmnopqrstuvwxyz|~";
+
+ return parse_gen_ident(start, end, valid_chars);
+}
+
+char *
+parse_opt_ident (char **start, char *end)
+{
+ if (*start < end && **start == '@') {
+ (*start)++;
+ return parse_ident(start, end);
+ }
+
+ return NULL;
+}
+
+#define DDIGITS_MAX 10
+pdf_obj *
+parse_pdf_number (char **pp, char *endptr)
+{
+ char *p;
+ unsigned long ipart = 0, dpart = 0;
+ int nddigits = 0, sign = 1;
+ int has_dot = 0;
+ static double ipot[DDIGITS_MAX+1] = {
+ 1.0,
+ 0.1,
+ 0.01,
+ 0.001,
+ 0.0001,
+ 0.00001,
+ 0.000001,
+ 0.0000001,
+ 0.00000001,
+ 0.000000001,
+ 0.0000000001
+ };
+
+ p = *pp;
+ skip_white(&p, endptr);
+ if (p >= endptr ||
+ (!isdigit(p[0]) && p[0] != '.' &&
+ p[0] != '+' && p[0] != '-')) {
+ WARN("Could not find a numeric object.");
+ return NULL;
+ }
+
+ if (p[0] == '-') {
+ if (p + 1 >= endptr) {
+ WARN("Could not find a numeric object.");
+ return NULL;
+ }
+ sign = -1;
+ p++;
+ } else if (p[0] == '+') {
+ if (p + 1 >= endptr) {
+ WARN("Could not find a numeric object.");
+ return NULL;
+ }
+ sign = 1;
+ p++;
+ }
+
+ while (p < endptr && !istokensep(p[0])) {
+ if (p[0] == '.') {
+ if (has_dot) { /* Two dots */
+ WARN("Could not find a numeric object.");
+ return NULL;
+ } else {
+ has_dot = 1;
+ }
+ } else if (isdigit(p[0])) {
+ if (has_dot) {
+ if (nddigits == DDIGITS_MAX) {
+ WARN("Number with more than %d fractional digits.", DDIGITS_MAX);
+ } else if (nddigits < DDIGITS_MAX) {
+ dpart = dpart * 10 + p[0] - '0';
+ nddigits++;
+ } /* Ignore decimal digits more than DDIGITS_MAX */
+ } else {
+ ipart = ipart * 10 + p[0] - '0';
+ }
+ } else {
+ WARN("Could not find a numeric object.");
+ return NULL;
+ }
+ p++;
+ }
+
+ *pp = p;
+ return pdf_new_number((double) sign * (((double ) ipart) + dpart * ipot[nddigits]));
+}
+
+/*
+ * PDF Name:
+ *
+ * PDF-1.2+: Two hexadecimal digits preceded by a number sign.
+ */
+static int
+pn_getc (char **pp, char *endptr)
+{
+ int ch = 0;
+ char *p;
+
+ p = *pp;
+ if (p[0] == '#') {
+ if (p + 2 >= endptr) {
+ *pp = endptr;
+ return -1;
+ }
+ if (!isxdigit(p[1]) || !isxdigit(p[2])) {
+ *pp += 3;
+ return -1;
+ }
+ ch = (xtoi(p[1]) << 4);
+ ch += xtoi(p[2]);
+ *pp += 3;
+ } else {
+ ch = p[0];
+ *pp += 1;
+ }
+
+ return ch;
+}
+
+#ifndef PDF_NAME_LEN_MAX
+#define PDF_NAME_LEN_MAX 128
+#endif
+
+#ifndef PDF_STRING_LEN_MAX
+#define PDF_STRING_LEN_MAX 65535
+#endif
+
+#define STRING_BUFFER_SIZE PDF_STRING_LEN_MAX+1
+static char sbuf[PDF_STRING_LEN_MAX+1];
+
+
+pdf_obj *
+parse_pdf_name (char **pp, char *endptr)
+{
+ char name[PDF_NAME_LEN_MAX+1];
+ int ch, len = 0;
+
+ skip_white(pp, endptr);
+ if (*pp >= endptr || **pp != '/') {
+ WARN("Could not find a name object.");
+ return NULL;
+ }
+
+ (*pp)++;
+ while (*pp < endptr && !istokensep(**pp)) {
+ ch = pn_getc(pp, endptr);
+ if (ch < 0 || ch > 0xff) {
+ WARN("Invalid char in PDF name object. (ignored)");
+ } else if (ch == 0) {
+ WARN("Null char not allowed in PDF name object. (ignored)");
+ } else if (len < STRING_BUFFER_SIZE) {
+ if (len == PDF_NAME_LEN_MAX) {
+ WARN("PDF name length too long. (>= %d bytes)", PDF_NAME_LEN_MAX);
+ }
+ name[len++] = ch;
+ } else {
+ WARN("PDF name length too long. (>= %d bytes, truncated)",
+ STRING_BUFFER_SIZE);
+ }
+ }
+ if (len < 1) {
+ WARN("No valid name object found.");
+ return NULL;
+ }
+ name[len] = '\0';
+
+ return pdf_new_name(name);
+}
+
+pdf_obj *
+parse_pdf_boolean (char **pp, char *endptr)
+{
+ skip_white(pp, endptr);
+ if (*pp + 4 <= endptr &&
+ !strncmp(*pp, "true", 4)) {
+ if (*pp + 4 == endptr ||
+ istokensep(*(*pp + 4))) {
+ *pp += 4;
+ return pdf_new_boolean(1);
+ }
+ } else if (*pp + 5 <= endptr &&
+ !strncmp(*pp, "false", 5)) {
+ if (*pp + 5 == endptr ||
+ istokensep(*(*pp + 5))) {
+ *pp += 5;
+ return pdf_new_boolean(0);
+ }
+ }
+
+ WARN("Not a boolean object.");
+
+ return NULL;
+}
+
+pdf_obj *
+parse_pdf_null (char **pp, char *endptr)
+{
+ skip_white(pp, endptr);
+ if (*pp + 4 > endptr) {
+ WARN("Not a null object.");
+ return NULL;
+ } else if (*pp + 4 < endptr &&
+ !istokensep(*(*pp+4))) {
+ WARN("Not a null object.");
+ return NULL;
+ } else if (!strncmp(*pp, "null", 4)) {
+ *pp += 4;
+ return pdf_new_null();
+ }
+
+ WARN("Not a null object.");
+
+ return NULL;
+}
+
+/*
+ * PDF Literal String
+ */
+#ifndef isodigit
+#define isodigit(c) ((c) >= '0' && (c) <= '7')
+#endif
+static int
+ps_getescc (char **pp, char *endptr)
+{
+ int ch, i;
+ char *p;
+
+ p = *pp + 1; /* backslash assumed. */
+ switch (p[0]) {
+ case 'n': ch = '\n'; p++; break;
+ case 'r': ch = '\r'; p++; break;
+ case 't': ch = '\t'; p++; break;
+ case 'b': ch = '\b'; p++; break;
+ case 'f': ch = '\f'; p++; break;
+
+ /*
+ * An end-of-line marker preceded by a backslash must be ignored.
+ */
+ case '\n':
+ ch = -1;
+ p++;
+ break;
+ case '\r':
+ ch = -1;
+ p++;
+ if (p < endptr && p[0] == '\n')
+ p++;
+ break;
+ default:
+ if (p[0] == '\\' ||
+ p[0] == '(' || p[0] == ')') {
+ ch = p[0];
+ p++;
+ } else if (isodigit(p[0])) {
+ ch = 0;
+ /* Don't forget isodigit() is a macro. */
+ for (i = 0; i < 3 &&
+ p < endptr && isodigit(p[0]); i++) {
+ ch = (ch << 3) + (p[0] - '0');
+ p++;
+ }
+ ch = (ch & 0xff); /* Ignore overflow. */
+ } else {
+ ch = ((unsigned char) p[0]); /* Ignore only backslash. */
+ p++;
+ }
+ }
+
+ *pp = p;
+ return ch;
+}
+
+static pdf_obj *
+parse_pdf_literal_string (char **pp, char *endptr)
+{
+ int ch, op_count = 0, len = 0;
+ char *p;
+
+ p = *pp;
+
+ skip_white(&p, endptr);
+
+ if (p >= endptr || p[0] != '(')
+ return NULL;
+
+ p++;
+
+ /*
+ * Accroding to the PDF spec., an end-of-line marker, not preceded
+ * by a backslash, must be converted to single \n.
+ */
+ while (p < endptr) {
+
+ ch = p[0];
+
+ if (ch == ')' && op_count < 1)
+ break;
+
+#ifndef PDF_PARSE_STRICT
+ if (parser_state.tainted) {
+ if (p + 1 < endptr && (ch & 0x80)) {
+ if (len + 2 >= PDF_STRING_LEN_MAX) {
+ WARN("PDF string length too long. (limit: %ld)",
+ PDF_STRING_LEN_MAX);
+ return NULL;
+ }
+ sbuf[len++] = p[0];
+ sbuf[len++] = p[1];
+ p += 2;
+ continue;
+ }
+ }
+#endif /* !PDF_PARSE_STRICT */
+
+ if (len + 1 >= PDF_STRING_LEN_MAX) {
+ WARN("PDF string length too long. (limit: %ld)",
+ PDF_STRING_LEN_MAX);
+ return NULL;
+ }
+
+ switch (ch) {
+ case '\\':
+ ch = ps_getescc(&p, endptr);
+ if (ch >= 0)
+ sbuf[len++] = (ch & 0xff);
+ break;
+ case '\r':
+ p++;
+ if (p < endptr && p[0] == '\n')
+ p++;
+ sbuf[len++] = '\n';
+ break;
+ default:
+ if (ch == '(')
+ op_count++;
+ else if (ch == ')')
+ op_count--;
+ sbuf[len++] = ch;
+ p++;
+ break;
+ }
+ }
+
+ if (op_count > 0 ||
+ p >= endptr || p[0] != ')') {
+ WARN("Unbalanced parens/truncated PDF literal string.");
+ return NULL;
+ }
+
+ *pp = p + 1;
+ return pdf_new_string(sbuf, len);
+}
+
+/*
+ * PDF Hex String
+ */
+static int
+xtoi (char ch)
+{
+ if (ch >= '0' && ch <= '9')
+ return ch - '0';
+ if (ch >= 'A' && ch <= 'F')
+ return (ch - 'A') + 10;
+ if (ch >= 'a' && ch <= 'f')
+ return (ch - 'a') + 10;
+
+ return -1;
+}
+
+static pdf_obj *
+parse_pdf_hex_string (char **pp, char *endptr)
+{
+ char *p;
+ long len;
+
+ p = *pp;
+
+ skip_white(&p, endptr);
+ if (p >= endptr || p[0] != '<')
+ return NULL;
+
+ p++;
+
+ if ((endptr - p + 1) / 2 > PDF_STRING_LEN_MAX) {
+ WARN("PDF string length too long. (limit: %ld)",
+ PDF_STRING_LEN_MAX);
+ return NULL;
+ }
+
+ len = 0;
+ /*
+ * PDF Reference does not describe how to treat invalid char.
+ * Zero is appended if final hex digit is missing.
+ */
+ while (p < endptr && p[0] != '>') {
+ int ch;
+
+ skip_white(&p, endptr);
+ if (p >= endptr || p[0] == '>')
+ break;
+
+ ch = (xtoi(p[0]) << 4);
+ p++;
+
+ skip_white(&p, endptr);
+ if (p < endptr && p[0] != '>') {
+ ch += xtoi(p[0]);
+ p++;
+ }
+ sbuf[len++] = (ch & 0xff);
+ }
+
+ if (p >= endptr || p[0] != '>') {
+ WARN("Premature end of input hex string.");
+ return NULL;
+ }
+
+ *pp = p + 1;
+ return pdf_new_string(sbuf, len);
+}
+
+pdf_obj *
+parse_pdf_string (char **pp, char *endptr)
+{
+ skip_white(pp, endptr);
+ if (*pp + 2 <= endptr) {
+ if (**pp == '(')
+ return parse_pdf_literal_string(pp, endptr);
+ else if (**pp == '<' &&
+ (*(*pp + 1) == '>' || isxdigit(*(*pp + 1)))) {
+ return parse_pdf_hex_string(pp, endptr);
+ }
+ }
+
+ WARN("Could not find a string object.");
+
+ return NULL;
+}
+
+#ifndef PDF_PARSE_STRICT
+pdf_obj *
+parse_pdf_tainted_dict (char **pp, char *endptr)
+{
+ pdf_obj *result;
+
+ parser_state.tainted = 1;
+ result = parse_pdf_dict(pp, endptr);
+ parser_state.tainted = 0;
+
+ return result;
+}
+#else /* PDF_PARSE_STRICT */
+pdf_obj *
+parse_pdf_tainted_dict (char **pp, char *endptr, int level)
+{
+ return parse_pdf_dict(pp, endptr);
+}
+#endif /* !PDF_PARSE_STRICT */
+
+pdf_obj *
+parse_pdf_dict (char **pp, char *endptr)
+{
+ pdf_obj *result = NULL;
+ char *p;
+
+ p = *pp;
+
+ skip_white(&p, endptr);
+
+ /* At least four letter <<>>. */
+ if (p + 4 > endptr ||
+ p[0] != '<' || p[1] != '<') {
+ return NULL;
+ }
+ p += 2;
+
+ result = pdf_new_dict();
+
+ skip_white(&p, endptr);
+ while (p < endptr && p[0] != '>') {
+ pdf_obj *key, *value;
+
+ skip_white(&p, endptr);
+ key = parse_pdf_name(&p, endptr);
+ if (!key) {
+ WARN("Could not find a key in dictionary object.");
+ pdf_release_obj(result);
+ return NULL;
+ }
+
+ skip_white(&p, endptr);
+
+ value = parse_pdf_object(&p, endptr);
+ if (!value) {
+ pdf_release_obj(key);
+ pdf_release_obj(value);
+ pdf_release_obj(result);
+ WARN("Could not find a value in dictionary object.");
+ return NULL;
+ }
+ pdf_add_dict(result, key, value);
+
+ skip_white(&p, endptr);
+ }
+
+ if (p + 2 > endptr ||
+ p[0] != '>' || p[1] != '>') {
+ WARN("Syntax error: Dictionary object ended prematurely.");
+ pdf_release_obj(result);
+ return NULL;
+ }
+
+ *pp = p + 2; /* skip >> */
+ return result;
+}
+
+pdf_obj *
+parse_pdf_array (char **pp, char *endptr)
+{
+ pdf_obj *result;
+ char *p;
+
+ p = *pp;
+
+ skip_white(&p, endptr);
+ if (p + 2 > endptr || p[0] != '[') {
+ WARN("Could not find an array object.");
+ return NULL;
+ }
+
+ result = pdf_new_array();
+
+ p++;
+ skip_white(&p, endptr);
+
+ while (p < endptr && p[0] != ']') {
+ pdf_obj *elem;
+
+ elem = parse_pdf_object(&p, endptr);
+ if (!elem) {
+ pdf_release_obj(result);
+ WARN("Could not find a valid object in array object.");
+ return NULL;
+ }
+ pdf_add_array(result, elem);
+
+ skip_white(&p, endptr);
+ }
+
+ if (p >= endptr || p[0] != ']') {
+ WARN("Array object ended prematurely.");
+ pdf_release_obj(result);
+ return NULL;
+ }
+
+ *pp = p + 1; /* skip ] */
+ return result;
+}
+
+static pdf_obj *
+parse_pdf_stream (char **pp, char *endptr, pdf_obj *dict)
+{
+ pdf_obj *result = NULL;
+ char *p;
+ pdf_obj *stream_dict;
+ long stream_length;
+
+ p = *pp;
+ skip_white(&p, endptr);
+ if (p + 6 > endptr ||
+ strncmp(p, "stream", 6)) {
+ return NULL;
+ }
+ p += 6;
+
+ /* Carrige return alone is not allowed after keyword "stream".
+ * See, PDF Reference, 4th ed., version 1.5, p. 36.
+ */
+ if (p < endptr && p[0] == '\n') {
+ p++;
+ } else if (p + 1 < endptr &&
+ (p[0] == '\r' && p[1] == '\n')) {
+ p += 2;
+ }
+#ifndef PDF_PARSE_STRICT
+ else {
+ /* TeX translate end-of-line marker to a single space. */
+ if (parser_state.tainted) {
+ if (p < endptr && p[0] == ' ') {
+ p++;
+ }
+ }
+ }
+ /* The end-of-line marker not mandatory? */
+#endif /* !PDF_PARSE_STRICT */
+
+ /* Stream length */
+ {
+ pdf_obj *tmp, *tmp2;
+
+ tmp = pdf_lookup_dict(dict, "Length");
+
+ if (tmp != NULL) {
+ tmp2 = pdf_deref_obj(tmp);
+ if (pdf_obj_typeof(tmp2) != PDF_NUMBER)
+ stream_length = -1;
+ else {
+ stream_length = (long) pdf_number_value(tmp2);
+ }
+ pdf_release_obj(tmp2);
+ }
+#ifndef PDF_PARSE_STRICT
+ else if (p + 9 <= endptr)
+ {
+ /*
+ * This was added to allow TeX users to write PDF stream object
+ * directly in their TeX source. This violates PDF spec.
+ */
+ char *q;
+
+ stream_length = -1;
+ for (q = endptr - 1; q >= p + 8; q--) {
+ if (q[0] != 'm')
+ continue;
+ else {
+ if (!memcmp(q - 8, "endstrea", 8)) {
+ /* The end-of-line marker is not skipped here. There are
+ * no way to decide if it is a part of the stream or not.
+ */
+ stream_length = ((long) (q - p)) - 8;
+ break;
+ }
+ }
+ }
+ }
+#endif /* !PDF_PARSE_STRICT */
+ else {
+ return NULL;
+ }
+ }
+
+
+ if (stream_length < 0 ||
+ p + stream_length > endptr)
+ return NULL;
+
+ /*
+ * If Filter is not applied, set STREAM_COMPRESS flag.
+ * Should we use filter for ASCIIHexEncode/ASCII85Encode-ed streams?
+ */
+ {
+ pdf_obj *filters;
+
+ filters = pdf_lookup_dict(dict, "Filter");
+ if (!filters && stream_length > 10) {
+ result = pdf_new_stream(STREAM_COMPRESS);
+ } else {
+ result = pdf_new_stream(0);
+ }
+ }
+
+ stream_dict = pdf_stream_dict(result);
+ pdf_merge_dict(stream_dict, dict);
+
+ pdf_add_stream(result, p, stream_length);
+ p += stream_length;
+
+ /* Check "endsteam" */
+ {
+ /*
+ * It is an error if the stream contained too much data except there
+ * may be an extra end-of-line marker before the keyword "endstream".
+ */
+#ifdef PDF_PARSE_STRICT
+ if (p < endptr && p[0] == '\r')
+ p++;
+ if (p < endptr && p[0] == '\n')
+ p++;
+#else /* !PDF_PARSE_STRICT */
+ /*
+ * This may skip data starting with '%' and terminated by a
+ * '\r' or '\n' or '\r\n'. The PDF syntax rule should not be
+ * applied to the content of the stream data.
+ * TeX may have converted end-of-line to single white space.
+ */
+ skip_white(&p, endptr);
+#endif /* !PDF_PARSE_STRICT */
+
+ if (p + 9 > endptr ||
+ memcmp(p, "endstream", 9)) {
+ pdf_release_obj(result);
+ return NULL;
+ }
+ p += 9;
+ }
+
+ *pp = p;
+ return result;
+}
+
+#ifndef PDF_PARSE_STRICT
+
+/* PLEASE REMOVE THIS */
+#include "specials.h"
+
+/* This is not PDF indirect reference. */
+static pdf_obj *
+parse_pdf_reference (char **start, char *end)
+{
+ pdf_obj *result = NULL;
+ char *name;
+
+ SAVE(*start, end);
+
+ skip_white(start, end);
+ name = parse_opt_ident(start, end);
+ if (name) {
+ result = spc_lookup_reference(name);
+ if (!result) {
+ WARN("Could not find the named reference (@%s).", name);
+ DUMP_RESTORE(*start, end);
+ }
+ RELEASE(name);
+ } else {
+ WARN("Could not find a reference name.");
+ DUMP_RESTORE(*start, end);
+ result = NULL;
+ }
+
+ return result;
+}
+#endif /* !PDF_PARSE_STRICT */
+
+static pdf_obj *
+try_pdf_reference (char *start, char *end, char **endptr)
+{
+ unsigned long id = 0, gen = 0;
+
+ if (endptr)
+ *endptr = start;
+
+ skip_white(&start, end);
+ if (start > end - 5 || !isdigit(*start)) {
+ return NULL;
+ }
+ while (!is_space(*start)) {
+ if (start >= end || !isdigit(*start)) {
+ return NULL;
+ }
+ id = id * 10 + (*start - '0');
+ start++;
+ }
+
+ skip_white(&start, end);
+ if (start >= end || !isdigit(*start))
+ return NULL;
+ while (!is_space(*start)) {
+ if (start >= end || !isdigit(*start))
+ return NULL;
+ gen = gen * 10 + (*start - '0');
+ start++;
+ }
+
+ skip_white(&start, end);
+ if (start >= end || *start != 'R')
+ return NULL;
+ start++;
+ if (!PDF_TOKEN_END(start, end))
+ return NULL;
+
+ if (endptr)
+ *endptr = start;
+
+ return pdf_new_ref(id, (int) gen);
+}
+
+pdf_obj *
+parse_pdf_object (char **pp, char *endptr)
+{
+ pdf_obj *result = NULL;
+ char *nextptr;
+
+ skip_white(pp, endptr);
+ if (*pp >= endptr) {
+ WARN("Could not find any valid object.");
+ return NULL;
+ }
+
+ switch (**pp) {
+
+ case '<':
+
+ if (*(*pp + 1) != '<') {
+ result = parse_pdf_hex_string(pp, endptr);
+ } else {
+ pdf_obj *dict;
+
+ result = parse_pdf_dict(pp, endptr);
+ skip_white(pp, endptr);
+ if ( result &&
+ *pp <= endptr - 15 &&
+ !memcmp(*pp, "stream", 6)) {
+ dict = result;
+ result = parse_pdf_stream(pp, endptr, dict);
+ pdf_release_obj(dict);
+ }
+ }
+
+ break;
+ case '(':
+ result = parse_pdf_string(pp, endptr);
+ break;
+ case '[':
+ result = parse_pdf_array(pp, endptr);
+ break;
+ case '/':
+ result = parse_pdf_name(pp, endptr);
+ break;
+ case 'n':
+ result = parse_pdf_null(pp, endptr);
+ break;
+ case 't': case 'f':
+ result = parse_pdf_boolean(pp, endptr);
+ break;
+ case '+': case '-': case '.':
+ result = parse_pdf_number(pp, endptr);
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+
+ result = try_pdf_reference(*pp, endptr, &nextptr);
+ if (result) {
+ *pp = nextptr;
+ } else {
+ result = parse_pdf_number(pp, endptr);
+ }
+ break;
+
+ case '@':
+
+#ifndef PDF_PARSE_STRICT
+ result = parse_pdf_reference(pp, endptr);
+#endif /* !PDF_PARSE_STRICT */
+ break;
+
+ default:
+ WARN("Unknown PDF object type.");
+ result = NULL;
+ }
+
+ return result;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/pdfparse.h b/Build/source/texk/xdvipdfmx/src/pdfparse.h
new file mode 100644
index 00000000000..6dfc4e1ee65
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfparse.h
@@ -0,0 +1,55 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfparse.h,v 1.14 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFPARSE_H_
+#define _PDFPARSE_H_
+
+#include "numbers.h"
+#include "pdfobj.h"
+
+/* Please remove this */
+extern void dump (const char *start, const char *end);
+
+extern void skip_line (char **start, char *end);
+extern void skip_white (char **start, char *end);
+
+extern char *parse_number (char **start, char *end);
+extern char *parse_unsigned (char **start, char *end);
+
+extern char *parse_ident (char **start, char *end);
+extern char *parse_val_ident (char **start, char *end);
+extern char *parse_opt_ident (char **start, char *end);
+
+extern pdf_obj *parse_pdf_name (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_boolean (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_number (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_null (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_string (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_dict (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_array (char **pp, char *endptr);
+extern pdf_obj *parse_pdf_object (char **pp, char *endptr);
+
+extern pdf_obj *parse_pdf_tainted_dict (char **pp, char *endptr);
+
+#endif /* _PDFPARSE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfresource.c b/Build/source/texk/xdvipdfmx/src/pdfresource.c
new file mode 100644
index 00000000000..b79974e0ddd
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfresource.c
@@ -0,0 +1,373 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfresource.c,v 1.8 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * Currently, this is nearly useless.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+
+#include "pdfresource.h"
+
+#define PDF_RESOURCE_DEBUG_STR "PDF"
+#define PDF_RESOURCE_DEBUG 3
+
+#define PDF_RESOURCE_FONT 0
+#define PDF_RESOURCE_CIDFONT 1
+#define PDF_RESOURCE_ENCODING 2
+#define PDF_RESOURCE_CMAP 3
+#define PDF_RESOURCE_XOBJECT 4
+#define PDF_RESOURCE_COLORSPACE 5
+#define PDF_RESOURCE_SHADING 6
+#define PDF_RESOURCE_PATTERN 7
+#define PDF_RESOURCE_GSTATE 8
+
+typedef struct pdf_res
+{
+ char *ident;
+
+ int flags;
+
+ int category;
+ void *cdata;
+
+ pdf_obj *object;
+ pdf_obj *reference;
+} pdf_res;
+
+static struct {
+ const char *name;
+ int cat_id;
+} pdf_resource_categories[] = {
+ {"Font", PDF_RESOURCE_FONT},
+ {"CIDFont", PDF_RESOURCE_CIDFONT},
+ {"Encoding", PDF_RESOURCE_ENCODING},
+ {"CMap", PDF_RESOURCE_CMAP},
+ {"XObject", PDF_RESOURCE_XOBJECT},
+ {"ColorSpace", PDF_RESOURCE_COLORSPACE},
+ {"Shading", PDF_RESOURCE_SHADING},
+ {"Pattern", PDF_RESOURCE_PATTERN},
+ {"ExtGState", PDF_RESOURCE_GSTATE},
+};
+
+#define PDF_NUM_RESOURCE_CATEGORIES (sizeof(pdf_resource_categories)/sizeof(pdf_resource_categories[0]))
+
+#define CACHE_ALLOC_SIZE 16u
+struct res_cache
+{
+ int count;
+ int capacity;
+ pdf_res *resources;
+};
+
+static struct res_cache resources[PDF_NUM_RESOURCE_CATEGORIES];
+
+static void
+pdf_init_resource (pdf_res *res)
+{
+ ASSERT(res);
+
+ res->ident = NULL;
+ res->category = -1;
+ res->flags = 0;
+ res->cdata = NULL;
+ res->object = NULL;
+ res->reference = NULL;
+
+ return;
+}
+
+static void
+pdf_flush_resource (pdf_res *res)
+{
+ if (res) {
+ if (res->reference)
+ pdf_release_obj(res->reference);
+ if (res->object)
+ pdf_release_obj(res->object);
+
+ res->reference = NULL;
+ res->object = NULL;
+ }
+}
+
+static void
+pdf_clean_resource (pdf_res *res)
+{
+ if (res) {
+ if (res->reference || res->object)
+ WARN("Trying to release un-flushed object.");
+ if (res->reference)
+ pdf_release_obj(res->reference);
+ if (res->object)
+ pdf_release_obj(res->object);
+ if (res->ident)
+ RELEASE(res->ident);
+ res->ident = NULL;
+ res->category = -1;
+ res->flags = 0;
+ }
+}
+
+void
+pdf_init_resources (void)
+{
+ int i;
+
+ for (i = 0;
+ i < PDF_NUM_RESOURCE_CATEGORIES; i++) {
+ resources[i].count = 0;
+ resources[i].capacity = 0;
+ resources[i].resources = NULL;
+ }
+}
+
+void
+pdf_close_resources (void)
+{
+ int i;
+
+ for (i = 0;
+ i < PDF_NUM_RESOURCE_CATEGORIES; i++) {
+ struct res_cache *rc;
+ int j;
+
+ rc = &resources[i];
+ for (j = 0; j < rc->count; j++) {
+ pdf_flush_resource(&rc->resources[j]);
+ pdf_clean_resource(&rc->resources[j]);
+ }
+ RELEASE(rc->resources);
+
+ rc->count = 0;
+ rc->capacity = 0;
+ rc->resources = NULL;
+ }
+}
+
+static int
+get_category (const char *category)
+{
+ int i;
+
+ for (i = 0;
+ i < PDF_NUM_RESOURCE_CATEGORIES; i++) {
+ if (!strcmp(category, pdf_resource_categories[i].name)) {
+ return pdf_resource_categories[i].cat_id;
+ }
+ }
+
+ return -1;
+}
+
+long
+pdf_defineresource (const char *category,
+ const char *resname, pdf_obj *object, int flags)
+{
+ int res_id;
+ struct res_cache *rc;
+ int cat_id;
+ pdf_res *res = NULL;
+
+ ASSERT(category && object);
+
+ cat_id = get_category(category);
+ if (cat_id < 0) {
+ ERROR("Unknown resource category: %s", category);
+ return -1;
+ }
+
+ rc = &resources[cat_id];
+ if (resname) {
+ for (res_id = 0; res_id < rc->count; res_id++) {
+ res = &rc->resources[res_id];
+ if (!strcmp(resname, res->ident)) {
+ WARN("Resource %s (category: %s) already defined...",
+ resname, category);
+ pdf_flush_resource(res);
+ res->flags = flags;
+ if (flags & PDF_RES_FLUSH_IMMEDIATE) {
+ res->reference = pdf_ref_obj(object);
+ pdf_release_obj(object);
+ } else {
+ res->object = object;
+ }
+ return (long) ((cat_id << 16)|(res_id));
+ }
+ }
+ } else {
+ res_id = rc->count;
+ }
+
+ if (res_id == rc->count) {
+ if (rc->count >= rc->capacity) {
+ rc->capacity += CACHE_ALLOC_SIZE;
+ rc->resources = RENEW(rc->resources, rc->capacity, pdf_res);
+ }
+ res = &rc->resources[res_id];
+
+ pdf_init_resource(res);
+ if (resname && resname[0] != '\0') {
+ res->ident = NEW(strlen(resname) + 1, char);
+ strcpy(res->ident, resname);
+ }
+ res->category = cat_id;
+ res->flags = flags;
+ if (flags & PDF_RES_FLUSH_IMMEDIATE) {
+ res->reference = pdf_ref_obj(object);
+ pdf_release_obj(object);
+ } else {
+ res->object = object;
+ }
+ rc->count++;
+ }
+
+ return (long) ((cat_id << 16)|(res_id));
+}
+
+int
+pdf_resource_exist (const char *category, const char *resname)
+{
+ int res_id;
+ struct res_cache *rc;
+ int cat_id;
+
+ ASSERT(resname && category);
+
+ cat_id = get_category(category);
+ if (cat_id < 0)
+ ERROR("Unknown resource category: %s", category);
+
+ rc = &resources[cat_id];
+ for (res_id = 0; res_id < rc->count; res_id++) {
+ pdf_res *res;
+
+ res = &rc->resources[res_id];
+ if (!strcmp(resname, res->ident)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+long
+pdf_findresource (const char *category, const char *resname)
+{
+ pdf_res *res;
+ int res_id, cat_id;
+ struct res_cache *rc;
+
+ ASSERT(resname && category);
+
+ cat_id = get_category(category);
+ if (cat_id < 0) {
+ ERROR("Unknown resource category: %s", category);
+ return -1;
+ }
+
+ rc = &resources[cat_id];
+ for (res_id = 0; res_id < rc->count; res_id++) {
+ res = &rc->resources[res_id];
+ if (!strcmp(resname, res->ident)) {
+ return (long) (cat_id << 16|res_id);
+ }
+ }
+
+ return -1;
+}
+
+pdf_obj *
+pdf_get_resource_reference (long rc_id)
+{
+ int cat_id, res_id;
+ struct res_cache *rc;
+ pdf_res *res;
+
+ cat_id = (rc_id >> 16) & 0xffff;
+ res_id = rc_id & 0xffff;
+
+ if (cat_id < 0 ||
+ cat_id >= PDF_NUM_RESOURCE_CATEGORIES) {
+ ERROR("Invalid category ID: %d", cat_id);
+ return NULL;
+ }
+ rc = &resources[cat_id];
+ if (res_id < 0 || res_id >= rc->count) {
+ ERROR("Invalid resource ID: %d", res_id);
+ return NULL;
+ }
+
+ res = &rc->resources[res_id];
+ if (!res->reference) {
+ if (!res->object) {
+ ERROR("Undefined object...");
+ return NULL;
+ } else {
+ res->reference = pdf_ref_obj(res->object);
+ }
+ }
+
+ return pdf_link_obj(res->reference);
+}
+
+pdf_obj *
+pdf_get_resource (long rc_id)
+{
+ int cat_id, res_id;
+ struct res_cache *rc;
+ pdf_res *res;
+
+ cat_id = (rc_id >> 16) & 0xffff;
+ res_id = rc_id & 0xffff;
+
+ if (cat_id < 0 ||
+ cat_id >= PDF_NUM_RESOURCE_CATEGORIES) {
+ ERROR("Invalid category ID: %d", cat_id);
+ return NULL;
+ }
+ rc = &resources[cat_id];
+ if (res_id < 0 || res_id >= rc->count) {
+ ERROR("Invalid resource ID: %d", res_id);
+ return NULL;
+ }
+
+ res = &rc->resources[res_id];
+ if (!res->object) {
+ ERROR("Object already flushed???");
+ return NULL;
+ }
+
+ return res->object;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pdfresource.h b/Build/source/texk/xdvipdfmx/src/pdfresource.h
new file mode 100644
index 00000000000..38fc8189b09
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfresource.h
@@ -0,0 +1,43 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfresource.h,v 1.6 2004/09/05 13:30:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDF_RESOURCE_H_
+#define _PDF_RESOURCE_H_
+
+#include "pdfobj.h"
+
+#define PDF_RES_FLUSH_IMMEDIATE 1
+
+extern void pdf_init_resources (void);
+extern void pdf_close_resources (void);
+
+extern long pdf_defineresource (const char *category,
+ const char *resname, pdf_obj *object, int flags);
+extern long pdf_findresource (const char *category, const char *resname);
+extern int pdf_resource_exist (const char *category, const char *resname);
+
+extern pdf_obj *pdf_get_resource_reference (long res_id);
+extern pdf_obj *pdf_get_resource (long res_id);
+
+#endif /* _PDF_RESOURCE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pdfximage.c b/Build/source/texk/xdvipdfmx/src/pdfximage.c
new file mode 100644
index 00000000000..72c287fe2d1
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfximage.c
@@ -0,0 +1,807 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfximage.c,v 1.14 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxfile.h"
+
+#include "pdfobj.h"
+
+#include "pdfdoc.h"
+#include "pdfdev.h"
+#include "pdfdraw.h"
+
+#include "epdf.h"
+#include "mpost.h"
+#include "pngimage.h"
+#include "jpegimage.h"
+#include "bmpimage.h"
+
+#include "pdfximage.h"
+
+/* From psimage.h */
+static int check_for_ps (FILE *fp);
+static int ps_include_page (pdf_ximage *ximage, const char *file_name);
+
+
+#define IMAGE_TYPE_UNKNOWN -1
+#define IMAGE_TYPE_PDF 0
+#define IMAGE_TYPE_JPEG 1
+#define IMAGE_TYPE_PNG 2
+#define IMAGE_TYPE_MPS 4
+#define IMAGE_TYPE_EPS 5
+#define IMAGE_TYPE_BMP 6
+
+
+struct attr_
+{
+ long width, height;
+ pdf_rect bbox;
+ double xdpi, ydpi;
+};
+
+struct pdf_ximage_
+{
+ char *ident;
+ char res_name[16];
+
+ int subtype;
+
+ struct attr_ attr;
+
+ char *filename;
+ pdf_obj *reference;
+ pdf_obj *resource;
+ int page_index;
+ int pdf_box;
+};
+
+
+/* verbose, verbose, verbose... */
+struct opt_
+{
+ int verbose;
+ char *cmdtmpl;
+};
+
+static struct opt_ _opts = {
+ 0, NULL
+};
+
+void pdf_ximage_set_verbose (void) { _opts.verbose++; }
+
+
+struct ic_
+{
+ int count, capacity;
+ pdf_ximage *ximages;
+};
+
+static struct ic_ _ic = {
+ 0, 0, NULL
+};
+
+static void
+pdf_init_ximage_struct (pdf_ximage *I)
+{
+ I->ident = NULL;
+ I->filename = NULL;
+ I->subtype = -1;
+ memset(I->res_name, 0, 16);
+ I->reference = NULL;
+ I->resource = NULL;
+ I->page_index = 0;
+ I->pdf_box = 0;
+
+ I->attr.width = I->attr.height = 0;
+ I->attr.bbox.llx = I->attr.bbox.lly = 0;
+ I->attr.bbox.urx = I->attr.bbox.ury = 0;
+ I->attr.xdpi = I->attr.ydpi = 72.0;
+}
+
+static void
+pdf_clean_ximage_struct (pdf_ximage *I)
+{
+ if (I->ident)
+ RELEASE(I->ident);
+ if (I->filename)
+ RELEASE(I->filename);
+ if (I->reference)
+ pdf_release_obj(I->reference);
+ if (I->resource)
+ pdf_release_obj(I->resource);
+ pdf_init_ximage_struct(I);
+}
+
+
+void
+pdf_init_images (void)
+{
+ struct ic_ *ic = &_ic;
+ ic->count = 0;
+ ic->capacity = 0;
+ ic->ximages = NULL;
+}
+
+void
+pdf_close_images (void)
+{
+ struct ic_ *ic = &_ic;
+ if (ic->ximages) {
+ int i;
+ for (i = 0; i < ic->count; i++)
+ pdf_clean_ximage_struct(&ic->ximages[i]);
+ RELEASE(ic->ximages);
+ }
+ ic->ximages = NULL;
+ ic->count = ic->capacity = 0;
+
+ if (_opts.cmdtmpl)
+ RELEASE(_opts.cmdtmpl);
+ _opts.cmdtmpl = NULL;
+}
+
+
+static int
+source_image_type (FILE *fp)
+{
+ int format = IMAGE_TYPE_UNKNOWN;
+
+ rewind(fp);
+ /*
+ * Make sure we check for PS *after* checking for MP since
+ * MP is a special case of PS.
+ */
+ if (check_for_jpeg(fp))
+ {
+ format = IMAGE_TYPE_JPEG;
+ }
+#ifdef HAVE_LIBPNG
+ else if (check_for_png(fp))
+ {
+ format = IMAGE_TYPE_PNG;
+ }
+#endif
+ else if (check_for_bmp(fp))
+ {
+ format = IMAGE_TYPE_BMP;
+ } else if (check_for_pdf(fp)) {
+ format = IMAGE_TYPE_PDF;
+ } else if (check_for_mp(fp)) {
+ format = IMAGE_TYPE_MPS;
+ } else if (check_for_ps(fp)) {
+ format = IMAGE_TYPE_EPS;
+ } else {
+ format = IMAGE_TYPE_UNKNOWN;
+ }
+ rewind(fp);
+
+ return format;
+}
+
+#if 0
+#define KEYCMP(k,s) (strcmp(pdf_name_value((k)),(s)))
+static int
+filter_put_image_attr (pdf_obj *kp, pdf_obj *vp, void *dp)
+{
+ struct attr_ *attr = dp;
+
+ if (KEYCMP(kp, "Width")) {
+ if (pdf_obj_typeof(vp) != PDF_NUMBER)
+ return -1;
+ attr->width = (long) pdf_number_value(vp);
+ } else if (KEYCMP(kp, "Height")) {
+ if (pdf_obj_typeof(vp) != PDF_NUMBER)
+ return -1;
+ attr->height = (long) pdf_number_value(vp);
+ }
+
+ return 0;
+}
+
+static int
+filter_put_form_attr (pdf_obj *kp, pdf_obj *vp, void *dp)
+{
+ struct attr_ *attr = dp;
+
+ if (KEYCMP(kp, "BBox")) {
+ if (pdf_array_length(vp) != 4)
+ return -1;
+ else {
+ int i;
+ double v[4];
+ for (i = 0; i < 4; i++) {
+ pdf_obj *obj = pdf_get_array(vp, i);
+ if (pdf_obj_typeof(vp) != PDF_NUMBER)
+ return -1;
+ else {
+ v = pdf_number_value(obj);
+ }
+ }
+ attr->bbox.llx = v[0]; attr->bbox.lly = v[1];
+ attr->bbox.urx = v[2]; attr->bbox.ury = v[3];
+ }
+ }
+
+ return 0;
+}
+#endif
+
+
+static int
+load_image (const char *ident, int page_index, int pdf_box,
+ const char *fullname, int format, FILE *fp)
+{
+ struct ic_ *ic = &_ic;
+ int id = -1; /* ret */
+ pdf_ximage *I;
+
+ id = ic->count;
+ if (ic->count >= ic->capacity) {
+ ic->capacity += 16;
+ ic->ximages = RENEW(ic->ximages, ic->capacity, pdf_ximage);
+ }
+
+ I = &ic->ximages[id];
+ pdf_init_ximage_struct(I);
+
+ switch (format) {
+ case IMAGE_TYPE_JPEG:
+ if (_opts.verbose)
+ MESG("[JPEG]");
+ if (jpeg_include_image(I, fp) < 0)
+ return -1;
+ I->subtype = PDF_XOBJECT_TYPE_IMAGE;
+ break;
+#ifdef HAVE_LIBPNG
+ case IMAGE_TYPE_PNG:
+ if (_opts.verbose)
+ MESG("[PNG]");
+ if (png_include_image(I, fp) < 0)
+ return -1;
+ I->subtype = PDF_XOBJECT_TYPE_IMAGE;
+ break;
+#endif
+ case IMAGE_TYPE_BMP:
+ if (_opts.verbose)
+ MESG("[BMP]");
+ if (bmp_include_image(I, fp) < 0)
+ return -1;
+ I->subtype = PDF_XOBJECT_TYPE_IMAGE;
+ break;
+ case IMAGE_TYPE_PDF:
+ if (_opts.verbose)
+ MESG("[PDF]");
+ if (pdf_include_page(I, fp, page_index, pdf_box) < 0)
+ return -1;
+ I->subtype = PDF_XOBJECT_TYPE_FORM;
+ I->page_index = page_index;
+ I->pdf_box = pdf_box;
+ break;
+ case IMAGE_TYPE_EPS:
+ if (_opts.verbose)
+ MESG("[PS]");
+ if (ps_include_page(I, fullname) < 0)
+ return -1;
+ I->subtype = PDF_XOBJECT_TYPE_FORM;
+ break;
+ default:
+ if (_opts.verbose)
+ MESG("[UNKNOWN]");
+ if (ps_include_page(I, fullname) < 0)
+ return -1;
+ I->subtype = PDF_XOBJECT_TYPE_FORM;
+ }
+
+ I->filename = NEW(strlen(ident)+1, char);
+ I->ident = NEW(strlen(ident)+1, char);
+ strcpy(I->filename, ident);
+ strcpy(I->ident, ident);
+
+ switch (I->subtype) {
+ case PDF_XOBJECT_TYPE_IMAGE:
+ sprintf(I->res_name, "Im%d", id);
+ break;
+ case PDF_XOBJECT_TYPE_FORM:
+ sprintf(I->res_name, "Fm%d", id);
+ break;
+ default:
+ ERROR("Unknown XObject subtype: %d", I->subtype);
+ return -1;
+ }
+
+ ic->count++;
+
+ return id;
+}
+
+
+#define dpx_find_file(n,d,s) (kpse_find_pict((n)))
+#define dpx_fopen(n,m) (MFOPEN((n),(m)))
+#define dpx_fclose(f) (MFCLOSE((f)))
+
+int
+pdf_ximage_findresource (const char *ident, int page_index, int pdf_box)
+{
+ struct ic_ *ic = &_ic;
+ int id = -1;
+ pdf_ximage *I;
+ char *fullname;
+ int format;
+ FILE *fp;
+
+ for (id = 0; id < ic->count; id++) {
+ I = &ic->ximages[id];
+ if (I->ident && !strcmp(ident, I->ident)
+ && page_index == I->page_index
+ && pdf_box == I->pdf_box) {
+ return id;
+ }
+ }
+
+ /* try loading image */
+ fullname = dpx_find_file(ident, "_pic_", "");
+ if (!fullname) {
+ WARN("Error locating image file \"%s\"", ident);
+ return -1;
+ }
+
+ fp = dpx_fopen(fullname, FOPEN_RBIN_MODE);
+ if (!fp) {
+ WARN("Error opening image file \"%s\"", fullname);
+ RELEASE(fullname);
+ return -1;
+ }
+ if (_opts.verbose) {
+ MESG("(Image:%s", ident);
+ if (_opts.verbose > 1)
+ MESG("[%s]", fullname);
+ }
+
+ format = source_image_type(fp);
+ switch (format) {
+ case IMAGE_TYPE_MPS:
+ if (_opts.verbose)
+ MESG("[MPS]");
+ id = mps_include_page(ident, fp);
+ break;
+ default:
+ id = load_image(ident, page_index, pdf_box, fullname, format, fp);
+ break;
+ }
+ dpx_fclose(fp);
+
+ RELEASE(fullname);
+
+ if (_opts.verbose)
+ MESG(")");
+
+ if (id < 0)
+ WARN("pdf: image inclusion failed for \"%s\".", ident);
+
+ return id;
+}
+
+void
+pdf_ximage_init_form_info (xform_info *info)
+{
+ info->flags = 0;
+ info->bbox.llx = 0;
+ info->bbox.lly = 0;
+ info->bbox.urx = 0;
+ info->bbox.ury = 0;
+ info->matrix.a = 1.0;
+ info->matrix.b = 0.0;
+ info->matrix.c = 0.0;
+ info->matrix.d = 1.0;
+ info->matrix.e = 0.0;
+ info->matrix.f = 0.0;
+}
+
+void
+pdf_ximage_init_image_info (ximage_info *info)
+{
+ info->flags = 0;
+ info->width = 0;
+ info->height = 0;
+ info->bits_per_component = 0;
+ info->num_components = 0;
+ info->min_dpi = 0;
+ info->xdpi = info->ydpi = 72.0;
+}
+
+void
+pdf_ximage_set_image (pdf_ximage *I, void *image_info, pdf_obj *resource)
+{
+ pdf_obj *dict;
+ ximage_info *info = image_info;
+
+ if (!PDF_OBJ_STREAMTYPE(resource))
+ ERROR("Image XObject must be stream type.");
+
+ I->subtype = PDF_XOBJECT_TYPE_IMAGE;
+
+ I->attr.width = info->width;
+ I->attr.height = info->height;
+
+ I->attr.xdpi = info->xdpi;
+ I->attr.ydpi = info->ydpi;
+
+ I->reference = pdf_ref_obj(resource);
+
+ dict = pdf_stream_dict(resource);
+ pdf_add_dict(dict, pdf_new_name("Type"), pdf_new_name("XObject"));
+ pdf_add_dict(dict, pdf_new_name("Subtype"), pdf_new_name("Image"));
+ pdf_add_dict(dict, pdf_new_name("Width"), pdf_new_number(info->width));
+ pdf_add_dict(dict, pdf_new_name("Height"), pdf_new_number(info->height));
+ pdf_add_dict(dict, pdf_new_name("BitsPerComponent"),
+ pdf_new_number(info->bits_per_component));
+
+ pdf_release_obj(resource); /* Caller don't know we are using reference. */
+ I->resource = NULL;
+}
+
+void
+pdf_ximage_set_form (pdf_ximage *I, void *form_info, pdf_obj *resource)
+{
+ xform_info *info = form_info;
+
+ I->subtype = PDF_XOBJECT_TYPE_FORM;
+ I->attr.bbox.llx = info->bbox.llx;
+ I->attr.bbox.lly = info->bbox.lly;
+ I->attr.bbox.urx = info->bbox.urx;
+ I->attr.bbox.ury = info->bbox.ury;
+
+ I->reference = pdf_ref_obj(resource);
+ pdf_release_obj(resource); /* Caller don't know we are using reference. */
+ I->resource = NULL;
+}
+
+
+#define CHECK_ID(c,n) do {\
+ if ((n) < 0 || (n) >= (c)->count) {\
+ ERROR("Invalid XObject ID: %d", (n));\
+ }\
+} while (0)
+#define GET_IMAGE(c,n) (&((c)->ximages[(n)]))
+
+pdf_obj *
+pdf_ximage_get_reference (int id)
+{
+ struct ic_ *ic = &_ic;
+ pdf_ximage *I;
+
+ CHECK_ID(ic, id);
+
+ I = GET_IMAGE(ic, id);
+ if (!I->reference)
+ I->reference = pdf_ref_obj(I->resource);
+
+ return pdf_link_obj(I->reference);
+}
+
+int
+pdf_ximage_defineresource (const char *ident,
+ int subtype, void *info, pdf_obj *resource)
+{
+ struct ic_ *ic = &_ic;
+ int id;
+ pdf_ximage *I;
+
+ id = ic->count;
+ if (ic->count >= ic->capacity) {
+ ic->capacity += 16;
+ ic->ximages = RENEW(ic->ximages, ic->capacity, pdf_ximage);
+ }
+
+ I = &ic->ximages[id];
+
+ pdf_init_ximage_struct(I);
+ if (ident) {
+ I->ident = NEW(strlen(ident) + 1, char);
+ strcpy(I->ident, ident);
+ }
+
+ switch (subtype) {
+ case PDF_XOBJECT_TYPE_IMAGE:
+ pdf_ximage_set_image(I, info, resource);
+ I->subtype = PDF_XOBJECT_TYPE_IMAGE;
+ sprintf(I->res_name, "Im%d", id);
+ break;
+ case PDF_XOBJECT_TYPE_FORM:
+ pdf_ximage_set_form (I, info, resource);
+ I->subtype = PDF_XOBJECT_TYPE_FORM;
+ sprintf(I->res_name, "Fm%d", id);
+ break;
+ default:
+ ERROR("Unknown XObject subtype: %d", subtype);
+ }
+ ic->count++;
+
+ return id;
+}
+
+
+char *
+pdf_ximage_get_resname (int id)
+{
+ struct ic_ *ic = &_ic;
+ pdf_ximage *I;
+
+ CHECK_ID(ic, id);
+
+ I = GET_IMAGE(ic, id);
+
+ return I->res_name;
+}
+
+/* depth...
+ * Dvipdfm treat "depth" as "yoffset" for pdf:image and pdf:uxobj
+ * not as vertical dimension of scaled image. (And there are bugs.)
+ * This part contains incompatibile behaviour than dvipdfm!
+ */
+#define EBB_DPI 72 /* was 100 in dvipdfmx; changed to 72 to match xetex's ideas
+ about graphics resolution/scaling */
+static void
+scale_to_fit_I (pdf_tmatrix *T,
+ transform_info *p,
+ pdf_ximage *I)
+{
+ double s_x, s_y;
+ long wdx = I->attr.width;
+ long htx = I->attr.height;
+ double ar, dp;
+ double xdpi = I->attr.xdpi;
+ double ydpi = I->attr.ydpi;
+
+ /* if image didn't have DPI info, then treat it as EBB_DPI */
+ if (xdpi == 0.0)
+ xdpi = EBB_DPI;
+ if (ydpi == 0.0)
+ ydpi = EBB_DPI;
+
+ if (htx == 0) {
+ WARN("Image height=0!");
+ htx = 1;
+ }
+
+ ar = (double) wdx / htx;
+
+ /* only width/height --> uniform (keep aspect ratio)
+ * no width-height --> uniform with 72dpi implied (?)
+ * both width-height --> non-uniform
+ */
+ if ( (p->flags & INFO_HAS_WIDTH ) &&
+ (p->flags & INFO_HAS_HEIGHT) ) {
+ s_x = p->width; s_y = p->height + p->depth;
+ dp = p->depth;
+ } else if ( p->flags & INFO_HAS_WIDTH ) {
+ s_x = p->width; s_y = s_x / ar;
+ dp = 0.0;
+ } else if ( p->flags & INFO_HAS_HEIGHT ) {
+ s_y = p->height + p->depth; s_x = s_y * ar;
+ dp = p->depth;
+ } else {
+ s_x = wdx * 72.0 / xdpi;
+ s_y = htx * 72.0 / ydpi;
+ dp = 0.0;
+ }
+
+ T->a = s_x; T->c = 0.0;
+ T->b = 0.0; T->d = s_y;
+ T->e = 0.0; T->f = -dp;
+
+ return;
+}
+
+
+static void
+scale_to_fit_F (pdf_tmatrix *T,
+ transform_info *p,
+ pdf_ximage *I)
+{
+ double s_x, s_y, d_x, d_y;
+ double wd0, ht0, dp;
+
+ if (p->flags & INFO_HAS_USER_BBOX) {
+ wd0 = p->bbox.urx - p->bbox.llx;
+ ht0 = p->bbox.ury - p->bbox.lly;
+ d_x = -p->bbox.llx;
+ d_y = -p->bbox.lly;
+ } else {
+ wd0 = I->attr.bbox.urx - I->attr.bbox.llx;
+ ht0 = I->attr.bbox.ury - I->attr.bbox.lly;
+ d_x = 0.0;
+ d_y = 0.0;
+ }
+
+ if (wd0 == 0.0) {
+ WARN("Image width=0.0!");
+ wd0 = 1.0;
+ }
+ if (ht0 == 0.0) {
+ WARN("Image height=0.0!");
+ ht0 = 1.0;
+ }
+
+ if ( (p->flags & INFO_HAS_WIDTH ) &&
+ (p->flags & INFO_HAS_HEIGHT) ) {
+ s_x = p->width / wd0;
+ s_y = (p->height + p->depth) / ht0;
+ dp = p->depth;
+ } else if ( p->flags & INFO_HAS_WIDTH ) {
+ s_x = p->width / wd0;
+ s_y = s_x;
+ dp = 0.0;
+ } else if ( p->flags & INFO_HAS_HEIGHT) {
+ s_y = (p->height + p->depth) / ht0;
+ s_x = s_y;
+ dp = p->depth;
+ } else {
+ s_x = s_y = 1.0;
+ dp = 0.0;
+ }
+
+ T->a = s_x; T->c = 0.0;
+ T->b = 0.0; T->d = s_y;
+ T->e = s_x * d_x; T->f = s_y * d_y - dp;
+
+ return;
+}
+
+
+int
+pdf_ximage_scale_image (int id,
+ pdf_tmatrix *M, /* ret */
+ pdf_rect *r, /* ret */
+ transform_info *p /* arg */
+ )
+{
+ struct ic_ *ic = &_ic;
+ pdf_ximage *I;
+
+ CHECK_ID(ic, id);
+
+ I = GET_IMAGE(ic, id);
+
+ pdf_setmatrix(M, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
+
+ switch (I->subtype) {
+ case PDF_XOBJECT_TYPE_IMAGE:
+ scale_to_fit_I(M, p, I);
+ r->llx = 0.0;
+ r->lly = 0.0;
+ r->urx = M->a;
+ r->ury = M->d;
+ break;
+ case PDF_XOBJECT_TYPE_FORM:
+ scale_to_fit_F(M, p, I);
+ if (p->flags & INFO_HAS_USER_BBOX) {
+ r->llx = p->bbox.llx;
+ r->lly = p->bbox.lly;
+ r->urx = p->bbox.urx;
+ r->ury = p->bbox.ury;
+ } else {
+ r->llx = I->attr.bbox.llx;
+ r->lly = I->attr.bbox.lly;
+ r->urx = I->attr.bbox.urx;
+ r->ury = I->attr.bbox.ury;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+
+/* Migrated from psimage.c */
+
+void set_distiller_template (char *s)
+{
+ if (_opts.cmdtmpl)
+ RELEASE(_opts.cmdtmpl);
+ if (!s || *s == '\0')
+ _opts.cmdtmpl = NULL;
+ else {
+ _opts.cmdtmpl = NEW(strlen(s) + 1, char);
+ strcpy(_opts.cmdtmpl, s);
+ }
+ return;
+}
+
+static int
+ps_include_page (pdf_ximage *ximage, const char *filename)
+{
+ char *distiller_template = _opts.cmdtmpl;
+ char *temp;
+ FILE *fp;
+ int error = 0;
+
+ if (!distiller_template) {
+ WARN("No image converter available for converting file \"%s\" to PDF format.", filename);
+ WARN(">> Please check if you have 'D' option in config file.");
+ return -1;
+ }
+
+ temp = dpx_create_temp_file();
+ if (!temp) {
+ WARN("Failed to create temporary file for image conversion: %s", filename);
+ return -1;
+ }
+
+ if (_opts.verbose > 1) {
+ MESG("\n");
+ MESG("pdf_image>> Converting file \"%s\" --> \"%s\" via:\n", filename, temp);
+ MESG("pdf_image>> %s\n", distiller_template);
+ MESG("pdf_image>> ...");
+ }
+
+ error = dpx_file_apply_filter(distiller_template, filename, temp);
+ if (error) {
+ WARN("Image format conversion for \"%s\" failed...", filename);
+ dpx_delete_temp_file(temp);
+ return error;
+ }
+
+ fp = MFOPEN(temp, FOPEN_RBIN_MODE);
+ if (!fp) {
+ WARN("Could not open conversion result \"%s\" for image \"%s\". Why?", temp, filename);
+ dpx_delete_temp_file(temp);
+ return -1;
+ }
+ error = pdf_include_page(ximage, fp, 0, pdfbox_crop);
+ MFCLOSE(fp);
+
+ if (_opts.verbose > 1) {
+ MESG("pdf_image>> deleting file \"%s\"", temp);
+ }
+ dpx_delete_temp_file(temp); /* temp freed here */
+
+ if (error) {
+ WARN("Failed to include image file \"%s\"", filename);
+ WARN(">> Please check if");
+ WARN(">> %s", distiller_template);
+ WARN(">> %%o = output filename, %%i = input filename, %%b = input filename without suffix");
+ WARN(">> can really convert \"%s\" to PDF format image.", filename);
+ }
+
+ return error;
+}
+
+static int check_for_ps (FILE *image_file)
+{
+ rewind (image_file);
+ mfgets (work_buffer, WORK_BUFFER_SIZE, image_file);
+ if (!strncmp (work_buffer, "%!", 2))
+ return 1;
+ return 0;
+}
+
+
diff --git a/Build/source/texk/xdvipdfmx/src/pdfximage.h b/Build/source/texk/xdvipdfmx/src/pdfximage.h
new file mode 100644
index 00000000000..730e5a1f9c5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pdfximage.h
@@ -0,0 +1,86 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfximage.h,v 1.8 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PDFXIMAGE_H_
+#define _PDFXIMAGE_H_
+
+#include "pdfdev.h"
+
+#define PDF_XOBJECT_TYPE_FORM 0
+#define PDF_XOBJECT_TYPE_IMAGE 1
+
+typedef struct {
+ int flags;
+
+ long width;
+ long height;
+
+ int bits_per_component;
+ int num_components;
+
+ double xdpi;
+ double ydpi;
+
+ long min_dpi; /* NOT USED YET */
+} ximage_info;
+
+typedef struct {
+ int flags;
+
+ pdf_rect bbox;
+ pdf_tmatrix matrix;
+} xform_info;
+
+typedef struct pdf_ximage_ pdf_ximage;
+
+extern void pdf_ximage_set_verbose (void);
+
+extern void pdf_init_images (void);
+extern void pdf_close_images (void);
+
+extern char *pdf_ximage_get_resname (int xobj_id);
+extern pdf_obj *pdf_ximage_get_reference (int xobj_id);
+
+
+extern int pdf_ximage_findresource (const char *ident, int page_index, int pdf_box);
+extern int pdf_ximage_defineresource (const char *ident,
+ int subtype, void *cdata, pdf_obj *resource);
+
+/* Called by pngimage, jpegimage, epdf, mpost, etc. */
+extern void pdf_ximage_init_image_info (ximage_info *info);
+extern void pdf_ximage_init_form_info (xform_info *info);
+extern void pdf_ximage_set_image (pdf_ximage *ximage, void *info, pdf_obj *resource);
+extern void pdf_ximage_set_form (pdf_ximage *ximage, void *info, pdf_obj *resource);
+
+/* from psimage.h */
+extern void set_distiller_template (char *s);
+
+extern int
+pdf_ximage_scale_image (int id,
+ pdf_tmatrix *M, /* ret */
+ pdf_rect *r, /* ret */
+ transform_info *p /* arg */
+ );
+
+#endif /* _PDFXIMAGE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pkfont.c b/Build/source/texk/xdvipdfmx/src/pkfont.c
new file mode 100644
index 00000000000..e081705addb
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pkfont.c
@@ -0,0 +1,793 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pkfont.c,v 1.16 2005/08/12 18:22:24 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+
+#include "numbers.h"
+#include "pdfobj.h"
+#include "pdfdev.h" /* pdf_rect */
+
+#include "pdfencoding.h"
+#include "pdffont.h"
+
+#include "pkfont.h"
+
+#define ENABLE_GLYPHENC 1
+
+#ifndef PKFONT_DPI_DEFAULT
+#define PKFONT_DPI_DEFAULT 600u
+#endif
+
+static unsigned base_dpi = PKFONT_DPI_DEFAULT;
+
+void
+PKFont_set_dpi (int dpi)
+{
+ if (dpi <= 0)
+ ERROR("Invalid DPI: %d\n", dpi);
+ base_dpi = dpi;
+}
+
+
+/* (Only) This requires TFM to get design size... */
+#include "tfm.h"
+
+static unsigned
+truedpi (const char *ident, double point_size, unsigned bdpi)
+{
+ unsigned dpi = bdpi;
+ double design_size;
+ int tfm_id;
+
+ tfm_id = tfm_open(ident, 0);
+ if (tfm_id < 0)
+ return dpi;
+
+ design_size = tfm_get_design_size(tfm_id);
+ if (design_size <= 0.0)
+ WARN("DESGIN_SIZE <= 0.0? (TFM=\"%s\")", ident);
+ else {
+ dpi = (unsigned) ROUND(base_dpi * point_size / design_size, 1.0);
+ }
+
+ return dpi;
+}
+
+static FILE *
+dpx_open_pk_font_at (const char *ident, unsigned dpi)
+{
+ FILE *fp;
+ char *fqpn;
+ kpse_glyph_file_type kpse_file_info;
+
+ fqpn = kpse_find_glyph(ident, dpi, kpse_pk_format, &kpse_file_info);
+ if (!fqpn)
+ return NULL;
+ fp = MFOPEN(fqpn, FOPEN_RBIN_MODE);
+ RELEASE(fqpn);
+
+ return fp;
+}
+
+
+int
+pdf_font_open_pkfont (pdf_font *font)
+{
+ char *ident;
+ double point_size;
+ int encoding_id;
+ unsigned dpi;
+ FILE *fp;
+
+ ident = pdf_font_get_ident(font);
+ point_size = pdf_font_get_param(font, PDF_FONT_PARAM_POINT_SIZE);
+ encoding_id = pdf_font_get_encoding(font);
+
+ if (!ident || point_size <= 0.0)
+ return -1;
+
+ dpi = truedpi(ident, point_size, base_dpi);
+ fp = dpx_open_pk_font_at(ident, dpi);
+ if (!fp)
+ return -1;
+ MFCLOSE(fp);
+
+ /* Type 3 fonts doesn't have FontName.
+ * FontFamily is recommended for PDF 1.5.
+ */
+ pdf_font_set_fontname(font, ident);
+
+ if (encoding_id >= 0) {
+ WARN("PK font is found for font \"%s\" but non built-in encoding \"%s\" is specified.",
+ ident, pdf_encoding_get_name(encoding_id));
+#if ENABLE_GLYPHENC
+ WARN(">> Assuming this is for glyph name assignment.");
+#else
+ WARN(">> I can't reencode PK font. (not enough information available)");
+ WARN(">> Maybe you need to install pfb/opentype/truetype font.");
+#endif
+ }
+
+ return 0;
+}
+
+
+/* We are using Mask Image. Fill black is bit clear.
+ * Optimizing those codes doesn't improve things.
+ */
+static long
+fill_black_run (unsigned char *dp, long left, long run_count)
+{
+ const static unsigned char mask[8] = {
+ 127u, 191u, 223u, 239u, 247u, 251u, 253u, 254u
+ };
+ long right = left + run_count - 1;
+ for ( ; left <= right; left++) {
+ dp[left / 8] &= mask[left % 8];
+ }
+ return run_count;
+}
+
+/* Just skip bits. See decode_packed() */
+static long
+fill_white_run (unsigned char *dp, long left, long run_count)
+{
+ return run_count;
+}
+
+static long
+pk_packed_num (long *np, int dyn_f, unsigned char *dp, long pl)
+{
+ long nmbr = 0, i = *np;
+ int nyb, j;
+#define get_nyb() ((i % 2) ? dp[i/2] & 0x0f : (dp[i/2] >> 4) & 0x0f)
+
+ if (i / 2 == pl) {
+ WARN("EOD reached while unpacking pk_packed_num.");
+ return 0;
+ }
+ nyb = get_nyb(); i++;
+ if (nyb == 0) {
+ j = 0;
+ do {
+ if (i / 2 == pl) {
+ WARN("EOD reached while unpacking pk_packed_num.");
+ break;
+ }
+ nyb = get_nyb(); i++;
+ j++;
+ } while (nyb == 0);
+ nmbr = nyb;
+ while (j-- > 0) {
+ if (i / 2 == pl) {
+ WARN("EOD reached while unpacking pk_packed_num.");
+ break;
+ }
+ nyb = get_nyb(); i++;
+ nmbr = nmbr * 16 + nyb;
+ }
+ nmbr += (13 - dyn_f) * 16 + dyn_f - 15;
+ } else if (nyb <= dyn_f) {
+ nmbr = nyb;
+ } else if (nyb < 14) {
+ if (i / 2 == pl) {
+ WARN("EOD reached while unpacking pk_packed_num.");
+ return 0;
+ }
+ nmbr = (nyb - dyn_f - 1) * 16 + get_nyb() + dyn_f + 1;
+ i++;
+ }
+
+ *np = i;
+ return nmbr;
+}
+
+
+#if DEBUG == 2
+static void
+send_out (unsigned char *rowptr, long rowbytes, long wd, pdf_obj *stream)
+#else
+static void
+send_out (unsigned char *rowptr, long rowbytes, pdf_obj *stream)
+#endif
+{
+ pdf_add_stream(stream, (void *)rowptr, rowbytes);
+#if DEBUG == 2
+ {
+ long i, n, len = (wd + 7) / 8;
+ int c;
+ fputc('|', stderr);
+ for (n = 0; n < len; n++) {
+ c = rowptr[n];
+ for (i = 0; i < 8; i++) {
+ if (n * 8 + i == wd)
+ break;
+ if (c & 1 << (7 - i))
+ fputc(' ', stderr);
+ else
+ fputc('*', stderr);
+ }
+ }
+ fputc('|', stderr);
+ fputc('\n', stderr);
+ }
+#endif /* DEBUG2 */
+}
+
+static int
+pk_decode_packed (pdf_obj *stream, long wd, long ht,
+ int dyn_f, int run_color, unsigned char *dp, long pl)
+{
+ unsigned char *rowptr;
+ long rowbytes;
+ long i, np = 0;
+ long run_count = 0, repeat_count = 0;
+
+ rowbytes = (wd + 7) / 8;
+ rowptr = NEW(rowbytes, unsigned char);
+ /* repeat count is applied to the *current* row.
+ * "run" can span across rows.
+ * If there are non-zero repeat count and if run
+ * spans across row, first repeat and then continue.
+ */
+#ifdef DEBUG
+ MESG("\npkfont>> wd: %ld, ht: %ld, dyn_f: %d\n", wd, ht, dyn_f);
+#endif
+ for (np = 0, i = 0; i < ht; i++) {
+ long rowbits_left, nbits;
+
+ repeat_count = 0;
+ memset(rowptr, 0xff, rowbytes); /* 1 is white */
+ rowbits_left = wd;
+ /* Fill run left over from previous row */
+ if (run_count > 0) {
+ nbits = MIN(rowbits_left, run_count);
+ switch (run_color) {
+ case 0:
+ rowbits_left -= fill_black_run(rowptr, 0, nbits);
+ break;
+ case 1:
+ rowbits_left -= fill_white_run(rowptr, 0, nbits);
+ break;
+ }
+ run_count -= nbits;
+ }
+
+ /* Read nybbles until we have a full row */
+ while (np / 2 < pl && rowbits_left > 0) {
+ int nyb;
+
+ nyb = (np % 2) ? dp[np/2] & 0x0f : (dp[np/2] >> 4) & 0x0f;
+#if DEBUG == 3
+ MESG("\npk_nyb: %d", nyb);
+#endif
+ if (nyb == 14) { /* packed number "repeat_count" follows */
+ if (repeat_count != 0)
+ WARN("Second repeat count for this row!");
+ np++; /* Consume this nybble */
+ repeat_count = pk_packed_num(&np, dyn_f, dp, pl);
+#if DEBUG == 3
+ MESG(" --> rep: %ld\n", repeat_count);
+#endif
+ } else if (nyb == 15) {
+ if (repeat_count != 0)
+ WARN("Second repeat count for this row!");
+ np++; /* Consume this nybble */
+ repeat_count = 1;
+#if DEBUG == 3
+ MESG(" --> rep: %ld\n", repeat_count);
+#endif
+ } else { /* run_count */
+ /* Interprete current nybble as packed number */
+ run_count = pk_packed_num(&np, dyn_f, dp, pl);
+#if DEBUG == 3
+ MESG(" --> run: %ld (%d)\n", run_count, run_color);
+#endif
+ nbits = MIN(rowbits_left, run_count);
+ run_color = !run_color;
+ run_count -= nbits;
+ switch (run_color) {
+ case 0:
+ rowbits_left -= fill_black_run(rowptr, wd - rowbits_left, nbits);
+ break;
+ case 1:
+ rowbits_left -= fill_white_run(rowptr, wd - rowbits_left, nbits);
+ break;
+ }
+ }
+ }
+ /* We got bitmap row data. */
+#if DEBUG == 2
+ send_out(rowptr, rowbytes, wd, stream);
+#else
+ send_out(rowptr, rowbytes, stream);
+#endif
+ for ( ; i < ht && repeat_count > 0; repeat_count--, i++)
+#if DEBUG == 2
+ send_out(rowptr, rowbytes, wd, stream);
+#else
+ send_out(rowptr, rowbytes, stream);
+#endif
+ }
+ RELEASE(rowptr);
+
+ return 0;
+}
+
+static int
+pk_decode_bitmap (pdf_obj *stream, long wd, long ht,
+ int dyn_f, int run_color, unsigned char *dp, long pl)
+{
+ unsigned char *rowptr, c;
+ long i, j, rowbytes;
+ const static unsigned char mask[8] = {
+ 0x80u, 0x40u, 0x20u, 0x10u, 0x08u, 0x04u, 0x02u, 0x01u
+ };
+
+ ASSERT( dyn_f == 14 );
+ if (run_color != 0) {
+ WARN("run_color != 0 for bitmap pk data?");
+ } else if (pl < (wd * ht + 7) / 8) {
+ WARN("Insufficient bitmap pk data. %ldbytes expected but only %ldbytes read.",
+ (wd * ht + 7) / 8, pl);
+ return -1;
+ }
+
+ rowbytes = (wd + 7) / 8;
+ rowptr = NEW(rowbytes, unsigned char);
+ memset(rowptr, 0, rowbytes);
+ /* Flip. PK bitmap is not byte aligned for each rows. */
+ for (i = 0, j = 0; i < ht * wd; i++) {
+ c = dp[i / 8] & mask[i % 8];
+ if (c == 0)
+ rowptr[j / 8] |= mask[i % 8]; /* flip bit */
+ j++;
+ if (j == wd) {
+#if DEBUG == 2
+ send_out(rowptr, rowbytes, wd, stream);
+#else
+ send_out(rowptr, rowbytes, stream);
+#endif
+ memset(rowptr, 0, rowbytes);
+ j = 0;
+ }
+ }
+
+ return 0;
+}
+
+
+/* Read PK font file */
+static void
+do_skip (FILE *fp, unsigned long length)
+{
+ while (length-- > 0)
+ fgetc(fp);
+}
+
+static void
+do_preamble (FILE *fp)
+{
+ /* Check for id byte */
+ if (fgetc(fp) == 89) {
+ /* Skip comment */
+ do_skip(fp, get_unsigned_byte(fp));
+ /* Skip other header info. It's normally used for verifying this
+ is the file wethink it is */
+ do_skip(fp, 16);
+ } else {
+ ERROR("embed_pk_font: PK ID byte is incorrect. Are you sure this is a PK file?");
+ }
+ return;
+}
+
+struct pk_header_
+{
+ unsigned long pkt_len;
+ SIGNED_QUAD chrcode;
+ SIGNED_QUAD wd, dx, dy;
+ UNSIGNED_QUAD bm_wd, bm_ht, bm_hoff, bm_voff;
+ int dyn_f, run_color;
+};
+
+static int
+read_pk_char_header (struct pk_header_ *h, unsigned char opcode, FILE *fp)
+{
+ ASSERT(h);
+
+ if ((opcode & 4) == 0) { /* short */
+ h->pkt_len = (opcode & 3) * 0x100U + get_unsigned_byte(fp);
+ h->chrcode = get_unsigned_byte(fp);
+ h->wd = get_unsigned_triple(fp); /* TFM width */
+ h->dx = get_unsigned_byte(fp) << 16; /* horizontal escapement */
+ h->dy = 0L;
+ h->bm_wd = get_unsigned_byte(fp);
+ h->bm_ht = get_unsigned_byte(fp);
+ h->bm_hoff = get_signed_byte(fp);
+ h->bm_voff = get_signed_byte(fp);
+ h->pkt_len -= 8;
+ } else if ((opcode & 7) == 7) { /* long */
+ h->pkt_len = get_unsigned_quad(fp);
+ h->chrcode = get_signed_quad(fp);
+ h->wd = get_signed_quad(fp);
+ h->dx = get_signed_quad(fp); /* 16.16 fixed point number in pixels */
+ h->dy = get_signed_quad(fp);
+ h->bm_wd = get_signed_quad(fp);
+ h->bm_ht = get_signed_quad(fp);
+ h->bm_hoff = get_signed_quad(fp);
+ h->bm_voff = get_signed_quad(fp);
+ h->pkt_len -= 28;
+ } else { /* extended short */
+ h->pkt_len = (opcode & 3) * 0x10000UL + get_unsigned_pair(fp);
+ h->chrcode = get_unsigned_byte(fp);
+ h->wd = get_unsigned_triple(fp);
+ h->dx = get_unsigned_pair(fp) << 16;
+ h->dy = 0x0L;
+ h->bm_wd = get_unsigned_pair(fp);
+ h->bm_ht = get_unsigned_pair(fp);
+ h->bm_hoff = get_signed_pair(fp);
+ h->bm_voff = get_signed_pair(fp);
+ h->pkt_len -= 13;
+ }
+
+ h->dyn_f = opcode / 16;
+ h->run_color = (opcode & 8) ? 1 : 0;
+
+ if (h->chrcode > 0xff)
+ {
+ WARN("Unable to handle long characters in PK files: code=0x%04x", h->chrcode);
+ return -1;
+ }
+
+ return 0;
+}
+
+/* CCITT Group 4 filter may reduce file size. */
+static pdf_obj *
+create_pk_CharProc_stream (struct pk_header_ *pkh,
+ double chrwid,
+ unsigned char *pkt_ptr, long pkt_len)
+{
+ pdf_obj *stream; /* charproc */
+ long llx, lly, urx, ury;
+ int len, error = 0;
+
+ llx = -pkh->bm_hoff;
+ lly = pkh->bm_voff - pkh->bm_ht;
+ urx = pkh->bm_wd - pkh->bm_hoff;
+ ury = pkh->bm_voff;
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+ /*
+ * The following line is a "metric" for the PDF reader:
+ *
+ * PDF Reference Reference, 4th ed., p.385.
+ *
+ * The wx (first operand of d1) must be consistent with the corresponding
+ * width in the font's Widths array. The format string of sprint() must be
+ * consistent with write_number() in pdfobj.c.
+ */
+ len = pdf_sprint_number(work_buffer, chrwid);
+ len += sprintf (work_buffer + len, " 0 %ld %ld %ld %ld d1\n", llx, lly, urx, ury);
+ pdf_add_stream(stream, work_buffer, len);
+ /*
+ * Acrobat dislike transformation [0 0 0 0 dx dy].
+ * PDF Reference, 4th ed., p.147, says,
+ *
+ * Use of a noninvertible matrix when painting graphics objects can result in
+ * unpredictable behavior.
+ *
+ * but it does not forbid use of such transformation.
+ */
+ if (pkh->bm_wd != 0 && pkh->bm_ht != 0 && pkt_len > 0) {
+ /* Scale and translate origin to lower left corner for raster data */
+ len = sprintf (work_buffer, "q\n%ld 0 0 %ld %ld %ld cm\n", pkh->bm_wd, pkh->bm_ht, llx, lly);
+ pdf_add_stream(stream, work_buffer, len);
+ len = sprintf (work_buffer, "BI\n/W %ld\n/H %ld\n/IM true\n/BPC 1\nID ", pkh->bm_wd, pkh->bm_ht);
+ pdf_add_stream(stream, work_buffer, len);
+ /* Add bitmap data */
+ if (pkh->dyn_f == 14) /* bitmap */
+ error = pk_decode_bitmap(stream,
+ pkh->bm_wd, pkh->bm_ht,
+ pkh->dyn_f, pkh->run_color,
+ pkt_ptr, pkt_len);
+ else
+ error = pk_decode_packed(stream,
+ pkh->bm_wd, pkh->bm_ht,
+ pkh->dyn_f, pkh->run_color,
+ pkt_ptr, pkt_len);
+ len = sprintf (work_buffer, "\nEI\nQ");
+ pdf_add_stream(stream, work_buffer, len);
+ } /* Otherwise we embed an empty stream :-( */
+
+ return stream;
+}
+
+#define PK_XXX1 240
+#define PK_XXX2 241
+#define PK_XXX3 242
+#define PK_XXX4 243
+#define PK_YYY 244
+#define PK_POST 245
+#define PK_NO_OP 246
+#define PK_PRE 247
+
+#define pk_char2name(b,c) sprintf((b), "x%02X", (unsigned char)(c))
+int
+pdf_font_load_pkfont (pdf_font *font)
+{
+ pdf_obj *fontdict;
+ char *usedchars;
+ char *ident;
+ unsigned dpi;
+ FILE *fp;
+ double point_size, pix2charu;
+ int opcode, code, firstchar, lastchar, prev;
+ pdf_obj *charprocs, *procset, *encoding, *tmp_array;
+ double widths[256];
+ pdf_rect bbox;
+ char charavail[256];
+#if ENABLE_GLYPHENC
+ int encoding_id;
+ char **enc_vec;
+#endif /* ENABLE_GLYPHENC */
+ int error = 0;
+
+ if (!pdf_font_is_in_use(font)) {
+ return 0;
+ }
+
+ ident = pdf_font_get_ident(font);
+ point_size = pdf_font_get_param(font, PDF_FONT_PARAM_POINT_SIZE);
+ usedchars = pdf_font_get_usedchars(font);
+#if ENABLE_GLYPHENC
+ encoding_id = pdf_font_get_encoding(font);
+ if (encoding_id < 0)
+ enc_vec = NULL;
+ else {
+ enc_vec = pdf_encoding_get_encoding(encoding_id);
+ }
+#endif /* ENABLE_GLYPHENC */
+
+ ASSERT(ident && usedchars && point_size > 0.0);
+
+ dpi = truedpi(ident, point_size, base_dpi);
+ fp = dpx_open_pk_font_at(ident, dpi);
+ if (!fp) {
+ ERROR("Could not find/open PK font file: %s (at %udpi)", ident, dpi);
+ }
+
+ memset(charavail, 0, 256);
+ charprocs = pdf_new_dict();
+ /* Include bitmap as 72dpi image:
+ * There seems to be problems in "scaled" bitmap glyph
+ * rendering in several viewers.
+ */
+ pix2charu = 72. * 1000. / ((double) base_dpi) / point_size;
+ bbox.llx = bbox.lly = bbox.urx = bbox.ury = 0.0;
+ while ((opcode = fgetc(fp)) >= 0 && opcode != PK_POST) {
+ if (opcode < 240) {
+ struct pk_header_ pkh;
+
+ error = read_pk_char_header(&pkh, opcode, fp);
+ if (error)
+ ERROR("Error in reading PK character header.");
+ else if (charavail[pkh.chrcode & 0xff])
+ WARN("More than two bitmap image for single glyph?: font=\"%s\" code=0x%02x",
+ ident, pkh.chrcode);
+
+ if (!usedchars[pkh.chrcode & 0xff])
+ do_skip(fp, pkh.pkt_len);
+ else {
+ char *charname;
+ pdf_obj *charproc;
+ unsigned char *pkt_ptr;
+ size_t bytesread;
+ double charwidth;
+
+ /* Charwidth in PDF units */
+ charwidth = ROUND(1000.0 * pkh.wd / (((double) (1<<20))*pix2charu), 0.1);
+ widths[pkh.chrcode & 0xff] = charwidth;
+
+ /* Update font BBox info */
+ bbox.llx = MIN(bbox.llx, -pkh.bm_hoff);
+ bbox.lly = MIN(bbox.lly, pkh.bm_voff - pkh.bm_ht);
+ bbox.urx = MIN(bbox.urx, pkh.bm_wd - pkh.bm_hoff);
+ bbox.ury = MIN(bbox.ury, pkh.bm_voff);
+
+ pkt_ptr = NEW(pkh.pkt_len, unsigned char);
+ if ((bytesread = fread(pkt_ptr, 1, pkh.pkt_len, fp))!= pkh.pkt_len) {
+ ERROR("Only %ld bytes PK packet read. (expected %ld bytes)",
+ bytesread, pkh.pkt_len);
+ }
+ charproc = create_pk_CharProc_stream(&pkh, charwidth, pkt_ptr, bytesread);
+ RELEASE(pkt_ptr);
+ if (!charproc)
+ ERROR("Unpacking PK character data failed.");
+#if ENABLE_GLYPHENC
+ if (encoding_id >= 0 && enc_vec) {
+ charname = (char *) enc_vec[pkh.chrcode & 0xff];
+ if (!charname || !strcmp(charname, ".notdef")) {
+ WARN("\".notdef\" glyph used in font (code=0x%02x): %s", pkh.chrcode, ident);
+ charname = work_buffer;
+ pk_char2name(charname, pkh.chrcode);
+ }
+ }
+ else
+#endif /* ENABLE_GLYPHENC */
+ {
+ charname = work_buffer;
+ pk_char2name(charname, pkh.chrcode);
+ }
+
+ pdf_add_dict(charprocs, pdf_new_name(charname), pdf_ref_obj(charproc)); /* _FIXME_ */
+ pdf_release_obj(charproc);
+ }
+ charavail[pkh.chrcode & 0xff] = 1;
+ } else { /* A command byte */
+ switch (opcode) {
+ case PK_NO_OP: break;
+ case PK_XXX1: do_skip(fp, get_unsigned_byte(fp)); break;
+ case PK_XXX2: do_skip(fp, get_unsigned_pair(fp)); break;
+ case PK_XXX3: do_skip(fp, get_unsigned_triple(fp)); break;
+ case PK_XXX4: do_skip(fp, get_unsigned_quad(fp)); break;
+ case PK_YYY: do_skip(fp, 4); break;
+ case PK_PRE: do_preamble(fp); break;
+ }
+ }
+ }
+ MFCLOSE(fp);
+
+ /* Check if we really got all glyphs needed. */
+ for (code = 0; code < 256; code++) {
+ if (usedchars[code] && !charavail[code])
+ WARN("Missing glyph code=0x%02x in PK font \"%s\".", code, ident);
+ }
+
+ /* Now actually fill fontdict. */
+ fontdict = pdf_font_get_resource(font);
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("CharProcs"), pdf_ref_obj(charprocs));
+ pdf_release_obj(charprocs);
+
+ /*
+ * Resources:
+ *
+ * PDF Reference 4th ed. describes it as "Optional but strongly recommended".
+ * There are no reason to put it in our case, but we will put this.
+ * We do not care about compatibility with Acrobat 2.x. (See implementation
+ * note 47, Appendix H of PDF Ref., 4th ed.).
+ */
+ procset = pdf_new_dict();
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_name("PDF"));
+ pdf_add_array(tmp_array, pdf_new_name("ImageB"));
+ pdf_add_dict(procset,
+ pdf_new_name("ProcSet"), tmp_array);
+ pdf_add_dict(fontdict,
+ pdf_new_name("Resources"), procset);
+
+ /* Encoding */
+ tmp_array = pdf_new_array();
+ prev = -2; firstchar = 255; lastchar = 0;
+ for (code = 0; code < 256; code++) {
+ char *charname;
+ if (usedchars[code]) {
+ if (code < firstchar) firstchar = code;
+ if (code > lastchar) lastchar = code;
+ if (code != prev + 1)
+ pdf_add_array(tmp_array, pdf_new_number(code));
+
+#if ENABLE_GLYPHENC
+ if (encoding_id >= 0 && enc_vec) {
+ charname = (char *) enc_vec[(unsigned char) code];
+ if (!charname || !strcmp(charname, ".notdef")) {
+ charname = work_buffer;
+ pk_char2name(charname, code);
+ }
+ }
+ else
+#endif /* ENABLE_GLYPHENC */
+ {
+ charname = work_buffer;
+ pk_char2name(charname, code);
+ }
+ pdf_add_array(tmp_array, pdf_new_name(charname));
+ prev = code;
+ }
+ }
+ if (firstchar > lastchar) {
+ ERROR("Unexpected error: firstchar > lastchar (%d %d)",
+ firstchar, lastchar);
+ pdf_release_obj(tmp_array);
+ return -1;
+ }
+ encoding = pdf_new_dict();
+ pdf_add_dict(encoding,
+ pdf_new_name("Type"), pdf_new_name("Encoding"));
+ pdf_add_dict(encoding,
+ pdf_new_name("Differences"), tmp_array);
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"), pdf_ref_obj(encoding));
+ pdf_release_obj(encoding);
+
+ /* FontBBox: Accurate value is important.
+ */
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_number(bbox.llx));
+ pdf_add_array(tmp_array, pdf_new_number(bbox.lly));
+ pdf_add_array(tmp_array, pdf_new_number(bbox.urx));
+ pdf_add_array(tmp_array, pdf_new_number(bbox.ury));
+ pdf_add_dict (fontdict , pdf_new_name("FontBBox"), tmp_array);
+
+ /* Widths:
+ * Indirect reference preffered. (See PDF Reference)
+ */
+ tmp_array = pdf_new_array();
+ for (code = firstchar; code <= lastchar; code++) {
+ if (usedchars[code])
+ pdf_add_array(tmp_array, pdf_new_number(widths[code]));
+ else {
+ pdf_add_array(tmp_array, pdf_new_number(0));
+ }
+ }
+ pdf_add_dict(fontdict,
+ pdf_new_name("Widths"), pdf_ref_obj(tmp_array));
+ pdf_release_obj(tmp_array);
+
+ /* FontMatrix */
+ tmp_array = pdf_new_array();
+ pdf_add_array(tmp_array, pdf_new_number(0.001 * pix2charu));
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ pdf_add_array(tmp_array, pdf_new_number(0.001 * pix2charu));
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ pdf_add_dict (fontdict , pdf_new_name("FontMatrix"), tmp_array);
+
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("FirstChar"), pdf_new_number(firstchar));
+ pdf_add_dict(fontdict,
+ pdf_new_name("LastChar"), pdf_new_number(lastchar));
+
+#if ENABLE_GLYPHENC
+ /* ToUnicode */
+ if (encoding_id >= 0) {
+ if (!pdf_lookup_dict(fontdict, "ToUnicode"))
+ pdf_attach_ToUnicode_CMap(fontdict, encoding_id, usedchars);
+ }
+#endif /* ENABLE_GLYPHENC */
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pkfont.h b/Build/source/texk/xdvipdfmx/src/pkfont.h
new file mode 100644
index 00000000000..9e5b9f87bb3
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pkfont.h
@@ -0,0 +1,35 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pkfont.h,v 1.6 2004/09/02 12:23:07 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PK_FONT_H_
+#define _PK_FONT_H_
+
+#include "pdffont.h"
+
+extern int pdf_font_open_pkfont (pdf_font *font);
+extern int pdf_font_load_pkfont (pdf_font *font);
+
+extern void PKFont_set_dpi(int dpi);
+
+#endif /* _PK_FONT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pngimage.c b/Build/source/texk/xdvipdfmx/src/pngimage.c
new file mode 100644
index 00000000000..9d680b73afd
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pngimage.c
@@ -0,0 +1,1006 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pngimage.c,v 1.24 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/*
+ * PNG SUPPORT
+ *
+ * All bitdepth less than 16 is supported.
+ * Supported color types are: PALETTE, RGB, GRAY, RGB_ALPHA, GRAY_ALPHA.
+ * Supported ancillary chunks: tRNS, cHRM + gAMA, (sRGB), (iCCP)
+ *
+ * gAMA support is available only when cHRM exists. cHRM support is not
+ * tested well. CalRGB/CalGray colorspace is used for PNG images that
+ * have cHRM chunk (but not sRGB).
+ *
+ * LIMITATIONS
+ *
+ * Recent version of PDF (>= 1.5) support 16 bpc, but 16 bit bitdepth PNG
+ * images are automatically converted to 8 bit bitpedth image.
+ *
+ * TODO
+ *
+ * sBIT ? iTXT, tEXT and tIME as MetaData ?, pHYS (see below)
+ * 16 bpc support for PDF-1.5. JBIG compression for monochrome image.
+ * Predictor for deflate ?
+ */
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "pdfcolor.h"
+#include "pdfobj.h"
+
+#define PNG_DEBUG_STR "PNG"
+#define PNG_DEBUG 3
+
+#ifdef HAVE_LIBPNG
+
+/*
+ * Write, MNG, Progressive not required.
+ */
+#define PNG_NO_WRITE_SUPPORTED
+#define PNG_NO_MNG_FEATURES
+#define PNG_NO_PROGRESSIVE_READ
+#if 0
+/* 16_TO_8 required. */
+#define PNG_NO_READ_TRANSFORMS
+#endif
+
+#include <png.h>
+#include "pngimage.h"
+
+#include "pdfximage.h"
+
+#define PDF_TRANS_TYPE_NONE 0
+#define PDF_TRANS_TYPE_BINARY 1
+#define PDF_TRANS_TYPE_ALPHA 2
+
+/* ColorSpace */
+static pdf_obj *create_cspace_Indexed (png_structp png_ptr, png_infop info_ptr);
+
+/* CIE-Based: CalRGB/CalGray
+ *
+ * We ignore gAMA if cHRM is not found.
+ */
+static pdf_obj *create_cspace_CalRGB (png_structp png_ptr, png_infop info_ptr);
+static pdf_obj *create_cspace_CalGray (png_structp png_ptr, png_infop info_ptr);
+static pdf_obj *make_param_Cal (png_byte color_type,
+ double G,
+ double xw, double yw,
+ double xr, double yr,
+ double xg, double yg,
+ double xb, double yb);
+
+/* sRGB:
+ *
+ * We (and PDF) do not have direct sRGB support. The sRGB color space can be
+ * precisely represented by ICC profile, but we use approximate CalRGB color
+ * space.
+ */
+static pdf_obj *create_cspace_sRGB (png_structp png_ptr, png_infop info_ptr);
+static pdf_obj *get_rendering_intent (png_structp png_ptr, png_infop info_ptr);
+
+/* ICCBased:
+ *
+ * Not supported yet.
+ * Must check if ICC profile is valid and can be imported to PDF.
+ * There are few restrictions (should be applied to PNG too?) in ICC profile
+ * support in PDF. Some information should be obtained from profile.
+ */
+static pdf_obj *create_cspace_ICCBased (png_structp png_ptr, png_infop info_ptr);
+
+/* Transparency */
+static int check_transparency (png_structp png_ptr, png_infop info_ptr);
+/* Color-Key Mask */
+static pdf_obj *create_ckey_mask (png_structp png_ptr, png_infop info_ptr);
+/* Soft Mask:
+ *
+ * create_soft_mask() is for PNG_COLOR_TYPE_PALLETE.
+ * Images with alpha chunnel use strip_soft_mask().
+ * An object representing mask itself is returned.
+ */
+static pdf_obj *create_soft_mask (png_structp png_ptr, png_infop info_ptr,
+ png_bytep image_data_ptr,
+ png_uint_32 width, png_uint_32 height);
+static pdf_obj *strip_soft_mask (png_structp png_ptr, png_infop info_ptr,
+ png_bytep image_data_ptr,
+ png_uint_32p rowbytes_ptr,
+ png_uint_32 width, png_uint_32 height);
+
+/* Read image body */
+static void read_image_data (png_structp png_ptr, png_infop info_ptr,
+ png_bytep dest_ptr,
+ png_uint_32 height, png_uint_32 rowbytes);
+
+int
+check_for_png (FILE *png_file)
+{
+ unsigned char sigbytes[4];
+
+ rewind (png_file);
+ if (fread (sigbytes, 1, sizeof(sigbytes), png_file) !=
+ sizeof(sigbytes) ||
+ (!png_check_sig (sigbytes, sizeof(sigbytes))))
+ return 0;
+ else
+ return 1;
+}
+
+int
+png_include_image (pdf_ximage *ximage, FILE *png_file)
+{
+ pdf_obj *stream;
+ pdf_obj *stream_dict;
+ pdf_obj *colorspace, *mask, *intent;
+ png_bytep stream_data_ptr;
+ int trans_type;
+ ximage_info info;
+ /* Libpng stuff */
+ png_structp png_ptr;
+ png_infop png_info_ptr;
+ png_byte bpc, color_type;
+ png_uint_32 width, height, rowbytes;
+
+ pdf_ximage_init_image_info(&info);
+
+ stream = NULL;
+ stream_dict = NULL;
+ colorspace = mask = intent = NULL;
+
+ rewind (png_file);
+ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if (png_ptr == NULL ||
+ (png_info_ptr = png_create_info_struct (png_ptr)) == NULL) {
+ WARN("%s: Creating Libpng read/info struct failed.", PNG_DEBUG_STR);
+ if (png_ptr)
+ png_destroy_read_struct(&png_ptr, NULL, NULL);
+ return -1;
+ }
+
+ /* Inititializing file IO. */
+ png_init_io (png_ptr, png_file);
+
+ /* Read PNG info-header and get some info. */
+ png_read_info(png_ptr, png_info_ptr);
+ color_type = png_get_color_type (png_ptr, png_info_ptr);
+ width = png_get_image_width (png_ptr, png_info_ptr);
+ height = png_get_image_height(png_ptr, png_info_ptr);
+ bpc = png_get_bit_depth (png_ptr, png_info_ptr);
+
+ info.xdpi = png_get_x_pixels_per_meter(png_ptr, png_info_ptr) * 0.0254;
+ info.ydpi = png_get_y_pixels_per_meter(png_ptr, png_info_ptr) * 0.0254;
+
+ /* We do not need 16-bpc color. Ask libpng to convert down to 8-bpc. */
+ if (bpc > 8) {
+ png_set_strip_16(png_ptr);
+ bpc = 8;
+ }
+
+ trans_type = check_transparency(png_ptr, png_info_ptr);
+ /* check_transparency() does not do updata_info() */
+ png_read_update_info(png_ptr, png_info_ptr);
+ rowbytes = png_get_rowbytes(png_ptr, png_info_ptr);
+
+ stream = pdf_new_stream (STREAM_COMPRESS);
+ stream_dict = pdf_stream_dict(stream);
+
+ /* Values listed below will not be modified in the remaining process. */
+ info.width = width;
+ info.height = height;
+ info.bits_per_component = bpc;
+
+ stream_data_ptr = (png_bytep) NEW(rowbytes*height, png_byte);
+ read_image_data(png_ptr, png_info_ptr, stream_data_ptr, height, rowbytes);
+
+ /* Non-NULL intent means there is valid sRGB chunk. */
+ intent = get_rendering_intent(png_ptr, png_info_ptr);
+ if (intent)
+ pdf_add_dict(stream_dict, pdf_new_name("Intent"), intent);
+
+ switch (color_type) {
+ case PNG_COLOR_TYPE_PALETTE:
+
+ colorspace = create_cspace_Indexed(png_ptr, png_info_ptr);
+
+ switch (trans_type) {
+ case PDF_TRANS_TYPE_BINARY:
+ /* Color-key masking */
+ mask = create_ckey_mask(png_ptr, png_info_ptr);
+ break;
+ case PDF_TRANS_TYPE_ALPHA:
+ /* Soft mask */
+ mask = create_soft_mask(png_ptr, png_info_ptr, stream_data_ptr, width, height);
+ break;
+ default:
+ /* Nothing to be done here.
+ * No tRNS chunk or image already composited with background color.
+ */
+ break;
+ }
+ break;
+ case PNG_COLOR_TYPE_RGB:
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+
+ if (png_get_valid(png_ptr, png_info_ptr, PNG_INFO_iCCP))
+ colorspace = create_cspace_ICCBased(png_ptr, png_info_ptr);
+ else if (intent) {
+ colorspace = create_cspace_sRGB(png_ptr, png_info_ptr);
+ } else {
+ colorspace = create_cspace_CalRGB(png_ptr, png_info_ptr);
+ }
+ if (!colorspace)
+ colorspace = pdf_new_name("DeviceRGB");
+
+ switch (trans_type) {
+ case PDF_TRANS_TYPE_BINARY:
+ if (color_type != PNG_COLOR_TYPE_RGB)
+ ERROR("Unexpected error in png_include_image().");
+ mask = create_ckey_mask(png_ptr, png_info_ptr);
+ break;
+ /* rowbytes changes 4 to 3 at here */
+ case PDF_TRANS_TYPE_ALPHA:
+ if (color_type != PNG_COLOR_TYPE_RGB_ALPHA)
+ ERROR("Unexpected error in png_include_image().");
+ mask = strip_soft_mask(png_ptr, png_info_ptr,
+ stream_data_ptr, &rowbytes, width, height);
+ break;
+ default:
+ mask = NULL;
+ }
+ info.num_components = 3;
+ break;
+
+ case PNG_COLOR_TYPE_GRAY:
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+
+ if (png_get_valid(png_ptr, png_info_ptr, PNG_INFO_iCCP))
+ colorspace = create_cspace_ICCBased(png_ptr, png_info_ptr);
+ else if (intent) {
+ colorspace = create_cspace_sRGB(png_ptr, png_info_ptr);
+ } else {
+ colorspace = create_cspace_CalGray(png_ptr, png_info_ptr);
+ }
+ if (!colorspace)
+ colorspace = pdf_new_name("DeviceGray");
+
+ switch (trans_type) {
+ case PDF_TRANS_TYPE_BINARY:
+ if (color_type != PNG_COLOR_TYPE_GRAY)
+ ERROR("Unexpected error in png_include_image().");
+ mask = create_ckey_mask(png_ptr, png_info_ptr);
+ break;
+ case PDF_TRANS_TYPE_ALPHA:
+ if (color_type != PNG_COLOR_TYPE_GRAY_ALPHA)
+ ERROR("Unexpected error in png_include_image().");
+ mask = strip_soft_mask(png_ptr, png_info_ptr,
+ stream_data_ptr, &rowbytes, width, height);
+ break;
+ default:
+ mask = NULL;
+ }
+ info.num_components = 1;
+ break;
+
+ default:
+ WARN("%s: Unknown PNG colortype %d.", PNG_DEBUG_STR, color_type);
+ }
+ pdf_add_dict(stream_dict, pdf_new_name("ColorSpace"), colorspace);
+
+ pdf_add_stream(stream, stream_data_ptr, rowbytes*height);
+ RELEASE(stream_data_ptr);
+
+ if (mask) {
+ if (trans_type == PDF_TRANS_TYPE_BINARY)
+ pdf_add_dict(stream_dict, pdf_new_name("Mask"), mask);
+ else if (trans_type == PDF_TRANS_TYPE_ALPHA) {
+ pdf_add_dict(stream_dict, pdf_new_name("SMask"), pdf_ref_obj(mask));
+ pdf_release_obj(mask);
+ } else {
+ WARN("%s: You found a bug in pngimage.c.", PNG_DEBUG_STR);
+ pdf_release_obj(mask);
+ }
+ }
+
+ png_read_end(png_ptr, NULL);
+
+ /* Cleanup */
+ if (png_info_ptr)
+ png_destroy_info_struct(png_ptr, &png_info_ptr);
+ if (png_ptr)
+ png_destroy_read_struct(&png_ptr, NULL, NULL);
+
+ pdf_ximage_set_image(ximage, &info, stream);
+
+ return 0;
+}
+
+/*
+ * The returned value trans_type is the type of transparency to be used for
+ * this image. Possible values are:
+ *
+ * PDF_TRANS_TYPE_NONE No Masking will be used/required.
+ * PDF_TRANS_TYPE_BINARY Pixels are either fully opaque/fully transparent.
+ * PDF_TRANS_TYPE_ALPHA Uses alpha channel, requies SMask.(PDF-1.4)
+ *
+ * check_transparency() must check the current setting of output PDF version
+ * and must choose appropriate trans_type value according to PDF version of
+ * current output PDF document.
+ *
+ * If the PDF version is less than 1.3, no transparency is supported for this
+ * version of PDF, hence PDF_TRANS_TYPE_NONE must be returned. And when the PDF
+ * version is equal to 1.3, possible retrun values are PDF_TRANS_TYPE_BINARY or
+ * PDF_TRANS_TYPE_NONE. The latter case arises when PNG file uses alpha channel
+ * explicitly (color type PNG_COLOR_TYPE_XXX_ALPHA), or the tRNS chunk for the
+ * PNG_COLOR_TYPE_PALETTE image contains intermediate values of opacity.
+ *
+ * Finally, in the case of PDF version 1.4, all kind of translucent pixels can
+ * be represented with Soft-Mask.
+ */
+
+static int
+check_transparency (png_structp png_ptr, png_infop info_ptr)
+{
+ int trans_type;
+ unsigned pdf_version;
+ png_byte color_type;
+ png_color_16p trans_values;
+ png_bytep trans;
+ int num_trans;
+
+ pdf_version = pdf_get_version();
+ color_type = png_get_color_type(png_ptr, info_ptr);
+
+ /*
+ * First we set trans_type to appropriate value for PNG image.
+ */
+ if (color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ trans_type = PDF_TRANS_TYPE_ALPHA;
+ } else if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) &&
+ png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values)) {
+ /* Have valid tRNS chunk. */
+ switch (color_type) {
+ case PNG_COLOR_TYPE_PALETTE:
+ /* Use color-key mask if possible. */
+ trans_type = PDF_TRANS_TYPE_BINARY;
+ while (num_trans-- > 0) {
+ if (trans[num_trans] != 0x00 && trans[num_trans] != 0xff) {
+ /* This seems not binary transparency */
+ trans_type = PDF_TRANS_TYPE_ALPHA;
+ break;
+ }
+ }
+ break;
+ case PNG_COLOR_TYPE_GRAY:
+ case PNG_COLOR_TYPE_RGB:
+ /* RGB or GRAY, single color specified by trans_values is transparent. */
+ trans_type = PDF_TRANS_TYPE_BINARY;
+ break;
+ default:
+ /* Else tRNS silently ignored. */
+ trans_type = PDF_TRANS_TYPE_NONE;
+ }
+ } else { /* no transparency */
+ trans_type = PDF_TRANS_TYPE_NONE;
+ }
+
+ /*
+ * Now we check PDF version.
+ * We can convert alpha cahnnels to explicit mask via user supplied alpha-
+ * threshold value. But I will not do that.
+ */
+ if (( pdf_version < 3 && trans_type != PDF_TRANS_TYPE_NONE ) ||
+ ( pdf_version < 4 && trans_type == PDF_TRANS_TYPE_ALPHA )) {
+ /*
+ * No transparency supported but PNG uses transparency, or Soft-Mask
+ * required but no support for it is available in this version of PDF.
+ * We must do pre-composition of image with the background image here. But,
+ * we cannot do that in general since dvipdfmx is not a rasterizer. What we
+ * can do here is to composite image with a rectangle filled with the
+ * background color. However, images are stored as an Image XObject which
+ * can be referenced anywhere in the PDF document content. Hence, we cannot
+ * know the correct background color at this time. So we will choose white
+ * as background color, which is most probable color in our cases.
+ * We ignore bKGD chunk.
+ */
+ png_color_16 bg;
+ bg.red = 255; bg.green = 255; bg.blue = 255; bg.gray = 255; bg.index = 0;
+ png_set_background(png_ptr, &bg, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
+ WARN("%s: Transparency will be ignored. (no support in PDF ver. < 1.3)", PNG_DEBUG_STR);
+ if (pdf_version < 3)
+ WARN("%s: Please use -V 3 option to enable binary transparency support.", PNG_DEBUG_STR);
+ if (pdf_version < 4)
+ WARN("%s: Please use -V 4 option to enable full alpha channel support.", PNG_DEBUG_STR);
+ trans_type = PDF_TRANS_TYPE_NONE;
+ }
+
+ return trans_type;
+}
+
+/*
+ * sRGB:
+ *
+ * If sRGB chunk is present, cHRM and gAMA chunk must be ignored.
+ *
+ */
+static pdf_obj *
+get_rendering_intent (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *intent;
+ int srgb_intent;
+
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sRGB) &&
+ png_get_sRGB (png_ptr, info_ptr, &srgb_intent)) {
+ switch (srgb_intent) {
+ case PNG_sRGB_INTENT_SATURATION:
+ intent = pdf_new_name("Saturation");
+ break;
+ case PNG_sRGB_INTENT_PERCEPTUAL:
+ intent = pdf_new_name("Perceptual");
+ break;
+ case PNG_sRGB_INTENT_ABSOLUTE:
+ intent = pdf_new_name("AbsoluteColorimetric");
+ break;
+ case PNG_sRGB_INTENT_RELATIVE:
+ intent = pdf_new_name("RelativeColorimetric");
+ break;
+ default:
+ WARN("%s: Invalid value in PNG sRGB chunk: %d", PNG_DEBUG_STR, srgb_intent);
+ intent = NULL;
+ }
+ } else
+ intent = NULL;
+
+ return intent;
+}
+
+/* Approximated sRGB */
+static pdf_obj *
+create_cspace_sRGB (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *colorspace;
+ pdf_obj *cal_param;
+ png_byte color_type;
+
+ color_type = png_get_color_type(png_ptr, info_ptr);
+
+ /* Parameters taken from PNG spec. section 4.2.2.3. */
+ cal_param = make_param_Cal(color_type,
+ 2.2,
+ 0.3127, 0.329,
+ 0.64, 0.33, 0.3, 0.6, 0.15, 0.06);
+ if (!cal_param)
+ return NULL;
+
+ colorspace = pdf_new_array();
+
+ switch (color_type) {
+ case PNG_COLOR_TYPE_RGB:
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ case PNG_COLOR_TYPE_PALETTE:
+ pdf_add_array(colorspace, pdf_new_name("CalRGB"));
+ break;
+ case PNG_COLOR_TYPE_GRAY:
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ pdf_add_array(colorspace, pdf_new_name("CalGray"));
+ break;
+ }
+ pdf_add_array(colorspace, cal_param);
+
+ return colorspace;
+}
+
+static pdf_obj *
+create_cspace_ICCBased (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *colorspace;
+ int csp_id, colortype;
+ png_byte color_type;
+ png_charp name;
+ int compression_type; /* Manual page for libpng does not
+ * clarify whether profile data is inflated by libpng.
+ */
+ png_charp profile; /* Might be switched to png_bytep */
+ png_uint_32 proflen;
+
+ if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_iCCP) ||
+ !png_get_iCCP(png_ptr, info_ptr, &name, &compression_type, &profile, &proflen))
+ return NULL;
+
+ color_type = png_get_color_type(png_ptr, info_ptr);
+
+ if (color_type & PNG_COLOR_MASK_COLOR) {
+ colortype = PDF_COLORSPACE_TYPE_RGB;
+#if 0
+ alternate = create_cspace_CalRGB(png_ptr, info_ptr);
+#endif
+ } else {
+ colortype = PDF_COLORSPACE_TYPE_GRAY;
+#if 0
+ alternate = create_cspace_CalGray(png_ptr, info_ptr);
+#endif
+ }
+
+#if 0
+ if (alternate)
+ pdf_add_dict(dict, pdf_new_name("Alternate"), alternate);
+#endif
+
+ if (iccp_check_colorspace(colortype, profile, proflen) < 0)
+ colorspace = NULL;
+ else {
+ csp_id = iccp_load_profile(name, profile, proflen);
+ if (csp_id < 0) {
+ colorspace = NULL;
+ } else {
+ colorspace = pdf_get_colorspace_reference(csp_id);
+ }
+ }
+
+ /* Rendering intent ... */
+
+ return colorspace;
+}
+
+/*
+ * gAMA, cHRM:
+ *
+ * If cHRM is present, we use CIE-Based color space. gAMA is also used here
+ * if available.
+ */
+
+#define INVALID_CHRM_VALUE(xw,yw,xr,yr,xg,yg,xb,yb) (\
+ (xw) <= 0.0 || (yw) < 1.0e-10 || \
+ (xr) < 0.0 || (yr) < 0.0 || (xg) < 0.0 || (yg) < 0.0 || \
+ (xb) < 0.0 || (yb) < 0.0)
+
+static pdf_obj *
+create_cspace_CalRGB (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *colorspace;
+ pdf_obj *cal_param;
+ double xw, yw, xr, yr, xg, yg, xb, yb;
+ double G;
+
+ if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_cHRM) ||
+ !png_get_cHRM(png_ptr, info_ptr, &xw, &yw, &xr, &yr, &xg, &yg, &xb, &yb))
+ return NULL;
+
+ if (xw <= 0.0 || yw < 1.0e-10 ||
+ xr < 0.0 || yr < 0.0 || xg < 0.0 || yg < 0.0 || xb < 0.0 || yb < 0.0) {
+ WARN("%s: Invalid cHRM chunk parameters found.", PNG_DEBUG_STR);
+ return NULL;
+ }
+
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) &&
+ png_get_gAMA (png_ptr, info_ptr, &G)) {
+ if (G < 1.0e-2) {
+ WARN("%s: Unusual Gamma value: %g", PNG_DEBUG_STR, G);
+ return NULL;
+ }
+ G = 1.0 / G; /* Gamma is inverted. */
+ } else {
+ G = 1.0;
+ }
+
+ cal_param = make_param_Cal(PNG_COLOR_TYPE_RGB, G, xw, yw, xr, yr, xg, yg, xb, yb);
+
+ if (!cal_param)
+ return NULL;
+
+ colorspace = pdf_new_array();
+ pdf_add_array(colorspace, pdf_new_name("CalRGB"));
+ pdf_add_array(colorspace, cal_param);
+
+ return colorspace;
+}
+
+static pdf_obj *
+create_cspace_CalGray (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *colorspace;
+ pdf_obj *cal_param;
+ double xw, yw, xr, yr, xg, yg, xb, yb;
+ double G;
+
+ if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_cHRM) ||
+ !png_get_cHRM(png_ptr, info_ptr, &xw, &yw, &xr, &yr, &xg, &yg, &xb, &yb))
+ return NULL;
+
+ if (xw <= 0.0 || yw < 1.0e-10 ||
+ xr < 0.0 || yr < 0.0 || xg < 0.0 || yg < 0.0 || xb < 0.0 || yb < 0.0) {
+ WARN("%s: Invalid cHRM chunk parameters found.", PNG_DEBUG_STR);
+ return NULL;
+ }
+
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA) &&
+ png_get_gAMA (png_ptr, info_ptr, &G)) {
+ if (G < 1.0e-2) {
+ WARN("%s: Unusual Gamma value: %g", PNG_DEBUG_STR, G);
+ return NULL;
+ }
+ G = 1.0 / G; /* Gamma is inverted. */
+ } else {
+ G = 1.0;
+ }
+
+ cal_param = make_param_Cal(PNG_COLOR_TYPE_GRAY, G, xw, yw, xr, yr, xg, yg, xb, yb);
+
+ if (!cal_param)
+ return NULL;
+
+ colorspace = pdf_new_array();
+ pdf_add_array(colorspace, pdf_new_name("CalGray"));
+ pdf_add_array(colorspace, cal_param);
+
+ return colorspace;
+}
+
+static pdf_obj *
+make_param_Cal (png_byte color_type,
+ double G, /* Gamma */
+ double xw, double yw,
+ double xr, double yr, double xg, double yg, double xb, double yb)
+{
+ pdf_obj *cal_param;
+ pdf_obj *white_point, *matrix, *dev_gamma;
+ double Xw, Yw, Zw; /* Yw = 1.0 */
+ double Xr, Xg, Xb, Yr, Yb, Yg, Zr, Zg, Zb;
+
+#ifndef ABS
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+#endif
+ /*
+ * TODO: Check validity
+ *
+ * Conversion found in
+ *
+ * com.sixlegs.image.png - Java package to read and display PNG images
+ * Copyright (C) 1998, 1999, 2001 Chris Nokleberg
+ *
+ * http://www.sixlegs.com/software/png/
+ *
+ */
+ {
+ double zw, zr, zg, zb;
+ double fr, fg, fb;
+ double det;
+
+ /* WhitePoint */
+ zw = 1 - (xw + yw);
+ zr = 1 - (xr + yr); zg = 1 - (xg + yg); zb = 1 - (xb + yb);
+ Xw = xw / yw; Yw = 1.0; Zw = zw / yw;
+
+ /* Matrix */
+ det = xr * (yg * zb - zg * yb) - xg * (yr * zb - zr * yb) + xb * (yr * zg - zr * yg);
+ if (ABS(det) < 1.0e-10) {
+ WARN("Non invertible matrix: Maybe invalid value(s) specified in cHRM chunk.");
+ return NULL;
+ }
+ fr = (Xw * (yg * zb - zg * yb) - xg * (zb - Zw * yb) + xb * (zg - Zw * yg)) / det;
+ fg = (xr * (zb - Zw * yb) - Xw * (yr * zb - zr * yb) + xb * (yr * Zw - zr)) / det;
+ fb = (xr * (yg * Zw - zg) - xg * (yr * Zw - zr) + Xw * (yr * zg - zr * yg)) / det;
+ Xr = fr * xr; Yr = fr * yr; Zr = fr * zr;
+ Xg = fg * xg; Yg = fg * yg; Zg = fg * zg;
+ Xb = fb * xb; Yb = fb * yb; Zb = fb * zb;
+ }
+
+ if (G < 1.0e-2) {
+ WARN("Unusual Gamma specified: %g", G);
+ return NULL;
+ }
+
+ cal_param = pdf_new_dict();
+
+ /* White point is always required. */
+ white_point = pdf_new_array();
+ pdf_add_array(white_point, pdf_new_number(ROUND(Xw, 0.00001)));
+ pdf_add_array(white_point, pdf_new_number(ROUND(Yw, 0.00001)));
+ pdf_add_array(white_point, pdf_new_number(ROUND(Zw, 0.00001)));
+ pdf_add_dict(cal_param, pdf_new_name("WhitePoint"), white_point);
+
+ /* Matrix - default: Identity */
+ if (color_type & PNG_COLOR_MASK_COLOR) {
+ if (G != 1.0) {
+ dev_gamma = pdf_new_array();
+ pdf_add_array(dev_gamma, pdf_new_number(ROUND(G, 0.00001)));
+ pdf_add_array(dev_gamma, pdf_new_number(ROUND(G, 0.00001)));
+ pdf_add_array(dev_gamma, pdf_new_number(ROUND(G, 0.00001)));
+ pdf_add_dict(cal_param, pdf_new_name("Gamma"), dev_gamma);
+ }
+
+ matrix = pdf_new_array();
+ pdf_add_array(matrix, pdf_new_number(ROUND(Xr, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Yr, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Zr, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Xg, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Yg, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Zg, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Xb, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Yb, 0.00001)));
+ pdf_add_array(matrix, pdf_new_number(ROUND(Zb, 0.00001)));
+ pdf_add_dict (cal_param, pdf_new_name("Matrix"), matrix);
+ } else { /* Gray */
+ if (G != 1.0)
+ pdf_add_dict(cal_param,
+ pdf_new_name("Gamma"),
+ pdf_new_number(ROUND(G, 0.00001)));
+ }
+
+ return cal_param;
+}
+
+/*
+ * Set up Indexed ColorSpace for color-type PALETTE:
+ *
+ * PNG allows only RGB color for base color space. If gAMA and/or cHRM
+ * chunk is available, we can use CalRGB color space instead of DeviceRGB
+ * for base color space.
+ *
+ */
+static pdf_obj *
+create_cspace_Indexed (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *colorspace;
+ pdf_obj *base, *lookup;
+ png_byte *data_ptr;
+ png_colorp plte;
+ int num_plte, i;
+
+ if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE) ||
+ !png_get_PLTE(png_ptr, info_ptr, &plte, &num_plte)) {
+ WARN("%s: PNG does not have valid PLTE chunk.", PNG_DEBUG_STR);
+ return NULL;
+ }
+
+ /* Order is important. */
+ colorspace = pdf_new_array ();
+ pdf_add_array(colorspace, pdf_new_name("Indexed"));
+
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_iCCP))
+ base = create_cspace_ICCBased(png_ptr, info_ptr);
+ else {
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sRGB))
+ base = create_cspace_sRGB(png_ptr, info_ptr);
+ else
+ base = create_cspace_CalRGB(png_ptr, info_ptr);
+ }
+
+ if (!base)
+ base = pdf_new_name("DeviceRGB");
+
+ pdf_add_array(colorspace, base);
+ pdf_add_array(colorspace, pdf_new_number(num_plte-1));
+ data_ptr = NEW(num_plte*3, png_byte);
+ for (i = 0; i < num_plte; i++) {
+ data_ptr[3*i] = plte[i].red;
+ data_ptr[3*i+1] = plte[i].green;
+ data_ptr[3*i+2] = plte[i].blue;
+ }
+ lookup = pdf_new_string(data_ptr, num_plte*3);
+ RELEASE(data_ptr);
+ pdf_add_array(colorspace, lookup);
+
+ return colorspace;
+}
+
+/*
+ * pHYs: no support
+ *
+ * pngimage.c is not responsible for adjusting image size.
+ * Higher layer must do something for this.
+ */
+
+/*
+ * Colorkey Mask: array
+ *
+ * [component_0_min component_0_max ... component_n_min component_n_max]
+ *
+ */
+
+static pdf_obj *
+create_ckey_mask (png_structp png_ptr, png_infop info_ptr)
+{
+ pdf_obj *colorkeys;
+ png_byte color_type;
+ png_bytep trans;
+ int num_trans, i;
+ png_color_16p colors;
+
+ if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) ||
+ !png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &colors)) {
+ WARN("%s: PNG does not have valid tRNS chunk!", PNG_DEBUG_STR);
+ return NULL;
+ }
+
+ colorkeys = pdf_new_array();
+ color_type = png_get_color_type(png_ptr, info_ptr);
+
+ switch (color_type) {
+ case PNG_COLOR_TYPE_PALETTE:
+ for (i = 0; i < num_trans; i++) {
+ if (trans[i] == 0x00) {
+ pdf_add_array(colorkeys, pdf_new_number(i));
+ pdf_add_array(colorkeys, pdf_new_number(i));
+ } else if (trans[i] != 0xff) {
+ WARN("%s: You found a bug in pngimage.c.", PNG_DEBUG_STR);
+ }
+ }
+ break;
+ case PNG_COLOR_TYPE_RGB:
+ pdf_add_array(colorkeys, pdf_new_number(colors->red));
+ pdf_add_array(colorkeys, pdf_new_number(colors->red));
+ pdf_add_array(colorkeys, pdf_new_number(colors->green));
+ pdf_add_array(colorkeys, pdf_new_number(colors->green));
+ pdf_add_array(colorkeys, pdf_new_number(colors->blue));
+ pdf_add_array(colorkeys, pdf_new_number(colors->blue));
+ break;
+ case PNG_COLOR_TYPE_GRAY:
+ pdf_add_array(colorkeys, pdf_new_number(colors->gray));
+ pdf_add_array(colorkeys, pdf_new_number(colors->gray));
+ break;
+ default:
+ WARN("%s: You found a bug in pngimage.c.", PNG_DEBUG_STR);
+ pdf_release_obj(colorkeys);
+ colorkeys = NULL;
+ }
+
+ return colorkeys;
+}
+
+/*
+ * Soft-Mask: stream
+ *
+ * <<
+ * /Type /XObject
+ * /Subtype /Image
+ * /Width -int-
+ * /Height -int-
+ * /BitsPerComponent bpc
+ * >>
+ * stream .... endstream
+ *
+ * ColorSpace, Mask, SMask must be absent. ImageMask must be false or absent.
+ */
+
+static pdf_obj *
+create_soft_mask (png_structp png_ptr, png_infop info_ptr,
+ png_bytep image_data_ptr, png_uint_32 width, png_uint_32 height)
+{
+ pdf_obj *smask, *dict;
+ png_bytep smask_data_ptr;
+ png_bytep trans;
+ int num_trans;
+ png_uint_32 i;
+
+ if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) ||
+ !png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL)) {
+ WARN("%s: PNG does not have valid tRNS chunk but tRNS is requested.", PNG_DEBUG_STR);
+ return NULL;
+ }
+
+ smask = pdf_new_stream(STREAM_COMPRESS);
+ dict = pdf_stream_dict(smask);
+ smask_data_ptr = (png_bytep) NEW(width*height, png_byte);
+ pdf_add_dict(dict, pdf_new_name("Type"), pdf_new_name("XObjcect"));
+ pdf_add_dict(dict, pdf_new_name("Subtype"), pdf_new_name("Image"));
+ pdf_add_dict(dict, pdf_new_name("Width"), pdf_new_number(width));
+ pdf_add_dict(dict, pdf_new_name("Height"), pdf_new_number(height));
+ pdf_add_dict(dict, pdf_new_name("ColorSpace"), pdf_new_name("DeviceGray"));
+ pdf_add_dict(dict, pdf_new_name("BitsPerComponent"), pdf_new_number(8));
+ for (i = 0; i < width*height; i++) {
+ png_byte idx = image_data_ptr[i];
+ smask_data_ptr[i] = (idx < num_trans) ? trans[idx] : 0xff;
+ }
+ pdf_add_stream(smask, (char *)smask_data_ptr, width*height);
+ RELEASE(smask_data_ptr);
+
+ return smask;
+}
+
+/* bitdepth is always 8 (16 is not supported) */
+static pdf_obj *
+strip_soft_mask (png_structp png_ptr, png_infop info_ptr,
+ /* next two values will be modified. */
+ png_bytep image_data_ptr, png_uint_32p rowbytes_ptr,
+ png_uint_32 width, png_uint_32 height)
+{
+ pdf_obj *smask, *dict;
+ png_byte color_type;
+ png_bytep smask_data_ptr;
+ png_uint_32 i;
+
+ color_type = png_get_color_type(png_ptr, info_ptr);
+
+ if (color_type & PNG_COLOR_MASK_COLOR) {
+ if (*rowbytes_ptr != 4*width*sizeof(png_byte)) { /* Something wrong */
+ WARN("%s: Inconsistent rowbytes value.", PNG_DEBUG_STR);
+ return NULL;
+ }
+ } else {
+ if (*rowbytes_ptr != 2*width*sizeof(png_byte)) { /* Something wrong */
+ WARN("%s: Inconsistent rowbytes value.", PNG_DEBUG_STR);
+ return NULL;
+ }
+ }
+
+ smask = pdf_new_stream(STREAM_COMPRESS);
+ dict = pdf_stream_dict(smask);
+ pdf_add_dict(dict, pdf_new_name("Type"), pdf_new_name("XObjcect"));
+ pdf_add_dict(dict, pdf_new_name("Subtype"), pdf_new_name("Image"));
+ pdf_add_dict(dict, pdf_new_name("Width"), pdf_new_number(width));
+ pdf_add_dict(dict, pdf_new_name("Height"), pdf_new_number(height));
+ pdf_add_dict(dict, pdf_new_name("ColorSpace"), pdf_new_name("DeviceGray"));
+ pdf_add_dict(dict, pdf_new_name("BitsPerComponent"), pdf_new_number(8));
+
+ smask_data_ptr = (png_bytep) NEW(width*height, png_byte);
+
+ switch (color_type) {
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ for (i = 0; i < width*height; i++) {
+ memmove(image_data_ptr+(3*i), image_data_ptr+(4*i), 3);
+ smask_data_ptr[i] = image_data_ptr[4*i+3];
+ }
+ *rowbytes_ptr = 3*width*sizeof(png_byte);
+ break;
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ for (i = 0; i < width*height; i++) {
+ image_data_ptr[i] = image_data_ptr[2*i];
+ smask_data_ptr[i] = image_data_ptr[2*i+1];
+ }
+ *rowbytes_ptr = width*sizeof(png_byte);
+ break;
+ default:
+ WARN("You found a bug in pngimage.c!");
+ pdf_release_obj(smask);
+ RELEASE(smask_data_ptr);
+ return NULL;
+ }
+
+ pdf_add_stream(smask, smask_data_ptr, width*height);
+ RELEASE(smask_data_ptr);
+
+ return smask;
+}
+
+static void
+read_image_data (png_structp png_ptr, png_infop info_ptr, /* info_ptr unused */
+ png_bytep dest_ptr, png_uint_32 height, png_uint_32 rowbytes)
+{
+ png_bytepp rows_p;
+ png_uint_32 i;
+
+ rows_p = (png_bytepp) NEW (height, png_bytep);
+ for (i=0; i< height; i++)
+ rows_p[i] = dest_ptr + (rowbytes * i);
+ png_read_image(png_ptr, rows_p);
+ RELEASE(rows_p);
+}
+
+#endif /* HAVE_LIBPNG */
diff --git a/Build/source/texk/xdvipdfmx/src/pngimage.h b/Build/source/texk/xdvipdfmx/src/pngimage.h
new file mode 100644
index 00000000000..fe9c4a7e1e8
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pngimage.h
@@ -0,0 +1,43 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pngimage.h,v 1.4 2004/03/11 11:50:25 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+
+#ifndef _PNGIMAGE_H_
+#define _PNGIMAGE_H_
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_LIBPNG
+
+#include "mfileio.h"
+#include "pdfximage.h"
+
+extern int png_include_image (pdf_ximage *ximage, FILE *file);
+extern int check_for_png (FILE *file);
+
+#endif
+
+#endif /* _PNGIMAGE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pst.c b/Build/source/texk/xdvipdfmx/src/pst.c
new file mode 100644
index 00000000000..dc195ca6d91
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pst.c
@@ -0,0 +1,179 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pst.c,v 1.5 2004/07/27 12:08:47 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <string.h>
+#include <ctype.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+#include "pst_obj.h"
+#include "pst.h"
+
+
+#define TYPE_CHECK(o, t) do { \
+ if ((o) == NULL || pst_type_of((o)) != (t)) \
+ ERROR("typecheck: object %p not of type %d.", (o), (t)); \
+ } while (0)
+
+static pst_obj *
+pst_parse_any (unsigned char **inbuf, unsigned char *inbufend)
+{
+ unsigned char *data;
+ unsigned char *cur = *inbuf;
+ unsigned long len;
+
+ while (cur < inbufend && !PST_TOKEN_END(cur, inbufend))
+ cur++;
+
+ len = cur - (*inbuf);
+ data = NEW(len+1, unsigned char);
+ memcpy(data, *inbuf, len);
+ data[len] = '\0';
+
+ *inbuf = cur;
+ return pst_new_obj(PST_TYPE_UNKNOWN, data);
+}
+
+static void
+skip_line (unsigned char **inbuf, unsigned char *inbufend)
+{
+ while (*inbuf < inbufend && **inbuf != '\n' && **inbuf != '\r')
+ (*inbuf)++;
+ if (*inbuf < inbufend && **inbuf == '\r')
+ (*inbuf)++;
+ if (*inbuf < inbufend && **inbuf == '\n')
+ (*inbuf)++;
+}
+
+static void
+skip_comments (unsigned char **inbuf, unsigned char *inbufend)
+{
+ while (*inbuf < inbufend && **inbuf == '%') {
+ skip_line(inbuf, inbufend);
+ skip_white_spaces(inbuf, inbufend);
+ }
+}
+
+#if 0
+static pst_obj *
+pst_parse_comment (unsigned char **inbuf, unsigned char *inbufend)
+{
+ unsigned char *data;
+ unsigned char *cur = *inbuf;
+ unsigned long len;
+
+ if (*cur != '%')
+ return NULL;
+
+ while (cur < inbufend && *cur != '\n' && *cur != '\r')
+ cur++;
+ len = cur - (*inbuf);
+ data = NEW(len+1, unsigned char);
+ memcpy(data, *inbuf, len);
+ data[len] = '\0';
+
+ *inbuf = cur;
+ return pst_new_obj(PST_TYPE_UNKNOWN, data);
+}
+#endif
+
+pst_obj *
+pst_get_token (unsigned char **inbuf, unsigned char *inbufend)
+{
+ pst_obj *obj = NULL;
+ unsigned char c;
+
+ skip_white_spaces(inbuf, inbufend);
+ skip_comments(inbuf, inbufend);
+ if (*inbuf >= inbufend)
+ return NULL;
+ c = **inbuf;
+ switch (c) {
+#if 0
+ case '%':
+ obj = pst_parse_comment(inbuf, inbufend);
+ break;
+#endif
+ case '/':
+ obj = pst_parse_name(inbuf, inbufend);
+ break;
+ case '[': case '{': /* This is wrong */
+ obj = pst_new_mark();
+ (*inbuf)++;
+ break;
+ case '<':
+ if (*inbuf + 1 >= inbufend)
+ return NULL;
+ c = *(*inbuf+1);
+ if (c == '<') {
+ obj = pst_new_mark();
+ *inbuf += 2;
+ } else if (isxdigit(c))
+ obj = pst_parse_string(inbuf, inbufend);
+ else if (c == '~') /* ASCII85 */
+ obj = pst_parse_string(inbuf, inbufend);
+ break;
+ case '(':
+ obj = pst_parse_string(inbuf, inbufend);
+ break;
+ case '>':
+ if (*inbuf + 1 >= inbufend || *(*inbuf+1) != '>') {
+ ERROR("Unexpected end of ASCII hex string marker.");
+ } else {
+ char *mark;
+
+ mark = NEW(3, char);
+ mark[0] = '>'; mark[1] = '>'; mark[2] = '\0';
+ obj = pst_new_obj(PST_TYPE_UNKNOWN, mark);
+ (*inbuf) += 2;
+ }
+ break;
+ case ']': case '}':
+ {
+ char *mark;
+
+ mark = NEW(2, char);
+ mark[0] = c; mark[1] = '\0';
+ obj = pst_new_obj(PST_TYPE_UNKNOWN, mark);
+ (*inbuf)++;
+ }
+ break;
+ default:
+ if (c == 't' || c == 'f')
+ obj = pst_parse_boolean(inbuf, inbufend);
+ else if (c == 'n')
+ obj = pst_parse_null(inbuf, inbufend);
+ else if (c == '+' || c == '-' || isdigit(c) || c == '.')
+ obj = pst_parse_number(inbuf, inbufend);
+ break;
+ }
+
+ if (!obj) {
+ obj = pst_parse_any(inbuf, inbufend);
+ }
+
+ return obj;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pst.h b/Build/source/texk/xdvipdfmx/src/pst.h
new file mode 100644
index 00000000000..4108b827919
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pst.h
@@ -0,0 +1,74 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pst.h,v 1.2 2003/11/29 16:21:17 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PST_H_
+#define _PST_H_
+
+#include <stdio.h>
+
+#define PST_TYPE_UNKNOWN -1
+#define PST_TYPE_NULL 0
+#define PST_TYPE_BOOLEAN 1
+#define PST_TYPE_INTEGER 2
+#define PST_TYPE_REAL 3
+#define PST_TYPE_STRING 5
+#define PST_TYPE_NAME 6
+#define PST_TYPE_MARK 7
+
+typedef struct pst_obj pst_obj;
+typedef int pst_type;
+
+extern pst_obj *pst_get_token (unsigned char **inbuf, unsigned char *inbufend);
+
+extern pst_obj *pst_new_obj (pst_type type, void *data);
+extern void pst_release_obj(pst_obj *obj);
+extern pst_obj *pst_new_mark (void);
+
+extern pst_type pst_type_of (pst_obj *obj);
+extern long pst_length_of (pst_obj *obj);
+
+extern long pst_getIV (pst_obj *obj);
+extern double pst_getRV (pst_obj *obj);
+extern unsigned char *pst_getSV (pst_obj *obj);
+
+extern void *pst_data_ptr (pst_obj *obj);
+
+#define PST_NAME_LEN_MAX 127
+#define PST_STRING_LEN_MAX 4096
+#define PST_MAX_DIGITS 10
+#define PST_TOKEN_LEN_MAX PST_STRING_LEN_MAX
+
+#define PST_NULLTYPE(o) (pst_type_of((o)) == PST_TYPE_NULL)
+#define PST_BOOLEANTYPE(o) (pst_type_of((o)) == PST_TYPE_BOOLEAN)
+#define PST_NAMETYPE(o) (pst_type_of((o)) == PST_TYPE_NAME)
+#define PST_STRINGTYPE(o) (pst_type_of((o)) == PST_TYPE_STRING)
+#define PST_INTEGERTYPE(o) (pst_type_of((o)) == PST_TYPE_INTEGER)
+#define PST_REALTYPE(o) (pst_type_of((o)) == PST_TYPE_REAL)
+#define PST_NUMBERTYPE(o) (PST_INTEGERTYPE((o))||PST_REALTYPE((o)))
+#define PST_MARKTYPE(o) (pst_type_of((o)) == PST_TYPE_MARK)
+#define PST_UNKNOWNTYPE(o) (pst_type_of((o)) < 0)
+
+#define PST_TOKEN_END(s,e) ((s) == (e) || is_delim(*(s)) || is_space(*(s)))
+
+#endif /* _PST_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/pst_obj.c b/Build/source/texk/xdvipdfmx/src/pst_obj.c
new file mode 100644
index 00000000000..55d5773cdd9
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pst_obj.c
@@ -0,0 +1,996 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pst_obj.c,v 1.5 2004/07/27 12:08:47 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <string.h>
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+#include "pst.h"
+#include "pst_obj.h"
+
+struct pst_obj
+{
+ pst_type type;
+ void *data;
+};
+
+static const char *pst_const_null = "null";
+static const char *pst_const_mark = "mark";
+/*
+static const char *pst_const_true = "true";
+static const char *pst_const_false = "false";
+*/
+
+typedef char * pst_null;
+typedef struct { char value; } pst_boolean;
+typedef struct { long value; } pst_integer;
+typedef struct { double value; } pst_real;
+typedef struct { char *value; } pst_name;
+typedef struct
+{
+ long length;
+ unsigned char *value;
+} pst_string;
+
+
+/* BOOLEAN */
+static pst_boolean *pst_boolean_new (char value) ;
+static void pst_boolean_release (pst_boolean *obj);
+static long pst_boolean_IV (pst_boolean *obj);
+static double pst_boolean_RV (pst_boolean *obj);
+static unsigned char *pst_boolean_SV (pst_boolean *obj);
+static long pst_boolean_length (pst_boolean *obj);
+static void *pst_boolean_data_ptr(pst_boolean *obj);
+
+/* NUMBERS */
+static long parse_long (unsigned char **inbuf, unsigned char *inbufend, unsigned char base, unsigned char *ndigits);
+static double cvtdbl (long ipart, long dpart, unsigned char nddigits, long epart);
+
+static pst_integer *pst_integer_new (long value) ;
+static void pst_integer_release (pst_integer *obj);
+static long pst_integer_IV (pst_integer *obj);
+static double pst_integer_RV (pst_integer *obj);
+static unsigned char *pst_integer_SV (pst_integer *obj);
+static unsigned int pst_integer_length (pst_integer *obj);
+static void *pst_integer_data_ptr(pst_integer *obj);
+
+static pst_real *pst_real_new (double value) ;
+static void pst_real_release (pst_real *obj);
+static long pst_real_IV (pst_real *obj);
+static double pst_real_RV (pst_real *obj);
+static unsigned char *pst_real_SV (pst_real *obj);
+static void *pst_real_data_ptr (pst_real *obj);
+static unsigned int pst_real_length (pst_real *obj);
+
+/* NAME */
+static pst_name *pst_name_new (const char *name) ;
+static void pst_name_release (pst_name *obj);
+static long pst_name_IV (pst_name *obj);
+static double pst_name_RV (pst_name *obj);
+static unsigned char *pst_name_SV (pst_name *obj);
+static void *pst_name_data_ptr (pst_name *obj);
+static unsigned int pst_name_length (pst_name *obj);
+
+/* STRING */
+static pst_string *pst_string_parse_literal (unsigned char **inbuf, unsigned char *inbufend);
+static pst_string *pst_string_parse_hex (unsigned char **inbuf, unsigned char *inbufend);
+
+static pst_string *pst_string_new (unsigned char *str, unsigned int len);
+static void pst_string_release (pst_string *obj) ;
+static long pst_string_IV (pst_string *obj) ;
+static double pst_string_RV (pst_string *obj) ;
+static unsigned char *pst_string_SV (pst_string *obj) ;
+static void *pst_string_data_ptr (pst_string *obj) ;
+static unsigned int pst_string_length (pst_string *obj) ;
+
+
+#define TYPE_ERROR() ERROR("Operation not defined for this type of object.")
+
+pst_obj *
+pst_new_obj (pst_type type, void *data)
+{
+ pst_obj *obj;
+
+ obj = NEW(1, struct pst_obj);
+ obj->type = type;
+ obj->data = data;
+
+ return obj;
+}
+
+pst_obj *
+pst_new_mark (void)
+{
+ return pst_new_obj(PST_TYPE_MARK, (void *)pst_const_mark);
+}
+
+void
+pst_release_obj (pst_obj *obj)
+{
+ ASSERT(obj);
+ switch (obj->type) {
+ case PST_TYPE_BOOLEAN: pst_boolean_release(obj->data); break;
+ case PST_TYPE_INTEGER: pst_integer_release(obj->data); break;
+ case PST_TYPE_REAL: pst_real_release(obj->data); break;
+ case PST_TYPE_NAME: pst_name_release(obj->data); break;
+ case PST_TYPE_STRING: pst_string_release(obj->data); break;
+ case PST_TYPE_NULL:
+ case PST_TYPE_MARK:
+ break;
+ case PST_TYPE_UNKNOWN:
+ if (obj->data)
+ RELEASE(obj->data);
+ break;
+ default:
+ ERROR("Unrecognized object type: %d", obj->type);
+ }
+ RELEASE(obj);
+}
+
+pst_type
+pst_type_of (pst_obj *obj)
+{
+ ASSERT(obj);
+ return obj->type;
+}
+
+long
+pst_length_of (pst_obj *obj)
+{
+ long len = 0;
+
+ ASSERT(obj);
+ switch (obj->type) {
+ case PST_TYPE_BOOLEAN: len = pst_boolean_length(obj->data); break;
+ case PST_TYPE_INTEGER: len = pst_integer_length(obj->data); break;
+ case PST_TYPE_REAL: len = pst_real_length(obj->data); break;
+ case PST_TYPE_NAME: len = pst_name_length(obj->data); break;
+ case PST_TYPE_STRING: len = pst_string_length(obj->data); break;
+ case PST_TYPE_NULL:
+ case PST_TYPE_MARK:
+ TYPE_ERROR();
+ break;
+ case PST_TYPE_UNKNOWN:
+ len = strlen(obj->data);
+ break;
+ default:
+ ERROR("Unrecognized object type: %d", obj->type);
+ }
+
+ return len;
+}
+
+long
+pst_getIV (pst_obj *obj)
+{
+ long iv = 0;
+
+ ASSERT(obj);
+ switch (obj->type) {
+ case PST_TYPE_BOOLEAN: iv = pst_boolean_IV(obj->data); break;
+ case PST_TYPE_INTEGER: iv = pst_integer_IV(obj->data); break;
+ case PST_TYPE_REAL: iv = pst_real_IV(obj->data); break;
+ case PST_TYPE_NAME: iv = pst_name_IV(obj->data); break;
+ case PST_TYPE_STRING: iv = pst_string_IV(obj->data); break;
+ case PST_TYPE_NULL:
+ case PST_TYPE_MARK:
+ TYPE_ERROR();
+ break;
+ case PST_TYPE_UNKNOWN:
+ ERROR("Cannot convert object of type UNKNOWN to integer value.");
+ break;
+ default:
+ ERROR("Unrecognized object type: %d", obj->type);
+ }
+
+ return iv;
+}
+
+double
+pst_getRV (pst_obj *obj)
+{
+ double rv = 0.0;
+
+ ASSERT(obj);
+ switch (obj->type) {
+ case PST_TYPE_BOOLEAN: rv = pst_boolean_RV(obj->data); break;
+ case PST_TYPE_INTEGER: rv = pst_integer_RV(obj->data); break;
+ case PST_TYPE_REAL: rv = pst_real_RV(obj->data); break;
+ case PST_TYPE_NAME: rv = pst_name_RV(obj->data); break;
+ case PST_TYPE_STRING: rv = pst_string_RV(obj->data); break;
+ case PST_TYPE_NULL:
+ case PST_TYPE_MARK:
+ TYPE_ERROR();
+ break;
+ case PST_TYPE_UNKNOWN:
+ ERROR("Cannot convert object of type UNKNOWN to real value.");
+ break;
+ default:
+ ERROR("Unrecognized object type: %d", obj->type);
+ }
+
+ return rv;
+}
+
+/* Length can be obtained by pst_length_of(). */
+unsigned char *
+pst_getSV (pst_obj *obj)
+{
+ unsigned char *sv = NULL;
+
+ ASSERT(obj);
+ switch (obj->type) {
+ case PST_TYPE_BOOLEAN: sv = pst_boolean_SV(obj->data); break;
+ case PST_TYPE_INTEGER: sv = pst_integer_SV(obj->data); break;
+ case PST_TYPE_REAL: sv = pst_real_SV(obj->data); break;
+ case PST_TYPE_NAME: sv = pst_name_SV(obj->data); break;
+ case PST_TYPE_STRING: sv = pst_string_SV(obj->data); break;
+ case PST_TYPE_NULL:
+ case PST_TYPE_MARK:
+ TYPE_ERROR();
+ break;
+ case PST_TYPE_UNKNOWN:
+ {
+ long len;
+
+ len = strlen((char *) obj->data);
+ if (len > 0) {
+ sv = NEW(len+1, unsigned char);
+ memcpy(sv, obj->data, len);
+ sv[len] = '\0';
+ } else {
+ sv = NULL;
+ }
+ break;
+ }
+ default:
+ ERROR("Unrecognized object type: %d", obj->type);
+ }
+
+ return sv;
+}
+
+void *
+pst_data_ptr (pst_obj *obj)
+{
+ char *p = NULL;
+
+ ASSERT(obj);
+ switch (obj->type) {
+ case PST_TYPE_BOOLEAN: p = pst_boolean_data_ptr(obj->data); break;
+ case PST_TYPE_INTEGER: p = pst_integer_data_ptr(obj->data); break;
+ case PST_TYPE_REAL: p = pst_real_data_ptr(obj->data); break;
+ case PST_TYPE_NAME: p = pst_name_data_ptr(obj->data); break;
+ case PST_TYPE_STRING: p = pst_string_data_ptr(obj->data); break;
+ case PST_TYPE_NULL:
+ case PST_TYPE_MARK:
+ TYPE_ERROR();
+ break;
+ case PST_TYPE_UNKNOWN:
+ p = obj->data;
+ break;
+ default:
+ ERROR("Unrecognized object type: %d", obj->type);
+ }
+
+ return (void *)p;
+}
+
+/* BOOLEAN */
+static pst_boolean *
+pst_boolean_new (char value)
+{
+ pst_boolean *obj;
+ obj = NEW(1, pst_boolean);
+ obj->value = value;
+ return obj;
+}
+
+static void
+pst_boolean_release (pst_boolean *obj)
+{
+ ASSERT(obj);
+ RELEASE(obj);
+}
+
+static long
+pst_boolean_IV (pst_boolean *obj)
+{
+ ASSERT(obj);
+ return (long) obj->value;
+}
+
+static double
+pst_boolean_RV (pst_boolean *obj)
+{
+ ASSERT(obj);
+ return (double) obj->value;
+}
+
+static unsigned char *
+pst_boolean_SV (pst_boolean *obj)
+{
+ unsigned char *str;
+
+ ASSERT(obj);
+
+ if (obj->value) {
+ str = NEW(5, unsigned char);
+ memcpy(str, "true", 4);
+ str[4] = '\0';
+ } else {
+ str = NEW(6, unsigned char);
+ memcpy(str, "false", 5);
+ str[5] = '\0';
+ }
+
+ return str;
+}
+
+static long
+pst_boolean_length (pst_boolean *obj)
+{
+ TYPE_ERROR();
+ return 0;
+}
+
+static void *
+pst_boolean_data_ptr (pst_boolean *obj)
+{
+ ASSERT(obj);
+ return (void*) &(obj->value);
+}
+
+pst_obj *
+pst_parse_boolean (unsigned char **inbuf, unsigned char *inbufend)
+{
+ if (*inbuf + 4 <= inbufend &&
+ memcmp(*inbuf, "true", 4) == 0 &&
+ PST_TOKEN_END(*inbuf + 4, inbufend)) {
+ *inbuf += 4;
+ return pst_new_obj(PST_TYPE_BOOLEAN, pst_boolean_new(1));
+ } else if (*inbuf + 5 <= inbufend &&
+ memcmp(*inbuf, "false", 5) == 0 &&
+ PST_TOKEN_END(*inbuf + 5, inbufend)) {
+ *inbuf += 5;
+ return pst_new_obj(PST_TYPE_BOOLEAN, pst_boolean_new(0));
+ } else
+ return NULL;
+}
+
+
+/* NULL */
+pst_obj *
+pst_parse_null (unsigned char **inbuf, unsigned char *inbufend)
+{
+ if (*inbuf + 4 <= inbufend &&
+ memcmp(*inbuf, "null", 4) == 0 &&
+ PST_TOKEN_END(*inbuf+4, inbufend)) {
+ *inbuf += 4;
+ return pst_new_obj(PST_TYPE_NULL, (void*)pst_const_null);
+ } else
+ return NULL;
+}
+
+/* INTEGER */
+static pst_integer *
+pst_integer_new (long value)
+{
+ pst_integer *obj;
+ obj = NEW(1, pst_integer);
+ obj->value = value;
+ return obj;
+}
+
+static void
+pst_integer_release (pst_integer *obj)
+{
+ ASSERT(obj);
+ RELEASE(obj);
+}
+
+static long
+pst_integer_IV (pst_integer *obj)
+{
+ ASSERT(obj);
+ return (long) obj->value;
+}
+
+static double
+pst_integer_RV (pst_integer *obj)
+{
+ ASSERT(obj);
+ return (double) obj->value;
+}
+
+static unsigned char *
+pst_integer_SV (pst_integer *obj)
+{
+ char *value;
+ int len;
+ char fmt_buf[PST_MAX_DIGITS+5];
+
+ ASSERT(obj);
+
+ len = sprintf(fmt_buf, "%ld", obj->value);
+
+ value = NEW(len, char);
+ strcpy(value, fmt_buf);
+
+ return (unsigned char *) value;
+}
+
+static void *
+pst_integer_data_ptr (pst_integer *obj)
+{
+ ASSERT(obj);
+ return (void*) &(obj->value);
+}
+
+static unsigned int
+pst_integer_length (pst_integer *obj)
+{
+ TYPE_ERROR();
+ return 0;
+}
+
+/* REAL */
+static pst_real *
+pst_real_new (double value)
+{
+ pst_real *obj;
+
+ obj = NEW(1, pst_real);
+ obj->value = value;
+
+ return obj;
+}
+
+static void
+pst_real_release (pst_real *obj)
+{
+ ASSERT(obj);
+ RELEASE(obj);
+}
+
+static long
+pst_real_IV (pst_real *obj)
+{
+ ASSERT(obj);
+ return (long) obj->value;
+}
+
+static double
+pst_real_RV (pst_real *obj)
+{
+ ASSERT(obj);
+ return (double) obj->value;
+}
+
+static unsigned char *
+pst_real_SV (pst_real *obj)
+{
+ char *value;
+ int len;
+ char fmt_buf[PST_MAX_DIGITS+5];
+
+ ASSERT(obj);
+
+ len = sprintf(fmt_buf, "%.5g", obj->value);
+
+ value = NEW(len, char);
+ strcpy(value, fmt_buf);
+
+ return (unsigned char *) value;
+}
+
+static void *
+pst_real_data_ptr (pst_real *obj)
+{
+ ASSERT(obj);
+
+ return (void*) &(obj->value);
+}
+
+static unsigned int
+pst_real_length (pst_real *obj)
+{
+ TYPE_ERROR();
+ return 0;
+}
+
+/*
+ * Does not skip white spaces
+ * base number must be greater than 1 and less than 33.
+ * TODO: overflow and underflow
+ */
+static long
+parse_long (unsigned char **inbuf, unsigned char *inbufend, unsigned char base, unsigned char *ndigits)
+{
+ long val = 0, sign = 1;
+ unsigned char *cur = *inbuf, c;
+ int count = 0;
+
+ if (*cur == '+') {
+ sign = 1;
+ cur++;
+ } else if (*cur == '-') {
+ sign = -1;
+ cur++;
+ }
+ while (cur < inbufend) {
+ c = *cur;
+ if (c >= '0' && c <= '0' + ((base <= 10) ? base-1 : 9)) {
+ c = c - '0';
+ } else if (base > 10) {
+ if (c >= 'a' && c <= 'a' + (base - 11)) {
+ c = c - 'a' + 10;
+ } else if (c >= 'A' && c <= 'A' + (base - 11)) {
+ c = c - 'A' + 10;
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ val = val * base + c;
+ cur++;
+ count++;
+ }
+
+ if (ndigits != NULL)
+ *ndigits = count;
+ *inbuf = cur;
+ return sign*val;
+}
+
+static double
+cvtdbl (long ipart, long dpart, unsigned char nddigits, long epart)
+{
+ double dval = 0.0;
+ int i;
+
+ if (dpart > 0 && nddigits > 0) {
+ dval = dpart;
+ for (i = 0; i < nddigits; i++) {
+ dval *= 0.1;
+ }
+ }
+
+ if (ipart < 0)
+ dval = ipart - dval;
+ else
+ dval = ipart + dval;
+
+ if (epart > 0) {
+ for (i = 0; i < epart; i++)
+ dval *= 10.0;
+ } else if (epart < 0) {
+ for (i = 0; i < -epart; i++)
+ dval *= 0.1;
+ }
+
+ return dval;
+}
+
+pst_obj *
+pst_parse_number (unsigned char **inbuf, unsigned char *inbufend)
+{
+ pst_obj *obj = NULL;
+ unsigned char *cur = *inbuf;
+ unsigned char ndigits = 0, nddigits = 0;
+ int type;
+ long ipart = 0, dpart = 0, epart = 0;
+
+ if (cur >= inbufend)
+ return NULL;
+
+ ipart = parse_long(&cur, inbufend, 10, &ndigits);
+ if (ndigits > 0 && PST_TOKEN_END(cur, inbufend)) {
+ type = PST_TYPE_INTEGER;
+ dpart = epart = 0;
+ } else if (ndigits > 0 && *cur == '#' &&
+ ipart >= 2 && ipart <= 36) { /* Radix */
+ cur++;
+ ipart = parse_long(&cur, inbufend, ipart, NULL);
+ if (ipart >= 0 && PST_TOKEN_END(cur, inbufend)) { /* non-negative only ? */
+ type = PST_TYPE_INTEGER;
+ dpart = epart = 0;
+ } else
+ type = -1;
+ } else if (*cur == '.') {
+ cur++;
+ dpart = parse_long(&cur, inbufend, 10, &nddigits);
+ ndigits += nddigits;
+ if (dpart < 0) {
+ type = -1;
+ } else if (ndigits > 0 && PST_TOKEN_END(cur, inbufend)) {
+ type = PST_TYPE_REAL;
+ epart = 0;
+ } else if (ndigits > 0 && (*cur == 'e' || *cur == 'E')) {
+ cur++;
+ epart = parse_long(&cur, inbufend, 10, &ndigits);
+ if (ndigits > 0 && PST_TOKEN_END(cur, inbufend))
+ type = PST_TYPE_REAL;
+ else
+ type = -1;
+ } else
+ type = -1;
+ } else if (ndigits > 0 && (*cur == 'e' || *cur == 'E')) {
+ cur++;
+ epart = parse_long(&cur, inbufend, 10, &ndigits);
+ if (ndigits > 0 && PST_TOKEN_END(cur, inbufend)) {
+ dpart = 0;
+ type = PST_TYPE_REAL;
+ } else
+ type = -1;
+ } else {
+ type = -1;
+ }
+
+ if (type < 0)
+ return NULL;
+
+ if (type == PST_TYPE_REAL)
+ obj = pst_new_obj(type, pst_real_new(cvtdbl(ipart, dpart, nddigits, epart)));
+ else if (type == PST_TYPE_INTEGER)
+ obj = pst_new_obj(type, pst_integer_new(ipart));
+ else
+ return NULL;
+
+ *inbuf = cur;
+ return obj;
+}
+
+/* NAME */
+
+/*
+ * \0 is not allowed for name object.
+ */
+
+static pst_name *
+pst_name_new (const char *name)
+{
+ pst_name *obj;
+
+ obj = NEW(1, pst_name);
+ obj->value = NEW(strlen(name)+1, char);
+ strcpy(obj->value, name);
+
+ return obj;
+}
+
+static void
+pst_name_release (pst_name *obj)
+{
+ ASSERT(obj);
+ if (obj->value)
+ RELEASE(obj->value);
+ RELEASE(obj);
+}
+
+int
+pst_name_is_valid (const char *name)
+{
+ static const char *valid_chars =
+ "!\"#$&'*+,-.0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_`abcdefghijklmnopqrstuvwxyz|~";
+ if (strspn(name, valid_chars) == strlen(name))
+ return 1;
+ else
+ return 0;
+}
+
+char *
+pst_name_encode (const char *name)
+{
+ char *encoded_name, *p;
+ int i, len;
+ char c;
+
+ len = strlen(name);
+ if (len > PST_NAME_LEN_MAX) {
+ WARN("Input string too long for name object. String will be truncated.");
+ len = PST_NAME_LEN_MAX;
+ }
+
+ p = encoded_name = NEW(3*len+1, char);
+ for (i = 0; i < len; i++) {
+ c = name[i];
+ if (c < '!' || c > '~' ||
+ c == '#' || is_delim(c) || is_space(c)) {
+ *p++ = '#';
+ putxpair(c, &p);
+ } else {
+ *p++ = c;
+ }
+ }
+ *p = '\0';
+
+ return encoded_name;
+}
+
+pst_obj *
+pst_parse_name (unsigned char **inbuf, unsigned char *inbufend) /* / is required */
+{
+ unsigned char wbuf[PST_NAME_LEN_MAX+1];
+ unsigned char c, *p = wbuf, *cur = *inbuf;
+ int len = 0;
+
+ if (*cur != '/')
+ return NULL;
+ cur++;
+
+ while (!PST_TOKEN_END(cur, inbufend)) {
+ c = *cur++;
+ if (c == '#') {
+ int val;
+ if (cur + 2 >= inbufend) {
+ WARN("Premature end of input name string.");
+ break;
+ }
+ val = getxpair(&cur);
+ if (val <= 0) {
+ WARN("Invalid char for name object. (ignored)");
+ continue;
+ } else
+ c = (unsigned char) val;
+ }
+ if (len < PST_NAME_LEN_MAX)
+ *p++ = c;
+ len++;
+ }
+ *p = '\0';
+
+ if (len > PST_NAME_LEN_MAX)
+ WARN("String too long for name object. Output will be truncated.");
+
+ *inbuf = cur;
+ return pst_new_obj(PST_TYPE_NAME, pst_name_new((char *)wbuf));
+}
+
+static long
+pst_name_IV (pst_name *obj)
+{
+ TYPE_ERROR();
+ return 0;
+}
+
+static double
+pst_name_RV (pst_name *obj)
+{
+ TYPE_ERROR();
+ return 0;
+}
+
+static unsigned char *
+pst_name_SV (pst_name *obj)
+{
+ char *value;
+
+ value = NEW(strlen(obj->value)+1, char);
+ strcpy(value, obj->value);
+
+ return (unsigned char *) value;
+}
+
+static void *
+pst_name_data_ptr (pst_name *obj)
+{
+ ASSERT(obj);
+ return obj->value;
+}
+
+static unsigned int
+pst_name_length (pst_name *obj)
+{
+ ASSERT(obj);
+ return strlen(obj->value);
+}
+
+
+/* STRING */
+
+/*
+ * TODO: ascii85 string <~ .... ~>
+ */
+static pst_string *
+pst_string_new (unsigned char *str, unsigned int len)
+{
+ pst_string *obj;
+ obj = NEW(1, pst_string);
+ obj->length = len;
+ obj->value = NULL;
+ if (len > 0) {
+ obj->value = NEW(len, unsigned char);
+ if (str)
+ memcpy(obj->value, str, len);
+ }
+ return obj;
+}
+
+static void
+pst_string_release (pst_string *obj)
+{
+ ASSERT(obj);
+ if (obj->value)
+ RELEASE(obj->value);
+ RELEASE(obj);
+}
+
+pst_obj *
+pst_parse_string (unsigned char **inbuf, unsigned char *inbufend)
+{
+ if (*inbuf + 2 >= inbufend) {
+ return NULL;
+ } else if (**inbuf == '(')
+ return pst_new_obj(PST_TYPE_STRING, pst_string_parse_literal(inbuf, inbufend));
+ else if (**inbuf == '<' && *(*inbuf+1) == '~')
+ ERROR("ASCII85 string not supported yet.");
+ else if (**inbuf == '<')
+ return pst_new_obj(PST_TYPE_STRING, pst_string_parse_hex(inbuf, inbufend));
+ return NULL;
+}
+
+static pst_string *
+pst_string_parse_literal (unsigned char **inbuf, unsigned char *inbufend)
+{
+ unsigned char wbuf[PST_STRING_LEN_MAX];
+ unsigned char *cur = *inbuf, c = 0;
+ long len = 0, balance = 1;
+
+ if (cur + 2 > inbufend || *cur != '(')
+ return NULL;
+
+ cur++;
+ while (cur < inbufend && len < PST_STRING_LEN_MAX && balance > 0) {
+ c = *(cur++);
+ switch (c) {
+ case '\\':
+ {
+ unsigned char unescaped, valid;
+ unescaped = esctouc(&cur, inbufend, &valid);
+ if (valid)
+ wbuf[len++] = unescaped;
+ }
+ break;
+ case '(':
+ balance++;
+ wbuf[len++] = '(';
+ break;
+ case ')':
+ balance--;
+ if (balance > 0)
+ wbuf[len++] = ')';
+ break;
+ /*
+ * An end-of-line marker (\n, \r or \r\n), not preceeded by a backslash,
+ * must be converted to single \n.
+ */
+ case '\r':
+ if (cur < inbufend && *cur == '\n')
+ cur++;
+ wbuf[len++] = '\n';
+ break;
+ default:
+ wbuf[len++] = c;
+ }
+ }
+ if (c != ')')
+ return NULL;
+
+ *inbuf = cur;
+ return pst_string_new(wbuf, len);
+}
+
+static pst_string *
+pst_string_parse_hex (unsigned char **inbuf, unsigned char *inbufend)
+{
+ unsigned char wbuf[PST_STRING_LEN_MAX];
+ unsigned char *cur = *inbuf;
+ unsigned long len = 0;
+
+ if (cur + 2 > inbufend || *cur != '<' ||
+ (*cur == '<' && *(cur+1) == '<'))
+ return NULL;
+
+ cur++;
+ /* PDF Reference does not specify how to treat invalid char */
+ while (cur < inbufend && len < PST_STRING_LEN_MAX) {
+ int hi, lo;
+ skip_white_spaces(&cur, inbufend);
+ if (*cur == '>')
+ break;
+ hi = xtoi(*(cur++));
+ if (hi < 0) {
+ WARN("Invalid char for hex string <%x> treated as <0>.", *(cur-1));
+ hi = 0;
+ }
+ skip_white_spaces(&cur, inbufend);
+ if (*cur == '>')
+ break;
+ /* 0 is appended if final hex digit is missing */
+ lo = (cur < inbufend) ? xtoi(*(cur++)) : 0;
+ if (lo < 0) {
+ WARN("Invalid char for hex string <%x> treated as <0>.", *(cur-1));
+ lo = 0;
+ }
+ wbuf[len++] = (hi << 4) | lo;
+ }
+ if (*cur++ != '>')
+ return NULL;
+
+ *inbuf = cur;
+ return pst_string_new(wbuf, len);
+}
+
+static long
+pst_string_IV (pst_string *obj)
+{
+ return (long) pst_string_RV(obj);
+}
+
+static double
+pst_string_RV (pst_string *obj)
+{
+ pst_obj *nobj;
+ unsigned char *p, *end;
+ double rv;
+
+ ASSERT(obj);
+ p = obj->value;
+ end = p + obj->length;
+ nobj = pst_parse_number(&p, end);
+ if (nobj == NULL || p != end)
+ ERROR("Cound not convert string to real value.");
+ rv = pst_getRV(nobj);
+ pst_release_obj(nobj);
+
+ return rv;
+}
+
+static unsigned char *
+pst_string_SV (pst_string *obj)
+{
+ unsigned char *str = NULL;
+ ASSERT(obj);
+ str = NEW(obj->length + 1, unsigned char);
+ memcpy(str, obj->value, obj->length);
+ str[obj->length] = '\0';
+ return str;
+}
+
+static void *
+pst_string_data_ptr (pst_string *obj)
+{
+ ASSERT(obj);
+ return obj->value;
+}
+
+static unsigned int
+pst_string_length (pst_string *obj)
+{
+ ASSERT(obj);
+ return obj->length;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/pst_obj.h b/Build/source/texk/xdvipdfmx/src/pst_obj.h
new file mode 100644
index 00000000000..dbd5afdff89
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/pst_obj.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/pst_obj.h,v 1.3 2004/03/14 04:23:04 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _PST_OBJ_H_
+#define _PST_OBJ_H_
+
+#include "pst.h"
+
+extern pst_obj *pst_parse_null (unsigned char **inbuf, unsigned char *inbufend);
+extern pst_obj *pst_parse_boolean(unsigned char **inbuf, unsigned char *inbufend);
+extern pst_obj *pst_parse_name (unsigned char **inbuf, unsigned char *inbufend);
+extern pst_obj *pst_parse_number (unsigned char **inbuf, unsigned char *inbufend);
+extern pst_obj *pst_parse_string (unsigned char **inbuf, unsigned char *inbufend);
+
+extern int pst_name_is_valid (const char *name);
+extern char *pst_name_encode (const char *name);
+
+#endif /* _PST_OBJ_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/sfnt.c b/Build/source/texk/xdvipdfmx/src/sfnt.c
new file mode 100644
index 00000000000..daef0193c9e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/sfnt.c
@@ -0,0 +1,594 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/sfnt.c,v 1.12 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/* Based on dvipdfmx-0.13.2c */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+
+#include <string.h>
+
+#include "system.h"
+
+#include "error.h"
+#include "mem.h"
+#include "mfileio.h"
+
+#include "sfnt.h"
+
+#ifdef XETEX
+UNSIGNED_BYTE
+ft_unsigned_byte(sfnt* f)
+{
+ unsigned char byte;
+ unsigned long length = 1;
+
+ if (FT_Load_Sfnt_Table(f->ft_face, 0, f->loc, &byte, &length) != 0)
+ ERROR("sfnt: Freetype failure...");
+ f->loc += 1;
+
+ return byte;
+}
+
+SIGNED_BYTE
+ft_signed_byte(sfnt* f)
+{
+ int b = ft_unsigned_byte(f);
+ if (b >= 0x80)
+ b -= 0x100;
+ return (SIGNED_BYTE)b;
+}
+
+UNSIGNED_PAIR
+ft_unsigned_pair(sfnt* f)
+{
+ unsigned char buf[2];
+ unsigned long length = 2;
+
+ if (FT_Load_Sfnt_Table(f->ft_face, 0, f->loc, buf, &length) != 0)
+ ERROR("sfnt: Freetype failure...");
+ f->loc += 2;
+
+ return (UNSIGNED_PAIR)((unsigned)buf[0] << 8) + buf[1];
+}
+
+SIGNED_PAIR
+ft_signed_pair(sfnt* f)
+{
+ int p = ft_unsigned_pair(f);
+ if (p >= 0x8000U)
+ p -= 0x10000U;
+
+ return (SIGNED_PAIR)p;
+}
+
+UNSIGNED_QUAD
+ft_unsigned_quad(sfnt* f)
+{
+ unsigned char buf[4];
+ unsigned long length = 4;
+
+ if (FT_Load_Sfnt_Table(f->ft_face, 0, f->loc, buf, &length) != 0)
+ ERROR("sfnt: Freetype failure...");
+ f->loc += 4;
+
+ return ((unsigned long)buf[0] << 24) + ((unsigned long)buf[1] << 16)
+ + ((unsigned long)buf[2] << 8) + (unsigned long)buf[3];
+}
+
+unsigned long
+ft_read(unsigned char* buf, unsigned long len, sfnt* f)
+{
+ unsigned long length = len;
+ if (FT_Load_Sfnt_Table(f->ft_face, 0, f->loc, buf, &length) != 0)
+ ERROR("sfnt: Freetype failure...");
+ f->loc += len;
+
+ return length;
+}
+#endif
+
+
+/*
+ * type:
+ * `true' (0x74727565): TrueType (Mac)
+ * `typ1' (0x74797031) (Mac): PostScript font housed in a sfnt wrapper
+ * 0x00010000: TrueType (Win)/OpenType
+ * `OTTO': PostScript CFF font with OpenType wrapper
+ * `ttcf': TrueType Collection
+*/
+#define SFNT_TRUETYPE 0x00010000UL
+#define SFNT_MAC_TRUE 0x74727565UL
+#define SFNT_OPENTYPE 0x00010000UL
+#define SFNT_POSTSCRIPT 0x4f54544fUL
+#define SFNT_TTC 0x74746366UL
+
+#ifdef XETEX
+sfnt *
+sfnt_open (FT_Face face, int accept_types)
+{
+ sfnt *sfont;
+ ULONG type;
+
+ if (!face || !FT_IS_SFNT(face))
+ return NULL;
+
+ sfont = NEW(1, sfnt);
+ sfont->ft_face = face;
+ sfont->loc = 0;
+ sfont->type = 0;
+
+ type = sfnt_get_ulong(sfont);
+
+ if (type == SFNT_TRUETYPE || type == SFNT_MAC_TRUE) {
+ sfont->type = SFNT_TYPE_TRUETYPE;
+ } else if (type == SFNT_OPENTYPE) {
+ sfont->type = SFNT_TYPE_OPENTYPE;
+ } else if (type == SFNT_POSTSCRIPT) {
+ sfont->type = SFNT_TYPE_POSTSCRIPT;
+ } else if (type == SFNT_TTC) {
+ sfont->type = SFNT_TYPE_TTC;
+ }
+
+ if ((sfont->type & accept_types) == 0) {
+ RELEASE(sfont);
+ return NULL;
+ }
+
+ sfont->loc = 0;
+
+ sfont->directory = NULL;
+
+ return sfont;
+}
+#else /* not XETEX */
+sfnt *
+sfnt_open (FILE *fp)
+{
+ sfnt *sfont;
+ ULONG type;
+
+ ASSERT(fp);
+
+ rewind(fp);
+
+ sfont = NEW(1, sfnt);
+
+ sfont->stream = fp;
+
+ type = sfnt_get_ulong(sfont);
+
+ if (type == SFNT_TRUETYPE || type == SFNT_MAC_TRUE) {
+ sfont->type = SFNT_TYPE_TRUETYPE;
+ } else if (type == SFNT_OPENTYPE) {
+ sfont->type = SFNT_TYPE_OPENTYPE;
+ } else if (type == SFNT_POSTSCRIPT) {
+ sfont->type = SFNT_TYPE_POSTSCRIPT;
+ } else if (type == SFNT_TTC) {
+ sfont->type = SFNT_TYPE_TTC;
+ }
+
+ rewind(sfont->stream);
+
+ sfont->directory = NULL;
+
+ return sfont;
+}
+#endif
+
+static void
+release_directory (struct sfnt_table_directory *td)
+{
+ long i;
+
+ if (td) {
+ if (td->tables) {
+ for (i = 0; i < td->num_tables; i++) {
+ if (td->tables[i].data)
+ RELEASE(td->tables[i].data);
+ }
+ RELEASE(td->tables);
+ }
+ if (td->flags)
+ RELEASE(td->flags);
+ RELEASE(td);
+ }
+
+ return;
+}
+
+void
+sfnt_close (sfnt *sfont)
+{
+
+ if (sfont) {
+ if (sfont->directory)
+ release_directory(sfont->directory);
+ RELEASE(sfont);
+ }
+
+ return;
+}
+
+int
+put_big_endian (void *s, LONG q, int n)
+{
+ int i;
+ char *p;
+
+ p = (char *) s;
+ for (i = n - 1; i >= 0; i--) {
+ p[i] = (char) (q & 0xff);
+ q >>= 8;
+ }
+
+ return n;
+}
+
+/* Convert four-byte number to big endianess
+ * in a machine independent way.
+ */
+static void
+convert_tag (char *tag, unsigned long u_tag)
+{
+ int i;
+
+ for (i = 3; i >= 0; i--) {
+ tag[i] = (char) (u_tag % 256);
+ u_tag /= 256;
+ }
+
+ return;
+}
+
+/*
+ * Computes the max power of 2 <= n
+ */
+static unsigned
+max2floor (unsigned n)
+{
+ int val = 1;
+
+ while (n > 1) {
+ n /= 2;
+ val *= 2;
+ }
+
+ return val;
+}
+
+/*
+ * Computes the log2 of the max power of 2 <= n
+ */
+static unsigned
+log2floor (unsigned n)
+{
+ unsigned val = 0;
+
+ while (n > 1) {
+ n /= 2;
+ val++;
+ }
+
+ return val;
+}
+
+static ULONG
+sfnt_calc_checksum(void *data, ULONG length)
+{
+ ULONG chksum = 0;
+ BYTE *p, *endptr;
+ int count = 0;
+
+ p = (BYTE *) data;
+ endptr = p + length;
+ while (p < endptr) {
+ chksum += (p[0] << (8 * ( 3 - count)));
+ count = ((count + 1) & 3);
+ p++;
+ }
+
+ return chksum;
+}
+
+static int
+find_table_index (struct sfnt_table_directory *td, const char *tag)
+{
+ int idx;
+
+ if (!td)
+ return -1;
+
+ for (idx = 0; idx < td->num_tables; idx++) {
+ if (!memcmp(td->tables[idx].tag, tag, 4))
+ return idx;
+ }
+
+ return -1;
+}
+
+void
+sfnt_set_table (sfnt *sfont, const char *tag, void *data, ULONG length)
+{
+ struct sfnt_table_directory *td;
+ int idx;
+
+ ASSERT(sfont);
+
+ td = sfont->directory;
+ idx = find_table_index(td, tag);
+
+ if (idx < 0) {
+ idx = td->num_tables;
+ td->num_tables++;
+ td->tables = RENEW(td->tables, td->num_tables, struct sfnt_table);
+ memcpy(td->tables[idx].tag, tag, 4);
+ }
+
+ td->tables[idx].check_sum = sfnt_calc_checksum(data, length);
+ td->tables[idx].offset = 0L;
+ td->tables[idx].length = length;
+ td->tables[idx].data = data;
+
+ return;
+}
+
+ULONG
+sfnt_find_table_len (sfnt *sfont, const char *tag)
+{
+ ULONG length;
+ struct sfnt_table_directory *td;
+ int idx;
+
+ ASSERT(sfont && tag);
+
+ td = sfont->directory;
+ idx = find_table_index(td, tag);
+ if (idx < 0)
+ length = 0;
+ else {
+ length = td->tables[idx].length;
+ }
+
+ return length;
+}
+
+ULONG
+sfnt_find_table_pos (sfnt *sfont, const char *tag)
+{
+ ULONG offset;
+ struct sfnt_table_directory *td;
+ int idx;
+
+ ASSERT(sfont && tag);
+
+ td = sfont->directory;
+ idx = find_table_index(td, tag);
+ if (idx < 0)
+ offset = 0;
+ else {
+ offset = td->tables[idx].offset;
+ }
+
+ return offset;
+}
+
+ULONG
+sfnt_locate_table (sfnt *sfont, const char *tag)
+{
+ ULONG offset;
+
+ ASSERT(sfont && tag);
+
+ offset = sfnt_find_table_pos(sfont, tag);
+ if (offset == 0)
+ ERROR("sfnt: table not found...");
+
+ sfnt_seek_set(sfont, offset);
+
+ return offset;
+}
+
+int
+sfnt_read_table_directory (sfnt *sfont, ULONG offset)
+{
+ struct sfnt_table_directory *td;
+ unsigned long i, u_tag;
+
+ ASSERT(sfont);
+
+ if (sfont->directory)
+ release_directory(sfont->directory);
+ sfont->directory = td = NEW (1, struct sfnt_table_directory);
+
+#ifdef XETEX
+ ASSERT(sfont->ft_face);
+#else
+ ASSERT(sfont->stream);
+#endif
+
+ sfnt_seek_set(sfont, offset);
+
+ td->version = sfnt_get_ulong(sfont);
+ td->num_tables = sfnt_get_ushort(sfont);
+ td->search_range = sfnt_get_ushort(sfont);
+ td->entry_selector = sfnt_get_ushort(sfont);
+ td->range_shift = sfnt_get_ushort(sfont);
+
+ td->flags = NEW(td->num_tables, char);
+ td->tables = NEW(td->num_tables, struct sfnt_table);
+
+ for (i = 0; i < td->num_tables; i++) {
+ u_tag = sfnt_get_ulong(sfont);
+
+ convert_tag(td->tables[i].tag, u_tag);
+ td->tables[i].check_sum = sfnt_get_ulong(sfont);
+ td->tables[i].offset = sfnt_get_ulong(sfont);
+ td->tables[i].length = sfnt_get_ulong(sfont);
+ td->tables[i].data = NULL;
+
+ td->flags[i] = 0;
+ }
+
+ td->num_kept_tables = 0;
+
+ return 0;
+}
+
+int
+sfnt_require_table (sfnt *sfont, const char *tag, int must_exist)
+{
+ struct sfnt_table_directory *td;
+ int idx;
+
+ ASSERT(sfont && sfont->directory);
+
+ td = sfont->directory;
+ idx = find_table_index(td, tag);
+ if (idx < 0) {
+ if (must_exist)
+ return -1;
+ } else {
+ td->flags[idx] |= SFNT_TABLE_REQUIRED;
+ td->num_kept_tables++;
+ }
+
+ return 0;
+}
+
+#include "pdfobj.h"
+
+/*
+ * o All tables begin on four byte boundries, and pad any remaining space
+ * between tables with zeros
+ *
+ * o Entries in the Table Directory must be sorted in ascending order by tag
+ *
+ * o The head table contains checksum of the whole font file.
+ * To compute: first set it to 0, sum the entire font as ULONG,
+ * then store 0xB1B0AFBA - sum.
+ */
+
+static unsigned char wbuf[1024], padbytes[4] = {0, 0, 0, 0};
+
+pdf_obj *
+sfnt_create_FontFile_stream (sfnt *sfont)
+{
+ pdf_obj *stream;
+ pdf_obj *stream_dict;
+ struct sfnt_table_directory *td;
+ long offset, nb_read, length;
+ int i, sr;
+ char *p;
+
+ ASSERT(sfont && sfont->directory);
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+
+ td = sfont->directory;
+
+ /* Header */
+ p = (char *) wbuf;
+ p += sfnt_put_ulong (p, td->version);
+ p += sfnt_put_ushort(p, td->num_kept_tables);
+ sr = max2floor(td->num_kept_tables) * 16;
+ p += sfnt_put_ushort(p, sr);
+ p += sfnt_put_ushort(p, log2floor(td->num_kept_tables));
+ p += sfnt_put_ushort(p, td->num_kept_tables * 16 - sr);
+
+ pdf_add_stream(stream, wbuf, 12);
+
+ /*
+ * Compute start of actual tables (after headers).
+ */
+ offset = 12 + 16 * td->num_kept_tables;
+ for (i = 0; i < td->num_tables; i++) {
+ /* This table must exist in FontFile */
+ if (td->flags[i] & SFNT_TABLE_REQUIRED) {
+ if ((offset % 4) != 0) {
+ offset += 4 - (offset % 4);
+ }
+
+ p = (char *) wbuf;
+ memcpy(p, td->tables[i].tag, 4);
+ p += 4;
+ p += sfnt_put_ulong(p, td->tables[i].check_sum);
+ p += sfnt_put_ulong(p, offset);
+ p += sfnt_put_ulong(p, td->tables[i].length);
+ pdf_add_stream(stream, wbuf, 16);
+
+ offset += td->tables[i].length;
+ }
+ }
+
+ offset = 12 + 16 * td->num_kept_tables;
+ for (i = 0; i < td->num_tables; i++) {
+ if (td->flags[i] & SFNT_TABLE_REQUIRED) {
+ if ((offset % 4) != 0) {
+ length = 4 - (offset % 4);
+ pdf_add_stream(stream, padbytes, length);
+ offset += length;
+ }
+ if (!td->tables[i].data) {
+#ifdef XETEX
+ if (!sfont->ft_face)
+#else
+ if (!sfont->stream)
+#endif
+ {
+ pdf_release_obj(stream);
+ ERROR("Font file not opened or already closed...");
+ return NULL;
+ }
+
+ length = td->tables[i].length;
+ sfnt_seek_set(sfont, td->tables[i].offset);
+ while (length > 0) {
+ nb_read = sfnt_read(wbuf, MIN(length, 1024), sfont);
+ if (nb_read < 0) {
+ pdf_release_obj(stream);
+ ERROR("Reading file failed...");
+ return NULL;
+ } else if (nb_read > 0) {
+ pdf_add_stream(stream, wbuf, nb_read);
+ }
+ length -= nb_read;
+ }
+ } else {
+ pdf_add_stream(stream,
+ td->tables[i].data, td->tables[i].length);
+ RELEASE(td->tables[i].data);
+ td->tables[i].data = NULL;
+ }
+ /* Set offset for next table */
+ offset += td->tables[i].length;
+ }
+ }
+
+ stream_dict = pdf_stream_dict(stream);
+ pdf_add_dict(stream_dict,
+ pdf_new_name("Length1"),
+ pdf_new_number(offset));
+
+ return stream;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/sfnt.h b/Build/source/texk/xdvipdfmx/src/sfnt.h
new file mode 100644
index 00000000000..d3154655ef0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/sfnt.h
@@ -0,0 +1,155 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/sfnt.h,v 1.9 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SFNT_H_
+#define _SFNT_H_
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+
+#include "mfileio.h"
+#include "numbers.h"
+#include "pdfobj.h"
+
+#ifdef XETEX
+#include "ft2build.h"
+#include FT_FREETYPE_H
+#include FT_TRUETYPE_TABLES_H
+#endif
+
+/* Data Types as described in Apple's TTRefMan */
+typedef unsigned char BYTE;
+typedef signed char CHAR;
+typedef unsigned short USHORT;
+typedef signed short SHORT;
+typedef unsigned long ULONG;
+typedef signed long LONG;
+typedef unsigned long Fixed; /* 16.16-bit signed fixed-point number */
+typedef short FWord;
+typedef unsigned short uFWord;
+typedef short F2Dot14; /* 16-bit signed fixed number with the low
+ 14 bits representing fraction. */
+
+struct sfnt_table
+{
+ /* table header */
+ char tag[4];
+ ULONG check_sum;
+ ULONG offset;
+ ULONG length;
+ char *data; /* table data */
+};
+
+#define SFNT_TABLE_REQUIRED (1 << 0)
+
+struct sfnt_table_directory
+{
+ ULONG version; /* Fixed for Win */
+ USHORT num_tables;
+ USHORT search_range;
+ USHORT entry_selector;
+ USHORT range_shift;
+ USHORT num_kept_tables; /* number of kept tables */
+ char *flags; /* keep or omit */
+ struct sfnt_table *tables;
+};
+
+/* sfnt resource */
+#define SFNT_TYPE_TRUETYPE (1 << 0)
+#define SFNT_TYPE_OPENTYPE (1 << 1)
+#define SFNT_TYPE_POSTSCRIPT (1 << 2)
+#define SFNT_TYPE_TTC (1 << 4)
+
+typedef struct
+{
+ int type;
+ struct sfnt_table_directory *directory;
+#ifdef XETEX
+ FT_Face ft_face;
+ long loc;
+#else
+ FILE *stream;
+#endif
+} sfnt;
+
+/* Convert sfnt "fixed" type to double */
+#define fixed(a) ((double)((a)%0x10000L)/(double)(0x10000L) + \
+ (a)/0x10000L - (((a)/0x10000L > 0x7fffL) ? 0x10000L : 0))
+
+#ifdef XETEX
+UNSIGNED_BYTE ft_unsigned_byte(sfnt* f);
+SIGNED_BYTE ft_signed_byte(sfnt* f);
+UNSIGNED_PAIR ft_unsigned_pair(sfnt* f);
+SIGNED_PAIR ft_signed_pair(sfnt* f);
+UNSIGNED_QUAD ft_unsigned_quad(sfnt* f);
+unsigned long ft_read(unsigned char* buf, unsigned long len, sfnt* f);
+
+#define sfnt_get_byte(s) ((BYTE) ft_unsigned_byte(s))
+#define sfnt_get_char(s) ((CHAR) ft_signed_byte (s))
+#define sfnt_get_ushort(s) ((USHORT) ft_unsigned_pair(s))
+#define sfnt_get_short(s) ((SHORT) ft_signed_pair (s))
+#define sfnt_get_ulong(s) ((ULONG) ft_unsigned_quad(s))
+#define sfnt_get_long(s) ((LONG) ft_signed_quad (s))
+
+#define sfnt_seek_set(s,o) (s)->loc = (o)
+#define sfnt_read(b,l,s) ft_read((b), (l), (s))
+#else
+/* get_***_*** from numbers.h */
+#define sfnt_get_byte(s) ((BYTE) get_unsigned_byte((s)->stream))
+#define sfnt_get_char(s) ((CHAR) get_signed_byte ((s)->stream))
+#define sfnt_get_ushort(s) ((USHORT) get_unsigned_pair((s)->stream))
+#define sfnt_get_short(s) ((SHORT) get_signed_pair ((s)->stream))
+#define sfnt_get_ulong(s) ((ULONG) get_unsigned_quad((s)->stream))
+#define sfnt_get_long(s) ((LONG) get_signed_quad ((s)->stream))
+
+#define sfnt_seek_set(s,o) seek_absolute((s)->stream, (o))
+#define sfnt_read(b,l,s) fread((b), 1, (l), (s)->stream)
+#endif
+
+extern int put_big_endian (void *s, LONG q, int n);
+
+#define sfnt_put_ushort(s,v) put_big_endian((s), v, 2);
+#define sfnt_put_short(s,v) put_big_endian((s), v, 2);
+#define sfnt_put_ulong(s,v) put_big_endian((s), v, 4);
+#define sfnt_put_long(s,v) put_big_endian((s), v, 4);
+
+#ifdef XETEX
+extern sfnt *sfnt_open (FT_Face face, int accept_types);
+#else
+extern sfnt *sfnt_open (FILE *fp);
+#endif
+extern void sfnt_close (sfnt *sfont);
+
+/* table directory */
+extern int sfnt_read_table_directory (sfnt *sfont, ULONG offset);
+extern ULONG sfnt_find_table_len (sfnt *sfont, const char *tag);
+extern ULONG sfnt_find_table_pos (sfnt *sfont, const char *tag);
+extern ULONG sfnt_locate_table (sfnt *sfont, const char *tag);
+
+extern void sfnt_set_table (sfnt *sfont,
+ const char *tag, void *data, ULONG length);
+extern int sfnt_require_table (sfnt *sfont, const char *tag, int must_exist);
+
+extern pdf_obj *sfnt_create_FontFile_stream (sfnt *sfont);
+
+#endif /* _SFNT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_color.c b/Build/source/texk/xdvipdfmx/src/spc_color.c
new file mode 100644
index 00000000000..27c318f8825
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_color.c
@@ -0,0 +1,220 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_color.c,v 1.5 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfdev.h"
+#include "pdfcolor.h"
+
+#include "specials.h"
+
+#include "spc_util.h"
+#include "spc_color.h"
+
+
+/* Color stack is actually placed into pdfcolor.c.
+ * The reason why we need to place stack there is
+ * that we must reinstall color after grestore and
+ * other operations that can change current color
+ * implicitely.
+ */
+
+int
+spc_color_at_begin_page (void)
+{
+ return 0;
+}
+
+int
+spc_color_at_end_page (void)
+{
+ return 0;
+}
+
+int
+spc_color_at_begin_document (void)
+{
+ return 0;
+}
+
+int
+spc_color_at_end_document (void)
+{
+ return 0;
+}
+
+static int
+spc_handler_color_push (struct spc_env *spe, struct spc_arg *args)
+{
+ int error = 0;
+ pdf_color colorspec;
+
+ pdf_color_push(); /* save currentcolor */
+ if (args->curptr < args->endptr) {
+ error = spc_util_read_colorspec(spe, &colorspec, args, 1);
+ if (!error) {
+ pdf_dev_setcolor(&colorspec, 0);
+ pdf_dev_setcolor(&colorspec, 1);
+ }
+ }
+
+ return error;
+}
+
+static int
+spc_handler_color_pop (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_color_pop();
+
+ return 0;
+}
+
+/* _FIXME_ ... I don't understand this well.
+ * Dvips's implementation is to clear color stack and then
+ * push color?
+ */
+static int
+spc_handler_color_default (struct spc_env *spe, struct spc_arg *args)
+{
+ int error;
+ pdf_color colorspec;
+
+ error = spc_util_read_colorspec(spe, &colorspec, args, 1);
+ if (!error) {
+ pdf_color_clear();
+ pdf_dev_setcolor(&colorspec, 0);
+ pdf_dev_setcolor(&colorspec, 1);
+ pdf_color_push(); /* save currentcolor */
+ }
+
+ return error;
+}
+
+
+/* This is from color special? */
+#include "pdfdoc.h"
+
+static int
+spc_handler_background (struct spc_env *spe, struct spc_arg *args)
+{
+ int error;
+ pdf_color colorspec;
+
+ error = spc_util_read_colorspec(spe, &colorspec, args, 1);
+ if (!error)
+ pdf_doc_set_bgcolor(&colorspec);
+
+ return error;
+}
+
+
+#ifndef ISBLANK
+#define ISBLANK(c) ((c) == ' ' || (c) == '\t' || (c) == '\v')
+#endif
+static void
+skip_blank (char **pp, char *endptr)
+{
+ char *p = *pp;
+ for ( ; p < endptr && ISBLANK(*p); p++);
+ *pp = p;
+}
+
+int
+spc_color_check_special (const char *buf, long len)
+{
+ int r = 0;
+ char *q, *p, *endptr;
+
+ p = (char *) buf;
+ endptr = p + len;
+
+ skip_blank(&p, endptr);
+ q = parse_c_ident(&p, endptr);
+ if (!q)
+ return 0;
+ else if (!strcmp(q, "color"))
+ r = 1;
+ else if (!strcmp(q, "background")) {
+ r = 1;
+ }
+ RELEASE(q);
+
+ return r;
+}
+
+extern int
+spc_color_setup_handler (struct spc_handler *sph,
+ struct spc_env *spe, struct spc_arg *ap)
+{
+ char *p, *q;
+
+ ASSERT(sph && spe && ap);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ q = parse_c_ident(&ap->curptr, ap->endptr);
+ if (!q)
+ return -1;
+ skip_blank(&ap->curptr, ap->endptr);
+
+ if (!strcmp(q, "background")) {
+ ap->command = (char *) "background";
+ sph->exec = &spc_handler_background;
+ RELEASE(q);
+ } else if (!strcmp(q, "color")) { /* color */
+ RELEASE(q);
+ p = ap->curptr;
+
+ q = parse_c_ident(&p, ap->endptr);
+ if (!q)
+ return -1;
+ else if (!strcmp(q, "push")) {
+ ap->command = (char *) "push";
+ sph->exec = &spc_handler_color_push;
+ ap->curptr = p;
+ } else if (!strcmp(q, "pop")) {
+ ap->command = (char *) "pop";
+ sph->exec = &spc_handler_color_pop;
+ ap->curptr = p;
+ } else { /* cmyk, rgb, ... */
+ ap->command = (char *) "";
+ sph->exec = &spc_handler_color_default;
+ }
+ RELEASE(q);
+ } else {
+ spc_warn(spe, "Not color/background special?");
+ RELEASE(q);
+ return -1;
+ }
+
+ skip_blank(&ap->curptr, ap->endptr);
+ return 0;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_color.h b/Build/source/texk/xdvipdfmx/src/spc_color.h
new file mode 100644
index 00000000000..60770556883
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_color.h
@@ -0,0 +1,37 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_color.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_COLOR_H_
+#define _SPC_COLOR_H_
+
+extern int spc_color_at_begin_page (void);
+extern int spc_color_at_end_page (void);
+extern int spc_color_at_begin_document (void);
+extern int spc_color_at_end_document (void);
+
+extern int spc_color_check_special (const char *buffer, long size);
+extern int spc_color_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_COLOR_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_dvips.c b/Build/source/texk/xdvipdfmx/src/spc_dvips.c
new file mode 100644
index 00000000000..39578065626
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_dvips.c
@@ -0,0 +1,395 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_dvips.c,v 1.9 2005/08/19 12:06:24 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+
+#include "pdfparse.h"
+
+#include "pdfdoc.h"
+
+#include "mpost.h"
+
+#include "pdfximage.h"
+#include "pdfdraw.h"
+#include "pdfcolor.h"
+#include "pdfdev.h"
+
+#include "specials.h"
+#include "spc_util.h"
+
+#include "spc_dvips.h"
+
+
+static int block_pending = 0;
+static double pending_x = 0.0;
+static double pending_y = 0.0;
+static int position_set = 0;
+
+static char *
+parse_filename (char **pp, char *endptr)
+{
+ char *r, *q = NULL, *p = *pp;
+ char qchar;
+ int n;
+
+ if (!p || p >= endptr)
+ return NULL;
+ else if (*p == '\"' || *p == '\'')
+ qchar = *p++;
+ else {
+ qchar = ' ';
+ }
+ for (n = 0, q = p; p < endptr && *p != qchar; n++, p++);
+ if (qchar != ' ') {
+ if (*p != qchar)
+ return NULL;
+ p++;
+ }
+ if (!q || n == 0)
+ return NULL;
+
+#if 0
+ {
+ int i;
+ for (i = 0; i < n && isprint(q[i]); i++);
+ if (i != n) {
+ WARN("Non printable char in filename string...");
+ }
+ }
+#endif
+
+ r = NEW(n + 1, char);
+ memcpy(r, q, n); r[n] = '\0';
+
+ *pp = p;
+ return r;
+}
+
+/* =filename ... */
+static int
+spc_handler_ps_file (struct spc_env *spe, struct spc_arg *args)
+{
+ int form_id;
+ char *filename;
+ transform_info ti;
+
+ ASSERT(spe && args);
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr + 1 >= args->endptr ||
+ args->curptr[0] != '=') {
+ spc_warn(spe, "No filename specified for PSfile special.");
+ return -1;
+ }
+ args->curptr++;
+
+ filename = parse_filename(&args->curptr, args->endptr);
+ if (!filename) {
+ spc_warn(spe, "No filename specified for PSfile special.");
+ return -1;
+ }
+
+ transform_info_clear(&ti);
+ if (spc_util_read_dimtrns(spe, &ti, args, 1) < 0) {
+ RELEASE(filename);
+ return -1;
+ }
+
+ form_id = pdf_ximage_findresource(filename, 0, 0);
+ if (form_id < 0) {
+ spc_warn(spe, "Failed to read image file: %s", filename);
+ RELEASE(filename);
+ return -1;
+ }
+ RELEASE(filename);
+
+ pdf_dev_put_image(form_id, &ti, spe->x_user, spe->y_user);
+
+ return 0;
+}
+
+/* This isn't correct implementation but dvipdfm supports... */
+static int
+spc_handler_ps_plotfile (struct spc_env *spe, struct spc_arg *args)
+{
+ int error = 0;
+ int form_id;
+ char *filename;
+ transform_info p;
+
+ ASSERT(spe && args);
+
+ spc_warn(spe, "ps:plotfile found (not properly implemented)");
+
+ skip_white(&args->curptr, args->endptr);
+ filename = parse_filename(&args->curptr, args->endptr);
+ if (!filename) {
+ spc_warn(spe, "Expecting filename but not found...");
+ return -1;
+ }
+
+ form_id = pdf_ximage_findresource(filename, 0, 0);
+ if (form_id < 0) {
+ spc_warn(spe, "Could not open PS file: %s", filename);
+ error = -1;
+ } else {
+ transform_info_clear(&p);
+ p.matrix.d = -1.0; /* xscale = 1.0, yscale = -1.0 */
+#if 0
+ /* I don't know how to treat this... */
+ pdf_dev_put_image(form_id, &p,
+ block_pending ? pending_x : spe->x_user,
+ block_pending ? pending_y : spe->y_user);
+#endif
+ pdf_dev_put_image(form_id, &p, 0, 0);
+ }
+ RELEASE(filename);
+
+ return error;
+}
+
+static int
+spc_handler_ps_literal (struct spc_env *spe, struct spc_arg *args)
+{
+ int error = 0;
+ int st_depth, gs_depth;
+ double x_user, y_user;
+
+ ASSERT(spe && args);
+
+ if (args->curptr >= args->endptr)
+ return -1;
+
+ if (args->curptr + strlen(":[begin]") <= args->endptr &&
+ !strncmp(args->curptr, ":[begin]", strlen(":[begin]"))) {
+ block_pending++;
+ position_set = 1;
+
+ x_user = pending_x = spe->x_user;
+ y_user = pending_y = spe->y_user;
+ args->curptr += strlen(":[begin]");
+ } else if (args->curptr + strlen(":[end]") <= args->endptr &&
+ !strncmp(args->curptr, ":[end]", strlen(":[end]"))) {
+ if (block_pending <= 0) {
+ spc_warn(spe, "No corresponding ::[begin] found.");
+ return -1;
+ }
+ block_pending--;
+
+ position_set = 0;
+
+ x_user = pending_x;
+ y_user = pending_y;
+ args->curptr += strlen(":[end]");
+ } else if (args->curptr < args->endptr &&
+ args->curptr[0] == ':') {
+ x_user = position_set ? pending_x : spe->x_user;
+ y_user = position_set ? pending_y : spe->y_user;
+ args->curptr++;
+ } else {
+ position_set = 1;
+ x_user = pending_x = spe->x_user;
+ y_user = pending_y = spe->y_user;
+ }
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr < args->endptr) {
+
+ st_depth = mps_stack_depth();
+ gs_depth = pdf_dev_current_depth();
+
+ error = mps_exec_inline(&args->curptr,
+ args->endptr,
+ x_user, y_user);
+ if (error) {
+ spc_warn(spe, "Interpreting PS code failed!!! Output might be broken!!!");
+ pdf_dev_grestore_to(gs_depth);
+ } else if (st_depth != mps_stack_depth()) {
+ spc_warn(spe, "Stack not empty after execution of inline PostScript code.");
+ spc_warn(spe, ">> Your macro package makes some assumption on internal behaviour of DVI drivers.");
+ spc_warn(spe, ">> It may not compatible with dvipdfmx.");
+ }
+ }
+
+ return error;
+}
+
+static int
+spc_handler_ps_default (struct spc_env *spe, struct spc_arg *args)
+{
+ int error;
+ int st_depth, gs_depth;
+
+ ASSERT(spe && args);
+
+ pdf_dev_gsave();
+
+ st_depth = mps_stack_depth();
+ gs_depth = pdf_dev_current_depth();
+
+ {
+ pdf_tmatrix M;
+ M.a = M.d = 1.0; M.b = M.c = 0.0; M.e = spe->x_user; M.f = spe->y_user;
+ pdf_dev_concat(&M);
+ error = mps_exec_inline(&args->curptr,
+ args->endptr,
+ spe->x_user, spe->y_user);
+ M.e = -spe->x_user; M.f = -spe->y_user;
+ pdf_dev_concat(&M);
+ }
+ if (error)
+ spc_warn(spe, "Interpreting PS code failed!!! Output might be broken!!!");
+ else {
+ if (st_depth != mps_stack_depth()) {
+ spc_warn(spe, "Stack not empty after execution of inline PostScript code.");
+ spc_warn(spe, ">> Your macro package makes some assumption on internal behaviour of DVI drivers.");
+ spc_warn(spe, ">> It may not compatible with dvipdfmx.");
+ }
+ }
+
+ pdf_dev_grestore_to(gs_depth);
+ pdf_dev_grestore();
+
+ return error;
+}
+
+static struct spc_handler dvips_handlers[] = {
+ {"PSfile", spc_handler_ps_file},
+ {"psfile", spc_handler_ps_file},
+ {"ps: plotfile", spc_handler_ps_plotfile}, /* FIXME */
+ {"PS: plotfile", spc_handler_ps_plotfile}, /* FIXME */
+ {"PS:", spc_handler_ps_literal},
+ {"ps:", spc_handler_ps_literal},
+ {"\" ", spc_handler_ps_default}
+};
+
+int
+spc_dvips_at_begin_page (void)
+{
+ return 0;
+}
+
+int
+spc_dvips_at_end_page (void)
+{
+ mps_eop_cleanup();
+ return 0;
+}
+
+int
+spc_dvips_at_begin_document (void)
+{
+ return 0;
+}
+
+int
+spc_dvips_at_end_document (void)
+{
+ return 0;
+}
+
+int
+spc_dvips_check_special (const char *buf, long len)
+{
+ char *p, *endptr;
+ int i;
+
+ p = (char *) buf;
+ endptr = p + len;
+
+ skip_white(&p, endptr);
+ if (p >= endptr)
+ return 0;
+
+ len = (long) (endptr - p);
+ for (i = 0;
+ i < sizeof(dvips_handlers)/sizeof(struct spc_handler); i++) {
+ if (len >= strlen(dvips_handlers[i].key) &&
+ !memcmp(p, dvips_handlers[i].key,
+ strlen(dvips_handlers[i].key))) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int
+spc_dvips_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args)
+{
+ char *key;
+ int i, keylen;
+
+ ASSERT(handle && spe && args);
+
+ skip_white(&args->curptr, args->endptr);
+
+ key = args->curptr;
+ while (args->curptr < args->endptr &&
+ isalpha(args->curptr[0])) {
+ args->curptr++;
+ }
+ /* ps:: --> : */
+ if (args->curptr < args->endptr &&
+ args->curptr[0] == ':') {
+ args->curptr++;
+ } else if (args->curptr+1 < args->endptr &&
+ args->curptr[0] == '"' && args->curptr[1] == ' ') {
+ args->curptr += 2;
+ }
+
+ keylen = (int) (args->curptr - key);
+ if (keylen < 1) {
+ spc_warn(spe, "Not ps: special???");
+ return -1;
+ }
+
+ for (i = 0;
+ i < sizeof(dvips_handlers) / sizeof(struct spc_handler); i++) {
+ if (keylen == strlen(dvips_handlers[i].key) &&
+ !strncmp(key, dvips_handlers[i].key, keylen)) {
+
+ skip_white(&args->curptr, args->endptr);
+
+ args->command = (char *) dvips_handlers[i].key;
+
+ handle->key = (char *) "ps:";
+ handle->exec = dvips_handlers[i].exec;
+
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_dvips.h b/Build/source/texk/xdvipdfmx/src/spc_dvips.h
new file mode 100644
index 00000000000..8816b4078cf
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_dvips.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_dvips.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_DVIPS_H_
+#define _SPC_DVIPS_H_
+
+#include "specials.h"
+
+extern int spc_dvips_at_begin_page (void);
+extern int spc_dvips_at_end_page (void);
+extern int spc_dvips_at_begin_document (void);
+extern int spc_dvips_at_end_document (void);
+
+extern int spc_dvips_check_special (const char *buffer, long size);
+extern int spc_dvips_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_DVIPS_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_html.c b/Build/source/texk/xdvipdfmx/src/spc_html.c
new file mode 100644
index 00000000000..7d993f2b98c
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_html.c
@@ -0,0 +1,940 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_html.c,v 1.5 2005/08/14 15:50:36 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfdraw.h"
+#include "pdfdev.h"
+#include "pdfximage.h"
+
+#include "pdfdoc.h"
+
+#include "specials.h"
+#include "spc_util.h"
+
+#include "spc_html.h"
+
+
+#define ENABLE_HTML_IMG_SUPPORT 1
+#define ENABLE_HTML_SVG_TRANSFORM 1
+#define ENABLE_HTML_SVG_OPACITY 1
+
+/* _FIXME_
+ * Please rewrite this or remove html special support
+ */
+
+#define ANCHOR_TYPE_HREF 0
+#define ANCHOR_TYPE_NAME 1
+
+struct spc_html_
+{
+ struct {
+ long extensions;
+ } opts;
+
+ pdf_obj *link_dict;
+ char *baseurl;
+ int pending_type;
+};
+
+static struct spc_html_ _html_state = {
+ { 0 },
+ NULL, NULL, -1
+};
+
+
+#ifdef ENABLE_HTML_SVG_TRANSFORM
+static int cvt_a_to_tmatrix (pdf_tmatrix *M, const char *ptr, char **nextptr);
+#endif /* ENABLE_HTML_SVG_TRANSFORM */
+
+#define \
+downcasify(s) \
+if ((s)) { \
+ char *_p = (char *) (s); \
+ while (*(_p) != 0) { \
+ if (*(_p) >= 'A' && *(_p) <= 'Z') { \
+ *(_p) = (*(_p) - 'A') + 'a'; \
+ } \
+ _p++; \
+ } \
+}
+
+static int
+parse_key_val (char **pp, char *endptr, char **kp, char **vp)
+{
+ char *q, *p, *k, *v;
+ int n, error = 0;
+
+ for (p = *pp ; p < endptr && isspace(*p); p++);
+#if 0
+ while (!error && p < endptr &&
+ ((*p >= 'a' && *p <= 'z') ||
+ (*p >= 'A' && *p <= 'Z'))
+ ) {
+#endif
+ k = v = NULL;
+ for (q = p, n = 0;
+ p < endptr &&
+ ((*p >= 'a' && *p <= 'z') ||
+ (*p >= 'A' && *p <= 'Z') ||
+ (*p >= '0' && *p <= '9') ||
+ *p == '-' || *p == ':'
+ ); n++, p++);
+ if (n == 0) {
+#if 0
+ break;
+#else
+ *kp = *vp = NULL;
+ return -1;
+#endif
+ }
+ k = NEW(n + 1, char);
+ memcpy(k, q, n); k[n] = '\0';
+ if (p + 2 >= endptr || p[0] != '=' || (p[1] != '\"' && p[1] != '\'')) {
+ RELEASE(k); k = NULL;
+ *pp = p;
+ error = -1;
+ } else {
+ char qchr = p[1];
+ p += 2; /* skip '="' */
+ for (q = p, n = 0; p < endptr && *p != qchr; p++, n++);
+ if (p == endptr || *p != qchr)
+ error = -1;
+ else {
+ v = NEW(n + 1, char);
+ memcpy(v, q, n); v[n] = '\0';
+#if 0
+ pdf_add_dict(t->attr,
+ pdf_new_name(k),
+ pdf_new_string(v, n));
+ RELEASE(v);
+#endif
+ p++;
+ }
+ }
+#if 0
+ RELEASE(k);
+ if (!error)
+ for ( ; p < endptr && isspace(*p); p++);
+ }
+#endif
+
+ *kp = k; *vp = v; *pp = p;
+ return error;
+}
+
+#define HTML_TAG_NAME_MAX 127
+#define HTML_TAG_TYPE_EMPTY 1
+#define HTML_TAG_TYPE_OPEN 1
+#define HTML_TAG_TYPE_CLOSE 2
+
+static int
+read_html_tag (char *name, pdf_obj *attr, int *type, char **pp, char *endptr)
+{
+ char *p = *pp;
+ int n = 0, error = 0;
+
+ for ( ; p < endptr && isspace(*p); p++);
+ if (p >= endptr || *p != '<')
+ return -1;
+
+ *type = HTML_TAG_TYPE_OPEN;
+ for (++p; p < endptr && isspace(*p); p++);
+ if (p < endptr && *p == '/') {
+ *type = HTML_TAG_TYPE_CLOSE;
+ for (++p; p < endptr && isspace(*p); p++);
+ }
+
+#define ISDELIM(c) ((c) == '>' || (c) == '/' || isspace(c))
+ for (n = 0; p < endptr && n < HTML_TAG_NAME_MAX && !ISDELIM(*p); n++, p++) {
+ name[n] = *p;
+ }
+ name[n] = '\0';
+ if (n == 0 || p == endptr || !ISDELIM(*p)) {
+ *pp = p;
+ return -1;
+ }
+
+ for ( ; p < endptr && isspace(*p); p++);
+ while (p < endptr && !error && *p != '/' && *p != '>') {
+ char *kp = NULL, *vp = NULL;
+ error = parse_key_val(&p, endptr, &kp, &vp);
+ if (!error) {
+ downcasify(kp);
+ pdf_add_dict(attr,
+ pdf_new_name(kp),
+ pdf_new_string(vp, strlen(vp) + 1)); /* include trailing NULL here!!! */
+ RELEASE(kp);
+ RELEASE(vp);
+ }
+ for ( ; p < endptr && isspace(*p); p++);
+ }
+ if (error) {
+ *pp = p;
+ return error;
+ }
+
+ if (p < endptr && *p == '/') {
+ *type = HTML_TAG_TYPE_EMPTY;
+ for (++p; p < endptr && isspace(*p); p++);
+ }
+ if (p == endptr || *p != '>') {
+ *pp = p;
+ return -1;
+ }
+ p++;
+
+ downcasify(name);
+ *pp = p;
+ return 0;
+}
+
+
+static int
+spc_handler_html__init (struct spc_env *spe, struct spc_arg *ap, void *dp)
+{
+ struct spc_html_ *sd = dp;
+
+ sd->link_dict = NULL;
+ sd->baseurl = NULL;
+ sd->pending_type = -1;
+
+ return 0;
+}
+
+static int
+spc_handler_html__clean (struct spc_env *spe, struct spc_arg *ap, void *dp)
+{
+ struct spc_html_ *sd = dp;
+
+ if (sd->baseurl)
+ RELEASE(sd->baseurl);
+
+ if (sd->pending_type >= 0 || sd->link_dict)
+ spc_warn(spe, "Unclosed html anchor found.");
+
+ if (sd->link_dict)
+ pdf_release_obj(sd->link_dict);
+
+ sd->pending_type = -1;
+ sd->baseurl = NULL;
+ sd->link_dict = NULL;
+
+ return 0;
+}
+
+
+static int
+spc_handler_html__bophook (struct spc_env *spe, struct spc_arg *ap, void *dp)
+{
+ struct spc_html_ *sd = dp;
+
+ if (sd->pending_type >= 0) {
+ spc_warn(spe, "...html anchor continues from previous page processed...");
+ }
+
+ return 0;
+}
+
+static int
+spc_handler_html__eophook (struct spc_env *spe, struct spc_arg *ap, void *dp)
+{
+ struct spc_html_ *sd = dp;
+
+ if (sd->pending_type >= 0) {
+ spc_warn(spe, "Unclosed html anchor at end-of-page!");
+ }
+
+ return 0;
+}
+
+
+static char *
+fqurl (const char *baseurl, const char *name)
+{
+ char *q;
+ int len = 0;
+
+ len = strlen(name);
+ if (baseurl)
+ len += strlen(baseurl) + 1; /* we may want to add '/' */
+
+ q = NEW(len + 1, char);
+ if (baseurl && baseurl[0]) {
+ char *p;
+ strcpy(q, baseurl);
+ p = q + strlen(q) - 1;
+ if (*p == '/')
+ *p = '\0';
+ if (name[0] && name[0] != '/')
+ strcat(q, "/");
+ }
+ strcat(q, name);
+
+ return q;
+}
+
+static int
+html_open_link (struct spc_env *spe, const char *name, struct spc_html_ *sd)
+{
+ pdf_obj *color;
+ char *url;
+
+ ASSERT( name );
+ ASSERT( sd->link_dict == NULL ); /* Should be checked somewhere else */
+
+ sd->link_dict = pdf_new_dict();
+ pdf_add_dict(sd->link_dict,
+ pdf_new_name("Type"), pdf_new_name ("Annot"));
+ pdf_add_dict(sd->link_dict,
+ pdf_new_name("Subtype"), pdf_new_name ("Link"));
+
+ color = pdf_new_array ();
+ pdf_add_array(color, pdf_new_number(0.0));
+ pdf_add_array(color, pdf_new_number(0.0));
+ pdf_add_array(color, pdf_new_number(1.0));
+ pdf_add_dict(sd->link_dict, pdf_new_name("C"), color);
+
+ url = fqurl(sd->baseurl, name);
+ if (url[0] == '#') {
+ /* url++; causes memory leak in RELEASE(url) */
+ pdf_add_dict(sd->link_dict,
+ pdf_new_name("Dest"),
+ pdf_new_string(url+1, strlen(url+1)));
+ } else { /* Assume this is URL */
+ pdf_obj *action = pdf_new_dict();
+ pdf_add_dict(action,
+ pdf_new_name("Type"),
+ pdf_new_name("Action"));
+ pdf_add_dict(action,
+ pdf_new_name("S"),
+ pdf_new_name("URI"));
+ pdf_add_dict(action,
+ pdf_new_name("URI"),
+ pdf_new_string(url, strlen(url)));
+ pdf_add_dict(sd->link_dict,
+ pdf_new_name("A"),
+ pdf_link_obj(action));
+ pdf_release_obj(action);
+ }
+ RELEASE(url);
+
+ spc_begin_annot(spe, sd->link_dict);
+
+ sd->pending_type = ANCHOR_TYPE_HREF;
+
+ return 0;
+}
+
+static int
+html_open_dest (struct spc_env *spe, const char *name, struct spc_html_ *sd)
+{
+ int error;
+ pdf_obj *array, *page_ref;
+ pdf_coord cp;
+
+ cp.x = spe->x_user; cp.y = spe->y_user;
+ pdf_dev_transform(&cp, NULL);
+
+ page_ref = pdf_doc_this_page_ref();
+ ASSERT( page_ref ); /* Otherwise must be bug */
+
+ array = pdf_new_array();
+ pdf_add_array(array, page_ref);
+ pdf_add_array(array, pdf_new_name("XYZ"));
+ pdf_add_array(array, pdf_new_null());
+ pdf_add_array(array, pdf_new_number(cp.y + 24.0));
+ pdf_add_array(array, pdf_new_null());
+
+ error = pdf_doc_add_names("Dests",
+ name, strlen(name),
+ array);
+
+ if (error)
+ spc_warn(spe, "Failed to add named destination: %s", name);
+
+ sd->pending_type = ANCHOR_TYPE_NAME;
+
+ return error;
+}
+
+#define ANCHOR_STARTED(s) ((s)->pending_type >= 0 || (s)->link_dict)
+
+static int
+spc_html__anchor_open (struct spc_env *spe, pdf_obj *attr, struct spc_html_ *sd)
+{
+ pdf_obj *href, *name;
+ int error = 0;
+
+ if (ANCHOR_STARTED(sd)) {
+ spc_warn(spe, "Nested html anchors found!");
+ return -1;
+ }
+
+ href = pdf_lookup_dict(attr, "href");
+ name = pdf_lookup_dict(attr, "name");
+ if (href && name) {
+ spc_warn(spe, "Sorry, you can't have both \"href\" and \"name\" in anchor tag...");
+ error = -1;
+ } else if (href) {
+ error = html_open_link(spe, pdf_string_value(href), sd);
+ } else if (name) { /* name */
+ error = html_open_dest(spe, pdf_string_value(name), sd);
+ } else {
+ spc_warn(spe, "You should have \"href\" or \"name\" in anchor tag!");
+ error = -1;
+ }
+
+ return error;
+}
+
+static int
+spc_html__anchor_close (struct spc_env *spe, pdf_obj *attr, struct spc_html_ *sd)
+{
+ int error = 0;
+
+ switch (sd->pending_type) {
+ case ANCHOR_TYPE_HREF:
+ if (sd->link_dict) {
+ spc_end_annot(spe);
+ pdf_release_obj(sd->link_dict);
+ sd->link_dict = NULL;
+ sd->pending_type = -1;
+ } else {
+ spc_warn(spe, "Closing html anchor (link) without starting!");
+ error = -1;
+ }
+ break;
+ case ANCHOR_TYPE_NAME:
+ sd->pending_type = -1;
+ break;
+ default:
+ spc_warn(spe, "No corresponding opening tag for html anchor.");
+ error = -1;
+ break;
+ }
+
+ return error;
+}
+
+static int
+spc_html__base_empty (struct spc_env *spe, pdf_obj *attr, struct spc_html_ *sd)
+{
+ pdf_obj *href;
+ char *vp;
+
+ href = pdf_lookup_dict(attr, "href");
+ if (!href) {
+ spc_warn(spe, "\"href\" not found for \"base\" tag!");
+ return -1;
+ }
+
+ vp = (char *) pdf_string_value(href);
+ if (sd->baseurl) {
+ spc_warn(spe, "\"baseurl\" changed: \"%s\" --> \"%s\"", sd->baseurl, vp);
+ RELEASE(sd->baseurl);
+ }
+ sd->baseurl = NEW(strlen(vp) + 1, char);
+ strcpy(sd->baseurl, vp);
+
+ return 0;
+}
+
+
+#ifdef ENABLE_HTML_IMG_SUPPORT
+/* This isn't completed.
+ * Please think about placement of images.
+ */
+static double
+atopt (const char *a)
+{
+ char *q, *p = (char *) a;
+ double v, u = 1.0;
+ const char *_ukeys[] = {
+#define K_UNIT__PT 0
+#define K_UNIT__IN 1
+#define K_UNIT__CM 2
+#define K_UNIT__MM 3
+#define K_UNIT__BP 4
+ "pt", "in", "cm", "mm", "bp",
+#define K_UNIT__PX 5
+ "px",
+ NULL
+ };
+ int k;
+
+ q = parse_float_decimal(&p, p + strlen(p));
+ if (!q) {
+ WARN("Invalid length value: %s (%c)", a, *p);
+ return 0.0;
+ }
+
+ v = atof(q);
+ RELEASE(q);
+
+ q = parse_c_ident(&p, p + strlen(p));
+ if (q) {
+ for (k = 0; _ukeys[k] && strcmp(_ukeys[k], q); k++);
+ switch (k) {
+ case K_UNIT__PT: u *= 72.0 / 72.27; break;
+ case K_UNIT__IN: u *= 72.0; break;
+ case K_UNIT__CM: u *= 72.0 / 2.54 ; break;
+ case K_UNIT__MM: u *= 72.0 / 25.4 ; break;
+ case K_UNIT__BP: u *= 1.0 ; break;
+ case K_UNIT__PX: u *= 1.0 ; break; /* 72dpi */
+ default:
+ WARN("Unknown unit of measure: %s", q);
+ break;
+ }
+ RELEASE(q);
+ }
+
+ return v * u;
+}
+
+
+#ifdef ENABLE_HTML_SVG_OPACITY
+/* Replicated from spc_tpic */
+static pdf_obj *
+create_xgstate (double a /* alpha */, int f_ais /* alpha is shape */)
+{
+ pdf_obj *dict;
+
+ dict = pdf_new_dict();
+ pdf_add_dict(dict,
+ pdf_new_name("Type"),
+ pdf_new_name("ExtGState"));
+ if (f_ais) {
+ pdf_add_dict(dict,
+ pdf_new_name("AIS"),
+ pdf_new_boolean(1));
+ }
+ pdf_add_dict(dict,
+ pdf_new_name("ca"),
+ pdf_new_number(a));
+
+ return dict;
+}
+
+static int
+check_resourcestatus (const char *category, const char *resname)
+{
+ pdf_obj *dict1, *dict2;
+
+ dict1 = pdf_doc_current_page_resources();
+ if (!dict1)
+ return 0;
+
+ dict2 = pdf_lookup_dict(dict1, category);
+ if (dict2 &&
+ pdf_obj_typeof(dict2) == PDF_DICT) {
+ if (pdf_lookup_dict(dict2, resname))
+ return 1;
+ }
+ return 0;
+}
+#endif /* ENABLE_HTML_SVG_OPACITY */
+
+static int
+spc_html__img_empty (struct spc_env *spe, pdf_obj *attr, struct spc_html_ *sd)
+{
+ pdf_obj *src, *obj;
+ transform_info ti;
+ int id, error = 0;
+#ifdef ENABLE_HTML_SVG_OPACITY
+ double alpha = 1.0; /* meaning fully opaque */
+#endif /* ENABLE_HTML_SVG_OPACITY */
+#ifdef ENABLE_HTML_SVG_TRANSFORM
+ pdf_tmatrix M;
+
+ pdf_setmatrix(&M, 1.0, 0.0, 0.0, 1.0, spe->x_user, spe->y_user);
+#endif /* ENABLE_HTML_SVG_TRANSFORM */
+
+ spc_warn(spe, "html \"img\" tag found (not completed, plese don't use!).");
+
+ src = pdf_lookup_dict(attr, "src");
+ if (!src) {
+ spc_warn(spe, "\"src\" attribute not found for \"img\" tag!");
+ return -1;
+ }
+
+ transform_info_clear(&ti);
+ obj = pdf_lookup_dict(attr, "width");
+ if (obj) {
+ ti.width = atopt(pdf_string_value(obj));
+ ti.flags |= INFO_HAS_WIDTH;
+ }
+ obj = pdf_lookup_dict(attr, "height");
+ if (obj) {
+ ti.height = atopt(pdf_string_value(obj));
+ ti.flags |= INFO_HAS_HEIGHT;
+ }
+
+#ifdef ENABLE_HTML_SVG_OPACITY
+ obj = pdf_lookup_dict(attr, "svg:opacity");
+ if (obj) {
+ alpha = atof(pdf_string_value(obj));
+ if (alpha < 0.0 || alpha > 1.0) {
+ spc_warn(spe, "Invalid opacity value: %s", pdf_string_value(obj));
+ alpha = 1.0;
+ }
+ }
+#endif /* ENABLE_HTML_SVG_OPCAITY */
+
+#ifdef ENABLE_HTML_SVG_TRANSFORM
+ obj = pdf_lookup_dict(attr, "svg:transform");
+ if (obj) {
+ char *p = (char *) pdf_string_value(obj);
+ pdf_tmatrix N;
+ for ( ; *p && isspace(*p); p++);
+ while (*p && !error) {
+ pdf_setmatrix(&N, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
+ error = cvt_a_to_tmatrix(&N, p, &p);
+ if (!error) {
+ N.f = -N.f;
+ pdf_concatmatrix(&M, &N);
+ for ( ; *p && isspace(*p); p++);
+ if (*p == ',')
+ for (++p; *p && isspace(*p); p++);
+ }
+ }
+ }
+#endif /* ENABLE_HTML_SVG_TRANSFORM */
+
+ if (error) {
+ spc_warn(spe, "Error in html \"img\" tag attribute.");
+ return error;
+ }
+
+ id = pdf_ximage_findresource(pdf_string_value(src), 0, 0);
+ if (id < 0) {
+ spc_warn(spe, "Could not find/load image: %s", pdf_string_value(src));
+ error = -1;
+ } else {
+#if defined(ENABLE_HTML_SVG_TRANSFORM) || defined(ENABLE_HTML_SVG_OPACITY)
+ {
+ char *res_name;
+ pdf_rect r;
+
+ graphics_mode();
+
+ pdf_dev_gsave();
+
+#ifdef ENABLE_HTML_SVG_OPACITY
+ {
+ pdf_obj *dict;
+ int a = round(100.0 * alpha);
+ if (a != 0) {
+ res_name = NEW(strlen("_Tps_a100_") + 1, char);
+ sprintf(res_name, "_Tps_a%03d_", a); /* Not Tps prefix but... */
+ if (!check_resourcestatus("ExtGState", res_name)) {
+ dict = create_xgstate(round_at(0.01 * a, 0.01), 0);
+ pdf_doc_add_page_resource("ExtGState",
+ res_name, pdf_ref_obj(dict));
+ pdf_release_obj(dict);
+ }
+ pdf_doc_add_page_content(" /", 2);
+ pdf_doc_add_page_content(res_name, strlen(res_name));
+ pdf_doc_add_page_content(" gs", 3);
+ RELEASE(res_name);
+ }
+ }
+#endif /* ENABLE_HTML_SVG_OPACITY */
+
+ pdf_dev_concat(&M);
+
+ pdf_ximage_scale_image(id, &M, &r, &ti);
+ pdf_dev_concat(&M);
+
+ pdf_dev_rectclip(r.llx, r.lly, r.urx - r.llx, r.ury - r.lly);
+
+ res_name = pdf_ximage_get_resname(id);
+ pdf_doc_add_page_content(" /", 2);
+ pdf_doc_add_page_content(res_name, strlen(res_name));
+ pdf_doc_add_page_content(" Do", 3);
+
+ pdf_dev_grestore();
+
+ pdf_doc_add_page_resource("XObject",
+ res_name,
+ pdf_ximage_get_reference(id));
+ }
+#else
+ pdf_dev_put_image(id, &ti, spe->x_user, spe->y_user);
+#endif /* ENABLE_HTML_SVG_XXX */
+ }
+
+ return error;
+}
+#else
+static int
+spc_html__img_empty (struct spc_env *spe, pdf_obj *attr, struct spc_html_ *sd)
+{
+ spc_warn(spe, "IMG tag not yet supported yet...");
+ return -1;
+}
+#endif /* ENABLE_HTML_IMG_SUPPORT */
+
+
+static int
+spc_handler_html_default (struct spc_env *spe, struct spc_arg *ap)
+{
+ struct spc_html_ *sd = &_html_state;
+ char name[HTML_TAG_NAME_MAX + 1];
+ pdf_obj *attr;
+ int error = 0, type = HTML_TAG_TYPE_OPEN;
+
+ if (ap->curptr >= ap->endptr)
+ return 0;
+
+ attr = pdf_new_dict();
+ error = read_html_tag(name, attr, &type, &ap->curptr, ap->endptr);
+ if (error) {
+ pdf_release_obj(attr);
+ return error;
+ }
+ if (!strcmp(name, "a")) {
+ switch (type) {
+ case HTML_TAG_TYPE_OPEN:
+ error = spc_html__anchor_open (spe, attr, sd);
+ break;
+ case HTML_TAG_TYPE_CLOSE:
+ error = spc_html__anchor_close(spe, attr, sd);
+ break;
+ default:
+ spc_warn(spe, "Empty html anchor tag???");
+ error = -1;
+ break;
+ }
+ } else if (!strcmp(name, "base")) {
+ if (type == HTML_TAG_TYPE_CLOSE) {
+ spc_warn(spe, "Close tag for \"base\"???");
+ error = -1;
+ } else { /* treat "open" same as "empty" */
+ error = spc_html__base_empty(spe, attr, sd);
+ }
+ } else if (!strcmp(name, "img")) {
+ if (type == HTML_TAG_TYPE_CLOSE) {
+ spc_warn(spe, "Close tag for \"img\"???");
+ error = -1;
+ } else { /* treat "open" same as "empty" */
+ error = spc_html__img_empty(spe, attr, sd);
+ }
+ }
+ pdf_release_obj(attr);
+
+ for ( ; ap->curptr < ap->endptr && isspace(ap->curptr[0]); ap->curptr++);
+
+ return error;
+}
+
+
+#ifdef ENABLE_HTML_SVG_TRANSFORM
+/* translate wsp* '(' wsp* number (comma-wsp number)? wsp* ')' */
+static int
+cvt_a_to_tmatrix (pdf_tmatrix *M, const char *ptr, char **nextptr)
+{
+ char *q, *p = (char *) ptr;
+ int n;
+ double v[6];
+ static const char *_tkeys[] = {
+#define K_TRNS__MATRIX 0
+ "matrix", /* a b c d e f */
+#define K_TRNS__TRANSLATE 1
+ "translate", /* tx [ty] : dflt. tf = 0 */
+#define K_TRNS__SCALE 2
+ "scale", /* sx [sy] : dflt. sy = sx */
+#define K_TRNS__ROTATE 3
+ "rotate", /* ang [cx cy] : dflt. cx, cy = 0 */
+#define K_TRNS__SKEWX 4
+#define K_TRNS__SKEWY 5
+ "skewX", /* ang */
+ "skewY", /* ang */
+ NULL
+ };
+ int k;
+
+ for ( ; *p && isspace(*p); p++);
+
+ q = parse_c_ident(&p, p + strlen(p));
+ if (!q)
+ return -1;
+ /* parsed transformation key */
+ for (k = 0; _tkeys[k] && strcmp(q, _tkeys[k]); k++);
+ RELEASE(q);
+
+ /* handle args */
+ for ( ; *p && isspace(*p); p++);
+ if (*p != '(' || *(p + 1) == 0)
+ return -1;
+ for (++p; *p && isspace(*p); p++);
+ for (n = 0; n < 6 && *p && *p != ')'; n++) {
+ q = parse_float_decimal(&p, p + strlen(p));
+ if (!q)
+ break;
+ else {
+ v[n] = atof(q);
+ if (*p == ',')
+ p++;
+ for ( ; *p && isspace(*p); p++);
+ if (*p == ',')
+ for (++p; *p && isspace(*p); p++);
+ RELEASE(q);
+ }
+ }
+ if (*p != ')')
+ return -1;
+ p++;
+
+ switch (k) {
+ case K_TRNS__MATRIX:
+ if (n != 6)
+ return -1;
+ M->a = v[0]; M->c = v[1];
+ M->b = v[2]; M->d = v[3];
+ M->e = v[4]; M->f = v[5];
+ break;
+ case K_TRNS__TRANSLATE:
+ if (n != 1 && n != 2)
+ return -1;
+ M->a = M->d = 1.0;
+ M->c = M->b = 0.0;
+ M->e = v[0]; M->f = (n == 2) ? v[1] : 0.0;
+ break;
+ case K_TRNS__SCALE:
+ if (n != 1 && n != 2)
+ return -1;
+ M->a = v[0]; M->d = (n == 2) ? v[1] : v[0];
+ M->c = M->b = 0.0;
+ M->e = M->f = 0.0;
+ break;
+ case K_TRNS__ROTATE:
+ if (n != 1 && n != 3)
+ return -1;
+ M->a = cos(v[0] * M_PI / 180.0);
+ M->c = sin(v[0] * M_PI / 180.0);
+ M->b = -M->c; M->d = M->a;
+ M->e = (n == 3) ? v[1] : 0.0;
+ M->f = (n == 3) ? v[2] : 0.0;
+ break;
+ case K_TRNS__SKEWX:
+ if (n != 1)
+ return -1;
+ M->a = M->d = 1.0;
+ M->c = 0.0;
+ M->b = tan(v[0] * M_PI / 180.0);
+ break;
+ case K_TRNS__SKEWY:
+ if (n != 1)
+ return -1;
+ M->a = M->d = 1.0;
+ M->c = tan(v[0] * M_PI / 180.0);
+ M->b = 0.0;
+ break;
+ }
+
+ if (nextptr)
+ *nextptr = p;
+ return 0;
+}
+#endif /* ENABLE_HTML_SVG_TRANSFORM */
+
+int
+spc_html_at_begin_document (void)
+{
+ struct spc_html_ *sd = &_html_state;
+ return spc_handler_html__init(NULL, NULL, sd);
+}
+
+int
+spc_html_at_begin_page (void)
+{
+ struct spc_html_ *sd = &_html_state;
+ return spc_handler_html__bophook(NULL, NULL, sd);
+}
+
+int
+spc_html_at_end_page (void)
+{
+ struct spc_html_ *sd = &_html_state;
+ return spc_handler_html__eophook(NULL, NULL, sd);
+}
+
+int
+spc_html_at_end_document (void)
+{
+ struct spc_html_ *sd = &_html_state;
+ return spc_handler_html__clean(NULL, NULL, sd);
+}
+
+
+int
+spc_html_check_special (const char *buffer, long size)
+{
+ char *p, *endptr;
+
+ p = (char *) buffer;
+ endptr = p + size;
+
+ for ( ; p < endptr && isspace(*p); p++);
+ size = (long) (endptr - p);
+ if (size >= strlen("html:") &&
+ !memcmp(p, "html:", strlen("html:"))) {
+ return 1;
+ }
+
+ return 0;
+}
+
+
+int
+spc_html_setup_handler (struct spc_handler *sph,
+ struct spc_env *spe, struct spc_arg *ap)
+{
+ ASSERT(sph && spe && ap);
+
+ for ( ; ap->curptr < ap->endptr && isspace(ap->curptr[0]); ap->curptr++);
+ if (ap->curptr + strlen("html:") > ap->endptr ||
+ memcmp(ap->curptr, "html:", strlen("html:"))) {
+ return -1;
+ }
+
+ ap->command = (char *) "";
+
+ sph->key = (char *) "html:";
+ sph->exec = &spc_handler_html_default;
+
+ ap->curptr += strlen("html:");
+ for ( ; ap->curptr < ap->endptr && isspace(ap->curptr[0]); ap->curptr++);
+
+ return 0;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_html.h b/Build/source/texk/xdvipdfmx/src/spc_html.h
new file mode 100644
index 00000000000..a6097f57de4
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_html.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_html.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_HTML_H_
+#define _SPC_HTML_H_
+
+#include "specials.h"
+
+extern int spc_html_at_begin_page (void);
+extern int spc_html_at_end_page (void);
+extern int spc_html_at_begin_document (void);
+extern int spc_html_at_end_document (void);
+
+extern int spc_html_check_special (const char *buffer, long size);
+extern int spc_html_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_HTML_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_misc.c b/Build/source/texk/xdvipdfmx/src/spc_misc.c
new file mode 100644
index 00000000000..a4b908eaac1
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_misc.c
@@ -0,0 +1,233 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_misc.c,v 1.6 2005/08/08 18:00:11 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "mfileio.h"
+
+#include "pdfparse.h"
+#include "pdfobj.h"
+
+#include "pdfcolor.h"
+#include "pdfdraw.h"
+#include "pdfximage.h"
+#include "pdfdev.h"
+
+#include "mpost.h"
+
+#include "specials.h"
+
+#include "spc_util.h"
+#include "spc_misc.h"
+
+int
+spc_misc_at_begin_page (void)
+{
+ return 0;
+}
+
+int spc_misc_at_end_page (void)
+{
+ return 0;
+}
+
+int
+spc_misc_at_begin_document (void)
+{
+ return 0;
+}
+
+int
+spc_misc_at_end_document (void)
+{
+ return 0;
+}
+
+static int
+spc_handler_postscriptbox (struct spc_env *spe, struct spc_arg *ap)
+{
+ int form_id, len;
+ transform_info ti;
+ char filename[256], *fullname;
+ char buf[512];
+ FILE *fp;
+
+ ASSERT(spe && ap);
+
+ if (ap->curptr >= ap->endptr) {
+ spc_warn(spe, "No width/height/filename given for postscriptbox special.");
+ return -1;
+ }
+
+ /* input is not NULL terminated */
+ len = (int) (ap->endptr - ap->curptr);
+ len = MIN(511, len);
+ memcpy(buf, ap->curptr, len);
+ buf[len] = '\0';
+
+ transform_info_clear(&ti);
+
+ spc_warn(spe, buf);
+ if (sscanf(buf, "{%lfpt}{%lfpt}{%255[^}]}",
+ &ti.width, &ti.height, filename) != 3) {
+ spc_warn(spe, "Syntax error in postscriptbox special?");
+ return -1;
+ }
+ ap->curptr = ap->endptr;
+
+ ti.width *= 72.0 / 72.27;
+ ti.height *= 72.0 / 72.27;
+
+ fullname = kpse_find_pict(filename);
+ if (!fullname) {
+ spc_warn(spe, "Image file \"%s\" not found.", filename);
+ return -1;
+ }
+
+ fp = MFOPEN(fullname, FOPEN_R_MODE);
+ if (!fp) {
+ spc_warn(spe, "Could not open image file: %s", fullname);
+ RELEASE(fullname);
+ return -1;
+ }
+ RELEASE(fullname);
+
+ ti.flags |= (INFO_HAS_WIDTH|INFO_HAS_HEIGHT);
+
+ for (;;) {
+ char *p = mfgets(buf, 512, fp);
+ if (!p)
+ break;
+ if (mps_scan_bbox(&p, p + strlen(p), &ti.bbox) >= 0) {
+ ti.flags |= INFO_HAS_USER_BBOX;
+ break;
+ }
+ }
+ MFCLOSE(fp);
+
+ form_id = pdf_ximage_findresource(filename, 0, 0);
+ if (form_id < 0) {
+ spc_warn(spe, "Failed to load image file: %s", filename);
+ return -1;
+ }
+
+ pdf_dev_put_image(form_id, &ti, spe->x_user, spe->y_user);
+
+ return 0;
+}
+
+static int
+spc_handler_null (struct spc_env *spe, struct spc_arg *args)
+{
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+static struct spc_handler misc_handlers[] = {
+ {"postscriptbox", spc_handler_postscriptbox},
+ {"landscape", spc_handler_null}, /* handled at bop */
+ {"papersize", spc_handler_null}, /* handled at bop */
+ {"src:", spc_handler_null}, /* simply ignore */
+ {"pos:", spc_handler_null}, /* simply ignore */
+ {"om:", spc_handler_null} /* simply ignore */
+};
+
+
+int
+spc_misc_check_special (const char *buffer, long size)
+{
+ char *p, *endptr;
+ int i;
+
+ p = (char *) buffer;
+ endptr = p + size;
+
+ skip_white(&p, endptr);
+ size = (long) (endptr - p);
+ for (i = 0;
+ i < sizeof(misc_handlers)/sizeof(struct spc_handler); i++) {
+ if (size >= strlen(misc_handlers[i].key) &&
+ !strncmp(p, misc_handlers[i].key,
+ strlen(misc_handlers[i].key))) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int
+spc_misc_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args)
+{
+ char *key;
+ int i, keylen;
+
+ ASSERT(handle && spe && args);
+
+ skip_white(&args->curptr, args->endptr);
+
+ key = args->curptr;
+ while (args->curptr < args->endptr &&
+ isalpha(args->curptr[0])) {
+ args->curptr++;
+ }
+
+ if (args->curptr < args->endptr &&
+ args->curptr[0] == ':') {
+ args->curptr++;
+ }
+
+ keylen = (int) (args->curptr - key);
+ if (keylen < 1) {
+ return -1;
+ }
+
+ for (i = 0;
+ i < sizeof(misc_handlers)/sizeof(struct spc_handler); i++) {
+ if (keylen == strlen(misc_handlers[i].key) &&
+ !strncmp(key, misc_handlers[i].key, keylen)) {
+
+ skip_white(&args->curptr, args->endptr);
+
+ args->command = (char *) misc_handlers[i].key;
+
+ handle->key = (char *) "???:";
+ handle->exec = misc_handlers[i].exec;
+
+ return 0;
+ }
+ }
+
+ return -1;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/spc_misc.h b/Build/source/texk/xdvipdfmx/src/spc_misc.h
new file mode 100644
index 00000000000..7ee654db7df
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_misc.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_misc.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_MISC_H_
+#define _SPC_MISC_H_
+
+#include "specials.h"
+
+extern int spc_misc_at_begin_page (void);
+extern int spc_misc_at_end_page (void);
+extern int spc_misc_at_begin_document (void);
+extern int spc_misc_at_end_document (void);
+
+extern int spc_misc_check_special (const char *buffer, long size);
+extern int spc_misc_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_MISC_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_pdfm.c b/Build/source/texk/xdvipdfmx/src/spc_pdfm.c
new file mode 100644
index 00000000000..755b15cbfb6
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_pdfm.c
@@ -0,0 +1,2032 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_pdfm.c,v 1.23 2005/08/24 01:25:51 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+
+#include "numbers.h"
+
+#include "fontmap.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+#include "pdfparse.h"
+
+#include "pdfdoc.h"
+
+#include "pdfximage.h"
+#include "pdfdraw.h"
+#include "pdfcolor.h"
+#include "pdfdev.h"
+
+#include "specials.h"
+
+#include "spc_util.h"
+#include "spc_pdfm.h"
+
+
+#define ENABLE_TOUNICODE 1
+
+
+/* PLEASE REMOVE THIS */
+struct resource_map {
+ int type;
+ int res_id;
+};
+
+#ifdef ENABLE_TOUNICODE
+struct tounicode {
+ int cmap_id;
+ int unescape_backslash;
+ pdf_obj *taintkeys; /* An array of PDF names. */
+};
+#endif /* ENABLE_TOUNICODE */
+
+struct spc_pdf_
+{
+ pdf_obj *annot_dict; /* pending annotation dict */
+ int lowest_level; /* current min level of outlines */
+ struct ht_table *resourcemap; /* see remark below (somewhere) */
+#ifdef ENABLE_TOUNICODE
+ struct tounicode cd; /* For to-UTF16-BE conversion :( */
+#endif /* ENABLE_TOUNICODE */
+};
+
+#if 1
+static struct spc_pdf_ _pdf_stat = {
+ NULL,
+ 255,
+ NULL,
+#ifdef ENABLE_TOUNICODE
+ { -1, 0, NULL }
+#endif /* ENABLE_TOUNICODE */
+};
+#endif
+
+/* PLEASE REMOVE THIS */
+static void
+hval_free (void *vp)
+{
+ RELEASE(vp);
+}
+
+
+static int
+addresource (struct spc_pdf_ *sd, const char *ident, int res_id)
+{
+ struct resource_map *r;
+
+ if (!ident || res_id < 0)
+ return -1;
+
+ r = NEW(1, struct resource_map);
+ r->type = 0; /* unused */
+ r->res_id = res_id;
+
+ ht_append_table(sd->resourcemap, ident, strlen(ident), r);
+ spc_push_object(ident, pdf_ximage_get_reference(res_id));
+
+ return 0;
+}
+
+static int
+findresource (struct spc_pdf_ *sd, const char *ident)
+{
+ struct resource_map *r;
+
+ if (!ident)
+ return -1;
+
+ r = ht_lookup_table(sd->resourcemap, ident, strlen(ident));
+
+ return (r ? r->res_id : -1);
+}
+
+
+static int
+spc_handler_pdfm__init (struct spc_env *spe, struct spc_arg *ap, void *dp)
+{
+ struct spc_pdf_ *sd = dp;
+#ifdef ENABLE_TOUNICODE
+ static const char *default_taintkeys[] = {
+ "Title", "Author", "Subject", "Keywords",
+ "Creator", "Producer", "Contents", "Subj",
+ "TU", "T", "TM", NULL /* EOD */
+ };
+ int i;
+#endif /* ENABLE_TOUNICODE */
+
+ sd->annot_dict = NULL;
+ sd->lowest_level = 255;
+ sd->resourcemap = NEW(1, struct ht_table);
+ ht_init_table(sd->resourcemap);
+
+#ifdef ENABLE_TOUNICODE
+ sd->cd.taintkeys = pdf_new_array();
+ for (i = 0; default_taintkeys[i] != NULL; i++) {
+ pdf_add_array(sd->cd.taintkeys,
+ pdf_new_name(default_taintkeys[i]));
+ }
+#endif /* ENABLE_TOUNICODE */
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm__clean (struct spc_env *spe, struct spc_arg *ap, void *dp)
+{
+ struct spc_pdf_ *sd = dp;
+
+ if (sd->annot_dict) {
+ WARN("Unbalanced bann and eann found.");
+ pdf_release_obj(sd->annot_dict);
+ }
+ sd->lowest_level = 255;
+ sd->annot_dict = NULL;
+ if (sd->resourcemap) {
+ ht_clear_table(sd->resourcemap, hval_free);
+ RELEASE(sd->resourcemap);
+ }
+ sd->resourcemap = NULL;
+
+#ifdef ENABLE_TOUNICODE
+ if (sd->cd.taintkeys)
+ pdf_release_obj(sd->cd.taintkeys);
+ sd->cd.taintkeys = NULL;
+#endif /* ENABLE_TOUNICODE */
+
+ return 0;
+}
+
+
+int
+spc_pdfm_at_begin_document (void)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ return spc_handler_pdfm__init(NULL, NULL, sd);
+}
+
+int
+spc_pdfm_at_end_document (void)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ return spc_handler_pdfm__clean(NULL, NULL, sd);
+}
+
+int
+spc_pdfm_at_begin_page (void)
+{
+ return 0;
+}
+
+int
+spc_pdfm_at_end_page (void)
+{
+ return 0;
+}
+
+
+/* Dvipdfm specials */
+static int
+spc_handler_pdfm_bop (struct spc_env *spe, struct spc_arg *args)
+{
+ if (args->curptr < args->endptr) {
+ pdf_doc_set_bop_content(args->curptr,
+ (long) (args->endptr - args->curptr));
+ }
+
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_eop (struct spc_env *spe, struct spc_arg *args)
+{
+ if (args->curptr < args->endptr) {
+ pdf_doc_set_eop_content(args->curptr,
+ (long) (args->endptr - args->curptr));
+ }
+
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+#define streamfiltered(o) \
+ (pdf_lookup_dict(pdf_stream_dict((o)), "Filter") ? 1 : 0)
+
+/* Why should we have this kind of things? */
+static int
+safeputresdent (pdf_obj *kp, pdf_obj *vp, void *dp)
+{
+ char *key;
+
+ ASSERT(kp && vp && dp);
+
+ key = pdf_name_value(kp);
+ if (pdf_lookup_dict(dp, key))
+ WARN("Object \"%s\" already defined in dict! (ignored)", key);
+ else {
+ pdf_add_dict(dp,
+ pdf_link_obj(kp), pdf_link_obj(vp));
+ }
+ return 0;
+}
+
+#ifndef pdf_obj_isaref
+#define pdf_obj_isaref(o) (pdf_obj_typeof((o)) == PDF_INDIRECT)
+#endif
+
+static int
+safeputresdict (pdf_obj *kp, pdf_obj *vp, void *dp)
+{
+ char *key;
+ pdf_obj *dict;
+
+ ASSERT(kp && vp && dp);
+
+ key = pdf_name_value(kp);
+ dict = pdf_lookup_dict(dp, key);
+
+ if (pdf_obj_isaref(vp)) {
+ if (dict) {
+#if 0
+ return E_INVALID_ACCESS;
+#endif
+ WARN("Replacing whole page/form resource dict entry \"%s\"...", key);
+ WARN("You might be creating a broken PDF document.");
+ }
+ pdf_add_dict(dp,
+ pdf_new_name(key), pdf_link_obj(vp));
+ } else if (pdf_obj_typeof(vp) == PDF_DICT) {
+ if (dict)
+ pdf_foreach_dict(vp, safeputresdent, dict);
+ else {
+ pdf_add_dict(dp,
+ pdf_new_name(key), pdf_link_obj(vp));
+ }
+ } else {
+ WARN("Invalid type (not DICT) for page/form resource dict entry: key=\"%s\"", key);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/* Think what happens if you do
+ *
+ * pdf:put @resources << /Font << >> >>
+ *
+ */
+static int
+spc_handler_pdfm_put (struct spc_env *spe, struct spc_arg *ap)
+{
+ pdf_obj *obj1, *obj2; /* put obj2 into obj1 */
+ char *ident;
+ int error = 0;
+
+ skip_white(&ap->curptr, ap->endptr);
+
+ ident = parse_opt_ident(&ap->curptr, ap->endptr);
+ if (!ident) {
+ spc_warn(spe, "Missing object identifier.");
+ return -1;
+ }
+ obj1 = spc_lookup_object(ident);
+ if (!obj1) {
+ spc_warn(spe, "Specified object not exist: %s", ident);
+ RELEASE(ident);
+ return -1;
+ }
+ skip_white(&ap->curptr, ap->endptr);
+
+
+ obj2 = parse_pdf_object(&ap->curptr, ap->endptr);
+ if (!obj2) {
+ spc_warn(spe, "Missing (an) object(s) to put into \"%s\"!", ident);
+ RELEASE(ident);
+ return -1;
+ }
+
+ switch (pdf_obj_typeof(obj1)) {
+ case PDF_DICT:
+ if (pdf_obj_typeof(obj2) != PDF_DICT) {
+ spc_warn(spe, "Inconsistent object type for \"put\" (expecting DICT): %s", ident);
+ error = -1;
+ } else {
+ if (!strcmp(ident, "resources"))
+ error = pdf_foreach_dict(obj2, safeputresdict, obj1);
+ else {
+ pdf_merge_dict(obj1, obj2);
+ }
+ }
+ break;
+
+ case PDF_STREAM:
+ if (pdf_obj_typeof(obj2) == PDF_DICT)
+ pdf_merge_dict(pdf_stream_dict(obj1), obj2);
+ else if (pdf_obj_typeof(obj2) == PDF_STREAM)
+#if 0
+ {
+ pdf_merge_dict(pdf_stream_dict(obj1), pdf_stream_dict(obj2));
+ pdf_add_stream(obj1, pdf_stream_dataptr(obj2), pdf_stream_length(obj2));
+ }
+#else
+ {
+ spc_warn(spe, "\"put\" operation not supported for STREAM <- STREAM: %s", ident);
+ error = -1;
+ }
+#endif
+ else {
+ spc_warn(spe, "Invalid type: expecting a DICT or STREAM: %s", ident);
+ error = -1;
+ }
+ break;
+
+ case PDF_ARRAY:
+ /* dvipdfm */
+ pdf_add_array(obj1, pdf_link_obj(obj2));
+ while (ap->curptr < ap->endptr) {
+ pdf_obj *obj3 = parse_pdf_object(&ap->curptr, ap->endptr);
+ if (!obj3)
+ break;
+ pdf_add_array(obj1, obj3);
+ skip_white(&ap->curptr, ap->endptr);
+ }
+ break;
+
+ default:
+ spc_warn(spe, "Can't \"put\" object into non-DICT/STREAM/ARRAY type object: %s", ident);
+ error = -1;
+ break;
+ }
+ pdf_release_obj(obj2);
+
+
+ return error;
+}
+
+
+#ifdef ENABLE_TOUNICODE
+
+/* For pdf:tounicode support
+ * This feature is provided for convenience. TeX can't do
+ * input encoding conversion.
+ */
+#include "cmap.h"
+
+static int
+reencodestring (CMap *cmap, pdf_obj *instring)
+{
+#define WBUF_SIZE 4096
+ unsigned char wbuf[WBUF_SIZE];
+ unsigned char *obufcur;
+ unsigned char *inbufcur;
+ long inbufleft, obufleft;
+
+ if (!cmap || !instring)
+ return 0;
+
+ inbufleft = pdf_string_length(instring);
+ inbufcur = pdf_string_value (instring);
+
+ wbuf[0] = 0xfe;
+ wbuf[1] = 0xff;
+ obufcur = wbuf + 2;
+ obufleft = WBUF_SIZE - 2;
+
+ CMap_decode(cmap,
+ (const unsigned char **)&inbufcur, &inbufleft,
+ &obufcur, &obufleft);
+
+ if (inbufleft > 0) {
+ return -1;
+ }
+
+ pdf_set_string(instring, wbuf, WBUF_SIZE - obufleft);
+
+ return 0;
+}
+
+/* tables/values used in UTF-8 interpretation -
+ code is based on ConvertUTF.[ch] sample code
+ published by the Unicode consortium */
+static unsigned long
+offsetsFromUTF8[6] = {
+ 0x00000000UL,
+ 0x00003080UL,
+ 0x000E2080UL,
+ 0x03C82080UL,
+ 0xFA082080UL,
+ 0x82082080UL
+};
+
+static unsigned char
+bytesFromUTF8[256] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
+};
+
+static int
+maybe_reencode_utf8(pdf_obj *instring)
+{
+ unsigned char* inbuf;
+ int inlen;
+ int non_ascii = 0;
+ unsigned char* cp;
+ unsigned char* op;
+ unsigned char wbuf[WBUF_SIZE];
+
+ if (!instring)
+ return 0;
+
+ inlen = pdf_string_length(instring);
+ inbuf = pdf_string_value(instring);
+
+ /* check if the input string is strictly ASCII */
+ for (cp = inbuf; cp < inbuf + inlen; ++cp) {
+ if (*cp > 127) {
+ non_ascii = 1;
+ }
+ }
+ if (non_ascii == 0)
+ return 0; /* no need to reencode ASCII strings */
+
+ cp = inbuf;
+ op = wbuf;
+ *op++ = 0xfe;
+ *op++ = 0xff;
+ while (cp < inbuf + inlen) {
+ unsigned long usv = *cp++;
+ int extraBytes = bytesFromUTF8[usv];
+ if (cp + extraBytes > inbuf + inlen)
+ return -1; /* ill-formed, so give up reencoding */
+ switch (extraBytes) { /* note: code falls through cases! */
+ case 5: usv <<= 6; usv += *cp++;
+ case 4: usv <<= 6; usv += *cp++;
+ case 3: usv <<= 6; usv += *cp++;
+ case 2: usv <<= 6; usv += *cp++;
+ case 1: usv <<= 6; usv += *cp++;
+ case 0: ;
+ };
+ usv -= offsetsFromUTF8[extraBytes];
+ if (usv > 0x10FFFF)
+ return -1; /* out of valid Unicode range, give up */
+ if (usv > 0xFFFF) {
+ /* supplementary-plane character: generate high surrogate */
+ unsigned long hi = 0xdc00 + (usv - 0x10000) % 0x0400;
+ if (op > wbuf + WBUF_SIZE - 2)
+ return -1; /* out of space */
+ *op++ = hi / 256;
+ *op++ = hi % 256;
+ usv = 0xd800 + (usv - 0x10000) / 0x0400;
+ /* remaining value in usv is the low surrogate */
+ }
+ if (op > wbuf + WBUF_SIZE - 2)
+ return -1; /* out of space */
+ *op++ = usv / 256;
+ *op++ = usv % 256;
+ }
+
+ pdf_set_string(instring, wbuf, op - wbuf);
+ return 0;
+}
+
+static int
+needreencode (pdf_obj *kp, pdf_obj *vp, struct tounicode *cd)
+{
+ int r = 0, i;
+ pdf_obj *tk;
+
+ ASSERT( cd && cd->taintkeys );
+ ASSERT( pdf_obj_typeof(kp) == PDF_NAME );
+ ASSERT( pdf_obj_typeof(vp) == PDF_STRING );
+
+ for (i = 0; i < pdf_array_length(cd->taintkeys); i++) {
+ tk = pdf_get_array(cd->taintkeys, i);
+ ASSERT( tk && pdf_obj_typeof(tk) == PDF_NAME );
+ if (!strcmp(pdf_name_value(kp), pdf_name_value(tk))) {
+ r = 1;
+ break;
+ }
+ }
+ if (r) {
+ /* Check UTF-16BE BOM. */
+ if (pdf_string_length(vp) >= 2 &&
+ !memcmp(pdf_string_value(vp), "\xfe\xff", 2))
+ r = 0;
+ }
+
+ return r;
+}
+
+static int modstrings (pdf_obj *key, pdf_obj *value, void *pdata);
+
+static int
+modstrings (pdf_obj *kp, pdf_obj *vp, void *dp)
+{
+ int r = 0; /* continue */
+
+ ASSERT( pdf_obj_typeof(kp) == PDF_NAME );
+
+ switch (pdf_obj_typeof(vp)) {
+ case PDF_STRING:
+ {
+ CMap *cmap;
+ struct tounicode *cd = dp;
+ if (cd && cd->cmap_id >= 0 && cd->taintkeys) {
+ cmap = CMap_cache_get(cd->cmap_id);
+ if (needreencode(kp, vp, cd)) {
+ r = reencodestring(cmap, vp);
+ }
+ }
+ else {
+ r = maybe_reencode_utf8(vp);
+ }
+ if (r < 0) /* error occured... */
+ WARN("Failed to convert input string to UTF16...");
+ }
+ break;
+ case PDF_DICT:
+ r = pdf_foreach_dict(vp, modstrings, dp);
+ break;
+ case PDF_STREAM:
+ r = pdf_foreach_dict(pdf_stream_dict(vp), modstrings, dp);
+ break;
+ }
+
+ return r;
+}
+
+static pdf_obj *
+my_parse_pdf_dict (char **pp, char *endptr, struct tounicode *cd)
+{
+ pdf_obj *dict;
+
+#if 0
+/* disable this test, as we do utf8 reencoding with no cmap */
+ if (cd->cmap_id < 0)
+ return parse_pdf_dict(pp, endptr);
+#endif
+
+ /* :( */
+ if (cd && cd->unescape_backslash)
+ dict = parse_pdf_tainted_dict(pp, endptr);
+ else {
+ dict = parse_pdf_dict(pp, endptr);
+ }
+ if (dict)
+ pdf_foreach_dict(dict, modstrings, cd);
+
+ return dict;
+}
+
+#endif /* ENABLE_TOUNICODE */
+
+
+static int
+spc_handler_pdfm_annot (struct spc_env *spe, struct spc_arg *args)
+{
+#ifdef ENABLE_TOUNICODE
+ struct spc_pdf_ *sd = &_pdf_stat;
+#endif /* ENABLE_TOUNICODE */
+ pdf_obj *annot_dict;
+ pdf_rect rect;
+ char *ident = NULL;
+ pdf_coord cp;
+ transform_info ti;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr[0] == '@') {
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ skip_white(&args->curptr, args->endptr);
+ }
+
+ transform_info_clear(&ti);
+ if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (ident)
+ RELEASE(ident);
+ return -1;
+ }
+
+ if ((ti.flags & INFO_HAS_USER_BBOX) &&
+ ((ti.flags & INFO_HAS_WIDTH) || (ti.flags & INFO_HAS_HEIGHT))) {
+ spc_warn(spe, "You can't specify both bbox and width/height.");
+ if (ident)
+ RELEASE(ident);
+ return -1;
+ }
+
+#ifdef ENABLE_TOUNICODE
+ annot_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ annot_dict = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!annot_dict) {
+ spc_warn(spe, "Could not find dictionary object.");
+ if (ident)
+ RELEASE(ident);
+ return -1;
+ } else if (!PDF_OBJ_DICTTYPE(annot_dict)) {
+ spc_warn(spe, "Invalid type: not dictionary object.");
+ if (ident)
+ RELEASE(ident);
+ pdf_release_obj(annot_dict);
+ 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 = rect.llx + spe->mag * ti.width;
+ rect.ury = rect.lly + spe->mag * ti.height;
+ }
+
+ /* Order is important... */
+ if (ident)
+ spc_push_object(ident, pdf_link_obj(annot_dict));
+ /* This add reference. */
+ pdf_doc_add_annot(pdf_doc_current_page_number(), &rect, annot_dict);
+
+ if (ident) {
+ spc_flush_object(ident);
+ RELEASE(ident);
+ }
+ pdf_release_obj(annot_dict);
+
+ return 0;
+}
+
+/* NOTE: This can't have ident. See "Dvipdfm User's Manual". */
+static int
+spc_handler_pdfm_bann (struct spc_env *spe, struct spc_arg *args)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ int error = 0;
+
+ if (sd->annot_dict) {
+ spc_warn(spe, "Can't begin an annotation when one is pending.");
+ return -1;
+ }
+
+ skip_white(&args->curptr, args->endptr);
+
+#ifdef ENABLE_TOUNICODE
+ sd->annot_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ sd->annot_dict = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!sd->annot_dict) {
+ spc_warn(spe, "Ignoring annotation with invalid dictionary.");
+ return -1;
+ } else if (!PDF_OBJ_DICTTYPE(sd->annot_dict)) {
+ spc_warn(spe, "Invalid type: not a dictionary object.");
+ pdf_release_obj(sd->annot_dict);
+ sd->annot_dict = NULL;
+ return -1;
+ }
+
+ error = spc_begin_annot(spe, sd->annot_dict);
+
+ return error;
+}
+
+static int
+spc_handler_pdfm_eann (struct spc_env *spe, struct spc_arg *args)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ int error = 0;
+
+ if (!sd->annot_dict) {
+ spc_warn(spe, "Tried to end an annotation without starting one!");
+ return -1;
+ }
+
+ error = spc_end_annot(spe);
+
+ pdf_release_obj(sd->annot_dict);
+ sd->annot_dict = NULL;
+
+ return error;
+}
+
+
+/* Color:.... */
+static int
+spc_handler_pdfm_bcolor (struct spc_env *spe, struct spc_arg *ap)
+{
+ int error;
+ pdf_color fc, sc;
+
+ error = spc_util_read_colorspec(spe, &fc, ap, 0);
+ if (!error) {
+ if (ap->curptr < ap->endptr) {
+ error = spc_util_read_colorspec(spe, &sc, ap, 0);
+ } else {
+ pdf_color_copycolor(&sc, &fc);
+ }
+ }
+
+ if (error)
+ spc_warn(spe, "Invalid color specification?");
+ else {
+ pdf_color_push(); /* save currentcolor */
+ pdf_dev_setcolor(&fc, 1);
+ pdf_dev_setcolor(&sc, 0);
+ }
+
+ return error;
+}
+
+/* Different than "color rgb 1 0 0" ? */
+static int
+spc_handler_pdfm_scolor (struct spc_env *spe, struct spc_arg *ap)
+{
+ int error;
+ pdf_color fc, sc;
+
+ error = spc_util_read_colorspec(spe, &fc, ap, 0);
+ if (!error) {
+ if (ap->curptr < ap->endptr) {
+ error = spc_util_read_colorspec(spe, &sc, ap, 0);
+ } else {
+ pdf_color_copycolor(&sc, &fc);
+ }
+ }
+
+ if (error)
+ spc_warn(spe, "Invalid color specification?");
+ else {
+ pdf_color_set_default(&fc); /* ????? */
+ pdf_dev_setcolor(&fc, 1);
+ pdf_dev_setcolor(&sc, 0);
+ }
+
+ return error;
+}
+
+static int
+spc_handler_pdfm_ecolor (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_color_pop();
+ return 0;
+}
+
+
+static int
+spc_handler_pdfm_btrans (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_tmatrix M;
+ transform_info ti;
+
+ transform_info_clear(&ti);
+ if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ return -1;
+ }
+
+ /* Create transformation matrix */
+ pdf_copymatrix(&M, &(ti.matrix));
+ M.e += ((1.0 - M.a) * spe->x_user - M.c * spe->y_user);
+ M.f += ((1.0 - M.d) * spe->y_user - M.b * spe->x_user);
+
+ pdf_dev_gsave();
+ pdf_dev_concat(&M);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_etrans (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_dev_grestore();
+
+ /*
+ * Unfortunately, the following line is necessary in case
+ * of a font or color change inside of the save/restore pair.
+ * Anything that was done there must be redone, so in effect,
+ * we make no assumptions about what fonts. We act like we are
+ * starting a new page.
+ */
+ pdf_dev_reset();
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_outline (struct spc_env *spe, struct spc_arg *args)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ pdf_obj *item_dict, *tmp;
+ int level;
+ int current_depth;
+
+ skip_white(&args->curptr, args->endptr);
+
+ tmp = parse_pdf_object(&args->curptr, args->endptr);
+ if (!tmp) {
+ spc_warn(spe, "Missing number for outline item depth.");
+ return -1;
+ } else if (!PDF_OBJ_NUMBERTYPE(tmp)) {
+ pdf_release_obj(tmp);
+ spc_warn(spe, "Expecting number for outline item depth.");
+ return -1;
+ }
+
+ item_dict = NULL;
+
+ level = (int) pdf_number_value(tmp);
+ pdf_release_obj(tmp);
+
+ /* What is this? Starting at level 3 and can go down to level 1?
+ *
+ * Here is the original comment:
+ * Make sure we know where the starting level is
+ *
+ * NOTE: added
+ * We need this for converting pages from 3rd to... :(
+ */
+ sd->lowest_level = MIN(sd->lowest_level, level);
+
+ level += 1 - sd->lowest_level;
+
+#ifdef ENABLE_TOUNICODE
+ item_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ item_dict = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!item_dict) {
+ spc_warn(spe, "Ignoring invalid dictionary.");
+ return -1;
+ }
+ current_depth = pdf_doc_bookmarks_depth();
+ if (current_depth > level) {
+ while (current_depth-- > level)
+ pdf_doc_bookmarks_up();
+ } else if (current_depth < level) {
+ while (current_depth++ < level)
+ pdf_doc_bookmarks_down();
+ }
+
+ pdf_doc_bookmarks_add(item_dict, -1); /* Use global setting for open/close */
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_article (struct spc_env *spe, struct spc_arg *args)
+{
+#ifdef ENABLE_TOUNICODE
+ struct spc_pdf_ *sd = &_pdf_stat;
+#endif /* ENABLE_TOUNICODE */
+ char *ident;
+ pdf_obj *info_dict;
+
+ skip_white (&args->curptr, args->endptr);
+
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ if (!ident) {
+ spc_warn(spe, "Article name expected but not found.");
+ return -1;
+ }
+
+#ifdef ENABLE_TOUNICODE
+ info_dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ info_dict = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!info_dict) {
+ RELEASE(ident);
+ spc_warn(spe, "Ignoring article with invalid info dictionary.");
+ return -1;
+ }
+
+ pdf_doc_begin_article(ident, pdf_link_obj(info_dict));
+ spc_push_object(ident, info_dict);
+ RELEASE(ident);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_bead (struct spc_env *spe, struct spc_arg *args)
+{
+#ifdef ENABLE_TOUNICODE
+ struct spc_pdf_ *sd = &_pdf_stat;
+#endif /* ENABLE_TOUNICODE */
+ pdf_obj *article;
+ pdf_obj *article_info;
+ char *article_name;
+ pdf_rect rect;
+ long page_no;
+ transform_info ti;
+ pdf_coord cp;
+
+ skip_white(&args->curptr, args->endptr);
+
+ if (args->curptr[0] != '@') {
+ spc_warn(spe, "Article identifier expected but not found.");
+ return -1;
+ }
+
+ article_name = parse_opt_ident(&args->curptr, args->endptr);
+ if (!article_name) {
+ spc_warn(spe, "Article reference expected but not found.");
+ return -1;
+ }
+
+ /* If okay so far, try to get a bounding box */
+ transform_info_clear(&ti);
+ if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ RELEASE(article_name);
+ return -1;
+ }
+
+ if ((ti.flags & INFO_HAS_USER_BBOX) &&
+ ((ti.flags & INFO_HAS_WIDTH) || (ti.flags & INFO_HAS_HEIGHT))) {
+ spc_warn(spe, "You can't specify both bbox and width/height.");
+ RELEASE(article_name);
+ 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 = rect.llx + spe->mag * ti.width;
+ rect.ury = rect.lly + spe->mag * ti.height;
+ }
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr[0] != '<') {
+ article_info = pdf_new_dict();
+ } else {
+#ifdef ENABLE_TOUNICODE
+ article_info = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ article_info = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!article_info) {
+ spc_warn(spe, "Error in reading dictionary.");
+ RELEASE(article_name);
+ return -1;
+ }
+ }
+
+ /* Does this article exist yet */
+ article = spc_lookup_object(article_name);
+ if (article) {
+ pdf_merge_dict (article, article_info);
+ pdf_release_obj(article_info);
+ } else {
+ pdf_doc_begin_article(article_name, pdf_link_obj(article_info));
+ spc_push_object(article_name, article_info);
+ }
+ page_no = pdf_doc_current_page_number();
+ pdf_doc_add_bead(article_name, NULL, page_no, &rect);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_image (struct spc_env *spe, struct spc_arg *args)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ int xobj_id;
+ char *ident = NULL;
+ pdf_obj *fspec;
+ transform_info ti;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr[0] == '@') {
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ xobj_id = findresource(sd, ident);
+ if (xobj_id >= 0) {
+ spc_warn(spe, "Object reference name for image \"%s\" already used.", ident);
+ RELEASE(ident);
+ return -1;
+ }
+ }
+
+ transform_info_clear(&ti);
+ if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ if (ident)
+ RELEASE(ident);
+ return -1;
+ }
+
+ skip_white(&args->curptr, args->endptr);
+ fspec = parse_pdf_object(&args->curptr, args->endptr);
+ if (!fspec) {
+ spc_warn(spe, "Missing filename string for pdf:image.");
+ if (ident)
+ RELEASE(ident);
+ return -1;
+ } else if (!PDF_OBJ_STRINGTYPE(fspec)) {
+ spc_warn(spe, "Missing filename string for pdf:image.");
+ pdf_release_obj(fspec);
+ return -1;
+ }
+
+ xobj_id = pdf_ximage_findresource(pdf_string_value(fspec), 0, 0);
+ if (xobj_id < 0) {
+ spc_warn(spe, "Could not find image resource...");
+ pdf_release_obj(fspec);
+ if (ident)
+ RELEASE(ident);
+ return -1;
+ }
+
+ pdf_dev_put_image(xobj_id, &ti, spe->x_user, spe->y_user);
+
+ if (ident) {
+ addresource(sd, ident, xobj_id);
+ RELEASE(ident);
+ }
+
+ pdf_release_obj(fspec);
+
+ return 0;
+}
+
+/* Use do_names instead. */
+static int
+spc_handler_pdfm_dest (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_obj *name, *array;
+ int error = 0;
+
+ skip_white(&args->curptr, args->endptr);
+
+ name = parse_pdf_object(&args->curptr, args->endptr);
+ if (!name) {
+ spc_warn(spe, "PDF string expected for destination name but not found.");
+ return -1;
+ } else if (!PDF_OBJ_STRINGTYPE(name)) {
+ spc_warn(spe, "PDF string expected for destination name but not found.");
+ pdf_release_obj(name);
+ return -1;
+ }
+
+ array = parse_pdf_object(&args->curptr, args->endptr);
+ if (!array) {
+ spc_warn(spe, "No destination not specified for pdf:dest.");
+ pdf_release_obj(name);
+ return -1;
+ } else if (!PDF_OBJ_ARRAYTYPE(array)) {
+ spc_warn(spe, "Destination not specified as an array object!");
+ pdf_release_obj(name);
+ pdf_release_obj(array);
+ return -1;
+ }
+
+ error = pdf_doc_add_names("Dests",
+ pdf_string_value (name),
+ pdf_string_length(name),
+ array);
+ pdf_release_obj(name);
+
+ if (error)
+ spc_warn(spe, "Could not add Dests name tree entry...");
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_names (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_obj *category, *key, *value, *tmp;
+ int i, size;
+
+ category = parse_pdf_object(&args->curptr, args->endptr);
+ if (!category) {
+ spc_warn(spe, "PDF name expected but not found.");
+ return -1;
+ } else if (!PDF_OBJ_NAMETYPE(category)) {
+ spc_warn(spe, "PDF name expected but not found.");
+ pdf_release_obj(category);
+ return -1;
+ }
+
+ tmp = parse_pdf_object(&args->curptr, args->endptr);
+ if (!tmp) {
+ spc_warn(spe, "PDF object expected but not found.");
+ pdf_release_obj(category);
+ return -1;
+ } else if (PDF_OBJ_ARRAYTYPE(tmp)) {
+ size = pdf_array_length(tmp);
+ if (size % 2 != 0) {
+ spc_warn(spe, "Array size not multiple of 2 for pdf:names.");
+ pdf_release_obj(category);
+ pdf_release_obj(tmp);
+ return -1;
+ }
+
+ for (i = 0; i < size / 2; i++) {
+ key = pdf_get_array(tmp, 2 * i);
+ value = pdf_get_array(tmp, 2 * i + 1);
+ if (!PDF_OBJ_STRINGTYPE(key)) {
+ spc_warn(spe, "Name tree key must be string.");
+ pdf_release_obj(category);
+ pdf_release_obj(tmp);
+ return -1;
+ } else if (pdf_doc_add_names(pdf_name_value(category),
+ pdf_string_value (key),
+ pdf_string_length(key),
+ pdf_link_obj(value)) < 0) {
+ spc_warn(spe, "Failed to add Name tree entry...");
+ pdf_release_obj(category);
+ pdf_release_obj(tmp);
+ return -1;
+ }
+ }
+ pdf_release_obj(tmp);
+ } else if (PDF_OBJ_STRINGTYPE(tmp)) {
+ key = tmp;
+ value = parse_pdf_object(&args->curptr, args->endptr);
+ if (!value) {
+ pdf_release_obj(category);
+ pdf_release_obj(key);
+ spc_warn(spe, "PDF object expected but not found.");
+ return -1;
+ }
+ if (pdf_doc_add_names(pdf_name_value(category),
+ pdf_string_value (key),
+ pdf_string_length(key),
+ value) < 0) {
+ spc_warn(spe, "Failed to add Name tree entry...");
+ pdf_release_obj(category);
+ pdf_release_obj(key);
+ return -1;
+ }
+ pdf_release_obj(key);
+ } else {
+ pdf_release_obj(tmp);
+ pdf_release_obj(category);
+ spc_warn(spe, "Invalid object type for pdf:names.");
+ return -1;
+ }
+ pdf_release_obj(category);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_docinfo (struct spc_env *spe, struct spc_arg *args)
+{
+#ifdef ENABLE_TOUNICODE
+ struct spc_pdf_ *sd = &_pdf_stat;
+#endif /* ENABLE_TOUNICODE */
+ pdf_obj *docinfo, *dict;
+
+#ifdef ENABLE_TOUNICODE
+ dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ dict = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!dict) {
+ spc_warn(spe, "Dictionary object expected but not found.");
+ return -1;
+ }
+
+ docinfo = pdf_doc_docinfo();
+ pdf_merge_dict(docinfo, dict);
+ pdf_release_obj(dict);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_docview (struct spc_env *spe, struct spc_arg *args)
+{
+#ifdef ENABLE_TOUNICODE
+ struct spc_pdf_ *sd = &_pdf_stat;
+#endif /* ENABLE_TOUNICODE */
+ pdf_obj *catalog, *dict;
+ pdf_obj *pref_old, *pref_add;
+
+#ifdef ENABLE_TOUNICODE
+ dict = my_parse_pdf_dict(&args->curptr, args->endptr, &sd->cd);
+#else
+ dict = parse_pdf_dict(&args->curptr, args->endptr);
+#endif /* ENABLE_TOUNICODE */
+ if (!dict) {
+ spc_warn(spe, "Dictionary object expected but not found.");
+ return -1;
+ }
+
+ catalog = pdf_doc_catalog();
+ /* Avoid overriding whole ViewerPreferences */
+ pref_old = pdf_lookup_dict(catalog, "ViewerPreferences");
+ pref_add = pdf_lookup_dict(dict, "ViewerPreferences");
+ if (pref_old && pref_add) {
+ pdf_merge_dict (pref_old, pref_add);
+ pdf_remove_dict(dict, "ViewerPreferences");
+ }
+ pdf_merge_dict (catalog, dict);
+ pdf_release_obj(dict);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_close (struct spc_env *spe, struct spc_arg *args)
+{
+ char *ident;
+
+ skip_white(&args->curptr, args->endptr);
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ if (ident) {
+ spc_flush_object(ident);
+ RELEASE(ident);
+ } else { /* Close all? */
+ spc_clear_objects();
+ }
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_object (struct spc_env *spe, struct spc_arg *args)
+{
+ char *ident;
+ pdf_obj *object;
+
+ skip_white(&args->curptr, args->endptr);
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ if (!ident) {
+ spc_warn(spe, "Could not find a object identifier.");
+ return -1;
+ }
+
+ object = parse_pdf_object(&args->curptr, args->endptr);
+ if (!object) {
+ RELEASE(ident);
+ spc_warn(spe, "Could not find an object definition for \"%s\".", ident);
+ return -1;
+ } else {
+ spc_push_object(ident, object);
+ }
+ RELEASE(ident);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_content (struct spc_env *spe, struct spc_arg *args)
+{
+ long len = 0;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr < args->endptr) {
+ pdf_tmatrix M;
+
+ pdf_setmatrix(&M, 1.0, 0.0, 0.0, 1.0, spe->x_user, spe->y_user);
+ work_buffer[len++] = ' ';
+ work_buffer[len++] = 'q';
+ work_buffer[len++] = ' ';
+ len += pdf_sprint_matrix(work_buffer + len, &M);
+ work_buffer[len++] = ' ';
+ work_buffer[len++] = 'c';
+ work_buffer[len++] = 'm';
+ work_buffer[len++] = ' ';
+
+ pdf_doc_add_page_content(work_buffer, len);
+ len = (long) (args->endptr - args->curptr);
+ pdf_doc_add_page_content(args->curptr, len);
+ pdf_doc_add_page_content(" Q", 2);
+ }
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_literal (struct spc_env *spe, struct spc_arg *args)
+{
+ int direct = 0;
+ long len;
+
+ skip_white(&args->curptr, args->endptr);
+ while (args->curptr < args->endptr) {
+ if (args->curptr + 7 <= args->endptr &&
+ !strncmp(args->curptr, "reverse", 7)) {
+ args->curptr += 7;
+ WARN("The special \"pdf:literal reverse ...\" is no longer supported.\nIgnore the \"reverse\" option.");
+ } else if (args->curptr + 6 <= args->endptr &&
+ !strncmp(args->curptr, "direct", 6)) {
+ direct = 1;
+ args->curptr += 6;
+ } else {
+ break;
+ }
+ skip_white(&args->curptr, args->endptr);
+ }
+
+ if (args->curptr < args->endptr) {
+ pdf_tmatrix M;
+ M.a = M.d = 1.0; M.b = M.c = 0.0;
+ if (!direct) {
+ M.e = spe->x_user; M.f = spe->y_user;
+ pdf_dev_concat(&M);
+ }
+ pdf_doc_add_page_content(" ", 1);
+ pdf_doc_add_page_content(args->curptr, (long) (args->endptr - args->curptr));
+ if (!direct) {
+ M.e = -spe->x_user; M.f = -spe->y_user;
+ pdf_dev_concat(&M);
+ }
+ }
+
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+/*
+ * FSTREAM: Create a PDF stream object from an existing file.
+ *
+ * pdf: fstream @objname (filename) [PDF_DICT]
+ */
+static int
+spc_handler_pdfm_fstream (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_obj *fstream;
+ long stream_len, nb_read;
+ char *ident, *filename, *fullname;
+ pdf_obj *tmp;
+ FILE *fp;
+
+ skip_white(&args->curptr, args->endptr);
+
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ if (!ident) {
+ spc_warn(spe, "Missing objname string for pdf:fstream.");
+ return -1;
+ }
+
+ skip_white(&args->curptr, args->endptr);
+
+ tmp = parse_pdf_object(&args->curptr, args->endptr);
+ if (!tmp) {
+ spc_warn(spe, "Missing filename string for pdf:fstream.");
+ RELEASE(ident);
+ return -1;
+ } else if (!PDF_OBJ_STRINGTYPE(tmp)) {
+ spc_warn(spe, "Missing filename string for pdf:fstream.");
+ pdf_release_obj(tmp);
+ RELEASE(ident);
+ return -1;
+ }
+
+ filename = pdf_string_value(tmp);
+ if (!filename) {
+ spc_warn(spe, "Missing filename string for pdf:fstream.");
+ pdf_release_obj(tmp);
+ RELEASE(ident);
+ return -1;
+ }
+
+ fstream = pdf_new_stream(STREAM_COMPRESS);
+
+#ifdef MIKTEX
+ if (!miktex_find_app_input_file("dvipdfm", filename, work_buffer))
+ fullname = NULL;
+ else {
+ fullname = work_buffer;
+ }
+#else /* !MIKTEX */
+ fullname = kpse_find_file(filename, kpse_program_binary_format, 0);
+#endif
+ pdf_release_obj(tmp);
+ if (!fullname) {
+ spc_warn(spe, "Could not find file.");
+ RELEASE(ident);
+ pdf_release_obj(fstream);
+ return -1;
+ }
+
+ fp = MFOPEN(fullname, FOPEN_RBIN_MODE);
+ if (!fp) {
+ spc_warn(spe, "Could not open file: %s", fullname);
+ RELEASE(ident);
+ pdf_release_obj(fstream);
+ return -1;
+ }
+
+ stream_len = 0;
+ while ((nb_read =
+ fread(work_buffer, sizeof(char), WORK_BUFFER_SIZE, fp)) > 0) {
+ pdf_add_stream(fstream, work_buffer, nb_read);
+ stream_len += nb_read;
+ }
+
+ MFCLOSE(fp);
+
+ /*
+ * Optional dict.
+ *
+ * TODO: check Length, Filter...
+ */
+ skip_white(&args->curptr, args->endptr);
+
+ if (args->curptr[0] == '<') {
+ pdf_obj *stream_dict;
+
+ stream_dict = pdf_stream_dict(fstream);
+
+ tmp = parse_pdf_dict(&args->curptr, args->endptr);
+ if (!tmp) {
+ spc_warn(spe, "Parsing dictionary failed.");
+ RELEASE(ident);
+ pdf_release_obj(fstream);
+ return -1;
+ }
+ if (pdf_lookup_dict(tmp, "Length")) {
+ pdf_remove_dict(tmp, "Length");
+ } else if (pdf_lookup_dict(tmp, "Filter")) {
+ pdf_remove_dict(tmp, "Filter");
+ }
+ pdf_merge_dict(stream_dict, tmp);
+ pdf_release_obj(tmp);
+ }
+
+ /* Users should explicitly close this. */
+ spc_push_object(ident, fstream);
+ RELEASE(ident);
+
+ return 0;
+}
+
+/* Grab page content as follows:
+ *
+ * Reference point = (x_user, y_user)
+ *
+ * Case 1. \special{pdf:bxobj @obj width WD height HT depth DP}
+ *
+ * Grab the box with the lower-left corner (x_user, y_user-DP)
+ * and the upper right corner (x_user+WD, y_user+HT).
+ *
+ * Case 2. \special{pdf:bxobj @obj bbox LLX LLY URX, URY}
+ *
+ * Grab the box with the lower-left corner (x_user+LLX, y_user+LLY)
+ * and the upper right corner (x_user+URX, y_user+URY).
+ *
+ * Note that scale, xscale, yscale, xoffset, yoffset options are ignored.
+ */
+static int
+spc_handler_pdfm_bform (struct spc_env *spe, struct spc_arg *args)
+{
+ int xobj_id;
+ char *ident;
+ pdf_rect cropbox;
+ transform_info ti;
+
+ skip_white(&args->curptr, args->endptr);
+
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ if (!ident) {
+ spc_warn(spe, "A form XObject must have name.");
+ return -1;
+ }
+
+ transform_info_clear(&ti);
+ if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ RELEASE(ident);
+ return -1;
+ }
+
+ /* A XForm with zero dimension results in a non-invertible transformation
+ * matrix. And it may result in unpredictable behaviour. It might be an
+ * error in Acrobat. Bounding box with zero dimension may cause division
+ * by zero.
+ */
+ if (ti.flags & INFO_HAS_USER_BBOX) {
+ if (ti.bbox.urx - ti.bbox.llx == 0.0 ||
+ ti.bbox.ury - ti.bbox.lly == 0.0) {
+ spc_warn(spe, "Bounding box has a zero dimension.");
+ RELEASE(ident);
+ return -1;
+ }
+ cropbox.llx = ti.bbox.llx;
+ cropbox.lly = ti.bbox.lly;
+ cropbox.urx = ti.bbox.urx;
+ cropbox.ury = ti.bbox.ury;
+ } else {
+ if (ti.width == 0.0 ||
+ ti.depth + ti.height == 0.0) {
+ spc_warn(spe, "Bounding box has a zero dimension.");
+ RELEASE(ident);
+ return -1;
+ }
+ cropbox.llx = 0.0;
+ cropbox.lly = -ti.depth;
+ cropbox.urx = ti.width;
+ cropbox.ury = ti.height;
+ }
+
+ xobj_id = pdf_doc_begin_grabbing(ident, spe->x_user, spe->y_user, &cropbox);
+
+ if (xobj_id < 0) {
+ RELEASE(ident);
+ spc_warn(spe, "Couldn't start form object.");
+ return -1;
+ }
+
+ spc_push_object(ident, pdf_ximage_get_reference(xobj_id));
+ RELEASE(ident);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_eform (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_obj *garbage;
+ pdf_obj *resource;
+
+ skip_white(&args->curptr, args->endptr);
+
+ if (args->curptr < args->endptr) {
+ /* An extra dictionary after exobj must be merged to /Resources.
+ * Please use pdf:put @resources (before pdf:exobj) instead.
+ */
+ garbage = parse_pdf_dict(&args->curptr, args->endptr);
+ if (garbage) {
+ resource = pdf_doc_current_page_resources();
+ pdf_merge_dict(resource, garbage);
+ spc_warn(spe, "Garbage after special pdf:exobj.");
+ pdf_release_obj(garbage);
+ }
+ }
+ pdf_doc_end_grabbing();
+
+ return 0;
+}
+
+/* Saved XObjects can be used as follows:
+ *
+ * Reference point = (x_user, y_user)
+ *
+ * Case 1. \special{pdf:uxobj @obj width WD height HT depth DP}
+ *
+ * Scale the XObject to fit in the box
+ * [x_user, y_user-DP, x_user+WD, y_user+HT].
+ *
+ * Case 2. \special{pdf:uxobj @obj xscale XS yscale YS}
+ *
+ * Scale the XObject with XS and YS. Note that width and xscale
+ * or height and yscale cannot be used together.
+ *
+ * Case 3. \special{pdf:bxobj @obj bbox LLX LLY URX, URY}
+ *
+ * Scale the XObject to fit in the box
+ * [x_user+LLX, y_user+LLY, x_user+URX, y_user+URY].
+ *
+ * Note that xoffset and yoffset moves the reference point where the
+ * lower-left corner of the XObject will be put.
+ */
+static int
+spc_handler_pdfm_uxobj (struct spc_env *spe, struct spc_arg *args)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ int xobj_id;
+ char *ident;
+ transform_info ti;
+
+ skip_white(&args->curptr, args->endptr);
+
+ ident = parse_opt_ident(&args->curptr, args->endptr);
+ if (!ident) {
+ spc_warn(spe, "No object identifier given.");
+ return -1;
+ }
+
+ transform_info_clear(&ti);
+ if (args->curptr < args->endptr) {
+ if (spc_util_read_dimtrns(spe, &ti, args, 0) < 0) {
+ RELEASE(ident);
+ return -1;
+ }
+ }
+
+ /* Dvipdfmx was suddenly changed to use file name to identify
+ * external images. We can't use ident to find image resource
+ * here.
+ */
+ xobj_id = findresource(sd, ident);
+ if (xobj_id < 0) {
+ xobj_id = pdf_ximage_findresource(ident, 0, 0);
+ if (xobj_id < 0) {
+ spc_warn(spe, "Specified (image) object doesn't exist: %s", ident);
+ RELEASE(ident);
+ return -1;
+ }
+ }
+
+ pdf_dev_put_image(xobj_id, &ti, spe->x_user, spe->y_user);
+ RELEASE(ident);
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_link (struct spc_env *spe, struct spc_arg *args)
+{
+ return spc_resume_annot(spe);
+}
+
+static int
+spc_handler_pdfm_nolink (struct spc_env *spe, struct spc_arg *args)
+{
+ return spc_suspend_annot(spe);
+}
+
+
+
+/* Handled at BOP */
+static int
+spc_handler_pdfm_pagesize (struct spc_env *spe, struct spc_arg *args)
+{
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+/* Please remove this.
+ * This should be handled before processing pages!
+ */
+static int
+spc_handler_pdfm_bgcolor (struct spc_env *spe, struct spc_arg *args)
+{
+ int error;
+ pdf_color colorspec;
+
+ error = spc_util_read_colorspec(spe, &colorspec, args, 0);
+ if (error)
+ spc_warn(spe, "No valid color specified?");
+ else {
+ pdf_doc_set_bgcolor(&colorspec);
+ }
+
+ return error;
+}
+
+static int
+spc_handler_pdfm_mapline (struct spc_env *spe, struct spc_arg *ap)
+{
+ fontmap_rec *mrec;
+ char *map_name, opchr;
+ int error = 0;
+
+ skip_white(&ap->curptr, ap->endptr);
+ if (ap->curptr >= ap->endptr) {
+ spc_warn(spe, "Empty mapline special?");
+ return -1;
+ }
+
+ opchr = ap->curptr[0];
+ if (opchr == '-' || opchr == '+')
+ ap->curptr++;
+
+ skip_white(&ap->curptr, ap->endptr);
+
+ switch (opchr) {
+ case '-':
+ map_name = parse_ident(&ap->curptr, ap->endptr);
+ if (map_name) {
+ pdf_remove_fontmap_record(map_name);
+ RELEASE(map_name);
+ } else {
+ spc_warn(spe, "Invalid fontmap line: Missing TFM name.");
+ error = -1;
+ }
+ break;
+ case '+':
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr));
+ if (error)
+ spc_warn(spe, "Invalid fontmap line.");
+ else {
+ pdf_append_fontmap_record(mrec->map_name, mrec);
+ }
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+ break;
+ default:
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr));
+ if (error)
+ spc_warn(spe, "Invalid fontmap line.");
+ else {
+ pdf_insert_fontmap_record(mrec->map_name, mrec);
+ }
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+ break;
+ }
+ if (!error)
+ ap->curptr = ap->endptr;
+
+ return 0;
+}
+
+static int
+spc_handler_pdfm_mapfile (struct spc_env *spe, struct spc_arg *args)
+{
+ char *mapfile;
+ int mode, error = 0;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr >= args->endptr)
+ return 0;
+
+ switch (args->curptr[0]) {
+ case '-':
+ mode = FONTMAP_RMODE_REMOVE;
+ args->curptr++;
+ break;
+ case '+':
+ mode = FONTMAP_RMODE_APPEND;
+ args->curptr++;
+ break;
+ default:
+ mode = FONTMAP_RMODE_REPLACE;
+ break;
+ }
+
+ mapfile = parse_val_ident(&args->curptr, args->endptr);
+ if (!mapfile) {
+ spc_warn(spe, "No fontmap file specified.");
+ return -1;
+ } else {
+ error = pdf_load_fontmap_file(mapfile, mode);
+ }
+
+ return error;
+}
+
+
+#ifdef ENABLE_TOUNICODE
+static int
+spc_handler_pdfm_tounicode (struct spc_env *spe, struct spc_arg *args)
+{
+ struct spc_pdf_ *sd = &_pdf_stat;
+ char *cmap_name;
+ int error = 0;
+
+ /* First clear */
+ sd->cd.cmap_id = -1;
+ sd->cd.unescape_backslash = 0;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr >= args->endptr) {
+ spc_warn(spe, "Missing CMap name for pdf:tounicode.");
+ return -1;
+ }
+
+ /* _FIXME_
+ * Any valid char allowed for PDF name object should be allowed here.
+ * The argument to this special should be a PDF name obejct.
+ * But it's too late to change this special.
+ */
+ cmap_name = parse_ident(&args->curptr, args->endptr);
+ if (!cmap_name) {
+ spc_warn(spe, "Missing ToUnicode mapping name...");
+ return -1;
+ }
+
+ sd->cd.cmap_id = CMap_cache_find(cmap_name);
+ if (sd->cd.cmap_id < 0) {
+ spc_warn(spe, "Failed to load ToUnicode mapping: %s", cmap_name);
+ error = -1;
+ }
+
+ /* Shift-JIS like encoding may contain backslash in 2nd byte.
+ * WARNING: This will add nasty extension to PDF parser.
+ */
+ if (!error && sd->cd.cmap_id >= 0) {
+ if (strstr(cmap_name, "RKSJ") ||
+ strstr(cmap_name, "B5") ||
+ strstr(cmap_name, "GBK") ||
+ strstr(cmap_name, "KSC"))
+ sd->cd.unescape_backslash = 1;
+ }
+ RELEASE(cmap_name);
+
+ return error;
+}
+#endif /* ENABLE_TOUNICODE */
+
+
+static struct spc_handler pdfm_handlers[] = {
+ {"annotation", spc_handler_pdfm_annot},
+ {"annotate", spc_handler_pdfm_annot},
+ {"annot", spc_handler_pdfm_annot},
+ {"ann", spc_handler_pdfm_annot},
+
+ {"outline", spc_handler_pdfm_outline},
+ {"out", spc_handler_pdfm_outline},
+
+ {"article", spc_handler_pdfm_article},
+ {"art", spc_handler_pdfm_article},
+
+ {"bead", spc_handler_pdfm_bead},
+ {"thread", spc_handler_pdfm_bead},
+
+ {"destination", spc_handler_pdfm_dest},
+ {"dest", spc_handler_pdfm_dest},
+
+
+ {"object", spc_handler_pdfm_object},
+ {"obj", spc_handler_pdfm_object},
+
+
+ {"docinfo", spc_handler_pdfm_docinfo},
+ {"docview", spc_handler_pdfm_docview},
+
+ {"content", spc_handler_pdfm_content},
+ {"put", spc_handler_pdfm_put},
+ {"close", spc_handler_pdfm_close},
+ {"bop", spc_handler_pdfm_bop},
+ {"eop", spc_handler_pdfm_eop},
+
+ {"image", spc_handler_pdfm_image},
+ {"img", spc_handler_pdfm_image},
+ {"epdf", spc_handler_pdfm_image},
+
+ {"link", spc_handler_pdfm_link},
+ {"nolink", spc_handler_pdfm_nolink},
+
+ {"begincolor", spc_handler_pdfm_bcolor},
+ {"bcolor", spc_handler_pdfm_bcolor},
+ {"bc", spc_handler_pdfm_bcolor},
+
+ {"setcolor", spc_handler_pdfm_scolor},
+ {"scolor", spc_handler_pdfm_scolor},
+ {"sc", spc_handler_pdfm_scolor},
+
+ {"endcolor", spc_handler_pdfm_ecolor},
+ {"ecolor", spc_handler_pdfm_ecolor},
+ {"ec", spc_handler_pdfm_ecolor},
+
+ {"begingray", spc_handler_pdfm_bcolor},
+ {"bgray", spc_handler_pdfm_bcolor},
+ {"bg", spc_handler_pdfm_bcolor},
+
+ {"endgray", spc_handler_pdfm_ecolor},
+ {"egray", spc_handler_pdfm_ecolor},
+ {"eg", spc_handler_pdfm_ecolor},
+
+ {"bgcolor", spc_handler_pdfm_bgcolor},
+ {"bgc", spc_handler_pdfm_bgcolor},
+ {"bbc", spc_handler_pdfm_bgcolor},
+ {"bbg", spc_handler_pdfm_bgcolor},
+
+ {"pagesize", spc_handler_pdfm_pagesize},
+
+ {"bannot", spc_handler_pdfm_bann},
+ {"beginann", spc_handler_pdfm_bann},
+ {"bann", spc_handler_pdfm_bann},
+
+ {"eannot", spc_handler_pdfm_eann},
+ {"endann", spc_handler_pdfm_eann},
+ {"eann", spc_handler_pdfm_eann},
+
+ {"btrans", spc_handler_pdfm_btrans},
+ {"begintransform", spc_handler_pdfm_btrans},
+ {"begintrans", spc_handler_pdfm_btrans},
+ {"bt", spc_handler_pdfm_btrans},
+
+ {"etrans", spc_handler_pdfm_etrans},
+ {"endtransform", spc_handler_pdfm_etrans},
+ {"endtrans", spc_handler_pdfm_etrans},
+ {"et", spc_handler_pdfm_etrans},
+
+ {"bform", spc_handler_pdfm_bform},
+ {"beginxobj", spc_handler_pdfm_bform},
+ {"bxobj", spc_handler_pdfm_bform},
+
+ {"eform", spc_handler_pdfm_eform},
+ {"endxobj", spc_handler_pdfm_eform},
+ {"exobj", spc_handler_pdfm_eform},
+
+ {"usexobj", spc_handler_pdfm_uxobj},
+ {"uxobj", spc_handler_pdfm_uxobj},
+
+#ifdef ENABLE_TOUNICODE
+ {"tounicode", spc_handler_pdfm_tounicode},
+#endif /* ENABLE_TOUNICODE */
+ {"literal", spc_handler_pdfm_literal},
+ {"fstream", spc_handler_pdfm_fstream},
+ {"names", spc_handler_pdfm_names},
+ {"mapline", spc_handler_pdfm_mapline},
+ {"mapfile", spc_handler_pdfm_mapfile},
+};
+
+int
+spc_pdfm_check_special (const char *buf, long len)
+{
+ int r = 0;
+ char *p, *endptr;
+
+ p = (char *) buf;
+ endptr = p + len;
+
+ skip_white(&p, endptr);
+ if (p + strlen("pdf:") <= endptr &&
+ !memcmp(p, "pdf:", strlen("pdf:"))) {
+ r = 1;
+ }
+
+ return r;
+}
+
+int
+spc_pdfm_setup_handler (struct spc_handler *sph,
+ struct spc_env *spe, struct spc_arg *ap)
+{
+ int error = -1, i;
+ char *q;
+
+ ASSERT(sph && spe && ap);
+
+ skip_white(&ap->curptr, ap->endptr);
+ if (ap->curptr + strlen("pdf:") >= ap->endptr ||
+ memcmp(ap->curptr, "pdf:", strlen("pdf:"))) {
+ spc_warn(spe, "Not pdf: special???");
+ return -1;
+ }
+ ap->curptr += strlen("pdf:");
+
+ skip_white(&ap->curptr, ap->endptr);
+ q = parse_c_ident(&ap->curptr, ap->endptr);
+ if (q) {
+ for (i = 0;
+ i < sizeof(pdfm_handlers) / sizeof(struct spc_handler); i++) {
+ if (!strcmp(q, pdfm_handlers[i].key)) {
+ ap->command = (char *) pdfm_handlers[i].key;
+ sph->key = (char *) "pdf:";
+ sph->exec = pdfm_handlers[i].exec;
+ skip_white(&ap->curptr, ap->endptr);
+ error = 0;
+ break;
+ }
+ }
+ RELEASE(q);
+ }
+
+ return error;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_pdfm.h b/Build/source/texk/xdvipdfmx/src/spc_pdfm.h
new file mode 100644
index 00000000000..0c4fe6d79ed
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_pdfm.h
@@ -0,0 +1,39 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_pdfm.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_PDFM_H_
+#define _SPC_PDFM_H_
+
+#include "specials.h"
+
+extern int spc_pdfm_at_begin_page (void);
+extern int spc_pdfm_at_end_page (void);
+extern int spc_pdfm_at_begin_document (void);
+extern int spc_pdfm_at_end_document (void);
+
+extern int spc_pdfm_check_special (const char *buffer, long size);
+extern int spc_pdfm_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_PDFM_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_tpic.c b/Build/source/texk/xdvipdfmx/src/spc_tpic.c
new file mode 100644
index 00000000000..71a41ce159b
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_tpic.c
@@ -0,0 +1,1150 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_tpic.c,v 1.3 2005/10/14 04:55:00 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "numbers.h"
+#include "dpxutil.h"
+
+#include "pdfdoc.h"
+
+#include "pdfdraw.h"
+#include "pdfdev.h"
+
+#include "specials.h"
+#include "spc_tpic.h"
+
+#define DEBUG 1
+#define ENABLE_SPC_NAMESPACE 1
+
+/*
+ * Following "constant" converts milli-inches to
+ * device (in this case PDF stream) coordinates.
+ */
+
+#define MI2DEV (0.072/pdf_dev_scale())
+
+/*
+ * Value for 'sh' command 'g' is interpreted as
+ *
+ * gray color value 1-g for "solid"
+ * opacity value g for "opacity"
+ * shape value g for "shape"
+ */
+#define TPIC_MODE__FILL_SOLID 0
+#define TPIC_MODE__FILL_OPACITY 1
+#define TPIC_MODE__FILL_SHAPE 2
+
+#ifndef ISBLANK
+# define ISBLANK(c) ( (c) == ' ' || (c) == '\t' )
+#endif
+
+static void
+skip_blank (char **pp, char *endptr)
+{
+ char *p = *pp;
+ for ( ; p < endptr && ISBLANK(*p); p++);
+ *pp = p;
+}
+
+struct spc_tpic_
+{
+ struct {
+ int fill;
+ } mode;
+
+ /* state */
+ double pen_size;
+ int fill_shape; /* boolean */
+ double fill_color;
+
+ pdf_coord *points;
+ int num_points;
+ int max_points;
+};
+
+#if 1
+static struct spc_tpic_ _tpic_state;
+#endif
+
+/* We use pdf_doc_add_page_content() here
+ * since we always draw isolated graphics.
+ */
+static void
+tpic__clear (struct spc_tpic_ *tp)
+{
+ if (tp->points) {
+ RELEASE(tp->points);
+ tp->points = NULL;
+ }
+ tp->num_points = 0;
+ tp->max_points = 0;
+ tp->fill_shape = 0;
+ tp->fill_color = 0.0;
+}
+
+
+static pdf_obj *
+create_xgstate (double a /* alpha */, int f_ais /* alpha is shape */)
+{
+ pdf_obj *dict;
+
+ dict = pdf_new_dict();
+ pdf_add_dict(dict,
+ pdf_new_name("Type"),
+ pdf_new_name("ExtGState"));
+ if (f_ais) {
+ pdf_add_dict(dict,
+ pdf_new_name("AIS"),
+ pdf_new_boolean(1));
+ }
+ pdf_add_dict(dict,
+ pdf_new_name("ca"),
+ pdf_new_number(a));
+
+ return dict;
+}
+
+static int
+check_resourcestatus (const char *category, const char *resname)
+{
+ pdf_obj *dict1, *dict2;
+
+ dict1 = pdf_doc_current_page_resources();
+ if (!dict1)
+ return 0;
+
+ dict2 = pdf_lookup_dict(dict1, category);
+ if (dict2 &&
+ pdf_obj_typeof(dict2) == PDF_DICT) {
+ if (pdf_lookup_dict(dict2, resname))
+ return 1;
+ }
+ return 0;
+}
+
+static int
+set_linestyle (double pn, double da)
+{
+ double dp[2]; /* dash pattern */
+
+ pdf_dev_setlinejoin(1);
+ pdf_dev_setmiterlimit(1.4);
+ pdf_dev_setlinewidth(pn);
+ if (da > 0.0) {
+ dp[0] = da * 72.0;
+ pdf_dev_setdash(1, dp, 0);
+ pdf_dev_setlinecap(0);
+ } else if (da < 0.0) {
+ dp[0] = pn;
+ dp[1] = -da * 72.0;
+ pdf_dev_setdash(2, dp, 0);
+ pdf_dev_setlinecap(1);
+ } else {
+ pdf_dev_setlinecap(0);
+ }
+ pdf_doc_add_page_content(" 0 G", 4);
+
+ return 0;
+}
+
+static int
+set_fillstyle (double g, double a, int f_ais)
+{
+ pdf_obj *dict;
+ char resname[32];
+ char buf[32];
+ int alp, len = 0;
+
+ if (a > 0.0) {
+ alp = round(100.0 * a);
+ sprintf(resname, "_Tps_a%03d_", alp);
+ if (!check_resourcestatus("ExtGState", resname)) {
+ dict = create_xgstate(ROUND(0.01 * alp, 0.01), f_ais);
+ pdf_doc_add_page_resource("ExtGState",
+ resname, pdf_ref_obj(dict));
+ pdf_release_obj(dict);
+ }
+ len += sprintf(buf + len, " /%s gs", resname);
+ }
+ len += sprintf(buf + len, " %.2f g", g);
+
+ pdf_doc_add_page_content(buf, len);
+
+ return 0;
+}
+
+
+static void
+showpath (int f_vp, int f_fs) /* visible_path, fill_shape */
+{
+ if (f_vp) {
+ if (f_fs)
+ pdf_dev_flushpath('b', PDF_FILL_RULE_NONZERO);
+ else {
+ pdf_dev_flushpath('S', PDF_FILL_RULE_NONZERO);
+ }
+ } else {
+ /*
+ * Acrobat claims 'Q' as illegal operation when there are unfinished
+ * path (a path without path-painting operator applied)?
+ */
+ if (f_fs)
+ pdf_dev_flushpath('f', PDF_FILL_RULE_NONZERO);
+ else {
+ pdf_dev_newpath();
+ }
+ }
+}
+
+#define CLOSED_PATH(s) (\
+ (s)->points[0].x == (s)->points[(s)->num_points-1].x && \
+ (s)->points[0].y == (s)->points[(s)->num_points-1].y \
+)
+
+static int
+tpic__polyline (struct spc_tpic_ *tp,
+ const pdf_coord *c,
+ int f_vp,
+ double da)
+{
+ pdf_tmatrix M;
+ double pn = tp->pen_size;
+ int f_fs = tp->fill_shape;
+ int f_ais = 0;
+ double g = 0.5;
+ double a = 0.0;
+ int i, error = 0;
+
+ /* Shading is applied only to closed path. */
+ f_fs = CLOSED_PATH(tp) ? f_fs : 0;
+ f_vp = (pn > 0.0) ? f_vp : 0;
+ f_ais = (tp->mode.fill == TPIC_MODE__FILL_SHAPE) ? 1 : 0;
+ switch (tp->mode.fill) {
+ case TPIC_MODE__FILL_SOLID:
+ g = 1.0 - tp->fill_color;
+ a = 0.0;
+ break;
+ case TPIC_MODE__FILL_SHAPE:
+ case TPIC_MODE__FILL_OPACITY:
+ if (tp->fill_color > 0.0) {
+ a = tp->fill_color;
+ g = 0.0;
+ } else {
+ a = 0.0;
+ g = 1.0;
+ }
+ break;
+ }
+
+ if (f_vp || f_fs) {
+ pdf_dev_gsave();
+
+ pdf_setmatrix (&M, 1.0, 0.0, 0.0, -1.0, c->x, c->y);
+ pdf_dev_concat(&M);
+
+ if (f_vp)
+ set_linestyle(pn, da);
+ if (f_fs)
+ set_fillstyle(g, a, f_ais);
+
+ pdf_dev_moveto(tp->points[0].x, tp->points[0].y);
+ for (i = 0; i < tp->num_points; i++)
+ pdf_dev_lineto(tp->points[i].x, tp->points[i].y);
+
+ showpath(f_vp, f_fs);
+
+ pdf_dev_grestore();
+ }
+
+ tpic__clear(tp);
+
+ return error;
+}
+
+/*
+ * Accroding to
+ * "Tpic: Pic for TEX", Tim Morgan, Original by Brian Kernighan, p.20:
+ *
+ * A spline is a smooth curve guided by a set of straight lines just
+ * like the line above. It begins at the same place, ends at the same
+ * place, and in between is tangent to the mid-point of each guiding
+ * line. The syntax for a spline is identical to a (path) line except
+ * for using spline instead of line.
+ *
+ * Spline is not a curve drawn by spline-fitting points p0, p1, ..., pn,
+ * defined by tpic special "pa" command. Instead, a path defined by set
+ * of points p0, p1, ... is guiding line mentioned above.
+ *
+ * Dvipsk draws them as a straight line from p0 to q1 = (p0 + p1)/2,
+ * followed by a quadratic B-spline curve with starting point q1, (off-
+ * curve) control point p1, end point q2 = (p1 + p2)/2, ..., and a
+ * straight line from qn to pn.
+ */
+
+static int
+tpic__spline (struct spc_tpic_ *tp,
+ const pdf_coord *c,
+ int f_vp,
+ double da)
+{
+ double v[6];
+ pdf_tmatrix M;
+ double pn = tp->pen_size;
+ int f_fs = tp->fill_shape;
+ int f_ais = 0;
+ double g = 0.5;
+ double a = 0.0;
+ int i, error = 0;
+
+ f_fs = CLOSED_PATH(tp) ? f_fs : 0;
+ f_vp = (pn > 0.0) ? f_vp : 0;
+ f_ais = (tp->mode.fill == TPIC_MODE__FILL_SHAPE) ? 1 : 0;
+ switch (tp->mode.fill) {
+ case TPIC_MODE__FILL_SOLID:
+ g = 1.0 - tp->fill_color;
+ a = 0.0;
+ break;
+ case TPIC_MODE__FILL_SHAPE:
+ case TPIC_MODE__FILL_OPACITY:
+ if (tp->fill_color > 0.0) {
+ a = tp->fill_color;
+ g = 0.0;
+ } else {
+ a = 0.0;
+ g = 1.0;
+ }
+ break;
+ }
+
+ if ( f_vp || f_fs ) {
+ pdf_dev_gsave();
+
+ pdf_setmatrix (&M, 1.0, 0.0, 0.0, -1.0, c->x, c->y);
+ pdf_dev_concat(&M);
+
+ if (f_vp)
+ set_linestyle(pn, da);
+ if (f_fs)
+ set_fillstyle(g, a, f_ais);
+
+ pdf_dev_moveto(tp->points[0].x, tp->points[0].y);
+
+ v[0] = 0.5 * (tp->points[0].x + tp->points[1].x);
+ v[1] = 0.5 * (tp->points[0].y + tp->points[1].y);
+ pdf_dev_lineto(v[0], v[1]);
+ for (i = 1; i < tp->num_points - 1; i++) {
+ /* B-spline control points */
+ v[0] = 0.5 * (tp->points[i-1].x + tp->points[i].x);
+ v[1] = 0.5 * (tp->points[i-1].y + tp->points[i].y);
+ v[2] = tp->points[i].x;
+ v[3] = tp->points[i].y;
+ v[4] = 0.5 * (tp->points[i].x + tp->points[i+1].x);
+ v[5] = 0.5 * (tp->points[i].y + tp->points[i+1].y);
+ pdf_dev_bspline(v[0], v[1], v[2], v[3], v[4], v[5]);
+ }
+ pdf_dev_lineto(tp->points[i].x, tp->points[i].y);
+
+ showpath(f_vp, f_fs);
+
+ pdf_dev_grestore();
+ }
+ tpic__clear(tp);
+
+ return error;
+}
+
+static int
+tpic__arc (struct spc_tpic_ *tp,
+ const pdf_coord *c,
+ int f_vp,
+ double da,
+ double *v /* 6 numbers */ )
+{
+ pdf_tmatrix M;
+ double pn = tp->pen_size;
+ int f_fs = tp->fill_shape;
+ int f_ais = 0;
+ double g = 0.5;
+ double a = 0.0;
+
+ f_fs = (round(fabs(v[4] - v[5]) + 0.5) >= 360) ? f_fs : 0;
+ f_vp = (pn > 0.0) ? f_vp : 0;
+ f_ais = (tp->mode.fill == TPIC_MODE__FILL_SHAPE) ? 1 : 0;
+ switch (tp->mode.fill) {
+ case TPIC_MODE__FILL_SOLID:
+ g = 1.0 - tp->fill_color;
+ a = 0.0;
+ break;
+ case TPIC_MODE__FILL_SHAPE:
+ case TPIC_MODE__FILL_OPACITY:
+ if (tp->fill_color > 0.0) {
+ a = tp->fill_color;
+ g = 0.0;
+ } else {
+ a = 0.0;
+ g = 1.0;
+ }
+ break;
+ }
+
+ if ( f_vp || f_fs ) {
+ pdf_dev_gsave();
+
+ pdf_setmatrix (&M, 1.0, 0.0, 0.0, -1.0, c->x, c->y);
+ pdf_dev_concat(&M);
+
+ if (f_vp)
+ set_linestyle(pn, da);
+ if (f_fs)
+ set_fillstyle(g, a, f_ais);
+
+ pdf_dev_arcx(v[0], v[1], v[2], v[3], v[4], v[5], +1, 0.0);
+
+ showpath(f_vp, f_fs);
+
+ pdf_dev_grestore();
+ }
+ tpic__clear(tp);
+
+ return 0;
+}
+
+#if 1
+static int
+spc_currentpoint (struct spc_env *spe, long *pg, pdf_coord *cp)
+{
+ *pg = 0;
+ cp->x = spe->x_user;
+ cp->y = spe->y_user;
+ return 0;
+}
+#endif
+
+static int
+spc_handler_tpic_pn (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ char *q;
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!q) {
+ spc_warn(spe, "Invalid pen size specified?");
+ return -1;
+ }
+ tp->pen_size = atof(q) * MI2DEV;
+ RELEASE(q);
+
+ return 0;
+}
+
+static int
+spc_handler_tpic_pa (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ char *q;
+ int i;
+ double v[2];
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ for (i = 0;
+ i < 2 && ap->curptr < ap->endptr; i++) {
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!q) {
+ spc_warn(spe, "Missing numbers for TPIC \"pa\" command.");
+ return -1;
+ }
+ v[i] = atof(q);
+ RELEASE(q);
+ skip_blank(&ap->curptr, ap->endptr);
+ }
+ if (i != 2) {
+ spc_warn(spe, "Invalid arg for TPIC \"pa\" command.");
+ return -1;
+ }
+
+ if (tp->num_points >= tp->max_points) {
+ tp->max_points += 256;
+ tp->points = RENEW(tp->points, tp->max_points, pdf_coord);
+ }
+ tp->points[tp->num_points].x = v[0] * MI2DEV;
+ tp->points[tp->num_points].y = v[1] * MI2DEV;
+ tp->num_points += 1;
+
+ return 0;
+}
+
+static int
+spc_handler_tpic_fp (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ pdf_coord cp;
+ long pg;
+
+ ASSERT(spe && ap && tp);
+
+ if (tp->num_points <= 1) {
+ spc_warn(spe, "Too few points (< 2) for polyline path.");
+ return -1;
+ }
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__polyline(tp, &cp, 1, 0.0);
+}
+
+static int
+spc_handler_tpic_ip (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ pdf_coord cp;
+ long pg;
+
+ ASSERT(spe && ap && tp);
+
+ if (tp->num_points <= 1) {
+ spc_warn(spe, "Too few points (< 2) for polyline path.");
+ return -1;
+ }
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__polyline(tp, &cp, 0, 0.0);
+}
+
+static int
+spc_handler_tpic_da (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ char *q;
+ double da = 0.0;
+ pdf_coord cp;
+ long pg;
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (q) {
+ da = atof(q);
+ RELEASE(q);
+ }
+ if (tp->num_points <= 1) {
+ spc_warn(spe, "Too few points (< 2) for polyline path.");
+ return -1;
+ }
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__polyline(tp, &cp, 1, da);
+}
+
+static int
+spc_handler_tpic_dt (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ char *q;
+ double da = 0.0;
+ pdf_coord cp;
+ long pg;
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (q) {
+ da = -atof(q);
+ RELEASE(q);
+ }
+ if (tp->num_points <= 1) {
+ spc_warn(spe, "Too few points (< 2) for polyline path.");
+ return -1;
+ }
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__polyline(tp, &cp, 1, da);
+}
+
+static int
+spc_handler_tpic_sp (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ char *q;
+ double da = 0.0;
+ pdf_coord cp;
+ long pg;
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (q) {
+ da = atof(q);
+ RELEASE(q);
+ }
+ if (tp->num_points <= 2) {
+ spc_warn(spe, "Too few points (< 3) for spline path.");
+ return -1;
+ }
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__spline(tp, &cp, 1, da);
+}
+
+static int
+spc_handler_tpic_ar (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ double v[6];
+ pdf_coord cp;
+ long pg;
+ char *q;
+ int i;
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ for (i = 0;
+ i < 6 && ap->curptr < ap->endptr; i++) {
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!q) {
+ spc_warn(spe, "Invalid args. in TPIC \"ar\" command.");
+ return -1;
+ }
+ v[i] = atof(q);
+ RELEASE(q);
+ skip_blank(&ap->curptr, ap->endptr);
+ }
+ if (i != 6) {
+ spc_warn(spe, "Invalid arg for TPIC \"ar\" command.");
+ return -1;
+ }
+
+ v[0] *= MI2DEV; v[1] *= MI2DEV;
+ v[2] *= MI2DEV; v[3] *= MI2DEV;
+ v[4] *= 180.0 / M_PI;
+ v[5] *= 180.0 / M_PI;
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__arc(tp, &cp, 1, 0.0, v);
+}
+
+static int
+spc_handler_tpic_ia (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ double v[6];
+ pdf_coord cp;
+ long pg;
+ char *q;
+ int i;
+
+ ASSERT(spe && ap && tp);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ for (i = 0;
+ i < 6 && ap->curptr < ap->endptr; i++) {
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!q) {
+ spc_warn(spe, "Invalid args. in TPIC \"ia\" command.");
+ return -1;
+ }
+ v[i] = atof(q);
+ RELEASE(q);
+ skip_blank(&ap->curptr, ap->endptr);
+ }
+ if (i != 6) {
+ spc_warn(spe, "Invalid arg for TPIC \"ia\" command.");
+ return -1;
+ }
+
+ v[0] *= MI2DEV; v[1] *= MI2DEV;
+ v[2] *= MI2DEV; v[3] *= MI2DEV;
+ v[4] *= 180.0 / M_PI;
+ v[5] *= 180.0 / M_PI;
+
+ spc_currentpoint(spe, &pg, &cp);
+
+ return tpic__arc(tp, &cp, 0, 0.0, v);
+}
+
+static int
+spc_handler_tpic_sh (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ char *q;
+
+ ASSERT(spe && ap && tp);
+
+ tp->fill_shape = 1;
+ tp->fill_color = 0.5;
+
+ skip_blank(&ap->curptr, ap->endptr);
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (q) {
+ tp->fill_color = atof(q);
+ RELEASE(q);
+ }
+
+ return 0;
+}
+
+static int
+spc_handler_tpic_wh (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+
+ ASSERT(spe && ap && tp);
+
+ tp->fill_shape = 1;
+ tp->fill_color = 0.0;
+
+ return 0;
+}
+
+static int
+spc_handler_tpic_bk (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+
+ ASSERT(spe && ap && tp);
+
+ tp->fill_shape = 1;
+ tp->fill_color = 1.0;
+
+ return 0;
+}
+
+static int
+spc_handler_tpic_tx (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+
+ ASSERT(spe && ap && tp);
+
+ spc_warn(spe, "TPIC command \"tx\" not supported.");
+
+ return -1;
+}
+
+
+static int
+spc_handler_tpic__init (struct spc_env *spe,
+ struct spc_arg *ap, void *dp)
+{
+ struct spc_tpic_ *tp = dp;
+
+#if 0
+ tp->mode.fill = TPIC_MODE__FILL_SOLID;
+#endif
+ tp->pen_size = 1.0;
+ tp->fill_shape = 0;
+ tp->fill_color = 0.0;
+
+ tp->points = NULL;
+ tp->num_points = 0;
+ tp->max_points = 0;
+
+ if (tp->mode.fill != TPIC_MODE__FILL_SOLID && pdf_get_version() < 4) {
+ spc_warn(spe, "Tpic shading support requires PDF version 1.4.");
+ tp->mode.fill = TPIC_MODE__FILL_SOLID;
+ }
+
+ return 0;
+}
+
+static int
+spc_handler_tpic__bophook (struct spc_env *spe,
+ struct spc_arg *ap, void *dp)
+{
+ struct spc_tpic_ *tp = dp;
+
+ ASSERT(tp);
+
+ tpic__clear(tp);
+
+ return 0;
+}
+
+static int
+spc_handler_tpic__eophook (struct spc_env *spe,
+ struct spc_arg *ap, void *dp)
+{
+ struct spc_tpic_ *tp = dp;
+
+ ASSERT(tp);
+
+ if (tp->num_points > 0)
+ spc_warn(spe, "Unflushed tpic path at end of the page.");
+ tpic__clear(tp);
+
+ return 0;
+}
+
+static int
+spc_handler_tpic__clean (struct spc_env *spe,
+ struct spc_arg *ap, void *dp)
+{
+ struct spc_tpic_ *tp = dp;
+
+ ASSERT(tp);
+
+ if (tp->num_points > 0)
+ spc_warn(spe, "Unflushed tpic path at end of the document.");
+
+ tpic__clear(tp);
+#if 0
+ RELEASE(tp);
+#endif
+
+ return 0;
+}
+
+void
+tpic_set_fill_mode (int mode)
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ tp->mode.fill = mode;
+}
+
+
+int
+spc_tpic_at_begin_page (void)
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ return spc_handler_tpic__bophook(NULL, NULL, tp);
+}
+
+int
+spc_tpic_at_end_page (void)
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ return spc_handler_tpic__eophook(NULL, NULL, tp);
+}
+
+
+int
+spc_tpic_at_begin_document (void)
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ return spc_handler_tpic__init(NULL, NULL, tp);
+}
+
+int
+spc_tpic_at_end_document (void)
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ return spc_handler_tpic__clean(NULL, NULL, tp);
+}
+
+
+#if DEBUG
+#include "pdfparse.h" /* parse_val_ident :( */
+
+static pdf_obj *
+spc_parse_kvpairs (struct spc_env *spe, struct spc_arg *ap)
+{
+ pdf_obj *dict;
+ char *kp, *vp;
+ int error = 0;
+
+ dict = pdf_new_dict();
+
+ skip_blank(&ap->curptr, ap->endptr);
+ while (!error && ap->curptr < ap->endptr) {
+ kp = parse_val_ident(&ap->curptr, ap->endptr);
+ if (!kp)
+ break;
+ skip_blank(&ap->curptr, ap->endptr);
+ if (ap->curptr < ap->endptr &&
+ ap->curptr[0] == '=') {
+ ap->curptr++;
+ skip_blank(&ap->curptr, ap->endptr);
+ if (ap->curptr == ap->endptr) {
+ RELEASE(kp);
+ error = -1;
+ break;
+ }
+ vp = parse_c_string(&ap->curptr, ap->endptr);
+ if (!vp)
+ error = -1;
+ else {
+ pdf_add_dict(dict,
+ pdf_new_name(kp),
+ pdf_new_string(vp, strlen(vp) + 1)); /* NULL terminate */
+ RELEASE(vp);
+ }
+ } else {
+ /* Treated as 'flag' */
+ pdf_add_dict(dict,
+ pdf_new_name(kp),
+ pdf_new_boolean(1));
+ }
+ RELEASE(kp);
+ if (!error)
+ skip_blank(&ap->curptr, ap->endptr);
+ }
+
+ if (error) {
+ pdf_release_obj(dict);
+ dict = NULL;
+ }
+
+ return dict;
+}
+
+static int
+tpic_filter_getopts (pdf_obj *kp, pdf_obj *vp, void *dp)
+{
+ struct spc_tpic_ *tp = dp;
+ char *k, *v;
+ int error = 0;
+
+ ASSERT( kp && vp && tp );
+
+ k = pdf_name_value(kp);
+ if (!strcmp(k, "fill-mode")) {
+ if (pdf_obj_typeof(vp) != PDF_STRING) {
+ WARN("Invalid value for TPIC option fill-mode...");
+ error = -1;
+ } else {
+ v = pdf_string_value(vp);
+ if (!strcmp(v, "shape"))
+ tp->mode.fill = TPIC_MODE__FILL_SHAPE;
+ else if (!strcmp(v, "opacity"))
+ tp->mode.fill = TPIC_MODE__FILL_OPACITY;
+ else if (!strcmp(v, "solid"))
+ tp->mode.fill = TPIC_MODE__FILL_SOLID;
+ else {
+ WARN("Invalid value for TPIC option fill-mode: %s", v);
+ error = -1;
+ }
+ }
+ } else {
+ WARN("Unrecognized option for TPIC special handler: %s", k);
+ error = -1;
+ }
+
+ return error;
+}
+
+static int
+spc_handler_tpic__setopts (struct spc_env *spe,
+ struct spc_arg *ap ) /* , void *dp) */
+{
+ struct spc_tpic_ *tp = &_tpic_state;
+ pdf_obj *dict;
+ int error = 0;
+
+ dict = spc_parse_kvpairs(spe, ap);
+ if (!dict)
+ return -1;
+ error = pdf_foreach_dict(dict, tpic_filter_getopts, tp);
+ if (!error) {
+ if (tp->mode.fill != TPIC_MODE__FILL_SOLID &&
+ pdf_get_version() < 4) {
+ spc_warn(spe, "Transparent fill mode requires PDF version 1.4.");
+ tp->mode.fill = TPIC_MODE__FILL_SOLID;
+ }
+ }
+
+ return error;
+}
+#endif /* DEBUG */
+
+
+static struct spc_handler tpic_handlers[] = {
+ {"pn", spc_handler_tpic_pn},
+ {"pa", spc_handler_tpic_pa},
+ {"fp", spc_handler_tpic_fp},
+ {"ip", spc_handler_tpic_ip},
+ {"da", spc_handler_tpic_da},
+ {"dt", spc_handler_tpic_dt},
+ {"sp", spc_handler_tpic_sp},
+ {"ar", spc_handler_tpic_ar},
+ {"ia", spc_handler_tpic_ia},
+ {"sh", spc_handler_tpic_sh},
+ {"wh", spc_handler_tpic_wh},
+ {"bk", spc_handler_tpic_bk},
+ {"tx", spc_handler_tpic_tx}
+};
+
+int
+spc_tpic_check_special (const char *buf, long len)
+{
+ int istpic = 0;
+ char *q, *p, *endptr;
+ int i, hasnsp = 0;
+
+ p = (char *) buf;
+ endptr = p + len;
+
+ skip_blank(&p, endptr);
+#if ENABLE_SPC_NAMESPACE
+ if (p + strlen("tpic:") < endptr &&
+ !memcmp(p, "tpic:", strlen("tpic:")))
+ {
+ p += strlen("tpic:");
+ hasnsp = 1;
+ }
+#endif
+ q = parse_c_ident(&p, endptr);
+
+ if (!q)
+ istpic = 0;
+ else if (q && hasnsp && !strcmp(q, "__setopt__")) {
+#if DEBUG
+ istpic = 1;
+#endif
+ RELEASE(q);
+ } else {
+ for (i = 0;
+ i < sizeof(tpic_handlers)/sizeof(struct spc_handler); i++) {
+ if (!strcmp(q, tpic_handlers[i].key)) {
+ istpic = 1;
+ break;
+ }
+ }
+ RELEASE(q);
+ }
+
+ return istpic;
+}
+
+
+int
+spc_tpic_setup_handler (struct spc_handler *sph,
+ struct spc_env *spe, struct spc_arg *ap)
+{
+ char *q;
+ int i, hasnsp = 0, error = -1;
+
+ ASSERT(sph && spe && ap);
+
+ skip_blank(&ap->curptr, ap->endptr);
+#if ENABLE_SPC_NAMESPACE
+ if (ap->curptr + strlen("tpic:") < ap->endptr &&
+ !memcmp(ap->curptr, "tpic:", strlen("tpic:")))
+ {
+ ap->curptr += strlen("tpic:");
+ hasnsp = 1;
+ }
+#endif
+ q = parse_c_ident(&ap->curptr, ap->endptr);
+
+ if (!q)
+ error = -1;
+ else if (q && hasnsp && !strcmp(q, "__setopt__")) {
+#if DEBUG
+ ap->command = (char *) "__setopt__";
+ sph->key = (char *) "tpic:";
+ sph->exec = spc_handler_tpic__setopts;
+ skip_blank(&ap->curptr, ap->endptr);
+ error = 0;
+#endif
+ RELEASE(q);
+ } else {
+ for (i = 0;
+ i < sizeof(tpic_handlers)/sizeof(struct spc_handler); i++) {
+ if (!strcmp(q, tpic_handlers[i].key)) {
+ ap->command = (char *) tpic_handlers[i].key;
+ sph->key = (char *) "tpic:";
+ sph->exec = tpic_handlers[i].exec;
+ skip_blank(&ap->curptr, ap->endptr);
+ error = 0;
+ break;
+ }
+ }
+ RELEASE(q);
+ }
+
+ return error;
+}
+
+
+#if 0
+int
+spc_load_tpic_special (struct spc_env *spe, pdf_obj *lopts)
+{
+ struct spc_def *spd;
+ struct spc_tpic_ *sd;
+
+ sd = NEW(1, struct spc_tpic_);
+
+ spd = NEW(1, struct spc_def);
+ spc_init_def(spd);
+
+ spc_def_init (spd, &spc_handler_tpic__init);
+ spc_def_setopts(spd, &spc_handler_tpic__setopts);
+ spc_def_bophook(spd, &spc_handler_tpic__bophook);
+ spc_def_eophook(spd, &spc_handler_tpic__eophook);
+ spc_def_clean (spd, &spc_handler_tpic__clean);
+
+ spc_def_func(spd, "pn", &spc_handler_tpic_pn);
+ spc_def_func(spd, "pa", &spc_handler_tpic_pa);
+ spc_def_func(spd, "fp", &spc_handler_tpic_fp);
+ spc_def_func(spd, "ip", &spc_handler_tpic_ip);
+ spc_def_func(spd, "da", &spc_handler_tpic_da);
+ spc_def_func(spd, "dt", &spc_handler_tpic_dt);
+ spc_def_func(spd, "sp", &spc_handler_tpic_sp);
+ spc_def_func(spd, "ar", &spc_handler_tpic_ar);
+ spc_def_func(spd, "ia", &spc_handler_tpic_ia);
+ spc_def_func(spd, "sh", &spc_handler_tpic_sh);
+ spc_def_func(spd, "wh", &spc_handler_tpic_wh);
+ spc_def_func(spd, "bk", &spc_handler_tpic_bk);
+ spc_def_func(spd, "tx", &spc_handler_tpic_tx);
+
+ spc_add_special(spe, "tpic", spd, sd);
+
+ return 0;
+}
+#endif /* 0 */
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_tpic.h b/Build/source/texk/xdvipdfmx/src/spc_tpic.h
new file mode 100644
index 00000000000..28154c4303e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_tpic.h
@@ -0,0 +1,41 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_tpic.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_TPIC_H_
+#define _SPC_TPIC_H_
+
+#include "specials.h"
+
+extern void tpic_set_fill_mode (int mode);
+
+extern int spc_tpic_at_begin_page (void);
+extern int spc_tpic_at_end_page (void);
+extern int spc_tpic_at_begin_document (void);
+extern int spc_tpic_at_end_document (void);
+
+extern int spc_tpic_check_special (const char *buffer, long size);
+extern int spc_tpic_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_TPIC_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_util.c b/Build/source/texk/xdvipdfmx/src/spc_util.c
new file mode 100644
index 00000000000..bfe10f88720
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_util.c
@@ -0,0 +1,731 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_util.c,v 1.7 2005/08/12 16:27:52 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfdev.h"
+#include "pdfparse.h"
+#include "pdfcolor.h"
+#include "pdfdraw.h"
+
+#include "specials.h"
+
+#include "spc_util.h"
+
+
+#ifndef ISBLANK
+#define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+static void
+skip_blank (char **pp, char *endptr)
+{
+ char *p = *pp;
+ for ( ; p < endptr && ISBLANK(*p); p++);
+ *pp = p;
+}
+
+
+/* From pdfcolor.c */
+static int pdf_color_namedcolor (pdf_color *color, const char *colorname);
+
+int
+spc_util_read_numbers (double *values, int num_values,
+ struct spc_env *spe, struct spc_arg *args)
+{
+ int count;
+ char *q;
+
+ skip_blank(&args->curptr, args->endptr);
+ for (count = 0;
+ count < num_values &&
+ args->curptr < args->endptr; ) {
+ q = parse_float_decimal(&args->curptr, args->endptr);
+ if (!q)
+ break;
+ else {
+ values[count] = atof(q);
+ RELEASE(q);
+ skip_blank(&args->curptr, args->endptr);
+ count++;
+ }
+ }
+
+ return count;
+}
+
+static void
+rgb_color_from_hsv (pdf_color *color, double h, double s, double v)
+{
+ double r, g, b;
+ ASSERT( color );
+ r = g = b = v;
+ if (s != 0.0) {
+ double h6, f, v1, v2, v3;
+ int i;
+ h6 = h * 6; /* 360 / 60 */
+ i = (int) h6;
+ f = h6 - i;
+ v1 = v * (1 - s);
+ v2 = v * (1 - s * f);
+ v3 = v * (1 - s * (1 - f));
+ switch (i) {
+ case 0: r = v ; g = v3; b = v1; break;
+ case 1: r = v2; g = v ; b = v1; break;
+ case 2: r = v1; g = v ; b = v3; break;
+ case 3: r = v1; g = v2; b = v ; break;
+ case 4: r = v3; g = v1; b = v ; break;
+ case 5: r = v ; g = v1; b = v2; break;
+ case 6: r = v ; g = v1; b = v2; break;
+ }
+ }
+ pdf_color_rgbcolor(color, r, g, b);
+}
+
+static int
+spc_read_color_color (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *ap)
+{
+ char *q;
+ double cv[4];
+ int nc;
+ int error = 0;
+
+ q = parse_c_ident(&ap->curptr, ap->endptr);
+ if (!q) {
+ spc_warn(spe, "No valid color specified?");
+ return -1;
+ }
+ skip_blank(&ap->curptr, ap->endptr);
+
+ if (!strcmp(q, "rgb")) { /* Handle rgb color */
+ nc = spc_util_read_numbers(cv, 3, spe, ap);
+ if (nc != 3) {
+ spc_warn(spe, "Invalid value for RGB color specification.");
+ error = -1;
+ } else {
+ pdf_color_rgbcolor(colorspec, cv[0], cv[1], cv[2]);
+ }
+ } else if (!strcmp(q, "cmyk")) { /* Handle cmyk color */
+ nc = spc_util_read_numbers(cv, 4, spe, ap);
+ if (nc != 4) {
+ spc_warn(spe, "Invalid value for CMYK color specification.");
+ error = -1;
+ } else {
+ pdf_color_cmykcolor(colorspec, cv[0], cv[1], cv[2], cv[3]);
+ }
+ } else if (!strcmp(q, "gray")) { /* Handle gray */
+ nc = spc_util_read_numbers(cv, 1, spe, ap);
+ if (nc != 1) {
+ spc_warn(spe, "Invalid value for gray color specification.");
+ error = -1;
+ } else {
+ pdf_color_graycolor(colorspec, cv[0]);
+ }
+ } else if (!strcmp(q, "hsb")) {
+ nc = spc_util_read_numbers(cv, 3, spe, ap);
+ if (nc != 3) {
+ spc_warn(spe, "Invalid value for HSB color specification.");
+ error = -1;
+ } else {
+ rgb_color_from_hsv(colorspec, cv[0], cv[1], cv[2]);
+ spc_warn(spe, "HSB color converted to RGB: hsb: <%g, %g, %g> ==> rgb: <%g, %g, %g>",
+ cv[0], cv[1], cv[2],
+ colorspec->values[0], colorspec->values[1], colorspec->values[2]);
+ }
+ } else { /* Must be a "named" color */
+ error = pdf_color_namedcolor(colorspec, q);
+ if (error)
+ spc_warn(spe, "Unrecognized color name: %s", q);
+ }
+ RELEASE(q);
+
+ return error;
+}
+
+/* Argumaent for this is PDF_Number or PDF_Array.
+ * But we ignore that since we don't want to add
+ * dependency to pdfxxx and @foo can not be
+ * allowed for color specification. "pdf" here
+ * means pdf: special syntax.
+ */
+static int
+spc_read_color_pdf (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *ap)
+{
+ double cv[4]; /* at most four */
+ int nc, isarry = 0;
+ int error = 0;
+
+ skip_blank(&ap->curptr, ap->endptr);
+
+ if (ap->curptr[0] == '[') {
+ ap->curptr++; skip_blank(&ap->curptr, ap->endptr);
+ isarry = 1;
+ }
+
+ nc = spc_util_read_numbers(cv, 4, spe, ap);
+ switch (nc) {
+ case 1:
+ pdf_color_graycolor(colorspec, cv[0]);
+ break;
+ case 3:
+ pdf_color_rgbcolor (colorspec, cv[0], cv[1], cv[2]);
+ break;
+ case 4:
+ pdf_color_cmykcolor(colorspec, cv[0], cv[1], cv[2], cv[3]);
+ break;
+ default:
+ spc_warn(spe, "Expecting either gray level or RGB/CMYK color array: %d", nc);
+ error = -1;
+ break;
+ }
+
+ if (!error && isarry) {
+ skip_blank(&ap->curptr, ap->endptr);
+ if (ap->curptr >= ap->endptr || ap->curptr[0] != ']') {
+ spc_warn(spe, "Unbalanced '[' and ']' in color specification.");
+ error = -1;
+ } else {
+ ap->curptr++;
+ }
+ }
+
+ return error;
+}
+
+
+/* This is for reading *single* color specification. */
+int
+spc_util_read_colorspec (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *ap, int syntax)
+{
+ int error = 0;
+
+ ASSERT(colorspec && spe && ap);
+
+ skip_blank(&ap->curptr, ap->endptr);
+ if (ap->curptr >= ap->endptr) {
+ return -1;
+ }
+
+ if (syntax)
+ error = spc_read_color_color(spe, colorspec, ap);
+ else
+ error = spc_read_color_pdf(spe, colorspec, ap);
+
+ return error;
+}
+
+
+/* This need to allow 'true' prefix for unit and
+ * length value must be divided by current magnification.
+ */
+int
+spc_util_read_length (struct spc_env *spe, double *vp /* ret. */, struct spc_arg *ap)
+{
+ char *q;
+ double v, u = 1.0;
+ const char *ukeys[] = {
+#define K_UNIT__PT 0
+#define K_UNIT__IN 1
+#define K_UNIT__CM 2
+#define K_UNIT__MM 3
+#define K_UNIT__BP 4
+ "pt", "in", "cm", "mm", "bp", NULL
+ };
+ int k, error = 0;
+
+ q = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!q)
+ return -1;
+
+ v = atof(q);
+ RELEASE(q);
+
+ q = parse_c_ident(&ap->curptr, ap->endptr);
+ if (q) {
+ if (strlen(q) > strlen("true") &&
+ !memcmp(q, "true", strlen("true"))) {
+ u /= spe->mag != 0.0 ? spe->mag : 1.0; /* inverse magnify */
+ q += strlen("true");
+ }
+ for (k = 0; ukeys[k] && strcmp(ukeys[k], q); k++);
+ switch (k) {
+ case K_UNIT__PT: u *= 72.0 / 72.27; break;
+ case K_UNIT__IN: u *= 72.0; break;
+ case K_UNIT__CM: u *= 72.0 / 2.54 ; break;
+ case K_UNIT__MM: u *= 72.0 / 25.4 ; break;
+ case K_UNIT__BP: u *= 1.0 ; break;
+ default:
+ spc_warn(spe, "Unknown unit of measure: %s", q);
+ error = -1;
+ break;
+ }
+ RELEASE(q);
+ }
+
+ *vp = v * u;
+ return error;
+}
+
+
+/*
+ * Compute a transformation matrix
+ * transformations are applied in the following
+ * order: scaling, rotate, displacement.
+ */
+static void
+make_transmatrix (pdf_tmatrix *M,
+ double xoffset, double yoffset,
+ double xscale, double yscale,
+ double rotate)
+{
+ double c, s;
+
+ c = cos(rotate);
+ s = sin(rotate);
+
+ M->a = xscale * c; M->b = xscale * s;
+ M->c = -yscale * s; M->d = yscale * c;
+ M->e = xoffset; M->f = yoffset;
+}
+
+static int
+spc_read_dimtrns_dvips (struct spc_env *spe, transform_info *t, struct spc_arg *ap)
+{
+ static const char *_dtkeys[] = {
+#define K_TRN__HOFFSET 0
+#define K_TRN__VOFFSET 1
+ "hoffset", "voffset",
+#define K_DIM__HSIZE 2
+#define K_DIM__VSIZE 3
+ "hsize", "vsize",
+#define K_TRN__HSCALE 4
+#define K_TRN__VSCALE 5
+ "hscale", "vscale",
+#define K_TRN__ANGLE 6
+ "angle",
+#define K__CLIP 7
+ "clip",
+#define K_DIM__LLX 8
+#define K_DIM__LLY 9
+#define K_DIM__URX 10
+#define K_DIM__URY 11
+ "llx", "lly", "urx", "ury",
+#define K_DIM__RWI 12
+#define K_DIM__RHI 13
+ "rwi", "rhi",
+ NULL
+ };
+ double xoffset, yoffset, xscale, yscale, rotate;
+ int error = 0;
+
+ xoffset = yoffset = rotate = 0.0; xscale = yscale = 1.0;
+
+ skip_blank(&ap->curptr, ap->endptr);
+ while (!error && ap->curptr < ap->endptr) {
+ char *kp, *vp;
+ int k;
+
+ kp = parse_c_ident(&ap->curptr, ap->endptr);
+ if (!kp)
+ break;
+
+ for (k = 0; _dtkeys[k] && strcmp(kp, _dtkeys[k]); k++);
+ if (!_dtkeys[k]) {
+ spc_warn(spe, "Unrecognized dimension/transformation key: %s", kp);
+ error = -1;
+ RELEASE(kp);
+ break;
+ }
+
+ skip_blank(&ap->curptr, ap->endptr);
+ if (k == K__CLIP) {
+ t->flags |= INFO_DO_CLIP;
+ RELEASE(kp);
+ continue; /* not key-value */
+ }
+
+ if (ap->curptr < ap->endptr && ap->curptr[0] == '=') {
+ ap->curptr++;
+ skip_blank(&ap->curptr, ap->endptr);
+ }
+
+ vp = NULL;
+ if (ap->curptr[0] == '\'' || ap->curptr[0] == '\"') {
+ char qchr = ap->curptr[0];
+ ap->curptr++;
+ skip_blank(&ap->curptr, ap->endptr);
+ vp = parse_float_decimal(&ap->curptr, ap->endptr);
+ skip_blank(&ap->curptr, ap->endptr);
+ if (vp && qchr != ap->curptr[0]) {
+ spc_warn(spe, "Syntax error in dimension/transformation specification.");
+ error = -1;
+ RELEASE(vp); vp = NULL;
+ }
+ ap->curptr++;
+ } else {
+ vp = parse_float_decimal(&ap->curptr, ap->endptr);
+ }
+ if (!error && !vp) {
+ spc_warn(spe, "Missing value for dimension/transformation: %s", kp);
+ error = -1;
+ }
+
+ if (!vp || error) {
+ RELEASE(kp);
+ break;
+ }
+
+ switch (k) {
+ case K_TRN__HOFFSET:
+ xoffset = atof(vp);
+ break;
+ case K_TRN__VOFFSET:
+ yoffset = atof(vp);
+ break;
+ case K_DIM__HSIZE:
+ t->width = atof(vp);
+ t->flags |= INFO_HAS_WIDTH;
+ break;
+ case K_DIM__VSIZE:
+ t->height = atof(vp);
+ t->flags |= INFO_HAS_HEIGHT;
+ break;
+ case K_TRN__HSCALE:
+ xscale = atof(vp) / 100.0;
+ break;
+ case K_TRN__VSCALE:
+ yscale = atof(vp) / 100.0;
+ break;
+ case K_TRN__ANGLE:
+ rotate = M_PI * atof(vp) / 180.0;
+ break;
+ case K_DIM__LLX:
+ t->bbox.llx = atof(vp);
+ t->flags |= INFO_HAS_USER_BBOX;
+ break;
+ case K_DIM__LLY:
+ t->bbox.lly = atof(vp);
+ t->flags |= INFO_HAS_USER_BBOX;
+ break;
+ case K_DIM__URX:
+ t->bbox.urx = atof(vp);
+ t->flags |= INFO_HAS_USER_BBOX;
+ break;
+ case K_DIM__URY:
+ t->bbox.ury = atof(vp);
+ t->flags |= INFO_HAS_USER_BBOX;
+ break;
+ case K_DIM__RWI:
+ t->width = atof(vp) / 10.0;
+ t->flags |= INFO_HAS_WIDTH;
+ break;
+ case K_DIM__RHI:
+ t->height = atof(vp) / 10.0;
+ t->flags |= INFO_HAS_HEIGHT;
+ break;
+ }
+ skip_blank(&ap->curptr, ap->endptr);
+ RELEASE(vp);
+ }
+ make_transmatrix(&(t->matrix), xoffset, yoffset, xscale, yscale, rotate);
+
+ return error;
+}
+
+
+static int
+spc_read_dimtrns_pdfm (struct spc_env *spe, transform_info *p, struct spc_arg *ap)
+{
+ int has_scale, has_xscale, has_yscale, has_rotate, has_matrix;
+ const char *_dtkeys[] = {
+#define K_DIM__WIDTH 0
+#define K_DIM__HEIGHT 1
+#define K_DIM__DEPTH 2
+ "width", "height", "depth",
+#define K_TRN__SCALE 3
+#define K_TRN__XSCALE 4
+#define K_TRN__YSCALE 5
+#define K_TRN__ROTATE 6
+ "scale", "xscale", "yscale", "rotate",
+#define K_TRN__BBOX 7
+ "bbox", /* See "Dvipdfmx User's Manual", p.5 */
+#define K_TRN__MATRIX 8
+ "matrix",
+ NULL
+ };
+ double xscale, yscale, rotate;
+ int error = 0;
+
+ has_xscale = has_yscale = has_scale = has_rotate = has_matrix = 0;
+ xscale = yscale = 1.0; rotate = 0.0;
+
+ skip_blank(&ap->curptr, ap->endptr);
+
+ while (!error && ap->curptr < ap->endptr) {
+ char *kp, *vp;
+ int k;
+
+ kp = parse_c_ident(&ap->curptr, ap->endptr);
+ if (!kp)
+ break;
+
+ skip_blank(&ap->curptr, ap->endptr);
+ for (k = 0; _dtkeys[k] && strcmp(_dtkeys[k], kp); k++);
+ switch (k) {
+ case K_DIM__WIDTH:
+ error = spc_util_read_length(spe, &p->width , ap);
+ p->flags |= INFO_HAS_WIDTH;
+ break;
+ case K_DIM__HEIGHT:
+ error = spc_util_read_length(spe, &p->height, ap);
+ p->flags |= INFO_HAS_HEIGHT;
+ break;
+ case K_DIM__DEPTH:
+ error = spc_util_read_length(spe, &p->depth , ap);
+ p->flags |= INFO_HAS_HEIGHT;
+ break;
+ case K_TRN__SCALE:
+ vp = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!vp)
+ error = -1;
+ else {
+ xscale = yscale = atof(vp);
+ has_scale = 1;
+ RELEASE(vp);
+ }
+ break;
+ case K_TRN__XSCALE:
+ vp = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!vp)
+ error = -1;
+ else {
+ xscale = atof(vp);
+ has_xscale = 1;
+ RELEASE(vp);
+ }
+ break;
+ case K_TRN__YSCALE:
+ vp = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!vp)
+ error = -1;
+ else {
+ yscale = atof(vp);
+ has_yscale = 1;
+ RELEASE(vp);
+ }
+ break;
+ case K_TRN__ROTATE:
+ vp = parse_float_decimal(&ap->curptr, ap->endptr);
+ if (!vp)
+ error = -1;
+ else {
+ rotate = M_PI * atof(vp) / 180.0;
+ has_rotate = 1;
+ RELEASE(vp);
+ }
+ break;
+ case K_TRN__BBOX:
+ {
+ double v[4];
+ if (spc_util_read_numbers(v, 4, spe, ap) != 4)
+ error = -1;
+ else {
+ p->bbox.llx = v[0];
+ p->bbox.lly = v[1];
+ p->bbox.urx = v[2];
+ p->bbox.ury = v[3];
+ p->flags |= INFO_HAS_USER_BBOX;
+ p->flags |= INFO_DO_CLIP; /* always clip */
+ }
+ }
+ break;
+ case K_TRN__MATRIX:
+ {
+ double v[6];
+ if (spc_util_read_numbers(v, 6, spe, ap) != 6)
+ error = -1;
+ else {
+ pdf_setmatrix(&(p->matrix), v[0], v[1], v[2], v[3], v[4], v[5]);
+ has_matrix = 1;
+ }
+ }
+ break;
+ default:
+ error = -1;
+ break;
+ }
+ if (error)
+ spc_warn(spe, "Unrecognized key or invalid value for dimension/transformation: %s", kp);
+ else
+ skip_blank(&ap->curptr, ap->endptr);
+ RELEASE(kp);
+ }
+
+ if (!error) {
+ /* Check consistency */
+ if (has_xscale && (p->flags & INFO_HAS_WIDTH)) {
+ spc_warn(spe, "Can't supply both width and xscale. Ignore xscale.");
+ xscale = 1.0;
+ } else if (has_yscale &&
+ (p->flags & INFO_HAS_HEIGHT)) {
+ spc_warn(spe, "Can't supply both height/depth and yscale. Ignore yscale.");
+ yscale = 1.0;
+ } else if (has_scale &&
+ (has_xscale || has_yscale)) {
+ spc_warn(spe, "Can't supply overall scale along with axis scales.");
+ error = -1;
+ } else if (has_matrix &&
+ (has_scale || has_xscale || has_yscale || has_rotate)) {
+ spc_warn(spe, "Can't supply transform matrix along with scales or rotate. Ignore scales and rotate.");
+ }
+ }
+
+ if (!has_matrix) {
+ make_transmatrix(&(p->matrix), 0.0, 0.0, xscale, yscale, rotate);
+ }
+
+ return error;
+}
+
+int
+spc_util_read_dimtrns (struct spc_env *spe, transform_info *ti, struct spc_arg *args, int syntax)
+{
+ ASSERT(ti && spe && args);
+
+ if (syntax) {
+ return spc_read_dimtrns_dvips(spe, ti, args);
+ } else {
+ return spc_read_dimtrns_pdfm (spe, ti, args);
+ }
+
+ return -1;
+}
+
+
+/* Color names */
+#ifdef rgb
+#undef rgb
+#endif
+#ifdef cmyk
+#undef cmyk
+#endif
+#define rgb8(r,g,b) {3, {((r)/255.0), ((g)/255.0), ((b)/255.0), 0.0}}
+#define cmyk(c,m,y,k) {4, {(c), (m), (y), (k)}}
+
+static struct colordef_
+{
+ const char *key;
+ pdf_color color;
+} colordefs[] = {
+ {"GreenYellow", cmyk(0.15, 0.00, 0.69, 0.00)},
+ {"Yellow", cmyk(0.00, 0.00, 1.00, 0.00)},
+ {"Goldenrod", cmyk(0.00, 0.10, 0.84, 0.00)},
+ {"Dandelion", cmyk(0.00, 0.29, 0.84, 0.00)},
+ {"Apricot", cmyk(0.00, 0.32, 0.52, 0.00)},
+ {"Peach", cmyk(0.00, 0.50, 0.70, 0.00)},
+ {"Melon", cmyk(0.00, 0.46, 0.50, 0.00)},
+ {"YellowOrange", cmyk(0.00, 0.42, 1.00, 0.00)},
+ {"Orange", cmyk(0.00, 0.61, 0.87, 0.00)},
+ {"BurntOrange", cmyk(0.00, 0.51, 1.00, 0.00)},
+ {"Bittersweet", cmyk(0.00, 0.75, 1.00, 0.24)},
+ {"RedOrange", cmyk(0.00, 0.77, 0.87, 0.00)},
+ {"Mahogany", cmyk(0.00, 0.85, 0.87, 0.35)},
+ {"Maroon", cmyk(0.00, 0.87, 0.68, 0.32)},
+ {"BrickRed", cmyk(0.00, 0.89, 0.94, 0.28)},
+ {"Red", cmyk(0.00, 1.00, 1.00, 0.00)},
+ {"OrangeRed", cmyk(0.00, 1.00, 0.50, 0.00)},
+ {"RubineRed", cmyk(0.00, 1.00, 0.13, 0.00)},
+ {"WildStrawberry", cmyk(0.00, 0.96, 0.39, 0.00)},
+ {"Salmon", cmyk(0.00, 0.53, 0.38, 0.00)},
+ {"CarnationPink", cmyk(0.00, 0.63, 0.00, 0.00)},
+ {"Magenta", cmyk(0.00, 1.00, 0.00, 0.00)},
+ {"VioletRed", cmyk(0.00, 0.81, 0.00, 0.00)},
+ {"Rhodamine", cmyk(0.00, 0.82, 0.00, 0.00)},
+ {"Mulberry", cmyk(0.34, 0.90, 0.00, 0.02)},
+ {"RedViolet", cmyk(0.07, 0.90, 0.00, 0.34)},
+ {"Fuchsia", cmyk(0.47, 0.91, 0.00, 0.08)},
+ {"Lavender", cmyk(0.00, 0.48, 0.00, 0.00)},
+ {"Thistle", cmyk(0.12, 0.59, 0.00, 0.00)},
+ {"Orchid", cmyk(0.32, 0.64, 0.00, 0.00)},
+ {"DarkOrchid", cmyk(0.40, 0.80, 0.20, 0.00)},
+ {"Purple", cmyk(0.45, 0.86, 0.00, 0.00)},
+ {"Plum", cmyk(0.50, 1.00, 0.00, 0.00)},
+ {"Violet", cmyk(0.79, 0.88, 0.00, 0.00)},
+ {"RoyalPurple", cmyk(0.75, 0.90, 0.00, 0.00)},
+ {"BlueViolet", cmyk(0.86, 0.91, 0.00, 0.04)},
+ {"Periwinkle", cmyk(0.57, 0.55, 0.00, 0.00)},
+ {"CadetBlue", cmyk(0.62, 0.57, 0.23, 0.00)},
+ {"CornflowerBlue", cmyk(0.65, 0.13, 0.00, 0.00)},
+ {"MidnightBlue", cmyk(0.98, 0.13, 0.00, 0.43)},
+ {"NavyBlue", cmyk(0.94, 0.54, 0.00, 0.00)},
+ {"RoyalBlue", cmyk(1.00, 0.50, 0.00, 0.00)},
+ {"Blue", cmyk(1.00, 1.00, 0.00, 0.00)},
+ {"Cerulean", cmyk(0.94, 0.11, 0.00, 0.00)},
+ {"Cyan", cmyk(1.00, 0.00, 0.00, 0.00)},
+ {"ProcessBlue", cmyk(0.96, 0.00, 0.00, 0.00)},
+ {"SkyBlue", cmyk(0.62, 0.00, 0.12, 0.00)},
+ {"Turquoise", cmyk(0.85, 0.00, 0.20, 0.00)},
+ {"TealBlue", cmyk(0.86, 0.00, 0.34, 0.02)},
+ {"Aquamarine", cmyk(0.82, 0.00, 0.30, 0.00)},
+ {"BlueGreen", cmyk(0.85, 0.00, 0.33, 0.00)},
+ {"Emerald", cmyk(1.00, 0.00, 0.50, 0.00)},
+ {"JungleGreen", cmyk(0.99, 0.00, 0.52, 0.00)},
+ {"SeaGreen", cmyk(0.69, 0.00, 0.50, 0.00)},
+ {"Green", cmyk(1.00, 0.00, 1.00, 0.00)},
+ {"ForestGreen", cmyk(0.91, 0.00, 0.88, 0.12)},
+ {"PineGreen", cmyk(0.92, 0.00, 0.59, 0.25)},
+ {"LimeGreen", cmyk(0.50, 0.00, 1.00, 0.00)},
+ {"YellowGreen", cmyk(0.44, 0.00, 0.74, 0.00)},
+ {"SpringGreen", cmyk(0.26, 0.00, 0.76, 0.00)},
+ {"OliveGreen", cmyk(0.64, 0.00, 0.95, 0.40)},
+ {"RawSienna", cmyk(0.00, 0.72, 1.00, 0.45)},
+ {"Sepia", cmyk(0.00, 0.83, 1.00, 0.70)},
+ {"Brown", cmyk(0.00, 0.81, 1.00, 0.60)},
+ {"Tan", cmyk(0.14, 0.42, 0.56, 0.00)},
+ {"Gray", cmyk(0.00, 0.00, 0.00, 0.50)},
+ {"Black", cmyk(0.00, 0.00, 0.00, 1.00)},
+ {"White", cmyk(0.00, 0.00, 0.00, 0.00)},
+ {NULL}
+};
+
+
+static int
+pdf_color_namedcolor (pdf_color *color, const char *name)
+{
+ int i;
+ for (i = 0; colordefs[i].key; i++) {
+ if (!strcmp(colordefs[i].key, name)) {
+ pdf_color_copycolor(color, &colordefs[i].color);
+ return 0;
+ }
+ }
+ return -1;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_util.h b/Build/source/texk/xdvipdfmx/src/spc_util.h
new file mode 100644
index 00000000000..1c0bbc01119
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_util.h
@@ -0,0 +1,44 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/spc_util.h,v 1.4 2005/07/30 11:44:18 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_UTIL_H_
+#define _SPC_UTIL_H_
+
+#include "pdfcolor.h"
+#include "pdfdev.h"
+
+#include "specials.h"
+
+/* syntax 1: ((rgb|cmyk|hsb|gray) colorvalues)|colorname
+ * syntax 0: pdf_number|pdf_array
+ *
+ * This is for reading *single* color specification.
+ */
+extern int spc_util_read_colorspec (struct spc_env *spe, pdf_color *colorspec, struct spc_arg *args, int syntax);
+extern int spc_util_read_dimtrns (struct spc_env *spe, transform_info *dimtrns, struct spc_arg *args, int syntax);
+extern int spc_util_read_length (struct spc_env *spe, double *length, struct spc_arg *ap);
+
+extern int spc_util_read_numbers (double *values, int num_values, struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_UTIL_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/spc_xtx.c b/Build/source/texk/xdvipdfmx/src/spc_xtx.c
new file mode 100644
index 00000000000..8a7c4495d31
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_xtx.c
@@ -0,0 +1,377 @@
+/*
+ This is xdvipdfmx, an extended version of dvipdfmx,
+ an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (c) 2006 SIL International
+ Written by Jonathan Kew
+
+ This file based on spc_pdfm.c, part of the dvipdfmx project:
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include <math.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "mfileio.h"
+
+#include "numbers.h"
+
+#include "fontmap.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+#include "pdfparse.h"
+
+#include "pdfdoc.h"
+
+#include "pdfdraw.h"
+#include "pdfcolor.h"
+#include "pdfdev.h"
+
+#include "specials.h"
+
+#include "spc_util.h"
+#include "spc_xtx.h"
+
+
+int
+spc_xtx_at_begin_document (void)
+{
+ return 0;
+}
+
+int
+spc_xtx_at_end_document (void)
+{
+ return 0;
+}
+
+int
+spc_xtx_at_begin_page (void)
+{
+ return 0;
+}
+
+int
+spc_xtx_at_end_page (void)
+{
+ return 0;
+}
+
+static int
+spc_handler_xtx_scale (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_tmatrix M = { 0, 0, 0, 0, 0, 0 };
+ double values[2];
+
+ if (spc_util_read_numbers(&values[0], 2, spe, args) < 2) {
+ return -1;
+ }
+
+ /* Create transformation matrix */
+ M.a = values[0];
+ M.d = values[1];
+ M.e = ((1.0 - M.a) * spe->x_user - M.c * spe->y_user);
+ M.f = ((1.0 - M.d) * spe->y_user - M.b * spe->x_user);
+
+ pdf_dev_concat(&M);
+
+ return 0;
+}
+
+static int
+spc_handler_xtx_rotate (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_tmatrix M = { 0, 0, 0, 0, 0, 0 };
+ double value;
+
+ if (spc_util_read_numbers(&value, 1, spe, args) < 1) {
+ return -1;
+ }
+
+ /* Create transformation matrix */
+ M.a = cos(value * M_PI / 180);
+ M.b = sin(value * M_PI / 180);
+ M.c = -M.b;
+ M.d = M.a;
+ M.e = ((1.0 - M.a) * spe->x_user - M.c * spe->y_user);
+ M.f = ((1.0 - M.d) * spe->y_user - M.b * spe->x_user);
+
+ pdf_dev_concat(&M);
+
+ return 0;
+}
+
+static int
+spc_handler_xtx_gsave (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_dev_gsave();
+
+ return 0;
+}
+
+static int
+spc_handler_xtx_grestore (struct spc_env *spe, struct spc_arg *args)
+{
+ pdf_dev_grestore();
+
+ /*
+ * Unfortunately, the following line is necessary in case
+ * of a font or color change inside of the save/restore pair.
+ * Anything that was done there must be redone, so in effect,
+ * we make no assumptions about what fonts. We act like we are
+ * starting a new page.
+ */
+ pdf_dev_reset();
+
+ return 0;
+}
+
+/* Please remove this.
+ * This should be handled before processing pages!
+ */
+static int
+spc_handler_xtx_papersize (struct spc_env *spe, struct spc_arg *args)
+{
+ return 0;
+}
+
+static int
+spc_handler_xtx_backgroundcolor (struct spc_env *spe, struct spc_arg *args)
+{
+ int error;
+ pdf_color colorspec;
+
+ error = spc_util_read_colorspec(spe, &colorspec, args, 0);
+ if (error)
+ spc_warn(spe, "No valid color specified?");
+ else {
+ pdf_doc_set_bgcolor(&colorspec);
+ }
+
+ return error;
+}
+
+/* FIXME: xdv2pdf's x:fontmapline and x:fontmapfile may have slightly different syntax/semantics */
+static int
+spc_handler_xtx_fontmapline (struct spc_env *spe, struct spc_arg *ap)
+{
+ fontmap_rec *mrec;
+ char *map_name, opchr;
+ int error = 0;
+
+ skip_white(&ap->curptr, ap->endptr);
+ if (ap->curptr >= ap->endptr) {
+ spc_warn(spe, "Empty fontmapline special?");
+ return -1;
+ }
+
+ opchr = ap->curptr[0];
+ if (opchr == '-' || opchr == '+')
+ ap->curptr++;
+
+ skip_white(&ap->curptr, ap->endptr);
+
+ switch (opchr) {
+ case '-':
+ map_name = parse_ident(&ap->curptr, ap->endptr);
+ if (map_name) {
+ pdf_remove_fontmap_record(map_name);
+ RELEASE(map_name);
+ } else {
+ spc_warn(spe, "Invalid fontmap line: Missing TFM name.");
+ error = -1;
+ }
+ break;
+ case '+':
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr));
+ if (error)
+ spc_warn(spe, "Invalid fontmap line.");
+ else {
+ pdf_append_fontmap_record(mrec->map_name, mrec);
+ }
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+ break;
+ default:
+ mrec = NEW(1, fontmap_rec);
+ pdf_init_fontmap_record(mrec);
+ error = pdf_read_fontmap_line(mrec, ap->curptr, (long) (ap->endptr - ap->curptr));
+ if (error)
+ spc_warn(spe, "Invalid fontmap line.");
+ else {
+ pdf_insert_fontmap_record(mrec->map_name, mrec);
+ }
+ pdf_clear_fontmap_record(mrec);
+ RELEASE(mrec);
+ break;
+ }
+ if (!error)
+ ap->curptr = ap->endptr;
+
+ return 0;
+}
+
+static int
+spc_handler_xtx_fontmapfile (struct spc_env *spe, struct spc_arg *args)
+{
+ char *mapfile;
+ int mode, error = 0;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr >= args->endptr)
+ return 0;
+
+ switch (args->curptr[0]) {
+ case '-':
+ mode = FONTMAP_RMODE_REMOVE;
+ args->curptr++;
+ break;
+ case '+':
+ mode = FONTMAP_RMODE_APPEND;
+ args->curptr++;
+ break;
+ default:
+ mode = FONTMAP_RMODE_REPLACE;
+ break;
+ }
+
+ mapfile = parse_val_ident(&args->curptr, args->endptr);
+ if (!mapfile) {
+ spc_warn(spe, "No fontmap file specified.");
+ return -1;
+ } else {
+ error = pdf_load_fontmap_file(mapfile, mode);
+ }
+
+ return error;
+}
+
+static int
+spc_handler_xtx_unsupportedcolor (struct spc_env *spe, struct spc_arg *args)
+{
+ spc_warn(spe, "xetex-style \\special{x:%s} is not supported by this driver;\n"
+ "update document or driver to use \\special{color} instead.", args->command);
+
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+static int
+spc_handler_xtx_unsupported (struct spc_env *spe, struct spc_arg *args)
+{
+ spc_warn(spe, "xetex-style \\special{x:%s} is not supported by this driver.", args->command);
+
+ args->curptr = args->endptr;
+
+ return 0;
+}
+
+static struct spc_handler xtx_handlers[] = {
+ {"textcolor", spc_handler_xtx_unsupportedcolor},
+ {"textcolorpush", spc_handler_xtx_unsupportedcolor},
+ {"textcolorpop", spc_handler_xtx_unsupportedcolor},
+
+ {"rulecolor", spc_handler_xtx_unsupportedcolor},
+ {"rulecolorpush", spc_handler_xtx_unsupportedcolor},
+ {"rulecolorpop", spc_handler_xtx_unsupportedcolor},
+
+ {"papersize", spc_handler_xtx_papersize},
+ {"backgroundcolor", spc_handler_xtx_backgroundcolor},
+
+ {"gsave", spc_handler_xtx_gsave},
+ {"grestore", spc_handler_xtx_grestore},
+
+ {"scale", spc_handler_xtx_scale},
+ {"rotate", spc_handler_xtx_rotate},
+
+ {"fontmapline", spc_handler_xtx_fontmapline},
+ {"fontmapfile", spc_handler_xtx_fontmapfile},
+
+ {"shadow", spc_handler_xtx_unsupported},
+ {"colorshadow", spc_handler_xtx_unsupported},
+};
+
+int
+spc_xtx_check_special (const char *buf, long len)
+{
+ int r = 0;
+ char *p, *endptr;
+
+ p = (char *) buf;
+ endptr = p + len;
+
+ skip_white(&p, endptr);
+ if (p + strlen("x:") <= endptr &&
+ !memcmp(p, "x:", strlen("x:"))) {
+ r = 1;
+ }
+
+ return r;
+}
+
+int
+spc_xtx_setup_handler (struct spc_handler *sph,
+ struct spc_env *spe, struct spc_arg *ap)
+{
+ int error = -1, i;
+ char *q;
+
+ ASSERT(sph && spe && ap);
+
+ skip_white(&ap->curptr, ap->endptr);
+ if (ap->curptr + strlen("x:") >= ap->endptr ||
+ memcmp(ap->curptr, "x:", strlen("x:"))) {
+ spc_warn(spe, "Not x: special???");
+ return -1;
+ }
+ ap->curptr += strlen("x:");
+
+ skip_white(&ap->curptr, ap->endptr);
+ q = parse_c_ident(&ap->curptr, ap->endptr);
+ if (q) {
+ for (i = 0;
+ i < sizeof(xtx_handlers) / sizeof(struct spc_handler); i++) {
+ if (!strcmp(q, xtx_handlers[i].key)) {
+ ap->command = (char *) xtx_handlers[i].key;
+ sph->key = (char *) "x:";
+ sph->exec = xtx_handlers[i].exec;
+ skip_white(&ap->curptr, ap->endptr);
+ error = 0;
+ break;
+ }
+ }
+ RELEASE(q);
+ }
+
+ return error;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/spc_xtx.h b/Build/source/texk/xdvipdfmx/src/spc_xtx.h
new file mode 100644
index 00000000000..c47ce06cf63
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/spc_xtx.h
@@ -0,0 +1,42 @@
+/*
+ This is xdvipdfmx, an extended version of dvipdfmx,
+ an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (c) 2006 SIL International
+ Written by Jonathan Kew
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPC_XTX_H_
+#define _SPC_XTX_H_
+
+#include "specials.h"
+
+extern int spc_xtx_at_begin_page (void);
+extern int spc_xtx_at_end_page (void);
+extern int spc_xtx_at_begin_document (void);
+extern int spc_xtx_at_end_document (void);
+
+extern int spc_xtx_check_special (const char *buffer, long size);
+extern int spc_xtx_setup_handler (struct spc_handler *handle,
+ struct spc_env *spe, struct spc_arg *args);
+
+#endif /* _SPC_XTX_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/specials.c b/Build/source/texk/xdvipdfmx/src/specials.c
new file mode 100644
index 00000000000..ca8d3beeb1e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/specials.c
@@ -0,0 +1,605 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/specials.c,v 1.9 2005/08/15 16:40:10 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdarg.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "numbers.h"
+
+#include "dvi.h"
+
+#include "pdfobj.h"
+#include "pdfparse.h"
+#include "pdfdoc.h"
+#include "pdfnames.h"
+
+#include "pdfdraw.h"
+#include "pdfdev.h"
+
+#include "spc_pdfm.h"
+#include "spc_tpic.h"
+#include "spc_html.h"
+#include "spc_misc.h"
+#include "spc_color.h"
+#include "spc_dvips.h"
+#include "spc_xtx.h"
+
+#include "specials.h"
+
+static int verbose = 0;
+void
+spc_set_verbose (void)
+{
+ verbose++;
+}
+
+
+void
+spc_warn (struct spc_env *spe, const char *fmt, ...)
+{
+ va_list ap;
+ static char buf[1024];
+
+ va_start(ap, fmt);
+
+ vsprintf(buf, fmt, ap);
+ WARN(buf);
+
+ va_end(ap);
+
+ return;
+}
+
+
+/* This is currently just to make other spc_xxx to not directly
+ * call dvi_xxx.
+ */
+int
+spc_begin_annot (struct spc_env *spe, pdf_obj *dict)
+{
+ pdf_doc_begin_annot(dict);
+ dvi_tag_depth(); /* Tell dvi interpreter to handle line-break. */
+ return 0;
+}
+
+int
+spc_end_annot (struct spc_env *spe)
+{
+ dvi_untag_depth();
+ pdf_doc_end_annot();
+ return 0;
+}
+
+int
+spc_resume_annot (struct spc_env *spe)
+{
+ dvi_link_annot(1);
+ return 0;
+}
+
+int
+spc_suspend_annot (struct spc_env *spe)
+{
+ dvi_link_annot(0);
+ return 0;
+}
+
+
+
+static struct ht_table *named_objects = NULL;
+
+/* reserved keys */
+static const char *_rkeys[] = {
+#define K_OBJ__XPOS 0
+#define K_OBJ__YPOS 1
+ "xpos", "ypos",
+#define K_OBJ__THISPAGE 2
+#define K_OBJ__PREVPAGE 3
+#define K_OBJ__NEXTPAGE 4
+ "thispage", "prevpage", "nextpage",
+#define K_OBJ__RESOURCES 5
+ "resources",
+#define K_OBJ__PAGES 6
+#define K_OBJ__NAMES 7
+ "pages", "names",
+#define K_OBJ__CATALOG 8
+#define K_OBJ__DOCINFO 9
+ "catalog", "docinfo",
+#if 0
+#define K_OBJ__TRAILER 10
+ "trailer",
+#endif /* NYI */
+ NULL
+};
+
+/* pageN where N is a positive integer.
+ * Note that page need not exist at this time.
+ */
+static int
+ispageref (const char *key)
+{
+ const char *p;
+ if (strlen(key) <= strlen("page") ||
+ memcmp(key, "page", strlen("page")))
+ return 0;
+ else {
+ for (p = key + 4; *p && *p >= '0' && *p <= '9'; p++);
+ if (*p != '\0')
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ * The following routine returns copies, not the original object.
+ */
+pdf_obj *
+spc_lookup_reference (const char *key)
+{
+ pdf_obj *value = NULL;
+ pdf_coord cp;
+ int k;
+
+ ASSERT(named_objects);
+
+ if (!key)
+ return NULL;
+
+ for (k = 0; _rkeys[k] && strcmp(key, _rkeys[k]); k++);
+ 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;
+ 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();
+ pdf_dev_transform(&cp, NULL);
+ value = pdf_new_number(ROUND(cp.y, .01));
+ break;
+ case K_OBJ__THISPAGE:
+ value = pdf_doc_this_page_ref();
+ break;
+ case K_OBJ__PREVPAGE:
+ value = pdf_doc_prev_page_ref();
+ break;
+ case K_OBJ__NEXTPAGE:
+ value = pdf_doc_next_page_ref();
+ break;
+ case K_OBJ__PAGES:
+ value = pdf_ref_obj(pdf_doc_page_tree());
+ break;
+ case K_OBJ__NAMES:
+ value = pdf_ref_obj(pdf_doc_names());
+ break;
+ case K_OBJ__RESOURCES:
+ value = pdf_ref_obj(pdf_doc_current_page_resources());
+ break;
+ case K_OBJ__CATALOG:
+ value = pdf_ref_obj(pdf_doc_catalog());
+ break;
+ case K_OBJ__DOCINFO:
+ value = pdf_ref_obj(pdf_doc_docinfo());
+ break;
+ default:
+ if (ispageref(key))
+ value = pdf_doc_ref_page(atoi(key + 4));
+ else {
+ value = pdf_names_lookup_reference(named_objects, key, strlen(key));
+ }
+ break;
+ }
+
+ if (!value) {
+ ERROR("Object reference %s not exist.", key);
+ }
+
+ return value;
+}
+
+pdf_obj *
+spc_lookup_object (const char *key)
+{
+ pdf_obj *value = NULL;
+ pdf_coord cp;
+ int k;
+
+ ASSERT(named_objects);
+
+ if (!key)
+ return NULL;
+
+ 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;
+ 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();
+ pdf_dev_transform(&cp, NULL);
+ value = pdf_new_number(ROUND(cp.y, .01));
+ break;
+ case K_OBJ__THISPAGE:
+ value = pdf_doc_this_page();
+ break;
+ case K_OBJ__PAGES:
+ value = pdf_doc_page_tree();
+ break;
+ case K_OBJ__NAMES:
+ value = pdf_doc_names();
+ break;
+ case K_OBJ__RESOURCES:
+ value = pdf_doc_current_page_resources();
+ break;
+ case K_OBJ__CATALOG:
+ value = pdf_doc_catalog();
+ break;
+ case K_OBJ__DOCINFO:
+ value = pdf_doc_docinfo();
+ break;
+ default:
+ value = pdf_names_lookup_object(named_objects, key, strlen(key));
+ break;
+ }
+
+/* spc_handler_pdfm_bead() in spc_pdfm.c controls NULL too.
+ if (!value) {
+ ERROR("Object reference %s not exist.", key);
+ }
+*/
+
+ return value;
+}
+
+void
+spc_push_object (const char *key, pdf_obj *value)
+{
+ int error = 0;
+
+ if (!key || !value)
+ return;
+
+ if (PDF_OBJ_INDIRECTTYPE(value)) {
+ pdf_names_add_reference(named_objects,
+ key, strlen(key), value);
+ } else {
+ error = pdf_names_add_object(named_objects,
+ key, strlen(key), value);
+ if (!error) {
+ /* _FIXME_:
+ * Objects created by pdf:obj must always
+ * be written to output regardless of if
+ * they are actually used in document.
+ */
+ pdf_obj *obj_ref = pdf_names_lookup_reference(named_objects,
+ key, strlen(key));
+ if (obj_ref)
+ pdf_release_obj(obj_ref);
+ }
+ }
+
+ return;
+}
+
+void
+spc_flush_object (const char *key)
+{
+ pdf_names_close_object(named_objects, key, strlen(key));
+}
+
+void
+spc_clear_objects (void)
+{
+ pdf_delete_name_tree(&named_objects);
+ named_objects = pdf_new_name_tree();
+}
+
+
+static int
+spc_handler_unknown (struct spc_env *spe,
+ struct spc_arg *args)
+{
+ ASSERT(spe && args);
+
+ args->curptr = args->endptr;
+
+ return -1;
+}
+
+static void
+init_special (struct spc_handler *special,
+ struct spc_env *spe,
+ struct spc_arg *args,
+ const char *p, long size,
+ double x_user, double y_user, double mag)
+{
+
+ special->key = NULL;
+ special->exec = (spc_handler_fn_ptr) &spc_handler_unknown;
+
+ spe->x_user = x_user;
+ spe->y_user = y_user;
+ spe->mag = mag;
+ spe->pg = pdf_doc_current_page_number(); /* _FIXME_ */
+
+ args->curptr = (char *) p;
+ args->endptr = args->curptr + size;
+ args->base = args->curptr;
+
+ return;
+}
+
+static void
+check_garbage (struct spc_arg *args)
+{
+ ASSERT(args);
+
+ if (args->curptr >= args->endptr)
+ return;
+
+ skip_white(&args->curptr, args->endptr);
+ if (args->curptr < args->endptr) {
+ WARN("Unparsed material at end of special ignored.");
+ dump(args->curptr, args->endptr);
+ }
+
+ return;
+}
+
+static struct {
+ const char *key;
+ int (*bodhk_func) ();
+ int (*eodhk_func) ();
+ int (*bophk_func) ();
+ int (*eophk_func) ();
+ int (*check_func) (const char *, long);
+ int (*setup_func) (struct spc_handler *, struct spc_env *, struct spc_arg *);
+} known_specials[] = {
+
+ {"pdf:",
+ spc_pdfm_at_begin_document,
+ spc_pdfm_at_end_document,
+ spc_pdfm_at_begin_page,
+ spc_pdfm_at_end_page,
+ spc_pdfm_check_special,
+ spc_pdfm_setup_handler
+ },
+
+ {"x:",
+ spc_xtx_at_begin_document,
+ spc_xtx_at_end_document,
+ spc_xtx_at_begin_page,
+ spc_xtx_at_end_page,
+ spc_xtx_check_special,
+ spc_xtx_setup_handler
+ },
+
+ {"ps:",
+ spc_dvips_at_begin_document,
+ spc_dvips_at_end_document,
+ spc_dvips_at_begin_page,
+ spc_dvips_at_end_page,
+ spc_dvips_check_special,
+ spc_dvips_setup_handler
+ },
+
+ {"color",
+ spc_color_at_begin_document,
+ spc_color_at_end_document,
+ spc_color_at_begin_page,
+ spc_color_at_end_page,
+ spc_color_check_special,
+ spc_color_setup_handler
+ },
+
+ {"tpic",
+ spc_tpic_at_begin_document,
+ spc_tpic_at_end_document,
+ spc_tpic_at_begin_page,
+ spc_tpic_at_end_page,
+ spc_tpic_check_special,
+ spc_tpic_setup_handler
+ },
+
+ {"html:",
+ spc_html_at_begin_document,
+ spc_html_at_end_document,
+ spc_html_at_begin_page,
+ spc_html_at_end_page,
+ spc_html_check_special,
+ spc_html_setup_handler
+ },
+
+ {"unknown",
+ spc_misc_at_begin_document,
+ spc_misc_at_end_document,
+ spc_misc_at_begin_page,
+ spc_misc_at_end_page,
+ spc_misc_check_special,
+ spc_misc_setup_handler
+ },
+
+ {NULL} /* end */
+};
+
+int
+spc_exec_at_begin_page (void)
+{
+ int error = 0;
+ int i;
+
+ for (i = 0; known_specials[i].key != NULL; i++) {
+ if (known_specials[i].bophk_func) {
+ error = known_specials[i].bophk_func();
+ }
+ }
+
+ return error;
+}
+
+int
+spc_exec_at_end_page (void)
+{
+ int error = 0;
+ int i;
+
+ for (i = 0; known_specials[i].key != NULL; i++) {
+ if (known_specials[i].eophk_func) {
+ error = known_specials[i].eophk_func();
+ }
+ }
+
+ return error;
+}
+
+int
+spc_exec_at_begin_document (void)
+{
+ int error = 0;
+ int i;
+
+ ASSERT(!named_objects);
+
+ named_objects = pdf_new_name_tree();
+
+ for (i = 0; known_specials[i].key != NULL; i++) {
+ if (known_specials[i].bodhk_func) {
+ error = known_specials[i].bodhk_func();
+ }
+ }
+
+ return error;
+}
+
+int
+spc_exec_at_end_document (void)
+{
+ int error = 0;
+ int i;
+
+ for (i = 0; known_specials[i].key != NULL; i++) {
+ if (known_specials[i].eodhk_func) {
+ error = known_specials[i].eodhk_func();
+ }
+ }
+
+ if (named_objects) {
+ pdf_delete_name_tree(&named_objects);
+ }
+
+ return error;
+}
+
+static void
+print_error (const char *name, struct spc_env *spe, struct spc_arg *ap)
+{
+ char *p, ebuf[64];
+ int i;
+ long pg = spe->pg;
+ pdf_coord c;
+
+ c.x = spe->x_user; c.y = spe->y_user;
+ pdf_dev_transform(&c, NULL);
+
+ WARN("Interpreting special command %s (%s) failed.", ap->command, name);
+ WARN(">> at page=\"%ld\" position=\"(%g, %g)\" (in PDF)", pg, c.x, c.y);
+ for (i = 0, p = ap->base; i < 63 && p < ap->endptr; p++) {
+ if (isprint(*p))
+ ebuf[i++] = *p;
+ else if (i + 4 < 63)
+ i += sprintf(ebuf + i, "\\x%02x", *p);
+ else
+ break;
+ }
+ ebuf[i] = '\0';
+ if (ap->curptr < ap->endptr) {
+ while (i-- > 60)
+ ebuf[i] = '.';
+ }
+ WARN(">> xxx \"%s\"", ebuf);
+
+ if (ap->curptr < ap->endptr) {
+ for (i = 0, p = ap->curptr; i < 63 && p < ap->endptr; p++) {
+ if (isprint(*p))
+ ebuf[i++] = *p;
+ else if (i + 4 < 63)
+ i += sprintf(ebuf + i, "\\x%02x", *p);
+ else
+ break;
+ }
+ ebuf[i] = '\0';
+ if (ap->curptr < ap->endptr) {
+ while (i-- > 60)
+ ebuf[i] = '.';
+ }
+ WARN(">> Reading special command stopped around >>%s<<", ebuf);
+
+ ap->curptr = ap->endptr;
+ }
+}
+
+int
+spc_exec_special (const char *buffer, long size,
+ double x_user, double y_user, double mag)
+{
+ int error = -1;
+ int i, found;
+ struct spc_env spe;
+ struct spc_arg args;
+ struct spc_handler special;
+
+ if (verbose > 3) {
+ dump((char *) buffer, (char *) buffer + size);
+ }
+
+ init_special(&special, &spe, &args, buffer, size, x_user, y_user, mag);
+
+ for (i = 0; known_specials[i].key != NULL; i++) {
+ found = known_specials[i].check_func(buffer, size);
+ if (found) {
+ error = known_specials[i].setup_func(&special, &spe, &args);
+ if (!error) {
+ error = special.exec(&spe, &args);
+ }
+ if (error) {
+ print_error(known_specials[i].key, &spe, &args);
+ }
+ break;
+ }
+ }
+
+ check_garbage(&args);
+
+ return error;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/specials.h b/Build/source/texk/xdvipdfmx/src/specials.h
new file mode 100644
index 00000000000..a52570ae31d
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/specials.h
@@ -0,0 +1,78 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/specials.h,v 1.3 2005/07/31 16:44:42 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SPECIALS_H_
+#define _SPECIALS_H_
+
+struct spc_env {
+ double x_user, y_user;
+ double mag;
+ long pg; /* current page in PDF */
+};
+
+struct spc_arg {
+ char *curptr;
+ char *endptr;
+ char *base;
+
+ char *command;
+};
+
+typedef int (*spc_handler_fn_ptr) (struct spc_env *, struct spc_arg *);
+
+struct spc_handler {
+ const char *key;
+ spc_handler_fn_ptr exec;
+} spc_handler;
+
+/* This should not use pdf_. */
+extern void spc_set_verbose (void);
+
+#include <stdarg.h>
+extern void spc_warn (struct spc_env *spe, const char *fmt, ...);
+
+#include "pdfobj.h"
+/* PDF parser shouldn't depend on this...
+ */
+extern pdf_obj *spc_lookup_reference (const char *ident);
+extern pdf_obj *spc_lookup_object (const char *ident);
+
+extern int spc_begin_annot (struct spc_env *spe, pdf_obj *annot_dict);
+extern int spc_end_annot (struct spc_env *spe);
+extern int spc_resume_annot (struct spc_env *spe);
+extern int spc_suspend_annot (struct spc_env *spe);
+
+extern void spc_push_object (const char *key, pdf_obj *value);
+extern void spc_flush_object (const char *key);
+extern void spc_clear_objects (void);
+
+extern int spc_exec_at_begin_page (void);
+extern int spc_exec_at_end_page (void);
+extern int spc_exec_at_begin_document (void);
+extern int spc_exec_at_end_document (void);
+
+extern int spc_exec_special (const char *p, long size,
+ double x_user, double y_user, double mag);
+
+#endif /* _SPECIALS_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/subfont.c b/Build/source/texk/xdvipdfmx/src/subfont.c
new file mode 100644
index 00000000000..7d7927e36b5
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/subfont.c
@@ -0,0 +1,654 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/subfont.c,v 1.20 2005/07/28 13:19:00 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxfile.h"
+
+#include "subfont.h"
+
+static int verbose = 0;
+void
+subfont_set_verbose (void)
+{
+ verbose++;
+}
+
+/* Don't forget fontmap reading now requires information
+ * from SFD files. You must initialize at least sfd_file_
+ * cache before starting loading of fontmaps.
+ */
+
+/* Subfont Definition File:
+ * struct sfd_file_ is for storing subfont identifiers
+ * contained in a SFD file and for mapping string pair
+ * <SFD_file, Subfont_id> to internal code mapping table
+ * ID which is index within an array of struct sfd_rec_.
+ * We store code mapping tables in different place than
+ * struct sfd_file_.
+ */
+struct sfd_file_
+{
+ char *ident; /* SFD file name */
+ char **sub_id; /* Subfont IDs */
+
+ int *rec_id; /* indices within struct sfd_rec_ array "sfd_record" */
+
+ int max_subfonts;
+ int num_subfonts;
+};
+
+/* Mapping table */
+struct sfd_rec_
+{
+ /* unsigned char misbit[32]; */
+ unsigned short vector[256]; /* 0 for undefined */
+};
+
+static void
+init_sfd_file_ (struct sfd_file_ *sfd)
+{
+ sfd->ident = NULL;
+ sfd->sub_id = NULL;
+ sfd->rec_id = NULL;
+ sfd->max_subfonts = sfd->num_subfonts = 0;
+}
+
+static void
+clean_sfd_file_ (struct sfd_file_ *sfd)
+{
+ int i;
+ if (sfd->ident)
+ RELEASE(sfd->ident);
+ if (sfd->sub_id) {
+ for (i = 0; i < sfd->num_subfonts; i++) {
+ if (sfd->sub_id[i])
+ RELEASE(sfd->sub_id[i]);
+ }
+ RELEASE(sfd->sub_id);
+ }
+ if (sfd->rec_id)
+ RELEASE(sfd->rec_id);
+ init_sfd_file_(sfd);
+}
+
+static struct sfd_file_ *sfd_files = NULL;
+static int num_sfd_files = 0, max_sfd_files = 0;
+
+static struct sfd_rec_ *sfd_record = NULL;
+static int num_sfd_records = 0, max_sfd_records = 0;
+
+
+
+/* Another buffer...
+ * We want buffer size at least 7 x 256 + a
+ * 4096 is usually enough.
+ */
+#define LINE_BUF_SIZE 4096
+static char line_buf[LINE_BUF_SIZE];
+
+/* Each lines describes character code mapping for each
+ * subfonts. '#' is start of comment.
+ * SFD file format uses a '\' before newline sequence
+ * for line-continuation.
+ */
+static char *
+readline (char *buf, int buf_len, FILE *fp)
+{
+ char *r, *q, *p = buf;
+ int n = 0, c = 0;
+
+ while (buf_len - n > 0 && (q = mfgets(p, buf_len - n, fp))) {
+ c++;
+ r = strchr(q, '#');
+ /* Comment is converted to single wsp (followed by a newline). */
+ if (r) {
+ *r = ' ';
+ *(r + 1) = '\0';
+ }
+ if (strlen(q) == 0)
+ break; /* empty line */
+ n += strlen(q);
+ q += strlen(q) - 1;
+ if (*q != '\\')
+ break;
+ else { /* line continued */
+ n -= 1;
+ p = buf + n;
+ }
+ }
+ if (n >= buf_len - 1) {
+ WARN("Possible buffer overflow in reading SFD file (buffer full, size=%d bytes)",
+ buf_len - 1);
+ }
+
+ return (c > 0 ? buf : NULL);
+}
+
+#define clear_vector(v) if ((v)) { \
+ int __i; \
+ for (__i = 0; __i < 256; __i++) \
+ (v)[__i] = 0; \
+}
+
+/* subfont_id ( integer ':' | integer '_' integer | integer )*
+ *
+ * 0x32: ==> Subsequent integers are place into slots starting at 0x32.
+ * 0x32: 0xA1A1 0xA1A2 ... ==> 0x32 is mappned to 0xA1A1, 0x33 to 0xA1A2
+ * 0xA1A1_0xA1A5 ==> Expanded to 0xA1A1 0xA1A2 ... 0xA1A5
+ */
+
+/* subfont_id is already consumed here. */
+static int
+read_sfd_record (struct sfd_rec_ *rec, const char *lbuf)
+{
+ char *p = (char *) lbuf, *q;
+ int repos = 0;
+ long c, v1 = 0, v2 = 0;
+ int curpos = 0;
+ int error = 0;
+
+#define IS_TOKSEP(c) ((c) == '\0' || isspace((c)))
+ for ( ; *p && isspace(*p); p++);
+ while (!error && *p) {
+ repos = 0; q = p;
+ v1 = strtol(p, &q, 0);
+ if (q == p ||
+ (!IS_TOKSEP(*q) && *q != ':' && *q != '_')) {
+ WARN("Unknown token in subfont mapping table: %c", *q);
+ return -1;
+ }
+
+ switch (*q) {
+ case ':':
+ if (v1 < 0 || v1 > 0xff) {
+ WARN("Invalud value for subfont table offset: %ld", v1);
+ return -1;
+ }
+ repos = 1;
+ q++;
+ break;
+ case '_':
+ p = q + 1;
+ v2 = strtol(p, &q, 0);
+ if (v1 < 0 || v1 > 0xffffL ||
+ v2 < 0 || v2 > 0xffffL) {
+ WARN("Invalid value in subfont mapping table: 0x%x_0x%x", v1, v2);
+ return -1;
+ } else if (q == p || !IS_TOKSEP(*q)) {
+ WARN("Invalid char in subfont mapping table: %c", *q);
+ return -1;
+ }
+ break;
+ default:
+ if (v1 < 0 || v1 > 0xffffL) {
+ WARN("Invalid character code in subfont mapping table: 0x%x", v1);
+ return -1;
+ }
+ v2 = v1;
+ break;
+ }
+
+ if (repos)
+ curpos = v1;
+ else {
+ if (v2 < v1 || curpos + (v2 - v1) > 0xff) {
+ WARN("Invalid range in subfont mapping: curpos=\"0x%02x\" range=\"0x%04x,0x%04x\"",
+ curpos, v1, v2);
+ return -1;
+ }
+ for (c = v1; c <= v2; c++) {
+ if (rec->vector[curpos] != 0) {
+ WARN("Subfont mapping for slot=\"0x%02x\" already defined...", curpos);
+ return -1;
+ }
+ ASSERT( curpos >= 0 && curpos <= 255 );
+ rec->vector[curpos++] = (unsigned short) c;
+ }
+ }
+ for (p = q; *p && isspace(*p); p++);
+ }
+
+ return error;
+}
+
+/* Scan for subfont IDs */
+static int
+scan_sfd_file (struct sfd_file_ *sfd, FILE *fp)
+{
+ char *id;
+ char *q, *p;
+ int n, lpos = 0;
+
+ ASSERT( sfd && fp );
+
+ if (verbose > 3) {
+ MESG("\nsubfont>> Scanning SFD file \"%s\"...\n", sfd->ident);
+ }
+
+ rewind(fp);
+ sfd->max_subfonts = sfd->num_subfonts = 0;
+ while ((p = readline(line_buf, LINE_BUF_SIZE, fp)) != NULL) {
+ lpos++;
+ for ( ; *p && isspace(*p); p++);
+ if (*p == 0)
+ continue; /* empty */
+
+ /* Saw non-wsp here */
+ for (n = 0, q = p; *p && !isspace(*p); p++, n++);
+ id = NEW(n + 1, char);
+ memcpy(id, q, n); id[n] = '\0';
+ if (sfd->num_subfonts >= sfd->max_subfonts) {
+ sfd->max_subfonts += 16;
+ sfd->sub_id = RENEW(sfd->sub_id, sfd->max_subfonts, char *);
+ }
+
+ if (verbose > 3) {
+ MESG("subfont>> id=\"%s\" at line=\"%d\"\n", id, lpos);
+ }
+ sfd->sub_id[sfd->num_subfonts] = id;
+ sfd->num_subfonts++;
+ }
+
+ sfd->rec_id = NEW(sfd->num_subfonts, int);
+ for (n = 0; n < sfd->num_subfonts; n++) {
+ sfd->rec_id[n] = -1; /* Not loaded yet. We do lazy loading of map definitions. */
+ }
+
+ if (verbose > 3) {
+ MESG("subfont>> %d entries found in SFD file \"%s\".\n", sfd->num_subfonts, sfd->ident);
+ }
+
+ return 0;
+}
+
+
+/* Open SFD file and gather subfont IDs. We do not read mapping tables
+ * here but only read subfont IDs used in SFD file.
+ */
+static int
+find_sfd_file (const char *sfd_name)
+{
+ int id = -1;
+ int i, error = -1;
+
+ /* Check if we already opened SFD file */
+ for (i = 0; i < num_sfd_files; i++) {
+ if (!strcmp(sfd_files[i].ident, sfd_name)) {
+ id = i;
+ break;
+ }
+ }
+
+ if (id < 0) {
+ struct sfd_file_ *sfd = NULL;
+ FILE *fp;
+
+ if (num_sfd_files >= max_sfd_files) {
+ max_sfd_files += 8;
+ sfd_files = RENEW(sfd_files, max_sfd_files, struct sfd_file_);
+ }
+ sfd = &sfd_files[num_sfd_files];
+ init_sfd_file_(sfd);
+ sfd->ident = NEW(strlen(sfd_name) + 1, char);
+ strcpy(sfd->ident, sfd_name);
+ fp = DPXFOPEN(sfd->ident, DPX_RES_TYPE_SFD);
+ if (!fp) {
+ clean_sfd_file_(sfd);
+ return -1;
+ }
+ error = scan_sfd_file(sfd, fp);
+ DPXFCLOSE(fp);
+ if (!error)
+ id = num_sfd_files++;
+ else {
+ WARN("Error occured while reading SFD file \"%s\"", sfd_name);
+ clean_sfd_file_(sfd);
+ id = -1;
+ }
+ }
+
+ return id;
+}
+
+char **
+sfd_get_subfont_ids (const char *sfd_name, int *num_ids)
+{
+ int sfd_id;
+
+ if (!sfd_name)
+ return NULL;
+
+ sfd_id = find_sfd_file(sfd_name);
+ if (sfd_id < 0)
+ return NULL;
+
+ if (num_ids)
+ *num_ids = sfd_files[sfd_id].num_subfonts;
+ return sfd_files[sfd_id].sub_id;
+}
+
+/* Make sure that sfd_name does not have the extension '.sfd'.
+ * Mapping tables are actually read here.
+ */
+int
+sfd_load_record (const char *sfd_name, const char *subfont_id)
+{
+ int rec_id = -1;
+ struct sfd_file_ *sfd;
+ FILE *fp;
+ int sfd_id, i, error = 0;
+ char *p, *q;
+
+ if (!sfd_name || !subfont_id)
+ return -1;
+
+ sfd_id = find_sfd_file(sfd_name);
+ if (sfd_id < 0)
+ return -1;
+
+ sfd = &sfd_files[sfd_id];
+ /* Check if we already loaded mapping table. */
+ for (i = 0;
+ i < sfd->num_subfonts && strcmp(sfd->sub_id[i], subfont_id); i++);
+ if (i == sfd->num_subfonts) {
+ WARN("Subfont id=\"%s\" not exist in SFD file \"%s\"...",
+ subfont_id, sfd->ident);
+ return -1;
+ } else if (sfd->rec_id[i] >= 0) {
+ return sfd->rec_id[i];
+ }
+
+ if (verbose > 3) {
+ MESG("\nsubfont>> Loading SFD mapping table for <%s,%s>...",
+ sfd->ident, subfont_id);
+ }
+
+ /* reopen */
+ fp = DPXFOPEN(sfd->ident, DPX_RES_TYPE_SFD);
+ if (!fp) {
+ return -1;
+ /* ERROR("Could not open SFD file \"%s\"", sfd_name); */
+ }
+
+ /* Seek to record for 'sub_name'. */
+ while ((p = readline(line_buf, LINE_BUF_SIZE, fp))) {
+ for ( ; *p && isspace(*p); p++);
+ if (*p == 0)
+ continue; /* empty line */
+
+ /* q = parse_ident(&p, p + strlen(p)); */
+ for (q = p; *p && !isspace(*p); p++);
+ *p = '\0'; p++;
+ if (!strcmp(q, subfont_id)) {
+ if (num_sfd_records >= max_sfd_records) {
+ max_sfd_records += 16;
+ sfd_record = RENEW(sfd_record, max_sfd_records, struct sfd_rec_);
+ }
+ clear_vector(sfd_record[num_sfd_records].vector);
+ error = read_sfd_record(&sfd_record[num_sfd_records], p);
+ if (error)
+ WARN("Error occured while reading SFD file: file=\"%s\" subfont_id=\"%s\"",
+ sfd->ident, subfont_id);
+ else {
+ rec_id = num_sfd_records++;
+ }
+ }
+ }
+ if (rec_id < 0) {
+ WARN("Failed to load subfont mapping table for SFD=\"%s\" subfont_id=\"%s\"",
+ sfd->ident, subfont_id);
+ }
+ sfd->rec_id[i] = rec_id;
+ DPXFCLOSE(fp);
+
+ if (verbose > 3) {
+ int __i;
+ if (rec_id >= 0) {
+ MESG(" at id=\"%d\"", rec_id);
+ MESG("\nsubfont>> Content of mapping table:");
+ for (__i = 0; __i < 256; __i++) {
+ if (__i % 16 == 0)
+ MESG("\nsubfont>> ");
+ MESG(" %04x", sfd_record[rec_id].vector[__i]);
+ }
+ }
+ MESG("\n");
+ }
+
+ return rec_id;
+}
+
+
+/* Lookup mapping table */
+unsigned short
+lookup_sfd_record (int rec_id, unsigned char c)
+{
+ if (!sfd_record ||
+ rec_id < 0 || rec_id >= num_sfd_records)
+ ERROR("Invalid subfont_id: %d", rec_id);
+ return sfd_record[rec_id].vector[c];
+}
+
+#if 0
+static void
+release_sfd_record (void)
+{
+ int i;
+
+ if (sfd_record) {
+ RELEASE(sfd_record);
+ }
+ if (sfd_files) {
+ for (i = 0; i < num_sfd_files; i++) {
+ clean_sfd_file_(&sfd_files[i]);
+ }
+ RELEASE(sfd_files);
+ }
+ sfd_record = NULL;
+ sfd_files = NULL;
+ num_sfd_records = max_sfd_records = 0;
+ num_sfd_files = max_sfd_files = 0;
+}
+#endif /* 0 */
+
+
+#if DPXTEST
+/* SFD file dumper */
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#else
+typedef int iconv_t;
+#endif
+#include <string.h>
+
+static void
+dump_table (const char *sfd_name, const char *sub_name, iconv_t cd)
+{
+ int rec_id, i;
+
+ rec_id = sfd_load_record(sfd_name, sub_name);
+ if (rec_id < 0) {
+ WARN("Could not load SFD mapping for \"%s\"", sub_name);
+ return;
+ }
+ fprintf(stdout, " <subfont id=\"%s\">\n", sub_name);
+ for (i = 0; i < 256; i++) {
+ unsigned short c = lookup_sfd_record(rec_id, i);
+ char *p, inbuf[2];
+ char *q, outbuf[32];
+ size_t r, inbufleft = 2, outbufleft = 32;
+
+ if (c == 0)
+ fprintf(stdout, " <!-- %02x: undefined -->", i);
+ else {
+ fprintf(stdout, " <a bi=\"%02x\" bo=\"%02x %02x\"", i, (c >> 8) & 0xff, c & 0xff);
+ if (cd != (iconv_t) -1) {
+ p = inbuf; q = outbuf;
+ inbuf[0] = (c >> 8) & 0xff;
+ inbuf[1] = c & 0xff;
+#ifdef HAVE_ICONV
+ r = iconv(cd, &p, &inbufleft, &q, &outbufleft);
+ if (r == -1) {
+ if (verbose) {
+ WARN("Conversion to Unicode failed for subfont-id=\"%s\" code=\"0x%02x\"",
+ sub_name, i);
+ WARN(">> with: %s", strerror(errno));
+ }
+ } else {
+ outbuf[32-outbufleft] = 0;
+ fprintf(stdout, " uc=\"%s\"", outbuf);
+ }
+#endif /* HAVE_ICONV */
+ }
+ fprintf(stdout, " />");
+ }
+ fprintf(stdout, "\n");
+ }
+ fprintf(stdout, " </subfont>\n");
+ return;
+}
+
+#define subfontDefinition_DTD "\
+<!ELEMENT subfontDefinition (subfont+)>\n\
+<!ATTLIST subfontDefinition\n\
+ id CDATA #REQUIRED\n\
+ output-encoding CDATA #IMPLIED\n\
+>\n\
+<!ELEMENT subfont (a*)>\n\
+<!ATTLIST subfont\n\
+ id CDATA #REQUIRED\n\
+>\n\
+<!ELEMENT a EMPTY>\n\
+<!ATTLIST a\n\
+ bi NMTOKENS #REQUIRED\n\
+ bo NMTOKENS #REQUIRED\n\
+ uc CDATA #IMPLIED\n\
+>\
+"
+
+void
+test_subfont_help (void)
+{
+ fprintf(stdout, "usage: subfont [options] SFD_name\n");
+ fprintf(stdout, "-e, --encoding string\n");
+ fprintf(stdout, " Target (output) encoding of SFD mapping is 'string'.\n");
+ fprintf(stdout, " It must be an encoding name recognized by iconv.\n");
+ fprintf(stdout, " With this option write Unicode character in auxiliary attribute 'uc'.\n");
+ fprintf(stdout, "-s, --subfont-id string\n");
+ fprintf(stdout, " Load and dump mapping table only for subfont 'string'.\n");
+}
+
+int
+test_subfont_main (int argc, char *argv[])
+{
+ char *sfd_name = NULL, *sub_name = NULL;
+ char *from = NULL;
+ int i;
+ iconv_t cd = (iconv_t) -1;
+
+ for (;;) {
+ int c, optidx = 0;
+ static struct option long_options[] = {
+ {"encoding", 1, 0, 'e'}, /* for to-Unicode conversion */
+ {"subfont-id", 1, 0, 's'},
+ {"help", 0, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+ c = getopt_long(argc, argv, "e:s:h", long_options, &optidx);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'e':
+ from = optarg;
+ break;
+ case 's':
+ sub_name = optarg;
+ break;
+ case 'h':
+ test_subfont_help();
+ return 0;
+ break;
+ default:
+ test_subfont_help();
+ return -1;
+ break;
+ }
+ }
+ if (optind < argc) {
+ sfd_name = argv[optind++];
+ }
+
+ if (sfd_name == NULL) {
+ WARN("No SFD file name specified.");
+ test_subfont_help();
+ return -1;
+ }
+ if (!from)
+ cd = (iconv_t) -1;
+ else {
+#ifdef HAVE_ICONV
+ cd = iconv_open("utf-8", from);
+ if (cd == (iconv_t) -1) {
+ WARN("Can't open iconv conversion descriptor for %s --> utf-8", from);
+ return -1;
+ }
+#else
+ WARN("Your system doesn't have iconv() in libc!");
+#endif
+ }
+
+ fprintf(stdout, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+ fprintf(stdout, "<!DOCTYPE subfontDefinition [\n%s\n]>\n",
+ subfontDefinition_DTD);
+ fprintf(stdout, "<subfontDefinition id=\"%s\" output-encoding=\"%s\">\n",
+ sfd_name, from ? from : "unknown");
+ if (sub_name == NULL || !strcmp(sub_name, "all")) {
+ char **sub_id;
+ int num_ids = 0;
+ sub_id = sfd_get_subfont_ids(sfd_name, &num_ids);
+ if (!sub_id)
+ WARN("Could not open SFD file: %s", sfd_name);
+ else {
+ for (i = 0; i < num_ids; i++)
+ dump_table(sfd_name, sub_id[i], cd);
+ }
+ } else {
+ dump_table(sfd_name, sub_name, cd);
+ }
+ fprintf(stdout, "</subfontDefinition>\n");
+
+#ifdef HAVE_ICONV
+ if (cd != (iconv_t) -1)
+ iconv_close(cd);
+#endif
+
+ return 0;
+}
+
+#endif /* DPXTEST */
diff --git a/Build/source/texk/xdvipdfmx/src/subfont.h b/Build/source/texk/xdvipdfmx/src/subfont.h
new file mode 100644
index 00000000000..e1c6010d5bc
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/subfont.h
@@ -0,0 +1,33 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/subfont.h,v 1.8 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SUBFONT_H_
+#define _SUBFONT_H_
+
+extern void subfont_set_verbose (void);
+
+extern unsigned short lookup_sfd_record(int rec_id, unsigned char code);
+
+extern int sfd_load_record (const char *sfd_name, const char *subfont_id);
+extern char **sfd_get_subfont_ids (const char *sfd_name, int *num_subfonts);
+
+#endif /* _SUBFONT_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/system.h b/Build/source/texk/xdvipdfmx/src/system.h
new file mode 100644
index 00000000000..b758ff14405
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/system.h
@@ -0,0 +1,53 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/system.h,v 1.6 2004/01/11 02:51:33 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _SYSTEM_H_
+#define _SYSTEM_H_
+
+#ifdef MIKTEX
+#include "miktex.h"
+#include "gnu-miktex.h"
+#include "web2c-miktex.h"
+#else
+#include <kpathsea/c-auto.h>
+#include <kpathsea/kpathsea.h>
+#endif
+
+#ifdef WIN32
+# undef ERROR
+# undef NO_ERROR
+# undef RGB
+# undef CMYK
+# undef SETLINECAP
+# undef SETLINEJOIN
+# undef SETMITERLIMIT
+# pragma warning(disable : 4101 4018)
+#else
+# ifndef __cdecl
+# define __cdecl
+# endif
+# define CDECL
+#endif /* WIN32 */
+
+#endif /* _SYSTEM_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/t1_char.c b/Build/source/texk/xdvipdfmx/src/t1_char.c
new file mode 100644
index 00000000000..333d9b3d17a
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/t1_char.c
@@ -0,0 +1,1590 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/t1_char.c,v 1.5 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <math.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "numbers.h"
+
+#include "pdfobj.h"
+#include "pdffont.h"
+
+#include "pdfencoding.h"
+#include "unicode.h"
+
+#include "dpxutil.h"
+
+#include "pst_obj.h"
+#include "pst.h"
+
+#include "cff_limits.h"
+#include "cff_types.h"
+#include "cff_dict.h"
+#include "cff.h"
+
+#include "t1_char.h"
+
+/*
+ * Type 1 -> Type 1C
+ */
+
+/* Charstring decoder/encoder status codes */
+#define CS_OP_NOSUPPORT -4
+#define CS_BUFFER_ERROR -3
+#define CS_STACK_ERROR -2
+#define CS_PARSE_ERROR -1
+#define CS_PARSE_OK 0
+#define CS_PARSE_END 1
+#define CS_SUBR_RETURN 2
+#define CS_CHAR_END 3
+
+static int status = CS_PARSE_ERROR;
+
+#define DST_NEED(a,b) {if ((a) < (b)) { status = CS_BUFFER_ERROR ; return ; }}
+#define SRC_NEED(a,b) {if ((a) < (b)) { status = CS_PARSE_ERROR ; return ; }}
+#define NEED(a,b) {if ((a) < (b)) { status = CS_STACK_ERROR ; return ; }}
+
+#define T1_CS_PHASE_INIT 0
+#define T1_CS_PHASE_HINT 1
+#define T1_CS_PHASE_PATH 2
+#define T1_CS_PHASE_FLEX 3
+
+static int phase = -1;
+static int nest = -1;
+
+#ifndef CS_STEM_ZONE_MAX
+#define CS_STEM_ZONE_MAX 96
+#endif
+#ifndef CS_STEM_GROUP_MAX
+#define CS_STEM_GROUP_MAX CS_STEM_ZONE_MAX
+#endif
+#ifndef CS_ARG_STACK_MAX
+#define CS_ARG_STACK_MAX 48
+#endif
+#ifndef PS_ARG_STACK_MAX
+/*
+ * Counter control may have CS_STEM_ZONE_MAX*2+2 arguments.
+ */
+#define PS_ARG_STACK_MAX (CS_STEM_ZONE_MAX*2+2)
+#endif
+
+typedef struct t1_cpath {
+ int type;
+ int num_args;
+ double args[CS_ARG_STACK_MAX];
+ struct t1_cpath *next;
+} t1_cpath;
+
+#define HSTEM 0
+#define VSTEM 1
+typedef struct {
+ int id;
+ int dir;
+ double pos, del;
+} t1_stem;
+
+typedef struct {
+ int num_stems;
+ double stems[CS_STEM_ZONE_MAX]; /* int */
+} t1_stemgroup;
+
+#define T1_CS_FLAG_NONE 0
+#define T1_CS_FLAG_USE_HINTMASK (1 << 0)
+#define T1_CS_FLAG_USE_CNTRMASK (1 << 1)
+#define T1_CS_FLAG_USE_SEAC (1 << 2)
+
+typedef struct {
+ int flags;
+ struct {
+ double sbx, sby, wx, wy;
+ } sbw;
+ struct {
+ double llx, lly, urx, ury;
+ } bbox;
+ struct {
+ double asb, adx, ady;
+ card8 bchar, achar;
+ } seac;
+ int num_stems;
+ t1_stem stems[CS_STEM_ZONE_MAX];
+ t1_cpath *charpath;
+ t1_cpath *lastpath;
+} t1_chardesc;
+
+static int cs_stack_top = 0;
+static int ps_stack_top = 0;
+
+/* [vh]stem support require one more stack size. */
+static double cs_arg_stack[CS_ARG_STACK_MAX+1];
+static double ps_arg_stack[PS_ARG_STACK_MAX];
+
+#define CS_HINT_DECL -1
+#define CS_FLEX_CTRL -2
+#define CS_CNTR_CTRL -3
+
+/*
+ * Type 1/2 CharString encoding
+ */
+
+/*
+ * 1-byte CharString operaotrs:
+ * cs_escape is first byte of two-byte operator
+ */
+
+/* RESERVED 0 */
+#define cs_hstem 1
+/* RESERVED 2 */
+#define cs_vstem 3
+#define cs_vmoveto 4
+#define cs_rlineto 5
+#define cs_hlineto 6
+#define cs_vlineto 7
+#define cs_rrcurveto 8
+#define cs_closepath 9
+#define cs_callsubr 10
+#define cs_return 11
+#define cs_escape 12
+#define cs_hsbw 13
+#define cs_endchar 14
+/* RESERVED 15 */
+/* RESERVED 16 */
+/* RESERVED 17 */
+#define cs_hstemhm 18
+#define cs_hintmask 19
+#define cs_cntrmask 20
+#define cs_rmoveto 21
+#define cs_hmoveto 22
+#define cs_vstemhm 23
+#define cs_rcurveline 24
+#define cs_rlinecurve 25
+#define cs_vvcurveto 26
+#define cs_hhcurveto 27
+/* SHORTINT 28 : first byte of shortint*/
+#define cs_callgsubr 29
+#define cs_vhcurveto 30
+#define cs_hvcurveto 31
+
+/* 2-byte op. flex 34-37 used. */
+
+/*
+ * 2-byte CharString operaotrs:
+ * "dotsection" is obsoleted in Type 2 charstring.
+ */
+
+#define cs_dotsection 0
+#define cs_vstem3 1
+#define cs_hstem3 2
+#define cs_and 3
+#define cs_or 4
+#define cs_not 5
+#define cs_seac 6
+#define cs_sbw 7
+/* RESERVED 8 */
+#define cs_abs 9
+#define cs_add 10
+#define cs_sub 11
+#define cs_div 12
+/* RESERVED 13 */
+#define cs_neg 14
+#define cs_eq 15
+#define cs_callothersubr 16
+#define cs_pop 17
+#define cs_drop 18
+/* RESERVED 19 */
+#define cs_put 20
+#define cs_get 21
+#define cs_ifelse 22
+#define cs_random 23
+#define cs_mul 24
+/* RESERVED 25 */
+#define cs_sqrt 26
+#define cs_dup 27
+#define cs_exch 28
+#define cs_index 29
+#define cs_roll 30
+/* RESERVED 31 */
+/* RESERVED 32 */
+#define cs_setcurrentpoint 33
+#define cs_hflex 34
+#define cs_flex 35
+#define cs_hflex1 36
+#define cs_flex1 37
+
+#define IS_PATH_OPERATOR(o) (((o) >= cs_vmoveto && (o) <= cs_closepath) || \
+ ((o) >= cs_rmoveto && (o) <= cs_hvcurveto && \
+ (o) != cs_vstemhm && (o) != cs_callgsubr && (o) != 28)\
+ )
+
+/*
+ * Stem:
+ *
+ * 1. Stems must be sorted in the increasing bottom/left edge order.
+ * 2. The encoded values are all relative; The value x(y) of the first
+ * stem is relative to 0 for Type 2 charstring and is relative to
+ * the left(bottom) side-bearing for Type 1 charstring.
+ * 3. A width of -20(-21) specifies the top/right(bottom/left) edge
+ * of an edge hint in Type 2 charstring. But the width of 'ghost'
+ * hint in Type 1 charstring is positive with value 20 or 21.
+ * 4. The h(v)stemhm MUST be used instead of h(v)stem if charstring
+ * contains hintmask operator.
+ *
+ * TODO:
+ *
+ * Convert ghost hint to edge hint, Counter control for hstem3/vstem3.
+ */
+
+static int CDECL
+stem_compare (const void *v1, const void *v2)
+{
+ int cmp = 0;
+ t1_stem *s1, *s2;
+
+ s1 = (t1_stem *) v1;
+ s2 = (t1_stem *) v2;
+ if (s1->dir == s2->dir) {
+ if (s1->pos == s2->pos) {
+ if (s1->del == s2->del)
+ cmp = 0;
+ else
+ cmp = (s1->del < s2->del) ? -1 : 1;
+ } else {
+ cmp = (s1->pos < s2->pos) ? -1 : 1;
+ }
+ } else {
+ cmp = (s1->dir == HSTEM) ? -1 : 1;
+ }
+
+ return cmp;
+}
+
+#define SORT_STEMS(cd) qsort((cd)->stems,(cd)->num_stems,sizeof(t1_stem),stem_compare)
+
+static int
+get_stem (t1_chardesc *cd, int stem_id)
+{
+ int i;
+
+ for (i = 0; i < cd->num_stems; i++) {
+ if (cd->stems[i].id == stem_id)
+ break;
+ }
+
+ return ((i < cd->num_stems) ? i : -1);
+}
+
+static int
+add_stem (t1_chardesc *cd, double pos, double del, int dir)
+{
+ int i;
+
+ ASSERT(cd);
+
+ pos += (dir == HSTEM) ? cd->sbw.sby : cd->sbw.sbx;
+ for (i = 0; i < cd->num_stems; i++) {
+ if (cd->stems[i].dir == dir &&
+ cd->stems[i].pos == pos &&
+ cd->stems[i].del == del)
+ break;
+ }
+ if (i == cd->num_stems) {
+ if (cd->num_stems == CS_STEM_ZONE_MAX)
+ return -1;
+ cd->stems[i].dir = dir;
+ cd->stems[i].pos = pos;
+ cd->stems[i].del = del;
+ cd->stems[i].id = cd->num_stems;
+ (cd->num_stems)++;
+ }
+
+ return cd->stems[i].id;
+}
+
+
+static void
+copy_args (double *args1, double *args2, int count)
+{
+ while (count-- > 0) {
+ *args1 = *args2;
+ args1++; args2++;
+ }
+}
+
+/*
+ * Stack:
+ */
+#define LIMITCHECK(n) do {\
+ if (cs_stack_top+(n) > CS_ARG_STACK_MAX) {\
+ status = CS_STACK_ERROR;\
+ return;\
+ }\
+ } while (0)
+#define CHECKSTACK(n) do {\
+ if (cs_stack_top < (n)) {\
+ status = CS_STACK_ERROR;\
+ return;\
+ }\
+ } while (0)
+#define CLEARSTACK() do {\
+ cs_stack_top = 0;\
+ } while (0)
+
+/*
+ * Path construction:
+ */
+/* Get operands from cs_arg_stack[] */
+static void
+add_charpath (t1_chardesc *cd, int type, double *argv, int argn)
+{
+ t1_cpath *p;
+
+ ASSERT(cd);
+ ASSERT(argn <= CS_ARG_STACK_MAX);
+
+ p = NEW(1, t1_cpath);
+ p->type = type;
+ p->num_args = argn;
+ p->next = NULL;
+
+ while (argn-- > 0)
+ p->args[argn] = argv[argn];
+
+ if (!cd->charpath)
+ cd->charpath = p;
+ if (cd->lastpath)
+ cd->lastpath->next = p;
+ cd->lastpath = p;
+
+ if (type >= 0 &&
+ phase != T1_CS_PHASE_FLEX && IS_PATH_OPERATOR(type))
+ phase = T1_CS_PHASE_PATH;
+}
+
+static void
+init_charpath (t1_chardesc *cd)
+{
+ cd->flags = T1_CS_FLAG_NONE;
+ cd->num_stems = 0;
+ cd->sbw.wx = cd->sbw.wy = 0.0;
+ cd->sbw.sbx = cd->sbw.sby = 0.0;
+ cd->bbox.llx = cd->bbox.lly = cd->bbox.urx = cd->bbox.ury = 0.0;
+ cd->charpath = cd->lastpath = NULL;
+}
+
+static void
+release_charpath (t1_chardesc *cd)
+{
+ t1_cpath *curr, *next;
+
+ ASSERT(cd);
+
+ curr = cd->charpath;
+ while (curr != NULL) {
+ next = curr->next;
+ RELEASE(curr);
+ curr = next;
+ }
+
+ cd->charpath = cd->lastpath = NULL;
+}
+
+/*
+ * Type 1 charstring operators:
+ */
+#define ADD_PATH(p,t,n) add_charpath((p),(t),&(cs_arg_stack[cs_stack_top-(n)]),(n))
+
+/*
+ * Single byte operators:
+ */
+static void
+do_operator1 (t1_chardesc *cd, card8 **data, card8 *endptr)
+{
+ card8 op = **data;
+
+ *data += 1;
+
+ switch (op) {
+ case cs_closepath:
+ /*
+ * From T1 spec.:
+ * Note that, unlike the closepath command in the PostScript language,
+ * this command does not reposition the current point. Any subsequent
+ * rmoveto must be relative to the current point in force before the
+ * Type 1 font format closepath command was given.
+ */
+ /* noop */
+ CLEARSTACK();
+ break;
+ case cs_hsbw:
+ CHECKSTACK(2);
+ cd->sbw.wx = cs_arg_stack[--cs_stack_top];
+ cd->sbw.wy = 0;
+ cd->sbw.sbx = cs_arg_stack[--cs_stack_top];
+ cd->sbw.sby = 0;
+ CLEARSTACK();
+ /* hsbw does NOT set currentpoint. */
+ break;
+ case cs_hstem:
+ case cs_vstem:
+ CHECKSTACK(2);
+ {
+ int stem_id;
+ stem_id = add_stem(cd,
+ cs_arg_stack[cs_stack_top-2],
+ cs_arg_stack[cs_stack_top-1],
+ ((op == cs_hstem) ? HSTEM : VSTEM));
+ if (stem_id < 0) {
+ WARN("Too many hints...");
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ /* Put stem_id onto the stack... */
+ cs_arg_stack[cs_stack_top++] = stem_id;
+ ADD_PATH(cd, CS_HINT_DECL, 1);
+ }
+ CLEARSTACK();
+ break;
+ case cs_rmoveto:
+ /*
+ * Reference point is (0, 0) in Type 2 charstring.
+ */
+ CHECKSTACK(2);
+ {
+ if (phase < T1_CS_PHASE_PATH) {
+ cs_arg_stack[cs_stack_top-2] += cd->sbw.sbx;
+ cs_arg_stack[cs_stack_top-1] += cd->sbw.sby;
+ }
+ ADD_PATH(cd, op, 2);
+ }
+ CLEARSTACK();
+ break;
+ case cs_hmoveto:
+ case cs_vmoveto:
+ CHECKSTACK(1);
+ {
+ int argn = 1;
+ if (phase < T1_CS_PHASE_PATH) {
+ /*
+ * The reference point for the first moveto operator is diferrent
+ * between Type 1 charstring and Type 2 charstring. We compensate it.
+ */
+ if (op == cs_hmoveto) {
+ cs_arg_stack[cs_stack_top-1] += cd->sbw.sbx;
+ if (cd->sbw.sby != 0.0) {
+ cs_arg_stack[cs_stack_top++] = cd->sbw.sby;
+ argn = 2;
+ op = cs_rmoveto;
+ }
+ } else {
+ cs_arg_stack[cs_stack_top-1] += cd->sbw.sby;
+ if (cd->sbw.sbx != 0.0) {
+ cs_arg_stack[cs_stack_top] = cs_arg_stack[cs_stack_top-1];
+ cs_arg_stack[cs_stack_top-1] = cd->sbw.sbx;
+ cs_stack_top++;
+ argn = 2;
+ op = cs_rmoveto;
+ }
+ }
+ }
+ ADD_PATH(cd, op, argn);
+ }
+ CLEARSTACK();
+ break;
+ case cs_endchar:
+ status = CS_CHAR_END;
+ CLEARSTACK();
+ break;
+ /* above oprators are candidate for first stack-clearing operator */
+ case cs_rlineto:
+ CHECKSTACK(2);
+ ADD_PATH(cd, op, 2);
+ CLEARSTACK();
+ break;
+ case cs_hlineto:
+ case cs_vlineto:
+ CHECKSTACK(1);
+ ADD_PATH(cd, op, 1);
+ CLEARSTACK();
+ break;
+ case cs_rrcurveto:
+ CHECKSTACK(6);
+ ADD_PATH(cd, op, 6);
+ CLEARSTACK();
+ break;
+ case cs_vhcurveto:
+ case cs_hvcurveto:
+ CHECKSTACK(4);
+ ADD_PATH(cd, op, 4);
+ CLEARSTACK();
+ break;
+ /* all operotors above are stack-clearing operator */
+ /* no output */
+ case cs_return:
+ break;
+ case cs_callsubr:
+ ERROR("Unexpected callsubr.");
+ break;
+ default:
+ /* no-op ? */
+ WARN("Unknown charstring operator: 0x%02x", op);
+ status = CS_PARSE_ERROR;
+ break;
+ }
+
+ return;
+}
+
+/*
+ * OtherSubrs:
+ *
+ * arg0 arg1 ... argn n othersubr# callothersubr
+ *
+ * 0: Build flex:
+ * fd x y 3 0 callothersubr
+ * Othersubr #0 pushes x and y to PostScript interpreter operand stack.
+ * 1: Start flex
+ * 0 1 callothersubr
+ * 2: Mark flex control points
+ * 0 2 callothersubr
+ * 3: Discard hint
+ * subr# 1 3 callothersubr pop callsubr
+ * Subroutine subr# (only) contains stem declaration.
+ * Othersubr #3 pushes subr# to PostScript interpreter operand stack.
+ * 12: Counter control
+ * A subr to avoid stack overflow.
+ * 13: Counter control
+ */
+
+/*
+ * Convert six control points marked as CS_FLEX_CTRL to a flex path.
+ */
+static void
+do_othersubr0 (t1_chardesc *cd)
+{
+ t1_cpath *flex, *cur, *next;
+
+ if (ps_stack_top < 1) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+
+ /* Seek first CS_FLEX_CTRL mark */
+ for (cur = cd->charpath; cur != NULL && cur->type != CS_FLEX_CTRL; cur = cur->next);
+ flex = cur;
+ {
+ int i;
+ cur = cur->next;
+ for (i = 1; i < 7; i++) {
+ if (cur == NULL || cur->type != CS_FLEX_CTRL ||
+ cur->num_args != 2) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ if (i == 1) {
+ flex->args[0] += cur->args[0];
+ flex->args[1] += cur->args[1];
+ } else {
+ copy_args(&(flex->args[2*i-2]), cur->args, 2);
+ }
+ next = cur->next;
+ RELEASE(cur);
+ cur = next;
+ }
+ }
+ if (cur != NULL) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ /*
+ * Now 'flex' have all six control points, the first pair is relative
+ * from starting point.
+ */
+ flex->type = cs_flex;
+ flex->args[12] = ps_arg_stack[--ps_stack_top]; /* flex depth */
+ flex->num_args = 13;
+ flex->next = NULL;
+ cd->lastpath = flex;
+
+ phase = T1_CS_PHASE_PATH;
+}
+
+/* Start flex */
+static void
+do_othersubr1 (t1_chardesc *cd)
+{
+ phase = T1_CS_PHASE_FLEX;
+}
+
+/* Mark flex control point */
+static void
+do_othersubr2 (t1_chardesc *cd)
+{
+ if (phase != T1_CS_PHASE_FLEX || !cd->lastpath) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+
+ switch (cd->lastpath->type) {
+ case cs_rmoveto:
+ break;
+ case cs_hmoveto:
+ cd->lastpath->num_args = 2;
+ cd->lastpath->args[1] = 0.0;
+ break;
+ case cs_vmoveto:
+ cd->lastpath->num_args = 2;
+ cd->lastpath->args[1] = cd->lastpath->args[0];
+ cd->lastpath->args[0] = 0.0;
+ break;
+ default:
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ cd->lastpath->type = CS_FLEX_CTRL;
+}
+
+/*
+ * Hint Replacement:
+ * "Adobe Type 1 Font Format", Chapter 8.
+ */
+static void
+do_othersubr3 (t1_chardesc *cd)
+{
+ cd->flags |= T1_CS_FLAG_USE_HINTMASK;
+}
+
+static void
+do_othersubr12 (t1_chardesc *cd)
+{
+ /* Othersubr12 call must immediately follow the hsbw or sbw. */
+ if (phase != T1_CS_PHASE_INIT) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ /* noop */
+}
+
+static void
+do_othersubr13 (t1_chardesc *cd)
+{
+ t1_stemgroup stemgroups[CS_STEM_GROUP_MAX];
+ int num_hgroups, num_vgroups, n, stem_id;
+ double pos, del;
+
+ /* After #12 callothersubr or hsbw or sbw. */
+ if (phase != T1_CS_PHASE_INIT) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ for (n = 0; n < CS_STEM_GROUP_MAX; n++) {
+ stemgroups[n].num_stems = 0;
+ }
+
+ num_hgroups = (int) ps_arg_stack[--ps_stack_top];
+ if (num_hgroups < 0 || num_hgroups > CS_STEM_GROUP_MAX) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ n = 0; pos = 0.0;
+ while (ps_stack_top >= 2 && n < num_hgroups) {
+ /* add_stem() add sidebearing */
+ pos += ps_arg_stack[--ps_stack_top];
+ del = ps_arg_stack[--ps_stack_top];
+ stem_id = add_stem(cd,
+ (del < 0.0) ? pos + del : pos,
+ (del < 0.0) ? -del : del,
+ HSTEM);
+ stemgroups[n].stems[stemgroups[n].num_stems] = stem_id;
+ stemgroups[n].num_stems += 1;
+ pos += del;
+ if (del < 0.0) {
+ pos = 0.0;
+ n++;
+ }
+ }
+ if (n != num_hgroups) {
+ status = CS_STACK_ERROR;
+ return;
+ }
+
+ num_vgroups = (int) ps_arg_stack[--ps_stack_top];
+ if (num_vgroups < 0 || num_vgroups > CS_STEM_GROUP_MAX) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ n = 0; pos = 0.0;
+ while (ps_stack_top >= 2 && n < num_vgroups) {
+ /* add_stem() add sidebearing */
+ pos += ps_arg_stack[--ps_stack_top];
+ del = ps_arg_stack[--ps_stack_top];
+ stem_id = add_stem(cd,
+ (del < 0.0) ? pos + del : pos,
+ (del < 0.0) ? -del : del,
+ VSTEM);
+ stemgroups[n].stems[stemgroups[n].num_stems] = stem_id;
+ stemgroups[n].num_stems += 1;
+ pos += del;
+ if (del < 0.0) {
+ pos = 0.0;
+ n++;
+ }
+ }
+ if (n != num_vgroups) {
+ status = CS_STACK_ERROR;
+ return;
+ }
+
+ for (n = 0; n < MAX(num_hgroups, num_vgroups); n++) {
+ add_charpath(cd, cs_cntrmask,
+ stemgroups[n].stems, stemgroups[n].num_stems);
+ }
+
+ cd->flags |= T1_CS_FLAG_USE_CNTRMASK;
+}
+
+static void
+do_callothersubr (t1_chardesc *cd)
+{
+ int argn, subrno;
+
+ CHECKSTACK(2);
+ subrno = (int) cs_arg_stack[--cs_stack_top];
+ argn = (int) cs_arg_stack[--cs_stack_top];
+
+ CHECKSTACK(argn);
+ if (ps_stack_top+argn > PS_ARG_STACK_MAX) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ while (argn-- > 0)
+ ps_arg_stack[ps_stack_top++] = cs_arg_stack[--cs_stack_top];
+
+ switch (subrno) {
+ case 0: do_othersubr0(cd) ; break;
+ case 1: do_othersubr1(cd) ; break;
+ case 2: do_othersubr2(cd) ; break;
+ case 3: do_othersubr3(cd) ; break;
+ case 12: do_othersubr12(cd); break;
+ case 13: do_othersubr13(cd); break;
+ default:
+ ERROR("Unknown othersubr #%ld.", subrno);
+ break;
+ }
+}
+
+/*
+ * Double byte operators:
+ */
+static void
+do_operator2 (t1_chardesc *cd, card8 **data, card8 *endptr)
+{
+ card8 op;
+
+ *data += 1;
+
+ SRC_NEED(endptr, *data + 1);
+
+ op = **data;
+ *data += 1;
+
+ switch(op) {
+ case cs_sbw:
+ CHECKSTACK(4);
+ cd->sbw.wy = cs_arg_stack[--cs_stack_top];
+ cd->sbw.wx = cs_arg_stack[--cs_stack_top];
+ cd->sbw.sby = cs_arg_stack[--cs_stack_top];
+ cd->sbw.sbx = cs_arg_stack[--cs_stack_top];
+ CLEARSTACK();
+ break;
+ case cs_hstem3:
+ case cs_vstem3:
+ /*
+ * TODO:
+ * The counter control can be used for hstem3 and vstem3
+ * operator if LanguageGroup is not equal to 1.
+ */
+ CHECKSTACK(6);
+ {
+ int i;
+ for (i = 2; i >= 0; i--) {
+ int stem_id;
+ stem_id = add_stem(cd,
+ cs_arg_stack[cs_stack_top-2*i-2],
+ cs_arg_stack[cs_stack_top-2*i-1],
+ ((op == cs_hstem3) ? HSTEM : VSTEM));
+ if (stem_id < 0) {
+ WARN("Too many hints...");
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ /* Put stem_id onto the stack... */
+ cs_arg_stack[cs_stack_top++] = stem_id;
+ ADD_PATH(cd, CS_HINT_DECL, 1);
+ cs_stack_top--;
+ }
+ }
+ CLEARSTACK();
+ break;
+ case cs_setcurrentpoint:
+ CHECKSTACK(2);
+ /* noop */
+ CLEARSTACK();
+ break;
+ /* all operator above are stack-clearing */
+ case cs_pop:
+ /*
+ * Transfer a operand from PS interpreter operand stack to BuildChar
+ * operand stack.
+ */
+ if (ps_stack_top < 1) {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+ LIMITCHECK(1);
+ cs_arg_stack[cs_stack_top++] = ps_arg_stack[--ps_stack_top];
+ break;
+ case cs_dotsection:
+#if 0
+ /*
+ * If the hint replacement feature is used in the font, the
+ * "dotsection" operator exist only for compatibility to older
+ * (more than 10 years old) Type 1 font rasterizer which can't
+ * perform hint replacement. In this case, we silently ignore
+ * the "dotsection" operator.
+ *
+ * The following code will wrongly warn about "dotsection" when
+ * the charstring only contains dot (e.g., "bullet") where the
+ * hint replacement is not necessary.
+ *
+ * Adobe ATM renderers always treat this operator as a no-op.
+ * (See, Adobe Technical Note #5177, Appendix C)
+ */
+ if (!(cd->flags & T1_CS_FLAG_USE_HINTMASK)) {
+ if (__verbose > 1)
+ WARN("Obsolete Type 1 charstring operator \"dotsection\" not supported.");
+ }
+#endif
+ /* noop */
+ break;
+ case cs_div: /* TODO: check overflow */
+ CHECKSTACK(2);
+ cs_arg_stack[cs_stack_top-2] /= cs_arg_stack[cs_stack_top-1];
+ cs_stack_top--;
+ break;
+ case cs_callothersubr:
+ do_callothersubr(cd);
+ break;
+ case cs_seac:
+ CHECKSTACK(5);
+ cd->flags |= T1_CS_FLAG_USE_SEAC;
+ cd->seac.achar = (card8) cs_arg_stack[--cs_stack_top];
+ cd->seac.bchar = (card8) cs_arg_stack[--cs_stack_top];
+ cd->seac.ady = cs_arg_stack[--cs_stack_top];
+ cd->seac.adx = cs_arg_stack[--cs_stack_top];
+ /* We must compensate the difference of the glyph origin. */
+ cd->seac.ady += cd->sbw.sby;
+ cd->seac.adx += cd->sbw.sbx - cs_arg_stack[--cs_stack_top];
+ CLEARSTACK();
+ break;
+ default:
+ /* no-op ? */
+ WARN("Unknown charstring operator: 0x0c%02x", op);
+ status = CS_PARSE_ERROR;
+ break;
+ }
+
+ return;
+}
+
+/*
+ * Charstring encoding:
+ * Copied from cs_type2.c
+ * Note:
+ * The Type 2 interpretation of a number encoded in five-bytes (those with
+ * an initial byte value of 255) differs from how it is interpreted in the
+ * Type 1 format.
+ */
+
+/* Type 2 5-bytes encoding used. */
+static void
+put_numbers (double *argv, int argn, card8 **dest, card8 *limit)
+{
+ int i;
+
+ for (i = 0; i < argn; i++) {
+ double value;
+ long ivalue;
+ value = argv[i];
+ /* Nearest integer value */
+ ivalue = (long) floor(value+0.5);
+ if (value >= 0x8000L || value <= (-0x8000L - 1)) {
+ /*
+ * This number cannot be represented as a single operand.
+ * We must use `a b mul ...' or `a c div' to represent large values.
+ */
+ ERROR("Argument value too large. (This is bug)");
+ } else if (fabs(value - ivalue) > 3.0e-5) {
+ /* 16.16-bit signed fixed value */
+ DST_NEED(limit, *dest + 5);
+ *(*dest)++ = 255;
+ ivalue = (long) floor(value); /* mantissa */
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ ivalue = (long)((value - ivalue) * 0x10000l); /* fraction */
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ /* Everything else are integers. */
+ } else if (ivalue >= -107 && ivalue <= 107) {
+ DST_NEED(limit, *dest + 1);
+ *(*dest)++ = ivalue + 139;
+ } else if (ivalue >= 108 && ivalue <= 1131) {
+ DST_NEED(limit, *dest + 2);
+ ivalue = 0xf700u + ivalue - 108;
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ } else if (ivalue >= -1131 && ivalue <= -108) {
+ DST_NEED(limit, *dest + 2);
+ ivalue = 0xfb00u - ivalue - 108;
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = ivalue & 0xff;
+ } else if (ivalue >= -32768 && ivalue <= 32767) { /* shortint */
+ DST_NEED(limit, *dest + 3);
+ *(*dest)++ = 28;
+ *(*dest)++ = (ivalue >> 8) & 0xff;
+ *(*dest)++ = (ivalue) & 0xff;
+ } else { /* Shouldn't come here */
+ ERROR("Unexpected error.");
+ }
+ }
+
+ return;
+}
+
+static void
+get_integer (card8 **data, card8 *endptr)
+{
+ long result = 0;
+ card8 b0 = **data, b1, b2;
+
+ *data += 1;
+
+ if (b0 == 28) { /* shortint */
+ SRC_NEED(endptr, *data + 2);
+ b1 = **data;
+ b2 = *(*data+1);
+ result = b1*256+b2;
+ if (result > 0x7fff)
+ result -= 0x10000L;
+ *data += 2;
+ } else if (b0 >= 32 && b0 <= 246) { /* int (1) */
+ result = b0 - 139;
+ } else if (b0 >= 247 && b0 <= 250) { /* int (2) */
+ SRC_NEED(endptr, *data + 1);
+ b1 = **data;
+ result = (b0-247)*256+b1+108;
+ *data += 1;
+ } else if (b0 >= 251 && b0 <= 254) {
+ SRC_NEED(endptr, *data + 1);
+ b1 = **data;
+ result = -(b0-251)*256-b1-108;
+ *data += 1;
+ } else {
+ status = CS_PARSE_ERROR;
+ return;
+ }
+
+ LIMITCHECK(1);
+ cs_arg_stack[cs_stack_top++] = (double) result;
+
+ return;
+}
+
+/* Type 1 */
+static void
+get_longint (card8 **data, card8 *endptr)
+{
+ long result = 0;
+ int i;
+
+ *data += 1;
+ SRC_NEED(endptr, *data + 4);
+ result = **data;
+ if (result >= 0x80L)
+ result -= 0x100L;
+ *data += 1;
+ for (i = 1; i < 4; i++) {
+ result = result*256 + (**data);
+ *data += 1;
+ }
+
+ LIMITCHECK(1);
+ cs_arg_stack[cs_stack_top++] = (double) result;
+
+ return;
+}
+
+/*
+ * TODO:
+ * Check "seac"
+ * We cannot do backword parsing due to subroutine, div etc.
+ */
+
+/* Parse charstring and build charpath. */
+static void
+t1char_build_charpath (t1_chardesc *cd,
+ card8 **data, card8 *endptr, cff_index *subrs)
+{
+ card8 b0 = 0, *subr;
+ long len;
+
+ if (nest > CS_SUBR_NEST_MAX)
+ ERROR("Subroutine nested too deeply.");
+
+ nest++;
+ while (*data < endptr && status == CS_PARSE_OK) {
+ b0 = **data;
+ if (b0 == 255) {
+ get_longint(data, endptr); /* Type 1 */
+ } else if (b0 == cs_return) {
+ status = CS_SUBR_RETURN;
+ } else if (b0 == cs_callsubr) {
+ if (cs_stack_top < 1) {
+ status = CS_STACK_ERROR;
+ } else {
+ int idx;
+
+ idx = cs_arg_stack[--cs_stack_top];
+ if (!subrs || idx >= subrs->count)
+ ERROR("Invalid Subr#.");
+ subr = subrs->data + subrs->offset[idx] - 1;
+ len = subrs->offset[idx+1] - subrs->offset[idx];
+ t1char_build_charpath(cd, &subr, subr+len, subrs);
+ *data += 1;
+ }
+ } else if (b0 == cs_escape) {
+ do_operator2(cd, data, endptr);
+ } else if (b0 < 32 && b0 != 28) { /* 19, 20 need mask */
+ do_operator1(cd, data, endptr);
+ } else if ((b0 <= 22 && b0 >= 27) || b0 == 31) { /* reserved */
+ status = CS_PARSE_ERROR; /* not an error ? */
+ } else { /* integer */
+ get_integer(data, endptr);
+ }
+ }
+
+ if (status == CS_SUBR_RETURN) {
+ status = CS_PARSE_OK;
+ } else if (status == CS_CHAR_END && *data < endptr) {
+ if (!(*data == endptr - 1 && **data == cs_return))
+ WARN("Garbage after endchar. (%ld bytes)", (long) (endptr - *data));
+ } else if (status < CS_PARSE_OK) { /* error */
+ ERROR("Parsing charstring failed: (status=%d, stack=%d)", status, cs_stack_top);
+ }
+
+ nest--;
+
+ return;
+}
+
+/*
+ * Calculate BoundingBox and compress path.
+ * The essentials of PDF size reduction is not Type 2 charstring compression
+ * but Type 1 charstring encryption. Encryption makes lossless compression
+ * useless. We will only do very simple charstring compression.
+ */
+static void
+do_postproc (t1_chardesc *cd)
+{
+ int i;
+ t1_cpath *cur, *prev, *next;
+ double x, y;
+
+ if (!cd->charpath)
+ return;
+
+ /* Set dummy large value. */
+ cd->bbox.llx = cd->bbox.lly = 100000.0;
+ cd->bbox.urx = cd->bbox.ury = -100000.0;
+
+ cur = cd->charpath;
+ prev = NULL;
+ x = y = 0.0;
+
+#define UPDATE_BBOX(b,x,y) do {\
+ if ((b).llx > (x)) (b).llx = (x);\
+ if ((b).urx < (x)) (b).urx = (x);\
+ if ((b).lly > (y)) (b).lly = (y);\
+ if ((b).ury < (y)) (b).ury = (y);\
+} while (0)
+#define TRY_COMPACT (prev && cur && ((prev->num_args + cur->num_args) <= CS_ARG_STACK_MAX))
+
+ while (cur != NULL) {
+ next = cur->next;
+ switch (cur->type) {
+ case cs_rmoveto:
+ x += cur->args[0]; y += cur->args[1];
+ UPDATE_BBOX(cd->bbox, x, y);
+ break;
+ case cs_rlineto:
+ x += cur->args[0]; y += cur->args[1];
+ UPDATE_BBOX(cd->bbox, x, y);
+ if (TRY_COMPACT) {
+ if (prev->type == cs_rlineto) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ } else if (prev->type == cs_rrcurveto) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->type = cs_rcurveline;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ }
+ }
+ break;
+ case cs_hmoveto:
+ x += cur->args[0];
+ UPDATE_BBOX(cd->bbox, x, y);
+ break;
+ case cs_hlineto:
+ x += cur->args[0];
+ UPDATE_BBOX(cd->bbox, x, y);
+ if (TRY_COMPACT) {
+ if ((prev->type == cs_vlineto && (prev->num_args % 2) == 1) ||
+ (prev->type == cs_hlineto && (prev->num_args % 2) == 0)) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ }
+ }
+ break;
+ case cs_vmoveto:
+ y += cur->args[0];
+ UPDATE_BBOX(cd->bbox, x, y);
+ break;
+ case cs_vlineto:
+ y += cur->args[0];
+ UPDATE_BBOX(cd->bbox, x, y);
+ if (TRY_COMPACT) {
+ if ((prev->type == cs_hlineto && (prev->num_args % 2) == 1) ||
+ (prev->type == cs_vlineto && (prev->num_args % 2) == 0)) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ }
+ }
+ break;
+ case cs_rrcurveto:
+ for (i = 0; i < 3; i++) {
+ x += cur->args[2*i]; y += cur->args[2*i+1];
+ UPDATE_BBOX(cd->bbox, x, y);
+ }
+ if (TRY_COMPACT) {
+ if (prev->type == cs_rrcurveto) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ } else if (prev->type == cs_rlineto) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->type = cs_rlinecurve;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ }
+ }
+ break;
+ case cs_vhcurveto:
+ y += cur->args[0];
+ UPDATE_BBOX(cd->bbox, x, y);
+ x += cur->args[1]; y += cur->args[2];
+ UPDATE_BBOX(cd->bbox, x, y);
+ x += cur->args[3];
+ UPDATE_BBOX(cd->bbox, x, y);
+ if (TRY_COMPACT) {
+ if ((prev->type == cs_hvcurveto && ((prev->num_args / 4) % 2) == 1) ||
+ (prev->type == cs_vhcurveto && ((prev->num_args / 4) % 2) == 0)) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ }
+ }
+ break;
+ case cs_hvcurveto:
+ x += cur->args[0];
+ UPDATE_BBOX(cd->bbox, x, y);
+ x += cur->args[1]; y += cur->args[2];
+ UPDATE_BBOX(cd->bbox, x, y);
+ y += cur->args[3];
+ UPDATE_BBOX(cd->bbox, x, y);
+ if (TRY_COMPACT) {
+ if ((prev->type == cs_vhcurveto && ((prev->num_args / 4) % 2) == 1) ||
+ (prev->type == cs_hvcurveto && ((prev->num_args / 4) % 2) == 0)) {
+ copy_args(prev->args+prev->num_args, cur->args, cur->num_args);
+ prev->num_args += cur->num_args;
+ prev->next = next;
+ RELEASE(cur); cur = NULL;
+ }
+ }
+ break;
+ case cs_flex:
+ for (i = 0; i < 6; i++) {
+ x += cur->args[2*i]; y += cur->args[2*1+1];
+ UPDATE_BBOX(cd->bbox, x, y);
+ }
+ if (cur->args[12] == 50.0) {
+ if (cur->args[1] == 0.0 && cur->args[11] == 0.0 &&
+ cur->args[5] == 0.0 && cur->args[7] == 0.0 &&
+ cur->args[3] + cur->args[9] == 0.0) {
+ /* cur->args[0] = cur->args[0]; dx1 */
+ cur->args[1] = cur->args[2]; /* dx2 */
+ cur->args[2] = cur->args[3]; /* dy2 */
+ cur->args[3] = cur->args[4]; /* dx3 */
+ cur->args[4] = cur->args[6]; /* dx4 */
+ cur->args[5] = cur->args[8]; /* dx5 */
+ cur->args[6] = cur->args[10]; /* dx6 */
+ cur->num_args = 7;
+ cur->type = cs_hflex;
+ } else if (cur->args[5] == 0.0 && cur->args[7] == 0.0 &&
+ (cur->args[1] + cur->args[3] +
+ cur->args[9] + cur->args[11]) == 0) {
+ /* cur->args[0] = cur->args[0]; dx1 */
+ /* cur->args[1] = cur->args[1]; dy1 */
+ /* cur->args[2] = cur->args[2]; dx2 */
+ /* cur->args[3] = cur->args[3]; dy2 */
+ /* cur->args[4] = cur->args[4]; dx3 */
+ cur->args[5] = cur->args[6]; /* dx4 */
+ cur->args[6] = cur->args[8]; /* dx5 */
+ cur->args[7] = cur->args[9]; /* dy5 */
+ cur->args[8] = cur->args[10]; /* dx6 */
+ cur->num_args = 9;
+ cur->type = cs_hflex1;
+ }
+ }
+ break;
+ case CS_HINT_DECL:
+ case cs_cntrmask:
+ /* noop */
+ break;
+ default:
+ ERROR("Unexpected Type 2 charstring command %d.", cur->type);
+ break;
+ }
+ if (cur != NULL)
+ prev = cur;
+ cur = next;
+ }
+
+ /* Had no path. Fix lower-left point. */
+ if (cd->bbox.llx > cd->bbox.urx)
+ cd->bbox.llx = cd->bbox.urx = cd->sbw.wx;
+ if (cd->bbox.lly > cd->bbox.ury)
+ cd->bbox.lly = cd->bbox.ury = cd->sbw.wy;
+
+ return;
+}
+
+#define RESET_STATE() do {\
+ status = CS_PARSE_OK;\
+ phase = T1_CS_PHASE_INIT;\
+ nest = 0;\
+ ps_stack_top = 0;\
+} while (0)
+
+int
+t1char_get_metrics (card8 *src, long srclen, cff_index *subrs, t1_ginfo *ginfo)
+{
+ t1_chardesc t1char, *cd;
+
+ cd = &t1char;
+ init_charpath(cd);
+ RESET_STATE();
+ CLEARSTACK();
+ t1char_build_charpath(cd, &src, src+srclen, subrs);
+ if (cs_stack_top != 0 || ps_stack_top != 0)
+ WARN("Stack not empty. (%d, %d)", cs_stack_top, ps_stack_top);
+ do_postproc(cd);
+ if (ginfo) {
+ ginfo->wx = cd->sbw.wx;
+ ginfo->wy = cd->sbw.wy;
+ ginfo->bbox.llx = cd->bbox.llx;
+ ginfo->bbox.lly = cd->bbox.lly;
+ ginfo->bbox.urx = cd->bbox.urx;
+ ginfo->bbox.ury = cd->bbox.ury;
+ if (cd->flags & T1_CS_FLAG_USE_SEAC) {
+ ginfo->use_seac = 1;
+ ginfo->seac.adx = cd->seac.adx;
+ ginfo->seac.ady = cd->seac.ady;
+ ginfo->seac.bchar = cd->seac.bchar;
+ ginfo->seac.achar = cd->seac.achar;
+ } else {
+ ginfo->use_seac = 0;
+ }
+ }
+ release_charpath(cd);
+
+ return 0;
+}
+
+#define CHECK_BUFFER(n) if (dst+(n) >= endptr) {\
+ ERROR("Buffer overflow.");\
+}
+#define CHECK_STATUS() if (status != CS_PARSE_OK) {\
+ ERROR("Charstring encoder error: %d", status);\
+}
+
+/*
+ * Encode Charpath as a Type 2 Charstring
+ */
+static long
+t1char_encode_charpath (t1_chardesc *cd,
+ double default_width, double nominal_width,
+ card8 *dst, card8 *endptr)
+{
+ card8 *save;
+ t1_cpath *curr;
+
+ ASSERT(cd);
+
+ save = dst;
+ curr = cd->charpath;
+
+ RESET_STATE();
+ CLEARSTACK();
+ /*
+ * Advance Width
+ */
+ if (cd->sbw.wx != default_width) {
+ double wx = cd->sbw.wx - nominal_width;
+ put_numbers(&wx, 1, &dst, endptr);
+ CHECK_STATUS();
+ }
+ /*
+ * Hint Declaration
+ */
+ {
+ int num_hstems = 0, num_vstems = 0;
+ int i, reset = 1;
+ double stem[2];
+
+ for (i = 0; i < cd->num_stems && cd->stems[i].dir == HSTEM; i++) {
+ num_hstems++;
+ stem[0] = (reset ?
+ (cd->stems[i].pos) :
+ (cd->stems[i].pos - (cd->stems[i-1].pos + cd->stems[i-1].del)));
+ stem[1] = cd->stems[i].del;
+ put_numbers(stem, 2, &dst, endptr);
+ CHECK_STATUS();
+ reset = 0;
+ if (2*num_hstems == CS_ARG_STACK_MAX) {
+ CHECK_BUFFER(1);
+ *dst++ = (card8) ((cd->flags & T1_CS_FLAG_USE_HINTMASK) ? cs_hstemhm : cs_hstem);
+ reset = 1;
+ }
+ }
+ if (reset == 0) {
+ CHECK_BUFFER(1);
+ *dst++ = (card8) ((cd->flags & T1_CS_FLAG_USE_HINTMASK) ? cs_hstemhm : cs_hstem);
+ }
+ reset = 1;
+ if (cd->num_stems - num_hstems > 0) {
+ for (i = num_hstems; i < cd->num_stems; i++) {
+ num_vstems++;
+ stem[0] = (reset ?
+ (cd->stems[i].pos) :
+ (cd->stems[i].pos - (cd->stems[i-1].pos + cd->stems[i-1].del)));
+ stem[1] = cd->stems[i].del;
+ put_numbers(stem, 2, &dst, endptr);
+ CHECK_STATUS();
+ reset = 0;
+ if (2*num_vstems == CS_ARG_STACK_MAX) {
+ CHECK_BUFFER(1);
+ *dst++ = (card8) ((cd->flags & T1_CS_FLAG_USE_HINTMASK) ? cs_vstemhm : cs_vstem);
+ reset = 1;
+ }
+ }
+ if (reset == 0) {
+ CHECK_BUFFER(1);
+ if ((cd->flags & T1_CS_FLAG_USE_HINTMASK) ||
+ (cd->flags & T1_CS_FLAG_USE_CNTRMASK)) {
+ /*
+ * The vstem hint operator can be ommited if hstem and vstem hints
+ * are both declared at the beginning of a charstring, and is
+ * followed directly by the hintmask or cntrmask operators.
+ */
+ if (curr->type != CS_HINT_DECL &&
+ curr->type != cs_cntrmask) {
+ *dst++ = (card8) cs_vstemhm;
+ }
+ } else {
+ *dst++ = (card8) cs_vstem;
+ }
+ }
+ }
+ }
+ /*
+ * Path Construction and Hint Replacement
+ */
+ while (curr != NULL && curr->type != cs_endchar) {
+ switch (curr->type) {
+ case CS_HINT_DECL:
+ {
+ card8 hintmask[(CS_STEM_ZONE_MAX+7)/8];
+
+ memset(hintmask, 0, (cd->num_stems+7)/8);
+ while (curr != NULL && curr->type == CS_HINT_DECL) {
+ int stem_idx;
+
+ stem_idx = get_stem(cd, (int) curr->args[0]);
+ ASSERT(stem_idx < cd->num_stems);
+ hintmask[stem_idx/8] |= (1 << (7 - (stem_idx % 8)));
+ curr = curr->next;
+ }
+ if (cd->flags & T1_CS_FLAG_USE_HINTMASK) {
+ CHECK_BUFFER((cd->num_stems+7)/8 + 1);
+ *dst++ = (card8) cs_hintmask;
+ memcpy(dst, hintmask, (cd->num_stems+7)/8);
+ dst += (cd->num_stems+7)/8;
+ }
+ }
+ break;
+ case cs_cntrmask:
+ {
+ card8 cntrmask[(CS_STEM_ZONE_MAX+7)/8];
+ int stem_idx, i;
+
+ memset(cntrmask, 0, (cd->num_stems+7)/8);
+ for (i = 0; i < curr->num_args; i++) {
+ stem_idx = get_stem(cd, (int) curr->args[i]);
+ ASSERT(stem_idx < cd->num_stems);
+ cntrmask[stem_idx/8] |= (1 << (7 - (stem_idx % 8)));
+ }
+ CHECK_BUFFER((cd->num_stems+7)/8 + 1);
+ *dst++ = (card8) cs_cntrmask;
+ memcpy(dst, cntrmask, (cd->num_stems+7)/8);
+ dst += (cd->num_stems+7)/8;
+ curr = curr->next;
+ }
+ break;
+ case cs_rmoveto: case cs_hmoveto: case cs_vmoveto:
+ case cs_rlineto: case cs_hlineto: case cs_vlineto:
+ case cs_rrcurveto: case cs_hvcurveto: case cs_vhcurveto:
+ case cs_rlinecurve: case cs_rcurveline:
+ {
+ put_numbers(curr->args, curr->num_args, &dst, endptr);
+ CHECK_STATUS();
+ CHECK_BUFFER(1);
+ *dst++ = (card8) curr->type;
+ curr = curr->next;
+ }
+ break;
+ case cs_flex: case cs_hflex:
+ case cs_hflex1:
+ {
+ put_numbers(curr->args, curr->num_args, &dst, endptr);
+ CHECK_STATUS();
+ CHECK_BUFFER(2);
+ *dst++ = (card8) cs_escape;
+ *dst++ = (card8) curr->type;
+ curr = curr->next;
+ }
+ break;
+ default:
+ ERROR("Unknown Type 2 charstring command: %d", curr->type);
+ break;
+ }
+ }
+
+ /*
+ * (adx ady bchar achar) endchar
+ */
+ if (cd->flags & T1_CS_FLAG_USE_SEAC) {
+ double seac[4];
+ seac[0] = cd->seac.adx;
+ seac[1] = cd->seac.ady;
+ seac[2] = cd->seac.bchar;
+ seac[3] = cd->seac.achar;
+ put_numbers(seac, 4, &dst, endptr);
+ CHECK_STATUS();
+ CHECK_BUFFER(2);
+ WARN("Obsolete four arguments of \"endchar\" will be used for Type 1 \"seac\" operator.");
+ }
+ CHECK_BUFFER(1);
+ *dst++ = (card8) cs_endchar;
+
+ return (long) (dst - save);
+}
+
+long
+t1char_convert_charstring (card8 *dst, long dstlen,
+ card8 *src, long srclen, cff_index *subrs,
+ double default_width, double nominal_width,
+ t1_ginfo *ginfo)
+{
+ long length;
+ t1_chardesc t1char, *cd;
+
+ cd = &t1char;
+ init_charpath(cd);
+ RESET_STATE();
+ CLEARSTACK();
+ t1char_build_charpath(cd, &src, src+srclen, subrs);
+ if (cs_stack_top != 0 || ps_stack_top != 0)
+ WARN("Stack not empty. (%d, %d)", cs_stack_top, ps_stack_top);
+ do_postproc(cd);
+ SORT_STEMS(cd);
+
+ length = t1char_encode_charpath(cd, default_width, nominal_width, dst, dst+dstlen);
+
+ if (ginfo) {
+ ginfo->wx = cd->sbw.wx;
+ ginfo->wy = cd->sbw.wy;
+ ginfo->bbox.llx = cd->bbox.llx;
+ ginfo->bbox.lly = cd->bbox.lly;
+ ginfo->bbox.urx = cd->bbox.urx;
+ ginfo->bbox.ury = cd->bbox.ury;
+ if (cd->flags & T1_CS_FLAG_USE_SEAC) {
+ ginfo->use_seac = 1;
+ ginfo->seac.adx = cd->seac.adx;
+ ginfo->seac.ady = cd->seac.ady;
+ ginfo->seac.bchar = cd->seac.bchar;
+ ginfo->seac.achar = cd->seac.achar;
+ } else {
+ ginfo->use_seac = 0;
+ }
+ }
+ release_charpath(cd);
+
+ return length;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/t1_char.h b/Build/source/texk/xdvipdfmx/src/t1_char.h
new file mode 100644
index 00000000000..5240a3a39cc
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/t1_char.h
@@ -0,0 +1,26 @@
+#ifndef _T1_CSTR_H_
+#define _T1_CSTR_H_
+
+#include "cff_types.h"
+
+typedef struct {
+ int use_seac;
+ double wx, wy;
+ struct {
+ double llx, lly, urx, ury;
+ } bbox;
+ struct {
+ double asb, adx, ady;
+ card8 bchar, achar;
+ } seac;
+} t1_ginfo;
+
+extern int t1char_get_metrics (card8 *src, long srclen,
+ cff_index *subrs, t1_ginfo *ginfo);
+extern long t1char_convert_charstring (card8 *dst, long dstlen,
+ card8 *src, long srclen,
+ cff_index *subrs,
+ double default_width, double nominal_width,
+ t1_ginfo *ginfo);
+
+#endif /* _T1_CSTR_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/t1_load.c b/Build/source/texk/xdvipdfmx/src/t1_load.c
new file mode 100644
index 00000000000..ccb09703351
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/t1_load.c
@@ -0,0 +1,1197 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/t1_load.c,v 1.9 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <math.h>
+
+#include "system.h"
+#include "mfileio.h"
+#include "mem.h"
+#include "error.h"
+#include "numbers.h"
+
+#include "pdfobj.h"
+#include "pdffont.h"
+
+#include "pdfencoding.h"
+#include "unicode.h"
+
+#include "dpxutil.h"
+
+#include "pst_obj.h"
+#include "pst.h"
+
+#include "cff_limits.h"
+#include "cff_types.h"
+#include "cff_dict.h"
+#include "cff.h"
+
+#include "t1_load.h"
+
+/* Migrated from t1crypt */
+#define T1_EEKEY 55665u
+#define T1_CHARKEY 4330u
+
+#if 0
+/* We no longer need encryption. */
+static unsigned char t1_encrypt (unsigned char plain);
+#endif /* 0 */
+static void t1_crypt_init (unsigned short key);
+static unsigned char t1_decrypt (unsigned char cipher);
+static unsigned short r = T1_EEKEY, c1 = 52845, c2 = 22719;
+
+#if 0
+static unsigned char t1_encrypt (unsigned char plain)
+{
+ unsigned char cipher;
+ cipher = (plain ^ (r >> 8));
+ r = (cipher + r) * c1 + c2;
+ return cipher;
+}
+#endif /* 0 */
+
+static void t1_crypt_init (unsigned short key)
+{
+ r = key;
+}
+
+static unsigned char t1_decrypt (unsigned char cipher)
+{
+ unsigned char plain;
+ plain = (cipher ^ (r >> 8));
+ r = (cipher + r) * c1 + c2;
+ return plain;
+}
+/* T1CRYPT */
+
+#define MATCH_NAME(t,n) ((t) && PST_NAMETYPE((t)) && !strncmp(pst_data_ptr((t)),(n),strlen((n))))
+#define MATCH_OP(t,n) ((t) && PST_UNKNOWNTYPE((t)) && !strncmp(pst_data_ptr((t)),(n),strlen((n))))
+
+#define RELEASE_TOK(t) if ((t) != NULL) {\
+ pst_release_obj((t));\
+ (t) = NULL;\
+}
+
+static char *
+get_next_key (unsigned char **start, unsigned char *end)
+{
+ char *key = NULL;
+ pst_obj *tok;
+
+ while (*start < end &&
+ (tok = pst_get_token(start, end)) != NULL) {
+ if (PST_NAMETYPE(tok)) {
+ key = (char *) pst_getSV(tok);
+ RELEASE_TOK(tok);
+ break;
+ }
+ RELEASE_TOK(tok);
+ }
+
+ return key;
+}
+
+static int
+seek_operator (unsigned char **start, unsigned char *end, const char *op)
+{
+ pst_obj *tok = NULL;
+
+ while (*start < end &&
+ (tok = pst_get_token(start, end)) != NULL) {
+ if (MATCH_OP(tok, op)) {
+ break;
+ }
+ RELEASE_TOK(tok);
+ }
+
+ if (tok == NULL)
+ return -1;
+ RELEASE_TOK(tok);
+
+ return 0;
+}
+
+
+static int
+parse_svalue (unsigned char **start, unsigned char *end, char **value)
+{
+ pst_obj *tok;
+
+ tok = pst_get_token(start, end);
+ if (tok == NULL)
+ return -1;
+ else if (PST_NAMETYPE(tok) || PST_STRINGTYPE(tok))
+ *value = (char *) pst_getSV(tok);
+ else {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ RELEASE_TOK(tok);
+
+ return 1;
+}
+
+static int
+parse_bvalue (unsigned char **start, unsigned char *end, double *value)
+{
+ pst_obj *tok;
+
+ tok = pst_get_token(start, end);
+ if (tok == NULL)
+ return -1;
+ else if (PST_BOOLEANTYPE(tok))
+ *value = (double) pst_getIV(tok);
+ else {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ RELEASE_TOK(tok);
+
+ return 1;
+}
+
+static int
+parse_nvalue (unsigned char **start, unsigned char *end, double *value, int max)
+{
+ int argn = 0;
+ pst_obj *tok;
+
+ tok = pst_get_token(start, end);
+ if (tok == NULL)
+ return -1;
+ /*
+ * All array elements must be numeric token. (ATM compatible)
+ */
+ if (PST_NUMBERTYPE(tok) && max > 0) {
+ value[0] = (double) pst_getRV(tok);
+ argn = 1;
+ } else if (PST_MARKTYPE(tok)) {
+ /* It does not distinguish '[' and '{'... */
+ RELEASE_TOK(tok);
+ while (*start < end &&
+ (tok = pst_get_token(start, end)) != NULL &&
+ PST_NUMBERTYPE(tok) && argn < max) {
+ value[argn++] = (double) pst_getRV(tok);
+ RELEASE_TOK(tok);
+ }
+ if (tok == NULL)
+ return -1;
+ if (!MATCH_OP(tok, "]") && !MATCH_OP(tok, "}")) {
+ argn = -1;
+ }
+ }
+ RELEASE_TOK(tok);
+
+ return argn;
+}
+
+static const char *const StandardEncoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", "space", "exclam", "quotedbl",
+ "numbersign", "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus", "comma",
+ "hyphen", "period", "slash", "zero", "one",
+ "two", "three", "four", "five", "six",
+ "seven", "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question", "at",
+ "A", "B", "C", "D", "E",
+ "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y",
+ "Z", "bracketleft", "backslash", "bracketright", "asciicircum",
+ "underscore", "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g", "h",
+ "i", "j", "k", "l", "m",
+ "n", "o", "p", "q", "r",
+ "s", "t", "u", "v", "w",
+ "x", "y", "z", "braceleft", "bar",
+ "braceright", "asciitilde", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "exclamdown", "cent", "sterling", "fraction",
+ "yen", "florin", "section", "currency", "quotesingle",
+ "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi",
+ "fl", ".notdef", "endash", "dagger", "daggerdbl",
+ "periodcentered", ".notdef", "paragraph", "bullet", "quotesinglbase",
+ "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand",
+ ".notdef", "questiondown", ".notdef", "grave", "acute",
+ "circumflex", "tilde", "macron", "breve", "dotaccent",
+ "dieresis", ".notdef", "ring", "cedilla", ".notdef",
+ "hungarumlaut", "ogonek", "caron", "emdash", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ "AE", ".notdef", "ordfeminine", ".notdef", ".notdef",
+ ".notdef", ".notdef", "Lslash", "Oslash", "OE",
+ "ordmasculine", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", "ae", ".notdef", ".notdef", ".notdef",
+ "dotlessi", ".notdef", ".notdef", "lslash", "oslash",
+ "oe", "germandbls", ".notdef", ".notdef", ".notdef",
+ ".notdef"
+};
+
+static const char *const ISOLatin1Encoding[256] = {
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", "space", "exclam", "quotedbl",
+ "numbersign", "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus", "comma",
+ "hyphen", "period", "slash", "zero", "one",
+ "two", "three", "four", "five", "six",
+ "seven", "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question", "at",
+ "A", "B", "C", "D", "E",
+ "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y",
+ "Z", "bracketleft", "backslash", "bracketright", "asciicircum",
+ "underscore", "grave", "a", "b", "c",
+ "d", "e", "f", "g", "h",
+ "i", "j", "k", "l", "m",
+ "n", "o", "p", "q", "r",
+ "s", "t", "u", "v", "w",
+ "x", "y", "z", "braceleft", "bar",
+ "braceright", "asciitilde", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef", "dotlessi",
+ "quoteleft", "quoteright", "circumflex", "tilde", "macron",
+ "breve", "dotaccent", "dieresis", ".notdef", "ring",
+ "cedilla", ".notdef", "hungarumlaut", "ogonek", "caron",
+ "space", "exclamdown", "cent", "sterling", "currency",
+ "yen", "brokenbar", "section", "dieresis", "copyright",
+ "ordfeminine", "guillemotleft", "logicalnot", "hyphen",
+ "registered",
+ "macron", "degree", "plusminus", "twosuperior", "threesuperior",
+ "acute", "mu", "paragraph", "periodcentered", "cedilla",
+ "onesuperior", "ordmasculine", "guillemotright", "onequarter",
+ "onehalf",
+ "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex",
+ "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave",
+ "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde",
+ "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis",
+ "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex",
+ "Udieresis", "Yacute", "Thorn", "germandbls", "agrave",
+ "aacute", "acircumflex", "atilde", "adieresis", "aring",
+ "ae", "ccedilla", "egrave", "eacute", "ecircumflex",
+ "edieresis", "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute", "ocircumflex",
+ "otilde", "odieresis", "divide", "oslash", "ugrave",
+ "uacute", "ucircumflex", "udieresis", "yacute", "thorn",
+ "ydieresis"
+};
+
+static int
+parse_encoding (char **enc_vec, unsigned char **start, unsigned char *end, int mode)
+{
+ pst_obj *tok;
+ int code;
+
+ /*
+ * StandardEncoding def
+ * or
+ * ISOLatin1Encoding def
+ * or
+ * 0 1 255 {1 index exch /.notdef put } for
+ * dup int name put
+ * ...
+ * [readonly] def
+ */
+ tok = pst_get_token(start, end);
+ if (MATCH_OP(tok, "StandardEncoding")) {
+ RELEASE_TOK(tok);
+ if (enc_vec) {
+ for (code = 0; code < 256; code++) {
+ if (StandardEncoding[code] &&
+ strcmp(StandardEncoding[code], ".notdef") != 0) {
+ enc_vec[code] = NEW(strlen(StandardEncoding[code])+1, char);
+ strcpy(enc_vec[code], StandardEncoding[code]);
+ } else {
+ enc_vec[code] = NULL;
+ }
+ }
+ }
+ } else if (MATCH_OP(tok, "ISOLatin1Encoding")) {
+ RELEASE_TOK(tok);
+ if (enc_vec) {
+ for (code = 0; code < 256; code++) {
+ if (ISOLatin1Encoding[code] &&
+ strcmp(ISOLatin1Encoding[code], ".notdef") != 0) {
+ enc_vec[code] = NEW(strlen(ISOLatin1Encoding[code])+1, char);
+ strcpy(enc_vec[code], ISOLatin1Encoding[code]);
+ } else {
+ enc_vec[code] = NULL;
+ }
+ }
+ }
+ } else if (MATCH_OP(tok, "ExpertEncoding")) {
+ RELEASE_TOK(tok);
+ if (enc_vec) {
+ WARN("ExpertEncoding not supported.");
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ /*
+ * Not supported yet.
+ */
+ } else {
+ RELEASE_TOK(tok);
+ seek_operator(start, end, "array");
+ /*
+ * Pick all seaquences that matches "dup n /Name put" until
+ * occurrence of "def" or "readonly".
+ */
+ while (*start < end &&
+ (tok = pst_get_token(start, end)) != NULL) {
+ if (MATCH_OP(tok, "def") || MATCH_OP(tok, "readonly")) {
+ RELEASE_TOK(tok);
+ break;
+ } else if (!MATCH_OP(tok, "dup")) {
+ RELEASE_TOK(tok);
+ continue;
+ }
+ RELEASE_TOK(tok);
+
+ tok = pst_get_token(start, end);
+ if (!tok || !PST_INTEGERTYPE(tok) ||
+ (code = pst_getIV(tok)) > 255 || code < 0) {
+ RELEASE_TOK(tok);
+ continue;
+ }
+ RELEASE_TOK(tok);
+
+ tok = pst_get_token(start, end);
+ if (!tok || !PST_NAMETYPE(tok)) {
+ RELEASE_TOK(tok);
+ continue;
+ }
+ if (enc_vec) {
+ if (enc_vec[code])
+ RELEASE(enc_vec[code]);
+ enc_vec[code] = (char *) pst_getSV(tok);
+ }
+ RELEASE_TOK(tok);
+
+ tok = pst_get_token(start, end);
+ if (!MATCH_OP(tok, "put")) {
+ if (enc_vec[code]) {
+ RELEASE(enc_vec[code]);
+ enc_vec[code] = NULL;
+ }
+ RELEASE_TOK(tok);
+ continue;
+ }
+ RELEASE_TOK(tok);
+ }
+ }
+
+ return 0;
+}
+
+#ifndef CS_STR_LEN_MAX
+#define CS_STR_LEN_MAX 65536UL
+#endif
+#ifndef CFF_GLYPH_MAX
+#define CFF_GLYPH_MAX CFF_SID_MAX
+#endif
+
+static int
+parse_subrs (cff_font *font,
+ unsigned char **start, unsigned char *end, int lenIV, int mode)
+{
+ cff_index *subrs;
+ pst_obj *tok;
+ long i, count, offset, max_size;
+ long *offsets, *lengths;
+ card8 *data;
+
+ tok = pst_get_token(start, end);
+ if (!PST_INTEGERTYPE(tok) || pst_getIV(tok) < 0) {
+ WARN("Parsing Subrs failed.");
+ RELEASE_TOK(tok);
+ return -1;
+ }
+
+ count = pst_getIV(tok);
+ RELEASE_TOK(tok);
+
+ if (count == 0) {
+ font->subrs[0] = NULL;
+ return 0;
+ }
+
+ tok = pst_get_token(start, end);
+ if (!MATCH_OP(tok, "array")) {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ RELEASE_TOK(tok);
+
+ if (mode != 1) {
+ max_size = CS_STR_LEN_MAX;
+ data = NEW(max_size, card8);
+ offsets = NEW(count, long);
+ lengths = NEW(count, long);
+ memset(offsets, 0, sizeof(long)*count);
+ memset(lengths, 0, sizeof(long)*count);
+ } else {
+ max_size = 0;
+ data = NULL;
+ offsets = NULL;
+ lengths = NULL;
+ }
+
+ offset = 0;
+ /* dup subr# n-bytes RD n-binary-bytes NP */
+ for (i = 0; i < count;) {
+ long idx, len;
+
+ tok = pst_get_token(start, end);
+ if (!tok) {
+ if (data) RELEASE(data);
+ if (offsets) RELEASE(offsets);
+ if (lengths) RELEASE(lengths);
+ return -1;
+ } else if (MATCH_OP(tok, "ND") ||
+ MATCH_OP(tok, "|-") || MATCH_OP(tok, "def")) {
+ RELEASE_TOK(tok);
+ break;
+ } else if (!MATCH_OP(tok, "dup")) {
+ RELEASE_TOK(tok);
+ continue;
+ }
+ RELEASE_TOK(tok);
+
+ /* Found "dup" */
+ tok = pst_get_token(start, end);
+ if (!PST_INTEGERTYPE(tok) || pst_getIV(tok) < 0 ||
+ pst_getIV(tok) >= count) {
+ RELEASE_TOK(tok);
+ if (data) RELEASE(data);
+ if (offsets) RELEASE(offsets);
+ if (lengths) RELEASE(lengths);
+ return -1;
+ }
+ idx = pst_getIV(tok);
+ RELEASE_TOK(tok);
+
+ tok = pst_get_token(start, end);
+ if (!PST_INTEGERTYPE(tok) || pst_getIV(tok) < 0 ||
+ pst_getIV(tok) > CS_STR_LEN_MAX) {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ len = pst_getIV(tok);
+ RELEASE_TOK(tok);
+
+ tok = pst_get_token(start, end);
+ if (!MATCH_OP(tok, "RD") && !MATCH_OP(tok, "-|") &&
+ seek_operator(start, end, "readstring") < 0) {
+ RELEASE_TOK(tok);
+ if (data) RELEASE(data);
+ if (offsets) RELEASE(offsets);
+ if (lengths) RELEASE(lengths);
+ return -1;
+ }
+ RELEASE_TOK(tok);
+
+ *start += 1;
+ if (*start + len >= end) {
+ if (data) RELEASE(data);
+ if (offsets) RELEASE(offsets);
+ if (lengths) RELEASE(lengths);
+ return -1;
+ }
+ if (mode != 1) {
+ if (offset + len >= max_size) {
+ max_size += CS_STR_LEN_MAX;
+ data = RENEW(data, max_size, card8);
+ }
+ if (lenIV >= 0) {
+ long j;
+
+ offsets[idx] = offset;
+ lengths[idx] = len - lenIV;
+ t1_crypt_init(T1_CHARKEY);
+ for (j = 0; j < lenIV; j++)
+ t1_decrypt(*((*start)+j));
+ for (j = lenIV; j < len ; j++) {
+ data[offset] = (card8) t1_decrypt(*((*start)+j));
+ offset++;
+ }
+ } else if (len > 0) {
+ offsets[idx] = offset;
+ lengths[idx] = len;
+ memcpy(&data[offset], *start, len);
+ offset += len;
+ }
+ }
+ *start += len;
+ i++;
+ }
+
+ if (mode != 1) {
+ subrs = font->subrs[0] = cff_new_index(count);
+ subrs->data = NEW(offset, card8);
+ offset = 0;
+ for (i = 0; i < count; i++) {
+ subrs->offset[i] = offset + 1;
+ if (lengths[i] > 0) {
+ memcpy(subrs->data + offset, data + offsets[i], lengths[i]);
+ offset += lengths[i];
+ }
+ }
+ subrs->offset[count] = offset + 1;
+
+ RELEASE(data);
+ RELEASE(offsets);
+ RELEASE(lengths);
+ }
+
+ return 0;
+}
+
+static int
+parse_charstrings (cff_font *font,
+ unsigned char **start, unsigned char *end, int lenIV, int mode)
+{
+ cff_index *charstrings;
+ cff_charsets *charset;
+ pst_obj *tok;
+ long i, count, have_notdef;
+ long max_size, offset;
+
+ /* /CharStrings n dict dup begin
+ * /GlyphName n-bytes RD -n-binary-bytes- ND
+ * ...
+ * end
+ * - stack - ... /CharStrings dict
+ */
+ tok = pst_get_token(start, end);
+ if (!PST_INTEGERTYPE(tok) ||
+ pst_getIV(tok) < 0 || pst_getIV(tok) > CFF_GLYPH_MAX) {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ count = pst_getIV(tok);
+ RELEASE_TOK(tok);
+
+ if (mode != 1) {
+ charstrings = cff_new_index(count);
+ max_size = CS_STR_LEN_MAX;
+ charstrings->data = NEW(max_size, card8);
+ } else {
+ charstrings = NULL;
+ max_size = 0;
+ }
+ font->cstrings = charstrings;
+
+ charset = font->charsets = NEW(1, cff_charsets);
+ charset->format = 0;
+ charset->num_entries = count-1;
+ charset->data.glyphs = NEW(count-1, s_SID);
+ memset(charset->data.glyphs, 0, sizeof(s_SID)*(count-1));
+
+#ifdef XETEX
+ font->ft_to_gid = NEW(count, unsigned short);
+#endif
+
+ offset = 0;
+ have_notdef = 0; /* .notdef must be at gid = 0 in CFF */
+
+ seek_operator(start, end, "begin");
+ for (i = 0; i < count; i++) {
+ char *glyph_name;
+ long len, gid, j;
+
+ glyph_name = get_next_key(start, end);
+ if (!glyph_name) {
+ return -1;
+ } else if (!strcmp(glyph_name, ".notdef")) {
+ gid = 0;
+ have_notdef = 1;
+ } else if (have_notdef) {
+ gid = i;
+ } else if (i == count - 1) {
+ WARN("No .notdef glyph???");
+ return -1;
+ } else {
+ gid = i+1;
+ }
+#ifdef XETEX
+ font->ft_to_gid[i] = gid;
+#endif
+
+ if (gid > 0)
+ charset->data.glyphs[gid-1] = cff_add_string(font, glyph_name);
+ RELEASE(glyph_name);
+
+ tok = pst_get_token(start, end);
+ if (!PST_INTEGERTYPE(tok) ||
+ pst_getIV(tok) < 0 || pst_getIV(tok) > CS_STR_LEN_MAX) {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ len = pst_getIV(tok);
+ RELEASE_TOK(tok);
+
+ tok = pst_get_token(start, end);
+ if (!MATCH_OP(tok, "RD") &&
+ !MATCH_OP(tok, "-|") &&
+ seek_operator(start, end, "readstring") < 0) {
+ RELEASE_TOK(tok);
+ return -1;
+ }
+ RELEASE_TOK(tok);
+
+ if (*start + len + 1 >= end) {
+ return -1;
+ }
+ if (mode != 1) {
+ if (offset + len >= max_size) {
+ max_size += MAX(len, CS_STR_LEN_MAX);
+ charstrings->data = RENEW(charstrings->data, max_size, card8);
+ }
+ if (gid == 0) {
+ if (lenIV >= 0) {
+ memmove(charstrings->data + len - lenIV, charstrings->data, offset);
+ for (j = 1; j <= i; j++) {
+ charstrings->offset[j] += len - lenIV;
+ }
+ } else {
+ memmove(charstrings->data + len, charstrings->data, offset);
+ for (j = 1; j <= i; j++) {
+ charstrings->offset[j] += len;
+ }
+ }
+ }
+ }
+
+ *start += 1;
+ if (mode != 1) {
+ if (lenIV >= 0) {
+ t1_crypt_init(T1_CHARKEY);
+ for (j = 0; j < lenIV; j++)
+ t1_decrypt(*((*start)+j));
+ if (gid == 0) {
+ charstrings->offset[gid] = 1; /* start at 1 */
+ for (j = lenIV; j < len; j++) {
+ charstrings->data[j-lenIV] = t1_decrypt(*((*start)+j));
+ }
+ } else {
+ charstrings->offset[gid] = offset + 1; /* start at 1 */
+ for (j = lenIV; j < len; j++) {
+ charstrings->data[offset+j-lenIV] = t1_decrypt(*((*start)+j));
+ }
+ }
+ offset += len - lenIV;
+ } else {
+ if (gid == 0) {
+ charstrings->offset[gid] = 1;
+ memcpy(&charstrings->data[0], *start, len);
+ } else {
+ charstrings->offset[gid] = offset + 1;
+ memcpy(&charstrings->data[offset], *start, len);
+ }
+ offset += len;
+ }
+ }
+ *start += len;
+ }
+ if (mode != 1)
+ charstrings->offset[count] = offset + 1;
+ font->num_glyphs = count;
+
+ return 0;
+}
+
+#define CHECK_ARGN_EQ(n) if (argn != (n)) {\
+ WARN("%d values expected but only %d read.", (n), argn);\
+ RELEASE(key);\
+ return -1;\
+}
+#define CHECK_ARGN_GE(n) if (argn < (n)) {\
+ WARN("%d values expected but only %d read.", (n), argn);\
+ RELEASE(key);\
+ return -1;\
+}
+
+#define MAX_ARGS 127
+static int
+parse_part2 (cff_font *font, unsigned char **start, unsigned char *end, int mode)
+{
+ char *key;
+ double argv[MAX_ARGS];
+ int argn, lenIV = 4;
+
+ while (*start < end &&
+ (key = get_next_key(start, end)) != NULL) {
+ if (!strcmp(key, "Subrs")) {
+ /* levIV must appear before Subrs */
+ if (parse_subrs(font, start, end, lenIV, mode) < 0) {
+ RELEASE(key);
+ return -1;
+ }
+ } else if (!strcmp(key, "CharStrings")) {
+ if (parse_charstrings(font, start, end, lenIV, mode) < 0) {
+ RELEASE(key);
+ return -1;
+ }
+ } else if (!strcmp(key, "lenIV")) {
+ argn = parse_nvalue(start, end, argv, 1);
+ CHECK_ARGN_EQ(1);
+ lenIV = (int) argv[0];
+ } else if (!strcmp(key, "BlueValues") ||
+ !strcmp(key, "OtherBlues") ||
+ !strcmp(key, "FamilyBlues") ||
+ !strcmp(key, "FamilyOtherBlues") ||
+ !strcmp(key, "StemSnapH") ||
+ !strcmp(key, "StemSnapV")) {
+ /*
+ * Operand values are delta in CFF font dictionary encoding.
+ */
+ argn = parse_nvalue(start, end, argv, MAX_ARGS);
+ CHECK_ARGN_GE(0);
+ cff_dict_add(font->private[0], key, argn);
+ while (argn-- > 0) {
+ cff_dict_set(font->private[0], key, argn,
+ (argn == 0) ? argv[argn] : argv[argn] - argv[argn-1]);
+ }
+ } else if (!strcmp(key, "StdHW") ||
+ !strcmp(key, "StdVW") ||
+ !strcmp(key, "BlueScale") ||
+ !strcmp(key, "BlueShift") ||
+ !strcmp(key, "BlueFuzz") ||
+ !strcmp(key, "LanguageGroup") ||
+ !strcmp(key, "ExpansionFactor")) {
+ /*
+ * Value of StdHW and StdVW is described as an array in the
+ * Type 1 Font Specification but is a number in CFF format.
+ */
+ argn = parse_nvalue(start, end, argv, 1);
+ CHECK_ARGN_EQ(1);
+ cff_dict_add(font->private[0], key, 1);
+ cff_dict_set(font->private[0], key, 0, argv[0]);
+ } else if (!strcmp(key, "ForceBold")) {
+ argn = parse_bvalue(start, end, &(argv[0]));
+ CHECK_ARGN_EQ(1);
+ if (argv[0] != 0) {
+ cff_dict_add(font->private[0], key, 1);
+ cff_dict_set(font->private[0], key, 0, 1);
+ }
+ }
+ /*
+ * MinFeature, RndStemUp, UniqueID, Password ignored.
+ */
+ RELEASE(key);
+ }
+
+ return 0;
+}
+
+#ifndef TYPE1_NAME_LEN_MAX
+#define TYPE1_NAME_LEN_MAX 127
+#endif
+
+static long
+parse_part1 (cff_font *font, char **enc_vec,
+ unsigned char **start, unsigned char *end, int mode)
+{
+ char *key, *strval;
+ double argv[MAX_ARGS];
+ int argn; /* Macro CHECK_ARGN_XX assume 'argn' is used. */
+
+ /*
+ * We skip PostScript code inserted before the beginning of
+ * font dictionary so that parser will not be confused with
+ * it. See LMRoman10-Regular (lmr10.pfb) for example.
+ */
+ if (seek_operator(start, end, "begin") < 0)
+ return -1;
+
+ while (*start < end &&
+ (key = get_next_key(start, end)) != NULL) {
+ if (!strcmp(key, "Encoding")) {
+ if (parse_encoding(enc_vec, start, end, mode) < 0) {
+ RELEASE(key);
+ return -1;
+ }
+ } else if (!strcmp(key, "FontName")) {
+ argn = parse_svalue(start, end, &strval);
+ CHECK_ARGN_EQ(1);
+ if (strlen(strval) > TYPE1_NAME_LEN_MAX) {
+ WARN("FontName too long: %s (%d bytes)", strval, strlen(strval));
+ strval[TYPE1_NAME_LEN_MAX] = '\0';
+ }
+ cff_set_name(font, strval);
+ RELEASE(strval);
+ } else if (!strcmp(key, "FontType")) {
+ argn = parse_nvalue(start, end, argv, 1);
+ CHECK_ARGN_EQ(1);
+ if (argv[0] != 1.0) {
+ WARN("FontType %d not supported.", (int) argv[0]);
+ RELEASE(key);
+ return -1;
+ }
+#if 0
+ /* DISABLED:
+ *
+ * Subsetted font shouldn't have UniqueID.
+ */
+ } else if (!strcmp(key, "UniqueID")) {
+ argn = parse_nvalue(start, end, argv, 1);
+ CHECK_ARGN_EQ(1);
+ cff_dict_add(font->topdict, key, 1);
+ cff_dict_set(font->topdict, key, 0, argv[0]);
+#endif
+ } else if (!strcmp(key, "ItalicAngle") ||
+ !strcmp(key, "StrokeWidth") ||
+ !strcmp(key, "PaintType")) {
+ argn = parse_nvalue(start, end, argv, 1);
+ CHECK_ARGN_EQ(1);
+ if (argv[0] != 0.0) {
+#if 0
+ /*
+ * Positive value in Bitstream CharterBT-Italic ???
+ */
+ if (!strcmp(key, "ItalicAngle") && argv[0] > 0) {
+ WARN("Positive ItalicAngle value: %g", argv[0]);
+ argv[0] *= -1;
+ }
+#endif
+ cff_dict_add(font->topdict, key, 1);
+ cff_dict_set(font->topdict, key, 0, argv[0]);
+ }
+ } else if (!strcmp(key, "UnderLinePosition") ||
+ !strcmp(key, "UnderLineThickness")) {
+ argn = parse_nvalue(start, end, argv, 1);
+ CHECK_ARGN_EQ(1);
+ cff_dict_add(font->topdict, key, 1);
+ cff_dict_set(font->topdict, key, 0, argv[0]);
+ } else if (!strcmp(key, "FontBBox")) {
+ argn = parse_nvalue(start, end, argv, 4);
+ CHECK_ARGN_EQ(4);
+ cff_dict_add(font->topdict, key, 4);
+ while (argn-- > 0) {
+ cff_dict_set(font->topdict, key, argn, argv[argn]);
+ }
+ } else if (!strcmp(key, "FontMatrix")) {
+ argn = parse_nvalue(start, end, argv, 6);
+ CHECK_ARGN_EQ(6);
+ if (argv[0] != 0.001 || argv[1] != 0.0 || argv[2] != 0.0 ||
+ argv[3] != 0.001 || argv[4] != 0.0 || argv[5] != 0.0) {
+ cff_dict_add(font->topdict, key, 6);
+ while (argn-- > 0) {
+ cff_dict_set(font->topdict, key, argn, argv[argn]);
+ }
+ }
+ } else if (!strcmp(key, "version") || !strcmp(key, "Notice") ||
+ !strcmp(key, "FullName") || !strcmp(key, "FamilyName") ||
+ !strcmp(key, "Weight") || !strcmp(key, "Copyright")) {
+ /*
+ * FontInfo
+ */
+ argn = parse_svalue(start, end, &strval);
+ CHECK_ARGN_EQ(1);
+ {
+ s_SID sid;
+
+ cff_dict_add(font->topdict, key, 1);
+ if ((sid = cff_get_sid(font, strval)) == CFF_STRING_NOTDEF)
+ sid = cff_add_string(font, strval); /* FIXME */
+ cff_dict_set(font->topdict, key, 0, sid);
+ }
+ RELEASE(strval);
+ } else if (!strcmp(key, "IsFixedPitch")) {
+ argn = parse_bvalue(start, end, &(argv[0]));
+ CHECK_ARGN_EQ(1);
+ if (argv[0] != 0.0) {
+ cff_dict_add(font->private[0], key, 1);
+ cff_dict_set(font->private[0], key, 0, 1);
+ }
+ }
+ RELEASE(key);
+ }
+
+ return 0;
+}
+
+int
+is_pfb (FILE *fp)
+{
+ char sig[15];
+ int i, ch;
+
+ rewind(fp);
+ if ((ch = fgetc(fp)) != 128 ||
+ (ch = fgetc (fp)) < 0 || ch > 3) {
+ return 0;
+ }
+ for (i = 0; i < 4; i++) {
+ if ((ch = fgetc(fp)) < 0) {
+ return 0;
+ }
+ }
+ for (i = 0; i < 14; i++) {
+ if ((ch = fgetc(fp)) < 0) {
+ return 0;
+ }
+ sig[i] = (char) ch;
+ }
+ if (!memcmp(sig, "%!PS-AdobeFont", 14) ||
+ !memcmp(sig, "%!FontType1", 11)) {
+ return 1;
+ } else if (!memcmp(sig, "%!PS", 4)) {
+ sig[14] = '\0';
+ WARN("Ambiguous PostScript resource type: %s", sig);
+ return 1;
+ } else {
+ WARN("Not a PFB font file?");
+ return 0;
+ }
+
+ return 0;
+}
+
+
+#define PFB_SEG_TYPE_ASCII 1
+#define PFB_SEG_TYPE_BINARY 2
+
+static unsigned char *
+get_pfb_segment (FILE *fp, int expected_type, long *length)
+{
+ unsigned char *buffer;
+ long bytesread;
+
+ buffer = NULL; bytesread = 0;
+ for (;;) {
+ int ch;
+
+ ch = fgetc(fp);
+ if (ch < 0) {
+ break;
+ } else if (ch != 128) {
+ ERROR("Not a pfb file?");
+ }
+ ch = fgetc(fp);
+ if (ch < 0 || ch != expected_type) {
+ seek_relative(fp, -2);
+ break;
+ }
+ {
+ long slen, rlen;
+ int i;
+
+ slen = 0;
+ for (i = 0; i < 4; i++) {
+ if ((ch = fgetc(fp)) < 0) {
+ if (buffer)
+ RELEASE(buffer);
+ return NULL;
+ }
+ slen = slen + (ch << (8*i));
+ }
+ buffer = RENEW(buffer, bytesread + slen, unsigned char);
+ while (slen > 0) {
+ rlen = fread(buffer + bytesread, sizeof(unsigned char), slen, fp);
+ if (rlen < 0) {
+ if (buffer)
+ RELEASE(buffer);
+ return NULL;
+ }
+ slen -= rlen;
+ bytesread += rlen;
+ }
+ }
+ }
+ if (bytesread == 0) {
+ ERROR("PFB segment length zero?");
+ }
+
+ if (length)
+ *length = bytesread;
+ return buffer;
+}
+
+char *
+t1_get_standard_glyph (int code)
+{
+ if (!StandardEncoding[code])
+ return NULL;
+
+ return (char *) StandardEncoding[code];
+}
+
+int
+t1_get_fontname (FILE *fp, char *fontname)
+{
+ unsigned char *buffer, *start, *end;
+ long length;
+ char *key;
+ int fn_found = 0;
+
+ rewind(fp);
+ buffer = get_pfb_segment(fp, PFB_SEG_TYPE_ASCII, &length);
+ if (buffer == NULL || length == 0)
+ ERROR("Reading PFB (ASCII part) file failed.");
+ start = buffer;
+ end = buffer + length;
+
+ if (seek_operator(&start, end, "begin") < 0) {
+ RELEASE(buffer);
+ return -1;
+ }
+
+ while (!fn_found && start < end &&
+ (key = get_next_key(&start, end)) != NULL) {
+ if (!strcmp(key, "FontName")) {
+ char *strval;
+ if (parse_svalue(&start, end, &strval) == 1) {
+ if (strlen(strval) > TYPE1_NAME_LEN_MAX) {
+ WARN("FontName \"%s\" too long. (%d bytes)", strval, strlen(strval));
+ strval[TYPE1_NAME_LEN_MAX] = '\0';
+ }
+ strcpy(fontname, strval);
+ RELEASE(strval);
+ fn_found = 1;
+ }
+ }
+ RELEASE(key);
+ }
+ RELEASE(buffer);
+
+ return 0;
+}
+
+static void
+init_cff_font (cff_font *cff)
+{
+ cff->sfont = NULL;
+ cff->filter = 0;
+ cff->fontname = NULL;
+ cff->index = 0;
+ cff->flag = FONTTYPE_FONT;
+
+ cff->header.major = 1;
+ cff->header.minor = 0;
+ cff->header.hdr_size = 4;
+ cff->header.offsize = 4;
+ cff->name = cff_new_index(1);
+ cff->topdict = cff_new_dict();
+ cff->string = NULL;
+ cff->gsubr = cff_new_index(0); /* No Global Subr */
+ cff->encoding = NULL;
+ cff->charsets = NULL;
+ cff->fdselect = NULL;
+ cff->cstrings = NULL;
+ cff->fdarray = NULL;
+ cff->private = NEW(1, cff_dict *);
+ cff->private[0] = cff_new_dict();
+ cff->subrs = NEW(1, cff_index *);
+ cff->subrs[0] = NULL;
+
+ cff->offset = 0;
+ cff->gsubr_offset = 0;
+ cff->num_glyphs = 0;
+ cff->num_fds = 1;
+ cff->_string = cff_new_index(0);
+}
+
+cff_font *
+t1_load_font (char **enc_vec, int mode, FILE *fp)
+{
+ long length;
+ cff_font *cff;
+ unsigned char *buffer, *start, *end;
+
+ rewind(fp);
+ /* ASCII section */
+ buffer = get_pfb_segment(fp, PFB_SEG_TYPE_ASCII, &length);
+ if (buffer == NULL || length == 0) {
+ ERROR("Reading PFB (ASCII part) file failed.");
+ return NULL;
+ }
+
+ cff = NEW(1, cff_font);
+ init_cff_font(cff);
+
+ start = buffer; end = buffer + length;
+ if (parse_part1(cff, enc_vec, &start, end, mode) < 0) {
+ cff_close(cff);
+ RELEASE(buffer);
+ ERROR("Reading PFB (ASCII part) file failed.");
+ return NULL;
+ }
+ RELEASE(buffer);
+
+ /* Binary section */
+ buffer = get_pfb_segment(fp, PFB_SEG_TYPE_BINARY, &length);
+ if (buffer == NULL || length == 0) {
+ cff_close(cff);
+ RELEASE(buffer);
+ ERROR("Reading PFB (BINARY part) file failed.");
+ return NULL;
+ } else {
+ long i;
+
+ t1_crypt_init(T1_EEKEY);
+ for (i = 0; i < length; i++) {
+ buffer[i] = (unsigned char) t1_decrypt(buffer[i]);
+ }
+ }
+ start = buffer + 4; end = buffer + length;
+ if (parse_part2(cff, &start, end, mode) < 0) {
+ cff_close(cff);
+ RELEASE(buffer);
+ ERROR("Reading PFB (BINARY part) file failed.");
+ return NULL;
+ }
+ RELEASE(buffer);
+
+ cff_update_string(cff);
+
+ /* Remaining section ignored. */
+
+ return cff;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/t1_load.h b/Build/source/texk/xdvipdfmx/src/t1_load.h
new file mode 100644
index 00000000000..c1c7ca2ea9f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/t1_load.h
@@ -0,0 +1,11 @@
+
+#ifndef _T1_LOAD_H_
+#define _T1_LOAD_H_
+
+#include "cff.h"
+extern cff_font *t1_load_font (char **enc_vec, int mode, FILE *fp);
+extern int is_pfb (FILE *fp);
+extern int t1_get_fontname (FILE *fp, char *fontname);
+extern char *t1_get_standard_glyph (int code);
+
+#endif /* _T1_LOAD_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tfm.c b/Build/source/texk/xdvipdfmx/src/tfm.c
new file mode 100644
index 00000000000..cb2afbe4eb3
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tfm.c
@@ -0,0 +1,1203 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tfm.c,v 1.21 2005/07/27 15:47:44 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "mfileio.h"
+#include "error.h"
+
+#include "numbers.h"
+#include "dpxutil.h"
+
+#include "tfm.h"
+
+#define TFM_FORMAT 1
+#define OFM_FORMAT 2
+
+#define FWBASE ((double) (1<<20))
+
+static int verbose = 0;
+
+
+#ifndef WITHOUT_ASCII_PTEX
+/*
+ * ID is 9 for vertical JFM file.
+ */
+#define JFM_ID 11
+#define JFMV_ID 9
+#define IS_JFM(i) ((i) == JFM_ID || (i) == JFMV_ID)
+#endif /* !WITHOUT_ASCII_PTEX */
+
+/*
+ * TFM Record structure:
+ * Multiple TFM's may be read in at once.
+ */
+
+struct tfm_font
+{
+#ifndef WITHOUT_ASCII_PTEX
+ UNSIGNED_BYTE id;
+ UNSIGNED_BYTE nt;
+#endif /* !WITHOUT_ASCII_PTEX */
+#ifndef WITHOUT_OMEGA
+ SIGNED_QUAD level;
+#endif /* !WITHOUT_OMEGA */
+ UNSIGNED_QUAD wlenfile;
+ UNSIGNED_QUAD wlenheader;
+ UNSIGNED_QUAD bc, ec;
+ UNSIGNED_QUAD nwidths, nheights, ndepths;
+ UNSIGNED_QUAD nitcor, nlig, nkern, nextens;
+ UNSIGNED_QUAD nfonparm;
+#ifndef WITHOUT_OMEGA
+ UNSIGNED_QUAD fontdir;
+ UNSIGNED_QUAD nco, ncw, npc;
+#endif /* !WITHOUT_OMEGA */
+ SIGNED_QUAD *header;
+#ifndef WITHOUT_ASCII_PTEX
+ UNSIGNED_PAIR *chartypes;
+#endif /* !WITHOUT_ASCII_PTEX */
+ UNSIGNED_QUAD *char_info;
+ UNSIGNED_PAIR *width_index;
+ UNSIGNED_BYTE *height_index;
+ UNSIGNED_BYTE *depth_index;
+ SIGNED_QUAD *width;
+ SIGNED_QUAD *height;
+ SIGNED_QUAD *depth;
+};
+
+static void
+tfm_font_init (struct tfm_font *tfm)
+{
+ tfm->header = NULL;
+#ifndef WITHOUT_ASCII_PTEX
+ tfm->id = 0;
+ tfm->nt = 0;
+ tfm->chartypes = NULL;
+#endif /* !WITHOUT_ASCII_PTEX */
+#ifndef WITHOUT_OMEGA
+ tfm->level = 0;
+ tfm->fontdir = 0;
+ tfm->nco = tfm->ncw = tfm->npc = 0;
+#endif
+ tfm->char_info = NULL;
+ tfm->width_index = NULL;
+ tfm->height_index = NULL;
+ tfm->depth_index = NULL;
+ tfm->width = tfm->height = tfm->depth = NULL;
+}
+
+static void
+tfm_font_clear (struct tfm_font *tfm)
+{
+ if (tfm) {
+ if (tfm->header) {
+ RELEASE(tfm->header);
+ tfm->header = NULL;
+ }
+ if (tfm->char_info) {
+ RELEASE(tfm->char_info);
+ tfm->char_info = NULL;
+ }
+ if (tfm->width) {
+ RELEASE(tfm->width);
+ tfm->width = NULL;
+ }
+ if (tfm->height) {
+ RELEASE(tfm->height);
+ tfm->height = NULL;
+ }
+ if (tfm->depth) {
+ RELEASE(tfm->depth);
+ tfm->depth = NULL;
+ }
+#ifndef WITHOUT_ASCII_PTEX
+ if (tfm->chartypes) {
+ RELEASE(tfm->chartypes);
+ tfm->chartypes = NULL;
+ }
+#endif /* !WITHOUT_ASCII_PTEX */
+ if (tfm->width_index) {
+ RELEASE(tfm->width_index);
+ tfm->width_index = NULL;
+ }
+ if (tfm->height_index) {
+ RELEASE(tfm->height_index);
+ tfm->height_index = NULL;
+ }
+ if (tfm->depth_index) {
+ RELEASE(tfm->depth_index);
+ tfm->depth_index = NULL;
+ }
+ }
+}
+
+
+struct coverage
+{
+ long first_char;
+ unsigned short num_chars;
+};
+
+/*
+ * All characters in the same range have same metrics.
+ */
+
+struct range_map {
+ unsigned short num_coverages;
+ struct coverage *coverages;
+ unsigned short *indices;
+};
+
+/* Special case of num_coverages = 1 */
+struct char_map
+{
+ struct coverage coverage;
+ unsigned short *indices;
+};
+
+static void
+release_char_map (struct char_map *map)
+{
+ if (map->indices)
+ RELEASE(map->indices);
+ map->indices = NULL;
+ RELEASE(map);
+}
+
+static void
+release_range_map (struct range_map *map)
+{
+ if (map->coverages)
+ RELEASE(map->coverages);
+ if (map->indices)
+ RELEASE(map->indices);
+ map->coverages = NULL;
+ map->indices = NULL;
+ RELEASE(map);
+}
+
+static long
+lookup_char (const struct char_map *map, long charcode)
+{
+ if (charcode >= map->coverage.first_char &&
+ charcode <= map->coverage.first_char + map->coverage.num_chars)
+ return map->indices[charcode - map->coverage.first_char];
+ else
+ return -1;
+
+ return -1;
+}
+
+static long
+lookup_range (const struct range_map *map, long charcode)
+{
+ long idx;
+
+ for (idx = map->num_coverages - 1; idx >= 0 &&
+ charcode >= map->coverages[idx].first_char; idx--) {
+ if (charcode <=
+ map->coverages[idx].first_char + map->coverages[idx].num_chars)
+ return map->indices[idx];
+ }
+
+ return -1;
+}
+
+#define SOURCE_TYPE_TFM 0
+#define SOURCE_TYPE_JFM 1
+#define SOURCE_TYPE_OFM 2
+
+#define MAPTYPE_NONE 0
+#define MAPTYPE_CHAR 1
+#define MAPTYPE_RANGE 2
+
+#define FONT_DIR_HORIZ 0
+#define FONT_DIR_VERT 1
+
+struct font_metric
+{
+ char *tex_name;
+ fixword designsize;
+ char *codingscheme;
+
+ int fontdir;
+ long firstchar, lastchar;
+
+ fixword *widths;
+ fixword *heights;
+ fixword *depths;
+
+ struct {
+ int type;
+ void *data;
+ } charmap;
+
+ int source;
+};
+
+static void
+fm_init (struct font_metric *fm)
+{
+ fm->tex_name = NULL;
+ fm->firstchar = 0;
+ fm->lastchar = 0;
+ fm->fontdir = FONT_DIR_HORIZ;
+ fm->codingscheme = NULL;
+ fm->designsize = 0;
+
+ fm->widths = NULL;
+ fm->heights = NULL;
+ fm->depths = NULL;
+
+ fm->charmap.type = MAPTYPE_NONE;
+ fm->charmap.data = NULL;
+
+ fm->source = SOURCE_TYPE_TFM;
+}
+
+static void
+fm_clear (struct font_metric *fm)
+{
+ if (fm) {
+ if (fm->tex_name)
+ RELEASE(fm->tex_name);
+ if (fm->widths)
+ RELEASE(fm->widths);
+ if (fm->heights)
+ RELEASE(fm->heights);
+ if (fm->depths)
+ RELEASE(fm->depths);
+ if (fm->codingscheme)
+ RELEASE(fm->codingscheme);
+
+ switch (fm->charmap.type) {
+ case MAPTYPE_CHAR:
+ release_char_map(fm->charmap.data);
+ break;
+ case MAPTYPE_RANGE:
+ release_range_map(fm->charmap.data);
+ break;
+ }
+ }
+}
+
+#ifndef MAX_FONTS
+#define MAX_FONTS 16
+#endif
+
+struct font_metric *fms = NULL;
+static unsigned numfms = 0, max_fms = 0;
+
+static void
+fms_need (unsigned n)
+{
+ if (n > max_fms) {
+ max_fms = MAX(max_fms + MAX_FONTS, n);
+ fms = RENEW(fms, max_fms, struct font_metric);
+ }
+}
+
+void
+tfm_set_verbose (void)
+{
+ verbose++;
+}
+
+
+static long
+fread_fwords (SIGNED_QUAD *words, SIGNED_QUAD nmemb, FILE *fp)
+{
+ long i;
+
+ for (i = 0; i < nmemb; i++)
+ words[i] = get_signed_quad(fp);
+
+ return nmemb*4;
+}
+
+static long
+fread_uquads (UNSIGNED_QUAD *quads, SIGNED_QUAD nmemb, FILE *fp)
+{
+ long i;
+
+ for (i = 0; i < nmemb; i++) {
+ quads[i] = get_unsigned_quad(fp);
+ }
+
+ return nmemb*4;
+}
+
+/*
+ * TFM and JFM
+ */
+static void
+tfm_check_size (struct tfm_font *tfm, SIGNED_QUAD tfm_file_size)
+{
+ UNSIGNED_QUAD expected_size = 6;
+
+ /* Removed the warning message caused by EC TFM metric files.
+ *
+ if (tfm->wlenfile != tfm_file_size / 4) {
+ WARN("TFM file size is %ld bytes but it says it is %ld bytes!",
+ tfm_file_size, tfm->wlenfile * 4);
+ if (tfm_file_size > tfm->wlenfile * 4) {
+ WARN("Proceeding nervously...");
+ } else {
+ ERROR("Can't proceed...");
+ }
+ }
+ */
+ if (tfm_file_size < tfm->wlenfile * 4) {
+ ERROR("Can't proceed...");
+ }
+
+ expected_size += (tfm->ec - tfm->bc + 1);
+ expected_size += tfm->wlenheader;
+ expected_size += tfm->nwidths;
+ expected_size += tfm->nheights;
+ expected_size += tfm->ndepths;
+ expected_size += tfm->nitcor;
+ expected_size += tfm->nlig;
+ expected_size += tfm->nkern;
+ expected_size += tfm->nextens;
+ expected_size += tfm->nfonparm;
+#ifndef WITHOUT_ASCII_PTEX
+ if (IS_JFM(tfm->id)) {
+ expected_size += tfm->nt + 1;
+ }
+#endif /* !WITHOUT_ASCII_PTEX */
+ if (expected_size != tfm->wlenfile) {
+ WARN("TFM file size is expected to be %ld bytes but it says it is %ld bytes!",
+ expected_size * 4, tfm->wlenfile * 4);
+ if (tfm_file_size > expected_size *4) {
+ WARN("Proceeding nervously...");
+ } else {
+ ERROR("Can't proceed...");
+ }
+ }
+}
+
+static void
+tfm_get_sizes (FILE *tfm_file, SIGNED_QUAD tfm_file_size, struct tfm_font *tfm)
+{
+#ifndef WITHOUT_ASCII_PTEX
+ {
+ UNSIGNED_PAIR first_hword;
+
+ /*
+ * The first half word of TFM/JFM is TFM ID for JFM or size of
+ * TFM file in word for TFM. TFM with 9*4 or 11*4 bytes is not
+ * expected to be a valid TFM. So, we always assume that TFMs
+ * starting with 00 09 or 00 0B is JFM.
+ */
+ first_hword = get_unsigned_pair(tfm_file);
+ if (IS_JFM(first_hword)) {
+ tfm->id = first_hword;
+ tfm->nt = get_unsigned_pair(tfm_file);
+ tfm->wlenfile = get_unsigned_pair(tfm_file);
+ } else {
+ tfm->wlenfile = first_hword;
+ }
+ }
+#else /* WITHOUT_ASCII_PTEX */
+ tfm->wlenfile = get_unsigned_pair(tfm_file);
+#endif /* !WITHOUT_ASCII_PTEX */
+
+ tfm->wlenheader = get_unsigned_pair(tfm_file);
+ tfm->bc = get_unsigned_pair(tfm_file);
+ tfm->ec = get_unsigned_pair(tfm_file);
+ if (tfm->ec < tfm->bc) {
+ ERROR("TFM file error: ec(%u) < bc(%u) ???", tfm->ec, tfm->bc);
+ }
+ tfm->nwidths = get_unsigned_pair(tfm_file);
+ tfm->nheights = get_unsigned_pair(tfm_file);
+ tfm->ndepths = get_unsigned_pair(tfm_file);
+ tfm->nitcor = get_unsigned_pair(tfm_file);
+ tfm->nlig = get_unsigned_pair(tfm_file);
+ tfm->nkern = get_unsigned_pair(tfm_file);
+ tfm->nextens = get_unsigned_pair(tfm_file);
+ tfm->nfonparm = get_unsigned_pair(tfm_file);
+
+ tfm_check_size(tfm, tfm_file_size);
+
+ return;
+}
+
+#ifndef WITHOUT_ASCII_PTEX
+static void
+jfm_do_char_type_array (FILE *tfm_file, struct tfm_font *tfm)
+{
+ UNSIGNED_PAIR charcode;
+ UNSIGNED_PAIR chartype;
+ long i;
+
+ tfm->chartypes = NEW(65536, UNSIGNED_PAIR);
+ for (i = 0; i < 65536; i++) {
+ tfm->chartypes[i] = 0;
+ }
+ for (i = 0; i < tfm->nt; i++) {
+ charcode = get_unsigned_pair(tfm_file);
+ chartype = get_unsigned_pair(tfm_file);
+ tfm->chartypes[charcode] = chartype;
+ }
+}
+
+static void
+jfm_make_charmap (struct font_metric *fm, struct tfm_font *tfm)
+{
+ if (tfm->nt > 1) {
+ struct char_map *map;
+ long code;
+
+ fm->charmap.type = MAPTYPE_CHAR;
+ fm->charmap.data = map = NEW(1, struct char_map);
+ map->coverage.first_char = 0;
+ map->coverage.num_chars = 0xFFFFu;
+ map->indices = NEW(0x10000L, unsigned short);
+
+ for (code = 0; code <= 0xFFFFu; code++) {
+ map->indices[code] = tfm->chartypes[code];
+ }
+ } else {
+ struct range_map *map;
+
+ fm->charmap.type = MAPTYPE_RANGE;
+ fm->charmap.data = map = NEW(1, struct range_map);
+ map->num_coverages = 1;
+ map->coverages = NEW(map->num_coverages, struct coverage);
+ map->coverages[0].first_char = 0;
+ map->coverages[0].num_chars = 0xFFFFu;
+ map->indices = NEW(1, unsigned short);
+ map->indices[0] = 0; /* Only default type used. */
+ }
+}
+#endif /* !WITHOUT_ASCII_PTEX */
+
+static void
+tfm_unpack_arrays (struct font_metric *fm, struct tfm_font *tfm)
+{
+ UNSIGNED_QUAD charinfo;
+ UNSIGNED_PAIR width_index, height_index, depth_index;
+ int i;
+
+ fm->widths = NEW(256, fixword);
+ fm->heights = NEW(256, fixword);
+ fm->depths = NEW(256, fixword);
+ for (i = 0; i < 256; i++) {
+ fm->widths [i] = 0;
+ fm->heights[i] = 0;
+ fm->depths [i] = 0;
+ }
+
+ for (i = tfm->bc; i <= tfm->ec; i++ ) {
+ charinfo = tfm->char_info[i - tfm->bc];
+ width_index = (charinfo / 16777216ul);
+ height_index = (charinfo / 0x100000ul) & 0xf;
+ depth_index = (charinfo / 0x10000ul) & 0xf;
+ fm->widths [i] = tfm->width [width_index];
+ fm->heights[i] = tfm->height[height_index];
+ fm->depths [i] = tfm->depth [depth_index];
+ }
+
+ return;
+}
+
+static int
+sput_bigendian (char *s, SIGNED_QUAD v, int n)
+{
+ int i;
+
+ for (i = n-1; i >= 0; i--) {
+ s[i] = (char) (v & 0xff);
+ v >>= 8;
+ }
+
+ return n;
+}
+
+static void
+tfm_unpack_header (struct font_metric *fm, struct tfm_font *tfm)
+{
+ if (tfm->wlenheader < 12) {
+ fm->codingscheme = NULL;
+ } else {
+ int i, len;
+ char *p;
+
+ len = (tfm->header[2] >> 24);
+ if (len < 0 || len > 39)
+ ERROR("Invalid TFM header.");
+ if (len > 0) {
+ fm->codingscheme = NEW(40, char);
+ p = fm->codingscheme;
+ p += sput_bigendian(p, tfm->header[2], 3);
+ for (i = 1; i <= len / 4; i++) {
+ p += sput_bigendian(p, tfm->header[2+i], 4);
+ }
+ fm->codingscheme[len] = '\0';
+ } else {
+ fm->codingscheme = NULL;
+ }
+ }
+
+ fm->designsize = tfm->header[1];
+}
+
+#ifndef WITHOUT_OMEGA
+
+static void
+ofm_check_size_one (struct tfm_font *tfm, SIGNED_QUAD ofm_file_size)
+{
+ UNSIGNED_QUAD ofm_size = 14;
+
+ ofm_size += 2*(tfm->ec - tfm->bc + 1);
+ ofm_size += tfm->wlenheader;
+ ofm_size += tfm->nwidths;
+ ofm_size += tfm->nheights;
+ ofm_size += tfm->ndepths;
+ ofm_size += tfm->nitcor;
+ ofm_size += 2*(tfm->nlig);
+ ofm_size += tfm->nkern;
+ ofm_size += 2*(tfm->nextens);
+ ofm_size += tfm->nfonparm;
+ if (tfm->wlenfile != ofm_file_size / 4 ||
+ tfm->wlenfile != ofm_size) {
+ ERROR("OFM file problem. Table sizes don't agree.");
+ }
+}
+
+static void
+ofm_get_sizes (FILE *ofm_file, UNSIGNED_QUAD ofm_file_size, struct tfm_font *tfm)
+{
+ tfm->level = get_signed_quad(ofm_file);
+
+ tfm->wlenfile = get_signed_quad(ofm_file);
+ tfm->wlenheader = get_signed_quad(ofm_file);
+ tfm->bc = get_signed_quad(ofm_file);
+ tfm->ec = get_signed_quad(ofm_file);
+ if (tfm->ec < tfm->bc) {
+ ERROR("OFM file error: ec(%u) < bc(%u) ???", tfm->ec, tfm->bc);
+ }
+ tfm->nwidths = get_signed_quad(ofm_file);
+ tfm->nheights = get_signed_quad(ofm_file);
+ tfm->ndepths = get_signed_quad(ofm_file);
+ tfm->nitcor = get_signed_quad(ofm_file);
+ tfm->nlig = get_signed_quad(ofm_file);
+ tfm->nkern = get_signed_quad(ofm_file);
+ tfm->nextens = get_signed_quad(ofm_file);
+ tfm->nfonparm = get_signed_quad(ofm_file);
+ tfm->fontdir = get_signed_quad(ofm_file);
+ if (tfm->fontdir) {
+ WARN("I may be interpreting a font direction incorrectly.");
+ }
+ if (tfm->level == 0) {
+ ofm_check_size_one(tfm, ofm_file_size);
+ } else if (tfm->level == 1) {
+ tfm->nco = get_signed_quad(ofm_file);
+ tfm->ncw = get_signed_quad(ofm_file);
+ tfm->npc = get_signed_quad(ofm_file);
+ seek_absolute(ofm_file, 4*(tfm->nco - tfm->wlenheader));
+ } else {
+ ERROR("Can't handle OFM files with level > 1");
+ }
+
+ return;
+}
+
+static void
+ofm_do_char_info_zero (FILE *tfm_file, struct tfm_font *tfm)
+{
+ UNSIGNED_QUAD num_chars;
+
+ num_chars = tfm->ec - tfm->bc + 1;
+ if (num_chars != 0) {
+ UNSIGNED_QUAD i;
+
+ tfm->width_index = NEW(num_chars, UNSIGNED_PAIR);
+ tfm->height_index = NEW(num_chars, UNSIGNED_BYTE);
+ tfm->depth_index = NEW(num_chars, UNSIGNED_BYTE);
+ for (i = 0; i < num_chars; i++) {
+ tfm->width_index [i] = get_unsigned_pair(tfm_file);
+ tfm->height_index[i] = get_unsigned_byte(tfm_file);
+ tfm->depth_index [i] = get_unsigned_byte(tfm_file);
+ /* Ignore remaining quad */
+ get_unsigned_quad(tfm_file);
+ }
+ }
+}
+
+static void
+ofm_do_char_info_one (FILE *tfm_file, struct tfm_font *tfm)
+{
+ UNSIGNED_QUAD num_char_infos;
+ UNSIGNED_QUAD num_chars;
+
+ num_char_infos = tfm->ncw / (3 + (tfm->npc / 2));
+ num_chars = tfm->ec - tfm ->bc + 1;
+
+ if (num_chars != 0) {
+ UNSIGNED_QUAD i;
+ UNSIGNED_QUAD char_infos_read;
+
+ tfm->width_index = NEW(num_chars, UNSIGNED_PAIR);
+ tfm->height_index = NEW(num_chars, UNSIGNED_BYTE);
+ tfm->depth_index = NEW(num_chars, UNSIGNED_BYTE);
+ char_infos_read = 0;
+ for (i = 0; i < num_chars &&
+ char_infos_read < num_char_infos; i++) {
+ int repeats, j;
+
+ tfm->width_index [i] = get_unsigned_pair(tfm_file);
+ tfm->height_index[i] = get_unsigned_byte(tfm_file);
+ tfm->depth_index [i] = get_unsigned_byte(tfm_file);
+ /* Ignore next quad */
+ get_unsigned_quad(tfm_file);
+ repeats = get_unsigned_pair(tfm_file);
+ /* Skip params */
+ for (j = 0; j < tfm->npc; j++) {
+ get_unsigned_pair(tfm_file);
+ }
+ /* Remove word padding if necessary */
+ if (ISEVEN(tfm->npc)){
+ get_unsigned_pair(tfm_file);
+ }
+ char_infos_read++;
+ if (i + repeats > num_chars) {
+ ERROR("Repeats causes number of characters to be exceeded.");
+ }
+ for (j = 0; j < repeats; j++) {
+ tfm->width_index [i+j+1] = tfm->width_index [i];
+ tfm->height_index[i+j+1] = tfm->height_index[i];
+ tfm->depth_index [i+j+1] = tfm->depth_index [i];
+ }
+ /* Skip ahead because we have already handled repeats */
+ i += repeats;
+ }
+ }
+}
+
+static void
+ofm_unpack_arrays (struct font_metric *fm,
+ struct tfm_font *tfm, UNSIGNED_QUAD num_chars)
+{
+ long i;
+
+ fm->widths = NEW(tfm->bc + num_chars, fixword);
+ fm->heights = NEW(tfm->bc + num_chars, fixword);
+ fm->depths = NEW(tfm->bc + num_chars, fixword);
+ for (i = 0; i < num_chars; i++) {
+ fm->widths [tfm->bc + i] = tfm->width [ tfm->width_index [i] ];
+ fm->heights[tfm->bc + i] = tfm->height[ tfm->height_index[i] ];
+ fm->depths [tfm->bc + i] = tfm->depth [ tfm->depth_index [i] ];
+ }
+}
+
+static void
+read_ofm (struct font_metric *fm, FILE *ofm_file, UNSIGNED_QUAD ofm_file_size)
+{
+ struct tfm_font tfm;
+
+ tfm_font_init(&tfm);
+
+ ofm_get_sizes(ofm_file, ofm_file_size, &tfm);
+
+ if (tfm.level < 0 || tfm.level > 1)
+ ERROR ("OFM level %d not supported.", tfm.level);
+
+ if (tfm.wlenheader > 0) {
+ tfm.header = NEW(tfm.wlenheader, fixword);
+ fread_fwords(tfm.header, tfm.wlenheader, ofm_file);
+ }
+ if (tfm.level == 0) {
+ ofm_do_char_info_zero(ofm_file, &tfm);
+ } else if (tfm.level == 1) {
+ ofm_do_char_info_one(ofm_file, &tfm);
+ }
+ if (tfm.nwidths > 0) {
+ tfm.width = NEW(tfm.nwidths, fixword);
+ fread_fwords(tfm.width, tfm.nwidths, ofm_file);
+ }
+ if (tfm.nheights > 0) {
+ tfm.height = NEW(tfm.nheights, fixword);
+ fread_fwords(tfm.height, tfm.nheights, ofm_file);
+ }
+ if (tfm.ndepths > 0) {
+ tfm.depth = NEW(tfm.ndepths, fixword);
+ fread_fwords(tfm.depth, tfm.ndepths, ofm_file);
+ }
+
+ ofm_unpack_arrays(fm, &tfm, tfm.ec - tfm.bc + 1);
+ tfm_unpack_header(fm, &tfm);
+ fm->firstchar = tfm.bc;
+ fm->lastchar = tfm.ec;
+ fm->source = SOURCE_TYPE_OFM;
+
+ tfm_font_clear(&tfm);
+
+ return;
+}
+#endif /* !WITHOUT_OMEGA */
+
+static void
+read_tfm (struct font_metric *fm, FILE *tfm_file, UNSIGNED_QUAD tfm_file_size)
+{
+ struct tfm_font tfm;
+
+ tfm_font_init(&tfm);
+
+ tfm_get_sizes(tfm_file, tfm_file_size, &tfm);
+ fm->firstchar = tfm.bc;
+ fm->lastchar = tfm.ec;
+ if (tfm.wlenheader > 0) {
+ tfm.header = NEW(tfm.wlenheader, fixword);
+ fread_fwords(tfm.header, tfm.wlenheader, tfm_file);
+ }
+#ifndef WITHOUT_ASCII_PTEX
+ if (IS_JFM(tfm.id)) {
+ jfm_do_char_type_array(tfm_file, &tfm);
+ jfm_make_charmap(fm, &tfm);
+ fm->firstchar = 0;
+ fm->lastchar = 0xFFFFl;
+ fm->fontdir = (tfm.id == JFMV_ID) ? FONT_DIR_VERT : FONT_DIR_HORIZ;
+ fm->source = SOURCE_TYPE_JFM;
+ }
+#endif /* !WITHOUT_ASCII_PTEX */
+ if (tfm.ec - tfm.bc + 1 > 0) {
+ tfm.char_info = NEW(tfm.ec - tfm.bc + 1, UNSIGNED_QUAD);
+ fread_uquads(tfm.char_info, tfm.ec - tfm.bc + 1, tfm_file);
+ }
+ if (tfm.nwidths > 0) {
+ tfm.width = NEW(tfm.nwidths, fixword);
+ fread_fwords(tfm.width, tfm.nwidths, tfm_file);
+ }
+ if (tfm.nheights > 0) {
+ tfm.height = NEW(tfm.nheights, fixword);
+ fread_fwords(tfm.height, tfm.nheights, tfm_file);
+ }
+ if (tfm.ndepths > 0) {
+ tfm.depth = NEW(tfm.ndepths, fixword);
+ fread_fwords(tfm.depth, tfm.ndepths, tfm_file);
+ }
+ tfm_unpack_arrays(fm, &tfm);
+ tfm_unpack_header(fm, &tfm);
+
+ tfm_font_clear(&tfm);
+
+ return;
+}
+
+int
+tfm_open (const char *tfm_name, int must_exist)
+{
+ FILE *tfm_file;
+ int i, format = TFM_FORMAT;
+ UNSIGNED_QUAD tfm_file_size;
+ char *file_name = NULL;
+
+ for (i = 0; i < numfms; i++) {
+ if (!strcmp(tfm_name, fms[i].tex_name))
+ return i;
+ }
+
+ /*
+ * The procedure to search tfm or ofm files:
+ * 1. Search tfm file with the given name with the must_exist flag unset.
+ * 2. Search ofm file with the given name with the must_exist flag unset.
+ * 3. If not found and must_exist flag is set, try again to search
+ * tfm file with the must_exist flag set.
+ * 4. If not found and must_exist flag is not set, return -1.
+ */
+
+
+ /*
+ * We first look for OFM and then TFM.
+ * The reason for this change is incompatibility introduced when dvipdfmx
+ * started to write correct glyph metrics to output PDF for CID fonts.
+ * I'll not explain this in detail... This change is mostly specific to
+ * Japanese support.
+ */
+#if 0
+ if ((file_name = kpse_find_file(tfm_name, kpse_tfm_format, 0))) {
+ format = TFM_FORMAT;
+ } else if ((file_name = kpse_find_file(tfm_name, kpse_ofm_format, 0))) {
+ format = OFM_FORMAT;
+ }
+#endif
+ {
+ char *ofm_name, *suffix;
+
+ suffix = strrchr(tfm_name, '.');
+ if (!suffix || (strcmp(suffix, ".tfm") != 0 &&
+ strcmp(suffix, ".ofm") != 0)) {
+ ofm_name = NEW(strlen(tfm_name) + strlen(".ofm") + 1, char);
+ strcpy(ofm_name, tfm_name);
+ strcat(ofm_name, ".ofm");
+ } else {
+ ofm_name = NULL;
+ }
+ if (ofm_name &&
+ (file_name = kpse_find_file(ofm_name, kpse_ofm_format, 0)) != NULL) {
+ format = OFM_FORMAT;
+ } else if ((file_name =
+ kpse_find_file(tfm_name, kpse_tfm_format, 0)) != NULL) {
+ format = TFM_FORMAT;
+ } else if ((file_name =
+ kpse_find_file(tfm_name, kpse_ofm_format, 0)) != NULL) {
+ format = OFM_FORMAT;
+ }
+ if (ofm_name)
+ RELEASE(ofm_name);
+ }
+
+ /*
+ * In case that must_exist is set, MiKTeX returns always non-NULL value
+ * even if the tfm file is not found.
+ */
+ if (file_name == NULL) {
+ if (must_exist) {
+ if ((file_name = kpse_find_file(tfm_name, kpse_tfm_format, 1)) != NULL)
+ format = TFM_FORMAT;
+ else {
+ ERROR("Unable to find TFM file \"%s\".", tfm_name);
+ }
+ } else {
+ return -1;
+ }
+ }
+
+ tfm_file = MFOPEN(file_name, FOPEN_RBIN_MODE);
+ if (!tfm_file) {
+ ERROR("Could not open specified TFM/OFM file \"%s\".", tfm_name);
+ }
+
+ if (verbose) {
+ if (format == TFM_FORMAT)
+ MESG("(TFM:%s", tfm_name);
+ else if (format == OFM_FORMAT)
+ MESG("(OFM:%s", tfm_name);
+ if (verbose > 1)
+ MESG("[%s]", file_name);
+ }
+
+ tfm_file_size = file_size(tfm_file);
+ if (tfm_file_size < 24) {
+ ERROR("TFM/OFM file too small to be a valid file.");
+ }
+
+ fms_need(numfms + 1);
+ fm_init(fms + numfms);
+
+#ifndef WITHOUT_OMEGA
+ if (format == OFM_FORMAT)
+ read_ofm(&fms[numfms], tfm_file, tfm_file_size);
+ else
+#endif /* !WITHOUT_OMEGA */
+ {
+ read_tfm(&fms[numfms], tfm_file, tfm_file_size);
+ }
+
+ MFCLOSE(tfm_file);
+
+ fms[numfms].tex_name = NEW(strlen(tfm_name)+1, char);
+ strcpy(fms[numfms].tex_name, tfm_name);
+
+ if (verbose)
+ MESG(")");
+
+ return numfms++;
+}
+
+void
+tfm_close_all (void)
+{
+ int i;
+
+ if (fms) {
+ for (i = 0; i < numfms; i++) {
+ fm_clear(&(fms[i]));
+ }
+ RELEASE(fms);
+ }
+}
+
+#define CHECK_ID(n) do {\
+ if ((n) < 0 || (n) >= numfms)\
+ ERROR("TFM: Invalid TFM ID: %d", (n));\
+} while (0)
+
+fixword
+tfm_get_fw_width (int font_id, SIGNED_QUAD ch)
+{
+ struct font_metric *fm;
+ long idx = 0;
+
+ CHECK_ID(font_id);
+
+ fm = &(fms[font_id]);
+ if (ch >= fm->firstchar && ch <= fm->lastchar) {
+ switch (fm->charmap.type) {
+ case MAPTYPE_CHAR:
+ idx = lookup_char(fm->charmap.data, ch);
+ if (idx < 0)
+ ERROR("Invalid char: %ld\n", ch);
+ break;
+ case MAPTYPE_RANGE:
+ idx = lookup_range(fm->charmap.data, ch);
+ if (idx < 0)
+ ERROR("Invalid char: %ld\n", ch);
+ break;
+ default:
+ idx = ch;
+ }
+ } else {
+ ERROR("Invalid char: %ld\n", ch);
+ }
+
+ return fm->widths[idx];
+}
+
+fixword
+tfm_get_fw_height (int font_id, SIGNED_QUAD ch)
+{
+ struct font_metric *fm;
+ long idx = 0;
+
+ CHECK_ID(font_id);
+
+ fm = &(fms[font_id]);
+ if (ch >= fm->firstchar && ch <= fm->lastchar) {
+ switch (fm->charmap.type) {
+ case MAPTYPE_CHAR:
+ idx = lookup_char(fm->charmap.data, ch);
+ if (idx < 0)
+ ERROR("Invalid char: %ld\n", ch);
+ break;
+ case MAPTYPE_RANGE:
+ idx = lookup_range(fm->charmap.data, ch);
+ if (idx < 0)
+ ERROR("Invalid char: %ld\n", ch);
+ break;
+ default:
+ idx = ch;
+ }
+ } else {
+ ERROR("Invalid char: %ld\n", ch);
+ }
+
+ return fm->heights[idx];
+}
+
+fixword
+tfm_get_fw_depth (int font_id, SIGNED_QUAD ch)
+{
+ struct font_metric *fm;
+ long idx = 0;
+
+ CHECK_ID(font_id);
+
+ fm = &(fms[font_id]);
+ if (ch >= fm->firstchar && ch <= fm->lastchar) {
+ switch (fm->charmap.type) {
+ case MAPTYPE_CHAR:
+ idx = lookup_char(fm->charmap.data, ch);
+ if (idx < 0)
+ ERROR("Invalid char: %ld\n", ch);
+ break;
+ case MAPTYPE_RANGE:
+ idx = lookup_range(fm->charmap.data, ch);
+ if (idx < 0)
+ ERROR("Invalid char: %ld\n", ch);
+ break;
+ default:
+ idx = ch;
+ }
+ } else {
+ ERROR("Invalid char: %ld\n", ch);
+ }
+
+ return fm->depths[idx];
+}
+
+
+/*
+ * tfm_get_width returns the width of the font
+ * as a (double) fraction of the design size.
+ */
+double
+tfm_get_width (int font_id, SIGNED_QUAD ch)
+{
+ return ((double) tfm_get_fw_width(font_id, ch)/FWBASE);
+}
+
+double
+tfm_get_height (int font_id, SIGNED_QUAD ch)
+{
+ return ((double) tfm_get_fw_height(font_id, ch)/FWBASE);
+}
+
+double
+tfm_get_depth (int font_id, SIGNED_QUAD ch)
+{
+ return ((double) tfm_get_fw_depth(font_id, ch)/FWBASE);
+}
+
+/* tfm_string_xxx() do not work for OFM... */
+fixword
+tfm_string_width (int font_id, const unsigned char *s, unsigned len)
+{
+ fixword result = 0;
+ struct font_metric *fm;
+ unsigned i;
+
+ CHECK_ID(font_id);
+
+ fm = &(fms[font_id]);
+#ifndef WITHOUT_ASCII_PTEX
+ if (fm->source == SOURCE_TYPE_JFM) {
+ for (i = 0; i < len/2; i++) {
+ SIGNED_QUAD ch;
+
+ ch = (s[2*i] << 8)|s[2*i+1];
+ result += tfm_get_fw_width(font_id, ch);
+ }
+ } else
+#endif
+ for (i = 0; i < len; i++) {
+ result += tfm_get_fw_width(font_id, s[i]);
+ }
+
+ return result;
+}
+
+fixword
+tfm_string_depth (int font_id, const unsigned char *s, unsigned len)
+{
+ fixword result = 0;
+ struct font_metric *fm;
+ unsigned i;
+
+ CHECK_ID(font_id);
+
+ fm = &(fms[font_id]);
+#ifndef WITHOUT_ASCII_PTEX
+ if (fm->source == SOURCE_TYPE_JFM) {
+ for (i = 0; i < len/2; i++) {
+ SIGNED_QUAD ch;
+
+ ch = (s[2*i] << 8)|s[2*i+1];
+ result += tfm_get_fw_depth(font_id, ch);
+ }
+ } else
+#endif
+ for (i = 0; i < len; i++) {
+ result = MAX(result, tfm_get_fw_depth(font_id, s[i]));
+ }
+
+ return result;
+}
+
+fixword
+tfm_string_height (int font_id, const unsigned char *s, unsigned len)
+{
+ fixword result = 0;
+ struct font_metric *fm;
+ unsigned i;
+
+ CHECK_ID(font_id);
+
+ fm = &(fms[font_id]);
+#ifndef WITHOUT_ASCII_PTEX
+ if (fm->source == SOURCE_TYPE_JFM) {
+ for (i = 0; i < len/2; i++) {
+ SIGNED_QUAD ch;
+
+ ch = (s[2*i] << 8)|s[2*i+1];
+ result += tfm_get_fw_height(font_id, ch);
+ }
+ } else
+#endif
+ for (i = 0; i < len; i++) {
+ result = MAX(result, tfm_get_fw_height(font_id, s[i]));
+ }
+
+ return result;
+}
+
+double
+tfm_get_design_size (int font_id)
+{
+ CHECK_ID(font_id);
+
+ return (double) (fms[font_id].designsize)/FWBASE*(72.0/72.27);
+}
+
+char *
+tfm_get_codingscheme (int font_id)
+{
+ CHECK_ID(font_id);
+
+ return fms[font_id].codingscheme;
+}
+
+#ifndef WITHOUT_ASCII_PTEX
+/* Vertical version of JFM */
+int
+tfm_is_vert (int font_id)
+{
+ CHECK_ID(font_id);
+
+ return (fms[font_id].fontdir == FONT_DIR_VERT) ? 1 : 0;
+}
+#else /* WITHOUT_ASCII_PTEX */
+int
+tfm_is_vert (int font_id)
+{
+ return 0;
+}
+#endif /* !WITHOUT_ASCII_PTEX */
+
+int
+tfm_exists (const char *tfm_name)
+{
+ char *fullname;
+
+ fullname = kpse_find_file(tfm_name, kpse_ofm_format, 0);
+ if (fullname) {
+ RELEASE(fullname);
+ return 1;
+ }
+ fullname = kpse_find_file(tfm_name, kpse_tfm_format, 0);
+ if (fullname) {
+ RELEASE(fullname);
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/tfm.h b/Build/source/texk/xdvipdfmx/src/tfm.h
new file mode 100644
index 00000000000..e3306a49e82
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tfm.h
@@ -0,0 +1,57 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tfm.h,v 1.11 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TFM_H_
+#define _TFM_H_
+
+#include "numbers.h"
+
+extern void tfm_set_verbose (void);
+
+extern int tfm_open (const char * tex_name, int must_exist);
+extern void tfm_close_all (void);
+
+extern double tfm_get_width (int font_id, SIGNED_QUAD ch);
+extern double tfm_get_height (int font_id, SIGNED_QUAD ch);
+extern double tfm_get_depth (int font_id, SIGNED_QUAD ch);
+
+extern fixword tfm_get_fw_width (int font_id, SIGNED_QUAD ch);
+extern fixword tfm_get_fw_height (int font_id, SIGNED_QUAD ch);
+extern fixword tfm_get_fw_depth (int font_id, SIGNED_QUAD ch);
+
+extern fixword tfm_string_width (int font_id, const unsigned char *s, unsigned len);
+extern fixword tfm_string_depth (int font_id, const unsigned char *s, unsigned len);
+extern fixword tfm_string_height (int font_id, const unsigned char *s, unsigned len);
+
+extern double tfm_get_space (int font_id);
+
+/* From TFM header */
+extern double tfm_get_design_size (int font_id);
+extern char *tfm_get_codingscheme (int font_id);
+
+extern int tfm_is_vert (int font_id);
+
+extern int tfm_exists (const char *tfm_name);
+
+#endif /* _TFM_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/truetype.c b/Build/source/texk/xdvipdfmx/src/truetype.c
new file mode 100644
index 00000000000..f78fd3fdf75
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/truetype.c
@@ -0,0 +1,999 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/truetype.c,v 1.4 2005/08/30 07:52:33 chofchof Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+
+#include "numbers.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxfile.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+#include "pdfresource.h"
+#include "pdffont.h"
+
+#include "pdfencoding.h"
+#include "unicode.h"
+#include "agl.h"
+
+/* TrueType */
+#include "sfnt.h"
+#include "tt_cmap.h"
+#include "tt_table.h"
+#include "tt_glyf.h"
+#include "tt_post.h"
+#include "tt_gsub.h"
+#include "tt_aux.h"
+
+#include "truetype.h"
+
+/* Modifying this has no effect :P */
+#ifdef ENABLE_NOEMBED
+# undef ENABLE_NOEMBED
+#endif
+
+int
+pdf_font_open_truetype (pdf_font *font)
+{
+ char *ident;
+ int encoding_id;
+ pdf_obj *fontdict, *descriptor;
+ sfnt *sfont;
+ int embedding = 1; /* Must be embedded. */
+ FILE *fp = NULL;
+ int length, error = 0;
+
+ ASSERT( font );
+
+ ident = pdf_font_get_ident(font);
+
+ ASSERT( ident );
+
+#ifdef XETEX
+ sfont = sfnt_open(pdf_font_get_ft_face(font), SFNT_TYPE_TTC | SFNT_TYPE_TRUETYPE);
+ if (!sfont)
+ return -1;
+#else
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_TTFONT);
+ if (!fp)
+ return -1;
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont) {
+ WARN("Could not open TrueType font: %s", ident);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ if (sfont->type == SFNT_TYPE_TTC)
+ error = sfnt_read_table_directory(sfont, ttc_read_offset(sfont, 0));
+ else
+ error = sfnt_read_table_directory(sfont, 0);
+ if (error) {
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1; /* Silently */
+ }
+
+ /* Reading fontdict before checking fonttype conflicts with PKFONT
+ * because pdf_font_get_resource() always makes a dictionary.
+ */
+ encoding_id = pdf_font_get_encoding(font);
+ fontdict = pdf_font_get_resource(font);
+ descriptor = pdf_font_get_descriptor(font);
+#ifdef ENABLE_NOEMBED
+ embedding = pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED) ? 0 : 1;
+#endif /* ENABLE_NOEMBED */
+
+ ASSERT( fontdict && descriptor );
+
+ {
+ pdf_obj *tmp;
+ tmp = tt_get_fontdesc(sfont, &embedding, 1);
+ if (!tmp) {
+ ERROR("Could not obtain neccesary font info.");
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+ ASSERT(pdf_obj_typeof(tmp) == PDF_DICT);
+
+ pdf_merge_dict(descriptor, tmp);
+ pdf_release_obj(tmp);
+ }
+
+ if (!embedding) {
+ if (encoding_id >= 0 &&
+ !pdf_encoding_is_predefined(encoding_id)) {
+ ERROR("Custum encoding not allowed for non-embedded TrueType font.");
+ sfnt_close(sfont);
+ return -1;
+ } else {
+ /* There are basically no guarantee for font substitution
+ * can work with "symblic" fonts. At least all glyphs
+ * contained in the font must be identified; glyphs covers
+ * by this instance of font should contain glyphs only from
+ * Adobe Standard Latin Set. We allow non-embedded font
+ * only to predefined encodings for this reason. Note that
+ * "builtin" encoding means "MacRoman" here.
+ */
+ pdf_obj *tmp;
+ long flags;
+
+#ifndef ENABLE_NOEMBED
+ ERROR("Font file=\"%s\" can't be embedded due to liscence restrictions.", ident);
+#endif /* ENABLE_NOEMBED */
+ pdf_font_set_flags(font, PDF_FONT_FLAG_NOEMBED);
+ tmp = pdf_lookup_dict(descriptor, "Flags");
+ if (tmp && pdf_obj_typeof(tmp) == PDF_NUMBER) {
+ flags = (long) pdf_number_value(tmp);
+ flags &= (1 << 2); /* clear Symbolic */
+ flags |= (1 << 5); /* set Nonsymbolic */
+ pdf_add_dict(descriptor, pdf_new_name("Flags"), pdf_new_number(flags));
+ }
+ }
+ }
+
+ {
+ char fontname[256];
+ int n;
+
+ memset(fontname, 0, 256);
+ length = tt_get_ps_fontname(sfont, fontname, 255);
+ if (length < 1) {
+ length = MIN(strlen(ident), 255);
+ strncpy(fontname, ident, length);
+ }
+ fontname[length] = '\0';
+ for (n = 0; n < length; n++) {
+ if (fontname[n] == 0) {
+ memmove(fontname + n, fontname + n + 1, length - n - 1);
+ }
+ }
+ if (strlen(fontname) == 0)
+ ERROR("Can't find valid fontname for \"%s\".", ident);
+ pdf_font_set_fontname(font, fontname);
+ }
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("Type"), pdf_new_name("Font"));
+ pdf_add_dict(fontdict,
+ pdf_new_name("Subtype"), pdf_new_name("TrueType"));
+
+ /*
+ * We use MacRoman as "default" encoding.
+ */
+ if (encoding_id >= 0)
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_new_name(pdf_encoding_get_name(encoding_id)));
+ else {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_new_name("MacRomanEncoding"));
+ }
+
+ return 0;
+}
+
+/*
+ * The 'name' table should be preserved since it contains copyright
+ * information, but it might cause problem when there are invalid
+ * table entries (wrongly encoded text which is often the case in
+ * CJK fonts). Acrobat does not use 'name' table. Unicode TrueType
+ * fonts may have 10K bytes 'name' table...
+ *
+ * We preserve the 'OS/2' table too, since it contains the license
+ * information. PDF applications should use this table to decide
+ * whether the font is embedded only for the purpose of preview &
+ * printing. Otherwise, we must encrypt the document. Acrobat does
+ * not use 'OS/2' table, though...
+ */
+static struct
+{
+ const char *name;
+ int must_exist;
+} required_table[] = {
+ {"OS/2", 1}, {"head", 1}, {"hhea", 1}, {"loca", 1}, {"maxp", 1},
+ {"name", 1}, {"glyf", 1}, {"hmtx", 1}, {"fpgm", 0}, {"cvt ", 0},
+ {"prep", 0}, {"cmap", 1}, {NULL, 0}
+};
+
+static void
+do_widths (pdf_font *font, double *widths)
+{
+ pdf_obj *fontdict = pdf_font_get_resource (font);
+ char *usedchars = pdf_font_get_usedchars(font);
+ pdf_obj *tmparray;
+ int code, firstchar, lastchar;
+
+ firstchar = 255; lastchar = 0;
+ for (code = 0; code < 256; code++) {
+ if (usedchars[code]) {
+ if (code < firstchar) firstchar = code;
+ if (code > lastchar) lastchar = code;
+ }
+ }
+ if (firstchar > lastchar) {
+ WARN("No glyphs actually used???");
+ return;
+ }
+
+ tmparray = pdf_new_array();
+ for (code = firstchar; code <= lastchar; code++) {
+ if (usedchars[code])
+ pdf_add_array(tmparray,
+ pdf_new_number(ROUND(widths[code], 1)));
+ else {
+ pdf_add_array(tmparray, pdf_new_number(0.0));
+ }
+ }
+ if (pdf_array_length(tmparray) > 0) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Widths"), pdf_ref_obj(tmparray)); /* _FIXME_ */
+ }
+ pdf_release_obj(tmparray);
+ pdf_add_dict(fontdict,
+ pdf_new_name("FirstChar"), pdf_new_number(firstchar));
+ pdf_add_dict(fontdict,
+ pdf_new_name("LastChar"), pdf_new_number(lastchar));
+
+ return;
+}
+
+static int verbose = 0;
+
+#define PDFUNIT(v) ((double) (ROUND(1000.0*(v)/(glyphs->emsize), 1)))
+
+/*
+ * There are several issues in TrueType font support in PDF.
+ * How PDF viewers select TrueType cmap table is not so clear.
+ * Most reliable way seem to reencode font and sort glyphs as
+ * charcode == gid and to use Mac-Roman format 0 subtable.
+ * It does not work with encodings that uses full 256 range since
+ * GID = 0 is reserved for .notdef, so GID = 256 is not accessible.
+ */
+static int
+do_builtin_encoding (pdf_font *font, const char *usedchars, sfnt *sfont)
+{
+ struct tt_glyphs *glyphs;
+ char *cmap_table;
+ tt_cmap *ttcm;
+ USHORT gid, idx;
+ int code, count;
+ double widths[256];
+
+ ttcm = tt_cmap_read(sfont, TT_MAC, TT_MAC_ROMAN);
+ if (!ttcm) {
+ WARN("Could not read Mac-Roman TrueType cmap table...");
+ 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 */
+
+ glyphs = tt_build_init();
+
+ if (verbose > 2)
+ MESG("[glyphs:/.notdef");
+
+ count = 1; /* .notdef */
+ for (code = 0; code < 256; code++) {
+ if (!usedchars[code])
+ continue;
+
+ if (verbose > 2)
+ MESG("/.c0x%02x", code);
+
+ gid = tt_cmap_lookup(ttcm, code);
+ if (gid == 0) {
+ WARN("Glyph for character code=0x%02x missing in font font-file=\"%s\".",
+ code, pdf_font_get_ident(font));
+ idx = 0;
+ } else {
+ idx = tt_find_glyph(glyphs, gid);
+ if (idx == 0)
+ idx = tt_add_glyph(glyphs, gid, count); /* count returned. */
+ }
+ cmap_table[18+code] = idx & 0xff; /* bug here */
+ count++;
+ }
+ tt_cmap_release(ttcm);
+
+ if (verbose > 2)
+ MESG("]");
+
+ if (tt_build_tables(sfont, glyphs) < 0) {
+ WARN("Packing TrueType font into SFNT failed!");
+ tt_build_finish(glyphs);
+ RELEASE(cmap_table);
+ return -1;
+ }
+
+ for (code = 0; code < 256; code++) {
+ if (usedchars[code]) {
+ idx = tt_get_index(glyphs, (USHORT) cmap_table[18+code]);
+ widths[code] = PDFUNIT(glyphs->gd[idx].advw);
+ } else {
+ widths[code] = 0.0;
+ }
+ }
+ do_widths(font, widths);
+
+ if (verbose > 1)
+ MESG("[%d glyphs]", glyphs->num_glyphs);
+
+ tt_build_finish(glyphs);
+
+ sfnt_set_table(sfont, "cmap", cmap_table, 274);
+
+ return 0;
+}
+
+/* Order of lookup should be
+ * post, unicode+otl
+ */
+struct glyph_mapper
+{
+ tt_cmap *codetogid;
+ otl_gsub *gsub;
+ sfnt *sfont;
+ struct tt_post_table *nametogid;
+};
+
+
+/* WARNING: This modifies glyphname itself */
+static int
+agl_decompose_glyphname (char *glyphname, char **nptrs, int size, char **suffix)
+{
+ char *q, *p = glyphname;
+ int n;
+
+ q = strchr(p, '.'); /* chop every thing after *first* dot */
+ if (!q)
+ *suffix = NULL;
+ else {
+ *q = '\0'; q++;
+ *suffix = q;
+ }
+
+ nptrs[0] = p;
+ for (n = 1; p && *p; n++) {
+ p = strchr(p, '_');
+ if (!p || p[1] == '\0')
+ break;
+ if (n >= size)
+ ERROR("Uh ah..."); /* _FIXME_ */
+ *p = '\0'; p++;
+ nptrs[n] = p;
+ }
+
+ return n;
+}
+
+static int
+select_gsub (const char *feat, struct glyph_mapper *gm)
+{
+ int idx, error = 0;
+
+ if (!feat || *feat == 0 || !gm || !gm->gsub)
+ return -1;
+
+ /* First treat as is */
+ idx = otl_gsub_select(gm->gsub, "*", "*", feat);
+ if (idx >= 0)
+ return 0;
+
+ if (verbose > 1)
+ MESG("\ntrutype>> Try loading OTL GSUB for \"*.*.%s\"...", feat);
+ error = otl_gsub_add_feat(gm->gsub, "*", "*", feat, gm->sfont);
+ if (!error) {
+ idx = otl_gsub_select(gm->gsub, "*", "*", feat);
+ return (idx >= 0 ? 0 : -1);
+ }
+
+ return -1;
+}
+
+static int findparanoiac (const char *glyph_name, USHORT *gid, struct glyph_mapper *gm);
+static int resolve_glyph (const char *glyph_name, USHORT *gid, struct glyph_mapper *gm);
+
+/* Apply GSUB. This is a bit tricky... */
+static int
+selectglyph (USHORT in, const char *suffix, struct glyph_mapper *gm, USHORT *out)
+{
+ char *s, *q, t[5];
+ int n, error = 0;
+
+ ASSERT(suffix && gm && out);
+ ASSERT(suffix && *suffix != 0);
+
+ s = NEW(strlen(suffix) + 1, char);
+ strcpy(s, suffix);
+
+ /* First try converting suffix to feature tag.
+ * agl.c currently only knows less ambiguos cases;
+ * e.g., 'sc', 'superior', etc.
+ */
+ q = (char *) agl_suffix_to_otltag(s);
+ if (q) { /* We found feature tag for 'suffix'. */
+ error = select_gsub(q, gm); /* no fallback for this */
+ if (!error)
+ error = otl_gsub_apply(gm->gsub, &in);
+ } else { /* 'suffix' may represent feature tag. */
+ /* Try loading GSUB only when length of 'suffix' is less
+ * than or equal to 4. tt_gsub give a warning otherwise.
+ */
+ if (strlen(s) > 4)
+ error = -1; /* Uh */
+ else if (strlen(s) == 4)
+ error = select_gsub(s, gm);
+ else { /* less than 4. pad ' '. */
+ memset(t, ' ', 4); t[4] = '\0';
+ memcpy(t, s, strlen(s));
+ error = select_gsub(t, gm);
+ }
+ if (!error) /* 'suffix' represents feature tag. */
+ error = otl_gsub_apply(gm->gsub, &in);
+ else { /* other case: alt1, nalt10... (alternates) */
+ for (q = s + strlen(s) - 1; q > s && *q >= '0' && *q <= '9'; q--);
+ if (q == s)
+ error = -1;
+ else { /* starting at 1 */
+ n = atoi(q + 1) - 1; q[1] = '\0';
+ if (strlen(s) > 4)
+ error = -1;
+ else { /* This may be alternate substitution. */
+ memset(t, ' ', 4); t[4] = '\0';
+ memcpy(t, s, strlen(s));
+ error = select_gsub(s, gm);
+ if (!error)
+ error = otl_gsub_apply_alt(gm->gsub, n, &in);
+ }
+ }
+ }
+ }
+ RELEASE(s);
+
+ *out = in;
+ return error;
+}
+
+
+/* Compose glyphs via ligature substitution. */
+static int
+composeglyph (USHORT *glyphs, int n_glyphs,
+ const char *feat, struct glyph_mapper *gm, USHORT *gid)
+{
+ int error = 0;
+ char t[5] = {' ', ' ', ' ', ' ', 0};
+
+ ASSERT(glyphs && n_glyphs > 0 && gm && gid);
+
+ if (!feat || feat[0] == '\0') /* meaning "Unknown" */
+ error = select_gsub("(?lig|lig?|?cmp|cmp?|frac|afrc)", gm);
+ else {
+ if (strlen(feat) > 4)
+ error = -1;
+ else {
+ memcpy(t, feat, strlen(feat));
+ error = select_gsub(t, gm);
+ }
+ }
+
+ if (!error)
+ error = otl_gsub_apply_lig(gm->gsub, glyphs, n_glyphs, gid);
+
+ return error;
+}
+
+/* This may be called by findparanoiac(). */
+static int
+composeuchar (long *unicodes, int n_unicodes,
+ const char *feat, struct glyph_mapper *gm, USHORT *gid)
+{
+ USHORT *gids;
+ int i, error = 0;
+
+ if (!gm->codetogid)
+ return -1;
+
+ gids = NEW(n_unicodes, USHORT);
+ for (i = 0;
+ !error && i < n_unicodes; i++) {
+ gids[i] = tt_cmap_lookup(gm->codetogid, unicodes[i]);
+ error = (gids[i] == 0) ? -1 : 0;
+ }
+
+ if (!error)
+ error = composeglyph(gids, n_unicodes, feat, gm, gid);
+
+ RELEASE(gids);
+
+ return error;
+}
+
+/* Search 'post' table. */
+static int
+findposttable (const char *glyph_name, USHORT *gid, struct glyph_mapper *gm)
+{
+ if (!gm->nametogid)
+ return -1;
+
+ *gid = tt_lookup_post_table(gm->nametogid, glyph_name);
+#if 0
+ if (verbose > 1)
+ {
+ if (*gid > 0)
+ MESG("%s =post=> 0x%04X\n", glyph_name, *gid);
+ }
+#endif
+
+ return (*gid == 0 ? -1 : 0);
+}
+
+/* This is wrong. We must care about '.'. */
+#define is_comp(n) (strchr((n), '_') != NULL)
+
+/* Glyph names are concatinated with '_'. */
+static int
+findcomposite (const char *glyphname, USHORT *gid, struct glyph_mapper *gm)
+{
+ char *gname, *suffix = NULL;
+ USHORT gids[32];
+ char *nptrs[32];
+ int i, n_comp;
+ int error = 0;
+
+ error = findposttable(glyphname, gid, gm);
+ if (!error)
+ return 0;
+
+ gname = NEW(strlen(glyphname) + 1, char);
+ strcpy(gname, glyphname);
+
+ memset(gids, 0, 32 * sizeof(USHORT));
+ n_comp = agl_decompose_glyphname(gname, nptrs, 32, &suffix);
+ for (error = 0, i = 0; !error && i < n_comp; i++) {
+ error = resolve_glyph(nptrs[i], &gids[i], gm);
+ if (error)
+ WARN("Could not resolve glyph \"%s\" (%dth component of glyph \"%s\").",
+ nptrs[i], i, glyphname);
+ }
+
+ if (!error) {
+ if (suffix &&
+ (!strcmp(suffix, "liga") || !strcmp(suffix, "dlig") ||
+ !strcmp(suffix, "hlig") || !strcmp(suffix, "frac") ||
+ !strcmp(suffix, "ccmp") || !strcmp(suffix, "afrc")
+ )
+ ) {
+ error = composeglyph(gids, n_comp, suffix, gm, gid);
+ } else { /* first try composing glyph */
+ error = composeglyph(gids, n_comp, NULL, gm, gid);
+ if (!error && suffix) /* a_b_c.vert */
+ error = selectglyph(*gid, suffix, gm, gid);
+ }
+ }
+ RELEASE(gname);
+
+ return error;
+}
+
+/* glyphname should not have suffix here */
+static int
+findparanoiac (const char *glyphname, USHORT *gid, struct glyph_mapper *gm)
+{
+ agl_name *agln;
+ USHORT idx = 0U;
+ int error = 0;
+
+ agln = agl_lookup_list(glyphname);
+ while (agln && idx == 0) {
+ if (agln->suffix) {
+ error = findparanoiac(agln->name, &idx, gm);
+ if (error)
+ return error;
+
+ error = selectglyph(idx, agln->suffix, gm, &idx);
+ if (error) {
+ WARN("Variant \"%s\" for glyph \"%s\" might not be found.",
+ agln->suffix, agln->name);
+ WARN("Using glyph name without suffix instead...");
+ error = 0; /* ignore */
+ }
+ } else {
+ if (agln->n_components == 1)
+ idx = tt_cmap_lookup(gm->codetogid, agln->unicodes[0]);
+ else if (agln->n_components > 1) {
+ if (verbose >= 0) /* give warning */
+ WARN("Glyph \"%s\" looks like a composite glyph...",
+ agln->name);
+ error = composeuchar(agln->unicodes, agln->n_components, NULL, gm, &idx);
+ if (verbose >= 0) {
+ if (error)
+ WARN("Not found...");
+ else {
+ int _i, _n = 0;
+ char *_p, _buf[256];
+ WARN(">> Composite glyph glyph-name=\"%s\" found at glyph-id=\"%u\".",
+ agln->name, idx);
+ for (_p = _buf, _i = 0; _i < agln->n_components && _n < 245; _i++) {
+ _p[_n++] = _i == 0 ? '<' : ' ';
+ if (agln->unicodes[_i] >= 0x10000)
+ _n += sprintf(_p+_n, "U+%06lX", agln->unicodes[_i]);
+ else
+ _n += sprintf(_p+_n, "U+%04lX", agln->unicodes[_i]);
+ _p[_n++] = _i == agln->n_components - 1 ? '>' : ',';
+ }
+ _p[_n++] = '\0';
+ WARN(">> Input Unicode seq.=\"%s\" ==> glyph-id=\"%u\" in font-file=\"_please_try_-v_\".", _buf, idx);
+ }
+ }
+ } else ASSERT(0); /* Boooo */
+ }
+ agln = agln->alternate;
+ }
+
+ *gid = idx;
+ return (idx == 0 ? -1 : 0);
+}
+
+static int
+resolve_glyph (const char *glyphname, USHORT *gid, struct glyph_mapper *gm)
+{
+ int error = 0;
+ char *name, *suffix = NULL;
+ long ucv;
+
+ ASSERT(glyphname);
+
+ /*
+ * First we try glyph name to GID mapping using post table if post table
+ * is available. If post table is not available or glyph is not listed
+ * in the post table, then we try Unicode if Windows-Unicode TrueType
+ * cmap is available.
+ */
+ error = findposttable(glyphname, gid, gm);
+ if (!error)
+ return 0;
+
+ if (!gm->codetogid)
+ return -1;
+
+ name = agl_chop_suffix(glyphname, &suffix);
+ if (!name) /* .notdef, .foo */
+ error = -1;
+ else if (agl_name_is_unicode(name)) {
+ ucv = agl_name_convert_unicode(name);
+ *gid = tt_cmap_lookup(gm->codetogid, ucv);
+ error = (*gid == 0) ? -1 : 0;
+ } else {
+ error = findparanoiac(name, gid, gm);
+ }
+ if (!error && suffix) {
+ error = selectglyph(*gid, suffix, gm, gid);
+ if (error) {
+ WARN("Variant \"%s\" for glyph \"%s\" might not be found.",
+ suffix, name);
+ WARN("Using glyph name without suffix instead...");
+ error = 0; /* ignore */
+ }
+ }
+ if (suffix)
+ RELEASE(suffix);
+ if (name)
+ RELEASE(name);
+
+ return error;
+}
+
+/* Things are complicated. We still need to use PostScript
+ * glyph names. But OpenType fonts may not have PS name to
+ * glyph mapping. We use Unicode plus OTL GSUB for finding
+ * glyphs in this case.
+ */
+static int
+setup_glyph_mapper (struct glyph_mapper *gm, sfnt *sfont)
+{
+ gm->sfont = sfont;
+ gm->nametogid = tt_read_post_table(sfont);
+ gm->codetogid = tt_cmap_read(sfont, TT_WIN, TT_WIN_UCS4);
+ if (!gm->codetogid)
+ gm->codetogid = tt_cmap_read(sfont, TT_WIN, TT_WIN_UNICODE);
+
+ if (!gm->nametogid && !gm->codetogid)
+ return -1;
+
+ gm->gsub = otl_gsub_new();
+
+ return 0;
+}
+
+static void
+clean_glyph_mapper (struct glyph_mapper *gm)
+{
+ if (gm->gsub)
+ otl_gsub_release(gm->gsub);
+ if (gm->codetogid)
+ tt_cmap_release (gm->codetogid);
+ if (gm->nametogid)
+ tt_release_post_table(gm->nametogid);
+
+ gm->gsub = NULL;
+ gm->codetogid = NULL;
+ gm->nametogid = NULL;
+ gm->sfont = NULL;
+
+ return;
+}
+
+static int
+do_custum_encoding (pdf_font *font,
+ char **encoding, const char *usedchars, sfnt *sfont)
+{
+ struct tt_glyphs *glyphs;
+ char *cmap_table;
+ int code, count;
+ double widths[256];
+ struct glyph_mapper gm;
+ USHORT idx, gid;
+ int error = 0;
+
+ ASSERT(font && encoding && usedchars && sfont);
+
+ error = setup_glyph_mapper(&gm, sfont);
+ if (error) {
+ WARN("No post table nor Unicode cmap found in font: %s",
+ pdf_font_get_ident(font));
+ WARN(">> I can't find glyphs without this!");
+ 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 */
+
+ glyphs = tt_build_init();
+
+ count = 1; /* +1 for .notdef */
+ for (code = 0; code < 256; code++) {
+ if (!usedchars[code])
+ continue;
+
+ if (!encoding[code] || !strcmp(encoding[code], ".notdef")) {
+ WARN("Character code=\"0x%02X\" mapped to \".notdef\" glyph used in font font-file=\"%s\"",
+ code, pdf_font_get_ident(font));
+ WARN(">> Maybe incorrect encoding specified?");
+ idx = 0;
+ } else {
+ if (is_comp(encoding[code]))
+ error = findcomposite(encoding[code], &gid, &gm);
+ else
+ error = resolve_glyph(encoding[code], &gid, &gm);
+
+ /*
+ * Older versions of gs had problem with glyphs (other than .notdef)
+ * mapped to gid = 0.
+ */
+ if (error) {
+ WARN("Glyph \"%s\" not available in font \"%s\".",
+ encoding[code], pdf_font_get_ident(font));
+ } else {
+ if (verbose > 1)
+ MESG("truetype>> Glyph glyph-name=\"%s\" found at glyph-id=\"%u\".\n", encoding[code], gid);
+ }
+ idx = tt_find_glyph(glyphs, gid);
+ if (idx == 0) {
+ idx = tt_add_glyph(glyphs, gid, count); /* count returned. */
+ count++;
+ }
+ }
+ cmap_table[18 + code] = idx & 0xff; /* bug here */
+ }
+ clean_glyph_mapper(&gm);
+
+ if (tt_build_tables(sfont, glyphs) < 0) {
+ WARN("Packing TrueType font into SFNT file faild..."); /* _FIXME_: wrong message */
+ tt_build_finish(glyphs);
+ RELEASE(cmap_table);
+ return -1;
+ }
+
+ for (code = 0; code < 256; code++) {
+ if (usedchars[code]) {
+ idx = tt_get_index(glyphs, (USHORT) cmap_table[18+code]);
+ widths[code] = PDFUNIT(glyphs->gd[idx].advw);
+ } else {
+ widths[code] = 0.0;
+ }
+ }
+ do_widths(font, widths);
+
+ if (verbose > 1)
+ MESG("[%d glyphs]", glyphs->num_glyphs);
+
+ tt_build_finish(glyphs);
+
+ sfnt_set_table(sfont, "cmap", cmap_table, 274);
+
+ return 0;
+}
+
+int
+pdf_font_load_truetype (pdf_font *font)
+{
+ pdf_obj *fontdict = pdf_font_get_resource(font);
+ pdf_obj *descriptor = pdf_font_get_descriptor(font);
+ char *ident = pdf_font_get_ident(font);
+ int encoding_id = pdf_font_get_encoding(font);
+ char *usedchars = pdf_font_get_usedchars(font);
+#ifdef ENABLE_NOEMBED
+ int embedding = pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED) ? 0 : 1;
+#endif /* ENABLE_NOEMBED */
+ char **enc_vec;
+ pdf_obj *fontfile;
+ FILE *fp = NULL;
+ sfnt *sfont;
+ int i, error = 0;
+
+ if (!pdf_font_is_in_use(font))
+ return 0;
+
+ verbose = pdf_font_get_verbose();
+
+ if (!pdf_lookup_dict(fontdict, "ToUnicode")) {
+ if (encoding_id >= 0)
+ pdf_attach_ToUnicode_CMap(fontdict,
+ encoding_id, usedchars);
+ /* encoding_id < 0 means MacRoman here (but not really) */
+ }
+
+#ifdef XETEX
+ sfont = sfnt_open(pdf_font_get_ft_face(font), SFNT_TYPE_TTC | SFNT_TYPE_TRUETYPE);
+#else
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_TTFONT);
+ if (!fp)
+ ERROR("Unable to open TrueType font file: %s", ident); /* Should find *truetype* here */
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont) {
+ ERROR("Unable to open TrueType file: %s", ident);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ } else if (sfont->type != SFNT_TYPE_TRUETYPE &&
+ sfont->type != SFNT_TYPE_TTC) {
+ ERROR("Font \"%s\" not a TrueType font?", ident);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ if (sfont->type == SFNT_TYPE_TTC)
+ error = sfnt_read_table_directory(sfont, ttc_read_offset(sfont, 0));
+ else
+ error = sfnt_read_table_directory(sfont, 0);
+
+ if (error) {
+ ERROR("Reading SFND table dir failed for font-file=\"%s\"... Not a TrueType font?", ident);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ /*
+ * Create new TrueType cmap table with MacRoman encoding.
+ */
+ if (encoding_id < 0)
+ error = do_builtin_encoding(font, usedchars, sfont);
+ else {
+ enc_vec = pdf_encoding_get_encoding(encoding_id);
+ error = do_custum_encoding(font, enc_vec, usedchars, sfont);
+ }
+ if (error) {
+ ERROR("Error occured while creating font subfont for \"%s\"", ident);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+#if ENABLE_NOEMBED
+ if (!embedding) {
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return 0;
+ }
+#endif /* ENABLE_NOEMBED */
+
+ /*
+ * TODO: post table?
+ */
+
+ for (i = 0; required_table[i].name != NULL; i++) {
+ if (sfnt_require_table(sfont,
+ required_table[i].name,
+ required_table[i].must_exist) < 0) {
+ ERROR("Required TrueType table \"%s\" does not exist in font: %s",
+ required_table[i].name, ident);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+ }
+
+ /*
+ * FontFile2
+ */
+ fontfile = sfnt_create_FontFile_stream(sfont);
+ if (!fontfile)
+ ERROR("Could not created FontFile stream for \"%s\".", ident);
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ if (verbose > 1)
+ MESG("[%ld bytes]", pdf_stream_length(fontfile));
+
+ pdf_add_dict(descriptor,
+ pdf_new_name("FontFile2"), pdf_ref_obj(fontfile)); /* XXX */
+ pdf_release_obj(fontfile);
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/truetype.h b/Build/source/texk/xdvipdfmx/src/truetype.h
new file mode 100644
index 00000000000..d16b6860cfa
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/truetype.h
@@ -0,0 +1,33 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/truetype.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TRUETYPE_H_
+#define _TRUETYPE_H_
+
+#include "pdffont.h"
+
+extern int pdf_font_open_truetype (pdf_font *font);
+extern int pdf_font_load_truetype (pdf_font *font);
+
+#endif /* _TRUETYPE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tt_aux.c b/Build/source/texk/xdvipdfmx/src/tt_aux.c
new file mode 100644
index 00000000000..45d9a233da0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_aux.c
@@ -0,0 +1,297 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_aux.c,v 1.7 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "numbers.h"
+
+#include "pdfobj.h"
+
+#include "sfnt.h"
+#include "tt_table.h"
+#include "tt_post.h"
+#include "tt_aux.h"
+
+extern int always_embed; /* flag declared in dvipdfmx.c */
+
+ULONG ttc_read_offset (sfnt *sfont, int ttc_idx)
+{
+ LONG version;
+ ULONG offset = 0, num_dirs = 0;
+
+ if (sfont == NULL ||
+#ifdef XETEX
+ sfont->ft_face == NULL
+#else
+ sfont->stream == NULL
+#endif
+ )
+ ERROR("file not opened");
+
+ if (sfont->type != SFNT_TYPE_TTC)
+ ERROR("ttc_read_offset(): invalid font type");
+
+ sfnt_seek_set (sfont, 4); /* skip version tag */
+
+ version = sfnt_get_ulong(sfont);
+ num_dirs = sfnt_get_ulong(sfont);
+ if (ttc_idx < 0 || ttc_idx > num_dirs - 1)
+ ERROR("Invalid TTC index number");
+
+ sfnt_seek_set (sfont, 12 + ttc_idx * 4);
+ offset = sfnt_get_ulong (sfont);
+
+ return offset;
+}
+
+/*
+ Build FontDescriptor (except FontName) from TrueType tables:
+
+ Most information found in FontDescriptor is used only when automatic
+ font substitution is needed. (in the case of missing/broken font data)
+ Some PDF viewers may ignore embedded TrueType glyph data. Especially,
+ any embedded TrueType data for CID-keyed (CIDFontType 2) font is ignored
+ by PDF viewers that only support PDF versions 1.2 or earlier.
+
+ We use those tables to obtain various values of FontDescriptor.
+
+ head: required
+
+ xMin, xMax, yMin, yMax - FontBBox
+ unitsPerEm - conversion to PDF unit (points). see PDFUNIT bellow.
+ The head table must exist in any TrueType font.
+
+ hhea: required
+
+ When the OS/2 table (Windows and OS/2 only) is not available,
+ Ascender and Descender values can be used to estimate Ascent
+ and Descent. The hhea table is required for all TrueType fonts.
+ MaxWidth can be obtained from this table.
+
+ OS/2: required for Windows and OS/2 TrueType, and OpenType
+
+ fsType - liscensing information
+ sCapHeight - CapHeight (version 2 only)
+
+ The sCapHeight is only available in newer TrueType fonts which has
+ version 2 OS/2 table and generally not available. Instead, we can
+ use height of uppercase letter `H'. But we don't use it, we simply
+ use Ascent value.
+
+ sTypoAscender, sTypoDescender - Ascent and Descent
+ usWeightClass - roughly estimate StemV.
+
+ Estimation is based on the following expression:
+
+ stemv = (os2->usWeightClass/65)*(os2->usWeightClass/65)+50
+
+ . I've found this expression in some Adobe document (lost). We use
+ this expression also, otherwise, we must analyze glyph data.
+
+ xAvgCharWidth - AvgWidth (optional)
+ sFamilyClass - Flags
+ sFamilyClass and panose - Panose in Style dictionary (optional)
+
+ post: required
+
+ italicAngle - ItalicAngle
+
+*/
+
+
+#ifndef PDFUNIT
+#define PDFUNIT(v) (ROUND((1000.0*(v))/(head->unitsPerEm),1))
+#endif
+
+/* Flags: should not come here */
+#define FIXEDWIDTH (1 << 0) /* Fixed-width font */
+#define SERIF (1 << 1) /* Serif font */
+#define SYMBOLIC (1 << 2) /* Symbolic font */
+#define SCRIPT (1 << 3) /* Script font */
+#define STANDARD (1 << 5) /* Uses the Adobe Standard Character Set */
+#define ITALIC (1 << 6) /* Italic */
+#define ALLCAP (1 << 16) /* All-cap font */
+#define SMALLCAP (1 << 17) /* Small-cap font */
+#define FORCEBOLD (1 << 18) /* Force bold at small text sizes */
+pdf_obj *tt_get_fontdesc (sfnt *sfont, int *embed, int type)
+{
+ pdf_obj *descriptor = NULL;
+ pdf_obj *bbox = NULL;
+ int stemv = 0, flag = SYMBOLIC;
+ /* TrueType tables */
+ struct tt_head_table *head;
+ struct tt_os2__table *os2;
+ struct tt_post_table *post;
+
+ if (!sfont) {
+ ERROR("font file not opened");
+ }
+
+ os2 = tt_read_os2__table(sfont);
+ head = tt_read_head_table(sfont);
+ post = tt_read_post_table(sfont);
+ if (!post) {
+ RELEASE(os2);
+ RELEASE(head);
+ return NULL;
+ }
+
+ descriptor = pdf_new_dict();
+ pdf_add_dict (descriptor,
+ pdf_new_name ("Type"),
+ pdf_new_name ("FontDescriptor"));
+
+ if (*embed && os2) {
+ /*
+ License:
+
+ "Preview & Print embedding" (0x004) requires the document containing
+ Preview & Print font to be opened in read-only mode. However, licensing
+ information are lost when fonts are embedded in PDF document and
+ the only way to make the PDF document "read-only" is to encrypt it.
+ But we have no support for encryption yet. We do not embed any fonts
+ with "Preview & Print embedding" setting.
+
+ 2001/11/22: Changed to allow `Preview & Print' only fonts embedding
+
+ 2006/04/19: Added support for always_embed option
+ */
+ if (os2->fsType == 0x0000 || (os2->fsType & 0x0008)) {
+ /* the least restrictive license granted takes precedence. */
+ *embed = 1;
+ } else if (os2->fsType & 0x0004) {
+ static char previewWarningIssued = 0;
+ if (previewWarningIssued == 0) {
+ fprintf(stderr,
+ "\n** NOTICE: This document contains a `Preview & Print only' licensed font **\n");
+ previewWarningIssued = 1;
+ }
+ *embed = 1;
+ } else {
+ if (always_embed) {
+ static char licenseWarningIssued = 0;
+ if (licenseWarningIssued == 0) {
+ fprintf(stderr,
+ "\n** NOTICE: This document contains an embedded font with licensing restrictions **\n");
+ licenseWarningIssued = 1;
+ }
+ *embed = 1;
+ }
+ else {
+ fprintf(stderr,
+ "\n*** Embedding disabled due to licensing restriction ***\n");
+ *embed = 0;
+ }
+ }
+ }
+
+ if (os2) {
+ pdf_add_dict (descriptor,
+ pdf_new_name ("Ascent"),
+ pdf_new_number (PDFUNIT(os2->sTypoAscender)));
+ pdf_add_dict (descriptor,
+ pdf_new_name ("Descent"),
+ pdf_new_number (PDFUNIT(os2->sTypoDescender)));
+ stemv = (os2->usWeightClass/65)*(os2->usWeightClass/65)+50; /* arbitrary */
+ pdf_add_dict (descriptor,
+ pdf_new_name ("StemV"),
+ pdf_new_number (stemv));
+ if (os2->version == 0x0002) {
+ pdf_add_dict (descriptor,
+ pdf_new_name("CapHeight"),
+ pdf_new_number(PDFUNIT(os2->sCapHeight))
+ );
+ /* optional */
+ pdf_add_dict (descriptor,
+ pdf_new_name("XHeight"),
+ pdf_new_number(PDFUNIT(os2->sxHeight))
+ );
+ } else { /* arbitrary */
+ pdf_add_dict (descriptor,
+ pdf_new_name("CapHeight"),
+ pdf_new_number(PDFUNIT(os2->sTypoAscender))
+ );
+ }
+ /* optional */
+ pdf_add_dict (descriptor,
+ pdf_new_name ("AvgWidth"),
+ pdf_new_number (PDFUNIT(os2->xAvgCharWidth)));
+ }
+
+ /* BoundingBox (array) */
+ bbox = pdf_new_array ();
+ pdf_add_array (bbox, pdf_new_number (PDFUNIT(head->xMin)));
+ pdf_add_array (bbox, pdf_new_number (PDFUNIT(head->yMin)));
+ pdf_add_array (bbox, pdf_new_number (PDFUNIT(head->xMax)));
+ pdf_add_array (bbox, pdf_new_number (PDFUNIT(head->yMax)));
+ pdf_add_dict (descriptor, pdf_new_name ("FontBBox"), bbox);
+
+ /* post */
+ pdf_add_dict (descriptor,
+ pdf_new_name ("ItalicAngle"),
+ pdf_new_number(fixed(post->italicAngle)));
+
+ /* Flags */
+ if (os2) {
+ if (os2->fsSelection & (1 << 0))
+ flag |= ITALIC;
+ if (os2->fsSelection & (1 << 5))
+ flag |= FORCEBOLD;
+ if (((os2->sFamilyClass >> 8) & 0xff) != 8)
+ flag |= SERIF;
+ if (((os2->sFamilyClass >> 8) & 0xff) == 10)
+ flag |= SCRIPT;
+ if (post->isFixedPitch)
+ flag |= FIXEDWIDTH;
+ }
+ pdf_add_dict (descriptor,
+ pdf_new_name ("Flags"),
+ pdf_new_number (flag));
+
+ /* insert panose if you want */
+ if (type == 0 && os2) { /* cid-keyed font - add panose */
+ pdf_obj *styledict = NULL;
+ unsigned char panose[12];
+
+ panose[0] = os2->sFamilyClass >> 8;
+ panose[1] = os2->sFamilyClass & 0xff;
+ memcpy(panose+2, os2->panose, 10);
+
+ styledict = pdf_new_dict ();
+ pdf_add_dict (styledict, pdf_new_name ("Panose"),
+ pdf_new_string (panose, 12));
+ pdf_add_dict (descriptor, pdf_new_name ("Style"), styledict);
+ }
+
+ RELEASE(head);
+ if (os2)
+ RELEASE(os2);
+ tt_release_post_table(post);
+
+ return descriptor;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/tt_aux.h b/Build/source/texk/xdvipdfmx/src/tt_aux.h
new file mode 100644
index 00000000000..d2528d53335
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_aux.h
@@ -0,0 +1,35 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_aux.h,v 1.5 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TT_AUX_H_
+#define _TT_AUX_H_
+
+#include "pdfobj.h"
+#include "sfnt.h"
+
+/* TTC (TrueType Collection) */
+extern ULONG ttc_read_offset (sfnt *sfont, int ttc_idx);
+
+/* FontDescriptor */
+extern pdf_obj *tt_get_fontdesc (sfnt *sfont, int *embed, int type);
+
+#endif /* _TT_AUX_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tt_cmap.c b/Build/source/texk/xdvipdfmx/src/tt_cmap.c
new file mode 100644
index 00000000000..1681dad8230
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_cmap.c
@@ -0,0 +1,1906 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_cmap.c,v 1.24 2005/07/08 14:18:05 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * A large part of codes are brought from ttfdump-0.5.5.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "sfnt.h"
+
+
+/* Sorry for placing this here.
+ * We need to rewrite TrueType font support code...
+ */
+#include "cmap.h"
+#include "cmap_write.h"
+
+#include "tt_aux.h"
+#include "tt_gsub.h"
+#include "tt_post.h"
+
+#include "unicode.h"
+#include "agl.h"
+#include "pdfparse.h"
+#include "pdfresource.h"
+#include "otl_conf.h"
+
+#include "dpxfile.h"
+
+/* Hash */
+#include "dpxutil.h"
+
+#include "tt_cmap.h"
+
+#define VERBOSE_LEVEL_MIN 0
+static int verbose = 0;
+void
+otf_cmap_set_verbose (void)
+{
+ otl_gsub_set_verbose();
+ verbose++;
+}
+
+/* format 0: byte encoding table */
+struct cmap0
+{
+ BYTE glyphIndexArray[256];
+};
+
+static struct cmap0 *
+read_cmap0 (sfnt *sfont, ULONG len)
+{
+ struct cmap0 *map;
+ int i;
+
+ if (len < 256)
+ ERROR("invalid cmap subtable");
+
+ map = NEW(1, struct cmap0);
+
+ for (i = 0; i < 256; i++)
+ map->glyphIndexArray[i] = sfnt_get_byte(sfont);
+
+ return map;
+}
+
+static void
+release_cmap0(struct cmap0 *map)
+{
+ if (map)
+ RELEASE(map);
+}
+
+static USHORT
+lookup_cmap0 (struct cmap0 *map, USHORT cc)
+{
+ return ((cc > 255) ? 0 : map->glyphIndexArray[cc]);
+}
+
+/* format 2: high-byte mapping through table */
+struct SubHeader
+{
+ USHORT firstCode;
+ USHORT entryCount;
+ SHORT idDelta;
+ USHORT idRangeOffset;
+};
+
+struct cmap2
+{
+ USHORT subHeaderKeys[256];
+ struct SubHeader *subHeaders;
+ USHORT *glyphIndexArray;
+};
+
+static struct cmap2 *
+read_cmap2 (sfnt *sfont, ULONG len)
+{
+ struct cmap2 *map;
+ USHORT i, n;
+
+ if (len < 512)
+ ERROR("invalid cmap subtable");
+
+ 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])
+ n = map->subHeaderKeys[i];
+ }
+ n += 1; /* the number of subHeaders is one plus the max of subHeaderKeys */
+
+ 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);
+ map->subHeaders[i].idDelta = sfnt_get_short(sfont);
+ map->subHeaders[i].idRangeOffset = sfnt_get_ushort(sfont);
+
+ /* It makes things easier to let the offset starts from
+ * the beginning of glyphIndexArray.
+ */
+ if (map->subHeaders[i].idRangeOffset != 0)
+ map->subHeaders[i].idRangeOffset -= (2 + (n - i - 1) * 8);
+ }
+
+ /* Caculate the length of glyphIndexArray, this is ugly,
+ * there should be a better way to get this information.
+ */
+ n = (USHORT) (len - 518 - n * 8) / 2;
+
+ map->glyphIndexArray = NEW(n, USHORT);
+ for (i = 0; i < n; i++)
+ map->glyphIndexArray[i] = sfnt_get_ushort(sfont);
+
+ return map;
+}
+
+static void
+release_cmap2 (struct cmap2 *map)
+{
+ if (map) {
+ if (map->subHeaders)
+ RELEASE(map->subHeaders);
+ if (map->glyphIndexArray)
+ RELEASE(map->glyphIndexArray);
+ RELEASE(map);
+ }
+}
+
+static USHORT
+lookup_cmap2 (struct cmap2 *map, USHORT cc)
+{
+ USHORT idx = 0;
+ SHORT idDelta;
+ USHORT firstCode, entryCount, idRangeOffset;
+ int hi, lo;
+ USHORT i;
+
+ hi = (cc >> 8) & 0xff;
+ lo = cc & 0xff;
+
+ /* select which subHeader to use */
+ i = map->subHeaderKeys[hi];
+
+ firstCode = map->subHeaders[i].firstCode;
+ entryCount = map->subHeaders[i].entryCount;
+ idDelta = map->subHeaders[i].idDelta;
+ idRangeOffset = map->subHeaders[i].idRangeOffset / 2;
+
+ if (lo >= firstCode &&
+ lo < firstCode + entryCount) {
+ idRangeOffset += lo - firstCode;
+ idx = map->glyphIndexArray[idRangeOffset];
+ if (idx != 0)
+ idx = (idx + idDelta) & 0xffff;
+ }
+
+ return idx;
+}
+
+/*
+ * format 4: segment mapping to delta values
+ * - Microsoft standard character to glyph index mapping table
+ */
+struct cmap4
+{
+ USHORT segCountX2;
+ USHORT searchRange;
+ USHORT entrySelector;
+ USHORT rangeShift;
+ USHORT *endCount;
+ USHORT reservedPad;
+ USHORT *startCount;
+ USHORT *idDelta;
+ USHORT *idRangeOffset;
+ USHORT *glyphIndexArray;
+};
+
+static struct cmap4 *
+read_cmap4(sfnt *sfont, ULONG len)
+{
+ struct cmap4 *map;
+ USHORT i, n, segCount;
+
+ if (len < 8)
+ ERROR("invalid cmap subtable");
+
+ map = NEW(1, struct cmap4);
+
+ map->segCountX2 = segCount = sfnt_get_ushort(sfont);
+ map->searchRange = sfnt_get_ushort(sfont);
+ map->entrySelector = sfnt_get_ushort(sfont);
+ map->rangeShift = sfnt_get_ushort(sfont);
+
+ segCount /= 2;
+
+ map->endCount = NEW(segCount, USHORT);
+ for (i = 0; i < segCount; i++)
+ map->endCount[i] = sfnt_get_ushort(sfont);
+
+ map->reservedPad = sfnt_get_ushort(sfont);
+
+ map->startCount = NEW(segCount, USHORT);
+ for (i = 0; i < segCount; i++)
+ map->startCount[i] = sfnt_get_ushort(sfont);
+
+ map->idDelta = NEW(segCount, USHORT);
+ for (i = 0; i < segCount; i++)
+ map->idDelta[i] = sfnt_get_ushort(sfont);
+
+ map->idRangeOffset = NEW(segCount, USHORT);
+ for (i = 0; i < segCount; i++)
+ map->idRangeOffset[i] = sfnt_get_ushort(sfont);
+
+ n = (len - 16 - 8 * segCount) / 2;
+ if (n == 0)
+ map->glyphIndexArray = NULL;
+ else {
+ map->glyphIndexArray = NEW(n, USHORT);
+ for (i = 0; i < n; i++)
+ map->glyphIndexArray[i] = sfnt_get_ushort(sfont);
+ }
+
+ return map;
+}
+
+static void
+release_cmap4 (struct cmap4 *map)
+{
+ if (map) {
+ if (map->endCount) RELEASE(map->endCount);
+ if (map->startCount) RELEASE(map->startCount);
+ if (map->idDelta) RELEASE(map->idDelta);
+ if (map->idRangeOffset) RELEASE(map->idRangeOffset);
+ if (map->glyphIndexArray) RELEASE(map->glyphIndexArray);
+ RELEASE(map);
+ }
+}
+
+static USHORT
+lookup_cmap4 (struct cmap4 *map, USHORT cc)
+{
+ USHORT gid = 0;
+ USHORT i, j, segCount;
+
+ /*
+ * Segments are sorted in order of increasing endCode values.
+ * Last segment maps 0xffff to gid 0 (?)
+ */
+ i = segCount = map->segCountX2 / 2;
+ while (i-- > 0 && cc <= map->endCount[i]) {
+ if (cc >= map->startCount[i]) {
+ if (map->idRangeOffset[i] == 0) {
+ gid = (cc + map->idDelta[i]) & 0xffff;
+ } 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;
+ }
+ break;
+ }
+ }
+
+ return gid;
+}
+
+/* format 6: trimmed table mapping */
+struct cmap6
+{
+ USHORT firstCode;
+ USHORT entryCount;
+ USHORT *glyphIndexArray;
+};
+
+static struct cmap6 *
+read_cmap6 (sfnt *sfont, ULONG len)
+{
+ struct cmap6 *map;
+ USHORT i;
+
+ if (len < 4)
+ ERROR("invalid cmap subtable");
+
+ map = NEW(1, struct cmap6);
+ map->firstCode = sfnt_get_ushort(sfont);
+ map->entryCount = sfnt_get_ushort(sfont);
+ map->glyphIndexArray = NEW(map->entryCount, USHORT);
+
+ for (i = 0; i < map->entryCount; i++)
+ map->glyphIndexArray[i] = sfnt_get_ushort(sfont);
+
+ return map;
+}
+
+static void
+release_cmap6 (struct cmap6 *map)
+{
+ if (map) {
+ if (map->glyphIndexArray)
+ RELEASE(map->glyphIndexArray);
+ RELEASE(map);
+ }
+}
+
+static USHORT
+lookup_cmap6 (struct cmap6 *map, USHORT cc)
+{
+ USHORT idx;
+
+ idx = cc - map->firstCode;
+ if (idx < map->entryCount)
+ return map->glyphIndexArray[idx];
+ else
+ return 0;
+
+ return 0;
+}
+
+/* Format 8 and 10 not supported...
+ *
+ * format 8: mixed 16-bit and 32-bit coverage
+ * format 10: trimmed array
+ */
+
+/*
+ * format 12: segmented coverage
+ *
+ * startGlyphID is 32-bit long, however, GlyphID is still 16-bit long !
+ */
+
+struct charGroup
+{
+ ULONG startCharCode;
+ ULONG endCharCode;
+ ULONG startGlyphID;
+};
+
+struct cmap12
+{
+ ULONG nGroups;
+ struct charGroup *groups;
+};
+
+/* ULONG length */
+static struct cmap12 *
+read_cmap12 (sfnt *sfont, ULONG len)
+{
+ struct cmap12 *map;
+ ULONG i;
+
+ if (len < 4)
+ ERROR("invalid cmap subtable");
+
+ 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);
+ map->groups[i].startGlyphID = sfnt_get_ulong(sfont);
+ }
+
+ return map;
+}
+
+static void
+release_cmap12 (struct cmap12 *map)
+{
+ if (map) {
+ if (map->groups)
+ RELEASE(map->groups);
+ RELEASE(map);
+ }
+}
+
+static USHORT
+lookup_cmap12 (struct cmap12 *map, ULONG cccc)
+{
+ USHORT gid = 0;
+ ULONG i;
+
+ i = map->nGroups;
+ while (i-- >= 0 &&
+ cccc <= map->groups[i].endCharCode) {
+ if (cccc >= map->groups[i].startCharCode) {
+ gid = (USHORT) ((cccc -
+ map->groups[i].startCharCode +
+ map->groups[i].startGlyphID) & 0xffff);
+ break;
+ }
+ }
+
+ return gid;
+}
+
+/* read cmap */
+tt_cmap *
+tt_cmap_read (sfnt *sfont, USHORT platform, USHORT encoding)
+{
+ tt_cmap *cmap = NULL;
+ ULONG offset, length = 0;
+ USHORT version, p_id, e_id;
+ USHORT i, n_subtabs;
+
+ ASSERT(sfont);
+
+ offset = sfnt_locate_table(sfont, "cmap");
+ version = sfnt_get_ushort(sfont);
+ n_subtabs = sfnt_get_ushort(sfont);
+
+ for (i = 0; i < n_subtabs; i++) {
+ p_id = sfnt_get_ushort(sfont);
+ e_id = sfnt_get_ushort(sfont);
+ if (p_id != platform || e_id != encoding)
+ sfnt_get_ulong(sfont);
+ else {
+ offset += sfnt_get_ulong(sfont);
+ break;
+ }
+ }
+
+ if (i == n_subtabs)
+ return NULL;
+
+ cmap = NEW(1, tt_cmap);
+ cmap->map = NULL;
+ cmap->platform = platform;
+ cmap->encoding = encoding;
+
+ sfnt_seek_set(sfont, offset);
+ cmap->format = sfnt_get_ushort(sfont);
+ /* Length and version (language) is ULONG for
+ * format 8, 10, 12 !
+ */
+ if (cmap->format <= 6) {
+ length = sfnt_get_ushort(sfont);
+ cmap->language = sfnt_get_ushort(sfont); /* language (Mac) */
+ } else {
+ if (sfnt_get_ushort(sfont) != 0) { /* reverved - 0 */
+ WARN("Unrecognized cmap subtable format.");
+ tt_cmap_release(cmap);
+ return NULL;
+ } else {
+ length = sfnt_get_ulong(sfont);
+ cmap->language = sfnt_get_ulong(sfont);
+ }
+ }
+
+ switch(cmap->format) {
+ case 0:
+ cmap->map = read_cmap0(sfont, length);
+ break;
+ case 2:
+ cmap->map = read_cmap2(sfont, length);
+ break;
+ case 4:
+ cmap->map = read_cmap4(sfont, length);
+ break;
+ case 6:
+ cmap->map = read_cmap6(sfont, length);
+ break;
+ case 12:
+ /*WARN("UCS-4 TrueType cmap table...");*/
+ cmap->map = read_cmap12(sfont, length);
+ break;
+ default:
+ WARN("Unrecognized TrueType cmap format.");
+ tt_cmap_release(cmap);
+ return NULL;
+ }
+
+ if (!cmap->map) {
+ tt_cmap_release(cmap);
+ cmap = NULL;
+ }
+
+ return cmap;
+}
+
+void
+tt_cmap_release (tt_cmap *cmap)
+{
+
+ if (cmap) {
+ if (cmap->map) {
+ switch(cmap->format) {
+ case 0:
+ release_cmap0(cmap->map);
+ break;
+ case 2:
+ release_cmap2(cmap->map);
+ break;
+ case 4:
+ release_cmap4(cmap->map);
+ break;
+ case 6:
+ release_cmap6(cmap->map);
+ break;
+ case 12:
+ release_cmap12(cmap->map);
+ break;
+ default:
+ ERROR("Unrecognized TrueType cmap format.");
+ }
+ }
+ RELEASE(cmap);
+ }
+
+ return;
+}
+
+
+USHORT
+tt_cmap_lookup (tt_cmap *cmap, long cc)
+{
+ USHORT gid = 0;
+
+ ASSERT(cmap);
+
+ if (cc > 0xffffL && cmap->format < 12) {
+ WARN("Four bytes charcode not supported in TrueType cmap format 0...6.");
+ return 0;
+ }
+
+ switch (cmap->format) {
+ case 0:
+ gid = lookup_cmap0(cmap->map, (USHORT) cc);
+ break;
+ case 2:
+ gid = lookup_cmap2(cmap->map, (USHORT) cc);
+ break;
+ case 4:
+ gid = lookup_cmap4(cmap->map, (USHORT) cc);
+ break;
+ case 6:
+ gid = lookup_cmap6(cmap->map, (USHORT) cc);
+ break;
+ case 12:
+ gid = lookup_cmap12(cmap->map, (ULONG) cc);
+ break;
+ default:
+ ERROR("Unrecognized TrueType cmap subtable 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, CMap *cmap)
+{
+ USHORT c0, c1, gid, cid;
+ USHORT j, d, segCount;
+ USHORT ch;
+ long 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 {
+ gid = (map->glyphIndexArray[j+d] +
+ map->idDelta[i]) & 0xffff;
+ }
+ if (gid != 0 && gid != 0xffff) {
+ 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;
+ CMap_add_cidchar(cmap, wbuf, 4, cid);
+ }
+ }
+ }
+
+ return;
+}
+
+static void
+load_cmap12 (struct cmap12 *map,
+ unsigned char *GIDToCIDMap, CMap *cmap)
+{
+ 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++) {
+ long d = ch - map->groups[i].startCharCode;
+ gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff);
+ 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;
+ CMap_add_cidchar(cmap, wbuf, 4, cid);
+ }
+ }
+
+ return;
+}
+
+/* OpenType CIDFont:
+ *
+ * We don't use GID for them. OpenType cmap table is for
+ * charcode to GID mapping rather than to-CID mapping.
+ */
+#include "cid.h"
+
+#include "tt_table.h"
+#include "cff_types.h"
+#include "cff_dict.h"
+#include "cff.h"
+
+static int
+handle_CIDFont (sfnt *sfont,
+ unsigned char **GIDToCIDMap, CIDSysInfo *csi)
+{
+ cff_font *cffont;
+ long 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, 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;
+ }
+
+ if (!cff_dict_known(cffont->topdict, "ROS")) {
+ ERROR("No CIDSystemInfo???");
+ } 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);
+ charset = cffont->charsets;
+ if (!charset) {
+ ERROR("No CFF charset data???");
+ }
+
+ map = NEW(num_glyphs * 2, unsigned char);
+ memset(map, 0, num_glyphs * 2);
+ 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++;
+ }
+ }
+ break;
+ case 1:
+ {
+ cff_range1 *ranges;
+ 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++;
+ }
+ }
+ }
+ break;
+ case 2:
+ {
+ cff_range2 *ranges;
+ card16 cid, count;
+
+ ranges = charset->data.range2;
+ if (charset->num_entries == 1 &&
+ ranges[0].first == 1) {
+ /* "Complete" CIDFont */
+ RELEASE(map); map = NULL;
+ } 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[gid] = (cid >> 8) & 0xff;
+ map[gid] = cid & 0xff;
+ gid++;
+ }
+ }
+
+ }
+ }
+ break;
+ default:
+ RELEASE(map); map = NULL;
+ ERROR("Unknown CFF charset format...: %d", charset->format);
+ break;
+ }
+ cff_close(cffont);
+
+ *GIDToCIDMap = map;
+ return 1;
+}
+
+/*
+ * Substituted glyphs:
+ *
+ * Mapping information stored in cmap_add.
+ */
+#ifndef is_used_char2
+#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,
+ struct tt_post_table *post)
+{
+ USHORT count;
+ USHORT i, gid;
+ long ucv;
+
+ for (count = 0, i = 0; i < 8192; i++) {
+ int j;
+ long len, inbytesleft, outbytesleft;
+ unsigned char *inbuf, *outbuf;
+
+ if (used_glyphs[i] == 0)
+ continue;
+
+ for (j = 0; j < 8; j++) {
+ gid = 8 * i + j;
+
+ if (!is_used_char2(used_glyphs, gid))
+ continue;
+
+ if (!cmap_add && post) {
+ /* JK: try to look up Unicode values from the glyph name...
+ requires access to 'post' table */
+#define MAX_UNICODES 16
+ long unicodes[MAX_UNICODES];
+ int unicode_count = -1;
+ int k;
+ if (gid < post->numberOfGlyphs) {
+ unicode_count = agl_get_unicodes(post->glyphNamePtr[gid], unicodes, MAX_UNICODES);
+ }
+ if (unicode_count == -1)
+ WARN("No Unicode mapping available: GID=%u, name=%s", gid,
+ gid < post->numberOfGlyphs ? post->glyphNamePtr[gid] : "(none)");
+ 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;
+ len = 0;
+ for (k = 0; k < unicode_count; ++k) {
+ len += UC_sput_UTF16BE(unicodes[k], &p, wbuf+WBUF_SIZE);
+ }
+ CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len);
+ }
+ }
+ else {
+ wbuf[0] = (gid >> 8) & 0xff;
+ wbuf[1] = gid & 0xff;
+ inbuf = wbuf;
+ inbytesleft = 2;
+ outbuf = inbuf + 2;
+ outbytesleft = WBUF_SIZE - 2;
+ CMap_decode(cmap_add,
+ (const unsigned char **) &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);
+ count++;
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ long _i;
+
+ MESG("otf_cmap>> Additional ToUnicode mapping: <%04X> <", gid);
+ for (_i = 0; _i < len; _i++) {
+ MESG("%02X", wbuf[2 + _i]);
+ }
+ MESG(">\n");
+ }
+
+ }
+ }
+
+ }
+ }
+
+ return count;
+}
+
+static pdf_obj *
+create_ToUnicode_cmap4 (struct cmap4 *map,
+ const char *cmap_name, CMap *cmap_add,
+ const char *used_glyphs,
+ struct tt_post_table *post)
+{
+ pdf_obj *stream = NULL;
+ CMap *cmap;
+ USHORT c0, c1, gid, count, ch;
+ USHORT i, j, d, segCount;
+ char used_glyphs_copy[8192];
+
+ 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);
+
+ memcpy(used_glyphs_copy, used_glyphs, 8192);
+
+ segCount = map->segCountX2 / 2;
+ for (count = 0, i = 0; i < segCount; 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 {
+ gid = (map->glyphIndexArray[j+d] +
+ map->idDelta[i]) & 0xffff;
+ }
+ if (is_used_char2(used_glyphs_copy, gid)) {
+ count++;
+
+ wbuf[0] = (gid >> 8) & 0xff;
+ wbuf[1] = (gid & 0xff);
+
+ wbuf[2] = (ch >> 8) & 0xff;
+ wbuf[3] = ch & 0xff;
+
+ CMap_add_bfchar(cmap, wbuf, 2, wbuf+2, 2);
+
+ /* Avoid duplicate entry
+ * There are problem when two Unicode code is mapped to
+ * single glyph...
+ */
+ used_glyphs_copy[gid/8] &= ~(1 << (7 - (gid % 8)));
+ count++;
+ }
+ }
+ }
+
+ count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, post);
+
+ if (count < 1)
+ stream = NULL;
+ else {
+ stream = CMap_create_stream(cmap, 0);
+ }
+ CMap_release(cmap);
+
+ return stream;
+}
+
+
+static pdf_obj *
+create_ToUnicode_cmap12 (struct cmap12 *map,
+ const char *cmap_name, CMap *cmap_add,
+ const char *used_glyphs,
+ struct tt_post_table *post)
+{
+ pdf_obj *stream = NULL;
+ CMap *cmap;
+ ULONG i, ch;
+ USHORT gid, count;
+ char used_glyphs_copy[8192];
+
+ 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);
+
+ memcpy(used_glyphs_copy, used_glyphs, 8192);
+ for (count = 0, i = 0; i < map->nGroups; i++) {
+ for (ch = map->groups[i].startCharCode;
+ ch <= map->groups[i].endCharCode; ch++) {
+ unsigned char *p;
+ int len;
+ long d;
+
+ p = wbuf + 2;
+ d = ch - map->groups[i].startCharCode;
+ gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff);
+ if (is_used_char2(used_glyphs_copy, gid)) {
+ count++;
+ wbuf[0] = (gid >> 8) & 0xff;
+ wbuf[1] = (gid & 0xff);
+ len = UC_sput_UTF16BE((long)ch, &p, wbuf+WBUF_SIZE);
+
+ used_glyphs_copy[gid/8] &= ~(1 << (7 - (gid % 8)));
+ CMap_add_bfchar(cmap, wbuf, 2, wbuf+2, len);
+ }
+ }
+ }
+
+ count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, post);
+
+ if (count < 1)
+ stream = NULL;
+ else {
+ stream = CMap_create_stream(cmap, 0);
+ }
+ CMap_release(cmap);
+
+ return stream;
+}
+
+typedef struct {
+ short platform;
+ short encoding;
+} cmap_plat_enc_rec;
+
+static cmap_plat_enc_rec cmap_plat_encs[] = {
+ { 3, 10 },
+ { 0, 3 },
+ { 0, 0 },
+ { 3, 1 },
+ { 0, 1 }
+};
+
+pdf_obj *
+otf_create_ToUnicode_stream (const char *font_name,
+ int ttc_index, /* 0 for non-TTC */
+ FT_Face face,
+ const char *used_glyphs)
+{
+ pdf_obj *cmap_ref = NULL;
+ long res_id;
+ pdf_obj *cmap_obj = NULL;
+ CMap *cmap_add;
+ int cmap_add_id;
+ tt_cmap *ttcmap;
+ char *cmap_name;
+ FILE *fp = NULL;
+ sfnt *sfont;
+ long offset = 0;
+ struct tt_post_table *ttpost = NULL;
+ int i;
+
+ cmap_name = NEW(strlen(font_name)+strlen("-UTF16")+5, char);
+ sprintf(cmap_name, "%s,%03d-UTF16", font_name, ttc_index);
+
+ res_id = pdf_findresource("CMap", cmap_name);
+ if (res_id >= 0) {
+ RELEASE(cmap_name);
+ cmap_ref = pdf_get_resource_reference(res_id);
+ return cmap_ref;
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("\n");
+ MESG("otf_cmap>> Creating ToUnicode CMap for \"%s\"...\n", font_name);
+ }
+
+#ifdef XETEX
+ sfont = sfnt_open(face, -1);
+#else
+ fp = DPXFOPEN(font_name, DPX_RES_TYPE_TTFONT);
+ if (!fp) {
+ fp = DPXFOPEN(font_name, DPX_RES_TYPE_OTFONT);
+ }
+
+ if (!fp) {
+ RELEASE(cmap_name);
+ return NULL;
+ }
+
+ sfont = sfnt_open(fp);
+#endif
+
+ if (!sfont) {
+ ERROR("Could not open TrueType font file \"%s\"", font_name);
+ }
+
+ switch (sfont->type) {
+ case SFNT_TYPE_TTC:
+ offset = ttc_read_offset(sfont, ttc_index);
+ if (offset == 0) {
+ ERROR("Invalid TTC index");
+ }
+ break;
+ default:
+ offset = 0;
+ break;
+ }
+
+ if (sfnt_read_table_directory(sfont, offset) < 0) {
+ ERROR("Could not read TrueType table directory.");
+ }
+
+ cmap_add_id = CMap_cache_find(cmap_name);
+ if (cmap_add_id < 0) {
+ cmap_add = NULL;
+ } else {
+ cmap_add = CMap_cache_get(cmap_add_id);
+ }
+
+ ttpost = tt_read_post_table(sfont);
+
+ CMap_set_silent(1); /* many warnings without this... */
+ 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) {
+ cmap_obj = create_ToUnicode_cmap4(ttcmap->map,
+ cmap_name, cmap_add, used_glyphs, ttpost);
+ break;
+ }
+ if (ttcmap->format == 12) {
+ cmap_obj = create_ToUnicode_cmap12(ttcmap->map,
+ cmap_name, cmap_add, used_glyphs, ttpost);
+ break;
+ }
+ }
+ if (cmap_obj == NULL)
+ WARN("Unable to read TrueType Unicode cmap table.");
+ tt_cmap_release(ttcmap);
+ CMap_set_silent(0);
+
+ if (ttpost != NULL)
+ tt_release_post_table(ttpost);
+
+ 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;
+ }
+ RELEASE(cmap_name);
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return cmap_ref;
+}
+
+/* Must be smaller than (WBUF_SIZE-2)/8 */
+#define MAX_UNICODES 16
+
+struct gent
+{
+ USHORT gid;
+ long ucv; /* assigned PUA unicode */
+
+ int num_unicodes;
+ long unicodes[MAX_UNICODES];
+};
+
+static void
+create_cmaps (CMap *cmap, CMap *tounicode,
+ struct ht_table *unencoded, unsigned char *GIDToCIDMap)
+{
+ struct ht_iter iter;
+
+ ASSERT(cmap && unencoded);
+
+ if (ht_set_iter(unencoded, &iter) < 0)
+ return;
+
+ CMap_set_silent(1); /* many warnings without this... */
+
+ do {
+ struct gent *glyph;
+ unsigned char *ucv;
+ int i, len;
+ unsigned char *p, *endptr;
+ CID cid;
+
+ glyph = (struct gent *) ht_iter_getval(&iter);
+ ucv = (unsigned char *) ht_iter_getkey(&iter, &len);
+
+ if (GIDToCIDMap) {
+ cid = ((GIDToCIDMap[2 * glyph->gid] << 8)|GIDToCIDMap[2 * glyph->gid + 1]);
+ if (cid == 0)
+ WARN("Glyph gid=%u does not have corresponding CID.", glyph->gid);
+ } else {
+ cid = glyph->gid;
+ }
+
+ CMap_add_cidchar(cmap, ucv, 4, cid);
+
+ if (tounicode) {
+ wbuf[0] = (cid >> 8) & 0xff;
+ wbuf[1] = cid & 0xff;
+ p = wbuf + 2;
+ endptr = wbuf + WBUF_SIZE;
+ len = 0;
+ for (i = 0; i < glyph->num_unicodes; i++) {
+ len += UC_sput_UTF16BE(glyph->unicodes[i], &p, endptr);
+ }
+ CMap_add_bfchar(tounicode, wbuf, 2, wbuf + 2, len);
+ }
+ } while (ht_iter_next(&iter) >= 0);
+
+ CMap_set_silent(0);
+
+ ht_clear_iter(&iter);
+}
+
+static void
+add_glyph (struct ht_table *unencoded,
+ USHORT gid, long ucv, int num_unicodes, long *unicodes)
+{
+ struct gent *glyph;
+ int i;
+
+ ASSERT(unencoded);
+
+ if (gid == 0 || num_unicodes < 1) {
+ return;
+ }
+
+ wbuf[0] = (ucv >> 24) & 0xff;
+ wbuf[1] = (ucv >> 16) & 0xff;
+ wbuf[2] = (ucv >> 8) & 0xff;
+ wbuf[3] = ucv & 0xff;
+
+ glyph = NEW(1, struct gent);
+ glyph->gid = gid;
+ glyph->num_unicodes = num_unicodes;
+ for (i = 0;
+ i < num_unicodes && i < MAX_UNICODES; i++) {
+ glyph->unicodes[i] = unicodes[i];
+ }
+
+ ht_append_table(unencoded, wbuf, 4, glyph);
+}
+
+/* This seriously affects speed... */
+static struct gent *
+find_glyph (struct ht_table *unencoded, long ucv)
+{
+ ASSERT(unencoded);
+
+ wbuf[0] = (ucv >> 24) & 0xff;
+ wbuf[1] = (ucv >> 16) & 0xff;
+ wbuf[2] = (ucv >> 8) & 0xff;
+ wbuf[3] = ucv & 0xff;
+
+ return (struct gent *) ht_lookup_table(unencoded, wbuf, 4);
+}
+
+static void
+handle_subst (pdf_obj *dst_obj, pdf_obj *src_obj, int flag,
+ otl_gsub *gsub_list, tt_cmap *ttcmap,
+ struct ht_table *unencoded)
+{
+ pdf_obj *tmp;
+ long i, j, src_size, dst_size;
+ long src, dst;
+ long src_start, src_end, dst_start, dst_end;
+
+ src_size = pdf_array_length(src_obj);
+ dst_size = pdf_array_length(dst_obj);
+
+ dst_start = dst_end = -1; dst = 0;
+ src_start = src_end = -1; src = 0;
+ for (i = 0, j = 0;
+ i < src_size && j < dst_size; i++) {
+ USHORT gid;
+ int rv;
+ struct gent *glyph;
+
+ tmp = pdf_get_array(src_obj, i);
+ if (PDF_OBJ_ARRAYTYPE(tmp)) {
+ src_start = (long) pdf_number_value(pdf_get_array(tmp, 0));
+ src_end = (long) pdf_number_value(pdf_get_array(tmp, 1));
+ } else {
+ src_start = src_end = (long) pdf_number_value(tmp);
+ }
+ for (src = src_start; src <= src_end; src++) {
+ glyph = find_glyph(unencoded, src);
+ if (glyph)
+ gid = glyph->gid;
+ else {
+ gid = tt_cmap_lookup(ttcmap, src);
+ }
+ dst++;
+ if (dst > dst_end) {
+ tmp = pdf_get_array(dst_obj, j++);
+ if (PDF_OBJ_ARRAYTYPE(tmp)) {
+ dst_start = (long) pdf_number_value(pdf_get_array(tmp, 0));
+ dst_end = (long) pdf_number_value(pdf_get_array(tmp, 1));
+ } else {
+ dst_start = dst_end = (long) pdf_number_value(tmp);
+ }
+ dst = dst_start;
+ }
+ if (gid == 0) {
+ if (flag == 'r' || flag == 'p') {
+ if (src < 0x10000) {
+ WARN("Font does not have glyph for U+%04X.", src);
+ } else {
+ WARN("Font does not have glyph for U+%06X.", src);
+ }
+ }
+ if (flag == 'r') {
+ ERROR("Missing glyph found...");
+ }
+ continue;
+ }
+ rv = otl_gsub_apply(gsub_list, &gid);
+ if (rv < 0) {
+ if (flag == 'p' || flag == 'r') {
+ if (src < 0x10000) {
+ WARN("No substituted glyph for U+%04X.", src);
+ } else {
+ WARN("No substituted glyph for U+%06X.", src);
+ }
+ }
+ if (flag == 'r') {
+ ERROR("Missing glyph found...");
+ }
+ continue;
+ }
+
+ if (glyph) {
+ glyph->gid = gid;
+ } else {
+ add_glyph(unencoded, gid, dst, 1, &src);
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ if (dst < 0x10000) {
+ MESG("otf_cmap>> Substituted glyph gid=%u assigned to U+%04X\n",
+ gid, dst);
+ } else {
+ MESG("otf_cmap>> Substituted glyph gid=%u assigned to U+%06X\n",
+ gid, dst);
+ }
+ }
+
+ }
+ }
+
+ if (dst < dst_end || src < src_end ||
+ i < src_size || j < dst_size) {
+ WARN("Number of glyphs in left-side and right-side not equal...");
+ WARN("Please check .otl file...");
+ }
+}
+
+static void
+handle_assign (pdf_obj *dst, pdf_obj *src, int flag,
+ otl_gsub *gsub_list, tt_cmap *ttcmap,
+ struct ht_table *unencoded)
+{
+ long unicodes[MAX_UNICODES], ucv;
+ int i, n_unicodes, rv;
+ USHORT gid_in[MAX_UNICODES], lig;
+
+ n_unicodes = pdf_array_length(src); /* FIXME */
+ ucv = (long) pdf_number_value(pdf_get_array(dst, 0)); /* FIXME */
+ if (!UC_is_valid(ucv)) {
+ if (flag == 'r' || flag == 'p') {
+ if (ucv < 0x10000) {
+ WARN("Invalid Unicode in: %04X", ucv);
+ } else {
+ WARN("Invalid Unicode in: %06X", ucv);
+ }
+ }
+ if (flag == 'r') {
+ ERROR("Invalid Unicode code specified.", ucv);
+ }
+ return;
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otf_cmap>> Ligature component:");
+ }
+
+ for (i = 0; i < n_unicodes; i++) {
+ unicodes[i] =
+ (long) pdf_number_value(pdf_get_array(src, i));
+ gid_in[i] = tt_cmap_lookup(ttcmap, unicodes[i]);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ if (unicodes[i] < 0x10000) {
+ MESG(" U+%04X (gid=%u)", unicodes[i], gid_in[i]);
+ } else {
+ MESG(" U+%06X (gid=%u)", unicodes[i], gid_in[i]);
+ }
+ }
+
+ if (gid_in[i] == 0) {
+ if (flag == 'r' || flag == 'p') {
+ if (unicodes[i] < 0x10000) {
+ WARN("Unicode char U+%04X not exist in font...", unicodes[i]);
+ } else {
+ WARN("Unicode char U+%06X not exist in font...", unicodes[i]);
+ }
+ }
+ if (flag == 'r') {
+ ERROR("Missing glyph found...");
+ }
+ return;
+ }
+
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("\n");
+ }
+
+ rv = otl_gsub_apply_lig(gsub_list,
+ gid_in, n_unicodes, &lig);
+ if (rv < 0) {
+ if (flag == 'p')
+ WARN("No ligature found...");
+ else if (flag == 'r')
+ ERROR("No ligature found...");
+ return;
+ }
+
+ add_glyph(unencoded, lig, ucv, n_unicodes, unicodes);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ if (ucv < 0x10000) {
+ MESG("otf_cmap>> Ligature glyph gid=%u assigned to U+%04X\n", lig, ucv);
+ } else {
+ MESG("otf_cmap>> Ligature glyph gid=%u assigned to U+%06X\n", lig, ucv);
+ }
+ }
+
+ return;
+}
+
+static int
+load_base_CMap (const char *cmap_name, int wmode,
+ CIDSysInfo *csi, unsigned char *GIDToCIDMap,
+ tt_cmap *ttcmap)
+{
+ int cmap_id;
+
+ cmap_id = CMap_cache_find(cmap_name);
+ if (cmap_id < 0) {
+ CMap *cmap;
+
+ 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);
+
+ if (csi) { /* CID */
+ CMap_set_CIDSysInfo(cmap, csi);
+ } else {
+ CMap_set_CIDSysInfo(cmap, &CSI_IDENTITY);
+ }
+
+ if (ttcmap->format == 12) {
+ load_cmap12(ttcmap->map, GIDToCIDMap, cmap);
+ } else if (ttcmap->format == 4) {
+ load_cmap4(ttcmap->map, GIDToCIDMap, cmap);
+ }
+
+ cmap_id = CMap_cache_add(cmap);
+ }
+
+ return cmap_id;
+}
+
+static void
+load_gsub (pdf_obj *conf, otl_gsub *gsub_list, sfnt *sfont)
+{
+ pdf_obj *rule;
+ char *script, *language, *feature;
+ long i, size;
+
+ rule = otl_conf_get_rule(conf);
+ if (!rule)
+ return;
+
+ script = otl_conf_get_script (conf);
+ language = otl_conf_get_language(conf);
+
+ size = pdf_array_length(rule);
+ for (i = 0; i < size; i += 2) {
+ pdf_obj *tmp, *commands;
+ int flag;
+ long j, num_comms;
+
+ tmp = pdf_get_array(rule, i);
+ flag = (int) pdf_number_value(tmp);
+
+ commands = pdf_get_array(rule, i+1);
+ num_comms = pdf_array_length(commands);
+
+ /* (assign|substitute) tag dst src */
+ for (j = 0 ; j < num_comms; j += 4) {
+ tmp = pdf_get_array(commands, 1);
+ if (PDF_OBJ_STRINGTYPE(tmp)) {
+ feature = pdf_string_value(tmp);
+ if (otl_gsub_add_feat(gsub_list,
+ script, language, feature, sfont) < 0) {
+ if (flag == 'p')
+ WARN("No OTL feature matches \"%s.%s.%s\" found.",
+ script, language, feature);
+ else if (flag == 'r')
+ ERROR("No OTL feature matches \"%s.%s.%s\" found.",
+ script, language, feature);
+ }
+ }
+
+ }
+ }
+
+}
+
+static void
+handle_gsub (pdf_obj *conf,
+ tt_cmap *ttcmap, otl_gsub *gsub_list,
+ struct ht_table *unencoded)
+{
+ pdf_obj *rule;
+ char *script, *language, *feature;
+ long i, size;
+
+ if (!conf)
+ return;
+
+ rule = otl_conf_get_rule(conf);
+ if (!rule) {
+ return;
+ }
+
+ if (!PDF_OBJ_ARRAYTYPE(rule)) {
+ WARN("Not arraytype?");
+ return;
+ }
+ script = otl_conf_get_script (conf);
+ language = otl_conf_get_language(conf);
+
+ size = pdf_array_length(rule);
+ for (i = 0; i < size; i += 2) {
+ pdf_obj *tmp, *commands;
+ long j, num_comms;
+ int flag;
+
+ tmp = pdf_get_array(rule, i);
+ flag = (int) pdf_number_value(tmp);
+
+ commands = pdf_get_array (rule, i+1);
+ num_comms = pdf_array_length(commands);
+
+ for (j = 0; j < num_comms; j += 4) {
+ pdf_obj *operator;
+ pdf_obj *src, *dst, *feat;
+ int rv;
+
+ /* (assing|substitute) tag dst src */
+ operator = pdf_get_array(commands, j);
+
+ feat = pdf_get_array(commands, j+1);
+ if (PDF_OBJ_STRINGTYPE(feat))
+ feature = pdf_string_value(feat);
+ else
+ feature = NULL;
+
+ dst = pdf_get_array(commands, j+2);
+ src = pdf_get_array(commands, j+3);
+
+ rv = otl_gsub_select(gsub_list, script, language, feature);
+ if (rv < 0) {
+ if (flag == 'p') {
+ WARN("No GSUB featre %s.%s.%s loaded...",
+ script, language, feature);
+ } else if (flag == 'r') {
+ ERROR("No GSUB featre %s.%s.%s loaded...",
+ script, language, feature);
+ }
+ } else {
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otf_cmap>> %s:\n", pdf_name_value(operator));
+ }
+
+ if (!strcmp(pdf_name_value(operator), "assign")) {
+ handle_assign(dst, src, flag,
+ gsub_list, ttcmap, unencoded);
+ } else if (!strcmp(pdf_name_value(operator), "substitute")) {
+ handle_subst(dst, src, flag,
+ gsub_list, ttcmap, unencoded);
+ }
+ }
+
+ }
+
+ }
+
+}
+
+static void CDECL
+hval_free (void *hval)
+{
+ RELEASE(hval);
+}
+
+int
+otf_load_Unicode_CMap (const char *map_name, int ttc_index, /* 0 for non-TTC font */
+ const char *otl_tags, int wmode)
+{
+ int cmap_id = -1;
+ int tounicode_id = -1, is_cidfont = 0;
+ sfnt *sfont;
+ long offset = 0;
+ char *base_name = NULL, *cmap_name = NULL;
+ char *tounicode_name = NULL;
+ FILE *fp = NULL;
+ otl_gsub *gsub_list = NULL;
+ tt_cmap *ttcmap;
+ CMap *cmap, *base, *tounicode = NULL;
+ CIDSysInfo csi = {NULL, NULL, 0};
+ unsigned char *GIDToCIDMap = NULL;
+
+ if (!map_name)
+ return -1;
+
+ if (ttc_index > 999 || ttc_index < 0) {
+ return -1; /* Sorry for this... */
+ }
+
+fprintf(stderr, "otf_load_Unicode_CMap(%s, %d)\n", map_name, ttc_index);
+#ifdef XETEX
+ sfont = NULL; /* FIXME */
+#else
+ fp = DPXFOPEN(map_name, DPX_RES_TYPE_TTFONT);
+ if (!fp) {
+ fp = DPXFOPEN(map_name, DPX_RES_TYPE_OTFONT);
+ }
+ if (!fp)
+ return -1;
+
+ sfont = sfnt_open(fp, -1);
+#endif
+ if (!sfont) {
+ ERROR("Could not open TrueType font file \"%s\"", map_name);
+ }
+ switch (sfont->type) {
+ case SFNT_TYPE_TTC:
+ offset = ttc_read_offset(sfont, ttc_index);
+ if (offset == 0) {
+ ERROR("Invalid TTC index");
+ }
+ break;
+ case SFNT_TYPE_TRUETYPE:
+ case SFNT_TYPE_POSTSCRIPT:
+ offset = 0;
+ break;
+ default:
+ ERROR("Not a TrueType/TTC font?: %s", map_name);
+ break;
+ }
+
+ if (sfnt_read_table_directory(sfont, offset) < 0)
+ ERROR("Could not read TrueType table directory.");
+
+ base_name = NEW(strlen(map_name)+strlen("-UCS4-H")+5, char);
+ if (wmode)
+ sprintf(base_name, "%s,%03d-UCS4-V", map_name, ttc_index);
+ else {
+ sprintf(base_name, "%s,%03d-UCS4-H", map_name, ttc_index);
+ }
+
+ if (otl_tags) {
+ cmap_name = NEW(strlen(map_name)+strlen(otl_tags)+strlen("-UCS4-H")+6, char);
+ if (wmode)
+ sprintf(cmap_name, "%s,%03d,%s-UCS4-V", map_name, ttc_index, otl_tags);
+ else
+ sprintf(cmap_name, "%s,%03d,%s-UCS4-H", map_name, ttc_index, otl_tags);
+ } else {
+ cmap_name = NEW(strlen(base_name)+1, char);
+ strcpy(cmap_name, base_name);
+ }
+
+ if (sfont->type == SFNT_TYPE_POSTSCRIPT) {
+ is_cidfont = handle_CIDFont(sfont, &GIDToCIDMap, &csi);
+ } else {
+ is_cidfont = 0;
+ }
+
+ if (is_cidfont) {
+ tounicode_name = NULL;
+ } else {
+ tounicode_name = NEW(strlen(map_name)+strlen("-UTF16")+5, char);
+ sprintf(tounicode_name, "%s,%03d-UTF16", map_name, ttc_index);
+ }
+
+ if (verbose > 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);
+ RELEASE(base_name);
+ if (GIDToCIDMap)
+ RELEASE(GIDToCIDMap);
+ if (tounicode_name)
+ RELEASE(tounicode_name);
+
+ sfnt_close(sfont);
+ DPXFCLOSE(fp);
+
+ if (verbose > VERBOSE_LEVEL_MIN)
+ MESG("otf_cmap>> Found at cmap_id=%d.\n", cmap_id);
+
+ return cmap_id;
+ }
+
+ ttcmap = tt_cmap_read(sfont, 3, 10);
+ if (!ttcmap) {
+ ttcmap = tt_cmap_read(sfont, 3, 1);
+ }
+ if (!ttcmap) {
+ ERROR("Unable to read TrueType Unicode cmap table.");
+ }
+ cmap_id = load_base_CMap(base_name, wmode,
+ (is_cidfont ? &csi : NULL),
+ GIDToCIDMap, ttcmap);
+ if (cmap_id < 0)
+ ERROR("Failed to read TrueType cmap table.");
+
+ if (!otl_tags) {
+ RELEASE(cmap_name);
+ RELEASE(base_name);
+ if (GIDToCIDMap)
+ RELEASE(GIDToCIDMap);
+ if (tounicode_name)
+ RELEASE(tounicode_name);
+ if (is_cidfont) {
+ if (csi.registry)
+ RELEASE(csi.registry);
+ if (csi.ordering)
+ RELEASE(csi.ordering);
+ }
+ tt_cmap_release(ttcmap);
+ sfnt_close(sfont);
+ DPXFCLOSE(fp);
+
+ return cmap_id;
+ }
+
+ base = CMap_cache_get(cmap_id);
+
+ 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_usecmap(cmap, base);
+ CMap_add_cidchar(cmap, lrange_max, 4, 0); /* FIXME */
+
+ if (is_cidfont) {
+ CMap_set_CIDSysInfo(cmap, &csi);
+ if (csi.registry)
+ RELEASE(csi.registry);
+ if (csi.ordering)
+ RELEASE(csi.ordering);
+ } else {
+ CMap_set_CIDSysInfo(cmap, &CSI_IDENTITY);
+ }
+
+ gsub_list = otl_gsub_new();
+
+ {
+ struct ht_table unencoded;
+ char *conf_name, *opt_tag;
+ pdf_obj *conf, *opt_conf;
+
+ conf_name = NEW(strlen(otl_tags)+1, char);
+ memset (conf_name, 0, strlen(otl_tags)+1);
+ opt_tag = strchr(otl_tags, ':');
+ if (opt_tag) {
+ opt_tag++;
+ strncpy(conf_name, otl_tags,
+ strlen(otl_tags) - strlen(opt_tag) - 1);
+ } else {
+ strcpy(conf_name, otl_tags);
+ }
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otf_cmap>> Read layout config. \"%s\"\n", conf_name);
+ }
+
+ conf = otl_find_conf(conf_name);
+ if (!conf)
+ ERROR("Layout file \"%s\" not found...", conf_name);
+
+ load_gsub(conf, gsub_list, sfont);
+ if (opt_tag) {
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otf_cmap>> Layout option \"%s\" enabled\n", opt_tag);
+ }
+ opt_conf = otl_conf_find_opt(conf, opt_tag);
+ if (!opt_conf)
+ ERROR("There are no option \"%s\" in \"%s\".",
+ opt_tag, conf_name);
+ load_gsub(opt_conf, gsub_list, sfont);
+ }
+
+ ht_init_table(&unencoded);
+
+ handle_gsub(conf, ttcmap, gsub_list, &unencoded);
+ if (opt_tag) {
+ opt_conf = otl_conf_find_opt(conf, opt_tag);
+ if (!opt_conf)
+ ERROR("There are no option \"%s\" in \"%s\".",
+ opt_tag, conf_name);
+ handle_gsub(opt_conf, ttcmap, gsub_list, &unencoded);
+ }
+ if (is_cidfont) {
+ tounicode_id = -1;
+ tounicode = NULL;
+ } else {
+ 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);
+ /* FIXME */
+ CMap_add_bfchar(tounicode, srange_min, 2, srange_max, 2);
+ }
+ }
+ create_cmaps(cmap, tounicode, &unencoded, GIDToCIDMap);
+
+ ht_clear_table(&unencoded, hval_free);
+ RELEASE(conf_name);
+ }
+
+ cmap_id = CMap_cache_add(cmap);
+ if (!is_cidfont && tounicode_id < 0) /* New */
+ CMap_cache_add(tounicode);
+
+ tt_cmap_release(ttcmap);
+ if (gsub_list)
+ otl_gsub_release(gsub_list);
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otf_cmap>> Overwrite CMap \"%s\" by \"%s\" with usecmap\n",
+ base_name, cmap_name);
+ }
+
+ if (GIDToCIDMap)
+ RELEASE(GIDToCIDMap);
+ if (base_name)
+ RELEASE(base_name);
+ if (cmap_name)
+ RELEASE(cmap_name);
+ if (tounicode_name)
+ RELEASE(tounicode_name);
+
+ sfnt_close(sfont);
+ DPXFCLOSE(fp);
+
+ return cmap_id;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/tt_cmap.h b/Build/source/texk/xdvipdfmx/src/tt_cmap.h
new file mode 100644
index 00000000000..455ad4836ad
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_cmap.h
@@ -0,0 +1,80 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_cmap.h,v 1.12 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TT_CMAP_H_
+#define _TT_CMAP_H_
+
+#include "sfnt.h"
+
+extern void otf_cmap_set_verbose (void);
+
+/* TrueType cmap table */
+typedef struct
+{
+ USHORT format;
+ USHORT platform;
+ USHORT encoding;
+ ULONG language; /* or version, only for Mac */
+ void *map;
+} tt_cmap;
+
+/* Paltform ID */
+#define TT_MAC 1u
+#define TT_WIN 3u
+
+/* Platform-specific encoding ID */
+
+/* Windows */
+#define TT_WIN_SYMBOL 0u
+#define TT_WIN_UNICODE 1u
+#define TT_WIN_SJIS 2u
+#define TT_WIN_RPC 3u
+#define TT_WIN_BIG5 4u
+#define TT_WIN_WANSUNG 5u
+#define TT_WIN_JOHAB 6u
+#define TT_WIN_UCS4 10u
+
+/* Mac */
+#define TT_MAC_ROMAN 0u
+#define TT_MAC_JAPANESE 1u
+#define TT_MAC_TRADITIONAL_CHINESE 2u
+#define TT_MAC_KOREAN 3u
+#define TT_MAC_SIMPLIFIED_CHINESE 25u
+
+extern tt_cmap *tt_cmap_read (sfnt *sfont, USHORT platform, USHORT encoding);
+
+extern USHORT tt_cmap_lookup (tt_cmap *cmap, long cc);
+extern void tt_cmap_release (tt_cmap *cmap);
+
+#include "pdfobj.h"
+
+/* Indirect reference */
+extern pdf_obj *otf_create_ToUnicode_stream (const char *map_name,
+ int ttc_index,
+ FT_Face face,
+ const char *used_glyphs);
+/* CMap ID */
+extern int otf_load_Unicode_CMap (const char *map_name,
+ int ttc_index,
+ const char *otl_opts, int wmode);
+
+#endif /* _TT_CMAP_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tt_glyf.c b/Build/source/texk/xdvipdfmx/src/tt_glyf.c
new file mode 100644
index 00000000000..3e3e5571281
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_glyf.c
@@ -0,0 +1,670 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_glyf.c,v 1.2 2005/06/09 14:31:11 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * Subsetting glyf, updating loca, hmtx, ...
+ *
+ */
+
+#include "config.h"
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "sfnt.h"
+#include "tt_table.h"
+#include "tt_glyf.h"
+
+#define NUM_GLYPH_LIMIT 65534
+#define TABLE_DATA_ALLOC_SIZE 40960
+#define GLYPH_ARRAY_ALLOC_SIZE 256
+
+static USHORT
+find_empty_slot (struct tt_glyphs *g)
+{
+ USHORT gid;
+
+ ASSERT(g);
+
+ for (gid = 0; gid < NUM_GLYPH_LIMIT; gid++) {
+ if (!(g->used_slot[gid/8] & (1 << (7 - (gid % 8)))))
+ break;
+ }
+ if (gid == NUM_GLYPH_LIMIT)
+ ERROR("No empty glyph slot available.");
+
+ return gid;
+}
+
+USHORT
+tt_find_glyph (struct tt_glyphs *g, USHORT gid)
+{
+ USHORT idx, new_gid = 0;
+
+ ASSERT(g);
+
+ for (idx = 0; idx < g->num_glyphs; idx++) {
+ if (gid == g->gd[idx].ogid) {
+ new_gid = g->gd[idx].gid;
+ break;
+ }
+ }
+
+ return new_gid;
+}
+
+USHORT
+tt_get_index (struct tt_glyphs *g, USHORT gid)
+{
+ USHORT idx;
+
+ ASSERT(g);
+
+ for (idx = 0; idx < g->num_glyphs; idx++) {
+ if (gid == g->gd[idx].gid)
+ break;
+ }
+ if (idx == g->num_glyphs)
+ idx = 0;
+
+ return idx;
+}
+
+USHORT
+tt_add_glyph (struct tt_glyphs *g, USHORT gid, USHORT new_gid)
+{
+ ASSERT(g);
+
+ if (g->used_slot[new_gid/8] & (1 << (7 - (new_gid % 8)))) {
+ WARN("Slot %u already used.", new_gid);
+ } else {
+ if (g->num_glyphs+1 >= NUM_GLYPH_LIMIT)
+ ERROR("Too many glyphs.");
+
+ if (g->num_glyphs >= g->max_glyphs) {
+ g->max_glyphs += GLYPH_ARRAY_ALLOC_SIZE;
+ g->gd = RENEW(g->gd, g->max_glyphs, struct tt_glyph_desc);
+ }
+ g->gd[g->num_glyphs].gid = new_gid;
+ g->gd[g->num_glyphs].ogid = gid;
+ g->gd[g->num_glyphs].length = 0;
+ g->gd[g->num_glyphs].data = NULL;
+ g->used_slot[new_gid/8] |= (1 << (7 - (new_gid % 8)));
+ g->num_glyphs += 1;
+ }
+
+ if (new_gid > g->last_gid) {
+ g->last_gid = new_gid;
+ }
+
+ return new_gid;
+}
+
+/*
+ * Initialization
+ */
+struct tt_glyphs *
+tt_build_init (void)
+{
+ struct tt_glyphs *g;
+
+ g = NEW(1, struct tt_glyphs);
+
+ g->num_glyphs = 0;
+ g->max_glyphs = 0;
+ g->last_gid = 0;
+ g->emsize = 1;
+ g->default_advh = 0;
+ g->default_tsb = 0;
+ g->gd = NULL;
+ g->used_slot = NEW(8192, unsigned char);
+ memset(g->used_slot, 0, 8192);
+ tt_add_glyph(g, 0, 0);
+
+ return g;
+}
+
+void
+tt_build_finish (struct tt_glyphs *g)
+{
+ if (g) {
+ if (g->gd) {
+ USHORT idx;
+ for (idx = 0; idx < g->num_glyphs; idx++) {
+ if (g->gd[idx].data)
+ RELEASE(g->gd[idx].data);
+ }
+ RELEASE(g->gd);
+ }
+ if (g->used_slot)
+ RELEASE(g->used_slot);
+ RELEASE(g);
+ }
+}
+
+static int CDECL
+glyf_cmp (const void *v1, const void *v2)
+{
+ int cmp = 0;
+ struct tt_glyph_desc *sv1, *sv2;
+
+ sv1 = (struct tt_glyph_desc *) v1;
+ sv2 = (struct tt_glyph_desc *) v2;
+
+ if (sv1->gid == sv2->gid)
+ cmp = 0;
+ else if (sv1->gid < sv2->gid)
+ cmp = -1;
+ else
+ cmp = 1;
+
+ return cmp;
+}
+
+/*
+ * TrueType outline data.
+ */
+#define ARG_1_AND_2_ARE_WORDS (1 << 0)
+#define ARGS_ARE_XY_VALUES (1 << 1)
+#define ROUND_XY_TO_GRID (1 << 2)
+#define WE_HAVE_A_SCALE (1 << 3)
+#define RESERVED (1 << 4)
+#define MORE_COMPONENT (1 << 5)
+#define WE_HAVE_AN_X_AND_Y_SCALE (1 << 6)
+#define WE_HAVE_A_TWO_BY_TWO (1 << 7)
+#define WE_HAVE_INSTRUCTIONS (1 << 8)
+#define USE_MY_METRICS (1 << 9)
+
+int
+tt_build_tables (sfnt *sfont, struct tt_glyphs *g)
+{
+ char *hmtx_table_data = NULL, *loca_table_data = NULL;
+ char *glyf_table_data = NULL;
+ ULONG hmtx_table_size, loca_table_size, glyf_table_size;
+ /* some information available from other TrueType table */
+ struct tt_head_table *head = NULL;
+ struct tt_hhea_table *hhea = NULL;
+ struct tt_maxp_table *maxp = NULL;
+ struct tt_longMetrics *hmtx, *vmtx = NULL;
+ struct tt_os2__table *os2;
+ /* temp */
+ ULONG *location, offset;
+ long i;
+ USHORT *w_stat; /* Estimate most frequently appeared width */
+
+ ASSERT(g);
+
+ if (sfont == NULL ||
+#ifdef XETEX
+ sfont->ft_face == NULL
+#else
+ sfont->stream == NULL
+#endif
+ )
+ ERROR("File not opened.");
+
+ if (sfont->type != SFNT_TYPE_TRUETYPE &&
+ sfont->type != SFNT_TYPE_TTC)
+ ERROR("Invalid font type");
+
+ if (g->num_glyphs > NUM_GLYPH_LIMIT)
+ ERROR("Too many glyphs.");
+
+ /*
+ * Read head, hhea, maxp, loca:
+ *
+ * unitsPerEm --> head
+ * numHMetrics --> hhea
+ * indexToLocFormat --> head
+ * numGlyphs --> maxp
+ */
+ head = tt_read_head_table(sfont);
+ hhea = tt_read_hhea_table(sfont);
+ maxp = tt_read_maxp_table(sfont);
+
+ if (hhea->metricDataFormat != 0)
+ ERROR("Unknown metricDataFormat.");
+
+ g->emsize = head->unitsPerEm;
+
+ sfnt_locate_table(sfont, "hmtx");
+ hmtx = tt_read_longMetrics(sfont, maxp->numGlyphs, hhea->numberOfHMetrics);
+
+ os2 = tt_read_os2__table(sfont);
+ if (os2) {
+ g->default_advh = os2->sTypoAscender - os2->sTypoDescender;
+ g->default_tsb = g->default_advh - os2->sTypoAscender;
+ }
+
+ if (sfnt_find_table_pos(sfont, "vmtx") > 0) {
+ struct tt_vhea_table *vhea;
+ vhea = tt_read_vhea_table(sfont);
+ sfnt_locate_table(sfont, "vmtx");
+ vmtx = tt_read_longMetrics(sfont, maxp->numGlyphs, vhea->numOfLongVerMetrics);
+ RELEASE(vhea);
+ } else {
+ vmtx = NULL;
+ }
+
+ sfnt_locate_table(sfont, "loca");
+ location = NEW(maxp->numGlyphs + 1, ULONG);
+ if (head->indexToLocFormat == 0) {
+ for (i = 0; i <= maxp->numGlyphs; i++)
+ location[i] = 2*((ULONG) sfnt_get_ushort(sfont));
+ } else if (head->indexToLocFormat == 1) {
+ for (i = 0; i <= maxp->numGlyphs; i++)
+ location[i] = sfnt_get_ulong(sfont);
+ } else {
+ ERROR("Unknown IndexToLocFormat.");
+ }
+
+ w_stat = NEW(g->emsize+2, USHORT);
+ memset(w_stat, 0, sizeof(USHORT)*(g->emsize+2));
+ /*
+ * Read glyf table.
+ */
+ offset = sfnt_locate_table(sfont, "glyf");
+ /*
+ * The num_glyphs may grow when composite glyph is found.
+ * A component of glyph refered by a composite glyph is appended
+ * to used_glyphs if it is not already registered in used_glyphs.
+ * Glyph programs of composite glyphs are modified so that it
+ * correctly refer to new gid of their components.
+ */
+ for (i = 0; i < NUM_GLYPH_LIMIT; i++) {
+ USHORT gid; /* old gid */
+ ULONG loc, len;
+ BYTE *p, *endptr;
+ SHORT number_of_contours;
+
+ if (i >= g->num_glyphs) /* finished */
+ break;
+
+ gid = g->gd[i].ogid;
+ if (gid >= maxp->numGlyphs)
+ ERROR("Invalid glyph index (gid %u)", gid);
+
+ loc = location[gid];
+ len = location[gid+1] - loc;
+ g->gd[i].advw = hmtx[gid].advance;
+ g->gd[i].lsb = hmtx[gid].sideBearing;
+ if (vmtx) {
+ g->gd[i].advh = vmtx[gid].advance;
+ g->gd[i].tsb = vmtx[gid].sideBearing;
+ } else {
+ g->gd[i].advh = g->default_advh;
+ g->gd[i].tsb = g->default_tsb;
+ }
+ g->gd[i].length = len;
+ g->gd[i].data = NULL;
+ if (g->gd[i].advw <= g->emsize) {
+ w_stat[g->gd[i].advw] += 1;
+ } else {
+ w_stat[g->emsize+1] += 1; /* larger than em */
+ }
+
+ if (len == 0) { /* Does not contains any data. */
+ continue;
+ } else if (len < 10) {
+ ERROR("Invalid TrueType glyph data (gid %u).", gid);
+ }
+
+ g->gd[i].data = p = NEW(len, BYTE);
+ endptr = p + len;
+
+ sfnt_seek_set(sfont, offset+loc);
+ number_of_contours = sfnt_get_short(sfont);
+ p += sfnt_put_short(p, number_of_contours);
+
+ /* BoundingBox: FWord x 4 */
+ g->gd[i].llx = sfnt_get_short(sfont);
+ g->gd[i].lly = sfnt_get_short(sfont);
+ g->gd[i].urx = sfnt_get_short(sfont);
+ g->gd[i].ury = sfnt_get_short(sfont);
+ /* _FIXME_ */
+#if 1
+ if (!vmtx) /* vertOriginY == sTypeAscender */
+ g->gd[i].tsb = g->default_advh - g->default_tsb - g->gd[i].ury;
+#endif
+ p += sfnt_put_short(p, g->gd[i].llx);
+ p += sfnt_put_short(p, g->gd[i].lly);
+ p += sfnt_put_short(p, g->gd[i].urx);
+ p += sfnt_put_short(p, g->gd[i].ury);
+
+ /* Read evrything else. */
+ sfnt_read(p, len - 10, sfont);
+ /*
+ * Fix GIDs of composite glyphs.
+ */
+ if (number_of_contours < 0) {
+ USHORT flags, cgid, new_gid; /* flag, gid of a component */
+ do {
+ if (p >= endptr)
+ ERROR("Invalid TrueType glyph data (gid %u): %u bytes", gid, len);
+ /*
+ * Flags and gid of component glyph are both USHORT.
+ */
+ flags = ((*p) << 8)| *(p+1);
+ p += 2;
+ cgid = ((*p) << 8)| *(p+1);
+ if (cgid >= maxp->numGlyphs) {
+ ERROR("Invalid gid (%u > %u) in composite glyph %u.", cgid, maxp->numGlyphs, gid);
+ }
+ new_gid = tt_find_glyph(g, cgid);
+ if (new_gid == 0) {
+ new_gid = tt_add_glyph(g, cgid, find_empty_slot(g));
+ }
+ p += sfnt_put_ushort(p, new_gid);
+ /*
+ * Just skip remaining part.
+ */
+ p += (flags & ARG_1_AND_2_ARE_WORDS) ? 4 : 2;
+ if (flags & WE_HAVE_A_SCALE) /* F2Dot14 */
+ p += 2;
+ else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) /* F2Dot14 x 2 */
+ p += 4;
+ else if (flags & WE_HAVE_A_TWO_BY_TWO) /* F2Dot14 x 4 */
+ p += 8;
+ } while (flags & MORE_COMPONENT);
+ /*
+ * TrueType instructions comes here:
+ * length_of_instruction (ushort)
+ * instruction (byte * length_of_instruction)
+ */
+ }
+ }
+ RELEASE(location);
+ RELEASE(hmtx);
+ if (vmtx)
+ RELEASE(vmtx);
+
+ {
+ int max_count = -1;
+
+ g->dw = g->gd[0].advw;
+ for (i = 0; i < g->emsize + 1; i++) {
+ if (w_stat[i] > max_count) {
+ max_count = w_stat[i];
+ g->dw = i;
+ }
+ }
+ }
+ RELEASE(w_stat);
+
+ qsort(g->gd, g->num_glyphs, sizeof(struct tt_glyph_desc), glyf_cmp);
+ {
+ USHORT prev, last_advw;
+ char *p, *q;
+ int padlen, num_hm_known;
+
+ glyf_table_size = 0UL;
+ num_hm_known = 0;
+ last_advw = g->gd[g->num_glyphs - 1].advw;
+ for (i = g->num_glyphs - 1; i >= 0; i--) {
+ padlen = (g->gd[i].length % 4) ? (4 - (g->gd[i].length % 4)) : 0;
+ glyf_table_size += g->gd[i].length + padlen;
+ if (!num_hm_known && last_advw != g->gd[i].advw) {
+ hhea->numberOfHMetrics = g->gd[i].gid + 2;
+ num_hm_known = 1;
+ }
+ }
+ /* All advance widths are same. */
+ if (!num_hm_known) {
+ hhea->numberOfHMetrics = 1;
+ }
+ hmtx_table_size = hhea->numberOfHMetrics * 2 + (g->last_gid + 1) * 2;
+
+ /*
+ * Choosing short format does not always give good result
+ * when compressed. Sometimes increases size.
+ */
+ if (glyf_table_size < 0x20000UL) {
+ head->indexToLocFormat = 0;
+ loca_table_size = (g->last_gid + 2)*2;
+ } else {
+ head->indexToLocFormat = 1;
+ loca_table_size = (g->last_gid + 2)*4;
+ }
+
+ hmtx_table_data = p = NEW(hmtx_table_size, char);
+ loca_table_data = q = NEW(loca_table_size, char);
+ glyf_table_data = NEW(glyf_table_size, char);
+
+ offset = 0UL; prev = 0;
+ for (i = 0; i < g->num_glyphs; i++) {
+ long gap, j;
+ gap = (long) g->gd[i].gid - prev - 1;
+ for (j = 1; j <= gap; j++) {
+ if (prev + j == hhea->numberOfHMetrics - 1) {
+ p += sfnt_put_ushort(p, last_advw);
+ } else if (prev + j < hhea->numberOfHMetrics) {
+ p += sfnt_put_ushort(p, 0);
+ }
+ p += sfnt_put_short (p, 0);
+ if (head->indexToLocFormat == 0) {
+ q += sfnt_put_ushort(q, (USHORT) (offset/2));
+ } else {
+ q += sfnt_put_ulong(q, offset);
+ }
+ }
+ padlen = (g->gd[i].length % 4) ? (4 - (g->gd[i].length % 4)) : 0;
+ if (g->gd[i].gid < hhea->numberOfHMetrics) {
+ p += sfnt_put_ushort(p, g->gd[i].advw);
+ }
+ p += sfnt_put_short (p, g->gd[i].lsb);
+ if (head->indexToLocFormat == 0) {
+ q += sfnt_put_ushort(q, (USHORT) (offset/2));
+ } else {
+ q += sfnt_put_ulong(q, offset);
+ }
+ memset(glyf_table_data + offset, 0, g->gd[i].length + padlen);
+ memcpy(glyf_table_data + offset, g->gd[i].data, g->gd[i].length);
+ offset += g->gd[i].length + padlen;
+ prev = g->gd[i].gid;
+ /* free data here since it consume much memory */
+ RELEASE(g->gd[i].data);
+ g->gd[i].length = 0; g->gd[i].data = NULL;
+ }
+ if (head->indexToLocFormat == 0) {
+ q += sfnt_put_ushort(q, (USHORT) (offset/2));
+ } else {
+ q += sfnt_put_ulong(q, offset);
+ }
+
+ sfnt_set_table(sfont, "hmtx", (char *) hmtx_table_data, hmtx_table_size);
+ sfnt_set_table(sfont, "loca", (char *) loca_table_data, loca_table_size);
+ sfnt_set_table(sfont, "glyf", (char *) glyf_table_data, glyf_table_size);
+ }
+
+ head->checkSumAdjustment = 0;
+ maxp->numGlyphs = g->last_gid + 1;
+
+ /* TODO */
+ sfnt_set_table(sfont, "maxp", tt_pack_maxp_table(maxp), TT_MAXP_TABLE_SIZE);
+ sfnt_set_table(sfont, "hhea", tt_pack_hhea_table(hhea), TT_HHEA_TABLE_SIZE);
+ sfnt_set_table(sfont, "head", tt_pack_head_table(head), TT_HEAD_TABLE_SIZE);
+ RELEASE(maxp);
+ RELEASE(hhea);
+ RELEASE(head);
+ if (os2)
+ RELEASE(os2);
+
+ return 0;
+}
+
+int
+tt_get_metrics (sfnt *sfont, struct tt_glyphs *g)
+{
+ struct tt_head_table *head = NULL;
+ struct tt_hhea_table *hhea = NULL;
+ struct tt_maxp_table *maxp = NULL;
+ struct tt_longMetrics *hmtx, *vmtx = NULL;
+ struct tt_os2__table *os2;
+ /* temp */
+ ULONG *location, offset;
+ long i;
+ USHORT *w_stat;
+
+ ASSERT(g);
+
+ if (sfont == NULL ||
+#ifdef XETEX
+ sfont->ft_face == NULL
+#else
+ sfont->stream == NULL
+#endif
+ )
+ ERROR("File not opened.");
+
+ if (sfont->type != SFNT_TYPE_TRUETYPE &&
+ sfont->type != SFNT_TYPE_TTC)
+ ERROR("Invalid font type");
+
+ /*
+ * Read head, hhea, maxp, loca:
+ *
+ * unitsPerEm --> head
+ * numHMetrics --> hhea
+ * indexToLocFormat --> head
+ * numGlyphs --> maxp
+ */
+ head = tt_read_head_table(sfont);
+ hhea = tt_read_hhea_table(sfont);
+ maxp = tt_read_maxp_table(sfont);
+
+ if (hhea->metricDataFormat != 0)
+ ERROR("Unknown metricDataFormat.");
+
+ g->emsize = head->unitsPerEm;
+
+ sfnt_locate_table(sfont, "hmtx");
+ hmtx = tt_read_longMetrics(sfont, maxp->numGlyphs, hhea->numberOfHMetrics);
+
+ os2 = tt_read_os2__table(sfont);
+ g->default_advh = os2->sTypoAscender - os2->sTypoDescender;
+ g->default_tsb = g->default_advh - os2->sTypoAscender;
+
+ if (sfnt_find_table_pos(sfont, "vmtx") > 0) {
+ struct tt_vhea_table *vhea;
+ vhea = tt_read_vhea_table(sfont);
+ sfnt_locate_table(sfont, "vmtx");
+ vmtx = tt_read_longMetrics(sfont, maxp->numGlyphs, vhea->numOfLongVerMetrics);
+ RELEASE(vhea);
+ } else {
+ vmtx = NULL;
+ }
+
+ sfnt_locate_table(sfont, "loca");
+ location = NEW(maxp->numGlyphs + 1, ULONG);
+ if (head->indexToLocFormat == 0) {
+ for (i = 0; i <= maxp->numGlyphs; i++)
+ location[i] = 2*((ULONG) sfnt_get_ushort(sfont));
+ } else if (head->indexToLocFormat == 1) {
+ for (i = 0; i <= maxp->numGlyphs; i++)
+ location[i] = sfnt_get_ulong(sfont);
+ } else {
+ ERROR("Unknown IndexToLocFormat.");
+ }
+
+ w_stat = NEW(g->emsize+2, USHORT);
+ memset(w_stat, 0, sizeof(USHORT)*(g->emsize+2));
+ /*
+ * Read glyf table.
+ */
+ offset = sfnt_locate_table(sfont, "glyf");
+ for (i = 0; i < g->num_glyphs; i++) {
+ USHORT gid; /* old gid */
+ ULONG loc, len;
+ SHORT number_of_contours;
+
+ gid = g->gd[i].ogid;
+ if (gid >= maxp->numGlyphs)
+ ERROR("Invalid glyph index (gid %u)", gid);
+
+ loc = location[gid];
+ len = location[gid+1] - loc;
+ g->gd[i].advw = hmtx[gid].advance;
+ g->gd[i].lsb = hmtx[gid].sideBearing;
+ if (vmtx) {
+ g->gd[i].advh = vmtx[gid].advance;
+ g->gd[i].tsb = vmtx[gid].sideBearing;
+ } else {
+ g->gd[i].advh = g->default_advh;
+ g->gd[i].tsb = g->default_tsb;
+ }
+ g->gd[i].length = len;
+ g->gd[i].data = NULL;
+
+ if (g->gd[i].advw <= g->emsize) {
+ w_stat[g->gd[i].advw] += 1;
+ } else {
+ w_stat[g->emsize+1] += 1; /* larger than em */
+ }
+
+ if (len == 0) { /* Does not contains any data. */
+ continue;
+ } else if (len < 10) {
+ ERROR("Invalid TrueType glyph data (gid %u).", gid);
+ }
+
+ sfnt_seek_set(sfont, offset+loc);
+ number_of_contours = sfnt_get_short(sfont);
+
+ /* BoundingBox: FWord x 4 */
+ g->gd[i].llx = sfnt_get_short(sfont);
+ g->gd[i].lly = sfnt_get_short(sfont);
+ g->gd[i].urx = sfnt_get_short(sfont);
+ g->gd[i].ury = sfnt_get_short(sfont);
+ /* _FIXME_ */
+#if 1
+ if (!vmtx) /* vertOriginY == sTypeAscender */
+ g->gd[i].tsb = g->default_advh - g->default_tsb - g->gd[i].ury;
+#endif
+ }
+ RELEASE(location);
+ RELEASE(hmtx);
+ RELEASE(maxp);
+ RELEASE(hhea);
+ RELEASE(head);
+ RELEASE(os2);
+
+ if (vmtx)
+ RELEASE(vmtx);
+
+ {
+ int max_count = -1;
+
+ g->dw = g->gd[0].advw;
+ for (i = 0; i < g->emsize + 1; i++) {
+ if (w_stat[i] > max_count) {
+ max_count = w_stat[i];
+ g->dw = i;
+ }
+ }
+ }
+ RELEASE(w_stat);
+
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/tt_glyf.h b/Build/source/texk/xdvipdfmx/src/tt_glyf.h
new file mode 100644
index 00000000000..41e2aa23c75
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_glyf.h
@@ -0,0 +1,60 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_glyf.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TT_GLYF_H_
+#define _TT_GLYF_H_
+
+struct tt_glyph_desc
+{
+ USHORT gid;
+ USHORT ogid; /* GID in original font */
+ USHORT advw, advh;
+ SHORT lsb, tsb;
+ SHORT llx, lly, urx, ury;
+ ULONG length;
+ BYTE *data;
+};
+
+struct tt_glyphs
+{
+ USHORT num_glyphs;
+ USHORT max_glyphs;
+ USHORT last_gid;
+ USHORT emsize;
+ USHORT dw; /* optimal value for DW */
+ USHORT default_advh; /* default value */
+ SHORT default_tsb; /* default value */
+ struct tt_glyph_desc *gd;
+ unsigned char *used_slot;
+};
+
+extern struct tt_glyphs *tt_build_init (void);
+extern void tt_build_finish (struct tt_glyphs *g);
+
+extern USHORT tt_add_glyph (struct tt_glyphs *g, USHORT gid, USHORT new_gid);
+extern USHORT tt_get_index (struct tt_glyphs *g, USHORT gid);
+extern USHORT tt_find_glyph (struct tt_glyphs *g, USHORT gid);
+
+extern int tt_build_tables (sfnt *sfont, struct tt_glyphs *g);
+extern int tt_get_metrics (sfnt *sfont, struct tt_glyphs *g);
+
+#endif /* _TT_GLYF_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tt_gsub.c b/Build/source/texk/xdvipdfmx/src/tt_gsub.c
new file mode 100644
index 00000000000..20981c0b8cb
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_gsub.c
@@ -0,0 +1,1666 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_gsub.c,v 1.14 2005/06/27 09:04:52 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * TrueType GSUB support: (incomplete)
+ */
+
+#include "system.h"
+
+#include "error.h"
+#include "mem.h"
+#include "mfileio.h"
+
+#include "sfnt.h"
+
+#include "otl_opt.h"
+#include "tt_gsub.h"
+
+#define VERBOSE_LEVEL_MIN 0
+static int verbose = 0;
+void
+otl_gsub_set_verbose (void)
+{
+ verbose++;
+}
+
+typedef USHORT Offset;
+typedef USHORT GlyphID;
+
+/* OpenType Common Layout Table */
+/* Records */
+struct clt_record
+{
+ char tag[5]; /* 4-byte identifier */
+ Offset offset;
+};
+
+/* Ranges */
+/* RangeRecord */
+struct clt_range
+{
+ GlyphID Start; /* First GlyphID in the range */
+ GlyphID End; /* Last GlyphID in the range */
+ USHORT StartCoverageIndex; /* Converage Index of first GID */
+};
+
+static long
+clt_read_record (struct clt_record *rec, sfnt *sfont)
+{
+ int i;
+
+ ASSERT(rec && sfont);
+
+ for (i = 0; i < 4; i++) {
+ rec->tag[i] = sfnt_get_char(sfont);
+ }
+ rec->tag[4] = '\0';
+ rec->offset = sfnt_get_ushort(sfont);
+
+ return 6;
+}
+
+static long
+clt_read_range (struct clt_range *rec, sfnt *sfont)
+{
+ ASSERT(rec && sfont);
+
+ rec->Start = sfnt_get_ushort(sfont);
+ rec->End = sfnt_get_ushort(sfont);
+ rec->StartCoverageIndex = sfnt_get_ushort(sfont);
+
+ return 6;
+}
+
+/*
+ List structure:
+ ScriptRecord (records), FeatureRecord (records), Lookup (offsets)
+*/
+
+struct clt_record_list
+{
+ USHORT count;
+ struct clt_record *record;
+};
+
+/* offset and index list, Offset is USHORT */
+struct clt_number_list
+{
+ USHORT count;
+ USHORT *value;
+};
+
+static long
+clt_read_record_list (struct clt_record_list *list, sfnt *sfont)
+{
+ long len, i;
+
+ ASSERT(list && sfont);
+
+ list->count = sfnt_get_ushort(sfont);
+ len = 2;
+
+ if (list->count == 0)
+ list->record = NULL;
+ else {
+ list->record = NEW(list->count, struct clt_record);
+ for (i = 0; i < list->count; i++) {
+ len += clt_read_record(&(list->record[i]), sfont);
+ }
+ }
+
+ return len;
+}
+
+static void
+clt_release_record_list (struct clt_record_list *list)
+{
+ if (list) {
+ if (list->record)
+ RELEASE(list->record);
+ list->record = NULL;
+ list->count = 0;
+ }
+}
+
+static long
+clt_read_number_list (struct clt_number_list *list, sfnt *sfont)
+{
+ long i;
+
+ ASSERT(list && sfont);
+
+ list->count = sfnt_get_ushort(sfont);
+
+ if (list->count == 0)
+ list->value = NULL;
+ else {
+ list->value = NEW(list->count, USHORT);
+ for (i = 0; i < list->count; i++) {
+ list->value[i] = sfnt_get_ushort(sfont);
+ }
+ }
+
+ return (2 + 2 * list->count);
+}
+
+static void
+clt_release_number_list (struct clt_number_list *list)
+{
+ if (list) {
+ if (list->value)
+ RELEASE(list->value);
+ list->value = NULL;
+ list->count = 0;
+ }
+}
+
+/*
+ * Tables
+ */
+
+
+/* Coverage Table: format 1 and format 2 */
+struct clt_coverage
+{
+ USHORT format; /* Format identifier: 1 (list), 2 (range) */
+ USHORT count; /* Glyphs/Range Count */
+ GlyphID *list; /* Array of GlyphIDs - in numerical order */
+ struct clt_range *range; /* Array of glyph ranges
+ * - ordered by Start GlyphID
+ */
+};
+
+/* GSUB - The Glyph Substitution Table */
+struct otl_gsub_header
+{
+ Fixed version; /* 0x00010000 */
+ Offset ScriptList; /* offset */
+ Offset FeatureList; /* offset */
+ Offset LookupList; /* offset */
+};
+
+/* Single Substitution Format 1 */
+struct otl_gsub_single1
+{
+ SHORT DeltaGlyphID; /* Add to original GlyphID to get
+ * substitute GlyphID */
+ struct clt_coverage coverage; /* Coverage table */
+};
+
+/* Single Substitution Format 2 */
+struct otl_gsub_single2
+{
+ USHORT GlyphCount; /* Number of GlyphIDs in the Substitute array */
+ GlyphID *Substitute; /* Array of substitute GlyphIDs
+ * - ordered by Coverage Index */
+ struct clt_coverage coverage; /* Coverage table */
+};
+
+/* Alternate Subsutitution Format 1 */
+struct otl_gsub_altset
+{
+ USHORT GlyphCount; /* Number of GlyphIDs in the Alternate array */
+ GlyphID *Alternate; /* Array of alternate GlyphIDs
+ * - in arbitrary order
+ */
+};
+
+struct otl_gsub_alternate1
+{
+ USHORT AlternateSetCount;
+ struct otl_gsub_altset *AlternateSet;
+
+ struct clt_coverage coverage;
+};
+
+/* Faithfull */
+struct otl_gsub_ligtab
+{
+ GlyphID LigGlyph; /* GlyphID of ligature glyph */
+ USHORT CompCount;
+ GlyphID *Component; /* CompCount - 1 elements
+ * First component excluded.
+ * Ordered in writing direction...
+ */
+};
+
+struct otl_gsub_ligset
+{
+ USHORT LigatureCount;
+ struct otl_gsub_ligtab *Ligature;
+};
+
+struct otl_gsub_ligature1
+{
+ USHORT LigSetCount;
+ struct otl_gsub_ligset *LigatureSet;
+
+ struct clt_coverage coverage;
+};
+
+/* GSUB subtable (single) */
+struct otl_gsub_subtab
+{
+ USHORT LookupType; /* FIXME */
+
+ USHORT SubstFormat;
+ union {
+ struct otl_gsub_single1 *single1;
+ struct otl_gsub_single2 *single2;
+ struct otl_gsub_alternate1 *alternate1;
+ struct otl_gsub_ligature1 *ligature1;
+ } table;
+};
+
+/* Script Table */
+struct clt_script_table
+{
+ Offset DefaultLangSys;
+ struct clt_record_list LangSysRecord;
+};
+
+static long
+clt_read_script_table (struct clt_script_table *tab, sfnt *sfont)
+{
+ long len;
+
+ ASSERT(tab && sfont);
+
+ tab->DefaultLangSys = sfnt_get_ushort(sfont);
+ len = 2;
+ len += clt_read_record_list(&tab->LangSysRecord, sfont);
+
+ return len;
+}
+
+static void
+clt_release_script_table (struct clt_script_table *tab)
+{
+ if (tab)
+ clt_release_record_list(&tab->LangSysRecord);
+}
+
+/* LangSys Table */
+struct clt_langsys_table
+{
+ Offset LookupOrder; /* reserved */
+ USHORT ReqFeatureIndex;
+ struct clt_number_list FeatureIndex; /* Array of indices into the
+ * FeatureList in arbitary order.
+ */
+};
+
+static long
+clt_read_langsys_table (struct clt_langsys_table *tab, sfnt *sfont)
+{
+ long len;
+
+ ASSERT(tab && sfont);
+
+ tab->LookupOrder = sfnt_get_ushort(sfont);
+ tab->ReqFeatureIndex = sfnt_get_ushort(sfont);
+ len = 4;
+ len += clt_read_number_list(&tab->FeatureIndex, sfont);
+
+ return len;
+}
+
+static void
+clt_release_langsys_table (struct clt_langsys_table *tab)
+{
+ if (tab)
+ clt_release_number_list(&tab->FeatureIndex);
+}
+
+
+/* Feature Table */
+struct clt_feature_table
+{
+ Offset FeatureParams;
+ struct clt_number_list LookupListIndex; /* LookupListIndex List */
+};
+
+static long
+clt_read_feature_table (struct clt_feature_table *tab, sfnt *sfont)
+{
+ long len;
+
+ ASSERT(tab && sfont);
+
+ tab->FeatureParams = sfnt_get_ushort(sfont);
+ len = 2;
+ len += clt_read_number_list(&tab->LookupListIndex, sfont);
+
+ return len;
+}
+
+static void
+clt_release_feature_table (struct clt_feature_table *tab)
+{
+ if (tab)
+ clt_release_number_list(&tab->LookupListIndex);
+}
+
+/* Lookup Table:
+ * Currently, only single substitution is supported.
+ * LookupFlag is ignored.
+ */
+struct clt_lookup_table
+{
+ USHORT LookupType; /* Different enumerations for GSUB and GPOS */
+ USHORT LookupFlag; /* Lookup qualifiers */
+ struct clt_number_list SubTableList; /* offset */
+ /* offset is from beginning of Lookup table */
+};
+
+static long
+clt_read_lookup_table (struct clt_lookup_table *tab, sfnt *sfont)
+{
+ long len;
+
+ ASSERT(tab && sfont);
+
+ tab->LookupType = sfnt_get_ushort(sfont);
+ tab->LookupFlag = sfnt_get_ushort(sfont);
+ len = 4;
+ len += clt_read_number_list(&tab->SubTableList, sfont);
+
+ return len;
+}
+
+static void
+clt_release_lookup_table (struct clt_lookup_table *tab)
+{
+ if (tab)
+ clt_release_number_list(&tab->SubTableList);
+}
+
+static long
+clt_read_coverage (struct clt_coverage *cov, sfnt *sfont)
+{
+ long len, i;
+
+ ASSERT(cov && sfont);
+
+ cov->format = sfnt_get_ushort(sfont);
+ cov->count = sfnt_get_ushort(sfont);
+ len = 4;
+
+ switch (cov->format) {
+ case 1: /* list */
+ if (cov->count == 0)
+ cov->list = NULL;
+ else {
+ cov->list = NEW(cov->count, USHORT);
+ for (i = 0; i < cov->count; i++) {
+ cov->list[i] = sfnt_get_ushort(sfont);
+ }
+ }
+ cov->range = NULL;
+ len += 2 * cov->count;
+ break;
+ case 2: /* range */
+ if (cov->count == 0)
+ cov->range = NULL;
+ else {
+ cov->range = NEW(cov->count, struct clt_range);
+ for (i = 0; i < cov->count; i++) {
+ len += clt_read_range(&(cov->range[i]), sfont);
+ }
+ }
+ cov->list = NULL;
+ break;
+ default:
+ ERROR("Unknown coverage format");
+ }
+
+ return len;
+}
+
+static void
+clt_release_coverage (struct clt_coverage *cov)
+{
+ if (cov) {
+ switch (cov->format) {
+ case 1: /* list */
+ if (cov->list)
+ RELEASE(cov->list);
+ cov->list = NULL;
+ break;
+ case 2: /* range */
+ if (cov->range)
+ RELEASE(cov->range);
+ cov->range = NULL;
+ break;
+ default:
+ ERROR("Unknown coverage format");
+ }
+ }
+ cov->count = 0;
+}
+
+/* returns -1 if not found */
+static long
+clt_lookup_coverage (struct clt_coverage *cov, USHORT gid)
+{
+ long i;
+
+ ASSERT(cov);
+
+ switch (cov->format) {
+ case 1: /* list */
+ for (i = 0; i < cov->count; i++) {
+ if (cov->list[i] > gid) {
+ break;
+ } else if (cov->list[i] == gid) {
+ return i; /* found */
+ }
+ }
+ break;
+ case 2: /* range */
+ for (i = 0; i < cov->count; i++) {
+ if (gid < cov->range[i].Start) {
+ break;
+ } else if (gid <= cov->range[i].End) { /* found */
+ return (cov->range[i].StartCoverageIndex +
+ gid - cov->range[i].Start);
+ }
+ }
+ break;
+ default:
+ ERROR("Unknown coverage format");
+ }
+
+ return -1; /* not found */
+}
+
+static long
+otl_gsub_read_single (struct otl_gsub_subtab *subtab, sfnt *sfont)
+{
+ long len;
+ ULONG offset; /* not Offset which is USHORT */
+ Offset cov_offset; /* subtable offset, offset to Coverage table */
+
+ ASSERT(subtab && sfont);
+
+#ifdef XETEX
+ offset = sfont->loc;
+#else
+ offset = tell_position(sfont->stream);
+#endif
+
+ subtab->LookupType = OTL_GSUB_TYPE_SINGLE;
+ subtab->SubstFormat = sfnt_get_ushort(sfont);
+ len = 2;
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_single1 *data;
+
+ subtab->table.single1 = data = NEW(1, struct otl_gsub_single1);
+ cov_offset = sfnt_get_ushort(sfont);
+ data->DeltaGlyphID = sfnt_get_short(sfont);
+ len += 4;
+
+ sfnt_seek_set(sfont, offset + cov_offset);
+ len += clt_read_coverage(&data->coverage, sfont);
+
+ } else if (subtab->SubstFormat == 2) {
+ struct otl_gsub_single2 *data;
+ USHORT count;
+
+ subtab->table.single2 = data = NEW(1, struct otl_gsub_single2);
+ cov_offset = sfnt_get_ushort(sfont);
+ data->GlyphCount = sfnt_get_ushort(sfont);
+ len += 4;
+
+ if (data->GlyphCount == 0)
+ data->Substitute = NULL;
+ else {
+ data->Substitute = NEW(data->GlyphCount, GlyphID);
+ for (count = 0; count < data->GlyphCount; count++) {
+ data->Substitute[count] = sfnt_get_ushort(sfont);
+ }
+ len += 2 * data->GlyphCount;
+ }
+
+ sfnt_seek_set(sfont, offset + cov_offset);
+ len += clt_read_coverage(&data->coverage, sfont);
+
+ } else {
+ ERROR("unexpected SubstFormat");
+ }
+ /* not implemented yet */
+
+ return len;
+}
+
+static long
+otl_gsub_read_alternate (struct otl_gsub_subtab *subtab, sfnt *sfont)
+{
+ long len;
+ USHORT i, j;
+ ULONG offset; /* not Offset which is USHORT */
+ Offset cov_offset; /* subtable offset, offset to Coverage table */
+ struct clt_number_list altset_offsets;
+ struct otl_gsub_alternate1 *data;
+
+ ASSERT(subtab && sfont);
+
+#ifdef XETEX
+ offset = sfont->loc;
+#else
+ offset = tell_position(sfont->stream);
+#endif
+
+ subtab->LookupType = OTL_GSUB_TYPE_ALTERNATE;
+ subtab->SubstFormat = sfnt_get_ushort(sfont); /* Must be 1 */
+ if (subtab->SubstFormat != 1) {
+ WARN("Unknown GSUB SubstFormat for Alternate: %u",
+ subtab->SubstFormat);
+ return -1;
+ }
+
+ len = 2;
+ subtab->table.alternate1 =
+ data = NEW(1, struct otl_gsub_alternate1);
+
+ cov_offset = sfnt_get_ushort(sfont);
+ len += 2;
+ len += clt_read_number_list(&altset_offsets, sfont);
+ data->AlternateSetCount = altset_offsets.count;
+ if (data->AlternateSetCount == 0) {
+ data->AlternateSet = NULL;
+ data->coverage.count = 0;
+ data->coverage.format = 0;
+ data->coverage.list = NULL;
+ return len;
+ }
+ data->AlternateSet = NEW(data->AlternateSetCount,
+ struct otl_gsub_altset);
+ for (i = 0; i < data->AlternateSetCount; i++) {
+ struct otl_gsub_altset *altset;
+ ULONG altset_offset;
+
+ altset = &(data->AlternateSet[i]);
+
+ altset_offset = offset + altset_offsets.value[i];
+ sfnt_seek_set(sfont, altset_offset);
+ altset->GlyphCount = sfnt_get_ushort(sfont);
+ len += 2;
+ if (altset->GlyphCount == 0) {
+ altset->Alternate = NULL;
+ break;
+ }
+ altset->Alternate = NEW(altset->GlyphCount, GlyphID);
+ for (j = 0; j < altset->GlyphCount; j++) {
+ altset->Alternate[j] = sfnt_get_ushort(sfont);
+ len += 2;
+ }
+ }
+ clt_release_number_list(&altset_offsets);
+
+ sfnt_seek_set(sfont, offset + cov_offset);
+ len += clt_read_coverage(&data->coverage, sfont);
+
+ return len;
+}
+
+static long
+otl_gsub_read_ligature (struct otl_gsub_subtab *subtab, sfnt *sfont)
+{
+ long len;
+ USHORT i, j;
+ ULONG offset; /* not Offset which is USHORT */
+ Offset cov_offset; /* subtable offset, offset to Coverage table */
+ struct clt_number_list ligset_offsets;
+ struct otl_gsub_ligature1 *data;
+
+ ASSERT(subtab && sfont);
+
+#ifdef XETEX
+ offset = sfont->loc;
+#else
+ offset = tell_position(sfont->stream);
+#endif
+
+ subtab->LookupType = OTL_GSUB_TYPE_LIGATURE;
+ subtab->SubstFormat = sfnt_get_ushort(sfont); /* Must be 1 */
+ if (subtab->SubstFormat != 1) {
+ WARN("Unknown GSUB SubstFormat for Ligature: %u",
+ subtab->SubstFormat);
+ return -1;
+ }
+
+ len = 2;
+ subtab->table.ligature1 =
+ data = NEW(1, struct otl_gsub_ligature1);
+
+ cov_offset = sfnt_get_ushort(sfont);
+ len += 2;
+ len += clt_read_number_list(&ligset_offsets, sfont);
+ data->LigSetCount = ligset_offsets.count;
+ if (data->LigSetCount == 0) {
+ data->LigatureSet = NULL;
+ data->coverage.count = 0;
+ data->coverage.format = 0;
+ data->coverage.list = NULL;
+ return len;
+ }
+ data->LigatureSet = NEW(data->LigSetCount,
+ struct otl_gsub_ligset);
+ for (i = 0; i < data->LigSetCount; i++) {
+ struct clt_number_list ligset_tab;
+ struct otl_gsub_ligset *ligset;
+ ULONG ligset_offset;
+ USHORT count;
+
+ ligset = &(data->LigatureSet[i]);
+
+ ligset_offset = offset + ligset_offsets.value[i];
+ sfnt_seek_set(sfont, ligset_offset);
+ len += clt_read_number_list(&ligset_tab, sfont);
+
+ ligset->LigatureCount = ligset_tab.count;
+ if (ligset_tab.count == 0) {
+ ligset->Ligature = NULL;
+ break;
+ }
+ ligset->Ligature = NEW(ligset_tab.count,
+ struct otl_gsub_ligtab);
+ for (j = 0; j < ligset_tab.count; j++) {
+ sfnt_seek_set(sfont, ligset_offset + ligset_tab.value[j]);
+ ligset->Ligature[j].LigGlyph = sfnt_get_ushort(sfont);
+ ligset->Ligature[j].CompCount = sfnt_get_ushort(sfont);
+ if (ligset->Ligature[j].CompCount == 0) {
+ ligset->Ligature[j].Component = NULL;
+ break;
+ }
+ ligset->Ligature[j].Component =
+ NEW(ligset->Ligature[j].CompCount - 1, GlyphID);
+ for (count = 0;
+ count < ligset->Ligature[j].CompCount - 1; count++) {
+ ligset->Ligature[j].Component[count] = sfnt_get_ushort(sfont);
+ }
+ len += 4 + count * 2;
+ }
+ clt_release_number_list(&ligset_tab);
+ }
+ clt_release_number_list(&ligset_offsets);
+
+ sfnt_seek_set(sfont, offset + cov_offset);
+ len += clt_read_coverage(&data->coverage, sfont);
+
+ return len;
+}
+
+static void
+otl_gsub_release_single (struct otl_gsub_subtab *subtab)
+{
+ if (subtab) {
+ switch((int) subtab->SubstFormat) {
+ case 1:
+ {
+ struct otl_gsub_single1 *data;
+
+ data = subtab->table.single1;
+ if (data) {
+ clt_release_coverage(&data->coverage);
+ RELEASE(data);
+ }
+ subtab->table.single1 = NULL;
+ }
+ break;
+ case 2:
+ {
+ struct otl_gsub_single2 *data;
+
+ data = subtab->table.single2;
+ if (data) {
+ if (data->Substitute)
+ RELEASE(data->Substitute);
+ clt_release_coverage(&data->coverage);
+ RELEASE(data);
+ }
+ subtab->table.single2 = NULL;
+ }
+ break;
+ default:
+ ERROR("Unknown format for single substitution");
+ }
+ }
+}
+
+static void
+otl_gsub_release_ligature (struct otl_gsub_subtab *subtab)
+{
+ if (subtab) {
+ struct otl_gsub_ligature1 *data;
+ USHORT i, j;
+
+ data = subtab->table.ligature1;
+ if (data && data->LigatureSet) {
+ for (i = 0; i < data->LigSetCount; i++) {
+ struct otl_gsub_ligset *ligset;
+
+ ligset = &(data->LigatureSet[i]);
+ for (j = 0;
+ j < ligset->LigatureCount; j++) {
+ if (ligset->Ligature[j].Component)
+ RELEASE(ligset->Ligature[j].Component);
+ ligset->Ligature[j].Component = NULL;
+ }
+ RELEASE(ligset->Ligature);
+ ligset->Ligature = NULL;
+ }
+ RELEASE(data->LigatureSet);
+ }
+ clt_release_coverage(&data->coverage);
+ data->LigatureSet = NULL;
+ RELEASE(data);
+ subtab->table.ligature1 = NULL;
+ }
+}
+
+static void
+otl_gsub_release_alternate (struct otl_gsub_subtab *subtab)
+{
+ if (subtab) {
+ struct otl_gsub_alternate1 *data;
+ USHORT i;
+
+ data = subtab->table.alternate1;
+ if (data && data->AlternateSet) {
+ for (i = 0; i < data->AlternateSetCount; i++) {
+ struct otl_gsub_altset *altset;
+
+ altset = &(data->AlternateSet[i]);
+ if (altset->Alternate)
+ RELEASE(altset->Alternate);
+ altset->Alternate = NULL;
+ }
+ RELEASE(data->AlternateSet);
+ }
+ clt_release_coverage(&data->coverage);
+ data->AlternateSet = NULL;
+ RELEASE(data);
+ subtab->table.alternate1 = NULL;
+ }
+}
+
+static long
+otl_gsub_read_header (struct otl_gsub_header *head, sfnt *sfont)
+{
+ ASSERT(head && sfont);
+
+ head->version = sfnt_get_ulong (sfont);
+ head->ScriptList = sfnt_get_ushort(sfont);
+ head->FeatureList = sfnt_get_ushort(sfont);
+ head->LookupList = sfnt_get_ushort(sfont);
+
+ return 10;
+}
+
+/*
+ * script -- langsys --> feature indices
+ * |
+ * +- langsys --> feature indices
+ *
+ * feature --> lookup indices
+ */
+
+struct otl_gsub_tab
+{
+ char *script;
+ char *language;
+ char *feature;
+
+ int num_subtables;
+ struct otl_gsub_subtab *subtables;
+};
+
+
+static int
+otl_gsub_read_feat (struct otl_gsub_tab *gsub, sfnt *sfont)
+{
+ long feat_idx, script_idx;
+ ULONG gsub_offset, offset;
+ struct otl_gsub_header head;
+ struct otl_gsub_subtab *subtab = NULL;
+ USHORT num_subtabs = 0;
+ unsigned char feat_bits[8192];
+ struct clt_record_list feature_list;
+ struct clt_record_list script_list;
+ struct clt_number_list lookup_list ;
+ otl_opt *script, *language, *feature;
+
+ ASSERT(gsub && sfont);
+
+ gsub_offset = sfnt_find_table_pos(sfont, "GSUB");
+ if (gsub_offset == 0)
+ return -1; /* not found */
+
+ script = otl_new_opt();
+ otl_parse_optstring(script, gsub->script);
+ language = otl_new_opt();
+ otl_parse_optstring(language, gsub->language);
+ feature = otl_new_opt();
+ otl_parse_optstring(feature, gsub->feature);
+
+ memset(feat_bits, 0, 8192);
+
+ /* GSUB header */
+ sfnt_seek_set(sfont, gsub_offset);
+ otl_gsub_read_header(&head, sfont);
+
+ /* Script */
+ offset = gsub_offset + head.ScriptList;
+ sfnt_seek_set(sfont, offset);
+ clt_read_record_list(&script_list, sfont);
+
+#define SET_BIT(b,p) do {\
+ (b)[(p)/8] |= (1<<(7-((p) % 8)));\
+} while (0)
+#define BIT_SET(b,p) (((b)[(p)/8]) & (1 << (7-((p)%8))))
+
+ for (script_idx = 0;
+ script_idx < script_list.count; script_idx++) {
+ if (otl_match_optrule(script,
+ script_list.record[script_idx].tag)) {
+ struct clt_script_table script_tab;
+ long langsys_idx;
+
+ offset = gsub_offset +
+ head.ScriptList + script_list.record[script_idx].offset;
+ sfnt_seek_set(sfont, offset);
+ clt_read_script_table(&script_tab, sfont);
+
+ if (otl_match_optrule(language, "dflt") &&
+ script_tab.DefaultLangSys != 0) {
+ struct clt_langsys_table langsys_tab;
+
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_gsub>> OTL script-language enabled: %c%c%c%c.dflt\n",
+ script_list.record[script_idx].tag[0],
+ script_list.record[script_idx].tag[1],
+ script_list.record[script_idx].tag[2],
+ script_list.record[script_idx].tag[3]);
+ }
+
+ sfnt_seek_set(sfont, offset + script_tab.DefaultLangSys);
+ clt_read_langsys_table(&langsys_tab, sfont);
+ if (otl_match_optrule(feature, "____") && /* _FIXME_ */
+ langsys_tab.ReqFeatureIndex != 0xFFFF)
+ SET_BIT(feat_bits, langsys_tab.ReqFeatureIndex);
+ for (feat_idx = 0;
+ feat_idx < langsys_tab.FeatureIndex.count;
+ feat_idx++) {
+ SET_BIT(feat_bits,
+ langsys_tab.FeatureIndex.value[feat_idx]);
+ }
+ clt_release_langsys_table(&langsys_tab);
+ }
+ for (langsys_idx = 0;
+ langsys_idx < script_tab.LangSysRecord.count;
+ langsys_idx++) {
+ struct clt_record *langsys_rec;
+
+ langsys_rec = &(script_tab.LangSysRecord.record[langsys_idx]);
+ if (otl_match_optrule(language, langsys_rec->tag)) {
+ struct clt_langsys_table langsys_tab;
+
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_gsub>> OTL script-language enabled: %c%c%c%c.%c%c%c%c\n",
+ script_list.record[script_idx].tag[0],
+ script_list.record[script_idx].tag[1],
+ script_list.record[script_idx].tag[2],
+ script_list.record[script_idx].tag[3],
+ langsys_rec->tag[0], langsys_rec->tag[1],
+ langsys_rec->tag[2], langsys_rec->tag[3]);
+ }
+
+ sfnt_seek_set(sfont, offset + langsys_rec->offset);
+ clt_read_langsys_table(&langsys_tab, sfont);
+ if (otl_match_optrule(feature, "____") || /* _FIXME_ */
+ langsys_tab.ReqFeatureIndex != 0xFFFF)
+ SET_BIT(feat_bits, langsys_tab.ReqFeatureIndex);
+ for (feat_idx = 0;
+ feat_idx < langsys_tab.FeatureIndex.count;
+ feat_idx++) {
+ SET_BIT(feat_bits,
+ langsys_tab.FeatureIndex.value[feat_idx]);
+ }
+ clt_release_langsys_table(&langsys_tab);
+ }
+ }
+ clt_release_script_table(&script_tab);
+ }
+ }
+
+ /* Feature List */
+ offset = gsub_offset + head.FeatureList;
+ sfnt_seek_set(sfont, offset);
+ clt_read_record_list(&feature_list, sfont);
+
+ /* Lookup List */
+ offset = gsub_offset + head.LookupList;
+ sfnt_seek_set(sfont, offset);
+ clt_read_number_list(&lookup_list, sfont);
+
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_gsub>> Reading OTL feature(s):");
+ }
+
+ for (feat_idx = 0;
+ feat_idx < feature_list.count; feat_idx++) {
+ if (BIT_SET(feat_bits, feat_idx) &&
+ (otl_match_optrule(feature,
+ feature_list.record[feat_idx].tag))) {
+ struct clt_feature_table feature_table;
+ long i;
+
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG(" %c%c%c%c",
+ feature_list.record[feat_idx].tag[0],
+ feature_list.record[feat_idx].tag[1],
+ feature_list.record[feat_idx].tag[2],
+ feature_list.record[feat_idx].tag[3]);
+ }
+
+ /* Feature Table */
+ offset = gsub_offset +
+ head.FeatureList + feature_list.record[feat_idx].offset;
+
+ sfnt_seek_set(sfont, offset);
+ clt_read_feature_table(&feature_table, sfont);
+ if (feature_table.FeatureParams != 0) {
+ ERROR("unrecognized FeatureParams");
+ }
+
+ /* Lookup table */
+ for (i = 0; i < feature_table.LookupListIndex.count; i++) {
+ struct clt_lookup_table lookup_table;
+ long ll_idx, st_idx, r, n_st;
+
+ ll_idx = feature_table.LookupListIndex.value[i];
+ if (ll_idx >= lookup_list.count)
+ ERROR("invalid Lookup index.");
+
+ offset = gsub_offset +
+ head.LookupList + (lookup_list.value)[ll_idx];
+ sfnt_seek_set(sfont, offset);
+ clt_read_lookup_table(&lookup_table, sfont);
+
+ if (lookup_table.LookupType != OTL_GSUB_TYPE_SINGLE &&
+ lookup_table.LookupType != OTL_GSUB_TYPE_ALTERNATE &&
+ lookup_table.LookupType != OTL_GSUB_TYPE_LIGATURE &&
+ lookup_table.LookupType != OTL_GSUB_TYPE_ESUBST) {
+ if (verbose > VERBOSE_LEVEL_MIN)
+ WARN("Skipping unsupported GSUB subtable: LookupType=%d", lookup_table.LookupType);
+ continue;
+ }
+
+ subtab = RENEW(subtab,
+ num_subtabs + lookup_table.SubTableList.count,
+ struct otl_gsub_subtab);
+ for (n_st = 0, st_idx = 0;
+ st_idx < lookup_table.SubTableList.count; st_idx++) {
+
+ offset = gsub_offset + head.LookupList +
+ lookup_list.value[ll_idx] +
+ (lookup_table.SubTableList.value)[st_idx];
+
+ sfnt_seek_set(sfont, offset);
+
+ switch ((int) lookup_table.LookupType) {
+ case OTL_GSUB_TYPE_SINGLE:
+ r = otl_gsub_read_single(&subtab[num_subtabs + n_st],
+ sfont);
+ if (r <= 0)
+ WARN("Reading GSUB subtable (single) failed...");
+ else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("(single)");
+ }
+ n_st++;
+ }
+ break;
+
+ case OTL_GSUB_TYPE_ALTERNATE:
+ r = otl_gsub_read_alternate(&subtab[num_subtabs + n_st],
+ sfont);
+ if (r <= 0)
+ WARN("Reading GSUB subtable (alternate) failed...");
+ else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("(alternate)");
+ }
+ n_st++;
+ }
+ break;
+
+ case OTL_GSUB_TYPE_LIGATURE:
+ r = otl_gsub_read_ligature(&subtab[num_subtabs + n_st],
+ sfont);
+ if (r <= 0)
+ WARN("Reading GSUB subtable (ligature) failed...");
+ else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("(ligature)");
+ }
+ n_st++;
+ }
+ break;
+
+ case OTL_GSUB_TYPE_ESUBST:
+ {
+ USHORT SubstFormat;
+ USHORT ExtensionLookupType;
+ ULONG ExtensionOffset;
+
+ SubstFormat = sfnt_get_ushort(sfont);
+ if (SubstFormat != 1)
+ break;
+ ExtensionLookupType = sfnt_get_ushort(sfont);
+ ExtensionOffset = sfnt_get_ulong (sfont);
+
+ sfnt_seek_set(sfont, offset + ExtensionOffset);
+ switch (ExtensionLookupType) {
+ case OTL_GSUB_TYPE_SINGLE:
+ r = otl_gsub_read_single(&subtab[num_subtabs + n_st],
+ sfont);
+ if (r <= 0)
+ WARN("Reading GSUB subtable (ext:single) failed...");
+ else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("(ext:single)");
+ }
+ n_st++;
+ }
+ break;
+
+ case OTL_GSUB_TYPE_ALTERNATE:
+ r = otl_gsub_read_alternate(&subtab[num_subtabs + n_st],
+ sfont);
+ if (r <= 0)
+ WARN("Reading GSUB subtable (alternate) failed...");
+ else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("(alternate)");
+ }
+ n_st++;
+ }
+ break;
+
+ case OTL_GSUB_TYPE_LIGATURE:
+ r = otl_gsub_read_ligature(&subtab[num_subtabs + n_st],
+ sfont);
+ if (r <= 0)
+ WARN("Reading GSUB subtable (ext:ligature) failed...");
+ else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("(ext:ligature)");
+ }
+ n_st++;
+ }
+ break;
+
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ num_subtabs += n_st; /* lookup_table.SubTableList.count; */
+ clt_release_lookup_table(&lookup_table);
+ }
+ clt_release_feature_table(&feature_table);
+ }
+ }
+
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("\n");
+ MESG("otl_gsub>> %ld subtable(s) read.\n", num_subtabs);
+ }
+
+ clt_release_number_list(&lookup_list);
+ clt_release_record_list(&feature_list);
+ clt_release_record_list(&script_list);
+
+ otl_release_opt(script);
+ otl_release_opt(language);
+ otl_release_opt(feature);
+
+ if (subtab != NULL) {
+ gsub->num_subtables = num_subtabs;
+ gsub->subtables = subtab;
+ } else {
+ return -1;
+ }
+
+ return 0;
+}
+
+
+static int
+otl_gsub_apply_single (struct otl_gsub_subtab *subtab, USHORT *gid)
+{
+ long idx;
+
+ ASSERT(subtab && gid);
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_single1 *data;
+
+ data = (subtab->table).single1;
+ idx = clt_lookup_coverage(&data->coverage, *gid);
+ if (idx >= 0) {
+ *gid += data->DeltaGlyphID;
+ return 0; /* found */
+ }
+ } else if (subtab->SubstFormat == 2) {
+ struct otl_gsub_single2 *data;
+
+ data = (subtab->table).single2;
+ idx = clt_lookup_coverage(&data->coverage, *gid);
+ if (idx >= 0 &&
+ idx < data->GlyphCount) {
+ *gid = (data->Substitute)[idx];
+ return 0; /* found */
+ }
+ }
+
+ return -1;
+}
+
+static int
+otl_gsub_apply_alternate (struct otl_gsub_subtab *subtab,
+ USHORT alt_idx, USHORT *gid)
+{
+ long idx;
+
+ ASSERT(subtab && gid);
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_alternate1 *data;
+
+ data = subtab->table.alternate1;
+ idx = clt_lookup_coverage(&data->coverage, *gid);
+ if (idx < 0 || idx >= data->AlternateSetCount)
+ return -1;
+ else {
+ struct otl_gsub_altset *altset;
+ altset = &(data->AlternateSet[idx]);
+ if (alt_idx >= altset->GlyphCount)
+ return -1;
+ else {
+ *gid = altset->Alternate[alt_idx];
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
+/* NOTE: Ligature table is in preference order */
+static int
+glyph_seq_cmp (GlyphID *glyph_seq0, USHORT n_glyphs0,
+ GlyphID *glyph_seq1, USHORT n_glyphs1)
+{
+ USHORT i;
+
+ if (n_glyphs0 != n_glyphs1)
+ return n_glyphs0 - n_glyphs1;
+
+ for (i = 0; i < n_glyphs0; i++) {
+ if (glyph_seq0[i] != glyph_seq1[i])
+ return glyph_seq0[i] - glyph_seq1[i];
+ }
+
+ return 0;
+}
+
+static int
+otl_gsub_apply_ligature (struct otl_gsub_subtab *subtab,
+ USHORT *gid_in, USHORT num_gids,
+ USHORT *gid_out)
+{
+ long idx;
+
+ ASSERT(subtab && gid_out);
+
+ if (!gid_in || num_gids < 1)
+ return -1;
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_ligature1 *data;
+
+ data = subtab->table.ligature1;
+ idx = clt_lookup_coverage(&data->coverage, gid_in[0]);
+ if (idx >= 0 && idx < data->LigSetCount) {
+ struct otl_gsub_ligset *ligset;
+ USHORT j;
+
+ ligset = &(data->LigatureSet[idx]);
+ for (j = 0; j < ligset->LigatureCount; j++) {
+ if (!glyph_seq_cmp(&gid_in[1], num_gids - 1,
+ ligset->Ligature[j].Component,
+ ligset->Ligature[j].CompCount - 1)) {
+ *gid_out = ligset->Ligature[j].LigGlyph;
+ return 0; /* found */
+ }
+ }
+ }
+ }
+
+ return -1;
+}
+
+#define GSUB_LIST_MAX 32
+struct otl_gsub
+{
+ int num_gsubs;
+ int select;
+ struct otl_gsub_tab gsubs[GSUB_LIST_MAX];
+};
+
+otl_gsub *
+otl_gsub_new (void)
+{
+ struct otl_gsub *gsub_list;
+
+ gsub_list = NEW(1, struct otl_gsub);
+ gsub_list->num_gsubs = 0;
+ gsub_list->select = -1;
+
+ return (otl_gsub *) gsub_list;
+}
+
+int
+otl_gsub_add_feat (otl_gsub *gsub_list,
+ const char *script,
+ const char *language,
+ const char *feature,
+ sfnt *sfont)
+{
+ int retval = -1;
+ int i;
+ struct otl_gsub_tab *gsub;
+
+ if (gsub_list->num_gsubs > GSUB_LIST_MAX) {
+ ERROR("Too many GSUB features...");
+ return -1;
+ }
+ for (i = 0; i < gsub_list->num_gsubs; i++) {
+ gsub = &(gsub_list->gsubs[i]);
+ if (!strcmp(script, gsub->script) &&
+ !strcmp(language, gsub->language) &&
+ !strcmp(feature, gsub->feature)) {
+ gsub_list->select = i;
+ return 0;
+ }
+ }
+ gsub = &gsub_list->gsubs[i];
+
+ gsub->script = NEW(strlen(script) +1, char);
+ strcpy(gsub->script, script);
+ gsub->language = NEW(strlen(language)+1, char);
+ strcpy(gsub->language, language);
+ gsub->feature = NEW(strlen(feature) +1, char);
+ strcpy(gsub->feature, feature);
+
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("\n");
+ MESG("otl_gsub>> Reading \"%s.%s.%s\"...\n", script, language, feature);
+ }
+
+ retval = otl_gsub_read_feat(gsub, sfont);
+ if (retval >= 0) {
+ gsub_list->select = i;
+ gsub_list->num_gsubs++;
+ } else {
+ if(verbose > VERBOSE_LEVEL_MIN) {
+ MESG("otl_gsub>> Failed\n");
+ }
+ RELEASE(gsub->script);
+ RELEASE(gsub->language);
+ RELEASE(gsub->feature);
+ }
+
+ return retval;
+}
+
+void
+otl_gsub_release (otl_gsub *gsub_list)
+{
+ struct otl_gsub_tab *gsub;
+ struct otl_gsub_subtab *subtab;
+ int i, j;
+
+ if (!gsub_list)
+ return;
+
+ for (i = 0; i < gsub_list->num_gsubs; i++) {
+ gsub = &(gsub_list->gsubs[i]);
+
+ if (gsub->script)
+ RELEASE(gsub->script);
+ if (gsub->language)
+ RELEASE(gsub->language);
+ if (gsub->feature)
+ RELEASE(gsub->feature);
+
+ for (j = 0; j < gsub->num_subtables; j++) {
+ subtab = &(gsub->subtables[j]);
+ switch ((int) subtab->LookupType) {
+ case OTL_GSUB_TYPE_SINGLE:
+ otl_gsub_release_single(subtab);
+ break;
+ case OTL_GSUB_TYPE_ALTERNATE:
+ otl_gsub_release_alternate(subtab);
+ break;
+ case OTL_GSUB_TYPE_LIGATURE:
+ otl_gsub_release_ligature(subtab);
+ break;
+ default:
+ ERROR("???");
+ break;
+ }
+ }
+ RELEASE(gsub->subtables);
+ }
+
+ RELEASE(gsub_list);
+}
+
+int
+otl_gsub_apply (otl_gsub *gsub_list, USHORT *gid)
+{
+ int retval = -1;
+ struct otl_gsub_tab *gsub;
+ struct otl_gsub_subtab *subtab;
+ int i, j;
+
+ if (!gsub_list || !gid)
+ return retval;
+
+ i = gsub_list->select;
+ if (i < 0 || i >= gsub_list->num_gsubs) {
+ ERROR("GSUB not selected...");
+ return -1;
+ }
+ gsub = &(gsub_list->gsubs[i]);
+
+ for (j = 0;
+ retval < 0 && j < gsub->num_subtables; j++) {
+ subtab = &(gsub->subtables[j]);
+ switch ((int) subtab->LookupType){
+ case OTL_GSUB_TYPE_SINGLE:
+ retval = otl_gsub_apply_single(subtab, gid);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return retval;
+}
+
+int
+otl_gsub_apply_alt (otl_gsub *gsub_list, USHORT alt_idx, USHORT *gid)
+{
+ int retval = -1;
+ struct otl_gsub_tab *gsub;
+ struct otl_gsub_subtab *subtab;
+ int i, j;
+
+ if (!gsub_list || !gid)
+ return retval;
+
+ i = gsub_list->select;
+ if (i < 0 || i >= gsub_list->num_gsubs) {
+ ERROR("GSUB not selected...");
+ return -1;
+ }
+ gsub = &(gsub_list->gsubs[i]);
+
+ for (j = 0;
+ retval < 0 && j < gsub->num_subtables; j++) {
+ subtab = &(gsub->subtables[j]);
+ switch ((int) subtab->LookupType){
+ case OTL_GSUB_TYPE_ALTERNATE:
+ retval = otl_gsub_apply_alternate(subtab, alt_idx, gid);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return retval;
+}
+
+int
+otl_gsub_apply_lig (otl_gsub *gsub_list,
+ USHORT *gid_in, USHORT num_gids, USHORT *gid_out)
+{
+ int retval = -1;
+ struct otl_gsub_tab *gsub;
+ struct otl_gsub_subtab *subtab;
+ int i, j;
+
+ if (!gsub_list || !gid_out)
+ return retval;
+
+ i = gsub_list->select;
+ if (i < 0 || i >= gsub_list->num_gsubs) {
+ ERROR("GSUB not selected...");
+ return -1;
+ }
+ gsub = &(gsub_list->gsubs[i]);
+
+ for (j = 0;
+ retval < 0 && j < gsub->num_subtables; j++) {
+ subtab = &(gsub->subtables[j]);
+ switch ((int) subtab->LookupType){
+ case OTL_GSUB_TYPE_LIGATURE:
+ retval = otl_gsub_apply_ligature(subtab,
+ gid_in, num_gids, gid_out);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return retval;
+}
+
+int
+otl_gsub_select (otl_gsub *gsub_list,
+ const char *script,
+ const char *language,
+ const char *feature)
+{
+ int i;
+ struct otl_gsub_tab *gsub;
+
+ for (i = 0; i < gsub_list->num_gsubs; i++) {
+ gsub = &(gsub_list->gsubs[i]);
+ if (!strcmp(gsub->script, script) &&
+ !strcmp(gsub->language, language) &&
+ !strcmp(gsub->feature, feature)) {
+ gsub_list->select = i;
+ return i;
+ }
+ }
+
+ gsub_list->select = -1;
+
+ return -1;
+}
+
+#if 0
+static int
+otl_gsub_dump_single (struct otl_gsub_subtab *subtab)
+{
+ long gid, idx;
+
+ ASSERT(subtab);
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_single1 *data;
+
+ 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));
+ }
+ }
+ } else if (subtab->SubstFormat == 2) {
+ struct otl_gsub_single2 *data;
+
+ 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]);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int
+otl_gsub_dump_alternate (struct otl_gsub_subtab *subtab)
+{
+ long gid, idx;
+
+ ASSERT(subtab);
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_alternate1 *data;
+
+ 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]);
+ }
+ fprintf(stdout, " ];\n");
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int
+otl_gsub_dump_ligature (struct otl_gsub_subtab *subtab)
+{
+ long gid, idx;
+
+ ASSERT(subtab);
+
+ if (subtab->SubstFormat == 1) {
+ struct otl_gsub_ligature1 *data;
+
+ 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]);
+ }
+ fprintf(stdout, " by \\%u;\n", ligset->Ligature[j].LigGlyph);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int
+otl_gsub_dump (otl_gsub *gsub_list,
+ const char *script, const char *language, const char *feature)
+{
+ int error = -1;
+ struct otl_gsub_tab *gsub;
+ struct otl_gsub_subtab *subtab;
+ int sel, i, j;
+
+ if (!gsub_list)
+ return -1;
+
+ 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]);
+
+ 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;
+ }
+ }
+ gsub_list->select = sel;
+
+ return error;
+}
+#endif
diff --git a/Build/source/texk/xdvipdfmx/src/tt_gsub.h b/Build/source/texk/xdvipdfmx/src/tt_gsub.h
new file mode 100644
index 00000000000..2c2d3a43a4e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_gsub.h
@@ -0,0 +1,67 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_gsub.h,v 1.9 2005/06/27 09:04:52 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TT_GSUB_H_
+#define _TT_GSUB_H_
+
+#include "sfnt.h"
+#include "otl_opt.h"
+
+extern void otl_gsub_set_verbose (void);
+
+typedef struct otl_gsub otl_gsub;
+
+/* LookupType for GSUB */
+#define OTL_GSUB_TYPE_SINGLE 1
+#define OTL_GSUB_TYPE_MULTIPLE 2
+#define OTL_GSUB_TYPE_ALTERNATE 3
+#define OTL_GSUB_TYPE_LIGATURE 4
+#define OTL_GSUB_TYPE_CONTEXT 5
+#define OTL_GSUB_TYPE_CCONTEXT 6
+#define OTL_GSUB_TYPE_ESUBST 7
+
+extern otl_gsub *otl_gsub_new (void);
+extern void otl_gsub_release (otl_gsub *gsub_list);
+
+extern int otl_gsub_select (otl_gsub *gsub_list,
+ const char *script,
+ const char *language,
+ const char *feature);
+extern int otl_gsub_add_feat (otl_gsub *gsub_list,
+ const char *script,
+ const char *language,
+ const char *feature,
+ sfnt *sfont);
+extern int otl_gsub_apply (otl_gsub *gsub_list, USHORT *gid);
+extern int otl_gsub_apply_alt (otl_gsub *gsub_list, USHORT alt_idx, USHORT *gid);
+extern int otl_gsub_apply_lig (otl_gsub *gsub_list,
+ USHORT *gid_in, USHORT num_gids,
+ USHORT *gid_out);
+
+#if 0
+extern int otl_gsub_dump (otl_gsub *gsub_list,
+ const char *script,
+ const char *language,
+ const char *feature);
+#endif
+
+#endif /* _TT_GSUB_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tt_post.c b/Build/source/texk/xdvipdfmx/src/tt_post.c
new file mode 100644
index 00000000000..5a2b513e156
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_post.c
@@ -0,0 +1,265 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_post.c,v 1.2 2004/09/11 15:23:48 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxfile.h"
+
+#include "sfnt.h"
+
+#include "tt_post.h"
+
+static const char *const macglyphorder[258];
+
+/* offset from begenning of the post table */
+#define NAME_STR_OFFSET 32
+
+static int
+read_v2_post_names (struct tt_post_table *post, sfnt *sfont)
+{
+ USHORT i, idx, *indices;
+ int len;
+
+ post->numberOfGlyphs = sfnt_get_ushort(sfont);
+
+ indices = NEW(post->numberOfGlyphs, USHORT);
+ post->count = 0;
+ for (i = 0;
+ i < post->numberOfGlyphs; i++) {
+ idx = sfnt_get_ushort(sfont);
+ if (idx >= 258) {
+ if (idx > 32767) {
+ /* although this is strictly speaking out of spec, it seems to work
+ and there are real-life fonts that use it */
+ static char warning_issued = 0;
+ if (!warning_issued) {
+ WARN("TrueType post table name index %u > 32767", idx);
+ warning_issued = 1;
+ }
+ /* don't zero the index - we assume it's valid */
+ /* idx = 0; */
+ }
+ post->count++;
+ }
+ indices[i] = idx;
+ }
+
+ if (post->count < 1) {
+ post->names = NULL;
+ } else {
+ post->names = NEW(post->count, char *);
+ for (i = 0; i < post->count; i++) { /* read Pascal strings */
+ len = sfnt_get_byte(sfont);
+ if (len > 0) {
+ post->names[i] = NEW(len + 1, char);
+ sfnt_read((unsigned char*)(post->names[i]), len, sfont);
+ post->names[i][len] = 0;
+ } else {
+ post->names[i] = NULL;
+ }
+ }
+ }
+
+ post->glyphNamePtr = NEW(post->numberOfGlyphs, char *);
+ for (i = 0; i < post->numberOfGlyphs; i++) {
+ idx = indices[i];
+ if (idx < 258) {
+ post->glyphNamePtr[i] = (char *) macglyphorder[idx];
+ } else if (idx - 258 < post->count) {
+ post->glyphNamePtr[i] = post->names[idx - 258];
+ } else {
+ WARN("Invalid glyph name index number: %u (>= %u)",
+ idx, post->count + 258);
+ RELEASE(indices);
+ return -1;
+ }
+ }
+ RELEASE(indices);
+
+ return 0;
+}
+
+struct tt_post_table *
+tt_read_post_table (sfnt *sfont)
+{
+ struct tt_post_table *post;
+ ULONG offset;
+
+ offset = sfnt_locate_table(sfont, "post");
+
+ post = NEW(1, struct tt_post_table);
+
+ post->Version = sfnt_get_ulong(sfont); /* Fixed */
+ post->italicAngle = sfnt_get_ulong(sfont); /* Fixed */
+ post->underlinePosition = sfnt_get_short(sfont); /* FWord */
+ post->underlineThickness = sfnt_get_short(sfont); /* FWord */
+ post->isFixedPitch = sfnt_get_ulong(sfont);
+ post->minMemType42 = sfnt_get_ulong(sfont);
+ post->maxMemType42 = sfnt_get_ulong(sfont);
+ post->minMemType1 = sfnt_get_ulong(sfont);
+ post->maxMemType1 = sfnt_get_ulong(sfont);
+
+ post->numberOfGlyphs = 0;
+ post->glyphNamePtr = NULL;
+ post->count = 0;
+ post->names = NULL;
+
+ if (post->Version == 0x00010000UL) {
+ post->numberOfGlyphs = 258; /* wrong */
+ post->glyphNamePtr = (char **) macglyphorder;
+ post->count = 0;
+ post->names = NULL;
+ } else if (post->Version == 0x00025000UL) {
+ WARN("TrueType 'post' version 2.5 found (deprecated)");
+ post->numberOfGlyphs = 0; /* wrong */
+ post->glyphNamePtr = NULL;
+ post->count = 0;
+ post->names = NULL;
+ } else if (post->Version == 0x00020000UL) {
+ if (read_v2_post_names(post, sfont) < 0) {
+ WARN("Invalid TrueType 'post' table...");
+ tt_release_post_table(post);
+ post = NULL;
+ }
+ } else if (post->Version == 0x00030000UL) {
+ post->numberOfGlyphs = 0; /* wrong */
+ post->glyphNamePtr = NULL;
+ post->count = 0;
+ post->names = NULL;
+ } else {
+ WARN("Unknown 'post' version: %08X", post->Version);
+ tt_release_post_table(post);
+ post = NULL;
+ }
+
+ return post;
+}
+
+USHORT
+tt_lookup_post_table (struct tt_post_table *post, const char *glyphname)
+{
+ USHORT gid;
+
+ ASSERT(post && glyphname);
+
+ for (gid = 0; gid < post->count; gid++) {
+ if (post->glyphNamePtr[gid] &&
+ !strcmp(glyphname, post->glyphNamePtr[gid])) {
+ return gid;
+ }
+ }
+
+ return 0;
+}
+
+void
+tt_release_post_table (struct tt_post_table *post)
+{
+ USHORT i;
+
+ ASSERT(post);
+
+ if (post->glyphNamePtr)
+ RELEASE(post->glyphNamePtr);
+ if (post->names) {
+ for (i = 0; i < post->count; i++) {
+ if (post->names[i])
+ RELEASE(post->names[i]);
+ }
+ RELEASE(post->names);
+ }
+ post->count = 0;
+ post->glyphNamePtr = NULL;
+ post->names = NULL;
+
+ RELEASE(post);
+
+ return;
+}
+
+/* Macintosh glyph order - from apple's TTRefMan */
+static const char *const
+macglyphorder[258] = {
+ /* 0x0000 */
+ ".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl",
+ "numbersign", "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus", "comma",
+ /* 0x0010 */
+ "hyphen", "period", "slash", "zero", "one", "two", "three", "four",
+ "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less",
+ /* 0x0020 */
+ "equal", "greater", "question", "at", "A", "B", "C", "D",
+ "E", "F", "G", "H", "I", "J", "K", "L",
+ /* 0x0030 */
+ "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
+ "Y", "Z", "bracketleft", "backslash",
+ /* 0x0040 */
+ "bracketright", "asciicircum", "underscore", "grave",
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
+ /* 0x0050 */
+ "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
+ "y", "z", "braceleft", "bar",
+ /* 0x0060 */
+ "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla",
+ "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave",
+ "acircumflex", "adieresis", "atilde", "aring", "ccedilla",
+ /* 0x0070 */
+ "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave",
+ "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex",
+ "odieresis", "otilde", "uacute", "ugrave",
+ /* 0x0080 */
+ "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling",
+ "section", "bullet", "paragraph", "germandbls", "registered",
+ "copyright", "trademark", "acute", "dieresis", "notequal",
+ /* 0x0090 */
+ "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+ "yen", "mu", "partialdiff", "summation", "product", "pi", "integral",
+ "ordfeminine", "ordmasculine", "Omega",
+ /* 0x00a0 */
+ "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical",
+ "florin", "approxequal", "Delta", "guillemotleft", "guillemotright",
+ "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde",
+ /* 0x00b0 */
+ "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright",
+ "quoteleft", "quoteright", "divide", "lozenge", "ydieresis",
+ "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright",
+ /* 0x00c0 */
+ "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase",
+ "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute",
+ "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave",
+ /* 0x00d0 */
+ "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex",
+ "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve",
+ "dotaccent", "ring", "cedilla", "hungarumlaut",
+ /* 0x00e0 */
+ "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron",
+ "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", "Thorn",
+ "thorn", "minus",
+ /* 0x00f0 */
+ "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+ "onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent",
+ "Scedilla", "scedilla", "Cacute", "cacute", "Ccaron",
+ /* 0x0100 */
+ "ccaron", "dcroat"
+};
diff --git a/Build/source/texk/xdvipdfmx/src/tt_post.h b/Build/source/texk/xdvipdfmx/src/tt_post.h
new file mode 100644
index 00000000000..4a9884524e9
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_post.h
@@ -0,0 +1,53 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_post.h,v 1.1 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TT_POST_H_
+#define _TT_POST_H_
+
+#include "sfnt.h"
+
+struct tt_post_table
+{
+ Fixed Version;
+ Fixed italicAngle;
+ FWord underlinePosition;
+ FWord underlineThickness;
+ ULONG isFixedPitch;
+ ULONG minMemType42;
+ ULONG maxMemType42;
+ ULONG minMemType1;
+ ULONG maxMemType1;
+
+ USHORT numberOfGlyphs;
+
+ char **glyphNamePtr; /* Glyph names (pointer to C string) */
+ char **names; /* Non-standard glyph names */
+
+ USHORT count; /* Number of glyph names in names[] */
+};
+
+extern struct tt_post_table *tt_read_post_table (sfnt *sfont);
+extern void tt_release_post_table (struct tt_post_table *post);
+
+extern USHORT tt_lookup_post_table (struct tt_post_table *post, const char *glyphname);
+
+#endif /* _TT_POST_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/tt_table.c b/Build/source/texk/xdvipdfmx/src/tt_table.c
new file mode 100644
index 00000000000..e76f0554d3f
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_table.c
@@ -0,0 +1,479 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_table.c,v 1.7 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#include <stdio.h>
+
+#include "system.h"
+#include "error.h"
+#include "mem.h"
+#include "mfileio.h"
+
+#include "sfnt.h"
+#include "tt_table.h"
+
+/*
+ tables contains information refered by other tables
+ maxp->numGlyphs, etc --> loca, etc
+ hhea->numberOfHMetrics --> hmtx
+ head->indexToLocFormat --> loca
+ head->glyphDataFormat --> glyf
+*/
+
+char *tt_pack_head_table (struct tt_head_table *table)
+{
+ int i;
+ char *p, *data;
+
+ if (table == NULL)
+ ERROR("passed NULL pointer\n");
+
+ p = data = NEW(TT_HEAD_TABLE_SIZE, char);
+ p += sfnt_put_ulong(p, table->version);
+ p += sfnt_put_ulong(p, table->fontRevision);
+ p += sfnt_put_ulong(p, table->checkSumAdjustment);
+ p += sfnt_put_ulong(p, table->magicNumber);
+ p += sfnt_put_ushort(p, table->flags);
+ p += sfnt_put_ushort(p, table->unitsPerEm);
+ for (i=0; i<8; i++) {
+ *(p++) = (table->created)[i];
+ }
+ for (i=0; i<8; i++) {
+ *(p++) = (table->modified)[i];
+ }
+ p += sfnt_put_short(p, table->xMin);
+ p += sfnt_put_short(p, table->yMin);
+ p += sfnt_put_short(p, table->xMax);
+ p += sfnt_put_short(p, table->yMax);
+ p += sfnt_put_ushort(p, table->macStyle);
+ p += sfnt_put_ushort(p, table->lowestRecPPEM);
+ p += sfnt_put_short(p, table->fontDirectionHint);
+ p += sfnt_put_short(p, table->indexToLocFormat);
+ p += sfnt_put_short(p, table->glyphDataFormat);
+
+ return data;
+}
+
+struct tt_head_table *tt_read_head_table (sfnt *sfont)
+{
+ int i;
+ struct tt_head_table *table = NULL;
+
+ table = NEW(1, struct tt_head_table);
+
+ sfnt_locate_table(sfont, "head");
+
+ table->version = sfnt_get_ulong(sfont);
+ table->fontRevision = sfnt_get_ulong(sfont);
+ table->checkSumAdjustment = sfnt_get_ulong(sfont);
+ table->magicNumber = sfnt_get_ulong(sfont);
+ table->flags = sfnt_get_ushort(sfont);
+ table->unitsPerEm = sfnt_get_ushort(sfont);
+ for (i=0; i<8; i++) {
+ (table->created)[i] = sfnt_get_byte (sfont);
+ }
+ for (i=0; i<8; i++) {
+ (table->modified)[i] = sfnt_get_byte (sfont);
+ }
+ table->xMin = sfnt_get_short(sfont);
+ table->yMin = sfnt_get_short(sfont);
+ table->xMax = sfnt_get_short(sfont);
+ table->yMax = sfnt_get_short(sfont);
+ table->macStyle = sfnt_get_short(sfont);
+ table->lowestRecPPEM = sfnt_get_short(sfont);
+ table->fontDirectionHint = sfnt_get_short(sfont);
+ table->indexToLocFormat = sfnt_get_short(sfont);
+ table->glyphDataFormat = sfnt_get_short(sfont);
+
+ return table;
+}
+
+char *tt_pack_maxp_table (struct tt_maxp_table *table)
+{
+ char *p, *data;
+
+ p = data = NEW(TT_MAXP_TABLE_SIZE, char);
+ p += sfnt_put_ulong(p, table->version);
+ p += sfnt_put_ushort(p, table->numGlyphs);
+ p += sfnt_put_ushort(p, table->maxPoints);
+ p += sfnt_put_ushort(p, table->maxContours);
+ p += sfnt_put_ushort(p, table->maxComponentPoints);
+ p += sfnt_put_ushort(p, table->maxComponentContours);
+ p += sfnt_put_ushort(p, table->maxZones);
+ p += sfnt_put_ushort(p, table->maxTwilightPoints);
+ p += sfnt_put_ushort(p, table->maxStorage);
+ p += sfnt_put_ushort(p, table->maxFunctionDefs);
+ p += sfnt_put_ushort(p, table->maxInstructionDefs);
+ p += sfnt_put_ushort(p, table->maxStackElements);
+ p += sfnt_put_ushort(p, table->maxSizeOfInstructions);
+ p += sfnt_put_ushort(p, table->maxComponentElements);
+ p += sfnt_put_ushort(p, table->maxComponentDepth);
+
+ return data;
+}
+
+struct tt_maxp_table *tt_read_maxp_table (sfnt *sfont)
+{
+ struct tt_maxp_table *table = NULL;
+
+ table = NEW(1, struct tt_maxp_table);
+
+ sfnt_locate_table(sfont, "maxp");
+ table->version = sfnt_get_ulong(sfont);
+ table->numGlyphs = sfnt_get_ushort(sfont);
+ table->maxPoints = sfnt_get_ushort(sfont);
+ table->maxContours = sfnt_get_ushort(sfont);
+ table->maxComponentPoints = sfnt_get_ushort(sfont);
+ table->maxComponentContours = sfnt_get_ushort(sfont);
+ table->maxZones = sfnt_get_ushort(sfont);
+ table->maxTwilightPoints = sfnt_get_ushort(sfont);
+ table->maxStorage = sfnt_get_ushort(sfont);
+ table->maxFunctionDefs = sfnt_get_ushort(sfont);
+ table->maxInstructionDefs = sfnt_get_ushort(sfont);
+ table->maxStackElements = sfnt_get_ushort(sfont);
+ table->maxSizeOfInstructions = sfnt_get_ushort(sfont);
+ table->maxComponentElements = sfnt_get_ushort(sfont);
+ table->maxComponentDepth = sfnt_get_ushort(sfont);
+
+ return table;
+}
+
+char *tt_pack_hhea_table (struct tt_hhea_table *table)
+{
+ int i;
+ char *p, *data;
+
+ p = data = NEW(TT_HHEA_TABLE_SIZE, char);
+ p += sfnt_put_ulong(p, table->version);
+ p += sfnt_put_short(p, table->Ascender);
+ p += sfnt_put_short(p, table->Descender);
+ p += sfnt_put_short(p, table->LineGap);
+ p += sfnt_put_ushort(p, table->advanceWidthMax);
+ p += sfnt_put_short(p, table->minLeftSideBearing);
+ p += sfnt_put_short(p, table->minRightSideBearing);
+ p += sfnt_put_short(p, table->xMaxExtent);
+ p += sfnt_put_short(p, table->caretSlopeRise);
+ p += sfnt_put_short(p, table->caretSlopeRun);
+ for (i = 0; i < 5; i++) {
+ p += sfnt_put_short(p, table->reserved[i]);
+ }
+ p += sfnt_put_short(p, table->metricDataFormat);
+ p += sfnt_put_ushort(p, table->numberOfHMetrics);
+
+ return data;
+}
+
+struct tt_hhea_table *
+tt_read_hhea_table (sfnt *sfont)
+{
+ int i;
+ struct tt_hhea_table *table = NULL;
+
+ table = NEW(1, struct tt_hhea_table);
+
+ sfnt_locate_table(sfont, "hhea");
+ table->version = sfnt_get_ulong(sfont);
+ table->Ascender = sfnt_get_short (sfont);
+ table->Descender = sfnt_get_short(sfont);
+ table->LineGap = sfnt_get_short(sfont);
+ table->advanceWidthMax = sfnt_get_ushort(sfont);
+ table->minLeftSideBearing = sfnt_get_short(sfont);
+ table->minRightSideBearing = sfnt_get_short(sfont);
+ table->xMaxExtent = sfnt_get_short(sfont);
+ table->caretSlopeRise = sfnt_get_short(sfont);
+ table->caretSlopeRun = sfnt_get_short(sfont);
+ for(i = 0; i < 5; i++) {
+ table->reserved[i] = sfnt_get_short(sfont);
+ }
+ table->metricDataFormat = sfnt_get_short(sfont);
+ if (table->metricDataFormat != 0)
+ ERROR("unknown metricDaraFormat");
+ table->numberOfHMetrics = sfnt_get_ushort(sfont);
+
+ return table;
+}
+
+/* vhea */
+char *
+tt_pack_vhea_table (struct tt_vhea_table *table)
+{
+ int i;
+ char *p, *data;
+
+ p = data = NEW(TT_VHEA_TABLE_SIZE, char);
+ p += sfnt_put_ulong(p, table->version);
+ p += sfnt_put_short(p, table->vertTypoAscender);
+ p += sfnt_put_short(p, table->vertTypoDescender);
+ p += sfnt_put_short(p, table->vertTypoLineGap);
+ p += sfnt_put_short(p, table->advanceHeightMax); /* ushort ? */
+ p += sfnt_put_short(p, table->minTopSideBearing);
+ p += sfnt_put_short(p, table->minBottomSideBearing);
+ p += sfnt_put_short(p, table->yMaxExtent);
+ p += sfnt_put_short(p, table->caretSlopeRise);
+ p += sfnt_put_short(p, table->caretSlopeRun);
+ p += sfnt_put_short(p, table->caretOffset);
+ for(i = 0; i < 5; i++) {
+ p += sfnt_put_short(p, table->reserved[i]);
+ }
+ p += sfnt_put_ushort(p, table->numOfLongVerMetrics);
+
+ return data;
+}
+
+struct tt_vhea_table *tt_read_vhea_table (sfnt *sfont)
+{
+ int i;
+ struct tt_vhea_table *table = NULL;
+
+ table = NEW(1, struct tt_vhea_table);
+
+ sfnt_locate_table(sfont, "vhea");
+ table->version = sfnt_get_ulong(sfont);
+ table->vertTypoAscender = sfnt_get_short (sfont);
+ table->vertTypoDescender = sfnt_get_short(sfont);
+ table->vertTypoLineGap = sfnt_get_short(sfont);
+ table->advanceHeightMax = sfnt_get_short(sfont); /* ushort ? */
+ table->minTopSideBearing = sfnt_get_short(sfont);
+ table->minBottomSideBearing = sfnt_get_short(sfont);
+ table->yMaxExtent = sfnt_get_short(sfont);
+ table->caretSlopeRise = sfnt_get_short(sfont);
+ table->caretSlopeRun = sfnt_get_short(sfont);
+ table->caretOffset = sfnt_get_short(sfont);
+ for(i=0;i<5;i++) {
+ (table->reserved)[i] = sfnt_get_short(sfont);
+ }
+ table->numOfLongVerMetrics = sfnt_get_ushort(sfont);
+
+ return table;
+}
+
+
+struct tt_VORG_table *
+tt_read_VORG_table (sfnt *sfont)
+{
+ struct tt_VORG_table *vorg;
+ ULONG offset;
+ USHORT i;
+
+ offset = sfnt_find_table_pos(sfont, "VORG");
+
+ if (offset > 0) {
+ vorg = NEW(1, struct tt_VORG_table);
+
+ sfnt_locate_table(sfont, "VORG");
+ if (sfnt_get_ushort(sfont) != 1 ||
+ sfnt_get_ushort(sfont) != 0)
+ ERROR("Unsupported VORG version.");
+
+ vorg->defaultVertOriginY = sfnt_get_short(sfont);
+ vorg->numVertOriginYMetrics = sfnt_get_ushort(sfont);
+ vorg->vertOriginYMetrics = NEW(vorg->numVertOriginYMetrics,
+ struct tt_vertOriginYMetrics);
+ /*
+ * The vertOriginYMetrics array must be sorted in increasing
+ * glyphIndex order.
+ */
+ for (i = 0;
+ i < vorg->numVertOriginYMetrics; i++) {
+ vorg->vertOriginYMetrics[i].glyphIndex = sfnt_get_ushort(sfont);
+ vorg->vertOriginYMetrics[i].vertOriginY = sfnt_get_short(sfont);
+ }
+ } else {
+ vorg = NULL;
+ }
+
+ return vorg;
+}
+
+/*
+ * hmtx and vmtx
+ *
+ * Reading/writing hmtx and vmtx depend on other tables, maxp and hhea/vhea.
+ */
+
+struct tt_longMetrics *
+tt_read_longMetrics (sfnt *sfont, USHORT numGlyphs, USHORT numLongMetrics)
+{
+ struct tt_longMetrics *m;
+ USHORT gid, last_adv = 0;
+
+ m = NEW(numGlyphs, struct tt_longMetrics);
+ for (gid = 0; gid < numGlyphs; gid++) {
+ if (gid < numLongMetrics)
+ last_adv = sfnt_get_ushort(sfont);
+ m[gid].sideBearing = sfnt_get_short(sfont);
+ m[gid].advance = last_adv;
+ }
+
+ return m;
+}
+
+/* OS/2 table */
+/* this table may not exist */
+struct tt_os2__table *
+tt_read_os2__table (sfnt *sfont)
+{
+ struct tt_os2__table *table = NULL;
+ int i;
+
+ if (sfnt_find_table_pos(sfont, "OS/2") == 0)
+ return NULL;
+
+ sfnt_locate_table(sfont, "OS/2");
+
+ table = NEW(1, struct tt_os2__table);
+
+ table->version = sfnt_get_ushort(sfont);
+ table->xAvgCharWidth = sfnt_get_short(sfont);
+ table->usWeightClass = sfnt_get_ushort(sfont);
+ table->usWidthClass = sfnt_get_ushort(sfont);
+ table->fsType = sfnt_get_short(sfont);
+ table->ySubscriptXSize = sfnt_get_short(sfont);
+ table->ySubscriptYSize = sfnt_get_short(sfont);
+ table->ySubscriptXOffset = sfnt_get_short(sfont);
+ table->ySubscriptYOffset = sfnt_get_short(sfont);
+ table->ySuperscriptXSize = sfnt_get_short(sfont);
+ table->ySuperscriptYSize = sfnt_get_short(sfont);
+ table->ySuperscriptXOffset = sfnt_get_short(sfont);
+ table->ySuperscriptYOffset = sfnt_get_short(sfont);
+ table->yStrikeoutSize = sfnt_get_short(sfont);
+ table->yStrikeoutPosition = sfnt_get_short(sfont);
+ table->sFamilyClass = sfnt_get_short(sfont);
+ for (i = 0; i < 10; i++) {
+ table->panose[i] = sfnt_get_byte(sfont);
+ }
+ table->ulUnicodeRange1 = sfnt_get_ulong(sfont);
+ table->ulUnicodeRange2 = sfnt_get_ulong(sfont);
+ table->ulUnicodeRange3 = sfnt_get_ulong(sfont);
+ table->ulUnicodeRange4 = sfnt_get_ulong(sfont);
+ for (i = 0; i < 4; i++) {
+ table->achVendID[i] = sfnt_get_char(sfont);
+ }
+ table->fsSelection = sfnt_get_ushort(sfont);
+ table->usFirstCharIndex = sfnt_get_ushort(sfont);
+ table->usLastCharIndex = sfnt_get_ushort(sfont);
+ table->sTypoAscender = sfnt_get_short(sfont);
+ table->sTypoDescender = sfnt_get_short(sfont);
+ table->sTypoLineGap = sfnt_get_short(sfont);
+ table->usWinAscent = sfnt_get_ushort(sfont);
+ table->usWinDescent = sfnt_get_ushort(sfont);
+ table->ulCodePageRange1 = sfnt_get_ulong(sfont);
+ table->ulCodePageRange2 = sfnt_get_ulong(sfont);
+ if (table->version == 0x0002) {
+ table->sxHeight = sfnt_get_short(sfont);
+ table->sCapHeight = sfnt_get_short(sfont);
+ table->usDefaultChar = sfnt_get_ushort(sfont);
+ table->usBreakChar = sfnt_get_ushort(sfont);
+ table->usMaxContext = sfnt_get_ushort(sfont);
+ }
+
+ return table;
+}
+
+USHORT
+tt_get_name (sfnt *sfont, char *dest, USHORT destlen,
+ USHORT plat_id, USHORT enco_id,
+ USHORT lang_id, USHORT name_id)
+{
+ USHORT length = 0;
+ USHORT num_names, string_offset;
+ ULONG name_offset;
+ int i;
+
+ name_offset = sfnt_locate_table (sfont, "name");
+
+ if (sfnt_get_ushort(sfont))
+ ERROR ("Expecting zero");
+
+ num_names = sfnt_get_ushort(sfont);
+ string_offset = sfnt_get_ushort(sfont);
+ for (i=0;i<num_names;i++) {
+ USHORT p_id, e_id, n_id, l_id;
+ USHORT offset;
+
+ p_id = sfnt_get_ushort(sfont);
+ e_id = sfnt_get_ushort(sfont);
+ l_id = sfnt_get_ushort(sfont);
+ n_id = sfnt_get_ushort(sfont);
+ length = sfnt_get_ushort(sfont);
+ offset = sfnt_get_ushort(sfont);
+ /* language ID value 0xffffu for `accept any language ID' */
+ if ((p_id == plat_id) && (e_id == enco_id) &&
+ (lang_id == 0xffffu || l_id == lang_id) && (n_id == name_id)) {
+ if (length > destlen - 1) {
+ fprintf(stderr, "\n** Notice: Name string too long. Truncating **\n");
+ length = destlen - 1;
+ }
+ sfnt_seek_set (sfont, name_offset+string_offset+offset);
+ sfnt_read((unsigned char*)dest, length, sfont);
+ dest[length] = '\0';
+ break;
+ }
+ }
+ if (i == num_names) {
+ length = 0;
+ }
+
+ return length;
+}
+
+USHORT
+tt_get_ps_fontname (sfnt *sfont, char *dest, USHORT destlen)
+{
+ USHORT namelen = 0;
+
+#ifdef XETEX
+
+ const char* name = FT_Get_Postscript_Name(sfont->ft_face);
+ namelen = strlen(name);
+ if (namelen > destlen - 1) {
+ strncpy(dest, name, destlen - 1);
+ dest[destlen] = 0;
+ }
+ else
+ strcpy(dest, name);
+
+#else
+
+ /* First try Mac-Roman PS name and then Win-Unicode PS name */
+ if ((namelen = tt_get_name(sfont, dest, destlen, 1, 0, 0, 6)) != 0 ||
+ (namelen = tt_get_name(sfont, dest, destlen, 3, 1, 0x409u, 6)) != 0 ||
+ (namelen = tt_get_name(sfont, dest, destlen, 3, 5, 0x412u, 6)) != 0)
+ return namelen;
+
+ fprintf(stderr, "\n** Warning: No valid PostScript name available **\n");
+ /*
+ Wrokaround for some bad TTfonts:
+ Language ID value 0xffffu for `accept any language ID'
+ */
+ if ((namelen = tt_get_name(sfont, dest, destlen, 1, 0, 0xffffu, 6)) == 0) {
+ /*
+ Finally falling back to Mac Roman name field.
+ Warning: Some bad Japanese TTfonts using SJIS encoded string in the
+ Mac Roman name field.
+ */
+ namelen = tt_get_name(sfont, dest, destlen, 1, 0, 0, 1);
+ }
+
+#endif
+
+ return namelen;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/tt_table.h b/Build/source/texk/xdvipdfmx/src/tt_table.h
new file mode 100644
index 00000000000..6bc73ca6808
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/tt_table.h
@@ -0,0 +1,193 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/tt_table.h,v 1.6 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TT_TABLE_H_
+#define _TT_TABLE_H_
+
+#include "sfnt.h"
+
+#define TT_HEAD_TABLE_SIZE 54UL
+#define TT_MAXP_TABLE_SIZE 32UL
+#define TT_HHEA_TABLE_SIZE 36UL
+#define TT_VHEA_TABLE_SIZE 36UL
+
+struct tt_head_table
+{
+ Fixed version;
+ Fixed fontRevision;
+ ULONG checkSumAdjustment;
+ ULONG magicNumber;
+ USHORT flags;
+ USHORT unitsPerEm;
+ BYTE created[8];
+ BYTE modified[8];
+ FWord xMin, yMin, xMax, yMax;
+ USHORT macStyle;
+ USHORT lowestRecPPEM;
+ SHORT fontDirectionHint;
+ SHORT indexToLocFormat;
+ SHORT glyphDataFormat;
+};
+
+struct tt_hhea_table
+{
+ Fixed version;
+ FWord Ascender;
+ FWord Descender;
+ FWord LineGap;
+ uFWord advanceWidthMax;
+ FWord minLeftSideBearing;
+ FWord minRightSideBearing;
+ FWord xMaxExtent;
+ SHORT caretSlopeRise;
+ SHORT caretSlopeRun;
+ SHORT reserved[5]; /* set to 0 */
+ SHORT metricDataFormat;
+ USHORT numberOfHMetrics;
+};
+
+struct tt_vhea_table
+{
+ Fixed version;
+ SHORT vertTypoAscender; /* v.1.1 name */
+ SHORT vertTypoDescender; /* v.1.1 name */
+ SHORT vertTypoLineGap; /* v.1.1 name */
+ SHORT advanceHeightMax;
+ SHORT minTopSideBearing;
+ SHORT minBottomSideBearing;
+ SHORT yMaxExtent;
+ SHORT caretSlopeRise;
+ SHORT caretSlopeRun;
+ SHORT caretOffset;
+ SHORT reserved[5]; /* set to 0 */
+ USHORT numOfLongVerMetrics;
+};
+
+struct tt_maxp_table
+{
+ Fixed version;
+ USHORT numGlyphs;
+ USHORT maxPoints;
+ USHORT maxContours;
+ USHORT maxComponentPoints;
+ USHORT maxComponentContours;
+ USHORT maxZones;
+ USHORT maxTwilightPoints;
+ USHORT maxStorage;
+ USHORT maxFunctionDefs;
+ USHORT maxInstructionDefs;
+ USHORT maxStackElements;
+ USHORT maxSizeOfInstructions;
+ USHORT maxComponentElements;
+ USHORT maxComponentDepth;
+};
+
+struct tt_os2__table
+{
+ USHORT version; /* 0x0001 or 0x0002 */
+ SHORT xAvgCharWidth;
+ USHORT usWeightClass;
+ USHORT usWidthClass;
+ SHORT fsType; /* if (faType & 0x08) editable_embedding */
+ SHORT ySubscriptXSize;
+ SHORT ySubscriptYSize;
+ SHORT ySubscriptXOffset;
+ SHORT ySubscriptYOffset;
+ SHORT ySuperscriptXSize;
+ SHORT ySuperscriptYSize;
+ SHORT ySuperscriptXOffset;
+ SHORT ySuperscriptYOffset;
+ SHORT yStrikeoutSize;
+ SHORT yStrikeoutPosition;
+ SHORT sFamilyClass;
+ BYTE panose[10];
+ ULONG ulUnicodeRange1;
+ ULONG ulUnicodeRange2;
+ ULONG ulUnicodeRange3;
+ ULONG ulUnicodeRange4;
+ CHAR achVendID[4];
+ USHORT fsSelection;
+ USHORT usFirstCharIndex;
+ USHORT usLastCharIndex;
+ SHORT sTypoAscender; /* TTF spec. from MS is wrong */
+ SHORT sTypoDescender; /* TTF spec. from MS is wrong */
+ SHORT sTypoLineGap; /* TTF spec. from MS is wrong */
+ USHORT usWinAscent;
+ USHORT usWinDescent;
+ ULONG ulCodePageRange1;
+ ULONG ulCodePageRange2;
+ /* version 0x0002 */
+ SHORT sxHeight;
+ SHORT sCapHeight;
+ USHORT usDefaultChar;
+ USHORT usBreakChar;
+ USHORT usMaxContext;
+};
+
+struct tt_vertOriginYMetrics {
+ USHORT glyphIndex;
+ SHORT vertOriginY;
+};
+
+struct tt_VORG_table {
+ SHORT defaultVertOriginY;
+ USHORT numVertOriginYMetrics;
+ struct tt_vertOriginYMetrics *vertOriginYMetrics;
+};
+
+/* hmtx and vmtx */
+struct tt_longMetrics
+{
+ USHORT advance;
+ SHORT sideBearing;
+};
+
+
+/* head, hhea, maxp */
+extern char *tt_pack_head_table (struct tt_head_table *table);
+extern struct tt_head_table *tt_read_head_table (sfnt *sfont);
+extern char *tt_pack_hhea_table (struct tt_hhea_table *table);
+extern struct tt_hhea_table *tt_read_hhea_table (sfnt *sfont);
+extern char *tt_pack_maxp_table (struct tt_maxp_table *table);
+extern struct tt_maxp_table *tt_read_maxp_table (sfnt *sfont);
+
+/* vhea */
+extern char *tt_pack_vhea_table (struct tt_vhea_table *table);
+extern struct tt_vhea_table *tt_read_vhea_table (sfnt *sfont);
+
+/* VORG */
+extern struct tt_VORG_table *tt_read_VORG_table (sfnt *sfont);
+
+/* hmtx and vmtx */
+extern struct tt_longMetrics *tt_read_longMetrics (sfnt *sfont,
+ USHORT numGlyphs, USHORT numLongMetrics);
+
+/* OS/2 table */
+extern struct tt_os2__table *tt_read_os2__table (sfnt *sfont);
+
+/* name table */
+extern USHORT tt_get_name (sfnt *sfont, char *dest, USHORT destlen,
+ USHORT plat_id, USHORT enco_id,
+ USHORT lang_id, USHORT name_id);
+extern USHORT tt_get_ps_fontname (sfnt *sfont, char *dest, USHORT destlen);
+
+#endif /* _TT_TABLE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/type0.c b/Build/source/texk/xdvipdfmx/src/type0.c
new file mode 100644
index 00000000000..bb1b12f135b
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/type0.c
@@ -0,0 +1,685 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/type0.c,v 1.23 2005/06/27 09:04:53 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * Type0 font support:
+ *
+ * TODO:
+ *
+ * Composite font (multiple descendants) - not supported in PDF
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxfile.h"
+
+#include "pdfobj.h"
+#include "fontmap.h"
+
+#include "cmap.h"
+#include "cid.h"
+
+#include "type0.h"
+
+
+#define TYPE0FONT_DEBUG_STR "Type0"
+#define TYPE0FONT_DEBUG 3
+
+static int __verbose = 0;
+
+static pdf_obj *pdf_read_ToUnicode_file (const char *cmap_name);
+
+void
+Type0Font_set_verbose(void)
+{
+ __verbose++;
+}
+
+/*
+ * used_chars:
+ *
+ * Single bit is used for each CIDs since used_chars can be reused as a
+ * stream content of CIDSet by doing so. See, cid.h for add_to_used() and
+ * is_used().
+ */
+
+static char *
+new_used_chars2(void)
+{
+ char *used_chars;
+
+ used_chars = NEW(8192, char);
+ memset(used_chars, 0, 8192);
+
+ return used_chars;
+}
+
+#define FLAG_NONE 0
+#define FLAG_USED_CHARS_SHARED (1 << 0)
+
+struct Type0Font {
+ char *fontname; /* BaseFont */
+ char *encoding; /* "Identity-H" or "Identity-V" (not ID) */
+ char *used_chars; /* Used chars (CIDs) */
+
+ /*
+ * Type0 only
+ */
+ CIDFont *descendant; /* Only single descendant is allowed. */
+ int flags;
+ int wmode;
+
+ /*
+ * PDF Font Resource
+ */
+ pdf_obj *indirect;
+ pdf_obj *fontdict;
+ pdf_obj *descriptor; /* MUST BE NULL */
+};
+
+static void
+Type0Font_init_font_struct (Type0Font *font)
+{
+ ASSERT(font);
+
+ font->fontname = NULL;
+ font->fontdict = NULL;
+ font->indirect = NULL;
+ font->descriptor = NULL;
+ font->encoding = NULL;
+ font->used_chars = NULL;
+ font->descendant = NULL;
+ font->wmode = -1;
+ font->flags = FLAG_NONE;
+
+ return;
+}
+
+static void
+Type0Font_clean (Type0Font *font)
+{
+ if (font) {
+ if (font->fontdict)
+ ERROR("%s: Object not flushed.", TYPE0FONT_DEBUG_STR);
+ if (font->indirect)
+ ERROR("%s: Object not flushed.", TYPE0FONT_DEBUG_STR);
+ if (font->descriptor)
+ ERROR("%s: FontDescriptor unexpected for Type0 font.", TYPE0FONT_DEBUG_STR);
+ if (!(font->flags & FLAG_USED_CHARS_SHARED) && font->used_chars)
+ RELEASE(font->used_chars);
+ if (font->encoding)
+ RELEASE(font->encoding);
+ if (font->fontname)
+ RELEASE(font->fontname);
+ font->fontdict = NULL;
+ font->indirect = NULL;
+ font->descriptor = NULL;
+ font->used_chars = NULL;
+ font->encoding = NULL;
+ font->fontname = NULL;
+ }
+}
+
+/* PLEASE FIX THIS */
+#include "tt_cmap.h"
+
+static void
+add_ToUnicode (Type0Font *font)
+{
+ pdf_obj *tounicode;
+ CIDFont *cidfont;
+ CIDSysInfo *csi;
+ char *cmap_name, *fontname;
+
+ /*
+ * ToUnicode CMap:
+ *
+ * ToUnicode CMaps are usually not required for standard character
+ * collections such as Adobe-Japan1. Identity-H is used for UCS
+ * ordering CID-keyed fonts. External resource must be loaded for
+ * others.
+ */
+
+ cidfont = font->descendant;
+ if (!cidfont) {
+ ERROR("%s: No descendant CID-keyed font.", TYPE0FONT_DEBUG_STR);
+ return;
+ }
+
+ if (CIDFont_is_ACCFont(cidfont)) {
+ /* No need to embed ToUnicode */
+ return;
+ } else if (CIDFont_is_UCSFont(cidfont)) {
+ /*
+ * Old version of dvipdfmx mistakenly used Adobe-Identity as Unicode.
+ */
+ tounicode = pdf_read_ToUnicode_file("Adobe-Identity-UCS2");
+ if (!tounicode) { /* This should work */
+ tounicode = pdf_new_name("Identity-H");
+ }
+ pdf_add_dict(font->fontdict, pdf_new_name("ToUnicode"), tounicode);
+ return;
+ }
+
+ tounicode = NULL;
+ csi = CIDFont_get_CIDSysInfo(cidfont);
+ fontname = CIDFont_get_fontname(cidfont);
+ if (CIDFont_get_embedding(cidfont)) {
+ fontname += 7; /* FIXME */
+ }
+
+ if (!strcmp(csi->registry, "Adobe") &&
+ !strcmp(csi->ordering, "Identity")) {
+ switch (CIDFont_get_subtype(cidfont)) {
+ case CIDFONT_TYPE2:
+ /* PLEASE FIX THIS */
+ tounicode = otf_create_ToUnicode_stream(CIDFont_get_ident(cidfont),
+ CIDFont_get_opt_index(cidfont),
+ CIDFont_get_ft_face(cidfont),
+ Type0Font_get_usedchars(font));
+ break;
+ default:
+ if (CIDFont_get_flag(cidfont, CIDFONT_FLAG_TYPE1C)) { /* FIXME */
+ tounicode = otf_create_ToUnicode_stream(CIDFont_get_ident(cidfont),
+ CIDFont_get_opt_index(cidfont),
+ CIDFont_get_ft_face(cidfont),
+ Type0Font_get_usedchars(font));
+ } else if (CIDFont_get_flag(cidfont, CIDFONT_FLAG_TYPE1)) { /* FIXME */
+ /* Font loader will create ToUnicode and set. */
+ return;
+ } else {
+ cmap_name = NEW(strlen(fontname) + 7, char);
+ sprintf(cmap_name, "%s-UTF16", fontname);
+ tounicode = pdf_read_ToUnicode_file(cmap_name);
+ if (!tounicode) {
+ sprintf(cmap_name, "%s-UCS2", fontname);
+ tounicode = pdf_read_ToUnicode_file(cmap_name);
+ }
+ RELEASE(cmap_name);
+ }
+ break;
+ }
+ } else {
+ cmap_name = NEW(strlen(csi->registry)+strlen(csi->ordering)+8, char);
+ sprintf(cmap_name, "%s-%s-UTF16", csi->registry, csi->ordering);
+ tounicode = pdf_read_ToUnicode_file(cmap_name);
+ if (!tounicode) {
+ sprintf(cmap_name, "%s-%s-UCS2", csi->registry, csi->ordering);
+ tounicode = pdf_read_ToUnicode_file(cmap_name);
+ }
+ RELEASE(cmap_name);
+ }
+
+ if (tounicode) {
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("ToUnicode"), tounicode);
+ } else {
+ WARN("Failed to load ToUnicode CMap for font \"%s\"", fontname);
+ }
+
+ return;
+}
+
+void
+Type0Font_set_ToUnicode (Type0Font *font, pdf_obj *cmap_ref)
+{
+ ASSERT(font);
+
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("ToUnicode"), cmap_ref);
+}
+
+static void
+Type0Font_dofont (Type0Font *font)
+{
+ if (!font || !font->indirect)
+ return;
+
+ if (!pdf_lookup_dict(font->fontdict, "ToUnicode")) { /* FIXME */
+ add_ToUnicode(font);
+ }
+}
+
+static void
+Type0Font_flush (Type0Font *font)
+{
+ if (font) {
+ if (font->fontdict)
+ pdf_release_obj(font->fontdict);
+ font->fontdict = NULL;
+ if (font->indirect)
+ pdf_release_obj(font->indirect);
+ font->indirect = NULL;
+ if (font->descriptor)
+ ERROR("%s: FontDescriptor unexpected for Type0 font.", TYPE0FONT_DEBUG_STR);
+ font->descriptor = NULL;
+ }
+}
+
+int
+Type0Font_get_wmode (Type0Font *font)
+{
+ ASSERT(font);
+
+ return font->wmode;
+}
+
+char *
+Type0Font_get_encoding (Type0Font *font)
+{
+ ASSERT(font);
+
+ return font->encoding;
+}
+
+char *
+Type0Font_get_usedchars (Type0Font *font)
+{
+ ASSERT(font);
+
+ return font->used_chars;
+}
+
+pdf_obj *
+Type0Font_get_resource (Type0Font *font)
+{
+ ASSERT(font);
+
+ /*
+ * This looks somewhat strange.
+ */
+ if (!font->indirect) {
+ pdf_obj *array;
+
+ array = pdf_new_array();
+ pdf_add_array(array, CIDFont_get_resource(font->descendant));
+ pdf_add_dict(font->fontdict, pdf_new_name("DescendantFonts"), array);
+ font->indirect = pdf_ref_obj(font->fontdict);
+ }
+
+ return pdf_link_obj(font->indirect);
+}
+
+/******************************** CACHE ********************************/
+
+#define CHECK_ID(n) do {\
+ if ((n) < 0 || (n) >= __cache.count)\
+ ERROR("%s: Invalid ID %d", TYPE0FONT_DEBUG_STR, (n));\
+} while (0)
+
+#define CACHE_ALLOC_SIZE 16u
+
+static struct font_cache {
+ int count;
+ int capacity;
+ Type0Font *fonts;
+} __cache = {
+ 0, 0, NULL
+};
+
+void
+Type0Font_cache_init (void)
+{
+ if (__cache.fonts)
+ ERROR("%s: Already initialized.", TYPE0FONT_DEBUG_STR);
+ __cache.count = 0;
+ __cache.capacity = 0;
+ __cache.fonts = NULL;
+}
+
+Type0Font *
+Type0Font_cache_get (int id)
+{
+ CHECK_ID(id);
+
+ return &__cache.fonts[id];
+}
+
+#ifdef XETEX
+unsigned short*
+Type0Font_get_ft_to_gid(int id)
+{
+ return CIDFont_get_ft_to_gid(Type0Font_cache_get(id)->descendant);
+}
+#endif
+
+int
+Type0Font_cache_find (const char *map_name, int cmap_id, fontmap_opt *fmap_opt)
+{
+ int font_id = -1;
+ Type0Font *font;
+ CIDFont *cidfont;
+ CMap *cmap;
+ CIDSysInfo *csi;
+ char *fontname = NULL;
+ int cid_id = -1, parent_id = -1, wmode = 0;
+ int pdf_ver;
+
+ pdf_ver = pdf_get_version();
+ if (!map_name || cmap_id < 0 || pdf_ver < 2)
+ return -1;
+
+ /*
+ * Encoding is Identity-H or Identity-V according as thier WMode value.
+ *
+ * We do not use match against the map_name since fonts (TrueType) covers
+ * characters across multiple character collection (eg, Adobe-Japan1 and
+ * Adobe-Japan2) must be splited into multiple CID-keyed fonts.
+ */
+
+ cmap = CMap_cache_get(cmap_id);
+ csi = (CMap_is_Identity(cmap)) ? NULL : CMap_get_CIDSysInfo(cmap) ;
+
+ cid_id = CIDFont_cache_find(map_name, csi, fmap_opt);
+
+ if (cid_id < 0)
+ return -1;
+
+ /*
+ * The descendant CID-keyed font has already been registerd.
+ * If CID-keyed font with ID = cid_id is new font, then create new parent
+ * Type 0 font. Otherwise, there already exists parent Type 0 font and
+ * then we find him and return his ID. We must check against their WMode.
+ */
+
+ cidfont = CIDFont_cache_get(cid_id);
+ wmode = CMap_get_wmode(cmap);
+
+ /* Does CID-keyed font already have parent ? */
+ parent_id = CIDFont_get_parent_id(cidfont, wmode);
+ if (parent_id >= 0)
+ return parent_id; /* If so, we don't need new one. */
+
+ /*
+ * CIDFont does not have parent or his parent's WMode does not matched with
+ * wmode. Create new Type0 font.
+ */
+
+ if (__cache.count >= __cache.capacity) {
+ __cache.capacity += CACHE_ALLOC_SIZE;
+ __cache.fonts = RENEW(__cache.fonts, __cache.capacity, struct Type0Font);
+ }
+ font_id = __cache.count;
+ font = &__cache.fonts[font_id];
+
+ Type0Font_init_font_struct(font);
+
+ /*
+ * All CJK double-byte characters are mapped so that resulting
+ * character codes coincide with CIDs of given character collection.
+ * So, the Encoding is always Identity-H for horizontal fonts or
+ * Identity-V for vertical fonts.
+ */
+ if (wmode) {
+ font->encoding = NEW(strlen("Identity-V")+1, char);
+ strcpy(font->encoding, "Identity-V");
+ } else {
+ font->encoding = NEW(strlen("Identity-H")+1, char);
+ strcpy(font->encoding, "Identity-H");
+ }
+ font->wmode = wmode;
+
+ /*
+ * Now we start font dictionary.
+ */
+ font->fontdict = pdf_new_dict();
+ pdf_add_dict(font->fontdict, pdf_new_name ("Type"), pdf_new_name ("Font"));
+ pdf_add_dict(font->fontdict, pdf_new_name ("Subtype"), pdf_new_name ("Type0"));
+
+ /*
+ * Type0 font does not have FontDescriptor because it is not a simple font.
+ * Instead, DescendantFonts appears here.
+ *
+ * Up to PDF version 1.5, Type0 font must have single descendant font which
+ * is a CID-keyed font. Future PDF spec. will allow multiple desecendant
+ * fonts.
+ */
+ font->descendant = cidfont;
+ CIDFont_attach_parent(cidfont, font_id, wmode);
+
+ /*
+ * PostScript Font name:
+ *
+ * Type0 font's fontname is usually descendant CID-keyed font's font name
+ * appended by -ENCODING.
+ */
+ fontname = CIDFont_get_fontname(cidfont);
+
+ if (__verbose) {
+ if (CIDFont_get_embedding(cidfont) && strlen(fontname) > 7)
+ MESG("(CID:%s)", fontname+7); /* skip XXXXXX+ */
+ else
+ MESG("(CID:%s)", fontname);
+ }
+
+ /*
+ * The difference between CID-keyed font and TrueType font appears here.
+ *
+ * Glyph substitution for vertical writing is done in CMap mapping process
+ * for CID-keyed fonts. But we must rely on OpenType layout table in the
+ * case of TrueType fonts. So, we must use different used_chars for each
+ * horizontal and vertical fonts in that case.
+ *
+ * In most PDF file, encoding name is not appended to fontname for Type0
+ * fonts having CIDFontType 2 font as their descendant.
+ */
+
+ font->used_chars = NULL;
+ font->flags = FLAG_NONE;
+
+ switch (CIDFont_get_subtype(cidfont)) {
+ case CIDFONT_TYPE0:
+ font->fontname = NEW(strlen(fontname)+strlen(font->encoding)+2, char);
+ sprintf(font->fontname, "%s-%s", fontname, font->encoding);
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("BaseFont"), pdf_new_name(font->fontname));
+ /*
+ * Need used_chars to write W, W2.
+ */
+ if ((parent_id = CIDFont_get_parent_id(cidfont, wmode ? 0 : 1)) < 0)
+ font->used_chars = new_used_chars2();
+ else {
+ /* Don't allocate new one. */
+ font->used_chars = Type0Font_get_usedchars(Type0Font_cache_get(parent_id));
+ font->flags |= FLAG_USED_CHARS_SHARED;
+ }
+ break;
+ case CIDFONT_TYPE2:
+ /*
+ * TrueType:
+ *
+ * Use different used_chars for H and V.
+ */
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("BaseFont"), pdf_new_name(fontname));
+ font->used_chars = new_used_chars2();
+ break;
+ default:
+ ERROR("Unrecognized CIDFont Type");
+ break;
+ }
+
+ pdf_add_dict(font->fontdict,
+ pdf_new_name("Encoding"), pdf_new_name(font->encoding));
+
+ __cache.count++;
+
+ return font_id;
+}
+
+void
+Type0Font_cache_close (void)
+{
+ int font_id;
+
+ /*
+ * This need to be fixed.
+ *
+ * CIDFont_cache_close() before Type0Font_release because of used_chars.
+ * ToUnicode support want descendant CIDFont's CSI and fontname.
+ */
+ if (__cache.fonts) {
+ for (font_id = 0; font_id < __cache.count; font_id++)
+ Type0Font_dofont(&__cache.fonts[font_id]);
+ }
+ CIDFont_cache_close();
+ if (__cache.fonts) {
+ for (font_id = 0; font_id < __cache.count; font_id++) {
+ Type0Font_flush(&__cache.fonts[font_id]);
+ Type0Font_clean(&__cache.fonts[font_id]);
+ }
+ RELEASE(__cache.fonts);
+ }
+ __cache.fonts = NULL;
+ __cache.count = 0;
+ __cache.capacity = 0;
+}
+
+
+/************************************************************************/
+
+int
+pdf_font_findfont0 (const char *font_name, int cmap_id, fontmap_opt *fmap_opt)
+{
+ return Type0Font_cache_find(font_name, cmap_id, fmap_opt);
+}
+
+/******************************** COMPAT ********************************/
+
+#ifndef WITHOUT_COMPAT
+
+#include "cmap_read.h"
+#include "cmap_write.h"
+#include "pdfresource.h"
+#include "pdfencoding.h"
+
+static pdf_obj *
+create_dummy_CMap (void)
+{
+ pdf_obj *stream;
+ char buf[32];
+ int i, n;
+
+#define CMAP_PART0 "\
+%!PS-Adobe-3.0 Resource-CMap\n\
+%%DocumentNeededResources: ProcSet (CIDInit)\n\
+%%IncludeResource: ProcSet (CIDInit)\n\
+%%BeginResource: CMap (Adobe-Identity-UCS2)\n\
+%%Title: (Adobe-Identity-UCS2 Adobe UCS2 0)\n\
+%%Version: 1.0\n\
+%%Copyright:\n\
+%% ---\n\
+%%EndComments\n\n\
+"
+#define CMAP_PART1 "\
+/CIDInit /ProcSet findresource begin\n\
+\n\
+12 dict begin\n\nbegincmap\n\n\
+/CIDSystemInfo 3 dict dup begin\n\
+ /Registry (Adobe) def\n\
+ /Ordering (UCS2) def\n\
+ /Supplement 0 def\n\
+end def\n\n\
+/CMapName /Adobe-Identity-UCS2 def\n\
+/CMapVersion 1.0 def\n\
+/CMapType 2 def\n\n\
+2 begincodespacerange\n\
+<0000> <FFFF>\n\
+endcodespacerange\n\
+"
+#define CMAP_PART3 "\
+endcmap\n\n\
+CMapName currentdict /CMap defineresource pop\n\n\
+end\nend\n\n\
+%%EndResource\n\
+%%EOF\n\
+"
+
+ stream = pdf_new_stream(STREAM_COMPRESS);
+ pdf_add_stream(stream, CMAP_PART0, strlen(CMAP_PART0));
+ pdf_add_stream(stream, CMAP_PART1, strlen(CMAP_PART1));
+ pdf_add_stream(stream, "\n100 beginbfrange\n", strlen("\n100 beginbfrange\n"));
+ for (i = 0; i < 0x64; i++) {
+ n = sprintf(buf,
+ "<%02X00> <%02XFF> <%02X00>\n", i, i, i);
+ pdf_add_stream(stream, buf, n);
+ }
+ pdf_add_stream(stream, "endbfrange\n\n", strlen("endbfrange\n\n"));
+
+ pdf_add_stream(stream, "\n100 beginbfrange\n", strlen("\n100 beginbfrange\n"));
+ for (i = 0x64; i < 0xc8; i++) {
+ n = sprintf(buf,
+ "<%02X00> <%02XFF> <%02X00>\n", i, i, i);
+ pdf_add_stream(stream, buf, n);
+ }
+ pdf_add_stream(stream, "endbfrange\n\n", strlen("endbfrange\n\n"));
+
+ pdf_add_stream(stream, "\n48 beginbfrange\n", strlen("\n48 beginbfrange\n"));
+ for (i = 0xc8; i <= 0xd7; i++) {
+ n = sprintf(buf,
+ "<%02X00> <%02XFF> <%02X00>\n", i, i, i);
+ pdf_add_stream(stream, buf, n);
+ }
+ for (i = 0xe0; i <= 0xff; i++) {
+ n = sprintf(buf,
+ "<%02X00> <%02XFF> <%02X00>\n", i, i, i);
+ pdf_add_stream(stream, buf, n);
+ }
+ pdf_add_stream(stream, "endbfrange\n\n", strlen("endbfrange\n\n"));
+
+ pdf_add_stream(stream, CMAP_PART3, strlen(CMAP_PART3));
+
+ return stream;
+}
+
+static pdf_obj *
+pdf_read_ToUnicode_file (const char *cmap_name)
+{
+ pdf_obj *stream;
+ long res_id = -1;
+
+ ASSERT(cmap_name);
+
+ res_id = pdf_findresource("CMap", cmap_name);
+ if (res_id < 0) {
+ if (!strcmp(cmap_name, "Adobe-Identity-UCS2"))
+ stream = create_dummy_CMap();
+ else {
+ stream = pdf_load_ToUnicode_stream(cmap_name);
+ }
+ if (stream) {
+ res_id = pdf_defineresource("CMap",
+ cmap_name,
+ stream, PDF_RES_FLUSH_IMMEDIATE);
+ }
+ }
+
+ return (res_id < 0 ? NULL : pdf_get_resource_reference(res_id));
+}
+#endif /* !WITHOUT_COMPAT */
diff --git a/Build/source/texk/xdvipdfmx/src/type0.h b/Build/source/texk/xdvipdfmx/src/type0.h
new file mode 100644
index 00000000000..c3999ecd977
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/type0.h
@@ -0,0 +1,56 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/type0.h,v 1.12 2004/09/05 13:30:06 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TYPE0_H_
+#define _TYPE0_H_
+
+#include "pdfobj.h"
+
+#define add_to_used_chars2(b,c) {(b)[(c)/8] |= (1 << (7-((c)%8)));}
+#define is_used_char2(b,c) (((b)[(c)/8]) & (1 << (7-((c)%8))))
+
+typedef struct Type0Font Type0Font;
+
+extern void Type0Font_set_verbose (void);
+
+extern int Type0Font_get_wmode (Type0Font *font);
+extern char *Type0Font_get_encoding (Type0Font *font);
+extern char *Type0Font_get_usedchars (Type0Font *font);
+
+extern pdf_obj *Type0Font_get_resource (Type0Font *font);
+
+extern void Type0Font_set_ToUnicode (Type0Font *font, pdf_obj *cmap_ref);
+
+#include "fontmap.h"
+extern int pdf_font_findfont0 (const char *font_name,
+ int cmap_id, fontmap_opt *fmap_opt);
+
+extern unsigned short *Type0Font_get_ft_to_gid(int id);
+
+/******************************** CACHE ********************************/
+
+extern void Type0Font_cache_init (void);
+extern Type0Font *Type0Font_cache_get (int id);
+extern int Type0Font_cache_find (const char *map_name, int cmap_id, fontmap_opt *fmap_opt);
+extern void Type0Font_cache_close (void);
+
+#endif /* _TYPE0_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/type1.c b/Build/source/texk/xdvipdfmx/src/type1.c
new file mode 100644
index 00000000000..e896508210e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/type1.c
@@ -0,0 +1,811 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/type1.c,v 1.38 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <math.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+
+#include "numbers.h"
+
+#include "pdfobj.h"
+#include "pdffont.h"
+
+#include "pdfencoding.h"
+#include "unicode.h"
+
+#include "dpxutil.h"
+
+#include "pst_obj.h"
+#include "pst.h"
+
+#include "cff_limits.h"
+#include "cff_types.h"
+#include "cff_dict.h"
+#include "cff.h"
+
+#include "t1_load.h"
+#include "t1_char.h"
+
+#include "type1.h"
+
+#define FONT_FLAG_FIXEDPITCH (1 << 0) /* Fixed-width font */
+#define FONT_FLAG_SERIF (1 << 1) /* Serif font */
+#define FONT_FLAG_SYMBOLIC (1 << 2) /* Symbolic font */
+#define FONT_FLAG_SCRIPT (1 << 3) /* Script font */
+#define FONT_FLAG_STANDARD (1 << 5) /* Adobe Standard Character Set */
+#define FONT_FLAG_ITALIC (1 << 6) /* Italic */
+#define FONT_FLAG_ALLCAP (1 << 16) /* All-cap font */
+#define FONT_FLAG_SMALLCAP (1 << 17) /* Small-cap font */
+#define FONT_FLAG_FORCEBOLD (1 << 18) /* Force bold at small text sizes */
+
+static int
+is_basefont (const char *name)
+{
+ static const char *basefonts[] = {
+ "Courier", "Courier-Bold", "Courier-Oblique",
+ "Courier-BoldOblique", "Helvetica", "Helvetica-Bold",
+ "Helvetica-Oblique", "Helvetica-BoldOblique", "Symbol",
+ "Times-Roman", "Times-Bold", "Times-Italic",
+ "Times-BoldItalic", "ZapfDingbats"
+ };
+ int i;
+
+ for (i = 0; i < 14; i++) {
+ if (!strcmp(name, basefonts[i]))
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+pdf_font_open_type1 (pdf_font *font)
+{
+ char *ident;
+ FILE *fp;
+ char fontname[PDF_NAME_LEN_MAX+1];
+
+ ASSERT(font);
+
+ ident = pdf_font_get_ident(font);
+
+ if (is_basefont(ident)) {
+ pdf_font_set_fontname(font, ident);
+ pdf_font_set_subtype (font, PDF_FONT_FONTTYPE_TYPE1);
+ pdf_font_set_flags (font,
+ (PDF_FONT_FLAG_NOEMBED|PDF_FONT_FLAG_BASEFONT));
+ } else {
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_T1FONT);
+ if (!fp)
+ return -1;
+
+ memset(fontname, 0, PDF_NAME_LEN_MAX+1);
+ if (!is_pfb(fp) || t1_get_fontname(fp, fontname) < 0) {
+ ERROR("Failed to read Type 1 font \"%s\".", ident);
+ }
+ DPXFCLOSE(fp);
+
+ pdf_font_set_fontname(font, fontname);
+ pdf_font_set_subtype (font, PDF_FONT_FONTTYPE_TYPE1);
+ }
+
+ return 0;
+}
+
+static void
+get_font_attr (pdf_font *font, cff_font *cffont)
+{
+ char *fontname;
+ pdf_obj *descriptor;
+ double capheight, ascent, descent;
+ double italicangle, stemv;
+ double defaultwidth, nominalwidth;
+ long flags = 0, gid, i;
+ static const char *L_c[] = {
+ "H", "P", "Pi", "Rho", NULL
+ };
+ static const char *L_d[] = {
+ "p", "q", "mu", "eta", NULL
+ };
+ static const char *L_a[] = {
+ "b", "h", "lambda", NULL
+ };
+ t1_ginfo gm;
+
+ defaultwidth = 500.0;
+ nominalwidth = 0.0;
+
+ /*
+ * CapHeight, Ascent, and Descent is meaningfull only for Latin/Greek/Cyrillic.
+ * The BlueValues and OtherBlues also have those information.
+ */
+ if (cff_dict_known(cffont->topdict, "FontBBox")) {
+ /* Default values */
+ capheight = ascent = cff_dict_get(cffont->topdict, "FontBBox", 3);
+ descent = cff_dict_get(cffont->topdict, "FontBBox", 1);
+ } else {
+ capheight = 680.0;
+ ascent = 690.0;
+ descent = -190.0;
+ }
+ if (cff_dict_known(cffont->private[0], "StdVW")) {
+ stemv = cff_dict_get(cffont->private[0], "StdVW", 0);
+ } else {
+ /*
+ * We may use the following values for StemV:
+ * Thin - ExtraLight: <= 50
+ * Light: 71
+ * Regular(Normal): 88
+ * Medium: 109
+ * SemiBold(DemiBold): 135
+ * Bold - Heavy: >= 166
+ */
+ stemv = 88.0;
+ }
+ if (cff_dict_known(cffont->topdict, "ItalicAngle")) {
+ italicangle = cff_dict_get(cffont->topdict, "ItalicAngle", 0);
+ if (italicangle != 0.0)
+ flags |= FONT_FLAG_ITALIC;
+ } else {
+ italicangle = 0.0;
+ }
+
+ /*
+ * Use "space", "H", "p", and "b" for various values.
+ * Those characters should not "seac". (no accent)
+ */
+ gid = cff_glyph_lookup(cffont, "space");
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ defaultwidth = gm.wx;
+ }
+
+ for (i = 0; L_c[i] != NULL; i++) {
+ gid = cff_glyph_lookup(cffont, L_c[i]);
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ capheight = gm.bbox.ury;
+ break;
+ }
+ }
+
+ for (i = 0; L_d[i] != NULL; i++) {
+ gid = cff_glyph_lookup(cffont, L_d[i]);
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ descent = gm.bbox.lly;
+ break;
+ }
+ }
+
+ for (i = 0; L_a[i] != NULL; i++) {
+ gid = cff_glyph_lookup(cffont, L_a[i]);
+ if (gid >= 0 && gid < cffont->cstrings->count) {
+ t1char_get_metrics(cffont->cstrings->data + cffont->cstrings->offset[gid] - 1,
+ cffont->cstrings->offset[gid+1] - cffont->cstrings->offset[gid],
+ cffont->subrs[0], &gm);
+ ascent = gm.bbox.ury;
+ break;
+ }
+ }
+
+ if (defaultwidth != 0.0) {
+ cff_dict_add(cffont->private[0], "defaultWidthX", 1);
+ cff_dict_set(cffont->private[0], "defaultWidthX", 0, defaultwidth);
+ }
+ if (nominalwidth != 0.0) {
+ cff_dict_add(cffont->private[0], "nominalWidthX", 1);
+ cff_dict_set(cffont->private[0], "nominalWidthX", 0, nominalwidth);
+ }
+ if (cff_dict_known(cffont->private[0], "ForceBold") &&
+ cff_dict_get(cffont->private[0], "ForceBold", 0)) {
+ flags |= FONT_FLAG_FORCEBOLD;
+ }
+ if (cff_dict_known(cffont->private[0], "IsFixedPitch") &&
+ cff_dict_get(cffont->private[0], "IsFixedPitch", 0)) {
+ flags |= FONT_FLAG_FIXEDPITCH;
+ }
+
+ fontname = pdf_font_get_fontname (font);
+ descriptor = pdf_font_get_descriptor(font);
+
+ if (fontname && !strstr(fontname, "Sans")) {
+ flags |= FONT_FLAG_SERIF;
+ }
+ if (fontname && strstr(fontname, "Caps")) {
+ flags |= FONT_FLAG_SMALLCAP;
+ }
+ flags |= FONT_FLAG_SYMBOLIC; /* FIXME */
+
+ pdf_add_dict(descriptor,
+ pdf_new_name("CapHeight"), pdf_new_number(capheight));
+ pdf_add_dict(descriptor,
+ pdf_new_name("Ascent"), pdf_new_number(ascent));
+ pdf_add_dict(descriptor,
+ pdf_new_name("Descent"), pdf_new_number(descent));
+ pdf_add_dict(descriptor,
+ pdf_new_name("ItalicAngle"), pdf_new_number(italicangle));
+ pdf_add_dict(descriptor,
+ pdf_new_name("StemV"), pdf_new_number(stemv));
+ pdf_add_dict(descriptor,
+ pdf_new_name("Flags"), pdf_new_number(flags));
+}
+
+static void
+add_metrics (pdf_font *font, cff_font *cffont, double *widths, long num_glyphs)
+{
+ pdf_obj *fontdict, *descriptor;
+ pdf_obj *tmp_array;
+ int code, firstchar, lastchar;
+ double val;
+ card16 gid;
+ int i;
+ char *usedchars;
+
+ fontdict = pdf_font_get_resource (font);
+ descriptor = pdf_font_get_descriptor(font);
+ usedchars = pdf_font_get_usedchars (font);
+
+ /*
+ * The original FontBBox of the font is preserved, instead
+ * of replacing it with tight bounding box calculated from
+ * charstrings, to prevent Acrobat 4 from greeking text as
+ * much as possible.
+ */
+ if (!cff_dict_known(cffont->topdict, "FontBBox")) {
+ ERROR("No FontBBox?");
+ }
+
+ tmp_array = pdf_new_array();
+ for (i = 0; i < 4; i++) {
+ val = cff_dict_get(cffont->topdict, "FontBBox", i);
+ pdf_add_array(tmp_array, pdf_new_number(ROUND(val, 1.0)));
+ }
+ pdf_add_dict(descriptor, pdf_new_name("FontBBox"), tmp_array);
+
+ tmp_array = pdf_new_array();
+ if (num_glyphs <= 1) {
+ /* This should be error. */
+ firstchar = lastchar = 0;
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ } else {
+ for (firstchar = 255, lastchar = 0, code = 0;
+ code < 256; code++) {
+ if (usedchars[code]) {
+ if (code < firstchar)
+ firstchar = code;
+ if (code > lastchar)
+ lastchar = code;
+ }
+ }
+ if (firstchar > lastchar) {
+ WARN("No glyphs actually used???");
+ pdf_release_obj(tmp_array);
+ return;
+ }
+ for (code = firstchar; code <= lastchar; code++) {
+ if (usedchars[code]) {
+ gid = cff_encoding_lookup(cffont, code);
+ pdf_add_array(tmp_array,
+ pdf_new_number(ROUND(widths[gid], 1.0)));
+ } else {
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ }
+ }
+
+ }
+ if (pdf_array_length(tmp_array) > 0) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Widths"), pdf_ref_obj(tmp_array));
+ }
+ pdf_release_obj(tmp_array);
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("FirstChar"), pdf_new_number(firstchar));
+ pdf_add_dict(fontdict,
+ pdf_new_name("LastChar"), pdf_new_number(lastchar));
+
+ return;
+}
+
+static long
+write_fontfile (pdf_font *font, cff_font *cffont, long num_glyphs)
+{
+ pdf_obj *descriptor;
+ pdf_obj *fontfile, *stream_dict;
+ cff_index *topdict;
+ long private_size, stream_data_len, charstring_len;
+ long topdict_offset, offset;
+#define WBUF_SIZE 1024
+ card8 *stream_data_ptr, wbuf[WBUF_SIZE];
+
+ descriptor = pdf_font_get_descriptor(font);
+
+ topdict = cff_new_index(1);
+ /*
+ * Force existence of Encoding.
+ */
+ if (!cff_dict_known(cffont->topdict, "CharStrings"))
+ cff_dict_add(cffont->topdict, "CharStrings", 1);
+ if (!cff_dict_known(cffont->topdict, "charset"))
+ cff_dict_add(cffont->topdict, "charset", 1);
+ if (!cff_dict_known(cffont->topdict, "Encoding"))
+ cff_dict_add(cffont->topdict, "Encoding", 1);
+ private_size = cff_dict_pack((cffont->private)[0], wbuf, WBUF_SIZE);
+ if (private_size > 0 && !cff_dict_known(cffont->topdict, "Private"))
+ cff_dict_add(cffont->topdict, "Private", 2);
+ topdict->offset[1] = cff_dict_pack(cffont->topdict, wbuf, WBUF_SIZE) + 1;
+
+ /*
+ * Estimate total size of fontfile.
+ */
+ charstring_len = cff_index_size(cffont->cstrings);
+
+ stream_data_len = 4; /* header size */
+ stream_data_len += cff_index_size(cffont->name);
+ stream_data_len += cff_index_size(topdict);
+ stream_data_len += cff_index_size(cffont->string);
+ stream_data_len += cff_index_size(cffont->gsubr);
+ /* We are using format 1 for Encoding and format 0 for charset.
+ * TODO: Should implement cff_xxx_size().
+ */
+ stream_data_len += 2 + (cffont->encoding->num_entries)*2 + 1 + (cffont->encoding->num_supps)*3;
+ stream_data_len += 1 + (cffont->charsets->num_entries)*2;
+ stream_data_len += charstring_len;
+ stream_data_len += private_size;
+
+ /*
+ * Now we create FontFile data.
+ */
+ stream_data_ptr = NEW(stream_data_len, card8);
+ /*
+ * Data Layout order as described in CFF spec., sec 2 "Data Layout".
+ */
+ offset = 0;
+ /* Header */
+ offset += cff_put_header(cffont,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* Name */
+ offset += cff_pack_index(cffont->name,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* Top DICT */
+ topdict_offset = offset;
+ offset += cff_index_size(topdict);
+ /* Strings */
+ offset += cff_pack_index(cffont->string,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* Global Subrs */
+ offset += cff_pack_index(cffont->gsubr,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* Encoding */
+ cff_dict_set(cffont->topdict, "Encoding", 0, offset);
+ offset += cff_pack_encoding(cffont,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* charset */
+ cff_dict_set(cffont->topdict, "charset", 0, offset);
+ offset += cff_pack_charsets(cffont,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* CharStrings */
+ cff_dict_set(cffont->topdict, "CharStrings", 0, offset);
+ offset += cff_pack_index(cffont->cstrings,
+ stream_data_ptr + offset, charstring_len);
+ /* Private */
+ if ((cffont->private)[0] && private_size > 0) {
+ private_size = cff_dict_pack(cffont->private[0],
+ stream_data_ptr + offset, private_size);
+ cff_dict_set(cffont->topdict, "Private", 1, offset);
+ cff_dict_set(cffont->topdict, "Private", 0, private_size);
+ }
+ offset += private_size;
+
+ /* Finally Top DICT */
+ topdict->data = NEW(topdict->offset[1] - 1, card8);
+ cff_dict_pack (cffont->topdict, topdict->data, topdict->offset[1] - 1);
+ cff_pack_index(topdict,
+ stream_data_ptr + topdict_offset, cff_index_size(topdict));
+ cff_release_index(topdict);
+
+ /* Copyright and Trademark Notice ommited. */
+
+ /* Flush Font File */
+ fontfile = pdf_new_stream(STREAM_COMPRESS);
+ stream_dict = pdf_stream_dict(fontfile);
+ pdf_add_dict(descriptor,
+ pdf_new_name("FontFile3"), pdf_ref_obj (fontfile));
+ pdf_add_dict(stream_dict,
+ pdf_new_name("Subtype"), pdf_new_name("Type1C"));
+ pdf_add_stream (fontfile, (void *) stream_data_ptr, offset);
+ pdf_release_obj(fontfile);
+
+ RELEASE(stream_data_ptr);
+
+ return offset;
+}
+
+
+int
+pdf_font_load_type1 (pdf_font *font)
+{
+ pdf_obj *fontdict, *descriptor;
+ int encoding_id;
+ char *usedchars, *ident;
+ char *fontname, *uniqueTag;
+ char *fullname; /* With pseudo unique tag */
+ cff_font *cffont;
+ cff_charsets *charset;
+ char **enc_vec;
+ double defaultwidth, nominalwidth;
+ double *widths;
+ card16 *GIDMap, num_glyphs = 0;
+ FILE *fp;
+ long offset;
+ int code, verbose;
+
+ ASSERT(font);
+
+ if (!pdf_font_is_in_use(font)) {
+ return 0;
+ }
+
+ verbose = pdf_font_get_verbose();
+
+ encoding_id = pdf_font_get_encoding (font);
+ fontdict = pdf_font_get_resource (font);
+
+ if (pdf_font_get_flag(font, PDF_FONT_FLAG_BASEFONT)) {
+ if (encoding_id >= 0) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_get_encoding_reference(encoding_id));
+ }
+ return 0;
+ }
+
+ descriptor = pdf_font_get_descriptor(font);
+ usedchars = pdf_font_get_usedchars (font);
+ ident = pdf_font_get_ident (font);
+ fontname = pdf_font_get_fontname (font);
+ uniqueTag = pdf_font_get_uniqueTag (font);
+ if (!usedchars || !ident || !fontname) {
+ ERROR("Type1: Unexpected error.");
+ }
+
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_T1FONT);
+ if (!fp) {
+ ERROR("Type1: Could not open Type1 font: %s", ident);
+ }
+
+ GIDMap = NULL;
+ num_glyphs = 0;
+
+ if (encoding_id >= 0) {
+ enc_vec = NULL;
+ } else {
+ enc_vec = NEW(256, char *);
+ for (code = 0; code <= 0xff; code++) {
+ enc_vec[code] = NULL;
+ }
+ }
+
+ cffont = t1_load_font(enc_vec, 0, fp);
+ if (!cffont) {
+ ERROR("Could not load Type 1 font: %s", ident);
+ }
+ DPXFCLOSE(fp);
+
+ fullname = NEW(strlen(fontname) + 8, char);
+ sprintf(fullname, "%6s+%s", uniqueTag, fontname);
+
+ /*
+ * Encoding related things.
+ */
+ if (encoding_id >= 0) {
+ if (pdf_encoding_is_predefined(encoding_id)) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_new_name(pdf_encoding_get_name(encoding_id)));
+ } else {
+#if 0
+ /*
+ * Gs not working with this.
+ */
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_get_encoding_resource(enc));
+#endif
+ if (!pdf_lookup_dict(fontdict, "ToUnicode"))
+ pdf_attach_ToUnicode_CMap(fontdict, encoding_id, usedchars);
+ }
+ enc_vec = pdf_encoding_get_encoding(encoding_id);
+ } else {
+ pdf_obj *tounicode;
+
+ /*
+ * Create enc_vec and ToUnicode CMap for built-in encoding.
+ */
+ if (!pdf_lookup_dict(fontdict, "ToUnicode")) {
+ tounicode = pdf_create_ToUnicode_CMap(fullname,
+ enc_vec, usedchars);
+ if (tounicode) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("ToUnicode"),
+ pdf_ref_obj (tounicode));
+ pdf_release_obj(tounicode);
+ }
+ }
+ }
+
+ cff_set_name(cffont, fullname);
+ RELEASE(fullname);
+
+ /* defaultWidthX, CapHeight, etc. */
+ get_font_attr(font, cffont);
+ if (cff_dict_known(cffont->private[0], "defaultWidthX")) {
+ defaultwidth = cff_dict_get(cffont->private[0], "defaultWidthX", 0);
+ } else {
+ defaultwidth = 0.0;
+ }
+ if (cff_dict_known(cffont->private[0], "nominalWidthX")) {
+ nominalwidth = cff_dict_get(cffont->private[0], "nominalWidthX", 0);
+ } else {
+ nominalwidth = 0.0;
+ }
+
+ /* Create CFF encoding, charset, sort glyphs */
+#define MAX_GLYPHS 1024
+ GIDMap = NEW(MAX_GLYPHS, card16);
+ {
+ int prev, duplicate;
+ long gid;
+ char *glyph;
+ s_SID sid;
+
+ cffont->encoding = NEW(1, cff_encoding);
+ cffont->encoding->format = 1;
+ cffont->encoding->num_entries = 0;
+ cffont->encoding->data.range1 = NEW(256, cff_range1);
+ cffont->encoding->num_supps = 0;
+ cffont->encoding->supp = NEW(256, cff_map);
+
+ charset = NEW(1, cff_charsets);
+ charset->format = 0;
+ charset->num_entries = 0;
+ charset->data.glyphs = NEW(MAX_GLYPHS, s_SID);
+
+ gid = cff_glyph_lookup(cffont, ".notdef");
+ if (gid < 0)
+ ERROR("Type 1 font with no \".notdef\" glyph???");
+ GIDMap[0] = (card16) gid;
+ if (verbose > 2)
+ MESG("[glyphs:/.notdef");
+ num_glyphs = 1;
+ for (prev = -2, code = 0; code <= 0xff; code++) {
+ glyph = enc_vec[code];
+
+ if (!usedchars[code])
+ continue;
+ if (glyph && !strcmp(glyph, ".notdef")) {
+ WARN("Character mapped to .notdef used in font: %s",
+ fontname);
+ usedchars[code] = 0;
+ continue;
+ }
+
+ gid = cff_glyph_lookup(cffont, glyph);
+ if (gid < 1 || gid >= cffont->cstrings->count) {
+ WARN("Glyph \"%s\" missing in font \"%s\".", glyph, fontname);
+ usedchars[code] = 0;
+ continue;
+ }
+
+ for (duplicate = 0; duplicate < code; duplicate++) {
+ if (usedchars[duplicate] &&
+ enc_vec[duplicate] && !strcmp(enc_vec[duplicate], glyph))
+ break;
+ }
+
+ sid = cff_add_string(cffont, glyph); /* FIXME */
+ if (duplicate < code) { /* found duplicates */
+ cffont->encoding->supp[cffont->encoding->num_supps].code = duplicate;
+ cffont->encoding->supp[cffont->encoding->num_supps].glyph = sid;
+ cffont->encoding->num_supps += 1;
+ } else {
+ GIDMap[num_glyphs] = (card16) gid;
+ charset->data.glyphs[charset->num_entries] = sid;
+ charset->num_entries += 1;
+ if (code != prev + 1) {
+ cffont->encoding->num_entries += 1;
+ cffont->encoding->data.range1[cffont->encoding->num_entries-1].first = code;
+ cffont->encoding->data.range1[cffont->encoding->num_entries-1].n_left = 0;
+ } else {
+ cffont->encoding->data.range1[cffont->encoding->num_entries-1].n_left += 1;
+ }
+ prev = code;
+ num_glyphs++;
+
+ if (verbose > 2) {
+ MESG("/%s", glyph);
+ }
+
+ }
+ }
+ if (cffont->encoding->num_supps > 0) {
+ cffont->encoding->format |= 0x80;
+ } else {
+ RELEASE(cffont->encoding->supp); /* FIXME */
+ cffont->encoding->supp = NULL;
+ }
+ }
+
+ widths = NEW(cffont->cstrings->count, double);
+ /*
+ * No more string will be added.
+ * The Type 1 seac operator may add another glyph but the glyph name of
+ * those glyphs are contained in standard string. The String Index will
+ * not be modified after here.
+ */
+ cff_dict_update (cffont->topdict, cffont);
+ cff_dict_update (cffont->private[0], cffont);
+ cff_update_string(cffont);
+
+ {
+ cff_index *cstring;
+ t1_ginfo gm;
+ card16 gid, gid_orig;
+ long dstlen_max, srclen;
+ int have_seac = 0;
+ card8 *srcptr, *dstptr;
+
+ offset = dstlen_max = 0L;
+ cstring = cff_new_index(cffont->cstrings->count);
+ cstring->data = NULL;
+ cstring->offset[0] = 1;
+
+ /* The num_glyphs increases if "seac" operators are used. */
+ for (gid = 0; gid < num_glyphs; gid++) {
+ if (offset + CS_STR_LEN_MAX >= dstlen_max) {
+ dstlen_max += CS_STR_LEN_MAX * 2;
+ cstring->data = RENEW(cstring->data, dstlen_max, card8);
+ }
+ gid_orig = GIDMap[gid];
+
+ dstptr = cstring->data + cstring->offset[gid] - 1;
+ srcptr = cffont->cstrings->data + cffont->cstrings->offset[gid_orig] - 1;
+ srclen = cffont->cstrings->offset[gid_orig + 1] - cffont->cstrings->offset[gid_orig];
+
+ offset += t1char_convert_charstring(dstptr, CS_STR_LEN_MAX,
+ srcptr, srclen,
+ cffont->subrs[0], defaultwidth, nominalwidth, &gm);
+ cstring->offset[gid + 1] = offset + 1;
+ if (gm.use_seac) {
+ long bchar_gid, achar_gid, i;
+ char *bchar_name, *achar_name;
+
+ /*
+ * NOTE:
+ * 1. seac.achar and seac.bchar must be contained in the CFF standard string.
+ * 2. Those characters need not to be encoded.
+ * 3. num_glyphs == charsets->num_entries + 1.
+ */
+ achar_name = t1_get_standard_glyph(gm.seac.achar);
+ achar_gid = cff_glyph_lookup(cffont, achar_name);
+ bchar_name = t1_get_standard_glyph(gm.seac.bchar);
+ bchar_gid = cff_glyph_lookup(cffont, bchar_name);
+ if (achar_gid < 0) {
+ WARN("Accent char \"%s\" not found. Invalid use of \"seac\" operator.",
+ achar_name);
+ continue;
+ }
+ if (bchar_gid < 0) {
+ WARN("Base char \"%s\" not found. Invalid use of \"seac\" operator.",
+ bchar_name);
+ continue;
+ }
+
+ for (i = 0; i < num_glyphs; i++) {
+ if (GIDMap[i] == achar_gid)
+ break;
+ }
+ if (i == num_glyphs) {
+ if (verbose > 2)
+ MESG("/%s", achar_name);
+ GIDMap[num_glyphs++] = achar_gid;
+ charset->data.glyphs[charset->num_entries] = cff_get_sid(cffont, achar_name);
+ charset->num_entries += 1;
+ }
+
+ for (i = 0; i < num_glyphs; i++) {
+ if (GIDMap[i] == bchar_gid)
+ break;
+ }
+ if (i == num_glyphs) {
+ if (verbose > 2)
+ MESG("/%s", bchar_name);
+ GIDMap[num_glyphs++] = bchar_gid;
+ charset->data.glyphs[charset->num_entries] = cff_get_sid(cffont, bchar_name);
+ charset->num_entries += 1;
+ }
+ have_seac = 1;
+ }
+ widths[gid] = gm.wx;
+ }
+ cstring->count = num_glyphs;
+
+ cff_release_index(cffont->subrs[0]);
+ cffont->subrs[0] = NULL;
+ RELEASE(cffont->subrs);
+ cffont->subrs = NULL;
+
+ cff_release_index(cffont->cstrings);
+ cffont->cstrings = cstring;
+
+ cff_release_charsets(cffont->charsets);
+ cffont->charsets = charset;
+ }
+ if (verbose > 2)
+ MESG("]");
+
+ add_metrics(font, cffont, widths, num_glyphs);
+
+ offset = write_fontfile(font, cffont, num_glyphs);
+ if (verbose > 1)
+ MESG("[%u glyphs][%ld bytes]", num_glyphs, offset);
+
+ cff_close(cffont);
+
+ /* Cleanup */
+ if (encoding_id < 0 && enc_vec) {
+ for (code = 0; code < 256; code++) {
+ if (enc_vec[code])
+ RELEASE(enc_vec[code]);
+ enc_vec[code] = NULL;
+ }
+ RELEASE(enc_vec);
+ }
+ if (widths)
+ RELEASE(widths);
+ if (GIDMap)
+ RELEASE(GIDMap);
+
+ /*
+ * Maybe writing Charset is recommended for subsetted font.
+ */
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/type1.h b/Build/source/texk/xdvipdfmx/src/type1.h
new file mode 100644
index 00000000000..d6ade0c55fe
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/type1.h
@@ -0,0 +1,33 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/type1.h,v 1.6 2004/09/02 12:23:07 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TYPE1_H_
+#define _TYPE1_H_
+
+#include "pdffont.h"
+
+extern int pdf_font_open_type1 (pdf_font *font);
+extern int pdf_font_load_type1 (pdf_font *font);
+
+#endif /* _TYPE1_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/type1c.c b/Build/source/texk/xdvipdfmx/src/type1c.c
new file mode 100644
index 00000000000..ae91baafe22
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/type1c.c
@@ -0,0 +1,741 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/type1c.c,v 1.21 2005/07/17 09:53:38 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * CFF/OpenType Font support:
+ *
+ * Adobe Technical Note #5176, "The Compact Font Format Specfication"
+ *
+ * NOTE:
+ *
+ * Many CFF/OpenType does not have meaningful/correct CFF encoding.
+ * Encoding should be expilicitly supplied in the fontmap.
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+
+#include "dpxfile.h"
+
+#include "pdfobj.h"
+#include "pdffont.h"
+
+#include "pdfencoding.h"
+#include "unicode.h"
+
+/* Font info. from OpenType tables */
+#include "sfnt.h"
+#include "tt_aux.h"
+
+#include "cff_types.h"
+#include "cff_limits.h"
+#include "cff.h"
+#include "cff_dict.h"
+#include "cs_type2.h"
+
+#include "type1c.h"
+
+int
+pdf_font_open_type1c (pdf_font *font)
+{
+ char *ident, *fontname;
+ FILE *fp = NULL;
+ sfnt *sfont;
+ cff_font *cffont;
+ pdf_obj *descriptor, *tmp;
+ unsigned long offset = 0;
+ int encoding_id, embedding;
+
+ ASSERT(font);
+
+ ident = pdf_font_get_ident (font);
+ encoding_id = pdf_font_get_encoding(font);
+
+#ifdef XETEX
+ sfont = sfnt_open(pdf_font_get_ft_face(font), SFNT_TYPE_POSTSCRIPT);
+ if (!sfont)
+ return -1;
+#else
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_OTFONT);
+ if (!fp)
+ return -1;
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont ||
+ sfont->type != SFNT_TYPE_POSTSCRIPT ||
+ sfnt_read_table_directory(sfont, 0) < 0) {
+ ERROR("Not a CFF/OpenType font?");
+ }
+
+ offset = sfnt_find_table_pos(sfont, "CFF ");
+ if (offset < 1) {
+ ERROR("No \"CFF \" table found. Not a CFF/OpenType font?");
+ }
+
+ cffont = cff_open(sfont, offset, 0);
+ if (!cffont) {
+ ERROR("Could not read CFF font data");
+ }
+
+ if (cffont->flag & FONTTYPE_CIDFONT) {
+ cff_close (cffont);
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+ return -1;
+ }
+
+ fontname = cff_get_name(cffont);
+ if (!fontname) {
+ ERROR("No valid FontName found in CFF/OpenType font.");
+ }
+ pdf_font_set_fontname(font, fontname);
+ RELEASE(fontname);
+
+ cff_close(cffont);
+
+ /*
+ * Font like AdobePiStd does not have meaningful built-in encoding.
+ * Some software generate CFF/OpenType font with incorrect encoding.
+ */
+ if (encoding_id < 0) {
+ WARN("Built-in encoding used for CFF/OpenType font.");
+ WARN("CFF font in OpenType font sometimes have strange built-in encoding.");
+ WARN("If you find text is not encoded properly in the generated PDF file,");
+ WARN("please specify appropriate \".enc\" file in your fontmap.");
+ }
+ pdf_font_set_subtype (font, PDF_FONT_FONTTYPE_TYPE1C);
+
+ embedding = pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED) ? 0 : 1;
+ descriptor = pdf_font_get_descriptor(font);
+ /*
+ * Create font descriptor from OpenType tables.
+ * We can also use CFF TOP DICT/Private DICT for this.
+ */
+ tmp = tt_get_fontdesc(sfont, &embedding, 1);
+ if (!tmp) {
+ ERROR("Could not obtain neccesary font info from OpenType table.");
+ return -1;
+ }
+ pdf_merge_dict (descriptor, tmp); /* copy */
+ pdf_release_obj(tmp);
+ if (!embedding) { /* tt_get_fontdesc may have changed this */
+ pdf_font_set_flags(font, PDF_FONT_FLAG_NOEMBED);
+ }
+
+ sfnt_close(sfont);
+ if (fp)
+ DPXFCLOSE(fp);
+
+ return 0;
+}
+
+static void
+add_SimpleMetrics (pdf_font *font, double *widths, card16 num_glyphs)
+{
+ pdf_obj *fontdict;
+ int code, firstchar, lastchar;
+ char *usedchars;
+ pdf_obj *tmp_array;
+
+ fontdict = pdf_font_get_resource(font);
+ usedchars = pdf_font_get_usedchars(font);
+
+ tmp_array = pdf_new_array();
+ if (num_glyphs <= 1) {
+ /* This should be error. */
+ firstchar = lastchar = 0;
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ } else {
+ firstchar = 255; lastchar = 0;
+ for (code = 0; code < 256; code++) {
+ if (usedchars[code]) {
+ if (code < firstchar) firstchar = code;
+ if (code > lastchar) lastchar = code;
+ }
+ }
+ if (firstchar > lastchar) {
+ ERROR("No glyphs used at all!");
+ pdf_release_obj(tmp_array);
+ return;
+ }
+ for (code = firstchar; code <= lastchar; code++) {
+ if (usedchars[code]) {
+ pdf_add_array(tmp_array,
+ pdf_new_number(ROUND(widths[code], 1.0)));
+ } else {
+ pdf_add_array(tmp_array, pdf_new_number(0.0));
+ }
+ }
+ }
+ if (pdf_array_length(tmp_array) > 0) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Widths"), pdf_ref_obj(tmp_array));
+ }
+ pdf_release_obj(tmp_array);
+
+ pdf_add_dict(fontdict,
+ pdf_new_name("FirstChar"), pdf_new_number(firstchar));
+ pdf_add_dict(fontdict,
+ pdf_new_name("LastChar"), pdf_new_number(lastchar));
+
+ return;
+}
+
+int
+pdf_font_load_type1c (pdf_font *font)
+{
+ pdf_obj *fontdict, *descriptor;
+ char *usedchars;
+ char *fontname, *uniqueTag, *ident, *fullname;
+ FILE *fp = NULL;
+ int encoding_id;
+ pdf_obj *fontfile, *stream_dict;
+ char **enc_vec;
+ sfnt *sfont;
+ cff_font *cffont;
+ cff_index *charstrings, *topdict, *cs_idx;
+ cff_charsets *charset = NULL;
+ cff_encoding *encoding = NULL;
+ long topdict_offset, private_size;
+ long charstring_len, max_len;
+ long size, offset = 0;
+ long stream_data_len = 0;
+ card8 *stream_data_ptr, *data;
+ card16 num_glyphs, cs_count, code;
+ cs_ginfo ginfo;
+ double nominal_width, default_width, notdef_width;
+ double widths[256];
+ int verbose;
+
+ ASSERT(font);
+
+ verbose = pdf_font_get_verbose();
+
+ if (!pdf_font_is_in_use(font)) {
+ return 0;
+ }
+
+ if (pdf_font_get_flag(font, PDF_FONT_FLAG_NOEMBED)) {
+ ERROR("Only embedded font supported for CFF/OpenType font.");
+ }
+
+ usedchars = pdf_font_get_usedchars (font);
+ fontname = pdf_font_get_fontname (font);
+ ident = pdf_font_get_ident (font);
+ uniqueTag = pdf_font_get_uniqueTag (font);
+ if (!usedchars ||
+ !fontname || !ident) {
+ ERROR("Unexpected error....");
+ }
+
+ fontdict = pdf_font_get_resource (font);
+ descriptor = pdf_font_get_descriptor(font);
+ encoding_id = pdf_font_get_encoding (font);
+
+#ifdef XETEX
+ sfont = sfnt_open(pdf_font_get_ft_face(font), SFNT_TYPE_POSTSCRIPT);
+#else
+ fp = DPXFOPEN(ident, DPX_RES_TYPE_OTFONT);
+ if (!fp) {
+ ERROR("Could not open OpenType font: %s", ident);
+ }
+
+ sfont = sfnt_open(fp);
+#endif
+ if (!sfont) {
+ ERROR("Could not open OpenType font: %s", ident);
+ }
+ if (sfnt_read_table_directory(sfont, 0) < 0) {
+ ERROR("Could not read OpenType table directory: %s", ident);
+ }
+ if (sfont->type != SFNT_TYPE_POSTSCRIPT ||
+ (offset = sfnt_find_table_pos(sfont, "CFF ")) == 0) {
+ ERROR("Not a CFF/OpenType font ?");
+ }
+
+ cffont = cff_open(sfont, offset, 0);
+ if (!cffont) {
+ ERROR("Could not open CFF font.");
+ }
+ if (cffont->flag & FONTTYPE_CIDFONT) {
+ ERROR("This is CIDFont...");
+ }
+
+ fullname = NEW(strlen(fontname) + 8, char);
+ sprintf(fullname, "%6s+%s", uniqueTag, fontname);
+
+ /* Offsets from DICTs */
+ cff_read_charsets(cffont);
+ if (encoding_id < 0)
+ cff_read_encoding(cffont);
+ cff_read_private(cffont);
+ cff_read_subrs (cffont);
+
+ /* FIXME */
+ cffont->_string = cff_new_index(0);
+
+ /* New Charsets data */
+ charset = NEW(1, cff_charsets);
+ charset->format = 0;
+ charset->num_entries = 0;
+ charset->data.glyphs = NEW(256, s_SID);
+
+ /*
+ * Encoding related things.
+ */
+ enc_vec = NULL;
+ if (encoding_id >= 0) {
+ if (pdf_encoding_is_predefined(encoding_id)) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_new_name(pdf_encoding_get_name(encoding_id)));
+ } else {
+#if 0
+ /*
+ * Gs not working with this.
+ */
+ pdf_add_dict(fontdict,
+ pdf_new_name("Encoding"),
+ pdf_get_encoding_reference(encoding_id));
+#endif
+ if (!pdf_lookup_dict(fontdict, "ToUnicode"))
+ pdf_attach_ToUnicode_CMap(fontdict, encoding_id, usedchars);
+ }
+ enc_vec = pdf_encoding_get_encoding(encoding_id);
+ } else {
+ pdf_obj *tounicode;
+
+ /*
+ * Create enc_vec and ToUnicode CMap for built-in encoding.
+ */
+ enc_vec = NEW(256, char *);
+ for (code = 0; code < 256; code++) {
+ if (usedchars[code]) {
+ card16 gid;
+
+ gid = cff_encoding_lookup(cffont, code);
+ enc_vec[code] = cff_get_string(cffont,
+ cff_charsets_lookup_inverse(cffont, gid));
+ } else {
+ enc_vec[code] = NULL;
+ }
+ }
+ if (!pdf_lookup_dict(fontdict, "ToUnicode")) {
+ tounicode = pdf_create_ToUnicode_CMap(fullname,
+ enc_vec, usedchars);
+ if (tounicode) {
+ pdf_add_dict(fontdict,
+ pdf_new_name("ToUnicode"),
+ pdf_ref_obj (tounicode));
+ pdf_release_obj(tounicode);
+ }
+ }
+ }
+
+ /*
+ * New Encoding data:
+ *
+ * We should not use format 0 here.
+ * The number of encoded glyphs (num_entries) is limited to 255 in format 0,
+ * and hence it causes problem for encodings that uses full 256 code-points.
+ * As we always sort glyphs by encoding, we can avoid this problem simply
+ * by using format 1; Using full range result in a single range, 0 255.
+ *
+ * Creating actual encoding date is delayed to eliminate character codes to
+ * be mapped to .notdef and to handle multiply-encoded glyphs.
+ */
+ encoding = NEW(1, cff_encoding);
+ encoding->format = 1;
+ encoding->num_entries = 0;
+ encoding->data.range1 = NEW(255, cff_range1);
+ encoding->num_supps = 0;
+ encoding->supp = NEW(255, cff_map);
+
+ /*
+ * Charastrings.
+ */
+ offset = (long) cff_dict_get(cffont->topdict, "CharStrings", 0);
+ cff_seek_set(cffont, offset);
+ cs_idx = cff_get_index_header(cffont);
+
+ /* Offset is now absolute offset ... fixme */
+ offset = cffont->sfont->loc;
+ cs_count = cs_idx->count;
+ if (cs_count < 2) {
+ ERROR("No valid charstring data found.");
+ }
+
+ /* New CharStrings INDEX */
+ charstrings = cff_new_index(256);
+ max_len = 2 * CS_STR_LEN_MAX;
+ charstrings->data = NEW(max_len, card8);
+ charstring_len = 0;
+
+ /*
+ * Information from OpenType table is rough estimate. Replace with accurate value.
+ */
+ if (cffont->private[0] &&
+ cff_dict_known(cffont->private[0], "StdVW")) {
+ double stemv;
+
+ stemv = cff_dict_get(cffont->private[0], "StdVW", 0);
+ pdf_add_dict(descriptor,
+ pdf_new_name("StemV"), pdf_new_number(stemv));
+ }
+
+ /*
+ * Widths
+ */
+ if (cffont->private[0] &&
+ cff_dict_known(cffont->private[0], "defaultWidthX")) {
+ default_width = (double) cff_dict_get(cffont->private[0], "defaultWidthX", 0);
+ } else {
+ default_width = CFF_DEFAULTWIDTHX_DEFAULT;
+ }
+ if (cffont->private[0] &&
+ cff_dict_known(cffont->private[0], "nominalWidthX")) {
+ nominal_width = (double) cff_dict_get(cffont->private[0], "nominalWidthX", 0);
+ } else {
+ nominal_width = CFF_NOMINALWIDTHX_DEFAULT;
+ }
+
+ data = NEW(CS_STR_LEN_MAX, card8);
+
+ /* First we add .notdef glyph.
+ * All Type 1 font requires .notdef glyph to be present.
+ */
+ if (verbose > 2) {
+ MESG("[glyphs:/.notdef");
+ }
+ size = cs_idx->offset[1] - cs_idx->offset[0];
+ if (size > CS_STR_LEN_MAX) {
+ ERROR("Charstring too long: gid=%u, %ld bytes", 0, size);
+ }
+ charstrings->offset[0] = charstring_len + 1;
+ sfnt_seek_set(cffont->sfont, offset + cs_idx->offset[0] - 1);
+ sfnt_read(data, size, cffont->sfont);
+ charstring_len += cs_copy_charstring(charstrings->data + charstring_len,
+ max_len - charstring_len,
+ data, size,
+ cffont->gsubr, cffont->subrs[0],
+ default_width, nominal_width, &ginfo);
+ notdef_width = ginfo.wx;
+
+ /*
+ * Subset font
+ */
+ num_glyphs = 1;
+ for (code = 0; code < 256; code++) {
+ card16 gid, j;
+ s_SID sid_orig, sid;
+
+ widths[code] = notdef_width;
+
+ if (!usedchars[code] || !enc_vec[code] ||
+ !strcmp(enc_vec[code], ".notdef"))
+ continue;
+
+ /*
+ * FIXME:
+ * cff_get_sid() obtain SID from original String INDEX.
+ * It should be cff_string_get_sid(string, ...).
+ * cff_add_string(cff, ...) -> cff_string_add(string, ...).
+ */
+ sid_orig = cff_get_sid (cffont, enc_vec[code]);
+ sid = cff_add_string(cffont, enc_vec[code]);
+
+ /*
+ * Check if multiply-encoded glyph.
+ */
+ for (j = 0; j < charset->num_entries; j++) {
+ if (sid == charset->data.glyphs[j]) {
+ /* Already have this glyph. */
+ encoding->supp[encoding->num_supps].code = code;
+ encoding->supp[encoding->num_supps].glyph = sid;
+ usedchars[code] = 0; /* Used but multiply-encoded. */
+ encoding->num_supps += 1;
+ break;
+ }
+ }
+ if (j < charset->num_entries) {
+ continue; /* Prevent duplication. */
+ }
+
+ /* This is new encoding entry. */
+ gid = cff_charsets_lookup(cffont, sid_orig); /* FIXME */
+ if (gid == 0) {
+ WARN("Glyph \"%s\" missing in font \"%s\".", enc_vec[code], fontname);
+ WARN("Maybe incorrect encoding specified.");
+ usedchars[code] = 0; /* Set unused for writing correct encoding */
+ continue;
+ }
+ if (verbose > 2) {
+ MESG("/%s", enc_vec[code]);
+ }
+
+ size = cs_idx->offset[gid+1] - cs_idx->offset[gid];
+ if (size > CS_STR_LEN_MAX) {
+ ERROR("Charstring too long: gid=%u, %ld bytes", gid, size);
+ }
+
+ if (charstring_len + CS_STR_LEN_MAX >= max_len) {
+ max_len = charstring_len + 2 * CS_STR_LEN_MAX;
+ charstrings->data = RENEW(charstrings->data, max_len, card8);
+ }
+ charstrings->offset[num_glyphs] = charstring_len + 1;
+ sfnt_seek_set(cffont->sfont, offset + cs_idx->offset[gid] - 1);
+ sfnt_read(data, size, cffont->sfont);
+ charstring_len += cs_copy_charstring(charstrings->data + charstring_len,
+ max_len - charstring_len,
+ data, size,
+ cffont->gsubr, cffont->subrs[0],
+ default_width, nominal_width, &ginfo);
+ widths[code] = ginfo.wx;
+ charset->data.glyphs[charset->num_entries] = sid;
+ charset->num_entries += 1;
+ num_glyphs++;
+ }
+ if (verbose > 2) {
+ MESG("]");
+ }
+ RELEASE(data);
+
+ /*
+ * Now we create encoding data.
+ */
+ if (encoding->num_supps > 0)
+ encoding->format |= 0x80; /* Have supplemantary data. */
+ else {
+ RELEASE(encoding->supp); /* FIXME */
+ }
+ for (code = 0; code < 256; code++) {
+ if (!usedchars[code] ||
+ !enc_vec[code] || !strcmp(enc_vec[code], ".notdef"))
+ continue;
+ encoding->data.range1[encoding->num_entries].first = code;
+ encoding->data.range1[encoding->num_entries].n_left = 0;
+ code++;
+ while (code < 256 && usedchars[code] &&
+ enc_vec[code] && strcmp(enc_vec[code], ".notdef")) {
+ encoding->data.range1[encoding->num_entries].n_left += 1;
+ code++;
+ }
+ encoding->num_entries += 1;
+ /* The above while() loop stopped at unused char or code == 256. */
+ }
+
+ /* cleanup */
+ if (encoding_id < 0 && enc_vec) {
+ for (code = 0; code < 256; code++) {
+ if (enc_vec[code]) {
+ RELEASE(enc_vec[code]);
+ }
+ }
+ RELEASE(enc_vec);
+ }
+
+ cff_release_index(cs_idx);
+
+ charstrings->offset[num_glyphs] = charstring_len + 1;
+ charstrings->count = num_glyphs;
+ charstring_len = cff_index_size(charstrings);
+ cffont->num_glyphs = num_glyphs;
+
+ /*
+ * Discard old one, set new data.
+ */
+ if (cffont->charsets)
+ cff_release_charsets(cffont->charsets);
+ cffont->charsets = charset;
+ if (cffont->encoding)
+ cff_release_encoding(cffont->encoding);
+ cffont->encoding = encoding;
+ /*
+ * We don't use subroutines at all.
+ */
+ if (cffont->gsubr)
+ cff_release_index(cffont->gsubr);
+ cffont->gsubr = cff_new_index(0);
+ if (cffont->subrs[0])
+ cff_release_index(cffont->subrs[0]);
+ cffont->subrs[0] = NULL;
+
+ /*
+ * Flag must be reset since cff_pack_encoding(charset) does not write
+ * encoding(charset) if HAVE_STANDARD_ENCODING(CHARSET) is set. We are
+ * re-encoding font.
+ */
+ cffont->flag = FONTTYPE_FONT;
+
+ /*
+ * FIXME:
+ * Update String INDEX to delete unused strings.
+ */
+ cff_dict_update(cffont->topdict, cffont);
+ if (cffont->private[0])
+ cff_dict_update(cffont->private[0], cffont);
+ cff_update_string(cffont);
+
+ /*
+ * Calculate sizes of Top DICT and Private DICT.
+ * All offset values in DICT are set to long (32-bit) integer
+ * in cff_dict_pack(), those values are updated later.
+ */
+ topdict = cff_new_index(1);
+
+ cff_dict_remove(cffont->topdict, "UniqueID");
+ cff_dict_remove(cffont->topdict, "XUID");
+
+ /*
+ * Force existence of Encoding.
+ */
+ if (!cff_dict_known(cffont->topdict, "Encoding"))
+ cff_dict_add(cffont->topdict, "Encoding", 1);
+ topdict->offset[1] = cff_dict_pack(cffont->topdict,
+ (card8 *) work_buffer,
+ WORK_BUFFER_SIZE) + 1;
+ private_size = 0;
+ if (cffont->private[0]) {
+ cff_dict_remove(cffont->private[0], "Subrs"); /* no Subrs */
+ private_size = cff_dict_pack(cffont->private[0],
+ (card8 *) work_buffer, WORK_BUFFER_SIZE);
+ }
+
+ /*
+ * Estimate total size of fontfile.
+ */
+ stream_data_len = 4; /* header size */
+
+ stream_data_len += cff_set_name(cffont, fullname);
+ RELEASE(fullname);
+
+ stream_data_len += cff_index_size(topdict);
+ stream_data_len += cff_index_size(cffont->string);
+ stream_data_len += cff_index_size(cffont->gsubr);
+
+ /* We are using format 1 for Encoding and format 0 for charset.
+ * TODO: Should implement cff_xxx_size().
+ */
+ stream_data_len += 2 + (encoding->num_entries)*2 + 1 + (encoding->num_supps)*3;
+ stream_data_len += 1 + (charset->num_entries)*2;
+ stream_data_len += charstring_len;
+ stream_data_len += private_size;
+
+ /*
+ * Now we create FontFile data.
+ */
+ stream_data_ptr = NEW(stream_data_len, card8);
+
+ /*
+ * Data Layout order as described in CFF spec., sec 2 "Data Layout".
+ */
+ offset = 0;
+ /* Header */
+ offset += cff_put_header(cffont, stream_data_ptr + offset, stream_data_len - offset);
+ /* Name */
+ offset += cff_pack_index(cffont->name, stream_data_ptr + offset, stream_data_len - offset);
+ /* Top DICT */
+ topdict_offset = offset;
+ offset += cff_index_size(topdict);
+ /* Strings */
+ offset += cff_pack_index(cffont->string,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* Global Subrs */
+ offset += cff_pack_index(cffont->gsubr,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* Encoding */
+ cff_dict_set(cffont->topdict, "Encoding", 0, offset);
+ offset += cff_pack_encoding(cffont,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* charset */
+ cff_dict_set(cffont->topdict, "charset", 0, offset);
+ offset += cff_pack_charsets(cffont,
+ stream_data_ptr + offset, stream_data_len - offset);
+ /* CharStrings */
+ cff_dict_set(cffont->topdict, "CharStrings", 0, offset);
+ offset += cff_pack_index(charstrings,
+ stream_data_ptr + offset, charstring_len);
+ cff_release_index(charstrings);
+ /* Private */
+ cff_dict_set(cffont->topdict, "Private", 1, offset);
+ if (cffont->private[0] && private_size > 0)
+ private_size = cff_dict_pack(cffont->private[0],
+ stream_data_ptr + offset, private_size);
+ cff_dict_set(cffont->topdict, "Private", 0, private_size);
+ offset += private_size;
+
+ /* Finally Top DICT */
+ topdict->data = NEW(topdict->offset[1] - 1, card8);
+ cff_dict_pack (cffont->topdict, topdict->data, topdict->offset[1] - 1);
+ cff_pack_index(topdict,
+ stream_data_ptr + topdict_offset, cff_index_size(topdict));
+ cff_release_index(topdict);
+
+ /* Copyright and Trademark Notice ommited. */
+
+ /* Close font */
+ cff_close (cffont);
+ sfnt_close(sfont);
+
+ if (fp)
+ DPXFCLOSE(fp);
+
+ if (verbose > 1) {
+ MESG("[%u/%u glyphs][%ld bytes]", num_glyphs, cs_count, offset);
+ }
+
+ /* Handle Widths in fontdict. */
+ add_SimpleMetrics(font, widths, num_glyphs);
+
+ /*
+ * CharSet might be recommended for subsetted font, but it is meaningful
+ * only for Type 1 font...
+ */
+
+ /*
+ * Write PDF FontFile data.
+ */
+ fontfile = pdf_new_stream(STREAM_COMPRESS);
+ stream_dict = pdf_stream_dict(fontfile);
+ pdf_add_dict(descriptor,
+ pdf_new_name("FontFile3"), pdf_ref_obj (fontfile));
+ pdf_add_dict(stream_dict,
+ pdf_new_name("Subtype"), pdf_new_name("Type1C"));
+ pdf_add_stream (fontfile, (void *) stream_data_ptr, offset);
+ pdf_release_obj(fontfile);
+
+ RELEASE(stream_data_ptr);
+
+ return 0;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/type1c.h b/Build/source/texk/xdvipdfmx/src/type1c.h
new file mode 100644
index 00000000000..25186d8c9c0
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/type1c.h
@@ -0,0 +1,33 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/type1c.h,v 1.5 2004/09/02 12:23:07 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _TYPE1C_H_
+#define _TYPE1C_H_
+
+#include "pdffont.h"
+
+extern int pdf_font_open_type1c (pdf_font *font);
+extern int pdf_font_load_type1c (pdf_font *font);
+
+#endif /* _TYPE1C_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/unicode.c b/Build/source/texk/xdvipdfmx/src/unicode.c
new file mode 100644
index 00000000000..90edd566f6b
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/unicode.c
@@ -0,0 +1,113 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/unicode.c,v 1.21 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+/*
+ * Unicode related:
+ * Conversion between UTF-* and UCS-*.
+ * ToUnicode CMap
+ *
+ * Normalization?
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "system.h"
+#include "mem.h"
+#include "error.h"
+#include "dpxutil.h"
+
+#include "pdfobj.h"
+#include "pdfresource.h"
+
+#include "pdfencoding.h"
+#include "agl.h"
+#include "unicode.h"
+
+static int __verbose = 0;
+
+#define UC_DEBUG 3
+#define UC_DEBUG_STR "UC"
+
+void
+UC_set_verbose (void)
+{
+ __verbose++;
+}
+
+#define UC_REPLACEMENT_CHAR 0x0000FFFDL
+
+#define UC_SUR_SHIFT 10
+#define UC_SUR_MASK 0x3FFUL
+#define UC_SUR_LOW_START 0xDC00UL
+#define UC_SUR_HIGH_START 0xD800UL
+
+int
+UC_sput_UTF16BE (long ucv, unsigned char **pp, unsigned char *limptr)
+{
+ int count = 0;
+ unsigned char *p = *pp;
+
+ if (ucv >= 0 && ucv <= 0xFFFF) {
+ if (p + 2 >= limptr)
+ ERROR("Not enough space available...");
+ p[0] = (ucv >> 8) & 0xff;
+ p[1] = ucv & 0xff;
+ count = 2;
+ } else if (ucv >= 0x010000L && ucv <= 0x10FFFFL) {
+ unsigned short high, low;
+
+ if (p + 4 >= limptr)
+ ERROR("Not enough space available...");
+ ucv -= 0x00010000L;
+ high = (ucv >> UC_SUR_SHIFT) + UC_SUR_HIGH_START;
+ low = (ucv & UC_SUR_MASK) + UC_SUR_LOW_START;
+ p[0] = (high >> 8) & 0xff;
+ p[1] = (high & 0xff);
+ p[2] = (low >> 8) & 0xff;
+ p[3] = (low & 0xff);
+ count = 4;
+ } else {
+ if (p + 2 >= limptr)
+ ERROR("Not enough space available...");
+ p[0] = (UC_REPLACEMENT_CHAR >> 8) & 0xff;
+ p[1] = (UC_REPLACEMENT_CHAR & 0xff);
+ count = 2;
+ }
+
+ *pp += count;
+ return count;
+}
+
+int
+UC_is_valid (long ucv)
+{
+ if (ucv < 0 || (ucv >= 0x0000D800L && ucv <= 0x0000DFFFL))
+ return 0;
+ return 1;
+}
+
diff --git a/Build/source/texk/xdvipdfmx/src/unicode.h b/Build/source/texk/xdvipdfmx/src/unicode.h
new file mode 100644
index 00000000000..c5573f4429b
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/unicode.h
@@ -0,0 +1,36 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/unicode.h,v 1.10 2004/09/11 14:50:29 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _UNICODE_H_
+#define _UNICODE_H_
+
+#include "pdfobj.h"
+#include "agl.h"
+
+extern void UC_set_verbose (void);
+
+extern int UC_sput_UTF16BE (long ucv, unsigned char **dstpp, unsigned char *endptr);
+extern int UC_is_valid (long ucv);
+
+#endif /* _UNICODE_H_ */
diff --git a/Build/source/texk/xdvipdfmx/src/vf.c b/Build/source/texk/xdvipdfmx/src/vf.c
new file mode 100644
index 00000000000..589c5907767
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/vf.c
@@ -0,0 +1,1045 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/vf.c,v 1.16 2005/07/20 10:41:54 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "system.h"
+#include "numbers.h"
+#include "error.h"
+#include "mem.h"
+
+#include "dpxfile.h"
+/* pdfdev... */
+#include "pdfdev.h"
+
+#include "tfm.h"
+#include "dvi.h"
+#include "vf.h"
+
+#include "dvicodes.h"
+
+#define VF_ALLOC_SIZE 16u
+
+#define VF_ID 202
+#define FIX_WORD_BASE 1048576.0
+#define TEXPT2PT (72.0/72.27)
+#define FW2PT (TEXPT2PT/((double)(FIX_WORD_BASE)))
+
+static unsigned char verbose = 0;
+
+void vf_set_verbose(void)
+{
+ if (verbose < 255) verbose++;
+}
+
+struct font_def {
+ signed long font_id /* id used internally in vf file */;
+ unsigned long checksum, size, design_size;
+ char *directory, *name;
+ int tfm_id; /* id returned by TFM module */
+ int dev_id; /* id returned by DEV module */
+};
+
+struct vf
+{
+ char *tex_name;
+ spt_t ptsize;
+ unsigned long design_size; /* A fixword-pts quantity */
+ int num_dev_fonts, max_dev_fonts;
+ struct font_def *dev_fonts;
+ unsigned char **ch_pkt;
+ unsigned long *pkt_len;
+ unsigned num_chars;
+};
+
+struct vf *vf_fonts = NULL;
+int num_vf_fonts = 0, max_vf_fonts = 0;
+
+static int read_header(FILE *vf_file, int thisfont)
+{
+ int i, result = 1, ch;
+
+ /* Check for usual signature */
+ if ((ch = get_unsigned_byte (vf_file)) == PRE &&
+ (ch = get_unsigned_byte (vf_file)) == VF_ID) {
+
+ /* If here, assume it's a legitimate vf file */
+ ch = get_unsigned_byte (vf_file);
+
+ /* skip comment */
+ for (i=0; i<ch; i++)
+ get_unsigned_byte (vf_file);
+
+ /* Skip checksum */
+ get_unsigned_quad(vf_file);
+
+ vf_fonts[thisfont].design_size =
+ get_unsigned_quad(vf_file);
+ } else { /* Try to fail gracefully and return an error to caller */
+ fprintf (stderr, "VF file may be corrupt\n");
+ result = 0;
+ }
+ return result;
+}
+
+
+static void resize_vf_fonts(int size)
+{
+ int i;
+ if (size > max_vf_fonts) {
+ vf_fonts = RENEW (vf_fonts, size, struct vf);
+ for (i=max_vf_fonts; i<size; i++) {
+ vf_fonts[i].num_dev_fonts = 0;
+ vf_fonts[i].max_dev_fonts = 0;
+ vf_fonts[i].dev_fonts = NULL;
+ }
+ max_vf_fonts = size;
+ }
+ return;
+}
+
+static void resize_one_vf_font (struct vf *a_vf, unsigned size)
+{
+ unsigned i;
+ if (size > (a_vf->num_chars)) {
+ size = MAX (size, a_vf->num_chars+256);
+ a_vf->ch_pkt = RENEW (a_vf->ch_pkt, size, unsigned char *);
+ a_vf->pkt_len = RENEW (a_vf->pkt_len, size, unsigned long);
+ for (i=a_vf->num_chars; i<size; i++) {
+ (a_vf->ch_pkt)[i] = NULL;
+ (a_vf->pkt_len)[i] = 0;
+ }
+ a_vf->num_chars = size;
+ }
+}
+
+static void read_a_char_def(FILE *vf_file, int thisfont, unsigned long pkt_len,
+ unsigned ch)
+{
+ unsigned char *pkt;
+#ifdef DEBUG
+ fprintf (stderr, "read_a_char_def: len=%ld, ch=%d\n", pkt_len, ch);
+#endif
+ /* Resize and initialize character arrays if necessary */
+ if (ch >= vf_fonts[thisfont].num_chars) {
+ resize_one_vf_font (vf_fonts+thisfont, ch+1);
+ }
+ if (pkt_len > 0) {
+ pkt = NEW (pkt_len, unsigned char);
+ if (fread (pkt, 1, pkt_len, vf_file) != pkt_len)
+ ERROR ("VF file ended prematurely.");
+ (vf_fonts[thisfont].ch_pkt)[ch] = pkt;
+ }
+ (vf_fonts[thisfont].pkt_len)[ch] = pkt_len;
+ return;
+}
+
+static void read_a_font_def(FILE *vf_file, signed long font_id, int thisfont)
+{
+ struct font_def *dev_font;
+ int dir_length, name_length;
+#ifdef DEBUG
+ fprintf (stderr, "read_a_font_def: font_id = %ld\n", font_id);
+#endif
+ if (vf_fonts[thisfont].num_dev_fonts >=
+ vf_fonts[thisfont].max_dev_fonts) {
+ vf_fonts[thisfont].max_dev_fonts += VF_ALLOC_SIZE;
+ vf_fonts[thisfont].dev_fonts = RENEW
+ (vf_fonts[thisfont].dev_fonts,
+ vf_fonts[thisfont].max_dev_fonts,
+ struct font_def);
+ }
+ dev_font = vf_fonts[thisfont].dev_fonts+
+ vf_fonts[thisfont].num_dev_fonts;
+ dev_font -> font_id = font_id;
+ dev_font -> checksum = get_unsigned_quad (vf_file);
+ dev_font -> size = get_unsigned_quad (vf_file);
+ dev_font -> design_size = get_unsigned_quad (vf_file);
+ dir_length = get_unsigned_byte (vf_file);
+ name_length = get_unsigned_byte (vf_file);
+ dev_font -> directory = NEW (dir_length+1, char);
+ dev_font -> name = NEW (name_length+1, char);
+ fread (dev_font -> directory, 1, dir_length, vf_file);
+ fread (dev_font -> name, 1, name_length, vf_file);
+ (dev_font -> directory)[dir_length] = 0;
+ (dev_font -> name)[name_length] = 0;
+ vf_fonts[thisfont].num_dev_fonts += 1;
+ dev_font->tfm_id = tfm_open (dev_font -> name, 1); /* must exist */
+ dev_font->dev_id =
+ dvi_locate_font (dev_font->name,
+ sqxfw (vf_fonts[thisfont].ptsize,
+ dev_font->size));
+#ifdef DEBUG
+ fprintf (stderr, "[%s/%s]\n", dev_font -> directory, dev_font -> name);
+#endif
+ return;
+}
+
+
+static void process_vf_file (FILE *vf_file, int thisfont)
+{
+ int eof = 0, code;
+ unsigned long font_id;
+ while (!eof) {
+ code = get_unsigned_byte (vf_file);
+ switch (code) {
+ case FNT_DEF1:
+ font_id = get_unsigned_byte (vf_file);
+ read_a_font_def (vf_file, font_id, thisfont);
+ break;
+ case FNT_DEF2:
+ font_id = get_unsigned_pair (vf_file);
+ read_a_font_def (vf_file, font_id, thisfont);
+ break;
+ case FNT_DEF3:
+ font_id = get_unsigned_triple(vf_file);
+ read_a_font_def (vf_file, font_id, thisfont);
+ break;
+ case FNT_DEF4:
+ font_id = get_signed_quad(vf_file);
+ read_a_font_def (vf_file, font_id, thisfont);
+ break;
+ default:
+ if (code < 242) {
+ long ch;
+ /* For a short packet, code is the pkt_len */
+ ch = get_unsigned_byte (vf_file);
+ /* Skip over TFM width since we already know it */
+ get_unsigned_triple (vf_file);
+ read_a_char_def (vf_file, thisfont, code, ch);
+ break;
+ }
+ if (code == 242) {
+ unsigned long pkt_len, ch;
+ pkt_len = get_unsigned_quad(vf_file);
+ ch = get_unsigned_quad (vf_file);
+ /* Skip over TFM width since we already know it */
+ get_unsigned_quad (vf_file);
+ if (ch < 65536L)
+ read_a_char_def (vf_file, thisfont, pkt_len, ch);
+ else {
+ fprintf (stderr, "char=%ld\n", ch);
+ ERROR ("Long character (>16 bits) in VF file.\nI can't handle long characters!\n");
+ }
+ break;
+ }
+ if (code == POST) {
+ eof = 1;
+ break;
+ }
+ fprintf (stderr, "Quitting on code=%d\n", code);
+ eof = 1;
+ break;
+ }
+ }
+ return;
+}
+
+/* Unfortunately, the following code isn't smart enough
+ to load the vf only once for multiple point sizes.
+ You will get a separate copy of each VF in memory (and a separate
+ opening and reading of the file) for
+ each point size. Since VFs are pretty small, I guess
+ this is tolerable for now. In any case,
+ the PDF file will never repeat a physical font name */
+/* Note: This code needs to be able to recurse */
+/* Global variables such as num_vf_fonts require careful attention */
+int vf_locate_font (const char *tex_name, spt_t ptsize)
+{
+ int thisfont = -1, i;
+ char *full_vf_file_name;
+ FILE *vf_file;
+ /* Has this name and ptsize already been loaded as a VF? */
+ for (i=0; i<num_vf_fonts; i++) {
+ if (!strcmp (vf_fonts[i].tex_name, tex_name) &&
+ vf_fonts[i].ptsize == ptsize)
+ break;
+ }
+ if (i != num_vf_fonts) {
+ thisfont = i;
+ } else {
+ /* It's hasn't already been loaded as a VF, so try to load it */
+ full_vf_file_name = kpse_find_file (tex_name,
+ kpse_vf_format,
+ 1);
+ if (!full_vf_file_name) {
+ full_vf_file_name = kpse_find_file (tex_name,
+ kpse_ovf_format,
+ 1);
+ }
+ if (full_vf_file_name &&
+ (vf_file = MFOPEN (full_vf_file_name, FOPEN_RBIN_MODE)) != NULL) {
+ if (verbose == 1)
+ fprintf (stderr, "(VF:%s", tex_name);
+ if (verbose > 1)
+ fprintf (stderr, "(VF:%s", full_vf_file_name);
+ if (num_vf_fonts >= max_vf_fonts) {
+ resize_vf_fonts (max_vf_fonts + VF_ALLOC_SIZE);
+ }
+ thisfont = num_vf_fonts++;
+ { /* Initialize some pointers and such */
+ vf_fonts[thisfont].tex_name = NEW (strlen(tex_name)+1, char);
+ strcpy (vf_fonts[thisfont].tex_name, tex_name);
+ vf_fonts[thisfont].ptsize = ptsize;
+ vf_fonts[thisfont].num_chars = 0;
+ vf_fonts[thisfont].ch_pkt = NULL;
+ vf_fonts[thisfont].pkt_len = NULL;
+ }
+ read_header(vf_file, thisfont);
+ process_vf_file (vf_file, thisfont);
+ if (verbose)
+ fprintf (stderr, ")");
+ MFCLOSE (vf_file);
+ }
+ }
+ return thisfont;
+}
+
+#define next_byte() (*((*start)++))
+static UNSIGNED_BYTE unsigned_byte (unsigned char **start, unsigned char *end)
+{
+ UNSIGNED_BYTE byte = 0;
+ if (*start < end)
+ byte = next_byte();
+ else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return byte;
+}
+
+static SIGNED_BYTE signed_byte (unsigned char **start, unsigned char *end)
+{
+ int byte = 0;
+ if (*start < end) {
+ byte = next_byte();
+ if (byte >= 0x80)
+ byte -= 0x100;
+ }
+ else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return (SIGNED_BYTE) byte;
+}
+
+static UNSIGNED_PAIR unsigned_pair (unsigned char **start, unsigned char *end)
+{
+ int i;
+ UNSIGNED_BYTE byte;
+ UNSIGNED_PAIR pair = 0;
+ if (end-*start > 1) {
+ for (i=0; i<2; i++) {
+ byte = next_byte();
+ pair = pair*0x100u + byte;
+ }
+ }
+ else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return pair;
+}
+
+static SIGNED_PAIR signed_pair (unsigned char **start, unsigned char *end)
+{
+ int i;
+ long pair = 0;
+ if (end - *start > 1) {
+ for (i=0; i<2; i++) {
+ pair = pair*0x100 + next_byte();
+ }
+ if (pair >= 0x8000) {
+ pair -= 0x10000l;
+ }
+ } else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return (SIGNED_PAIR) pair;
+}
+
+static UNSIGNED_TRIPLE unsigned_triple(unsigned char **start, unsigned
+ char *end)
+{
+ int i;
+ long triple = 0;
+ if (end-*start > 2) {
+ for (i=0; i<3; i++) {
+ triple = triple*0x100u + next_byte();
+ }
+ } else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return (UNSIGNED_TRIPLE) triple;
+}
+
+static SIGNED_TRIPLE signed_triple(unsigned char **start, unsigned char *end)
+{
+ int i;
+ long triple = 0;
+ if (end-*start > 2) {
+ for (i=0; i<3; i++) {
+ triple = triple*0x100 + next_byte();
+ }
+ if (triple >= 0x800000l)
+ triple -= 0x1000000l;
+ } else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return (SIGNED_TRIPLE) triple;
+}
+
+static SIGNED_QUAD signed_quad(unsigned char **start, unsigned char *end)
+{
+ int byte, i;
+ long quad = 0;
+ /* Check sign on first byte before reading others */
+ if (end-*start > 3) {
+ byte = next_byte();
+ quad = byte;
+ if (quad >= 0x80)
+ quad = byte - 0x100;
+ for (i=0; i<3; i++) {
+ quad = quad*0x100 + next_byte();
+ }
+ } else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return (SIGNED_QUAD) quad;
+}
+
+static UNSIGNED_QUAD unsigned_quad(unsigned char **start, unsigned char *end)
+{
+ int i;
+ unsigned long quad = 0;
+ if (end-*start > 3) {
+ for (i=0; i<4; i++) {
+ quad = quad*0x100u + next_byte();
+ }
+ } else
+ ERROR ("Premature end of DVI byte stream in VF font\n");
+ return (UNSIGNED_QUAD) quad;
+}
+
+static void vf_set (SIGNED_QUAD ch)
+{
+ /* Defer to the dvi_set() defined in dvi.c */
+ dvi_set (ch);
+ return;
+}
+
+static void vf_set1(unsigned char **start, unsigned char *end)
+{
+ vf_set (unsigned_byte(start, end));
+ return;
+}
+
+static void vf_set2(unsigned char **start, unsigned char *end)
+{
+ vf_set (unsigned_pair(start, end));
+ return;
+}
+
+static void vf_putrule(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ SIGNED_QUAD width, height;
+ height = signed_quad (start, end);
+ width = signed_quad (start, end);
+ if (width > 0 && height > 0) {
+ dvi_rule (sqxfw(ptsize,width), sqxfw(ptsize, height));
+ }
+ return;
+}
+
+static void vf_setrule(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ SIGNED_QUAD width, height, s_width;
+ height = signed_quad (start, end);
+ width = signed_quad (start, end);
+ s_width = sqxfw(ptsize, width);
+ if (width > 0 && height > 0) {
+ dvi_rule (s_width, sqxfw(ptsize, height));
+ }
+ dvi_right (s_width);
+ return;
+}
+
+static void vf_put1(unsigned char **start, unsigned char *end)
+{
+ dvi_put (unsigned_byte(start, end));
+ return;
+}
+
+static void vf_put2(unsigned char **start, unsigned char *end)
+{
+ dvi_put (unsigned_pair(start, end));
+ return;
+}
+
+static void vf_push(void)
+{
+ dvi_push();
+ return;
+}
+
+static void vf_pop(void)
+{
+ dvi_pop();
+ return;
+}
+
+static void vf_right (SIGNED_QUAD x, spt_t ptsize)
+{
+ dvi_right ((SIGNED_QUAD) (sqxfw(ptsize, x)));
+ return;
+}
+
+
+static void vf_right1(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_right (signed_byte (start, end), ptsize);
+ return;
+}
+
+static void vf_right2(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_right (signed_pair (start, end), ptsize);
+ return;
+}
+
+static void vf_right3(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_right (signed_triple (start, end), ptsize);
+ return;
+}
+
+static void vf_right4(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_right (signed_quad (start, end), ptsize);
+ return;
+}
+
+static void vf_w0(void)
+{
+ dvi_w0();
+ return;
+}
+
+static void vf_w (SIGNED_QUAD w, spt_t ptsize)
+{
+ dvi_w ((SIGNED_QUAD) (sqxfw(ptsize, w)));
+ return;
+}
+
+static void vf_w1(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_w (signed_byte(start, end), ptsize);
+ return;
+}
+
+static void vf_w2(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_w (signed_pair(start, end), ptsize);
+ return;
+}
+
+static void vf_w3(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_w (signed_triple(start, end), ptsize);
+ return;
+}
+
+static void vf_w4(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_w (signed_quad(start, end), ptsize);
+ return;
+}
+
+static void vf_x0(void)
+{
+ dvi_x0();
+ return;
+}
+
+static void vf_x (SIGNED_QUAD x, spt_t ptsize)
+{
+ dvi_x ((SIGNED_QUAD) (sqxfw(ptsize, x)));
+ return;
+}
+
+static void vf_x1(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_x (signed_byte(start, end), ptsize);
+ return;
+}
+
+static void vf_x2(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_x (signed_pair(start, end), ptsize);
+ return;
+}
+
+static void vf_x3(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_x (signed_triple(start, end), ptsize);
+ return;
+}
+
+static void vf_x4(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_x (signed_quad(start, end), ptsize);
+ return;
+}
+
+static void vf_down (SIGNED_QUAD y, spt_t ptsize)
+{
+ dvi_down ((SIGNED_QUAD) (sqxfw(ptsize, y)));
+ return;
+}
+
+static void vf_down1(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_down (signed_byte(start, end), ptsize);
+ return;
+}
+
+static void vf_down2(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_down (signed_pair(start, end), ptsize);
+ return;
+}
+
+static void vf_down3(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_down (signed_triple(start, end), ptsize);
+ return;
+}
+
+static void vf_down4(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_down (signed_quad(start, end), ptsize);
+ return;
+}
+
+static void vf_y0(void)
+{
+ dvi_y0();
+ return;
+}
+
+static void vf_y (SIGNED_QUAD y, spt_t ptsize)
+{
+ dvi_y ((SIGNED_QUAD) (sqxfw(ptsize, y)));
+ return;
+}
+
+
+static void vf_y1(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_y (signed_byte(start, end), ptsize);
+ return;
+}
+
+static void vf_y2(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_y (signed_pair(start, end), ptsize);
+ return;
+}
+
+static void vf_y3(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_y (signed_triple(start, end), ptsize);
+ return;
+}
+
+static void vf_y4(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_y (signed_quad(start, end), ptsize);
+ return;
+}
+
+static void vf_z0(void)
+{
+ dvi_z0();
+ return;
+}
+
+static void vf_z (SIGNED_QUAD z, spt_t ptsize)
+{
+ dvi_z ((SIGNED_QUAD) (sqxfw(ptsize, z)));
+ return;
+}
+
+static void vf_z1(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_z (signed_byte(start, end), ptsize);
+ return;
+}
+
+static void vf_z2(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_z (signed_pair(start, end), ptsize);
+ return;
+}
+
+static void vf_z3(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_z (signed_triple(start, end), ptsize);
+ return;
+}
+
+static void vf_z4(unsigned char **start, unsigned char *end, spt_t ptsize)
+{
+ vf_z (signed_quad(start, end), ptsize);
+ return;
+}
+
+static void vf_fnt (SIGNED_QUAD font_id, unsigned long vf_font)
+{
+ int i;
+ for (i=0; i<vf_fonts[vf_font].num_dev_fonts; i++) {
+ if (font_id == ((vf_fonts[vf_font].dev_fonts)[i]).font_id) {
+ break;
+ }
+ }
+ if (i < vf_fonts[vf_font].num_dev_fonts) { /* Font was found */
+ dvi_set_font ((vf_fonts[vf_font].dev_fonts[i]).dev_id);
+ } else {
+ fprintf (stderr, "Font_id: %ld not found in VF\n", font_id);
+ }
+ return;
+}
+
+static void vf_fnt1(unsigned char **start, unsigned char *end,
+ unsigned long vf_font)
+{
+ vf_fnt (unsigned_byte(start, end), vf_font);
+ return;
+}
+
+static void vf_fnt2(unsigned char **start, unsigned char *end,
+ unsigned long vf_font)
+{
+ vf_fnt (unsigned_pair(start, end), vf_font);
+ return;
+}
+
+static void vf_fnt3(unsigned char **start, unsigned char *end,
+ unsigned long vf_font)
+{
+ vf_fnt (unsigned_triple(start, end), vf_font);
+ return;
+}
+
+static void vf_fnt4(unsigned char **start, unsigned char *end,
+ unsigned long vf_font)
+{
+ vf_fnt (signed_quad(start, end), vf_font);
+ return;
+}
+
+/* identical to do_xxx in dvi.c */
+static void vf_xxx (SIGNED_QUAD len, unsigned char **start, unsigned char *end)
+{
+ Ubyte *buffer;
+
+ if (*start <= end - len) {
+ buffer = NEW(len+1, Ubyte);
+ memcpy(buffer, *start, len);
+ buffer[len] = '\0';
+ {
+ Ubyte *p = buffer;
+
+ while (p < buffer+len && *p == ' ') p++;
+ /*
+ * Warning message from virtual font.
+ */
+ if (!memcmp((char *)p, "Warning:", 8)) {
+ WARN("VF:%s", p+8);
+ } else {
+ dvi_do_special(buffer, len);
+ }
+ }
+ RELEASE(buffer);
+ } else {
+ ERROR ("Premature end of DVI byte stream in VF font.");
+ }
+
+ *start += len;
+ return;
+}
+
+static void vf_xxx1(unsigned char **start, unsigned char *end)
+{
+ vf_xxx (unsigned_byte(start, end), start, end);
+ return;
+}
+
+static void vf_xxx2(unsigned char **start, unsigned char *end)
+{
+ vf_xxx (unsigned_pair(start, end), start, end);
+ return;
+}
+
+static void vf_xxx3(unsigned char **start, unsigned char *end)
+{
+ vf_xxx (unsigned_triple(start, end), start, end);
+ return;
+}
+
+static void vf_xxx4(unsigned char **start, unsigned char *end)
+{
+ vf_xxx (unsigned_quad(start, end), start, end);
+ return;
+}
+
+static void vf_dir(unsigned char **start, unsigned char *end)
+{
+ dvi_dir (unsigned_byte(start, end));
+ return;
+}
+
+void vf_set_char(SIGNED_QUAD ch, int vf_font)
+{
+ unsigned char opcode;
+ unsigned char *start, *end;
+ spt_t ptsize;
+ int default_font = -1;
+ if (vf_font < num_vf_fonts) {
+ /* Initialize to the first font or -1 if undefined */
+ ptsize = vf_fonts[vf_font].ptsize;
+ if (vf_fonts[vf_font].num_dev_fonts > 0)
+ default_font = ((vf_fonts[vf_font].dev_fonts)[0]).dev_id;
+ dvi_vf_init (default_font);
+ if (ch >= vf_fonts[vf_font].num_chars ||
+ !(start = (vf_fonts[vf_font].ch_pkt)[ch])) {
+ fprintf (stderr, "\nchar=0x%lx(%ld)\n", ch, ch);
+ fprintf (stderr, "Tried to set a nonexistent character in a virtual font");
+ start = end = NULL;
+ } else {
+ end = start + (vf_fonts[vf_font].pkt_len)[ch];
+ }
+ while (start && start < end) {
+ opcode = *(start++);
+#ifdef DEBUG
+ fprintf (stderr, "VF opcode: %d", opcode);
+ if (isprint (opcode)) fprintf (stderr, " (\'%c\')\n", opcode);
+ else fprintf (stderr, "\n");
+#endif
+ switch (opcode)
+ {
+ case SET1:
+ vf_set1(&start, end);
+ break;
+ case SET2:
+ vf_set2(&start, end);
+ break;
+ case SET3:
+ case SET4:
+ ERROR ("Multibyte (>16 bits) character in VF packet.\nI can't handle this!");
+ break;
+ case SET_RULE:
+ vf_setrule(&start, end, ptsize);
+ break;
+ case PUT1:
+ vf_put1(&start, end);
+ break;
+ case PUT2:
+ vf_put2(&start, end);
+ break;
+ case PUT3:
+ case PUT4:
+ ERROR ("Multibyte (>16 bits) character in VF packet.\nI can't handle this!");
+ break;
+ case PUT_RULE:
+ vf_putrule(&start, end, ptsize);
+ break;
+ case NOP:
+ break;
+ case PUSH:
+ vf_push();
+ break;
+ case POP:
+ vf_pop();
+ break;
+ case RIGHT1:
+ vf_right1(&start, end, ptsize);
+ break;
+ case RIGHT2:
+ vf_right2(&start, end, ptsize);
+ break;
+ case RIGHT3:
+ vf_right3(&start, end, ptsize);
+ break;
+ case RIGHT4:
+ vf_right4(&start, end, ptsize);
+ break;
+ case W0:
+ vf_w0();
+ break;
+ case W1:
+ vf_w1(&start, end, ptsize);
+ break;
+ case W2:
+ vf_w2(&start, end, ptsize);
+ break;
+ case W3:
+ vf_w3(&start, end, ptsize);
+ break;
+ case W4:
+ vf_w4(&start, end, ptsize);
+ break;
+ case X0:
+ vf_x0();
+ break;
+ case X1:
+ vf_x1(&start, end, ptsize);
+ break;
+ case X2:
+ vf_x2(&start, end, ptsize);
+ break;
+ case X3:
+ vf_x3(&start, end, ptsize);
+ break;
+ case X4:
+ vf_x4(&start, end, ptsize);
+ break;
+ case DOWN1:
+ vf_down1(&start, end, ptsize);
+ break;
+ case DOWN2:
+ vf_down2(&start, end, ptsize);
+ break;
+ case DOWN3:
+ vf_down3(&start, end, ptsize);
+ break;
+ case DOWN4:
+ vf_down4(&start, end, ptsize);
+ break;
+ case Y0:
+ vf_y0();
+ break;
+ case Y1:
+ vf_y1(&start, end, ptsize);
+ break;
+ case Y2:
+ vf_y2(&start, end, ptsize);
+ break;
+ case Y3:
+ vf_y3(&start, end, ptsize);
+ break;
+ case Y4:
+ vf_y4(&start, end, ptsize);
+ break;
+ case Z0:
+ vf_z0();
+ break;
+ case Z1:
+ vf_z1(&start, end, ptsize);
+ break;
+ case Z2:
+ vf_z2(&start, end, ptsize);
+ break;
+ case Z3:
+ vf_z3(&start, end, ptsize);
+ break;
+ case Z4:
+ vf_z4(&start, end, ptsize);
+ break;
+ case FNT1:
+ vf_fnt1(&start, end, vf_font);
+ break;
+ case FNT2:
+ vf_fnt2(&start, end, vf_font);
+ break;
+ case FNT3:
+ vf_fnt3(&start, end, vf_font);
+ break;
+ case FNT4:
+ vf_fnt4(&start, end, vf_font);
+ break;
+ case XXX1:
+ vf_xxx1(&start, end);
+ break;
+ case XXX2:
+ vf_xxx2(&start, end);
+ break;
+ case XXX3:
+ vf_xxx3(&start, end);
+ break;
+ case XXX4:
+ vf_xxx4(&start, end);
+ break;
+ case DIR:
+ vf_dir(&start, end);
+ break;
+ default:
+ if (opcode <= SET_CHAR_127) {
+ vf_set (opcode);
+ } else if (opcode >= FNT_NUM_0 && opcode <= FNT_NUM_63) {
+ vf_fnt (opcode - FNT_NUM_0, vf_font);
+ } else {
+ fprintf (stderr, "Unexpected opcode: %d\n", opcode);
+ ERROR ("Unexpected opcode in vf file\n");
+ }
+ }
+ }
+ dvi_vf_finish();
+ } else {
+ fprintf (stderr, "vf_set_char: font: %d", vf_font);
+ ERROR ("Font not loaded\n");
+ }
+ return;
+}
+
+
+void vf_close_all_fonts(void)
+{
+ unsigned long i;
+ int j;
+ struct font_def *one_font;
+#ifdef MEM_DEBUG
+MEM_START
+#endif
+ for (i=0; i<num_vf_fonts; i++) {
+ /* Release the packet for each character */
+ if (vf_fonts[i].ch_pkt) {
+ for (j=0; j<vf_fonts[i].num_chars; j++) {
+ if ((vf_fonts[i].ch_pkt)[j] != NULL)
+ RELEASE ((vf_fonts[i].ch_pkt)[j]);
+ }
+ RELEASE (vf_fonts[i].ch_pkt);
+ }
+ if (vf_fonts[i].pkt_len)
+ RELEASE (vf_fonts[i].pkt_len);
+ if (vf_fonts[i].tex_name)
+ RELEASE (vf_fonts[i].tex_name);
+ /* Release each font record */
+ for (j=0; j<vf_fonts[i].num_dev_fonts; j++) {
+ one_font = &(vf_fonts[i].dev_fonts)[j];
+ RELEASE (one_font -> directory);
+ RELEASE (one_font -> name);
+ }
+ if (vf_fonts[i].dev_fonts != NULL)
+ RELEASE (vf_fonts[i].dev_fonts);
+ }
+ if (vf_fonts != NULL)
+ RELEASE (vf_fonts);
+#ifdef MEM_DEBUG
+MEM_END
+#endif
+ return;
+}
diff --git a/Build/source/texk/xdvipdfmx/src/vf.h b/Build/source/texk/xdvipdfmx/src/vf.h
new file mode 100644
index 00000000000..18e36bc1a3e
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/src/vf.h
@@ -0,0 +1,35 @@
+/* $Header: /home/cvsroot/dvipdfmx/src/vf.h,v 1.5 2004/09/02 12:23:07 hirata Exp $
+
+ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
+
+ Copyright (C) 2002 by Jin-Hwan Cho and Shunsaku Hirata,
+ the dvipdfmx project team <dvipdfmx@project.ktug.or.kr>
+
+ Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+
+#ifndef _VF_H_
+#define _VF_H_
+
+#include "pdfdev.h"
+
+extern void vf_set_verbose (void);
+extern int vf_locate_font (const char *tex_name, spt_t ptsize);
+extern void vf_set_char (SIGNED_QUAD ch, int vf_font);
+extern void vf_close_all_fonts(void);
+
+#endif /* _VF_H_ */
diff --git a/Build/source/texk/xdvipdfmx/stamp-h.in b/Build/source/texk/xdvipdfmx/stamp-h.in
new file mode 100644
index 00000000000..9788f70238c
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/stamp-h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/Build/source/texk/xdvipdfmx/style_base.css b/Build/source/texk/xdvipdfmx/style_base.css
new file mode 100644
index 00000000000..2c3b9ac48bf
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/style_base.css
@@ -0,0 +1,367 @@
+
+body {
+ font-weight: normal;
+ font-size: medium;
+ font-style: normal;
+ color: #000000;
+ background-color: #ffffff;
+}
+
+q:lang(fr),
+*:lang(fr) > q {
+ quotes: "«" "»" "\2039" "\203A";
+}
+
+q:lang(en),
+*:lang(en) > q {
+ quotes: "\201C" "\201D" "\2018" "\2019";
+}
+
+:lang(ar) {
+ font-size: 120%;
+ direction: rtl;
+ unicode-bidi: normal;
+}
+
+h1, h2, h3, h4 {
+ color: #000000;
+ font-weight: bold;
+ text-align: left;
+ margin-left: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+h2, h3 {
+ margin-top: 2em;
+ margin-bottom: 1em;
+}
+
+h1 {
+ margin-left: 0;
+ margin-bottom: 1em;
+ font-size: 200%;
+ border-bottom: solid 2px #336699;
+}
+
+h2 {
+ font-size: 140%;
+ border-bottom: solid 1px #336699;
+ width: 95%;
+}
+
+h3 {
+ font-size: 120%;
+}
+
+h4 {
+ font-size: 100%;
+ font-style: italic;
+ margin-left: 1.5em;
+}
+
+p {
+ text-align: justify;
+ margin: .5em 2.5em .5em 2.5em;
+}
+
+/*
+p.abstract {
+ margin: 1em 2.5em 1em 2.5em;
+}
+*/
+
+p.note, div.note {
+ border: solid 2px #336699;
+}
+
+span.note {
+ border: none;
+}
+
+/* open-paren ? */
+span.note:before {
+ font-weight: normal;
+ content: '[' "Note: ";
+}
+
+span.note:after {
+ font-weight: normal;
+ content: ']';
+}
+
+/*
+.note[class|="important"] {
+}
+*/
+
+/* wrapper */
+.important {
+ padding: 0;
+ margin: 0;
+}
+
+div.important >
+p.note, div.note {
+ padding: 1em 1em 1em 1em;
+ margin-top: 2em;
+ margin-bottom: 2em;
+ /* centering */
+ margin-left: auto;
+ margin-right: auto;
+ width: 80%;
+ color: black;
+ /* font-style: italic; */
+ border: solid 2px #cc6666;
+ font-weight: normal;
+}
+
+/* fixme */
+div.important >
+p.note:before, div.note:before {
+ color: #cc6666;
+ font-style: normal;
+ font-weight: bold;
+ margin-right: 1em;
+ content: "Important Note:";
+}
+
+span.important {
+ font-style: italic;
+ color: #cc6666;
+}
+
+span.important:before {
+ color: #cc6666;
+ font-style: normal;
+ font-weight: bold;
+ margin-right: .5em;
+ content: "Important ";
+}
+
+
+.annot {
+ font-size: smaller;
+ font-family: sans-serif;
+ padding: 1em 1em 1em 1em;
+ margin-top: 2em;
+ margin-bottom: 2em;
+ /* right */
+ /* float: right; */
+ margin-left: auto;
+ margin-right: 0;
+ width: 46%;
+ color: #666666;
+ /* font-style: italic; */
+ border: solid 2px #666666;
+ font-weight: normal;
+}
+
+
+ul {
+ list-style: disc outside;
+}
+
+ol {
+ list-style: decimal outside
+}
+
+li {
+ line-height: 120%;
+}
+
+em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+
+ul li div.item {
+ /* text-align: left;
+ width: 100%;
+ */
+ text-align: left;
+ font-weight: bolder;
+ margin-left: 0;
+ /* margin-right: auto; */
+}
+
+li p.desc {
+ text-align: justify;
+ margin: 0.5em 0 1em;
+ width: 95%;
+}
+
+#changelog {
+ margin-left: 1.5em;
+ padding: 0;
+}
+
+ul.log {
+ padding: 0;
+ margin: 2em 0 2em; /* top left-right bottom */
+ list-style: none;
+}
+
+ul.log li div.item {
+ margin-left: 0;
+ font-weight: bold;
+ font-style: normal;
+ text-align: left;
+}
+
+ul.log li div.item .date {
+ color: #666666;
+ font-weight: normal;
+ font-style : normal;
+ margin-right: 0.5em;
+}
+
+ul.log li p.desc {
+ margin-left: 2em;
+ width: 90%;
+}
+
+/*
+ul.links {
+ margin-left: 0;
+ list-style: disc outside;
+}
+
+ul.links li div.item a:after {
+ text-align: right;
+ margin: 0 auto 0 0;
+ content: " \2014 " attr(href);
+}
+*/
+
+
+kbd, code, pre, adress,
+*.file, *.date, *.mail {
+ font-family: monospace;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+}
+
+.date {
+ color: #666666;
+}
+
+pre, div.file {
+ white-space: pre;
+ text-align: left;
+ line-height: 140%;
+ margin: 2em auto 2em;
+ border: solid 2px #336699;
+ padding: 1em 2em 1em;
+ width: 80%;
+ overflow: auto;
+}
+
+span.file {
+ white-space: nowrap;
+}
+
+span.file:before {
+ content: '\'';
+}
+
+span.file:after {
+ content: '\'';
+}
+
+
+.person .trademarked, .registered {
+ white-space: nowrap;
+}
+
+.trademarked:after {
+ content: '\2122';
+}
+
+.registered:after {
+ content: '\00ae';
+}
+
+address, *.mail {
+ white-space: nowrap;
+
+}
+
+.mail:before {
+ content: '<';
+}
+
+.mail:after {
+ content: '>';
+}
+
+.logo a {
+ border: none;
+}
+
+div.foot {
+ text-align: left;
+ border-top: solid 2px #336699;
+ margin: 1em 1em 1em 1em;
+ /* font-size: 90%; */
+ font-style: italic;
+ padding: 1em 0em 1em 0em;
+}
+
+a[href] {
+ color: #336699;
+ font-weight: normal;
+ text-decoration: underline;
+}
+
+a[href]:visited {
+ color: #333333;
+}
+
+a[href]:hover {
+ color: #6699CC;
+}
+
+abbr, acronym {
+ font-style: normal;
+ font-weight: normal;
+ text-decoration: none;
+ border: none;
+}
+
+/* dotted underline for abbr with title */
+/*
+abbr[title], acronym[title] {
+ border-bottom: 1px dotted #000000;
+}
+*/
+
+abbr[title]:after, acronym[title]:after {
+ color: #666666;
+ content: '<' attr(title) '>';
+}
+
+/* nasty trick for internal link */
+#contents a[href|="#sec"] {
+ color: #003366;
+ font-style: italic;
+ text-decoration: none;
+}
+
+
+@media print {
+ .annot {
+ display: none;
+ overflow: hidden;
+ float: none;
+ }
+ body {
+ margin: auto;
+ }
+ a {
+ text-decoration: none;
+ color: #000000;
+ border: none;
+ }
+}
diff --git a/Build/source/texk/xdvipdfmx/style_dflt.css b/Build/source/texk/xdvipdfmx/style_dflt.css
new file mode 100644
index 00000000000..913a4387650
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/style_dflt.css
@@ -0,0 +1,95 @@
+
+/* @import "style_base.css"; */
+
+body {
+ font-family: "Verdana", "Lucida Sans", sans-serif;
+ font-size: small medium;
+ margin-right: 2em;
+ margin-left: 11em;
+ /* font-size-adjust: .56; */
+}
+
+h1 {
+ background-image: url("doc/images/dvipdfmx-logo.png");
+ background-repeat: no-repeat;
+ background-position: top right;
+}
+
+/*
+h2, h3 {
+ font-variant: normal;
+ background-repeat: no-repeat;
+ background-position: top left;
+ margin-top: 2em;
+ margin-bottom: 1em;
+ padding: 0 0 0 16px;
+ background-image: url("doc/images/rightarrow.png");
+}
+*/
+
+.note:before, .important:before {
+ font-variant: normal;
+}
+
+.logo {
+ display: block;
+ float: right;
+}
+
+kbd, code, pre, adress,
+*.file, *.mail, *.date {
+ font-family: "Andale Mono", "Lucida Sans Typewriter", monospace;
+ /* font-size-adjust: .56; */
+}
+
+
+#navmenu {
+ display: block;
+ margin: 0;
+ padding: 0.5em;
+ font-weight: bold;
+ line-height: 120%;
+ position: absolute;
+ top: 3.0em;
+ left: 0.5em;
+ width: 7em;
+ background: white;
+ border: dashed 2px #336699;
+ overflow: hidden;
+}
+
+#navmenu p {
+ text-align: left;
+ margin: 0;
+ padding: 0.5em 0.5em;
+ border-bottom: dashed 2px #336699;
+ overflow: hidden;
+}
+
+#navmenu a[href],
+#navmenu a[href|="#sec"] {
+ font-style: normal;
+ font-weight: bold;
+}
+
+@media print {
+ #navmenu, *.logo {
+ display: none;
+ float: none;
+ overflow: hidden;
+ }
+}
+
+@media tty {
+ #navmenu, *.logo {
+ display: none;
+ float: none;
+ overflow: hidden;
+ }
+}
+
+@media screen {
+ #navmenu {
+ position: fixed;
+ }
+}
diff --git a/Build/source/texk/xdvipdfmx/style_ie.css b/Build/source/texk/xdvipdfmx/style_ie.css
new file mode 100644
index 00000000000..4bd8bf81330
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/style_ie.css
@@ -0,0 +1,14 @@
+
+body {
+ overflow-y: hidden
+}
+
+/* Stylesheet selection not work */
+.annot {
+ display: none;
+}
+
+#contents {
+ overflow: auto;
+ height: 100%
+}
diff --git a/Build/source/texk/xdvipdfmx/style_plain.css b/Build/source/texk/xdvipdfmx/style_plain.css
new file mode 100644
index 00000000000..3c82d40f357
--- /dev/null
+++ b/Build/source/texk/xdvipdfmx/style_plain.css
@@ -0,0 +1,77 @@
+/* @import "style_base.css"; */
+
+body {
+ font-family: "Palatino Linotype", serif;
+ /* font-size-adjust: 0.47 */
+ font-size: medium;
+ margin-right: 6%;
+ margin-left: 6%;
+}
+
+:lang(ko) {
+ font-family: serif;
+}
+
+:lang(ja) {
+ font-family: serif;
+}
+
+abbr {
+ font-variant: small-caps;
+}
+
+.note:before, .important:before {
+ font-style: normal;
+ font-weight: bold;
+ /* I'm just interested in how browsers behaves with that. */
+ font-variant: small-caps;
+}
+
+.note, .important {
+ font-variant: normal;
+}
+
+h1, h2 {
+ /* I'm just interested in how browsers behaves with that.
+ * The result is often ugly.
+ */
+ font-variant: small-caps;
+ letter-spacing: 0.2em;
+}
+
+kbd, code, pre, adress,
+*.file, *.mail, *.date {
+ font-family: "Courier New", monospace;
+}
+
+/*
+ [font-family~="monospace"] {
+*/
+kbd, code, pre, adress,
+*.file, *.mail {
+ /* adjust 'monospace' font size slightly since they
+ often has taller x-height compared to serif font
+ for body text. Capheight letters will be shorter
+ with this... */
+ font-size: 95%;
+ /* font-size-adjust: .47; */
+}
+
+.logo {
+ display: none;
+ float: none;
+}
+
+#navmenu {
+ float: none;
+ display: none;
+ overflow: hidden;
+}
+
+@media print {
+ #navmenu, *.logo {
+ display: none;
+ float: none;
+ overflow: hidden;
+ }
+}